Files
StallDualScreen/app/src/main/java/com/sw/dualscreen/presentation/SecondaryScreenPresentation.kt
T
2025-11-28 18:46:41 +08:00

886 lines
35 KiB
Kotlin

//package com.sw.dualscreen.presentation
//
//import android.Manifest
//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.os.Build
//import android.os.Bundle
//import android.util.DisplayMetrics
//import android.view.Display
//import android.view.View
//import android.view.ViewGroup
//import android.view.ViewOutlineProvider
//import android.view.ViewTreeObserver
//import androidx.annotation.RequiresApi
//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.format2String
//import com.sw.dualscreen.ext.maskName
//import com.sw.dualscreen.model.request.UserNutritionParam
//import com.sw.dualscreen.model.response.DinnerTypeInfo
//import com.sw.dualscreen.model.response.FoodInfo
//import com.sw.dualscreen.model.response.UserNutritionData
//import com.sw.dualscreen.utils.Debouncer
//import com.sw.dualscreen.utils.GlideUtils
//import com.sw.dualscreen.viewmodel.UserViewModel
//import com.sw.plate.utils.LightManager
//import com.sw.plate.utils.ToastUtils
//import com.sw.plate.utils.arcface.ConfigUtil
//import com.sw.plate.utils.arcface.ErrorCodeUtil
//import com.sw.plate.utils.arcface.FaceRectTransformer
//import com.sw.plate.utils.arcface.FaceRectView
//import com.sw.plate.utils.arcface.FaceRectView.DrawInfo
//import com.sw.plate.utils.arcface.PreviewConfig
//import com.sw.plate.utils.arcface.camera.CameraListener
//import com.sw.plate.utils.arcface.camera.DualCameraHelper
//import com.sw.plate.utils.arcface.face.constants.LivenessType
//import com.sw.plate.utils.arcface.face.model.CompareResult
//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.flow.drop
//import kotlinx.coroutines.launch
//import timber.log.Timber
//
///**
// * 用户屏幕
// */
//class SecondaryScreenPresentation(
// val activity: MainActivity,
// context: Context,
// display: Display,
// val viewModel: UserViewModel,
// private val onDismissListener: () -> Unit = {},
// val recognizeViewModel: RecognizeViewModel
//) : Presentation(context, display), ViewTreeObserver.OnGlobalLayoutListener {
// private lateinit var binding: PresentationSecondaryScreenBinding
//
// // 当前食物信息
// private var currentFood: FoodInfo? = null
// private var userNutritionData: UserNutritionData? = null
// private var dinnerTypeInfo: DinnerTypeInfo? = null
// private lateinit var itemUserNutritionBinding: ItemUserNutritionBinding
// private lateinit var stepChangeCallback: (Int) -> Unit
//
//
// private var detectWeight = 0.0 //识别菜品时的重量
// private var lastWeight = 0.0 // 上一次的计算热量结果
// private val debouncer = Debouncer(500)
// private var recognitionTime: Long = 0L // 人脸识别时的时间
// private var recognitionWeight: Double = 0.0 // 人脸识别时的重量
// private var lastFaceTrackId: Int = -1 // 上一次的人脸信息
// var mealPickupMode: Int = 0 // 取餐模式 0 即放即取 1 余量取餐
//
// // 当前步骤
// var currentStep: Int = 0
//
// private var isGoStep1 = false;//防止持续调用
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
//
// binding = PresentationSecondaryScreenBinding.inflate(layoutInflater)
// setContentView(binding.root)
// window?.setBackgroundDrawableResource(android.R.color.transparent)
// initView()
// setupArcCamera()
// registerDataChange()
// }
//
// private fun registerDataChange() {
// activity.lifecycleScope.launch {
// viewModel.loadFaceResult.collect { needUpdate ->
// if (needUpdate) {
// recognizeViewModel.refreshFaceList()
// }
// }
// }
// activity.lifecycleScope.launch {
// viewModel.nutritionData.collect {
// Timber.d("registerDataChange nutritionData = $it")
// userNutritionData = it
// if (it == null) return@collect
// step3()
// itemUserNutritionBinding.tvUserName.text = it.userName.maskName()
// itemUserNutritionBinding.tvRecommendHeat.text =
// "推荐热量:${it.recommendMin}-${it.recommendMax}"
//
// updateWeight(lastWeight / 1000)
// }
// }
// activity.lifecycleScope.launch {
// viewModel.dinnerTypeInfo.drop(1).collect {
// Timber.d("registerDataChange dinnerTypeInfo = $it")
// dinnerTypeInfo = it
// }
// }
// }
//
// 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() {
// initArcViewModel()
// initArcView()
// openRectInfoDraw = true
// }
//
// /**
// * 用户1 显示相机预览
// */
// fun step1() {
// Timber.d("step1")
// currentStep = 1
// LightManager.closeGreenLight()
// LightManager.closeRedLight()
// //回复上一次的设置
//// lastWeight = 0.0
// dinnerTypeInfo = null
// currentFood = null
// userNutritionData = null
// recognitionWeight = 0.0
//
// stepChangeCallback(currentStep)
// binding.tvFoodName.text = "菜品识别中"
// binding.ivFaceBg.visibility = View.GONE
// binding.flPreview.visibility = View.VISIBLE
// binding.ivImg.visibility = View.VISIBLE
// binding.flFace.visibility = View.INVISIBLE
// binding.tvFaceTip.visibility = View.GONE
// pauseCamera()
// binding.tvBottomTip.visibility = View.VISIBLE
// itemUserNutritionBinding.clNutritionData.visibility = View.GONE
//
// activity.clearFoodList()
// }
//
// /**
// * 显示人脸识别
// */
// fun step2(foodInfo: FoodInfo) {
// isGoStep1 = true
// Timber.d("step2")
// currentStep = 2
// LightManager.closeRedLight()
//// LightManager.openGreenLight()
// dinnerTypeInfo = null
// userNutritionData = null
// recognitionWeight = 0.0
//
// stepChangeCallback(currentStep)
// currentFood = foodInfo
// viewModel.getDinnerType()
// resumeCamera()
// binding.tvFoodName.text = foodInfo.foodName
// binding.ivImg.visibility = View.GONE
//
// binding.flPreview.visibility = View.GONE
//
//// binding.flFace.visibility = View.VISIBLE
// binding.flFace.post {
// binding.flFace.visibility = View.VISIBLE
// }
// binding.ivFaceBg.visibility = View.VISIBLE
// binding.tvFaceTip.visibility = View.VISIBLE
// binding.tvBottomTip.visibility = View.VISIBLE
// itemUserNutritionBinding.clNutritionData.visibility = View.GONE
// }
//
// fun updateFood(foodInfo: FoodInfo?) {
// Timber.d("updateFood")
// currentFood = foodInfo
// if (foodInfo != null) {
// if (currentStep == 1) {
// step2(foodInfo)
// } else {
// updateFoodInfo(foodInfo)
// }
// }
// }
//
// /**
// * 显示识别出的菜品信息
// */
// fun step3() {
// Timber.d("step3")
// LightManager.closeRedLight()
// LightManager.openGreenLight()
// currentStep = 3
// stepChangeCallback(currentStep)
// if (currentFood == null) {
// ToastUtils.showToast("选中物品为空3")
// return
// }
// updateFoodInfo(currentFood!!)
// binding.flPreview.visibility = View.VISIBLE
// binding.ivImg.visibility = View.VISIBLE
// binding.flFace.visibility = View.INVISIBLE
// binding.ivFaceBg.visibility = View.GONE
// binding.tvFaceTip.visibility = View.GONE
//
// binding.tvBottomTip.visibility = View.GONE
// itemUserNutritionBinding.clNutritionData.visibility = View.VISIBLE
// }
//
// private fun updateFoodInfo(foodInfo: FoodInfo) {
// binding.tvFoodName.text = foodInfo.foodName
// if (foodInfo.photoUri != null) {
// GlideUtils.loadRoundCornerImage(
// context,
// url = foodInfo.photoUri,
// imageView = binding.ivImg,
// radius = 12
// )
// } else {
// GlideUtils.loadRoundCornerImage(
// context,
// url = foodInfo.imgUrl,
// imageView = binding.ivImg,
// radius = 12
// )
// }
// }
//
// fun updateWeight(weight: Double) {
// lastWeight = weight * 1000 // 将千克转成克
// Timber.d("updateWeight lastWeight = $weight")
// if (currentStep == 2 &&
// lastWeight <= 5 &&
// isGoStep1
// ) {//人脸识别过程中,秤上物品拿走
// isGoStep1 = false
// activity.runOnUiThread {
// Timber.e("切回step1")
// step1()
// }
// }
//
//
// if (currentFood == null) {
// Timber.e("updateWeight currentFood is null")
// return
// }
//
//
// if (userNutritionData == null) {
// Timber.e("updateWeight userNutritionData is null")
// return
// }
// if (dinnerTypeInfo == null) {
// Timber.e("updateWeight dinnerType is null")
// return
// }
// calculateNutrition(recognitionWeight - lastWeight)
// }
//
// fun updateDetectWeight(weight: Double) {
// detectWeight = weight * 1000 // 将千克转成克
// }
//
// /**
// * 余量取餐
// */
// fun updateMealPickupMode(mode: Int) {
// Timber.d("updateMealPickupMode mode = $mode")
// mealPickupMode = mode
// step1()
// }
//
// private fun calculateNutrition(weight1: Double) {
// var weight = weight1
// if (weight < 0) weight = 0.0
// debouncer.debounce {
// Timber.d("calculateNutrition weight = $weight, recognitionWeight = $recognitionWeight")
// val dinnerType = dinnerTypeInfo!!.dinnerType!!.dinnerType!!
// Timber.d("calculateNutrition foodName = ${currentFood!!.foodName}, dinnerType = $dinnerType, userId = ${userNutritionData!!.userId}")
// val calcResultInfo = UserNutritionUtils.calculateNutrition(
// currentFood!!,
// userNutritionData!!,
// weight,
// dinnerType = dinnerType
// )
// Timber.d("calculateNutrition calcResultInfo = $calcResultInfo")
// val columnMax = UserNutritionUtils.getMaxInt(calcResultInfo)
//
// activity.runOnUiThread {
// val totalKcal = calcResultInfo.totalKcal
// val grain = calcResultInfo.grain
// val fruits = calcResultInfo.fruits
// val meat = calcResultInfo.meat
// // 设置热量
// itemUserNutritionBinding.customKcalColumn.setImageDrawable(
// true,
// totalKcal.max < totalKcal.current
// )
// var maxKcal = totalKcal.max
// Timber.d("maxKcal = $maxKcal")
// // 避免0作为被除数
// if (maxKcal <= 0.0) {
// maxKcal = 1.0
// }
// Timber.d("maxKcal 1 = $maxKcal")
// itemUserNutritionBinding.totalKcalTv.text = totalKcal.current.format2String()
// var totalKcalHeight = (totalKcal.current / maxKcal).toFloat()
// if (totalKcalHeight == 0F) {
// itemUserNutritionBinding.divKcalView.visibility = View.VISIBLE
// } else {
// itemUserNutritionBinding.divKcalView.visibility = View.GONE
// totalKcalHeight += 0.1F
// }
// itemUserNutritionBinding.customKcalColumn.setCustomHeightPercent(
// totalKcalHeight,
// true
// )
//
// // 设置主食
// itemUserNutritionBinding.customFoodColumn.setImageDrawable(
// false,
// grain.max < grain.current
// )
// itemUserNutritionBinding.totalFoodTv.text = grain.current.format2String()
// var grainHeight = (grain.current / columnMax).toFloat()
// if (grainHeight == 0F) {
// itemUserNutritionBinding.divTotalFoodView.visibility = View.VISIBLE
// } else {
// itemUserNutritionBinding.divTotalFoodView.visibility = View.GONE
// grainHeight += 0.1F
// }
// itemUserNutritionBinding.customFoodColumn.setCustomHeightPercent(
// grainHeight,
// true
// )
//
// // 设置果蔬
// itemUserNutritionBinding.customVegetableColumn.setImageDrawable(
// false,
// fruits.max < fruits.current
// )
// itemUserNutritionBinding.totalVegetableTv.text = fruits.current.format2String()
// var fruitsHeight = (fruits.current / columnMax).toFloat()
//
// if (fruitsHeight == 0F) {
// itemUserNutritionBinding.divVegetableView.visibility = View.VISIBLE
// } else {
// itemUserNutritionBinding.divVegetableView.visibility = View.GONE
// fruitsHeight += 0.1F
// }
// itemUserNutritionBinding.customVegetableColumn.setCustomHeightPercent(
// fruitsHeight,
// true
// )
//
// // 设置肉蛋
// itemUserNutritionBinding.customMeatColumn.setImageDrawable(
// false,
// meat.max < meat.current
// )
// itemUserNutritionBinding.totalMeatTv.text = meat.current.format2String()
// var meatHeight = (meat.current / columnMax).toFloat()
// if (meatHeight == 0F) {
// itemUserNutritionBinding.divMeatView.visibility = View.VISIBLE
// } else {
// itemUserNutritionBinding.divMeatView.visibility = View.GONE
// meatHeight += 0.1F
// }
// itemUserNutritionBinding.customMeatColumn.setCustomHeightPercent(
// meatHeight,
// true
// )
// }
// }
// }
//
// private fun openCamera() {
// Timber.d("openCamera")
// if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) !=
// PackageManager.PERMISSION_GRANTED
// ) {
// ToastUtils.showToast("无摄像头权限")
// return
// }
// try {
// val cameraCount = Camera.getNumberOfCameras()
// if (cameraCount < 3) {
// ToastUtils.showToast("摄像头数量异常")
// return
// }
// recognizeViewModel.init(
// PreviewConfig(
// 2, 1, 90, 90
// )
// )
// initRgbCamera()
// if (DualCameraHelper.hasDualCamera() && livenessType === LivenessType.IR) {
// initIrCamera()
// }
// } catch (e: Exception) {
// Timber.e(e, "打开摄像头失败")
// }
// }
//
// fun setStepChangeCallback(callback: (Int) -> Unit) {
// stepChangeCallback = callback
// }
//
// // 虹软人脸配置 ⬇
// private var isRecognition = false
// private var rgbCameraHelper: DualCameraHelper? = null
// private var rgbFaceRectTransformer: FaceRectTransformer? = null
// private val livenessType = LivenessType.IR
// private var openRectInfoDraw = false
//
// private var irCameraHelper: DualCameraHelper? = null
// private var irFaceRectTransformer: FaceRectTransformer? = null
//
// private fun initArcViewModel() {
//
// recognizeViewModel.setLiveType(livenessType)
//
// recognizeViewModel.ftInitCode.observe(activity, Observer { ftInitCode: Int? ->
// if (ftInitCode != ErrorInfo.MOK) {
// val error: String? = context.getString(
// R.string.specific_engine_init_failed, "ftEngine",
// ftInitCode, ErrorCodeUtil.arcFaceErrorCodeToFieldName(ftInitCode!!)
// )
// Timber.e("ftInitCode observe = $error")
// ToastUtils.showToast(error)
// }
// })
// recognizeViewModel.frInitCode.observe(activity, Observer { frInitCode: Int? ->
// if (frInitCode != ErrorInfo.MOK) {
// val error: String? = context.getString(
// R.string.specific_engine_init_failed, "frEngine",
// frInitCode, ErrorCodeUtil.arcFaceErrorCodeToFieldName(frInitCode!!)
// )
// Timber.e("frInitCode observe = $error")
// ToastUtils.showToast(error)
// }
// })
// recognizeViewModel.flInitCode.observe(activity, Observer { flInitCode: Int? ->
// if (flInitCode != ErrorInfo.MOK) {
// val error: String? = context.getString(
// R.string.specific_engine_init_failed, "flEngine",
// flInitCode, ErrorCodeUtil.arcFaceErrorCodeToFieldName(flInitCode!!)
// )
// Timber.e("flInitCode observe = $error")
// ToastUtils.showToast(error)
// }
// })
//
// recognizeViewModel.recognizeConfiguration
// .observe(activity, Observer { recognizeConfiguration: RecognizeConfiguration? ->
// Timber.i("recognizeConfiguration: observe = ${recognizeConfiguration.toString()}")
// })
// recognizeViewModel.recognizeNotice.observe(activity, Observer { notice: String? ->
// Timber.i("recognizeNotice observe notice = $notice")
// })
//
// recognizeViewModel.recognizeUserId.observe(
// activity,
// Observer { compareResult: CompareResult ->
// Timber.i("recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}")
// recognitionTime = System.currentTimeMillis()
// recognitionWeight = lastWeight
// lastFaceTrackId = compareResult.trackId
// val faceEntity = compareResult.faceEntity
// val userId = faceEntity.userName
// if (userId == null) return@Observer
// viewModel.getUserNutritionData(
// userId = userId,
// foodId = currentFood!!.foodId!!
// )
// })
//
// recognizeViewModel.drawRectInfoText.observe(activity, Observer { info ->
// Timber.i("drawRectInfoText observe info = $info")
// })
// }
//
// private fun initArcView() {
// //在布局结束后才做初始化操作
// binding.dualCameraTexturePreviewRgb.getViewTreeObserver().addOnGlobalLayoutListener(this)
// recognizeViewModel.getCompareResultList().getValue()
// }
//
// /**
// * 调整View的宽高,使预览显示正常且采集框固定为
// *
// * @param rgbPreview RGB预览View
// * @param previewView 显示预览数据的view
// * @param faceRectView 画框的view
// * @param previewSize 预览大小
// * @param displayOrientation 相机旋转角度
// * @param scale 缩放比例
// * @return 调整后的LayoutParams
// */
// private fun adjustPreviewViewSize(
// rgbPreview: View,
// previewView: View,
// faceRectView: FaceRectView,
// previewSize: Camera.Size,
// displayOrientation: Int,
// scale: Float
// ): ViewGroup.LayoutParams {
// val layoutParams = previewView.layoutParams
// val measuredWidth = previewView.measuredWidth
// val measuredHeight = previewView.measuredHeight
// var ratio = (previewSize.height.toFloat()) / previewSize.width.toFloat()
// if (ratio > 1) {
// ratio = 1 / ratio
// }
// if (displayOrientation % 180 == 0) {
// layoutParams.width = measuredWidth
// layoutParams.height = (measuredWidth * ratio).toInt()
// } else {
// layoutParams.height = measuredHeight
// layoutParams.width = (measuredHeight * ratio).toInt()
// }
// if (scale < 1f) {
// val rgbParam = rgbPreview.getLayoutParams()
// layoutParams.width = (rgbParam.width * scale).toInt()
// layoutParams.height = (rgbParam.height * scale).toInt()
// } else {
// layoutParams.width = (layoutParams.width * scale).toInt()
// layoutParams.height = (layoutParams.height * scale).toInt()
// }
//
// val metrics = DisplayMetrics()
// activity.windowManager.defaultDisplay.getMetrics(metrics)
//
// if (layoutParams.width >= metrics.widthPixels) {
// val viewRatio = layoutParams.width / (metrics.widthPixels.toFloat())
// layoutParams.width = (layoutParams.width / viewRatio).toInt()
// layoutParams.height = (layoutParams.height / viewRatio).toInt()
// }
// if (layoutParams.height >= metrics.heightPixels) {
// val viewRatio = layoutParams.height / (metrics.heightPixels.toFloat())
// layoutParams.width = (layoutParams.width / viewRatio).toInt()
// layoutParams.height = (layoutParams.height / viewRatio).toInt()
// }
//
// previewView.setLayoutParams(layoutParams)
// faceRectView.setLayoutParams(layoutParams)
// return layoutParams
// }
//
// private fun initRgbCamera() {
// val cameraListener: CameraListener = object : CameraListener {
// override fun onCameraOpened(
// camera: Camera,
// cameraId: Int,
// displayOrientation: Int,
// isMirror: Boolean
// ) {
// Timber.d("initRgbCamera Rgb onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation")
// activity.runOnUiThread({
// val previewSizeRgb = camera.getParameters().getPreviewSize()
// val layoutParams = adjustPreviewViewSize(
// binding.dualCameraTexturePreviewRgb,
// binding.dualCameraTexturePreviewRgb, binding.dualCameraFaceRectView,
// previewSizeRgb, displayOrientation, 0.6F
// )
// Timber.d("initRgbCamera previewSizeRgb = ${previewSizeRgb.width}-${previewSizeRgb.height}")
// Timber.d("initRgbCamera layoutParams = ${layoutParams.width}-${layoutParams.height}")
// Timber.d(
// "initRgbCamera isMirror = ${isMirror}, isDrawRgbRectHorizontalMirror = ${
// ConfigUtil.isDrawRgbRectHorizontalMirror(
// context
// )
// }, isDrawRgbRectVerticalMirror = ${
// ConfigUtil.isDrawRgbRectVerticalMirror(
// context
// )
// }"
// )
// // 调整识别窗口位置
// rgbFaceRectTransformer = FaceRectTransformer(
// previewSizeRgb.width,
// previewSizeRgb.height,
// layoutParams.width,
// layoutParams.height,
// 90,
// cameraId,
// isMirror,
// true,
// true
// )
//
// recognizeViewModel.onRgbCameraOpened(camera)
// recognizeViewModel.setRgbFaceRectTransformer(rgbFaceRectTransformer)
// })
// }
//
// @RequiresApi(api = Build.VERSION_CODES.Q)
// override fun onPreview(nv21: ByteArray?, camera: Camera?) {
// if (!isRecognition) {
// return
// }
// binding.dualCameraFaceRectView.clearFaceInfo()
// val facePreviewInfoList: MutableList<FacePreviewInfo?>? =
// recognizeViewModel.onPreviewFrame(nv21, true)
// if (facePreviewInfoList != null && rgbFaceRectTransformer != null) {
// drawPreviewInfo(facePreviewInfoList)
// }
// recognizeViewModel.clearLeftFace(facePreviewInfoList)
// }
//
// override fun onCameraClosed() {
// Timber.i("initRgbCamera onCameraClosed: ")
// }
//
// override fun onCameraError(e: java.lang.Exception) {
// Timber.i("initRgbCamera onCameraError: %s", e.message)
// e.printStackTrace()
// }
//
// override fun onCameraConfigurationChanged(cameraID: Int, displayOrientation: Int) {
// Timber.i("initRgbCamera onCameraConfigurationChanged: threadName = ${Thread.currentThread().name}")
// if (rgbFaceRectTransformer != null) {
// rgbFaceRectTransformer!!.cameraDisplayOrientation = displayOrientation
// }
// Timber.i("initRgbCamera onCameraConfigurationChanged: $cameraID $displayOrientation")
// }
// }
//
// val previewConfig: PreviewConfig = recognizeViewModel.previewConfig
// rgbCameraHelper = DualCameraHelper.Builder()
// .previewViewSize(
// Point(
// binding.dualCameraTexturePreviewRgb.measuredWidth,
// binding.dualCameraTexturePreviewRgb.measuredHeight
// )
// )
// .rotation(activity.windowManager.defaultDisplay.rotation)
// .additionalRotation(previewConfig.rgbAdditionalDisplayOrientation) // 角度
// .previewSize(recognizeViewModel.loadPreviewSize())
// .specificCameraId(previewConfig.rgbCameraId)
// .isMirror(true)
// .previewOn(binding.dualCameraTexturePreviewRgb)
// .cameraListener(cameraListener)
// .build()
// rgbCameraHelper!!.init()
// rgbCameraHelper!!.start()
// }
//
// /**
// * 初始化红外相机,若活体检测类型是可见光活体检测或不启用活体,则不需要启用
// */
// private fun initIrCamera() {
// Timber.d("initIrCamera: livenessType = $livenessType")
// if (livenessType === LivenessType.RGB) {
// return
// }
// val irCameraListener: CameraListener = object : CameraListener {
// override fun onCameraOpened(
// camera: Camera,
// cameraId: Int,
// displayOrientation: Int,
// isMirror: Boolean
// ) {
// Timber.d("initIrCamera IR onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation")
// val previewSizeIr = camera.getParameters().getPreviewSize()
// val layoutParams = adjustPreviewViewSize(
// binding.dualCameraTexturePreviewRgb,
// binding.dualCameraTexturePreviewIr, binding.dualCameraFaceRectViewIr,
// previewSizeIr, displayOrientation, 0.25f
// )
//
// irFaceRectTransformer = FaceRectTransformer(
// previewSizeIr.width, previewSizeIr.height,
// layoutParams.width, layoutParams.height, displayOrientation, cameraId, isMirror,
// ConfigUtil.isDrawIrRectHorizontalMirror(context),
// ConfigUtil.isDrawIrRectVerticalMirror(context)
// )
//
// recognizeViewModel.onIrCameraOpened(camera)
// recognizeViewModel.setIrFaceRectTransformer(irFaceRectTransformer)
// }
//
//
// override fun onPreview(nv21: ByteArray?, camera: Camera?) {
// recognizeViewModel.refreshIrPreviewData(nv21)
// }
//
// override fun onCameraClosed() {
// Timber.i("initIrCamera onCameraClosed: ")
// }
//
// override fun onCameraError(e: java.lang.Exception) {
// Timber.i("initIrCamera onCameraError: ${e.message}")
// e.printStackTrace()
// }
//
// override fun onCameraConfigurationChanged(
// cameraID: Int,
// displayOrientation: Int
// ) {
// if (irFaceRectTransformer != null) {
// irFaceRectTransformer!!.cameraDisplayOrientation = displayOrientation
// }
// Timber.i("initIrCamera onCameraConfigurationChanged: cameraID = $cameraID, displayOrientation = $displayOrientation")
// }
// }
//
// val previewConfig = recognizeViewModel.previewConfig
// irCameraHelper = DualCameraHelper.Builder()
// .previewViewSize(
// Point(
// binding.dualCameraTexturePreviewIr.measuredWidth,
// binding.dualCameraTexturePreviewIr.measuredHeight
// )
// )
// .rotation(activity.windowManager.defaultDisplay.rotation)
// .specificCameraId(previewConfig.irCameraId)
// .previewOn(binding.dualCameraTexturePreviewIr)
// .cameraListener(irCameraListener)
// .isMirror(true)
// .previewSize(recognizeViewModel.loadPreviewSize()) //相机预览大小设置,RGB与IR需使用相同大小
// .additionalRotation(previewConfig.irAdditionalDisplayOrientation) //额外旋转角度
// .build()
// irCameraHelper!!.init()
// try {
// irCameraHelper!!.start()
// } catch (e: RuntimeException) {
// ToastUtils.showToast(e.message + context.getString(R.string.camera_error_notice))
// }
// }
//
// /**
// * 绘制RGB、IR画面的实时人脸信息
// *
// * @param facePreviewInfoList RGB画面的实时人脸信息
// */
// private fun drawPreviewInfo(facePreviewInfoList: MutableList<FacePreviewInfo?>) {
//// Timber.d("drawPreviewInfo facePreviewInfoList = ${facePreviewInfoList.size}, rgbFaceRectTransformer = ${rgbFaceRectTransformer != null}")
// if (rgbFaceRectTransformer != null) {
// val rgbDrawInfoList: MutableList<DrawInfo?>? = recognizeViewModel.getDrawInfo(
// facePreviewInfoList,
// LivenessType.RGB,
// openRectInfoDraw
// )
// // 识别成功
// binding.dualCameraFaceRectView.drawRealtimeFaceInfo(rgbDrawInfoList)
// }
//
// if (facePreviewInfoList.isEmpty() || (lastFaceTrackId != facePreviewInfoList[0]!!.trackId)) {
// if (lastFaceTrackId != -1) {
// Timber.i("$lastFaceTrackId 用户离开")
// lastFaceTrackId = -1
// postUserData()
// if (mealPickupMode == 0) {
// step1()
// } else {
// step2(currentFood!!)
// }
// }
// }
// }
//
// fun postUserData() {
// Timber.d("postUserData")
// if (userNutritionData == null || currentFood == null) {
// Timber.d("postUserData userNutritionData = ${userNutritionData == null}, currentFood = ${currentFood == null}")
// return
// }
// var eatWeight = 0.0
// if (mealPickupMode == 0) {//即放即取
// eatWeight = recognitionWeight - 0
// } else {
// eatWeight = recognitionWeight - lastWeight
// }
// val userNutritionParam = UserNutritionParam(
// userId = userNutritionData?.userId!!,
// foodId = currentFood?.foodId!!,
// faceTime = recognitionTime,
// faceEndTime = System.currentTimeMillis(),
// eatWeight = eatWeight,//lastWeight
// foodWeight = lastWeight
// )
// viewModel.postUserNutritionData(listOf<UserNutritionParam>(userNutritionParam))
// }
//
// fun openRectInfoDraw(view: View?) {
// openRectInfoDraw = !openRectInfoDraw
// recognizeViewModel.setDrawRectInfoTextValue(openRectInfoDraw)
// }
//
//
// override fun onGlobalLayout() {
// Timber.d("onGlobalLayout")
// binding.dualCameraTexturePreviewRgb.getViewTreeObserver().removeOnGlobalLayoutListener(this)
// openCamera()
// }
//
//
//// override fun onResume() {
//// super.onResume()
//// resumeCamera()
//// viewModel.resetUserInfo()
//// }
////
//// protected override fun onPause() {
//// pauseCamera()
//// super.onPause()
//// }
//
// override fun onStop() {
// if (rgbCameraHelper != null) {
// rgbCameraHelper!!.release()
// rgbCameraHelper = null
// }
// if (irCameraHelper != null) {
// irCameraHelper!!.release()
// irCameraHelper = null
// }
// recognizeViewModel.destroy()
// super.onStop()
// }
//
// fun resumeCamera() {
// Timber.d("resumeCamera isRecognition = $isRecognition")
// isRecognition = true
// if (rgbCameraHelper != null && rgbCameraHelper!!.isStopped) {
// rgbCameraHelper!!.start()
// }
// }
//
// fun pauseCamera() {
// Timber.d("pauseCamera isRecognition = $isRecognition")
// isRecognition = false
//
// recognizeViewModel.onPreviewFrame(ByteArray(1382400), true)
// }
//}