添加了副屏显示逻辑控制

This commit is contained in:
zxj
2025-08-01 15:57:12 +08:00
parent de4c5f1c75
commit c78279a66e
27 changed files with 817 additions and 191 deletions
@@ -5,11 +5,11 @@ import android.app.Presentation
import android.content.Context
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Outline
import android.graphics.Point
import android.hardware.Camera
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CameraManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.DisplayMetrics
@@ -17,16 +17,22 @@ import android.util.Log
import android.view.Display
import android.view.View
import android.view.ViewGroup
import android.view.ViewOutlineProvider
import android.view.ViewTreeObserver
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import com.arcsoft.face.ErrorInfo
import com.sw.dualscreen.R
import com.sw.dualscreen.activity.MainActivity
import com.sw.dualscreen.databinding.ItemUserNutritionBinding
import com.sw.dualscreen.databinding.PresentationSecondaryScreenBinding
import com.sw.dualscreen.ext.dp
import com.sw.dualscreen.ext.maskName
import com.sw.dualscreen.model.response.FoodInfo
import com.sw.dualscreen.utils.GlideUtils
import com.sw.dualscreen.viewmodel.UserViewModel
import com.sw.plate.utils.ToastUtils
import com.sw.plate.utils.arcface.ConfigUtil
@@ -41,6 +47,7 @@ import com.sw.plate.utils.arcface.face.constants.LivenessType
import com.sw.plate.utils.arcface.face.model.FacePreviewInfo
import com.sw.plate.utils.arcface.face.model.RecognizeConfiguration
import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel
import kotlinx.coroutines.launch
import timber.log.Timber
/**
@@ -50,7 +57,7 @@ class SecondaryScreenPresentation(
val activity: MainActivity,
context: Context,
display: Display,
viewModel: UserViewModel,
val viewModel: UserViewModel,
private val onDismissListener: () -> Unit = {},
val recognizeViewModel: RecognizeViewModel
) : Presentation(context, display), ViewTreeObserver.OnGlobalLayoutListener {
@@ -60,7 +67,14 @@ class SecondaryScreenPresentation(
// private var cameraCaptureSession: CameraCaptureSession? = null
private lateinit var cameraManager: CameraManager
private var cameraIdList: Array<String> = arrayOf()
lateinit var previewView: PreviewView
// 当前食物信息
private var currentFood: FoodInfo? = null
private lateinit var itemUserNutritionBinding: ItemUserNutritionBinding
private lateinit var stepChangeCallback: (Int) -> Unit
// 当前步骤
var currentStep: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -68,9 +82,48 @@ class SecondaryScreenPresentation(
binding = PresentationSecondaryScreenBinding.inflate(layoutInflater)
setContentView(binding.root)
window?.setBackgroundDrawableResource(android.R.color.transparent)
initView()
// binding.includeUserHeat.ivHeat.showText("1070千卡")
registerDataChange()
}
previewView = binding.previewView
private fun registerDataChange() {
activity.lifecycleScope.launch {
viewModel.nutritionData.collect {
Timber.d("registerDataChange nutritionData = $it")
if (it == null) return@collect
itemUserNutritionBinding.tvUserName.text = it.userName.maskName()
itemUserNutritionBinding.tvRecommendHeat.text =
"推荐热量:${it.recommendMin}-${it.recommendMax}"
}
}
}
private fun initView() {
binding.ivImg.outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
outline.setRoundRect(0, 0, view.width, view.height, 12f.dp)
}
}
binding.ivImg.clipToOutline = true
itemUserNutritionBinding = binding.includeUserNutrition
}
override fun onDisplayRemoved() {
super.onDisplayRemoved()
onDismissListener()
}
fun updateImage(bitmap: Bitmap) {
activity.runOnUiThread {
binding.ivImg.setImageBitmap(bitmap)
}
}
/**
* 启用虹软人脸失败
*/
private fun setupArcCamera() {
cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
// 获取摄像头列表
cameraIdList = cameraManager.cameraIdList
@@ -87,42 +140,95 @@ class SecondaryScreenPresentation(
initArcView()
openRectInfoDraw = true
openCamera(cameraIdList.last())
// binding.includeUserHeat.ivHeat.showText("1070千卡")
}
override fun onDisplayRemoved() {
super.onDisplayRemoved()
onDismissListener()
}
fun updateImage(bitmap: Bitmap) {
activity.runOnUiThread {
binding.ivImg.setImageBitmap(bitmap)
}
}
/**
* 用户1 显示相机预览
*/
fun step1(foodImg: Uri) {
fun step1() {
Timber.d("step1")
currentStep = 1
stepChangeCallback(currentStep)
binding.tvFoodInfo.text = "菜品识别中"
binding.flPreview.visibility = View.VISIBLE
// binding.previewView.visibility = View.VISIBLE
binding.ivImg.visibility = View.VISIBLE
binding.flFace.visibility = View.GONE
pauseCamera()
binding.tvBottomTip.visibility = View.VISIBLE
itemUserNutritionBinding.clNutritionData.visibility = View.GONE
}
/**
* 显示人脸识别
*/
fun step2() {
fun step2(foodInfo: FoodInfo) {
Timber.d("step2")
currentStep = 2
stepChangeCallback(currentStep)
currentFood = foodInfo
resumeCamera()
binding.tvFoodInfo.text = foodInfo.foodName
binding.flPreview.visibility = View.GONE
binding.flFace.visibility = View.VISIBLE
binding.ivFaceBg.visibility = View.VISIBLE
binding.tvFaceTip.visibility = View.VISIBLE
setupArcCamera()
}
fun updateFood(foodInfo: FoodInfo?) {
Timber.d("step2 updateFood")
currentFood = foodInfo
if (foodInfo != null) {
if (currentStep != 2) {
step2(foodInfo)
} else {
binding.tvFoodInfo.text = foodInfo.foodName
}
}
}
/**
* 显示识别出的菜品信息
*/
fun step3() {
Timber.d("step3")
currentStep = 3
stepChangeCallback(currentStep)
if (currentFood == null) {
ToastUtils.showToast("选中物品为空3")
return
}
binding.tvFoodInfo.text = currentFood!!.foodName
binding.flPreview.visibility = View.VISIBLE
// binding.previewView.visibility = View.GONE
binding.ivImg.visibility = View.VISIBLE
GlideUtils.loadRoundCornerImage(
context,
url = currentFood!!.imgUrl,
imageView = binding.ivImg,
radius = 12
)
binding.flFace.visibility = View.GONE
binding.ivFaceBg.visibility = View.GONE
binding.tvFaceTip.visibility = View.GONE
binding.tvBottomTip.visibility = View.GONE
itemUserNutritionBinding.clNutritionData.visibility = View.VISIBLE
viewModel.getUserNutritionData(
userId = "187c96f7bf294c08bc1d1e57b90a7210",
foodId = currentFood!!.id!!
)
}
private fun openCamera(cameraId: String) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) !=
PackageManager.PERMISSION_GRANTED
@@ -158,6 +264,10 @@ class SecondaryScreenPresentation(
}
}
fun setStepChangeCallback(callback: (Int) -> Unit) {
stepChangeCallback = callback
}
// 虹软人脸配置 ⬇
private var isRecognition = false
private var rgbCameraHelper: DualCameraHelper? = null
@@ -206,6 +316,9 @@ class SecondaryScreenPresentation(
})
recognizeViewModel.recognizeNotice.observe(activity, Observer { notice: String? ->
Timber.i("recognizeNotice observe notice = $notice")
if (currentStep == 3 && notice == "leave") {
step1()
}
})
recognizeViewModel.recognizeUserId.observe(activity, Observer { userId: String? ->