refactor(FoodRecognizeActivity): 重构食材识别页面返回逻辑和数据传递机制
- 移除废弃的 Uri 导入并添加 Activity 兼容性支持 - 新增手动取消标识常量 IS_MANUAL_CANCEL 用于区分正常选择和手动取消 - 将启动方法参数 onResult 重命名为 finishCallback 并支持取消状态回调 - 使用 IntentCompat 替代已弃用的 getSerializableExtra 方法 - 在标题栏和返回键添加手动返回功能,统一处理页面关闭逻辑 - 修改 finishWithResult 方法支持传递取消状态,仅在非取消状态下传递选中数据 - 更新 PrepareCookActivity 中的重量阈值从 5 改为 15 - 重构识别控制变量,使用 showRecognizePage 和 manualCancelFlag 替代原有变量 - 调整页面生命周期中的识别启用逻辑,确保正确的状态管理 - 修改食材识别启动回调,集成手动取消状态处理机制
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user