diff --git a/app/build.gradle b/app/build.gradle index b801032..c0eec8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,7 +82,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.9' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' diff --git a/app/build.gradle b/app/build.gradle index b801032..c0eec8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,7 +82,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.9' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 656070c..d70a979 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -3,13 +3,11 @@ import android.annotation.SuppressLint import android.graphics.Color import android.os.Bundle -import android.os.CountDownTimer -import android.os.Handler -import android.os.Message import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.app.smartwell.R import com.casic.app.smartwell.callback.OnImageCompressListener import com.casic.app.smartwell.databinding.ActivityOrderInHandleDetailBinding @@ -41,19 +39,19 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity(), - Handler.Callback { +class OrderInHandleDetailActivity : KotlinBaseActivity() { private val kTag = "OrderInHandleDetailActivity" - private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } - private val marginOffsets by lazy { 3.dp2px(this) } + private val marginOffsets by lazy { 2.dp2px(this) } private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel @@ -61,7 +59,8 @@ private lateinit var imageAdapter: EditableImageAdapter private val context = this private val imagePaths = ArrayList() //服务器返回的拍照数据集 - private val realPaths = ArrayList() //真实图片路径 + private val recyclerViewImages = ArrayList() //真实图片路径 + private val selectedImages = ArrayList() override fun initViewBinding(): ActivityOrderInHandleDetailBinding { return ActivityOrderInHandleDetailBinding.inflate(layoutInflater) @@ -88,7 +87,7 @@ //左外边距,左内边距,右内边距,右外边距 val viewWidth = getScreenWidth() - (10 + 10 + 10 + 10).dp2px(this) - imageAdapter = EditableImageAdapter(this, viewWidth, 3, 3) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) binding.addImageRecyclerView.addItemDecoration( RecyclerViewItemOffsets(marginOffsets, marginOffsets, marginOffsets, marginOffsets) ) @@ -304,8 +303,8 @@ if (it.code == 200) { val url = it.data.toString() imagePaths.add(url) - realPaths.add(url.combineImagePath()) - imageAdapter.notifyImageItemRangeInserted(realPaths) + recyclerViewImages.add(url.combineImagePath()) + imageAdapter.notifyDataSetChanged() } } } @@ -381,17 +380,18 @@ } override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { + if (recyclerViewImages[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { - context.navigatePageTo(position, realPaths) + context.navigatePageTo(position, recyclerViewImages) } } override fun onItemLongClick(view: View?, position: Int) { + selectedImages.removeAt(position) imagePaths.removeAt(position) - realPaths.removeAt(position) - imageAdapter.notifyImageItemRemoved(realPaths) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() } }) } @@ -413,7 +413,7 @@ "拍照保存失败,请重试".show(context) return } - analyticalSelectResults(result[0]) + handleSelectResult(result.first()) } override fun onCancel() { @@ -433,25 +433,24 @@ .setImageEngine(GlideLoadEngine.get) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - if (result == null) { - "选择照片失败,请重试".show(context) - return + //重置已选的图片 + selectedImages.clear() + //因为result会带着之前的数据,所以需要清空之前已经add的数据 + recyclerViewImages.clear() + imagePaths.clear() + // 数据链控制图片压缩上传过程,防止速度过快导致压缩失败 + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + selectedImages.add(it) + //压缩图片并上传 + handleSelectResult(it) + } } - // TODO 改为协程 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { - override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 - val message = weakReferenceHandler.obtainMessage() - message.obj = result[i.toInt()] - message.what = 2022062901 - weakReferenceHandler.handleMessage(message) - } - - override fun onFinish() { - - } - }.start() } override fun onCancel() { @@ -465,14 +464,7 @@ .build().show() } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2022062901) { - analyticalSelectResults(msg.obj as LocalMedia) - } - return true - } - - private fun analyticalSelectResults(result: LocalMedia) { + private fun handleSelectResult(result: LocalMedia) { //压缩图片 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { diff --git a/app/build.gradle b/app/build.gradle index b801032..c0eec8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,7 +82,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.9' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.10' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt index 656070c..d70a979 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderInHandleDetailActivity.kt @@ -3,13 +3,11 @@ import android.annotation.SuppressLint import android.graphics.Color import android.os.Bundle -import android.os.CountDownTimer -import android.os.Handler -import android.os.Message import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.app.smartwell.R import com.casic.app.smartwell.callback.OnImageCompressListener import com.casic.app.smartwell.databinding.ActivityOrderInHandleDetailBinding @@ -41,19 +39,19 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch import java.io.File -class OrderInHandleDetailActivity : KotlinBaseActivity(), - Handler.Callback { +class OrderInHandleDetailActivity : KotlinBaseActivity() { private val kTag = "OrderInHandleDetailActivity" - private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } - private val marginOffsets by lazy { 3.dp2px(this) } + private val marginOffsets by lazy { 2.dp2px(this) } private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel @@ -61,7 +59,8 @@ private lateinit var imageAdapter: EditableImageAdapter private val context = this private val imagePaths = ArrayList() //服务器返回的拍照数据集 - private val realPaths = ArrayList() //真实图片路径 + private val recyclerViewImages = ArrayList() //真实图片路径 + private val selectedImages = ArrayList() override fun initViewBinding(): ActivityOrderInHandleDetailBinding { return ActivityOrderInHandleDetailBinding.inflate(layoutInflater) @@ -88,7 +87,7 @@ //左外边距,左内边距,右内边距,右外边距 val viewWidth = getScreenWidth() - (10 + 10 + 10 + 10).dp2px(this) - imageAdapter = EditableImageAdapter(this, viewWidth, 3, 3) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) binding.addImageRecyclerView.addItemDecoration( RecyclerViewItemOffsets(marginOffsets, marginOffsets, marginOffsets, marginOffsets) ) @@ -304,8 +303,8 @@ if (it.code == 200) { val url = it.data.toString() imagePaths.add(url) - realPaths.add(url.combineImagePath()) - imageAdapter.notifyImageItemRangeInserted(realPaths) + recyclerViewImages.add(url.combineImagePath()) + imageAdapter.notifyDataSetChanged() } } } @@ -381,17 +380,18 @@ } override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { + if (recyclerViewImages[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { - context.navigatePageTo(position, realPaths) + context.navigatePageTo(position, recyclerViewImages) } } override fun onItemLongClick(view: View?, position: Int) { + selectedImages.removeAt(position) imagePaths.removeAt(position) - realPaths.removeAt(position) - imageAdapter.notifyImageItemRemoved(realPaths) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() } }) } @@ -413,7 +413,7 @@ "拍照保存失败,请重试".show(context) return } - analyticalSelectResults(result[0]) + handleSelectResult(result.first()) } override fun onCancel() { @@ -433,25 +433,24 @@ .setImageEngine(GlideLoadEngine.get) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - if (result == null) { - "选择照片失败,请重试".show(context) - return + //重置已选的图片 + selectedImages.clear() + //因为result会带着之前的数据,所以需要清空之前已经add的数据 + recyclerViewImages.clear() + imagePaths.clear() + // 数据链控制图片压缩上传过程,防止速度过快导致压缩失败 + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + selectedImages.add(it) + //压缩图片并上传 + handleSelectResult(it) + } } - // TODO 改为协程 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { - override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 - val message = weakReferenceHandler.obtainMessage() - message.obj = result[i.toInt()] - message.what = 2022062901 - weakReferenceHandler.handleMessage(message) - } - - override fun onFinish() { - - } - }.start() } override fun onCancel() { @@ -465,14 +464,7 @@ .build().show() } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2022062901) { - analyticalSelectResults(msg.obj as LocalMedia) - } - return true - } - - private fun analyticalSelectResults(result: LocalMedia) { + private fun handleSelectResult(result: LocalMedia) { //压缩图片 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { diff --git a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt index 28edabe..8e036d2 100644 --- a/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/view/OrderNotConfirmedDetailActivity.kt @@ -1,15 +1,12 @@ package com.casic.app.smartwell.view -import android.content.Context import android.graphics.Color import android.os.Bundle -import android.os.CountDownTimer -import android.os.Handler -import android.os.Message import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.app.smartwell.R import com.casic.app.smartwell.callback.OnImageCompressListener import com.casic.app.smartwell.databinding.ActivityOrderNotConfirmedDetailBinding @@ -40,28 +37,30 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch import java.io.File class OrderNotConfirmedDetailActivity : - KotlinBaseActivity(), Handler.Callback { + KotlinBaseActivity() { private val kTag = "OrderNotConfirmedDetailActivity" - private val weakReferenceHandler by lazy { WeakReferenceHandler(this) } - private val marginOffsets by lazy { 3.dp2px(this) } + private val marginOffsets by lazy { 2.dp2px(this) } private lateinit var orderViewModel: OrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var userViewModel: UserViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: EditableImageAdapter private lateinit var needHandle: String - private val context: Context = this - private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 - private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val context = this + private val imagePaths = ArrayList() //服务器返回的拍照数据集 + private val recyclerViewImages = ArrayList() //真实图片路径 + private val selectedImages = ArrayList() override fun initViewBinding(): ActivityOrderNotConfirmedDetailBinding { return ActivityOrderNotConfirmedDetailBinding.inflate(layoutInflater) @@ -85,7 +84,7 @@ //初始化图片九宫格 //左外边距,左内边距,右内边距,右外边距 val viewWidth = getScreenWidth() - (10 + 10 + 10 + 10).dp2px(this) - imageAdapter = EditableImageAdapter(this, viewWidth, 3, 3) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) binding.addImageRecyclerView.addItemDecoration( RecyclerViewItemOffsets(marginOffsets, marginOffsets, marginOffsets, marginOffsets) ) @@ -254,8 +253,8 @@ if (it.code == 200) { val url = it.data.toString() imagePaths.add(url) - realPaths.add(url.combineImagePath()) - imageAdapter.notifyImageItemRangeInserted(realPaths) + recyclerViewImages.add(url.combineImagePath()) + imageAdapter.notifyDataSetChanged() } } } @@ -331,17 +330,18 @@ } override fun onItemClick(position: Int) { - if (realPaths[position].isEmpty()) { + if (recyclerViewImages[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { - context.navigatePageTo(position, realPaths) + context.navigatePageTo(position, recyclerViewImages) } } override fun onItemLongClick(view: View?, position: Int) { + selectedImages.removeAt(position) imagePaths.removeAt(position) - realPaths.removeAt(position) - imageAdapter.notifyImageItemRemoved(realPaths) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() } }) } @@ -360,7 +360,7 @@ "拍照保存失败,请重试".show(context) return } - analyticalSelectResults(result[0]) + handleSelectResult(result.first()) } override fun onCancel() { @@ -374,27 +374,27 @@ .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.get) + .setSelectedData(selectedImages) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - if (result == null) { - "选择照片失败,请重试".show(context) - return + //重置已选的图片 + selectedImages.clear() + //因为result会带着之前的数据,所以需要清空之前已经add的数据 + recyclerViewImages.clear() + imagePaths.clear() + // 数据链控制图片压缩上传过程,防止速度过快导致压缩失败 + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + selectedImages.add(it) + //压缩图片并上传 + handleSelectResult(it) + } } - // TODO 改为协程 - val sum = (result.size * 500).toLong() - object : CountDownTimer(sum, 500) { - override fun onTick(millisUntilFinished: Long) { - val i = millisUntilFinished / 500 - val message = weakReferenceHandler.obtainMessage() - message.obj = result[i.toInt()] - message.what = 2022062902 - weakReferenceHandler.handleMessage(message) - } - - override fun onFinish() { - - } - }.start() } override fun onCancel() { @@ -407,14 +407,7 @@ }).build().show() } - override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2022062902) { - analyticalSelectResults(msg.obj as LocalMedia) - } - return true - } - - private fun analyticalSelectResults(result: LocalMedia) { + private fun handleSelectResult(result: LocalMedia) { //压缩图片 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) {