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 5210bc3..c213b5a 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 @@ -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? = 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 = 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() .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() 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 037f9c5..857e0c7 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 @@ -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) }