Merge remote-tracking branch 'origin/main'

This commit is contained in:
马增飞
2025-11-19 13:00:34 +08:00
6 changed files with 105 additions and 25 deletions
@@ -34,10 +34,9 @@ import com.sw.inbound.model.response.SearchGoodsInfo
import com.sw.inbound.objbox.FoodModule
import com.sw.inbound.sdk.SensorScaleUtils
import com.sw.inbound.utils.BitmapCropper
import com.sw.inbound.utils.BitmapSaver
import com.sw.inbound.utils.CameraUtils
import com.sw.inbound.utils.ImageUtil
import com.sw.inbound.utils.ToastUtils
import com.sw.inbound.utils.PreciseDelayHandler
import com.sw.inbound.utils.ext.dp
import com.sw.inbound.utils.ext.gone
import com.sw.inbound.utils.ext.hideKeyboard
@@ -46,8 +45,6 @@ import com.sw.inbound.utils.ext.toJsonString
import com.sw.inbound.utils.ext.toast
import com.sw.inbound.viewmodel.ReceiptViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import timber.log.Timber
import java.io.File
@@ -68,7 +65,7 @@ abstract class GoodsListActivity : ComponentActivity() {
public const val IS_NEW_RECEIPT = "isNewReceipt"
const val PAGE_SIZE = 10
private const val DELAY_TIME = 5 * 1000
private const val DELAY_TIME: Long = 3 * 1000
}
var isReceiptPage: Boolean = false
@@ -147,7 +144,7 @@ abstract class GoodsListActivity : ComponentActivity() {
}
}
cameraUtils.setPreviewController(previewView)
startTime = System.currentTimeMillis()
//startTime = System.currentTimeMillis()
binding.root.postDelayed({
SensorScaleUtils.addWeightListener {
runOnUiThread {
@@ -202,7 +199,7 @@ abstract class GoodsListActivity : ComponentActivity() {
recognizeFood()
}
var startTime = 0L
//var startTime = 0L
var isFirstRecognize = true
private val takePhotoSuccessCallback: (Uri) -> Unit = { uri ->
@@ -215,16 +212,17 @@ abstract class GoodsListActivity : ComponentActivity() {
}.start()
}
fun delayRecognizeFood() {
if (abs(lastWeight) < 10) {
return
private val delayHandler by lazy {
PreciseDelayHandler()
}
window.decorView.postDelayed(
{
fun delayRecognizeFood() {
if (abs(lastWeight) < 10) return
delayHandler.precisePostDelayed(DELAY_TIME) {
runOnUiThread {
recognizeFood()
},
DELAY_TIME.toLong()
)
}
}
}
fun recognizeFood() {
@@ -283,9 +281,6 @@ abstract class GoodsListActivity : ComponentActivity() {
targetWidth = 1000, targetHeight = 1300,
offsetX = 30, offsetY = 100
)
if (bitmap.isRecycled.not()) {
bitmap.recycle()
}
// val file = BitmapSaver.saveToAppFilesDir(
// newBmp,
// this,
@@ -299,6 +294,9 @@ abstract class GoodsListActivity : ComponentActivity() {
//foodList = foodList.map { it.split("WP")[0] }
val foodList = FoodModule.getFoodScoreList(newBmp)
if (bitmap.isRecycled.not()) {
bitmap.recycle()
}
if (newBmp.isRecycled.not()) {
newBmp.recycle()
}
@@ -61,7 +61,7 @@ class GoodsRecognizeDialog(
goods = list[position]
) {
activity?.addGoods(it)
activity?.startTime = System.currentTimeMillis()
//activity?.startTime = System.currentTimeMillis()
dismiss()
}.show()
}
@@ -79,7 +79,7 @@ class GoodsRecognizeDialog(
binding.ivClose.setOnClickListener {
dismiss()
activity?.delayRecognizeFood()
activity?.startTime = System.currentTimeMillis()
//activity?.startTime = System.currentTimeMillis()
}
binding.btnManuallyFind.setOnClickListener {
findGoods()
@@ -69,7 +69,7 @@ class GoodsSearchDialog(
goods = list[clickIndex]
) {
activity?.addGoods(it)
activity?.startTime = System.currentTimeMillis()
//activity?.startTime = System.currentTimeMillis()
activity?.goodsRecognizeDialog?.dismiss()
dismiss()
}.show()
@@ -2,13 +2,11 @@ package com.sw.inbound.sdk
import android.os.Handler
import android.os.Looper
import com.sw.inbound.utils.MessageEvent
import com.sw.inbound.utils.ThreadUtils
import com.sw.inbound.utils.ToastUtils
import com.wabon.wbintelligenthardwaresdk.api.SensorScale
import com.wabon.wbintelligenthardwaresdk.api.SensorScale.OnScaleResult
import kotlinx.coroutines.delay
import org.greenrobot.eventbus.EventBus
import timber.log.Timber
import kotlin.math.roundToInt
@@ -9,10 +9,11 @@ object ImageUtil {
fun uriToBitmap(context: Context, uri: Uri): Bitmap? {
return try {
val options = BitmapFactory.Options()
options.inSampleSize = 10; // 这会将图片的尺寸缩小到原来的1/2
options.inSampleSize = 2; // 这会将图片的尺寸缩小到原来的1/2
options.inJustDecodeBounds = false
options.inPreferredConfig = Bitmap.Config.RGB_565
context.contentResolver.openInputStream(uri)?.use { stream ->
BitmapFactory.decodeStream(stream)
BitmapFactory.decodeStream(stream, null, options)
}
} catch (e: Exception) {
e.printStackTrace()
@@ -0,0 +1,83 @@
package com.sw.inbound.utils
import android.os.Handler
import android.os.Looper
import android.os.SystemClock
import android.util.Log
class PreciseDelayHandler {
val TAG = "PreciseDelayHandler"
private val handler = Handler(Looper.getMainLooper())
private var isRunning = false
private var endTime = 0L
/**
* 精确延迟执行
* @param delayMillis 总延迟时间(毫秒)
* @param runnable 要执行的任务
*/
fun precisePostDelayed(delayMillis: Long, block:()-> Unit) {
isRunning = true
endTime = SystemClock.uptimeMillis() + delayMillis
val ticker = object : Runnable {
override fun run() {
if (!isRunning) return
val now = SystemClock.uptimeMillis()
val interval = now - endTime
if (interval >= 0) {
block()
isRunning = false
} else {
// 计算下一个整百毫秒时间点进行校准
val next = now + (100 - now % 100)
handler.postAtTime(this, next)
}
}
}
handler.post(ticker)
}
/**
* 精确循环执行
* @param interval 执行间隔(毫秒)
* @param runnable 要执行的任务
*/
fun preciseLoop(interval: Long, block:()-> Unit) {
isRunning = true
val ticker = object : Runnable {
override fun run() {
if (!isRunning) return
val startTime = SystemClock.uptimeMillis()
block()
val elapsed = SystemClock.uptimeMillis() - startTime
val remainingDelay = interval - elapsed
if (remainingDelay > 0) {
handler.postDelayed(this, remainingDelay)
} else {
handler.post(this)
}
}
}
handler.post(ticker)
}
/**
* 取消所有延迟任务
*/
fun cancelAll() {
isRunning = false
handler.removeCallbacksAndMessages(null)
}
/**
* 获取是否正在运行
*/
fun isRunning(): Boolean = isRunning
}