refactor(FoodRecognizeActivity): 重构食材识别页面返回逻辑和数据传递机制

- 移除废弃的 Uri 导入并添加 Activity 兼容性支持
- 新增手动取消标识常量 IS_MANUAL_CANCEL 用于区分正常选择和手动取消
- 将启动方法参数 onResult 重命名为 finishCallback 并支持取消状态回调
- 使用 IntentCompat 替代已弃用的 getSerializableExtra 方法
- 在标题栏和返回键添加手动返回功能,统一处理页面关闭逻辑
- 修改 finishWithResult 方法支持传递取消状态,仅在非取消状态下传递选中数据
- 更新 PrepareCookActivity 中的重量阈值从 5 改为 15
- 重构识别控制变量,使用 showRecognizePage 和 manualCancelFlag 替代原有变量
- 调整页面生命周期中的识别启用逻辑,确保正确的状态管理
- 修改食材识别启动回调,集成手动取消状态处理机制
This commit is contained in:
2026-04-21 09:29:26 +08:00
parent 82217b4fb1
commit e175893790
2 changed files with 68 additions and 26 deletions
@@ -2,8 +2,9 @@ package com.shuwei.dish.match.ui
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.activity.addCallback
import androidx.core.content.IntentCompat
import androidx.recyclerview.widget.GridLayoutManager
import com.shuwei.dish.match.adapter.GoodsInfoSearchAdapter
import com.shuwei.dish.match.base.BaseActivity
@@ -28,6 +29,7 @@ class FoodRecognizeActivity : BaseActivity() {
private const val TAG = "FoodRecognizeActivity"
private const val EXTRA_IMAGE_URI = "extra_image_uri"
const val EXTRA_SELECTED_ITEM = "extra_selected_item"
const val IS_MANUAL_CANCEL = "isManualCancel"
/** 内存缓存食材列表,避免通过 Intent 序列化传递大数据 */
private var pendingGoodsList: ArrayList<CookFoodGoodsEntity>? = null
@@ -37,22 +39,27 @@ class FoodRecognizeActivity : BaseActivity() {
* @param activity 宿主 Activity
* @param imageUri 食材照片路径(可为空)
* @param goodsList 识别到的食材列表
* @param onResult 页面关闭后回调,携带用户选中的食材(未选中时为 null)
* @param finishCallback 页面关闭后回调,携带用户选中的食材(未选中时为 null)
*/
fun start(
activity: BaseActivity,
imageUri: String? = null,
goodsList: ArrayList<CookFoodGoodsEntity> = arrayListOf(),
onResult: (CookFoodGoodsEntity?) -> Unit = {}
finishCallback: (Boolean, CookFoodGoodsEntity?) -> Unit = { _, _ -> }
) {
pendingGoodsList = goodsList
val intent = Intent(activity, FoodRecognizeActivity::class.java).apply {
val launchIntent = Intent(activity, FoodRecognizeActivity::class.java).apply {
putExtra(EXTRA_IMAGE_URI, imageUri)
}
activity.startActivity(intent) { resultIntent ->
@Suppress("DEPRECATION")
val item = resultIntent?.getSerializableExtra(EXTRA_SELECTED_ITEM) as? CookFoodGoodsEntity
onResult(item)
activity.startActivity(launchIntent) { resultIntent ->
val isManualCancel = resultIntent?.getBooleanExtra(IS_MANUAL_CANCEL, false) ?: false
val entity = resultIntent?.let {
IntentCompat.getSerializableExtra(
it,
EXTRA_SELECTED_ITEM,
CookFoodGoodsEntity::class.java)
}
finishCallback(isManualCancel, entity)
}
}
@@ -64,7 +71,7 @@ class FoodRecognizeActivity : BaseActivity() {
ActivityManager.getActivityStack()
.filterIsInstance<FoodRecognizeActivity>()
.lastOrNull()
?.finishWithResult()
?.finishWithResult(false)
}
}
@@ -103,11 +110,30 @@ class FoodRecognizeActivity : BaseActivity() {
setHeaderBackground()
// 显示标题栏
setTitleBar(titleBarAction = { it.visible() }, titleAction = { it.text = "食材识别" })
setTitleBar(
titleBarAction = { it.visible() },
titleAction = { it.text = "食材识别" },
backAction = {
it.setOnClickListener {
manualBack()
}
}
)
initData()
initRecyclerView()
initClickListeners()
onBackPressedDispatcher.addCallback(this) {
manualBack()
}
}
/**
* 手动返回
*/
private fun manualBack() {
finishWithResult(true)
}
/**
@@ -168,7 +194,7 @@ class FoodRecognizeActivity : BaseActivity() {
}
// 取消:关闭页面
binding.btnCancel.setOnClickListener { finish() }
binding.btnCancel.setOnClickListener { manualBack() }
}
/**
@@ -239,10 +265,14 @@ class FoodRecognizeActivity : BaseActivity() {
/**
* 携带当前选中食材关闭页面
*/
private fun finishWithResult() {
val selected = list.getOrNull(selectedPosition)
private fun finishWithResult(isManualCancel: Boolean) {
val intent = Intent().apply {
selected?.let { putExtra(EXTRA_SELECTED_ITEM, it) }
putExtra(IS_MANUAL_CANCEL, isManualCancel)
if (isManualCancel.not()) {
list.getOrNull(selectedPosition)?.let {
putExtra(EXTRA_SELECTED_ITEM, it)
}
}
}
setResult(RESULT_OK, intent)
finish()
@@ -17,7 +17,6 @@ import com.shuwei.dish.match.base.BaseActivity
import com.shuwei.dish.match.databinding.ActivityPrepareCookBinding
import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding
import com.shuwei.dish.match.dialog.CommonDialog
import com.shuwei.dish.match.dialog.FoodSearchDialog
import com.shuwei.dish.match.entity.CookFoodEntity
import com.shuwei.dish.match.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.entity.FoodRecord
@@ -32,7 +31,6 @@ import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
import com.shuwei.dish.match.utils.ext.clickWithDebounce
import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.roundedDecimalPlace
import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString
import com.shuwei.dish.match.utils.ext.toast
@@ -53,7 +51,7 @@ class PrepareCookActivity : BaseActivity() {
const val FOOD_NAME = "foodName"
const val PAGE_FROM = "pageFrom"
const val HOME = "home"
const val WEIGHT_CHANGE_VALUE = 5
const val WEIGHT_CHANGE_VALUE = 15
const val WEIGHT_RECOGNIZE_VALUE = 10
}
@@ -173,10 +171,13 @@ class PrepareCookActivity : BaseActivity() {
}
private val isTakingPhoto = AtomicBoolean(false)
private var isRecognizeOpen = false
// 识别成功并查询到数据打开识别页面
private var showRecognizePage = false
// 页面可见时允许识别,onPause 后禁止,onResume 后恢复
private var isRecognizeEnabled = true
private var pageVisible = true
// 手动取消标识
private var manualCancelFlag = false
private var lastPhotoUri: Uri? = null
private var lastWeight = 0.0
private var currentWeight = 0.0
@@ -188,11 +189,14 @@ class PrepareCookActivity : BaseActivity() {
private fun recognizeFood(weight: Double) {
this.currentWeight = weight
if (weight < WEIGHT_RECOGNIZE_VALUE) {
isRecognizeOpen = false
showRecognizePage = false
manualCancelFlag = false
FoodRecognizeActivity.close()
return
}
if (!isRecognizeEnabled || isTakingPhoto.get() || isRecognizeOpen || abs(lastWeight - weight) <= WEIGHT_CHANGE_VALUE) return
if (!pageVisible || manualCancelFlag || isTakingPhoto.get() || showRecognizePage || abs(lastWeight - weight) <= WEIGHT_CHANGE_VALUE) {
return
}
isTakingPhoto.set(true)
cameraUtils.takePhoto(
succCallback = cameraSuccessCallback,
@@ -363,14 +367,14 @@ class PrepareCookActivity : BaseActivity() {
override fun onResume() {
super.onResume()
isRecognizeEnabled = true
isRecognizeOpen = false
pageVisible = true
showRecognizePage = false
cameraUtils.bind()
}
override fun onPause() {
super.onPause()
isRecognizeEnabled = false
pageVisible = false
cameraUtils.unbind()
}
@@ -489,9 +493,17 @@ class PrepareCookActivity : BaseActivity() {
activity = this,
imageUri = lastPhotoUri?.toString(),
goodsList = ArrayList(foodList),
onResult = { item -> item?.let { foodSelectCallback(it) } }
finishCallback = { isManualCancel, item ->
manualCancelFlag = isManualCancel
if (isManualCancel) {
return@start
}
item?.let {
foodSelectCallback(it)
}
}
)
isRecognizeOpen = true
showRecognizePage = true
isTakingPhoto.set(false)
}