diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 7a6dc0e..c717fcd 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -58,7 +58,7 @@ 0 -> { //本年度 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, "$year-01-01", time.timestampToDate() + groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } 1 -> { @@ -71,7 +71,7 @@ else -> "" } deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, startDate, time.timestampToDate() + groupId, devCode, startDate, time.timestampToCompleteDate() ) } 2 -> { @@ -80,19 +80,19 @@ groupId, devCode, time.timestampToLastMonthDate(), - time.timestampToDate() + time.timestampToCompleteDate() ) } 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToLastWeekDate(), time.timestampToDate() + groupId, devCode, time.timestampToLastWeekDate(), time.timestampToCompleteDate() ) } 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToDate(), time.timestampToDate() + groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } 5 -> { diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 7a6dc0e..c717fcd 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -58,7 +58,7 @@ 0 -> { //本年度 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, "$year-01-01", time.timestampToDate() + groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } 1 -> { @@ -71,7 +71,7 @@ else -> "" } deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, startDate, time.timestampToDate() + groupId, devCode, startDate, time.timestampToCompleteDate() ) } 2 -> { @@ -80,19 +80,19 @@ groupId, devCode, time.timestampToLastMonthDate(), - time.timestampToDate() + time.timestampToCompleteDate() ) } 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToLastWeekDate(), time.timestampToDate() + groupId, devCode, time.timestampToLastWeekDate(), time.timestampToCompleteDate() ) } 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToDate(), time.timestampToDate() + groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } 5 -> { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt new file mode 100644 index 0000000..11830bc --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -0,0 +1,154 @@ +package com.casic.smarttube.view + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.content.Intent +import android.graphics.Color +import android.location.Location +import android.os.Bundle +import android.util.Log +import android.view.animation.LinearInterpolator +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.model.animation.RotateAnimation +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_select_location.* + + +class SelectLocationActivity : KotlinBaseActivity() { + + private val kTag = "SelectLocationActivity" + private lateinit var aMap: AMap + private lateinit var location: Location + + override fun initLayoutView(): Int = R.layout.activity_select_location + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "选择设备实际位置" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val locationStyle = MyLocationStyle() + //定位一次,且将视角移动到地图中心点 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) + //设置是否显示定位小蓝点 + locationStyle.showMyLocation(true) + locationStyle.strokeColor(Color.TRANSPARENT) + locationStyle.strokeWidth(0f) + locationStyle.radiusFillColor(Color.TRANSPARENT) + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + uiSettings.isRotateGesturesEnabled = false//不允许地图旋转 + uiSettings.isMyLocationButtonEnabled = true//设置默认定位按钮是否显示 + aMap.moveCamera(CameraUpdateFactory.zoomTo(15f))//改变地图的缩放级别 + } + + private var markerOption = MarkerOptions() + + private fun markerAnimation() { + val animation = + RotateAnimation(markerOption.rotateAngle, markerOption.rotateAngle + 180, 0F, 0F, 0F) + val duration = 1000L + animation.setDuration(duration) + animation.setInterpolator(LinearInterpolator()) + +// marker.setAnimation(animation) +// marker.startAnimation() + } + + private lateinit var animatorSet: AnimatorSet + private fun animTranslate() { + animatorSet = AnimatorSet() + animatorSet.playTogether( +// ObjectAnimator.ofFloat(ivLocation, "scaleX", 1, 0.5f, 1).setDuration(300), +// ObjectAnimator.ofFloat(ivLocation, "scaleY", 1, 0.5f, 1).setDuration(300) + ) + animatorSet.start() + } + + override fun initEvent() { + aMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener { + override fun onCameraChange(p0: CameraPosition?) { + + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition?) { + Log.d(kTag, cameraPosition.toString()) + animTranslate() + } + }) + //marker拖拽 + aMap.setOnMarkerDragListener(object : AMap.OnMarkerDragListener { + override fun onMarkerDragStart(p0: Marker?) { + + } + + override fun onMarkerDrag(p0: Marker?) { + + } + + override fun onMarkerDragEnd(p0: Marker?) { + Log.d(kTag, "onMarkerDragEnd: " + p0!!.position.toString()) + } + }) + //定位之后就会触发此监听获取经纬度信息 + aMap.setOnMyLocationChangeListener { + if (it != null) { + location = it + Log.d(kTag, "[${location.longitude},${location.latitude}]") + } + } + + rightOperateView.setOnClickListener { + val intent = Intent() + intent.putExtra("longitude", location.longitude.toString()) + intent.putExtra("latitude", location.latitude.toString()) + setResult(RESULT_OK, intent) + finish() + } + } + + /**地图相关*********/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mapView.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onDestroy() { + mapView.onDestroy() + super.onDestroy() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 7a6dc0e..c717fcd 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -58,7 +58,7 @@ 0 -> { //本年度 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, "$year-01-01", time.timestampToDate() + groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } 1 -> { @@ -71,7 +71,7 @@ else -> "" } deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, startDate, time.timestampToDate() + groupId, devCode, startDate, time.timestampToCompleteDate() ) } 2 -> { @@ -80,19 +80,19 @@ groupId, devCode, time.timestampToLastMonthDate(), - time.timestampToDate() + time.timestampToCompleteDate() ) } 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToLastWeekDate(), time.timestampToDate() + groupId, devCode, time.timestampToLastWeekDate(), time.timestampToCompleteDate() ) } 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToDate(), time.timestampToDate() + groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } 5 -> { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt new file mode 100644 index 0000000..11830bc --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -0,0 +1,154 @@ +package com.casic.smarttube.view + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.content.Intent +import android.graphics.Color +import android.location.Location +import android.os.Bundle +import android.util.Log +import android.view.animation.LinearInterpolator +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.model.animation.RotateAnimation +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_select_location.* + + +class SelectLocationActivity : KotlinBaseActivity() { + + private val kTag = "SelectLocationActivity" + private lateinit var aMap: AMap + private lateinit var location: Location + + override fun initLayoutView(): Int = R.layout.activity_select_location + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "选择设备实际位置" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val locationStyle = MyLocationStyle() + //定位一次,且将视角移动到地图中心点 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) + //设置是否显示定位小蓝点 + locationStyle.showMyLocation(true) + locationStyle.strokeColor(Color.TRANSPARENT) + locationStyle.strokeWidth(0f) + locationStyle.radiusFillColor(Color.TRANSPARENT) + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + uiSettings.isRotateGesturesEnabled = false//不允许地图旋转 + uiSettings.isMyLocationButtonEnabled = true//设置默认定位按钮是否显示 + aMap.moveCamera(CameraUpdateFactory.zoomTo(15f))//改变地图的缩放级别 + } + + private var markerOption = MarkerOptions() + + private fun markerAnimation() { + val animation = + RotateAnimation(markerOption.rotateAngle, markerOption.rotateAngle + 180, 0F, 0F, 0F) + val duration = 1000L + animation.setDuration(duration) + animation.setInterpolator(LinearInterpolator()) + +// marker.setAnimation(animation) +// marker.startAnimation() + } + + private lateinit var animatorSet: AnimatorSet + private fun animTranslate() { + animatorSet = AnimatorSet() + animatorSet.playTogether( +// ObjectAnimator.ofFloat(ivLocation, "scaleX", 1, 0.5f, 1).setDuration(300), +// ObjectAnimator.ofFloat(ivLocation, "scaleY", 1, 0.5f, 1).setDuration(300) + ) + animatorSet.start() + } + + override fun initEvent() { + aMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener { + override fun onCameraChange(p0: CameraPosition?) { + + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition?) { + Log.d(kTag, cameraPosition.toString()) + animTranslate() + } + }) + //marker拖拽 + aMap.setOnMarkerDragListener(object : AMap.OnMarkerDragListener { + override fun onMarkerDragStart(p0: Marker?) { + + } + + override fun onMarkerDrag(p0: Marker?) { + + } + + override fun onMarkerDragEnd(p0: Marker?) { + Log.d(kTag, "onMarkerDragEnd: " + p0!!.position.toString()) + } + }) + //定位之后就会触发此监听获取经纬度信息 + aMap.setOnMyLocationChangeListener { + if (it != null) { + location = it + Log.d(kTag, "[${location.longitude},${location.latitude}]") + } + } + + rightOperateView.setOnClickListener { + val intent = Intent() + intent.putExtra("longitude", location.longitude.toString()) + intent.putExtra("latitude", location.latitude.toString()) + setResult(RESULT_OK, intent) + finish() + } + } + + /**地图相关*********/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mapView.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onDestroy() { + mapView.onDestroy() + super.onDestroy() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 4e47f09..fc2ad5d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -119,7 +119,7 @@ val textValue = if (type == Type.ALL) { millSeconds.timestampToTime() } else { - millSeconds.timestampToDate() + millSeconds.timestampToCompleteDate() } endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 7a6dc0e..c717fcd 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -58,7 +58,7 @@ 0 -> { //本年度 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, "$year-01-01", time.timestampToDate() + groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } 1 -> { @@ -71,7 +71,7 @@ else -> "" } deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, startDate, time.timestampToDate() + groupId, devCode, startDate, time.timestampToCompleteDate() ) } 2 -> { @@ -80,19 +80,19 @@ groupId, devCode, time.timestampToLastMonthDate(), - time.timestampToDate() + time.timestampToCompleteDate() ) } 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToLastWeekDate(), time.timestampToDate() + groupId, devCode, time.timestampToLastWeekDate(), time.timestampToCompleteDate() ) } 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToDate(), time.timestampToDate() + groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } 5 -> { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt new file mode 100644 index 0000000..11830bc --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -0,0 +1,154 @@ +package com.casic.smarttube.view + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.content.Intent +import android.graphics.Color +import android.location.Location +import android.os.Bundle +import android.util.Log +import android.view.animation.LinearInterpolator +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.model.animation.RotateAnimation +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_select_location.* + + +class SelectLocationActivity : KotlinBaseActivity() { + + private val kTag = "SelectLocationActivity" + private lateinit var aMap: AMap + private lateinit var location: Location + + override fun initLayoutView(): Int = R.layout.activity_select_location + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "选择设备实际位置" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val locationStyle = MyLocationStyle() + //定位一次,且将视角移动到地图中心点 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) + //设置是否显示定位小蓝点 + locationStyle.showMyLocation(true) + locationStyle.strokeColor(Color.TRANSPARENT) + locationStyle.strokeWidth(0f) + locationStyle.radiusFillColor(Color.TRANSPARENT) + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + uiSettings.isRotateGesturesEnabled = false//不允许地图旋转 + uiSettings.isMyLocationButtonEnabled = true//设置默认定位按钮是否显示 + aMap.moveCamera(CameraUpdateFactory.zoomTo(15f))//改变地图的缩放级别 + } + + private var markerOption = MarkerOptions() + + private fun markerAnimation() { + val animation = + RotateAnimation(markerOption.rotateAngle, markerOption.rotateAngle + 180, 0F, 0F, 0F) + val duration = 1000L + animation.setDuration(duration) + animation.setInterpolator(LinearInterpolator()) + +// marker.setAnimation(animation) +// marker.startAnimation() + } + + private lateinit var animatorSet: AnimatorSet + private fun animTranslate() { + animatorSet = AnimatorSet() + animatorSet.playTogether( +// ObjectAnimator.ofFloat(ivLocation, "scaleX", 1, 0.5f, 1).setDuration(300), +// ObjectAnimator.ofFloat(ivLocation, "scaleY", 1, 0.5f, 1).setDuration(300) + ) + animatorSet.start() + } + + override fun initEvent() { + aMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener { + override fun onCameraChange(p0: CameraPosition?) { + + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition?) { + Log.d(kTag, cameraPosition.toString()) + animTranslate() + } + }) + //marker拖拽 + aMap.setOnMarkerDragListener(object : AMap.OnMarkerDragListener { + override fun onMarkerDragStart(p0: Marker?) { + + } + + override fun onMarkerDrag(p0: Marker?) { + + } + + override fun onMarkerDragEnd(p0: Marker?) { + Log.d(kTag, "onMarkerDragEnd: " + p0!!.position.toString()) + } + }) + //定位之后就会触发此监听获取经纬度信息 + aMap.setOnMyLocationChangeListener { + if (it != null) { + location = it + Log.d(kTag, "[${location.longitude},${location.latitude}]") + } + } + + rightOperateView.setOnClickListener { + val intent = Intent() + intent.putExtra("longitude", location.longitude.toString()) + intent.putExtra("latitude", location.latitude.toString()) + setResult(RESULT_OK, intent) + finish() + } + } + + /**地图相关*********/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mapView.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onDestroy() { + mapView.onDestroy() + super.onDestroy() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 4e47f09..fc2ad5d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -119,7 +119,7 @@ val textValue = if (type == Type.ALL) { millSeconds.timestampToTime() } else { - millSeconds.timestampToDate() + millSeconds.timestampToCompleteDate() } endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") diff --git a/app/src/main/res/layout/activity_add_device.xml b/app/src/main/res/layout/activity_add_device.xml index 3b2aa30..e0b4146 100644 --- a/app/src/main/res/layout/activity_add_device.xml +++ b/app/src/main/res/layout/activity_add_device.xml @@ -44,7 +44,7 @@ + android:src="@drawable/ic_scanner" /> @@ -125,7 +125,7 @@ android:id="@+id/longitudeView" style="@style/RelativeTextViewStyle" android:layout_alignParentEnd="true" - android:hint="请点击右边定位自动获取" + android:hint="请点击右边定位获取" android:textColorHint="@color/hintTextColor" /> @@ -141,7 +141,7 @@ android:id="@+id/latitudeView" style="@style/RelativeTextViewStyle" android:layout_alignParentEnd="true" - android:hint="请点击右边定位自动获取" + android:hint="请点击右边定位获取" android:textColorHint="@color/hintTextColor" /> diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 7a6dc0e..c717fcd 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -58,7 +58,7 @@ 0 -> { //本年度 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, "$year-01-01", time.timestampToDate() + groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } 1 -> { @@ -71,7 +71,7 @@ else -> "" } deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, startDate, time.timestampToDate() + groupId, devCode, startDate, time.timestampToCompleteDate() ) } 2 -> { @@ -80,19 +80,19 @@ groupId, devCode, time.timestampToLastMonthDate(), - time.timestampToDate() + time.timestampToCompleteDate() ) } 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToLastWeekDate(), time.timestampToDate() + groupId, devCode, time.timestampToLastWeekDate(), time.timestampToCompleteDate() ) } 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToDate(), time.timestampToDate() + groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } 5 -> { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt new file mode 100644 index 0000000..11830bc --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -0,0 +1,154 @@ +package com.casic.smarttube.view + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.content.Intent +import android.graphics.Color +import android.location.Location +import android.os.Bundle +import android.util.Log +import android.view.animation.LinearInterpolator +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.model.animation.RotateAnimation +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_select_location.* + + +class SelectLocationActivity : KotlinBaseActivity() { + + private val kTag = "SelectLocationActivity" + private lateinit var aMap: AMap + private lateinit var location: Location + + override fun initLayoutView(): Int = R.layout.activity_select_location + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "选择设备实际位置" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val locationStyle = MyLocationStyle() + //定位一次,且将视角移动到地图中心点 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) + //设置是否显示定位小蓝点 + locationStyle.showMyLocation(true) + locationStyle.strokeColor(Color.TRANSPARENT) + locationStyle.strokeWidth(0f) + locationStyle.radiusFillColor(Color.TRANSPARENT) + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + uiSettings.isRotateGesturesEnabled = false//不允许地图旋转 + uiSettings.isMyLocationButtonEnabled = true//设置默认定位按钮是否显示 + aMap.moveCamera(CameraUpdateFactory.zoomTo(15f))//改变地图的缩放级别 + } + + private var markerOption = MarkerOptions() + + private fun markerAnimation() { + val animation = + RotateAnimation(markerOption.rotateAngle, markerOption.rotateAngle + 180, 0F, 0F, 0F) + val duration = 1000L + animation.setDuration(duration) + animation.setInterpolator(LinearInterpolator()) + +// marker.setAnimation(animation) +// marker.startAnimation() + } + + private lateinit var animatorSet: AnimatorSet + private fun animTranslate() { + animatorSet = AnimatorSet() + animatorSet.playTogether( +// ObjectAnimator.ofFloat(ivLocation, "scaleX", 1, 0.5f, 1).setDuration(300), +// ObjectAnimator.ofFloat(ivLocation, "scaleY", 1, 0.5f, 1).setDuration(300) + ) + animatorSet.start() + } + + override fun initEvent() { + aMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener { + override fun onCameraChange(p0: CameraPosition?) { + + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition?) { + Log.d(kTag, cameraPosition.toString()) + animTranslate() + } + }) + //marker拖拽 + aMap.setOnMarkerDragListener(object : AMap.OnMarkerDragListener { + override fun onMarkerDragStart(p0: Marker?) { + + } + + override fun onMarkerDrag(p0: Marker?) { + + } + + override fun onMarkerDragEnd(p0: Marker?) { + Log.d(kTag, "onMarkerDragEnd: " + p0!!.position.toString()) + } + }) + //定位之后就会触发此监听获取经纬度信息 + aMap.setOnMyLocationChangeListener { + if (it != null) { + location = it + Log.d(kTag, "[${location.longitude},${location.latitude}]") + } + } + + rightOperateView.setOnClickListener { + val intent = Intent() + intent.putExtra("longitude", location.longitude.toString()) + intent.putExtra("latitude", location.latitude.toString()) + setResult(RESULT_OK, intent) + finish() + } + } + + /**地图相关*********/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mapView.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onDestroy() { + mapView.onDestroy() + super.onDestroy() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 4e47f09..fc2ad5d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -119,7 +119,7 @@ val textValue = if (type == Type.ALL) { millSeconds.timestampToTime() } else { - millSeconds.timestampToDate() + millSeconds.timestampToCompleteDate() } endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") diff --git a/app/src/main/res/layout/activity_add_device.xml b/app/src/main/res/layout/activity_add_device.xml index 3b2aa30..e0b4146 100644 --- a/app/src/main/res/layout/activity_add_device.xml +++ b/app/src/main/res/layout/activity_add_device.xml @@ -44,7 +44,7 @@ + android:src="@drawable/ic_scanner" /> @@ -125,7 +125,7 @@ android:id="@+id/longitudeView" style="@style/RelativeTextViewStyle" android:layout_alignParentEnd="true" - android:hint="请点击右边定位自动获取" + android:hint="请点击右边定位获取" android:textColorHint="@color/hintTextColor" /> @@ -141,7 +141,7 @@ android:id="@+id/latitudeView" style="@style/RelativeTextViewStyle" android:layout_alignParentEnd="true" - android:hint="请点击右边定位自动获取" + android:hint="请点击右边定位获取" android:textColorHint="@color/hintTextColor" /> diff --git a/app/src/main/res/layout/activity_select_location.xml b/app/src/main/res/layout/activity_select_location.xml new file mode 100644 index 0000000..965b297 --- /dev/null +++ b/app/src/main/res/layout/activity_select_location.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4edb89e..0313bd0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,13 +69,13 @@ implementation 'com.qmuiteam:qmui:2.0.0-alpha10' implementation 'com.qmuiteam:arch:0.3.1' //MVVM+LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" //Kotlin协程 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1' //图片加载框架 implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 @@ -97,7 +97,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.0' //官方Json解析库 - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.9.0' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //图表 @@ -106,4 +106,5 @@ implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //ZBar(综合Java和C++扫码),生成二维码 implementation 'cn.bertsir.zbarLibary:zbarlibary:1.4.2' + implementation 'com.github.goyourfly:MultiSelectAdapter:3.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78c969d..e447cfa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + diff --git a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt index cece989..560bf1a 100644 --- a/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt +++ b/app/src/main/java/com/casic/smarttube/adapter/DeviceListAdapter.kt @@ -106,16 +106,17 @@ pciDataView.text = rowsBean.pci rsrpDataView.text = rowsBean.rsrp strengthDataView.text = rowsBean.strength - installDateView.text = String.format("更新时间:${rowsBean.installDate}") + installDateView.text = if (rowsBean.uptime.isNullOrBlank()) { + String.format("更新时间:未知") + } else { + String.format("更新时间:${rowsBean.uptime}") + } - - if (listener != null) { - holder.itemView.setOnClickListener { - listener!!.onClicked(position) - } - dataHistoryButton.setOnClickListener { - listener!!.onHistoryClicked(position) - } + holder.itemView.setOnClickListener { + listener?.onClicked(position) + } + dataHistoryButton.setOnClickListener { + listener?.onHistoryClicked(position) } } diff --git a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt index d8ee265..e006361 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocaleConstant.kt @@ -19,7 +19,7 @@ val POPUP_IMAGES = intArrayOf(R.drawable.ic_menu_map, R.drawable.ic_satellite) val POPUP_TITLES = arrayOf("标准地图", "卫星地图") val DEVICE_OPERATE_IMAGES = intArrayOf(R.drawable.ic_order, R.drawable.ic_delete_white) - val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "批量删除") + val DEVICE_OPERATE_TITLES = arrayOf("浓度排序", "全部删除") /** * ============================================================================================= diff --git a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt index 372a521..cd5410d 100644 --- a/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt +++ b/app/src/main/java/com/casic/smarttube/utils/LocationHelper.kt @@ -16,6 +16,7 @@ locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy locationOption.isNeedAddress = false //设置是否返回地址信息(默认返回地址信息) //给定位客户端对象设置定位参数 + locationOption.isOnceLocation = true locationClient.setLocationOption(locationOption) locationClient.setLocationListener { if (it.errorCode == 0) { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index b6b7d69..787b6db 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -8,6 +8,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation @@ -57,6 +58,14 @@ private val realPaths: ArrayList = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList() + private val selectLocationLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + longitudeView.text = data.getStringExtra("longitude") + latitudeView.text = data.getStringExtra("latitude") + } + } override fun initLayoutView(): Int = R.layout.activity_add_device @@ -162,7 +171,9 @@ }).build().show() } + //TODO 地图选点 locationImageView.setOnClickListener { +// selectLocationLauncher.launch(Intent(this, SelectLocationActivity::class.java)) LoadingDialogHub.show(this, "定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { @@ -338,10 +349,10 @@ ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { + val sum = (result.size * 1000).toLong() + object : CountDownTimer(sum, 1000) { override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 + val i = millisUntilFinished / 1000 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 5a55f17..845b57b 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -37,12 +38,14 @@ private lateinit var groupViewModel: ProjectGroupViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceAdapter: DeviceListAdapter + private val context: Context = this@GroupDeviceActivity private var dataBeans: MutableList = ArrayList() private var pageIndex = 1 private var isRefresh = false private var isLoadMore = false private var order = 0 private var clickedPosition = 0 + private var isDeleteAll = false override fun initLayoutView(): Int = R.layout.activity_group_device @@ -72,7 +75,7 @@ } 1 -> { AlertControlDialog.Builder() - .setContext(this@GroupDeviceActivity) + .setContext(context) .setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") .setNegativeButton("容我想想") @@ -90,11 +93,13 @@ ids.add(it.deviceId.toLong()) } } + isDeleteAll = true deviceViewModel.deleteDeviceById(ids) } }).build().show() } + //TODO 批量删除待完善 } } }) @@ -161,11 +166,23 @@ deviceViewModel.deleteResult.observe(this, { if (it.code == 200) { - dataBeans.removeAt(clickedPosition) - deviceAdapter.notifyItemRemoved(clickedPosition) - deviceAdapter.notifyItemRangeChanged( - clickedPosition, dataBeans.size - clickedPosition - ) + if (isDeleteAll) { + dataBeans.removeAll(dataBeans) + deviceAdapter.notifyItemMoved(0, dataBeans.size) + deviceAdapter.notifyItemRangeChanged(0, dataBeans.size) + } else { + dataBeans.removeAt(clickedPosition) + deviceAdapter.notifyItemRemoved(clickedPosition) + deviceAdapter.notifyItemRangeChanged( + clickedPosition, dataBeans.size - clickedPosition + ) + } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("这里什么都没有") { + pageIndex = 1 + obtainDeviceListByPage() + } + } } }) } @@ -203,7 +220,7 @@ DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看设备详情".show(this@GroupDeviceActivity) + "设备编号为空,无法查看设备详情".show(context) return } navigatePageTo( @@ -213,7 +230,7 @@ override fun onHistoryClicked(position: Int) { if (dataBeans[position].devcode.isNullOrBlank()) { - "设备编号为空,无法查看历史数据".show(this@GroupDeviceActivity) + "设备编号为空,无法查看历史数据".show(context) return } navigatePageTo( @@ -236,9 +253,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } @@ -277,9 +295,10 @@ //删除数据库里对应的数据 val deviceId = dataBeans[clickedPosition].deviceId if (deviceId.isNullOrBlank()) { - "管盯ID错误,不可删除,请检查数据源".show(this@GroupDeviceActivity) + "管盯ID错误,不可删除,请检查数据源".show(context) return } + isDeleteAll = false deviceViewModel.deleteDeviceById(arrayListOf(deviceId.toLong())) } }).build().show() diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 7a6dc0e..c717fcd 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -58,7 +58,7 @@ 0 -> { //本年度 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, "$year-01-01", time.timestampToDate() + groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } 1 -> { @@ -71,7 +71,7 @@ else -> "" } deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, startDate, time.timestampToDate() + groupId, devCode, startDate, time.timestampToCompleteDate() ) } 2 -> { @@ -80,19 +80,19 @@ groupId, devCode, time.timestampToLastMonthDate(), - time.timestampToDate() + time.timestampToCompleteDate() ) } 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToLastWeekDate(), time.timestampToDate() + groupId, devCode, time.timestampToLastWeekDate(), time.timestampToCompleteDate() ) } 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( - groupId, devCode, time.timestampToDate(), time.timestampToDate() + groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } 5 -> { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt new file mode 100644 index 0000000..11830bc --- /dev/null +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -0,0 +1,154 @@ +package com.casic.smarttube.view + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.content.Intent +import android.graphics.Color +import android.location.Location +import android.os.Bundle +import android.util.Log +import android.view.animation.LinearInterpolator +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.amap.api.maps.model.animation.RotateAnimation +import com.casic.smarttube.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_select_location.* + + +class SelectLocationActivity : KotlinBaseActivity() { + + private val kTag = "SelectLocationActivity" + private lateinit var aMap: AMap + private lateinit var location: Location + + override fun initLayoutView(): Int = R.layout.activity_select_location + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + titleView.text = "选择设备实际位置" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + aMap = mapView.map + aMap.mapType = AMap.MAP_TYPE_NORMAL + val locationStyle = MyLocationStyle() + //定位一次,且将视角移动到地图中心点 + locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) + //设置是否显示定位小蓝点 + locationStyle.showMyLocation(true) + locationStyle.strokeColor(Color.TRANSPARENT) + locationStyle.strokeWidth(0f) + locationStyle.radiusFillColor(Color.TRANSPARENT) + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + val uiSettings = aMap.uiSettings + uiSettings.isCompassEnabled = true + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isTiltGesturesEnabled = false//不许地图随手势倾斜角度 + uiSettings.isRotateGesturesEnabled = false//不允许地图旋转 + uiSettings.isMyLocationButtonEnabled = true//设置默认定位按钮是否显示 + aMap.moveCamera(CameraUpdateFactory.zoomTo(15f))//改变地图的缩放级别 + } + + private var markerOption = MarkerOptions() + + private fun markerAnimation() { + val animation = + RotateAnimation(markerOption.rotateAngle, markerOption.rotateAngle + 180, 0F, 0F, 0F) + val duration = 1000L + animation.setDuration(duration) + animation.setInterpolator(LinearInterpolator()) + +// marker.setAnimation(animation) +// marker.startAnimation() + } + + private lateinit var animatorSet: AnimatorSet + private fun animTranslate() { + animatorSet = AnimatorSet() + animatorSet.playTogether( +// ObjectAnimator.ofFloat(ivLocation, "scaleX", 1, 0.5f, 1).setDuration(300), +// ObjectAnimator.ofFloat(ivLocation, "scaleY", 1, 0.5f, 1).setDuration(300) + ) + animatorSet.start() + } + + override fun initEvent() { + aMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener { + override fun onCameraChange(p0: CameraPosition?) { + + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition?) { + Log.d(kTag, cameraPosition.toString()) + animTranslate() + } + }) + //marker拖拽 + aMap.setOnMarkerDragListener(object : AMap.OnMarkerDragListener { + override fun onMarkerDragStart(p0: Marker?) { + + } + + override fun onMarkerDrag(p0: Marker?) { + + } + + override fun onMarkerDragEnd(p0: Marker?) { + Log.d(kTag, "onMarkerDragEnd: " + p0!!.position.toString()) + } + }) + //定位之后就会触发此监听获取经纬度信息 + aMap.setOnMyLocationChangeListener { + if (it != null) { + location = it + Log.d(kTag, "[${location.longitude},${location.latitude}]") + } + } + + rightOperateView.setOnClickListener { + val intent = Intent() + intent.putExtra("longitude", location.longitude.toString()) + intent.putExtra("latitude", location.latitude.toString()) + setResult(RESULT_OK, intent) + finish() + } + } + + /**地图相关*********/ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mapView.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onDestroy() { + mapView.onDestroy() + super.onDestroy() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 4e47f09..fc2ad5d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -119,7 +119,7 @@ val textValue = if (type == Type.ALL) { millSeconds.timestampToTime() } else { - millSeconds.timestampToDate() + millSeconds.timestampToCompleteDate() } endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") diff --git a/app/src/main/res/layout/activity_add_device.xml b/app/src/main/res/layout/activity_add_device.xml index 3b2aa30..e0b4146 100644 --- a/app/src/main/res/layout/activity_add_device.xml +++ b/app/src/main/res/layout/activity_add_device.xml @@ -44,7 +44,7 @@ + android:src="@drawable/ic_scanner" /> @@ -125,7 +125,7 @@ android:id="@+id/longitudeView" style="@style/RelativeTextViewStyle" android:layout_alignParentEnd="true" - android:hint="请点击右边定位自动获取" + android:hint="请点击右边定位获取" android:textColorHint="@color/hintTextColor" /> @@ -141,7 +141,7 @@ android:id="@+id/latitudeView" style="@style/RelativeTextViewStyle" android:layout_alignParentEnd="true" - android:hint="请点击右边定位自动获取" + android:hint="请点击右边定位获取" android:textColorHint="@color/hintTextColor" /> diff --git a/app/src/main/res/layout/activity_select_location.xml b/app/src/main/res/layout/activity_select_location.xml new file mode 100644 index 0000000..965b297 --- /dev/null +++ b/app/src/main/res/layout/activity_select_location.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_device_rv.xml b/app/src/main/res/layout/item_device_rv.xml index ac1f980..c2c6857 100644 --- a/app/src/main/res/layout/item_device_rv.xml +++ b/app/src/main/res/layout/item_device_rv.xml @@ -79,7 +79,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingHorizontal="@dimen/dp_10" - android:paddingVertical="@dimen/dp_3" + android:paddingVertical="@dimen/dp_5" android:text="历史数据" android:textColor="@color/mainThemeColor" android:textSize="@dimen/sp_12"