diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt index c20ecc3..95d4ceb 100644 --- a/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt +++ b/app/src/main/java/com/shuwei/dish/match/adapter/DishPartAdapter.kt @@ -9,7 +9,9 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.dish.match.R import com.shuwei.dish.match.databinding.ListItemDishCookBinding import com.shuwei.dish.match.entity.CookFoodGoodsEntity +import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.roundedOneDecimalPlace +import com.shuwei.dish.match.utils.ext.visible import java.text.DecimalFormat class DishPartAdapter(list: MutableList) : @@ -36,12 +38,16 @@ class DishPartAdapter(list: MutableList) : if (item.isSamplingPage) R.color.black999 else R.color.dish_green ) ) + + ivOperateIcon.run { + if (item.isSamplingPage) gone() else visible() + } + ivClearIcon.visible() + ivClearIcon.setImageResource( + if (item.isOriginalData) R.drawable.ic_dish_clear + else R.drawable.ic_delete + ) ivOperateIcon.setImageResource( - if (item.isSamplingPage) - //采集页面 - R.drawable.ic_delete - else - //制作页面 if (item.isSetFinished) R.drawable.ic_dish_selected else R.drawable.ic_dish_unselected ) @@ -53,5 +59,4 @@ class DishPartAdapter(list: MutableList) : } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt b/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt index 3473697..3846ea7 100644 --- a/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt +++ b/app/src/main/java/com/shuwei/dish/match/adapter/GoodsInfoSearchAdapter.kt @@ -9,6 +9,9 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder import com.shuwei.dish.match.R import com.shuwei.dish.match.databinding.ListItemSearchGoodsInfoBinding import com.shuwei.dish.match.entity.CookFoodGoodsEntity +import com.shuwei.dish.match.utils.ext.gone +import com.shuwei.dish.match.utils.ext.roundedDecimalPlace +import com.shuwei.dish.match.utils.ext.visible class GoodsInfoSearchAdapter(private var list: MutableList) : BaseQuickAdapter(list) { @@ -18,20 +21,29 @@ class GoodsInfoSearchAdapter(private var list: MutableList) position: Int, item: CookFoodGoodsEntity? ) { + item ?: return holder.binding.tvGoodsInfo.run { - text = item?.goodsName + text = item.goodsName setBackgroundResource( - if (item?.isClicked == true) R.drawable.shape_green_stroke + if (item.isClicked == true) R.drawable.shape_green_stroke else R.drawable.shape_white_12_corners ) setTextColor( ContextCompat.getColor( context, - if (item?.isClicked == true) R.color.dish_green + if (item.isClicked == true) R.color.dish_green else R.color.black666 ) ) } + if (item.foodScore == -1){ + holder.binding.tvFoodScore.gone() + } else { + holder.binding.tvFoodScore.let { + it.visible() + it.text = "${(item.foodScore / 100.0).roundedDecimalPlace(2)}%" + } + } } override fun onCreateViewHolder( diff --git a/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt b/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt index 507a21c..d7cb3e6 100644 --- a/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt +++ b/app/src/main/java/com/shuwei/dish/match/entity/CookFoodGoodsEntity.kt @@ -86,4 +86,7 @@ class CookFoodGoodsEntity( //true-原始数据,false-非原始数据 @Ignore var isOriginalData: Boolean = true + + @Ignore + var foodScore: Int = -1 } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt index fc0df2b..5210bc3 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/FoodRecognizeActivity.kt @@ -16,6 +16,7 @@ import com.shuwei.dish.match.utils.WeightUtil import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.visible +import androidx.core.net.toUri /** * 食材识别结果页面 @@ -71,12 +72,25 @@ class FoodRecognizeActivity : BaseActivity() { private val list = mutableListOf() + /** 当前选中的列表位置,-1 表示无选中 */ + private var selectedPosition = -1 + + /** 秤1当前实时重量 */ + private var currentWeight = 0.0 + + /** 重量减少时延迟更新的任务,页面关闭前取消可防止用错误重量 */ + private var pendingWeightRunnable: Runnable? = null + + /** 当前待延迟更新的目标重量,避免相同重量重复重置计时器 */ + private var pendingWeight = 0.0 + private val adapter = GoodsInfoSearchAdapter(list).apply { setOnItemClickListener { _, _, position -> - // 更新选中状态 list.forEachIndexed { i, item -> item.isClicked = (i == position) } + // 点击选择时记录当前秤重量 + list[position].useWeight = currentWeight notifyDataSetChanged() - // 同步更新选中食材名称 + selectedPosition = position binding.tvSelectedFood.text = list[position].goodsName ?: "-" } } @@ -85,6 +99,7 @@ class FoodRecognizeActivity : BaseActivity() { super.onCreate(savedInstanceState) binding = ActivityFoodRecognizeBinding.inflate(layoutInflater) setContentView(binding.root) + registerWeightListener() setHeaderBackground() // 显示标题栏 @@ -93,7 +108,6 @@ class FoodRecognizeActivity : BaseActivity() { initData() initRecyclerView() initClickListeners() - registerWeightListener() } /** @@ -103,7 +117,7 @@ class FoodRecognizeActivity : BaseActivity() { // 加载食材照片 val imageUri = intent.getStringExtra(EXTRA_IMAGE_URI) if (!imageUri.isNullOrBlank()) { - binding.ivFoodPhoto.setImageURI(Uri.parse(imageUri)) + binding.ivFoodPhoto.setImageURI(imageUri.toUri()) } // 取出内存缓存的食材列表,取用后立即清空 @@ -111,6 +125,7 @@ class FoodRecognizeActivity : BaseActivity() { if (!goodsList.isNullOrEmpty()) { list.addAll(goodsList) // 默认选中第一项 + selectedPosition = 0 list[0].isClicked = true binding.tvSelectedFood.text = list[0].goodsName ?: "-" } @@ -144,14 +159,11 @@ class FoodRecognizeActivity : BaseActivity() { private fun initClickListeners() { // 更换食材:打开食材搜索弹窗 binding.btnChangeFood.clickWithDebounce { - val currentName = if (list.isNotEmpty()) list.firstOrNull { it.isClicked }?.goodsName else null + val currentName = list.getOrNull(selectedPosition)?.goodsName FoodSearchDialog( activity = this, defGoodsName = currentName, - onItemSelected = { item -> - // 用搜索结果替换当前选中食材 - updateSelectedFood(item) - } + onItemSelected = { item -> updateSelectedFood(item) } ).show() } @@ -164,17 +176,14 @@ class FoodRecognizeActivity : BaseActivity() { */ @SuppressLint("NotifyDataSetChanged") private fun updateSelectedFood(item: CookFoodGoodsEntity) { - item.isClicked = true - val clickedIndex = list.indexOfFirst { it.isClicked && it.goodsId != item.goodsId } - if (clickedIndex >= 0) { - list[clickedIndex].isClicked = false - } - // 若列表中已存在则直接选中,否则插入到首位 val existIndex = list.indexOfFirst { it.goodsId == item.goodsId } if (existIndex >= 0) { list.forEachIndexed { i, e -> e.isClicked = (i == existIndex) } + selectedPosition = existIndex } else { list.add(0, item) + list.forEachIndexed { i, e -> e.isClicked = (i == 0) } + selectedPosition = 0 } adapter.notifyDataSetChanged() binding.tvSelectedFood.text = item.goodsName ?: "-" @@ -183,22 +192,55 @@ class FoodRecognizeActivity : BaseActivity() { /** * 注册秤1重量监听 + * 只有重量高于识别阈值时才更新选中食材的 useWeight, + * 低于阈值说明食材已被取走,保留上次有效值等待页面关闭 */ private fun registerWeightListener() { - WeightUtil.addWeightListener(TAG) { address, _, weight -> - if (address == AddressUtil.ONE) { + WeightUtil.addWeightListener(TAG) { address, state, weight -> + if (address == AddressUtil.ONE && state == WeightUtil.STATE_STABLE) { runOnUiThread { - binding.tvWeight.text = "$weight g" + currentWeight = weight + binding.tvWeight.run { + if (tag != weight) { + text = "$weight g" + tag = weight + } + } + if (weight >= PrepareCookActivity.WEIGHT_RECOGNIZE_VALUE) { + adapter.items.firstOrNull { it.isClicked }?.let { item -> + if (weight > (item.useWeight ?: 0.0)) { + // 重量增加:立即更新 + cancelPendingWeightUpdate() + item.useWeight = currentWeight + } else if (pendingWeight != weight) { + // 重量减少且目标值变化:重置延迟任务,3 秒无新变化后更新 + cancelPendingWeightUpdate() + pendingWeight = weight + pendingWeightRunnable = Runnable { + item.useWeight = weight + pendingWeightRunnable = null + }.also { handler.postDelayed(it, 3000) } + } + } + } } } } } + /** + * 取消待执行的延迟重量更新任务 + */ + private fun cancelPendingWeightUpdate() { + pendingWeightRunnable?.let { handler.removeCallbacks(it) } + pendingWeightRunnable = null + } + /** * 携带当前选中食材关闭页面 */ private fun finishWithResult() { - val selected = list.firstOrNull { it.isClicked } + val selected = list.getOrNull(selectedPosition) val intent = Intent().apply { selected?.let { putExtra(EXTRA_SELECTED_ITEM, it) } } @@ -208,6 +250,7 @@ class FoodRecognizeActivity : BaseActivity() { override fun onDestroy() { super.onDestroy() - WeightUtil.removeWeightListener(TAG) + cancelPendingWeightUpdate() +// WeightUtil.removeWeightListener(TAG) } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt index 5b1ec1b..6df75e4 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/HomeActivity.kt @@ -158,8 +158,8 @@ class HomeActivity : BaseActivity() { return@countCookFood } //无烹饪数据打开新增采样页面 - startActivity { - putExtra(DishSamplingActivity.PAGE_FROM, DishSamplingActivity.HOME) + startActivity { + putExtra(PrepareCookActivity.PAGE_FROM, PrepareCookActivity.HOME) } finish() } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt index a43cef0..9dda7f8 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt @@ -113,8 +113,8 @@ class InitActivity : BaseActivity() { return@countCookFood } //无烹饪数据打开新增采样页面 - startActivity { - putExtra(DishSamplingActivity.PAGE_FROM, DishSamplingActivity.HOME) + startActivity { + putExtra(PrepareCookActivity.PAGE_FROM, PrepareCookActivity.HOME) } } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt index f61fab4..037f9c5 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/PrepareCookActivity.kt @@ -1,31 +1,35 @@ package com.shuwei.dish.match.ui import android.annotation.SuppressLint -import android.graphics.Typeface +import android.content.Intent import android.net.Uri import android.os.Bundle import android.util.Log +import android.view.View +import android.view.ViewGroup +import androidx.activity.addCallback +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import com.shuwei.dish.match.R import com.shuwei.dish.match.adapter.DishPartAdapter 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 -import android.view.ViewGroup -import androidx.activity.addCallback -import androidx.lifecycle.lifecycleScope -import com.shuwei.dish.match.databinding.LayoutCameraPreviewBinding import com.shuwei.dish.match.objbox.FoodModule import com.shuwei.dish.match.utils.AddressUtil import com.shuwei.dish.match.utils.CameraUtils import com.shuwei.dish.match.utils.ImageUtil +import com.shuwei.dish.match.utils.KeyboardUtil +import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.SwipeCallback 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 @@ -46,6 +50,9 @@ class PrepareCookActivity : BaseActivity() { companion object { const val TAG = "CookActivity" const val FOOD_ITEM = "foodItem" + const val FOOD_NAME = "foodName" + const val PAGE_FROM = "pageFrom" + const val HOME = "home" const val WEIGHT_CHANGE_VALUE = 5 const val WEIGHT_RECOGNIZE_VALUE = 10 } @@ -56,6 +63,12 @@ class PrepareCookActivity : BaseActivity() { private var food: FoodRecord? = null + /** 采集模式下通过搜索页回填的 foodId */ + private var foodId: String? = null + + /** 来源页面标识,HOME 时返回跳转 SamplingListActivity */ + private var pageFrom: String? = null + private var goodsList: MutableList? = null @Suppress("DEPRECATION") @@ -64,100 +77,104 @@ class PrepareCookActivity : BaseActivity() { binding = ActivityPrepareCookBinding.inflate(layoutInflater) setContentView(binding.root) setHeaderBackground() + pageFrom = intent.getStringExtra(PAGE_FROM) + food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? + + val isSamplingMode = SpTool.cookMode == 1 + val titleText = if (isSamplingMode) "菜品采集" else "菜品制作" setTitleBar(titleBarAction = { it.visible() }, titleAction = { - it.text = "菜品制作" + it.text = titleText }, rightIconActon = { it.gone() - it.setImageResource(R.drawable.ic_setting) - it.setOnClickListener { - //startActivity() - } }, backAction = { it.setOnClickListener { onBackPressedDispatcher.onBackPressed() } }) - food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? - binding.tvDishName.text = food?.foodName ?: "" + + // 根据 cookMode 设置搜索栏可编辑性 + if (isSamplingMode) { + // 采集模式:可编辑,支持搜索 + val foodName = intent.getStringExtra(FOOD_NAME) + binding.etInputDish.setText(foodName ?: food?.foodName ?: "") + binding.ivDishSearch.visible() + } else { + // 制作模式:不可编辑,仅展示菜名 + binding.etInputDish.setText(food?.foodName ?: "") + binding.etInputDish.isFocusable = false + binding.etInputDish.isFocusableInTouchMode = false + binding.ivDishSearch.gone() + } + addViewClickListener() addBackKeyListener() - initCamera(binding.flCameraContainer) initRecyclerView() - getDishDetail() + if (!isSamplingMode) { + getDishDetail() + } } private fun addViewClickListener() { WeightUtil.addWeightListener( weightKey = TAG, getWeight = { address, state, weight -> - //Log.d(TAG, "addViewClickListener: address=$address,state=$state,weight=$weight") - if (address == AddressUtil.ONE) { - binding.tvDishPartWeight.text = "${weight}" - if (state == WeightUtil.STATE_STABLE) { + if (address == AddressUtil.ONE && state == WeightUtil.STATE_STABLE) { + runOnUiThread { recognizeFood(weight) } } }) - binding.ivWeightClear.setOnClickListener { - WeightUtil.tareTwo(AddressUtil.ONE) + + if (SpTool.cookMode == 1) { + // 采集模式:绑定搜索栏交互 + binding.ivDishSearch.setOnClickListener { v -> jumpSearch(v) } + binding.etInputDish.addOnActionSearchListener { jumpSearch(binding.etInputDish) } } - binding.ivWeightAdd.setOnClickListener { addWeight() } - binding.tvAddFood.clickWithDebounce { addFood() } + binding.btnCook.clickWithDebounce { - val count = list.count { it.isSetFinished.not() } - if (count > 0) { - showRemindDialog() - return@clickWithDebounce + if (SpTool.cookMode == 1) { + // 采集模式:从输入框创建 FoodRecord + val showFoodName = binding.etInputDish.text.toString().trim() + if (showFoodName.isBlank()) { + toast("菜品名称为空") + return@clickWithDebounce + } + if (list.isEmpty()) { + toast("菜品构成信息未设置") + return@clickWithDebounce + } + val foodRecord = FoodRecord() + binding.etInputDish.let { + if (it.tag != null && it.tag.toString() == it.text.toString()) { + foodRecord.foodId = foodId + } + } + foodRecord.foodName = showFoodName + foodRecord.cookMode = 1 + Log.d(TAG, "goToSubmit: goodsList:${list.toJsonString()}") + startActivity { + putExtra(SubmitFoodActivity.GOODS_LIST, list as Serializable) + putExtra(SubmitFoodActivity.FOOD_ITEM, foodRecord as Serializable) + } + } else { + // 制作模式:检查食材是否全部设置完成 + val count = list.count { it.isSetFinished.not() } + if (count > 0) { + showRemindDialog() + return@clickWithDebounce + } + openSubmitPage() } - openSubmitPage() - } - binding.rgCook.setOnCheckedChangeListener { group, checkedId -> - if (clickIndex < 0 || clickIndex >= list.size) return@setOnCheckedChangeListener - val tempType = - if (checkedId == R.id.rbDishTypeFirst) 1 else if (checkedId == R.id.rbDishTypeSecond) 2 else -1 - list[clickIndex].materialType = tempType - dishPartAdapter.notifyItemChanged(clickIndex) - - binding.tvDishType.text = - if (tempType == 1) "主材" else if (tempType == 2) "辅材" else "" - } - } - - /** - * 添加重量信息到食材数据 - */ - private fun addWeight() { - if (clickIndex == -1) { - toast("请选择菜品构成") - return - } - val clickItem = list[clickIndex] - clickItem.run { - if (isNewDishType && materialType != 1 && materialType != 2) { - toast("请选择主辅材类型") - return - } - } - val weight = binding.tvDishPartWeight.text.toString().toDouble() - if (weight <= 0.toDouble()) { - toast("食材用量需要大于0") - return - } - Log.d(TAG, "addViewClickListener->useRealWeight=$weight") - clickItem.run { - useWeight = weight - isOriginalData = false - isSetFinished = true - dishPartAdapter.notifyItemChanged(clickIndex) } } private val isTakingPhoto = AtomicBoolean(false) private var isRecognizeOpen = false + // 页面可见时允许识别,onPause 后禁止,onResume 后恢复 private var isRecognizeEnabled = true private var lastPhotoUri: Uri? = null @@ -185,33 +202,24 @@ class PrepareCookActivity : BaseActivity() { /** * 菜品选择回调 + * - list 中不含该 goodsId:直接新增,isNewDishType = true + * - list 中已含该 goodsId:累加 useWeight */ - private val foodSelectCallback: (CookFoodGoodsEntity) -> Unit = foodSelectCallback@{ item -> - val filterResult = list.firstOrNull { it.goodsId == item.goodsId } - if (filterResult != null) { - toast("不允许重复添加同一食材") - return@foodSelectCallback + private val foodSelectCallback: (CookFoodGoodsEntity) -> Unit = { item -> + val existing = list.firstOrNull { it.goodsId == item.goodsId } + if (existing != null) { + existing.useWeight = (existing.useWeight ?: 0.0) + (item.useWeight ?: 0.0) + existing.isSetFinished = true + dishPartAdapter.notifyItemChanged(list.indexOf(existing)) + } else { + list.add(item.also { + it.isNewDishType = true + it.isSetFinished = true + }) + val position = list.size - 1 + dishPartAdapter.notifyItemInserted(position) + binding.rvDishPartList.smoothScrollToPosition(position) } - list.add(CookFoodGoodsEntity().apply { - goodsId = item.goodsId - goodsName = item.goodsName -// materialType = - isNewDishType = true - isOriginalData = false - useWeight = lastWeight - isSetFinished = true - }) - val positon = list.size - 1 - dishPartAdapter.notifyItemInserted(positon) - onFoodItemClick(positon) - binding.rvDishPartList.smoothScrollToPosition(positon) - } - - /** - * 添加食材 - */ - private fun addFood() { - FoodSearchDialog(activity = this, onItemSelected = foodSelectCallback).show() } private fun openSubmitPage() { @@ -307,9 +315,12 @@ class PrepareCookActivity : BaseActivity() { private var firstReqSize = 0 private val list = mutableListOf() private val dishPartAdapter by lazy { - DishPartAdapter(list).apply { + DishPartAdapter(list = list).apply { setOnItemClickListener { _, _, positon -> - onFoodItemClick(positon) + list.forEachIndexed { index, entity -> + entity.isItemClicked = index == positon + } + notifyDataSetChanged() } addOnItemChildClickListener(R.id.ivClearIcon) { _, _, positon -> Log.d(TAG, "onFoodItemClick: ${list[positon].toJsonString()}") @@ -327,52 +338,6 @@ class PrepareCookActivity : BaseActivity() { } } - /** - * 菜品列表item点击 - */ - private fun onFoodItemClick(positon: Int) { - this@PrepareCookActivity.clickIndex = positon - list[clickIndex].let { it -> - binding.tvDishShowName.run { - text = it.goodsName - setTypeface(typeface, Typeface.BOLD) - } - - var materialType: String - when (it.materialType) { - 1 -> { - materialType = "主材" - binding.rgCook.check(R.id.rbDishTypeFirst) - } - - 2 -> { - materialType = "辅材" - binding.rgCook.check(R.id.rbDishTypeSecond) - } - - else -> { - materialType = "" - binding.rgCook.clearCheck() - } - } - binding.tvDishType.text = materialType - - list.forEach { bean -> bean.isItemClicked = false } - it.isItemClicked = true - dishPartAdapter.notifyDataSetChanged() - - if (it.isNewDishType) { - binding.dividerDishType.visible() - binding.llDishType.visible() - } else { - binding.dividerDishType.gone() - binding.llDishType.gone() - } - } - } - - private var clickIndex = -1 - /** * RecyclerView初始化 */ @@ -387,14 +352,10 @@ class PrepareCookActivity : BaseActivity() { dishPartAdapter.notifyItemChanged(position) return@SwipeCallback } -// dishPartAdapter.removeAt(position) list.removeAt(position) dishPartAdapter.notifyItemRemoved(position) dishPartAdapter.notifyItemRangeChanged(position, list.size - position) toast("已删除") - if (list.isEmpty()) { - binding.tvDishShowName.text = "" - } }) itemTouchHelper.attachToRecyclerView(this) } @@ -428,10 +389,22 @@ class PrepareCookActivity : BaseActivity() { */ private fun addBackKeyListener() { onBackPressedDispatcher.addCallback(this) { - val count = list.count { !it.isOriginalData } - if (count > 0) { - saveDataRemindDialog() - return@addCallback + if (SpTool.cookMode == 1) { + // 采集模式:有新增食材时提示保存 + if (list.isEmpty().not()) { + saveDataRemindDialog() + return@addCallback + } + if (pageFrom == HOME) { + startActivity() + } + } else { + // 制作模式:有未保存数据时提示 + val count = list.count { !it.isOriginalData } + if (count > 0) { + saveDataRemindDialog() + return@addCallback + } } finish() } @@ -443,9 +416,14 @@ class PrepareCookActivity : BaseActivity() { private fun saveDataRemindDialog() { CommonDialog(this) .setTitle("温馨提示") - .setContent("您好,当前页面存在尚未保存的数据,确认返回吗?") + .setContent("您好,当前页面存在未保存的数据,确认返回吗?") .setNegativeButton("取消") - .setPositiveButton("确认") { finish() } + .setPositiveButton("确认") { + if (SpTool.cookMode == 1 && pageFrom == HOME) { + startActivity() + } + finish() + } .setOnDismissCallback { hideStatusBar() } .show() } @@ -496,12 +474,16 @@ class PrepareCookActivity : BaseActivity() { val foodList = mutableListOf() list.forEachIndexed { index, food -> val foodName = food.name.split("WP").first() - val foodScore = ((1-food.score) * 100).roundedDecimalPlace(2) - foodList.add(CookFoodGoodsEntity( - goodsId = index.toString(), - goodsName = "${foodName}-${foodScore}%", - foodId = index.toString() - )) + foodList.add( + CookFoodGoodsEntity( + goodsId = "${food.id}", + goodsName = foodName, + foodId = index.toString() + ).also { + it.foodScore = ((1 - food.score) * 10000).toInt() + it.isOriginalData = false + } + ) } FoodRecognizeActivity.start( activity = this, @@ -511,7 +493,26 @@ class PrepareCookActivity : BaseActivity() { ) isRecognizeOpen = true isTakingPhoto.set(false) - lastWeight = currentWeight + } + + /** + * 跳转食物搜索页(采集模式专用) + * @param v 触发搜索的 View,用于收起键盘 + */ + private fun jumpSearch(v: View) { + val intent = Intent(this, FoodSearchActivity::class.java).apply { + putExtra(FoodSearchActivity.FOOD_NAME, binding.etInputDish.text.toString().trim()) + } + startActivity(intent) { + foodId = it?.getStringExtra(FoodSearchActivity.FOOD_ID) + val name = it?.getStringExtra(FoodSearchActivity.FOOD_NAME) + binding.etInputDish.run { + setText(name) + tag = name + setSelection(text.length) + } + } + KeyboardUtil.hideKeyboard(v.context, v) } } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt index eae03b0..4eab86a 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SamplingListActivity.kt @@ -120,8 +120,8 @@ class SamplingListActivity : BaseActivity() { } return } - startActivity { - putExtra(DishSamplingActivity.FOOD_NAME, item.foodName) + startActivity { + putExtra(PrepareCookActivity.FOOD_NAME, item.foodName) } } @@ -154,7 +154,7 @@ class SamplingListActivity : BaseActivity() { private fun addViewListener() { binding.btnAddSampling.setOnClickListener { judgeDeviceConfig { - startActivity() + startActivity() } } binding.refreshLayout.setOnRefreshListener { diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dish_clear.png b/app/src/main/res/drawable-xxxhdpi/ic_dish_clear.png index 2949eb7..abd1bf8 100644 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_dish_clear.png and b/app/src/main/res/drawable-xxxhdpi/ic_dish_clear.png differ diff --git a/app/src/main/res/layout/activity_food_recognize.xml b/app/src/main/res/layout/activity_food_recognize.xml index 6e3a14b..8f5b455 100644 --- a/app/src/main/res/layout/activity_food_recognize.xml +++ b/app/src/main/res/layout/activity_food_recognize.xml @@ -58,11 +58,12 @@ android:textSize="32sp" /> - - - - + android:gravity="center_vertical" + android:orientation="horizontal"> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -237,17 +75,6 @@ android:textColor="@color/black666" android:textSize="28sp" /> - - @@ -18,4 +18,18 @@ android:ellipsize="end" android:background="@drawable/shape_white_12_corners"/> - \ No newline at end of file + + + + \ No newline at end of file