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.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import androidx.activity.addCallback
|
||||||
|
import androidx.core.content.IntentCompat
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import com.shuwei.dish.match.adapter.GoodsInfoSearchAdapter
|
import com.shuwei.dish.match.adapter.GoodsInfoSearchAdapter
|
||||||
import com.shuwei.dish.match.base.BaseActivity
|
import com.shuwei.dish.match.base.BaseActivity
|
||||||
@@ -28,6 +29,7 @@ class FoodRecognizeActivity : BaseActivity() {
|
|||||||
private const val TAG = "FoodRecognizeActivity"
|
private const val TAG = "FoodRecognizeActivity"
|
||||||
private const val EXTRA_IMAGE_URI = "extra_image_uri"
|
private const val EXTRA_IMAGE_URI = "extra_image_uri"
|
||||||
const val EXTRA_SELECTED_ITEM = "extra_selected_item"
|
const val EXTRA_SELECTED_ITEM = "extra_selected_item"
|
||||||
|
const val IS_MANUAL_CANCEL = "isManualCancel"
|
||||||
|
|
||||||
/** 内存缓存食材列表,避免通过 Intent 序列化传递大数据 */
|
/** 内存缓存食材列表,避免通过 Intent 序列化传递大数据 */
|
||||||
private var pendingGoodsList: ArrayList<CookFoodGoodsEntity>? = null
|
private var pendingGoodsList: ArrayList<CookFoodGoodsEntity>? = null
|
||||||
@@ -37,22 +39,27 @@ class FoodRecognizeActivity : BaseActivity() {
|
|||||||
* @param activity 宿主 Activity
|
* @param activity 宿主 Activity
|
||||||
* @param imageUri 食材照片路径(可为空)
|
* @param imageUri 食材照片路径(可为空)
|
||||||
* @param goodsList 识别到的食材列表
|
* @param goodsList 识别到的食材列表
|
||||||
* @param onResult 页面关闭后回调,携带用户选中的食材(未选中时为 null)
|
* @param finishCallback 页面关闭后回调,携带用户选中的食材(未选中时为 null)
|
||||||
*/
|
*/
|
||||||
fun start(
|
fun start(
|
||||||
activity: BaseActivity,
|
activity: BaseActivity,
|
||||||
imageUri: String? = null,
|
imageUri: String? = null,
|
||||||
goodsList: ArrayList<CookFoodGoodsEntity> = arrayListOf(),
|
goodsList: ArrayList<CookFoodGoodsEntity> = arrayListOf(),
|
||||||
onResult: (CookFoodGoodsEntity?) -> Unit = {}
|
finishCallback: (Boolean, CookFoodGoodsEntity?) -> Unit = { _, _ -> }
|
||||||
) {
|
) {
|
||||||
pendingGoodsList = goodsList
|
pendingGoodsList = goodsList
|
||||||
val intent = Intent(activity, FoodRecognizeActivity::class.java).apply {
|
val launchIntent = Intent(activity, FoodRecognizeActivity::class.java).apply {
|
||||||
putExtra(EXTRA_IMAGE_URI, imageUri)
|
putExtra(EXTRA_IMAGE_URI, imageUri)
|
||||||
}
|
}
|
||||||
activity.startActivity(intent) { resultIntent ->
|
activity.startActivity(launchIntent) { resultIntent ->
|
||||||
@Suppress("DEPRECATION")
|
val isManualCancel = resultIntent?.getBooleanExtra(IS_MANUAL_CANCEL, false) ?: false
|
||||||
val item = resultIntent?.getSerializableExtra(EXTRA_SELECTED_ITEM) as? CookFoodGoodsEntity
|
val entity = resultIntent?.let {
|
||||||
onResult(item)
|
IntentCompat.getSerializableExtra(
|
||||||
|
it,
|
||||||
|
EXTRA_SELECTED_ITEM,
|
||||||
|
CookFoodGoodsEntity::class.java)
|
||||||
|
}
|
||||||
|
finishCallback(isManualCancel, entity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +71,7 @@ class FoodRecognizeActivity : BaseActivity() {
|
|||||||
ActivityManager.getActivityStack()
|
ActivityManager.getActivityStack()
|
||||||
.filterIsInstance<FoodRecognizeActivity>()
|
.filterIsInstance<FoodRecognizeActivity>()
|
||||||
.lastOrNull()
|
.lastOrNull()
|
||||||
?.finishWithResult()
|
?.finishWithResult(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,11 +110,30 @@ class FoodRecognizeActivity : BaseActivity() {
|
|||||||
setHeaderBackground()
|
setHeaderBackground()
|
||||||
|
|
||||||
// 显示标题栏
|
// 显示标题栏
|
||||||
setTitleBar(titleBarAction = { it.visible() }, titleAction = { it.text = "食材识别" })
|
setTitleBar(
|
||||||
|
titleBarAction = { it.visible() },
|
||||||
|
titleAction = { it.text = "食材识别" },
|
||||||
|
backAction = {
|
||||||
|
it.setOnClickListener {
|
||||||
|
manualBack()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
initData()
|
initData()
|
||||||
initRecyclerView()
|
initRecyclerView()
|
||||||
initClickListeners()
|
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() {
|
private fun finishWithResult(isManualCancel: Boolean) {
|
||||||
val selected = list.getOrNull(selectedPosition)
|
|
||||||
val intent = Intent().apply {
|
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)
|
setResult(RESULT_OK, intent)
|
||||||
finish()
|
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.ActivityPrepareCookBinding
|
||||||
import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding
|
import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding
|
||||||
import com.shuwei.dish.match.dialog.CommonDialog
|
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.CookFoodEntity
|
||||||
import com.shuwei.dish.match.entity.CookFoodGoodsEntity
|
import com.shuwei.dish.match.entity.CookFoodGoodsEntity
|
||||||
import com.shuwei.dish.match.entity.FoodRecord
|
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.addOnActionSearchListener
|
||||||
import com.shuwei.dish.match.utils.ext.clickWithDebounce
|
import com.shuwei.dish.match.utils.ext.clickWithDebounce
|
||||||
import com.shuwei.dish.match.utils.ext.gone
|
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.startActivity
|
||||||
import com.shuwei.dish.match.utils.ext.toJsonString
|
import com.shuwei.dish.match.utils.ext.toJsonString
|
||||||
import com.shuwei.dish.match.utils.ext.toast
|
import com.shuwei.dish.match.utils.ext.toast
|
||||||
@@ -53,7 +51,7 @@ class PrepareCookActivity : BaseActivity() {
|
|||||||
const val FOOD_NAME = "foodName"
|
const val FOOD_NAME = "foodName"
|
||||||
const val PAGE_FROM = "pageFrom"
|
const val PAGE_FROM = "pageFrom"
|
||||||
const val HOME = "home"
|
const val HOME = "home"
|
||||||
const val WEIGHT_CHANGE_VALUE = 5
|
const val WEIGHT_CHANGE_VALUE = 15
|
||||||
const val WEIGHT_RECOGNIZE_VALUE = 10
|
const val WEIGHT_RECOGNIZE_VALUE = 10
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,10 +171,13 @@ class PrepareCookActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val isTakingPhoto = AtomicBoolean(false)
|
private val isTakingPhoto = AtomicBoolean(false)
|
||||||
private var isRecognizeOpen = false
|
// 识别成功并查询到数据打开识别页面
|
||||||
|
private var showRecognizePage = false
|
||||||
|
|
||||||
// 页面可见时允许识别,onPause 后禁止,onResume 后恢复
|
// 页面可见时允许识别,onPause 后禁止,onResume 后恢复
|
||||||
private var isRecognizeEnabled = true
|
private var pageVisible = true
|
||||||
|
// 手动取消标识
|
||||||
|
private var manualCancelFlag = false
|
||||||
private var lastPhotoUri: Uri? = null
|
private var lastPhotoUri: Uri? = null
|
||||||
private var lastWeight = 0.0
|
private var lastWeight = 0.0
|
||||||
private var currentWeight = 0.0
|
private var currentWeight = 0.0
|
||||||
@@ -188,11 +189,14 @@ class PrepareCookActivity : BaseActivity() {
|
|||||||
private fun recognizeFood(weight: Double) {
|
private fun recognizeFood(weight: Double) {
|
||||||
this.currentWeight = weight
|
this.currentWeight = weight
|
||||||
if (weight < WEIGHT_RECOGNIZE_VALUE) {
|
if (weight < WEIGHT_RECOGNIZE_VALUE) {
|
||||||
isRecognizeOpen = false
|
showRecognizePage = false
|
||||||
|
manualCancelFlag = false
|
||||||
FoodRecognizeActivity.close()
|
FoodRecognizeActivity.close()
|
||||||
return
|
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)
|
isTakingPhoto.set(true)
|
||||||
cameraUtils.takePhoto(
|
cameraUtils.takePhoto(
|
||||||
succCallback = cameraSuccessCallback,
|
succCallback = cameraSuccessCallback,
|
||||||
@@ -363,14 +367,14 @@ class PrepareCookActivity : BaseActivity() {
|
|||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
isRecognizeEnabled = true
|
pageVisible = true
|
||||||
isRecognizeOpen = false
|
showRecognizePage = false
|
||||||
cameraUtils.bind()
|
cameraUtils.bind()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
isRecognizeEnabled = false
|
pageVisible = false
|
||||||
cameraUtils.unbind()
|
cameraUtils.unbind()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -489,9 +493,17 @@ class PrepareCookActivity : BaseActivity() {
|
|||||||
activity = this,
|
activity = this,
|
||||||
imageUri = lastPhotoUri?.toString(),
|
imageUri = lastPhotoUri?.toString(),
|
||||||
goodsList = ArrayList(foodList),
|
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)
|
isTakingPhoto.set(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user