diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bfc5579..4917f68 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,7 +40,8 @@ + android:exported="true" + android:theme="@style/Theme.AppCompat.Light.NoActionBar"> @@ -51,15 +52,18 @@ android:name=".activity.MainActivity" android:exported="true"> - + + + - - - - - + + + + + : AppCompatActivity() { @@ -84,17 +82,14 @@ abstract class BaseActivity : AppCompatActivity() { /** * 显示等待提示框 */ - fun showWaitingDialog(tip: String?){ + fun showWaitingDialog(tip: String?) { runOnUiThread { hideWaitingDialog() - val view = View.inflate(this, R.layout.dialog_waiting, null) - if (!TextUtils.isEmpty(tip)) (view.findViewById(R.id.tvTip) as TextView).text = - tip - mDialogWaiting = CustomDialog(this, view, R.style.MyDialog).apply { - setCancelable(true) - setCanceledOnTouchOutside(true) - show() - } + //val view = View.inflate(this, R.layout.dialog_waiting, null) + val dialogBinding = DialogWaitingBinding.inflate(LayoutInflater.from(this)) + dialogBinding.tvTip.text = tip + mDialogWaiting = CustomDialog(this, dialogBinding.root) + mDialogWaiting?.show() } } @@ -113,8 +108,7 @@ abstract class BaseActivity : AppCompatActivity() { hideWaitingDialog() val view = View.inflate(this, R.layout.dialog_waiting, null) mDialogWaiting = CustomDialog(this, view, R.style.MyDialog) - mDialogWaiting!!.show() - mDialogWaiting!!.setCancelable(true) + mDialogWaiting?.show() } val contentView = mDialogWaiting?.findViewById(android.R.id.content) val tvTip = contentView?.findViewById(R.id.tvTip) diff --git a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt index c0effa1..59cee2b 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt @@ -32,6 +32,7 @@ import com.sw.dualscreen.ext.gone import com.sw.dualscreen.ext.load import com.sw.dualscreen.ext.visible import com.sw.dualscreen.model.response.ChargeModeEvent +import com.sw.dualscreen.model.response.ClickBackEvent import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.FoodOrder import com.sw.dualscreen.model.response.PaySuccessEvent @@ -114,6 +115,8 @@ class MainActivity : BaseActivity() { private var isRecognitionFood = true private var isFirstOpen = true + private var isStartRecognize = false + override fun getViewModel(): BaseViewModel { return viewModel } @@ -240,17 +243,23 @@ class MainActivity : BaseActivity() { } pauseAnalysis() recognizeWeight = lastWeight + Timber.tag(TAG) + .d("registerDataChange,副屏updateFood调用前耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() presentation?.updateFood(foodInfo) binding.tvFoodName.text = foodInfo.foodName binding.previewView.gone() binding.ivImg.visible() if (foodInfo.foodImg.isNullOrBlank()) { - takePhoto { imgUri -> + takePhoto(successCallback = { imgUri -> binding.ivImg.load(imgUri) presentation?.updateFood(foodInfo.copy(foodImg = imgUri.toString())) - } + }, failureCallback = { + + }) + } else { + binding.ivImg.load(foodInfo.foodImg) } - binding.ivImg.load(foodInfo.foodImg ?: foodInfo.photoUri) //pauseAnalysis() } @@ -283,6 +292,7 @@ class MainActivity : BaseActivity() { SensorScaleUtils.addWeightListener { weight -> Timber.d("registerDataChange weight = $weight") + if (isPageVisible.not() || isStartRecognize.not()) return@addWeightListener val isWeightChange = weight - lastWeight > 0.05 recognizeByWeight(weight, isWeightChange) } @@ -308,15 +318,23 @@ class MainActivity : BaseActivity() { lastWeight = weight } + private var startTime = 0L + fun recognizeFood() { + startTime = System.currentTimeMillis() LightManager.openRedLight() LightManager.openGreenLight() - takePhoto { photoUri -> + showWaitingDialog("识别中,请稍后……") + takePhoto(successCallback = { photoUri -> lastPhotoUri = photoUri + Timber.tag(TAG).d("main,takePhoto耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() Timber.d("registerDataChange photoUri = ${photoUri.path}") // viewModel.getIdentifiedFoodList() ImageUtil.uriToBitmap(this, photoUri)?.let { bitmap -> + Timber.tag(TAG).d("main,uriToBitmap耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() Timber.d("registerDataChange photoUri 拿到bitmap") // val bmp = BitmapCropper.cropCenter(bitmap, 1300, 900) Timber.d("registerDataChange photoUri bitmap裁剪完成") @@ -325,19 +343,21 @@ class MainActivity : BaseActivity() { this, "IMG_CROP_${System.currentTimeMillis()}.jpg" ) + Timber.tag(TAG) + .d("main,saveToAppFilesDir耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() Timber.d("registerDataChange photoUri bitmap保存文件路径:${file?.absolutePath}") //val nameList = FoodModule.queryFood(bitmap) val scoreList = FoodModule.getFoodScoreList(bitmap) - Timber.d( - "registerDataChange photoUri 拿到识别数据:${ - GsonUtils.toJson( - scoreList - ) - }" - ) + val recDataJson = GsonUtils.toJson(scoreList) + Timber.tag(TAG) + .d("main,getFoodScoreList耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() + Timber.d("registerDataChange photoUri 拿到识别数据:$recDataJson") val nameList = scoreList.map { it.name } val foodName = nameList.joinToString(separator = ",") + hideWaitingDialog() Timber.d("registerDataChange photoUri 识别数据名称:$foodName") if (TextUtils.isEmpty(foodName)) { LightManager.closeGreenLight() @@ -350,15 +370,28 @@ class MainActivity : BaseActivity() { } } else { //binding.layoutRescan.visibility = View.GONE + showWaitingDialog("正在查询菜品信息,请稍后……") viewModel.getFoodInfo(foodName) { list -> runOnUiThread { + hideWaitingDialog() + Timber.tag(TAG) + .d("main,getFoodInfo耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() updateFoodInfo(list.toMutableList(), scoreList) } } } } - } + }, failureCallback = { + runOnUiThread { + hideWaitingDialog() + ToastUtils.showToast("拍照异常,请手动放置后重新识别") + } +// binding.root.postDelayed({ +// recognizeFood() +// }, 500) + }) } @SuppressLint("NotifyDataSetChanged") @@ -447,6 +480,7 @@ class MainActivity : BaseActivity() { if (isAnalyzing) { val bitmap = imageProxy.toBitmap() presentation?.updateImage(bitmap) // 更新副屏 + isStartRecognize = true } imageProxy.close() // 必须关闭以释放资源 } @@ -518,7 +552,7 @@ class MainActivity : BaseActivity() { } // 拍照功能 - private fun takePhoto(callback: (Uri) -> Unit) { + private fun takePhoto(successCallback: (Uri) -> Unit, failureCallback: () -> Unit) { Timber.d("takePhoto") // 临时停止分析以避免干扰 isAnalyzing = false @@ -545,7 +579,7 @@ class MainActivity : BaseActivity() { Timber.d("takePhoto savedUri = $savedUri") // ToastUtils.showToast("照片保存成功: $savedUri") if (savedUri != null) { - callback(savedUri) + successCallback(savedUri) } } // 恢复图像分析 @@ -554,6 +588,7 @@ class MainActivity : BaseActivity() { override fun onError(exception: ImageCaptureException) { Timber.e("拍照失败: ${exception.message}") + failureCallback() //runOnUiThread { // ToastUtils.showToast("拍照失败: ${exception.message}") //} @@ -631,14 +666,16 @@ class MainActivity : BaseActivity() { binding.tvTitleTime.text = dateTime } + private var isPageVisible = true + override fun onResume() { super.onResume() - Timber.tag("onResume").d("=================onResume================") + isPageVisible = true // 启动定时器 handler.postDelayed(timeoutRunnable, TIME_OUT) if (isFirstOpen) { - //首次 + //首次 setupSecondaryDisplay() presentation?.step1FoodRecognizing() isFirstOpen = false @@ -650,11 +687,14 @@ class MainActivity : BaseActivity() { setupSecondaryDisplay() presentation?.step1FoodRecognizing() } else { - //已显示副屏,则进行更新 - val weight = lastWeight - lastWeight = 0.0 - presentation?.hideRecImage() - recognizeByWeight(weight, true) + if (isRefreshPage) { + //已显示副屏,则进行更新 + val weight = lastWeight + lastWeight = 0.0 + presentation?.hideRecImage() + recognizeByWeight(weight, true) + } + isRefreshPage = !isRefreshPage } } @@ -674,6 +714,7 @@ class MainActivity : BaseActivity() { override fun onPause() { super.onPause() + isPageVisible = false // 取消定时器 handler.removeCallbacks(timeoutRunnable) } @@ -770,16 +811,24 @@ class MainActivity : BaseActivity() { @Subscribe(threadMode = ThreadMode.MAIN) fun onPaySuccessEvent(event: PaySuccessEvent) { - val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0)?:0 + isRefreshPage = true + val chargeMode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) ?: 0 presentation?.hideNutritionView(chargeMode) presentation?.cancel() } @Subscribe(threadMode = ThreadMode.MAIN) fun onChargeModeEvent(event: ChargeModeEvent) { + isRefreshPage = true + isStartRecognize = false presentation?.hideNutritionView(event.chargeMode) // presentation?.cancel() } + private var isRefreshPage = false + @Subscribe(threadMode = ThreadMode.MAIN) + fun onClickBackEvent(event: ClickBackEvent) { + isRefreshPage = false + } private fun clickPayButton() { if (checkedItem == null) { diff --git a/app/src/main/java/com/sw/dualscreen/activity/SettingActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/SettingActivity.kt index 0bcbdd7..18fc039 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/SettingActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/SettingActivity.kt @@ -1,5 +1,6 @@ package com.sw.dualscreen.activity +import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import androidx.fragment.app.Fragment import com.sw.dualscreen.R @@ -7,8 +8,10 @@ import com.sw.dualscreen.activity.fragment.BusinessFragment import com.sw.dualscreen.activity.fragment.CollectFragment import com.sw.dualscreen.databinding.ActivitySettingBinding import com.sw.dualscreen.model.response.FoodInfo +import com.sw.dualscreen.model.response.ClickBackEvent import com.sw.dualscreen.viewmodel.BaseViewModel import com.sw.dualscreen.viewmodel.UserViewModel +import org.greenrobot.eventbus.EventBus class SettingActivity : BaseActivity() { @@ -28,10 +31,12 @@ class SettingActivity : BaseActivity() { override fun initialize() { super.initialize() + initBackDispatcher() binding.include.let { it.ivPageBack.setOnClickListener { // val intent = Intent(this, MainActivity::class.java) // startActivity(intent) + EventBus.getDefault().post(ClickBackEvent()) finish() } it.tvPageTitle.text = "设置" @@ -65,4 +70,17 @@ class SettingActivity : BaseActivity() { viewModel.searchByFoodName(foodName, action) } + private lateinit var backPressedCallback: OnBackPressedCallback + private fun initBackDispatcher() { + // 创建回调,true表示初始启用状态 + backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + EventBus.getDefault().post(ClickBackEvent()) + } + } + // 注册回调,使用lifecycleOwner确保生命周期安全 + onBackPressedDispatcher.addCallback(this, backPressedCallback) + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt index 735d662..c43757d 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/CollectFragment.kt @@ -45,8 +45,9 @@ class CollectFragment : BaseFragment() { companion object { private const val TAG = "CollectFragment" - const val MAX_COUNT = 102 + const val MAX_COUNT = 15 } + private var selectedFoodId: String? = "" private var selectedFoodName: String? = "" @@ -58,17 +59,17 @@ class CollectFragment : BaseFragment() { } private val searchFoodList = mutableListOf() - private var settingActivity: SettingActivity?=null + private var settingActivity: SettingActivity? = null private var checkedItem: FoodInfo? = null private val searchFoodAdapter by lazy { SearchFoodAdapter(searchFoodList).apply { setOnItemClickListener { adapter, view, position -> checkedItem = searchFoodList[position] - selectedFoodId = checkedItem!!.foodId - selectedFoodName = checkedItem!!.foodName val isChecked = checkedItem!!.isChecked searchFoodList[position].isChecked = isChecked.not() notifyItemChanged(position) + selectedFoodId = checkedItem!!.foodId + selectedFoodName = checkedItem!!.foodName } } } @@ -85,6 +86,7 @@ class CollectFragment : BaseFragment() { it.bitmap = null it.imageVector = null it.imageFile = null + it.imageUri = null it.isShowCamera = true it.isFinish = false it.uploadSuccess = false @@ -93,6 +95,7 @@ class CollectFragment : BaseFragment() { } } } + override fun inflateViewBinding(): FragmentCollectBinding { return FragmentCollectBinding.inflate(LayoutInflater.from(context)) } @@ -104,14 +107,25 @@ class CollectFragment : BaseFragment() { if (index == -1) { ToastUtils.showToast("每次只允许保存${MAX_COUNT}条数据") settingActivity?.hideWaitingDialog() - rerurn@cameraCallback + rerurn@ cameraCallback } + activity?.runOnUiThread { + foodCollectionList[index].let { + it.imageVector = null + it.bitmap = null + it.isShowCamera = false + it.imageFile = null + it.imageUri = uri + } + collectionAdapter.notifyItemChanged(index) + } +// settingActivity?.hideWaitingDialog() ImageUtil.uriToBitmap(requireActivity(), uri)?.let { bitmap -> - // val cropBitmap = BitmapCropper.cropCenter( - // original = bitmap, - // targetWidth = 1300, targetHeight = 900, - // //offsetX = 30, offsetY = 100 - // ) + // val cropBitmap = BitmapCropper.cropCenter( + // original = bitmap, + // targetWidth = 1300, targetHeight = 900, + // //offsetX = 30, offsetY = 100 + // ) initBox() val imageVector = try { FoodModule.bitmap2FloatArray(bitmap) @@ -154,7 +168,7 @@ class CollectFragment : BaseFragment() { } settingActivity?.showWaitingDialog("拍照中……") cameraUtils.takePhoto(cameraCallback) { errMsg -> - ToastUtils.showToast(errMsg) + ToastUtils.showToast("拍照异常,请重新操作") settingActivity?.hideWaitingDialog() } } @@ -173,7 +187,8 @@ class CollectFragment : BaseFragment() { cameraUtils.setPreviewController(previewView) binding.rvFoodList.let { - it.layoutManager = GridLayoutManager(requireActivity(), 3, GridLayoutManager.VERTICAL, false) + it.layoutManager = + GridLayoutManager(requireActivity(), 3, GridLayoutManager.VERTICAL, false) it.adapter = collectionAdapter } @@ -182,12 +197,12 @@ class CollectFragment : BaseFragment() { } binding.btnSave.setOnClickListener { - if (selectedFoodName.isNullOrBlank()) { - Toast.makeText(requireActivity(), "请选择菜品名称", Toast.LENGTH_SHORT).show() + if (checkedItem == null || checkedItem!!.isChecked.not()) { + ToastUtils.showToast("请选择菜品名称") return@setOnClickListener } if (foodCollectionList.size <= 1) { - Toast.makeText(requireActivity(), "请拍摄菜品照片", Toast.LENGTH_SHORT).show() + ToastUtils.showToast("请拍摄菜品照片") return@setOnClickListener } upload() @@ -235,9 +250,12 @@ class CollectFragment : BaseFragment() { //params["foodVector"] = foodVector.toRequestBody() ImageUploader( totalList = foodCollectionList, - uploadImage = { batch-> + uploadImage = { batch -> val files = batch.map { it.imageFile } - (requireActivity() as SettingActivity).viewModel.uploadCollectFoodPics(files,params) + (requireActivity() as SettingActivity).viewModel.uploadCollectFoodPics( + files, + params + ) }, onProgress = { count, batch -> activity?.runOnUiThread { @@ -347,6 +365,7 @@ class CollectFragment : BaseFragment() { it.bitmap = null it.imageVector = null it.imageFile = null + it.imageUri = null it.isShowCamera = true it.isFinish = false it.uploadSuccess = false diff --git a/app/src/main/java/com/sw/dualscreen/adapter/FoodCollectionAdapter.kt b/app/src/main/java/com/sw/dualscreen/adapter/FoodCollectionAdapter.kt index 4ef0242..3bb0d13 100644 --- a/app/src/main/java/com/sw/dualscreen/adapter/FoodCollectionAdapter.kt +++ b/app/src/main/java/com/sw/dualscreen/adapter/FoodCollectionAdapter.kt @@ -39,7 +39,11 @@ class FoodCollectionAdapter (var list: MutableList) : scaleType = ImageView.ScaleType.CENTER_CROP //setImageURI(it.imageUri) //setImageBitmap(it.bitmap) - load(it.imageFile) + if (it.imageUri!=null) { + setImageURI(it.imageUri) + } else { + load(it.imageFile) + } // it.bitmap?.let { bitmap -> // GlideUtils.loadRoundCornerWitBitmap( // context, diff --git a/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt b/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt index 248d0a6..8caddd2 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/DataBean.kt @@ -126,4 +126,8 @@ data class PaySuccessEvent( data class ChargeModeEvent( var chargeMode:Int = 0 +) + +data class ClickBackEvent( + var name: String = "" ) \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/objbox/DataBean.kt b/app/src/main/java/com/sw/dualscreen/objbox/DataBean.kt index 325e06c..527c080 100644 --- a/app/src/main/java/com/sw/dualscreen/objbox/DataBean.kt +++ b/app/src/main/java/com/sw/dualscreen/objbox/DataBean.kt @@ -19,6 +19,7 @@ data class FoodClassInfo( data class FoodCollectionBean( var imageFile: File? = null, + var imageUri: Uri? = null, var bitmap: Bitmap? = null, var imageVector: FloatArray? = null, var isShowCamera: Boolean = false, diff --git a/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt b/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt index 18608f8..af59389 100644 --- a/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt +++ b/app/src/main/java/com/sw/dualscreen/objbox/FoodModule.kt @@ -92,6 +92,7 @@ object FoodModule { } fun queryFoodNameScore(floatArray: FloatArray, queryCount: Int = 15): List { + val startTime = System.currentTimeMillis() val query: Query = box.query(Food_.foodVector.nearestNeighbors(floatArray, queryCount)).build() //查询比较分数 @@ -101,11 +102,14 @@ object FoodModule { idScoreList.forEach { nameScoreList.add(IdNameScore(id = it.id, name = box.get(it.id).name?:"", score = it.score)) } - Timber.tag("FoodModule").d("registerDataChange,queryFood数据:${GsonUtils.toJson(nameScoreList)}") + val nameScoreData = GsonUtils.toJson(nameScoreList) + Timber.tag("FoodModule").d("registerDataChange,queryFood,耗时:${System.currentTimeMillis()-startTime},数据:$nameScoreData") return nameScoreList } fun getFoodScoreList(bitmap: Bitmap, queryCount: Int = 15): List { + val startTime = System.currentTimeMillis() val floatArray = bitmap2FloatArray(bitmap) + Timber.tag("FoodModule").d("registerDataChange,bitmap2FloatArray,耗时:${System.currentTimeMillis()-startTime}") val nameScoreList = queryFoodNameScore(floatArray, queryCount) if (nameScoreList.isEmpty()) { return emptyList() diff --git a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt index 7e0f63e..3f68c4f 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt @@ -118,6 +118,7 @@ class MainScreenPresentation( initView() setupArcCamera() registerDataChange() + startTime = System.currentTimeMillis() } private var isFirstGetWeight = true @@ -261,19 +262,34 @@ class MainScreenPresentation( /** * 显示识别出的菜品信息 */ - fun step3ShowRecognizeResult() { - Timber.tag(TAG).d("step3") + fun step3ShowRecognizeResult(userId: String) { + Timber.tag(TAG).d("main,step3,耗时:${System.currentTimeMillis() - startTime}") LightManager.closeRedLight() LightManager.openGreenLight() currentStep = 3 stepChangeCallback(currentStep) - if (currentFood == null) { - ToastUtils.showToast("选中物品为空") - return - } -// updateFoodInfo(currentFood!!) - //foodRecSuccess(currentFood!!) + //根据接口数据更新热量数据-------------------------- + userViewModel.getUserNutritionData(userId = userId) { nutrition -> + activity.runOnUiThread { + if (nutrition == null) { + activity.hideWaitingDialog() + ToastUtils.showToast("未查询到营养数据") + return@runOnUiThread + } + this@MainScreenPresentation.userNutrition = nutrition + loadUnbilledMode() + + val imageUrl = + if (currentFood!!.foodImg.isNullOrBlank()) currentFood!!.photoUri else currentFood!!.foodImg + binding.ivRecImage.let { + it.visible() + it.load(imageUrl) + } + activity.updateImage(imageUrl) + activity.hideWaitingDialog() + } + } } private fun initView() { @@ -392,14 +408,19 @@ class MainScreenPresentation( calculateNutrition(recognitionWeight - lastWeight) } + private var isFirstOpen = true + var startTime = 0L /** * 餐品识别中 */ fun step1FoodRecognizing() { + Timber.tag(TAG).d("main,step1,耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() hideStandbyScreen() activity.resetTouchTime() - activity.resumeAnalysis() - Timber.tag(TAG).d("step1") + if (isFirstOpen.not()) { + activity.resumeAnalysis() + } //if (abs(lastWeight.toInt()) <= 5) { // activity.runOnUiThread { // ToastUtils.showToast("秤上重量几乎为0,请确认") @@ -426,11 +447,11 @@ class MainScreenPresentation( binding.flCameraView.visible() binding.ivRecImage.gone() binding.ivPreviewImage.visible() - binding.ivFrame.visible() binding.ivFaceRecMask.gone() binding.tvFaceTip.gone() binding.llPriceInfo.gone() binding.flFace.gone() + binding.ivFrame.gone() binding.flRecognizeIr.gone() pauseCamera() @@ -458,7 +479,8 @@ class MainScreenPresentation( */ fun step2FaceRecognizing(foodInfo: FoodInfo) { isGoStep1 = true - Timber.tag(TAG).d("step2") + Timber.tag(TAG).d("main,step2,耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() currentStep = 2 LightManager.closeRedLight() @@ -497,7 +519,8 @@ class MainScreenPresentation( // 当前食物信息 private var currentFood: FoodInfo? = null fun updateFood(foodInfo: FoodInfo?) { - Timber.tag(TAG).d("updateFood") + Timber.tag(TAG).d("main,updateFood,耗时:${System.currentTimeMillis() - startTime}") + startTime = System.currentTimeMillis() currentFood = foodInfo if (foodInfo == null) { return @@ -513,6 +536,8 @@ class MainScreenPresentation( if (foodInfo.foodImg.isNullOrBlank()) foodInfo.photoUri else foodInfo.foodImg it.load(imageUrl) } + } else { + binding.ivRecImage.gone() } val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) if (mode == 0) { @@ -793,28 +818,7 @@ class MainScreenPresentation( return@runOnUiThread } } - step3ShowRecognizeResult() - //根据接口数据更新热量数据-------------------------- - userViewModel.getUserNutritionData(userId = userId) { nutrition -> - activity.runOnUiThread { - if (nutrition == null) { - activity.hideWaitingDialog() - ToastUtils.showToast("未查询到营养数据") - return@runOnUiThread - } - this@MainScreenPresentation.userNutrition = nutrition - loadUnbilledMode() - - val imageUrl = - if (currentFood!!.foodImg.isNullOrBlank()) currentFood!!.photoUri else currentFood!!.foodImg - binding.ivRecImage.let { - it.visible() - it.load(imageUrl) - } - activity.updateImage(imageUrl) - activity.hideWaitingDialog() - } - } + step3ShowRecognizeResult(userId) }) recognizeViewModel.drawRectInfoText.observe(activity, Observer { info -> @@ -1140,10 +1144,9 @@ class MainScreenPresentation( } fun postUserData() { - Timber.tag(TAG).d("postUserData") - if (userNutrition == null || currentFood == null) { - Timber.tag(TAG) - .d("postUserData userNutritionData = ${userNutrition == null}, currentFood = ${currentFood == null}") + Timber.tag(TAG) + .d("postUserData userNutritionData是否null: ${userNutrition == null}, currentFood是否null: ${currentFood == null},currentUserId是否null:${currentUserId == null}", ) + if (userNutrition == null || currentFood == null || currentUserId == null) { return } createOrder() diff --git a/app/src/main/java/com/sw/dualscreen/view/CustomDialog.java b/app/src/main/java/com/sw/dualscreen/view/CustomDialog.java index fb8a0c9..f988910 100644 --- a/app/src/main/java/com/sw/dualscreen/view/CustomDialog.java +++ b/app/src/main/java/com/sw/dualscreen/view/CustomDialog.java @@ -3,14 +3,14 @@ package com.sw.dualscreen.view; import android.app.Dialog; import android.content.Context; import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; -import android.widget.TextView; - import com.sw.dualscreen.R; /** @@ -18,78 +18,86 @@ import com.sw.dualscreen.R; */ public class CustomDialog extends Dialog { - /** * 宽高由布局文件中指定(但是最底层的宽度无效,可以多嵌套一层解决) */ + public CustomDialog(Context context, View layout) { + super(context, R.style.LoadingDialog); + setContentView(layout); + initConfig(); + } + public CustomDialog(Context context, View layout, int style) { - super(context, style); - setContentView(layout); + initConfig(); + } + private void initConfig() { + setCancelable(true); + setCanceledOnTouchOutside(true); Window window = getWindow(); - - WindowManager.LayoutParams params = window.getAttributes(); - - params.gravity = Gravity.CENTER; - - window.setAttributes(params); - - } - - /** - * 宽高由该方法的参数设置 - */ - public CustomDialog(Context context, int width, int height, View layout, - int style) { - super(context, style); - // 设置内容 - setContentView(layout); - // 设置窗口属性 - Window window = getWindow(); - WindowManager.LayoutParams params = window.getAttributes(); - // 设置宽度、高度、密度、对齐方式 - float density = getDensity(context); - params.width = (int) (width * density); - params.height = (int) (height * density); - params.gravity = Gravity.CENTER; - window.setAttributes(params); - - } - - /** - * 获取显示密度 - * - * @param context - * @return - */ - public float getDensity(Context context) { - Resources res = context.getResources(); - DisplayMetrics dm = res.getDisplayMetrics(); - return dm.density; - } - - private void fullScreenImmersive(View view) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_FULLSCREEN; - view.setSystemUiVisibility(uiOptions); + if (window != null) { + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + WindowManager.LayoutParams params = window.getAttributes(); + params.gravity = Gravity.CENTER; + params.width = WindowManager.LayoutParams.WRAP_CONTENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(params); } - } +// +// /** +// * 宽高由该方法的参数设置 +// */ +// public CustomDialog(Context context, int width, int height, View layout, +// int style) { +// super(context, style); +// // 设置内容 +// setContentView(layout); +// // 设置窗口属性 +// Window window = getWindow(); +// WindowManager.LayoutParams params = window.getAttributes(); +// // 设置宽度、高度、密度、对齐方式 +// float density = getDensity(context); +// params.width = (int) (width * density); +// params.height = (int) (height * density); +// params.gravity = Gravity.CENTER; +// window.setAttributes(params); +// +// } +// +// /** +// * 获取显示密度 +// * +// * @param context +// * @return +// */ +// public float getDensity(Context context) { +// Resources res = context.getResources(); +// DisplayMetrics dm = res.getDisplayMetrics(); +// return dm.density; +// } +// +// private void fullScreenImmersive(View view) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { +// int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE +// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY +// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN +// | View.SYSTEM_UI_FLAG_FULLSCREEN; +// view.setSystemUiVisibility(uiOptions); +// } +// +// } - @Override - - public void show() { - this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); - super.show(); -// fullScreenImmersive(getWindow().getDecorView()); -// this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); - } +// @Override +// public void show() { +// this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); +// super.show(); +//// fullScreenImmersive(getWindow().getDecorView()); +//// this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); +// } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_btn_save.xml b/app/src/main/res/drawable/bg_btn_save.xml index d0c6549..83c1497 100644 --- a/app/src/main/res/drawable/bg_btn_save.xml +++ b/app/src/main/res/drawable/bg_btn_save.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 72e724e..16663db 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -58,7 +58,7 @@ android:id="@+id/tv_food_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="60dp" + android:layout_marginTop="50dp" android:textStyle="bold" android:textSize="52sp" android:textColor="#FF0A1428" @@ -67,9 +67,9 @@ + android:indeterminateTintMode="src_atop" + android:focusable="false"/> - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index aa2fb6f..1061ae7 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,13 +1,11 @@ - - + + \ No newline at end of file