From 086845dd16594bdb76314d38344c2b13bc72a1c8 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 8 Dec 2025 18:06:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=90=A5=E5=85=BB=E6=8E=A5=E5=8F=A3=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E3=80=81=E6=94=AF=E4=BB=98=E6=8E=A5=E5=8F=A3=E8=81=94?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sw/dualscreen/activity/MainActivity.kt | 23 ++- .../com/sw/dualscreen/activity/PayActivity.kt | 32 +++- .../fragment/pay/PayResultFragment.kt | 38 +++-- .../fragment/pay/ScanQrCodePayFragment.kt | 16 +- .../sw/dualscreen/model/response/DataBean.kt | 33 +++- .../sw/dualscreen/model/response/FoodInfo.kt | 2 + .../sw/dualscreen/network/api/ApiService.kt | 45 +++--- .../presentation/MainScreenPresentation.kt | 147 ++++++++++-------- .../presentation/UserNutritionUtils.kt | 68 +++++--- .../presentation/pay/FacePayPresentation.kt | 5 +- .../dualscreen/repository/RemoteRepository.kt | 9 +- .../sw/dualscreen/utils/IntervalExecutor.kt | 64 ++++++++ .../sw/dualscreen/view/CustomImageView.java | 95 +++++++---- .../sw/dualscreen/viewmodel/UserViewModel.kt | 142 ++++++++--------- app/src/main/res/drawable/ic_gray_big.9.png | Bin 1381 -> 1378 bytes app/src/main/res/drawable/ic_gray_small.9.png | Bin 876 -> 875 bytes app/src/main/res/drawable/ic_green_big.9.png | Bin 1432 -> 1429 bytes .../main/res/drawable/ic_green_small.9.png | Bin 914 -> 913 bytes app/src/main/res/drawable/ic_orange_big.9.png | Bin 1343 -> 1350 bytes .../main/res/drawable/ic_orange_small.9.png | Bin 863 -> 866 bytes app/src/main/res/drawable/ic_red_big.9.png | Bin 1304 -> 1301 bytes app/src/main/res/drawable/ic_red_small.9.png | Bin 829 -> 829 bytes app/src/main/res/drawable/ic_yellow_big.9.png | Bin 1437 -> 1439 bytes .../main/res/drawable/ic_yellow_small.9.png | Bin 925 -> 927 bytes app/src/main/res/layout/activity_pay.xml | 3 +- app/src/main/res/layout/dialog_waiting.xml | 2 +- .../res/layout/presentation_main_screen.xml | 4 +- 27 files changed, 491 insertions(+), 237 deletions(-) create mode 100644 app/src/main/java/com/sw/dualscreen/utils/IntervalExecutor.kt 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 9f2171f..230a30f 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt @@ -87,6 +87,12 @@ class MainActivity : BaseActivity() { checkedItem = item notifyDataSetChanged() updateCurrentFood(item) + + val mode = SPUtil.getInstance().get(GlobalKey.KEY_CHARGE_MODE, 0) + //不计费模式切换菜品,重新加载数据 + if(mode == 1) { + presentation?.loadUnbilledMode() + } } } } @@ -222,8 +228,19 @@ class MainActivity : BaseActivity() { return@setOnClickListener } - val realWeight = (lastWeight * 1000).roundToInt() - createOrder(foodInfo = checkedItem!!, foodWeight = realWeight, eatWeight = realWeight) { + //val realWeight = (lastWeight * 1000).roundToInt() + val mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0 + val eatWeight = if (mealPickupMode == 0) { + //即放即取 + presentation?.recognitionWeight?:0.0 + } else { + presentation?.recognitionWeight?.minus(lastWeight)?:0.0 + } + createOrder( + foodInfo = checkedItem!!, + foodWeight = presentation?.lastWeight?.roundToInt()?:0, + eatWeight = eatWeight.roundToInt() + ) { presentation?.dismiss() startActivity(Intent(this, PayActivity::class.java).apply { putExtra(PayActivity.FOOD_INFO, checkedItem!!) @@ -684,7 +701,7 @@ class MainActivity : BaseActivity() { viewModel.createOrder(order) { orderId -> runOnUiThread { if (orderId.isBlank()) { - ToastUtils.showToast("订单id为空") + //ToastUtils.showToast("订单id为空") return@runOnUiThread } foodOrderId = orderId diff --git a/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt index 5ac9715..79e45d2 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/PayActivity.kt @@ -9,6 +9,7 @@ import com.sw.dualscreen.activity.fragment.pay.NumberPayFragment import com.sw.dualscreen.activity.fragment.pay.PayResultFragment import com.sw.dualscreen.activity.fragment.pay.ScanQrCodePayFragment import com.sw.dualscreen.databinding.ActivityPayBinding +import com.sw.dualscreen.ext.gone import com.sw.dualscreen.model.response.FoodInfo import com.sw.dualscreen.model.response.MemberInfo import com.sw.dualscreen.presentation.pay.ScanQrCodePayPresentation @@ -60,6 +61,7 @@ class PayActivity : BaseActivity() { super.initialize() foodInfo = intent.getParcelableExtra(FOOD_INFO) foodOrderId = intent.getStringExtra(FOOD_ORDER_ID) ?: "" + // totalAmount = intent.getDoubleExtra(TOTAL_AMOUNT,0.0) // memberInfo = intent.getParcelableExtra(MEMBER_INFO) binding.tvFoodName.text = foodInfo?.foodName @@ -160,6 +162,7 @@ class PayActivity : BaseActivity() { cashPayFragment?.presentation?.dismiss() numberPayFragment?.presentation?.dismiss() facePayFragment?.presentation?.dismiss() + scanQrCodePayPresentation?.dismiss() super.onDestroy() } @@ -188,6 +191,7 @@ class PayActivity : BaseActivity() { fun showPaySuccess(isVip: Boolean) { showPayInfo(type = 2, isVip = isVip, memberInfo = memberInfo) + hidePayTab() } fun getQrCodeImg(orderId: String, userId: String? = null, block: (String?) -> Unit) { @@ -218,11 +222,31 @@ class PayActivity : BaseActivity() { } } - fun paySuccessCallback(isVip: Boolean, block: () -> Unit = {}) { - userViewModel.paySuccessCallback(queryType = 1, orderId = foodOrderId) { - showPaySuccess(isVip) - block() + suspend fun queryOrderState(isVip: Boolean, block: (Boolean) -> Unit) { + userViewModel.queryOrderState(orderId = foodOrderId) { payResult -> + runOnUiThread { + if (payResult) { + showPaySuccess(isVip) + block(true) + } else { + block(false) + } + } } } + fun hidePayTab() { + binding.llPayTab.gone() + } + + + +// private val intervalExecutor by lazy { IntervalExecutor() } +// private var payTaskJob: Job? = null +// fun paySuccessCallback() { +// payTaskJob = intervalExecutor.startIntervalTaskWithInitialDelay(5000, 10000) { +// +// } +// } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt index 9e2d76f..b896bda 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/PayResultFragment.kt @@ -12,7 +12,9 @@ import com.sw.dualscreen.ext.load import com.sw.dualscreen.ext.visible import com.sw.dualscreen.model.response.MemberInfo import com.sw.dualscreen.model.response.TextBean +import com.sw.dualscreen.utils.IntervalExecutor import com.sw.dualscreen.utils.SpannedUtils +import kotlinx.coroutines.Job class PayResultFragment : BaseFragment() { @@ -44,13 +46,7 @@ class PayResultFragment : BaseFragment() { override fun initialize() { payActivity = activity as PayActivity binding.btnBack.setOnClickListener { - //payActivity?.showFacePay() - } - if (memberInfo != null) { - binding.layoutMemberInfo.visible() - } else { - binding.layoutMemberInfo.gone() - + activity?.finish() } arguments?.let { pageType = it.getInt(PAGE_TYPE, 0) @@ -58,11 +54,14 @@ class PayResultFragment : BaseFragment() { } totalPrice = payActivity?.foodInfo?.vipPrice ?: 0.0 - memberInfo?.let { - balance = (memberInfo?.topUpBalance ?: 0.0) + (memberInfo?.rewardBalance ?: 0.0) + if (memberInfo != null) { + binding.layoutMemberInfo.visible() + balance = (memberInfo!!.topUpBalance ?: 0.0) + (memberInfo!!.rewardBalance ?: 0.0) realPayPrice = if (balance >= totalPrice) 0.0 else totalPrice - balance expensesBalance = if (balance >= totalPrice) totalPrice else balance - loadUserInfo(it) + loadUserInfo(memberInfo!!) + } else { + binding.layoutMemberInfo.gone() } when (pageType) { @@ -112,7 +111,7 @@ class PayResultFragment : BaseFragment() { ) { qrCodeImg -> binding.ivPayQrCode.load(qrCodeImg) //扫码成功回调打开成功页面 - payActivity?.paySuccessCallback(true) + paySuccessCallback(true) } } } @@ -208,4 +207,21 @@ class PayResultFragment : BaseFragment() { } } + override fun onDestroy() { + payTaskJob?.cancel() + super.onDestroy() + } + + private val intervalExecutor by lazy { IntervalExecutor() } + private var payTaskJob: Job? = null + fun paySuccessCallback(isVip: Boolean) { + payTaskJob = intervalExecutor.startIntervalTaskWithInitialDelay(5000, 10000) { + payActivity?.queryOrderState(isVip) { paySuccess -> + if (paySuccess) { + payTaskJob?.cancel() + } + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt index 36bfd33..685f41e 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/fragment/pay/ScanQrCodePayFragment.kt @@ -14,6 +14,7 @@ import com.sw.dualscreen.utils.countDownByFlow import kotlinx.coroutines.Job import com.sw.dualscreen.databinding.FragmentScanQrcodePayBinding import com.sw.dualscreen.ext.format2String +import com.sw.dualscreen.utils.IntervalExecutor class ScanQrCodePayFragment: BaseFragment() { @@ -44,7 +45,7 @@ class ScanQrCodePayFragment: BaseFragment() { binding.ivPayQrCode.load(payQrCodePic) binding.tvPayResult.text = "待支付(60s)..." - payActivity.paySuccessCallback(false) + paySuccessCallback(false) showSubScreen() @@ -64,6 +65,7 @@ class ScanQrCodePayFragment: BaseFragment() { override fun onDestroy() { delayDismiss() countDownJob?.cancel() // 自动取消订阅,防止内存泄漏 + payTaskJob?.cancel() super.onDestroy() } @@ -110,4 +112,16 @@ class ScanQrCodePayFragment: BaseFragment() { ) } + private val intervalExecutor by lazy { IntervalExecutor() } + private var payTaskJob: Job? = null + fun paySuccessCallback(isVip: Boolean) { + payTaskJob = intervalExecutor.startIntervalTaskWithInitialDelay(5000, 10000) { + payActivity.queryOrderState(isVip) { paySuccess -> + if (paySuccess) { + payTaskJob?.cancel() + } + } + } + } + } \ No newline at end of file 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 37848bd..3bb471a 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 @@ -58,7 +58,7 @@ data class UserNutrition( //姓名 val name: String?, //推荐能量 - val recommendEnergy: Double?, +// val recommendEnergy: Double?, //热量 val calorie: Double?, //果蔬 @@ -67,8 +67,39 @@ data class UserNutrition( val meatEggs: Double?, //主食 val stapleFood: Double?, + //能量最大值 + val maxCalorie: Double? = null, + //能量最小值 + val minCalorie: Double? = null, + //推荐能量 + val recommendCalorie: Double? = null, + //主食推荐值 + val stapleFoodRecommend: String?=null, + //主食即将超量 + val stapleFoodNearExcess: String?=null, + //主食超量 + val stapleFoodExcess: String?=null, + //果蔬推荐值 + val fruitsVegetablesRecommend: String?=null, + //果蔬即将超量 + val fruitsVegetablesNearExcess: String?=null, + //果蔬超量 + val fruitsVegetablesExcess: String?=null, + //肉蛋推荐值 + val meatEggsRecommend: String?=null, + //肉蛋即将超量 + val meatEggsNearExcess: String?=null, + //肉蛋超量 + val meatEggsExcess: String?=null, ) data class PayResult( val paySuc: String? = null +) + +data class UserEnergy( + var calorie:Double, + var grain:Double, + var fruitsVegetables:Double, + var meatEggs:Double, ) \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt b/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt index 35356fe..c6d4af7 100644 --- a/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt +++ b/app/src/main/java/com/sw/dualscreen/model/response/FoodInfo.kt @@ -39,6 +39,8 @@ data class FoodInfo( val fruitsVegetables:Double? = null, //肉蛋 val meatEggs:Double? = null, + //推荐能量 + val recommendCalorie: Double? = null, //----------------------------------- var score: Int = 0, diff --git a/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt b/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt index ef3f709..b5dd446 100644 --- a/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt +++ b/app/src/main/java/com/sw/dualscreen/network/api/ApiService.kt @@ -123,17 +123,6 @@ interface ApiService { @Query("id") userId: String ): ApiResponse - /** - * 获取支付二维码 - */ - @GET - suspend fun getQrCodeImg( - @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/getQrCodeImg", - @Query("orderNo") orderNo: String, - @Query("memberId") memberId: String?, - @Query("totalFee") totalFee: String? - ): ApiResponse - /** * 获取当前餐点类型 */ @@ -166,21 +155,30 @@ interface ApiService { @Body req: FoodSearchReq ): ApiResponse> - /** +// /** +// * 查询支付结果 +// */ +// @POST +// suspend fun queryOrderState( +// @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/turnOrderInfo", +// @Body param: HashMap +// ): ApiResponse + /** * 查询支付结果 */ @POST suspend fun queryOrderState( - @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/turnOrderInfo", - @Body param: HashMap - ): ApiResponse + @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/pay/app/turnOrderInfo", +// @Query("orderNo") orderNo: String + @Body param: HashMap + ): ApiResponse /** * 现金支付 */ @POST suspend fun cashPay( - @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/cashPayment", + @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/pay/app/cashPayment", @Body param: HashMap ): ApiResponse @@ -189,10 +187,21 @@ interface ApiService { */ @POST suspend fun memberPay( - @Url url: String = "${GlobalData.appBaseUrl}/pay/yx-check-out-pay/memberPay", + @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/pay/app/memberPay", @Body param: HashMap ): ApiResponse + /** + * 获取支付二维码 + */ + @GET + suspend fun getQrCodeImg( + @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/pay/app/getQrCodeImg", + @Query("orderNo") orderNo: String, + @Query("memberId") memberId: String?, + @Query("totalFee") totalFee: String? + ): ApiResponse + /** * 开餐-生成订单 */ @@ -218,7 +227,7 @@ interface ApiService { suspend fun bindOrder( @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/boothMachine/app/bingOrder", @Query("userId") userId: String, - @Query("orderId") orderId: String + @Query("orderNo") orderId: String ): ApiResponse 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 030ae2c..2a46467 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/MainScreenPresentation.kt @@ -34,6 +34,7 @@ import com.sw.dualscreen.ext.visible import com.sw.dualscreen.model.request.UserNutritionParam import com.sw.dualscreen.model.response.DinnerType import com.sw.dualscreen.model.response.FoodInfo +import com.sw.dualscreen.model.response.UserEnergy import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import com.sw.dualscreen.utils.Debouncer @@ -91,14 +92,14 @@ class MainScreenPresentation( private var irFaceRectTransformer: FaceRectTransformer? = null private var detectWeight = 0.0 //识别菜品时的重量 - private var lastWeight = 0.0 // 上一次的计算热量结果 + var lastWeight = 0.0 // 上一次的计算热量结果 // private var userNutritionData: UserNutritionData? = null private var userNutrition: UserNutrition? = null private var dinnerTypeInfo: DinnerType? = null private val debouncer = Debouncer(500) private var recognitionTime: Long = 0L // 人脸识别时的时间 - private var recognitionWeight: Double = 0.0 // 人脸识别时的重量 + var recognitionWeight: Double = 0.0 // 人脸识别时的重量 private var lastFaceTrackId: Int = -1 // 上一次的人脸信息 var mealPickupMode: Int = 0 // 取餐模式 0 即放即取 1 余量取餐 @@ -342,7 +343,7 @@ class MainScreenPresentation( /** * 餐品识别成功,不计费模式 */ - fun loadUnbilledMode(nutrition: UserNutrition) { + fun loadUnbilledMode() { binding.calorieInclude.root.gone() binding.nutritionInclude.root.visible() @@ -354,9 +355,9 @@ class MainScreenPresentation( //binding.ivRecImage.gone() //updateFoodInfo(foodInfo) - binding.nutritionInclude.tvUserName.text = nutrition.name.maskName() + binding.nutritionInclude.tvUserName.text = userNutrition?.name.maskName() binding.nutritionInclude.tvRecommendHeat.text = - "推荐热量:${nutrition.recommendEnergy ?: 0}kcal" + "推荐热量:${userNutrition?.recommendCalorie.format2String(2)}kcal" //updateWeight(lastWeight / 1000) // ------------------------------------------------- // 删除userNutritionData,改为userNutrition @@ -524,100 +525,107 @@ class MainScreenPresentation( val dinnerType = dinnerTypeInfo!!.dinnerType!! // Timber.tag(TAG) // .d("calculateNutrition foodName = ${currentFood!!.foodName}, dinnerType = $dinnerType, userId = ${userNutritionData!!.userId}") - val calcResultInfo = UserNutritionUtils.calculateNutrition2( + val energy: UserEnergy = UserNutritionUtils.calculateNutrition2( currentFood!!, // userNutritionData!!, userNutrition!!, weight, dinnerType = dinnerType ) - Timber.tag(TAG).d("calculateNutrition calcResultInfo = $calcResultInfo") - val columnMax = UserNutritionUtils.getMaxInt(calcResultInfo) +// Timber.tag(TAG).d("calculateNutrition calcResultInfo = $calcResultInfo") +// val columnMax = UserNutritionUtils.getMaxInt(calcResultInfo) + var columnMax = max(energy.grain, energy.fruitsVegetables) + columnMax = max(columnMax, energy.meatEggs) activity.runOnUiThread { - val totalKcal = calcResultInfo.totalKcal - val grain = calcResultInfo.grain - val fruits = calcResultInfo.fruits - val meat = calcResultInfo.meat - // 设置热量 - binding.nutritionInclude.customKcalColumn.setImageDrawable( - true, - totalKcal.max < totalKcal.current - ) - var maxKcal = totalKcal.max + val totalKcal = energy.calorie + val grain = energy.grain + val fruitsVegetables = energy.fruitsVegetables + val meatEggs = energy.meatEggs + + val include = binding.nutritionInclude + + // 设置热量--------------------------------------------------------------------- + val calorieArray = doubleArrayOf( + 0.0, + userNutrition?.minCalorie?:0.0, + userNutrition?.recommendCalorie?:0.0, + ((userNutrition?.recommendCalorie?:0.0) + (userNutrition?.maxCalorie?:0.0))/2, + userNutrition?.maxCalorie?:0.0, + ) + val calorieIndex = UserNutritionUtils.findCalorieIndex(energy.grain, calorieArray) + include.customKcalColumn.setImageDrawable(true, calorieIndex) + var maxKcal = userNutrition?.maxCalorie?:1.0 Timber.tag(TAG).d("maxKcal = $maxKcal") // 避免0作为被除数 if (maxKcal <= 0.0) { maxKcal = 1.0 } Timber.tag(TAG).d("maxKcal 1 = $maxKcal") - binding.nutritionInclude.totalKcalTv.text = totalKcal.current.format2String() - var totalKcalHeight = (totalKcal.current / maxKcal).toFloat() + include.totalKcalTv.text = totalKcal.format2String(2) + var totalKcalHeight = (totalKcal / maxKcal).toFloat() if (totalKcalHeight == 0F) { - binding.nutritionInclude.divKcalView.visibility = View.VISIBLE + include.divKcalView.visibility = View.VISIBLE } else { - binding.nutritionInclude.divKcalView.visibility = View.GONE + include.divKcalView.visibility = View.GONE totalKcalHeight += 0.1F } - binding.nutritionInclude.customKcalColumn.setCustomHeightPercent( - totalKcalHeight, - true - ) + include.customKcalColumn.setCustomHeightPercent(totalKcalHeight, true) - // 设置主食 - binding.nutritionInclude.customFoodColumn.setImageDrawable( - false, - grain.max < grain.current + // 设置主食----------------------------------------------------------- + val grainArray = UserNutritionUtils.getCalorieArray( + left = userNutrition?.stapleFoodRecommend, + mid = userNutrition?.stapleFoodNearExcess, + right = userNutrition?.stapleFoodExcess ) - binding.nutritionInclude.totalFoodTv.text = grain.current.format2String() - var grainHeight = (grain.current / columnMax).toFloat() + val grainIndex = UserNutritionUtils.findCalorieIndex(energy.grain, grainArray) + include.customFoodColumn.setImageDrawable(false, grainIndex) + include.totalFoodTv.text = grain.format2String(2) + var grainHeight = (grain / columnMax).toFloat() if (grainHeight == 0F) { - binding.nutritionInclude.divTotalFoodView.visibility = View.VISIBLE + include.divTotalFoodView.visibility = View.VISIBLE } else { - binding.nutritionInclude.divTotalFoodView.visibility = View.GONE + include.divTotalFoodView.visibility = View.GONE grainHeight += 0.1F } - binding.nutritionInclude.customFoodColumn.setCustomHeightPercent( - grainHeight, - true - ) + include.customFoodColumn.setCustomHeightPercent(grainHeight, true) - // 设置果蔬 - binding.nutritionInclude.customVegetableColumn.setImageDrawable( - false, - fruits.max < fruits.current + // 设置果蔬------------------------------------------------------------- + val fruitsArray = UserNutritionUtils.getCalorieArray( + left = userNutrition?.fruitsVegetablesRecommend, + mid = userNutrition?.fruitsVegetablesNearExcess, + right = userNutrition?.fruitsVegetablesExcess ) - binding.nutritionInclude.totalVegetableTv.text = fruits.current.format2String() - var fruitsHeight = (fruits.current / columnMax).toFloat() + val fruitsIndex = UserNutritionUtils.findCalorieIndex(energy.fruitsVegetables, fruitsArray) + include.customVegetableColumn.setImageDrawable(false, fruitsIndex) + include.totalVegetableTv.text = fruitsVegetables.format2String(2) + var fruitsHeight = (fruitsVegetables / columnMax).toFloat() if (fruitsHeight == 0F) { - binding.nutritionInclude.divVegetableView.visibility = View.VISIBLE + include.divVegetableView.visibility = View.VISIBLE } else { - binding.nutritionInclude.divVegetableView.visibility = View.GONE + include.divVegetableView.visibility = View.GONE fruitsHeight += 0.1F } - binding.nutritionInclude.customVegetableColumn.setCustomHeightPercent( - fruitsHeight, - true - ) + include.customVegetableColumn.setCustomHeightPercent(fruitsHeight, true) - // 设置肉蛋 - binding.nutritionInclude.customMeatColumn.setImageDrawable( - false, - meat.max < meat.current + // 设置肉蛋----------------------------------------------------------- + val meatEggsArray = UserNutritionUtils.getCalorieArray( + left = userNutrition?.meatEggsRecommend, + mid = userNutrition?.meatEggsNearExcess, + right = userNutrition?.meatEggsExcess ) - binding.nutritionInclude.totalMeatTv.text = meat.current.format2String() - var meatHeight = (meat.current / columnMax).toFloat() + val meatEggsIndex = UserNutritionUtils.findCalorieIndex(energy.meatEggs, meatEggsArray) + include.customMeatColumn.setImageDrawable(false, meatEggsIndex) + include.totalMeatTv.text = meatEggs.format2String(2) + var meatHeight = (meatEggs / columnMax).toFloat() if (meatHeight == 0F) { - binding.nutritionInclude.divMeatView.visibility = View.VISIBLE + include.divMeatView.visibility = View.VISIBLE } else { - binding.nutritionInclude.divMeatView.visibility = View.GONE + include.divMeatView.visibility = View.GONE meatHeight += 0.1F } - binding.nutritionInclude.customMeatColumn.setCustomHeightPercent( - meatHeight, - true - ) + include.customMeatColumn.setCustomHeightPercent(meatHeight, true) } } } @@ -718,7 +726,7 @@ class MainScreenPresentation( val faceEntity = compareResult.faceEntity val userId = faceEntity.userName if (userId == null) return@Observer - ToastUtils.showToast("人脸识别成功,userId = $userId") + //ToastUtils.showToast("人脸识别成功,userId = $userId") if (currentFood == null) { currentFood = activity.checkedItem } @@ -737,7 +745,7 @@ class MainScreenPresentation( return@runOnUiThread } this@MainScreenPresentation.userNutrition = nutrition - loadUnbilledMode(nutrition) + loadUnbilledMode() // ------------------------------- } } @@ -1058,10 +1066,14 @@ class MainScreenPresentation( .d("postUserData userNutritionData = ${userNutrition == null}, currentFood = ${currentFood == null}") return } - var eatWeight = 0.0 - eatWeight = if (mealPickupMode == 0) { + createOrder() + } + + fun createOrder() { + mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0 + val eatWeight = if (mealPickupMode == 0) { //即放即取 - recognitionWeight - 0 + recognitionWeight } else { recognitionWeight - lastWeight } @@ -1084,4 +1096,5 @@ class MainScreenPresentation( } } } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt b/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt index 074847f..c822f28 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/UserNutritionUtils.kt @@ -4,6 +4,7 @@ package com.sw.dualscreen.presentation import android.text.TextUtils import com.sw.dualscreen.ext.toSafeDouble import com.sw.dualscreen.model.response.FoodInfo +import com.sw.dualscreen.model.response.UserEnergy import com.sw.dualscreen.model.response.UserNutrition import com.sw.dualscreen.model.response.UserNutritionData import timber.log.Timber @@ -22,7 +23,7 @@ object UserNutritionUtils { nutrition: UserNutrition, weight: Double, dinnerType: String - ): CalcResultInfo { + ): UserEnergy { // 初始化变量 var totalKcal = 0.0 var (calorie, grain, fruitsVegetables, meatEggs) = List(4) { 0.0 } @@ -34,6 +35,7 @@ object UserNutritionUtils { meatEggs = calculateValue(foodInfo.meatEggs, weight) // 合并用户数据 + //val maxKcal = (nutrition.calorie?:0.0) * calculateDinnerTypeRatio(dinnerType) / 10.0 calorie += nutrition.calorie ?: 0.0 grain += nutrition.stapleFood ?: 0.0 fruitsVegetables += nutrition.fruitsVegetables ?: 0.0 @@ -43,24 +45,22 @@ object UserNutritionUtils { // 判断当餐最大热量 //val maxKcal = userModel.totalEnergyCalculateScoreValue() * calculateDinnerTypeRatio(dinnerType) / 10 //Timber.d("calculateNutrition maxKcal = ${maxKcal}, CalculateScoreValue = ${userModel.totalEnergyCalculateScoreValue()}") - // TODO: 测试数据------------------------------- - val rate = calculateDinnerTypeRatio(dinnerType) / 10.0 - val maxKcal = totalKcal/ 0.26 / rate - val grainRecommend = "0-100" - val meatRecommend = "0-100" - val fruitsRecommend = "0-100" - // TODO: 测试数据------------------------------- - val calcResult = CalcResultInfo( - totalKcal = CalcInfo( - max = maxKcal, - min = 0.0, - current = totalKcal - ), - grain = parseRecommend(grainRecommend, grain), - fruits = parseRecommend(fruitsRecommend, fruitsVegetables), - meat = parseRecommend(meatRecommend, meatEggs) +// val calcResult = CalcResultInfo( +// totalKcal = CalcInfo( +// max = maxKcal, +// min = 0.0, +// current = totalKcal +// ), +// grain = parseRecommend(foodInfo.stapleFoodRecommend, grain), +// fruits = parseRecommend(foodInfo.fruitsVegetablesRecommend, fruitsVegetables), +// meat = parseRecommend(foodInfo.meatEggsRecommend, meatEggs) +// ) + return UserEnergy( + calorie = totalKcal, + grain = grain, + fruitsVegetables = fruitsVegetables, + meatEggs = meatEggs ) - return calcResult } // fun calculateNutrition( @@ -121,7 +121,7 @@ object UserNutritionUtils { // } fun parseRecommend(recommend: String?, current: Double): CalcInfo { - var newCurrent = if (current < 0) 0.0 else current + val newCurrent = if (current < 0) 0.0 else current if (TextUtils.isEmpty(recommend) || !recommend!!.contains("-")) { Timber.e("parseRecommend recommend 格式错误") return CalcInfo( @@ -154,6 +154,36 @@ object UserNutritionUtils { return max(max1, calcResultInfo.meat.max).toInt() } + fun getCalorieArray(left:String?, mid:String?, right: String?):DoubleArray { + val leftArray = (left?.ifBlank { "0-0" } ?: "0-0").split("-").map { it.toSafeDouble() } + val midArray = (mid?.ifBlank { "0-0" } ?: "0-0").split("-").map { it.toSafeDouble() } + val rightArray = (right?.ifBlank { "0-0" } ?: "0-0").split("-").map { it.toSafeDouble() } + return doubleArrayOf( + 0.0, leftArray[0], midArray[0], rightArray[0], rightArray[1] + ) + } + + fun findCalorieIndex(num: Double, array: DoubleArray): Int { + if (array.isEmpty()) return 0 + if (num < array[0]) return 0 + if (num >= array[array.lastIndex]) return array.lastIndex + + var left = 0 + var right = array.lastIndex + while (left < right) { + val mid = left + (right - left) / 2 + if (array[mid] <= num && num < array[mid + 1]) { + return mid + } else if (num < array[mid]) { + right = mid + } else { + left = mid + 1 + } + } + return 0 + } + + data class CalcInfo( var max: Double, var min: Double, diff --git a/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt b/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt index 0ffadf7..0187663 100644 --- a/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt +++ b/app/src/main/java/com/sw/dualscreen/presentation/pay/FacePayPresentation.kt @@ -248,8 +248,10 @@ class FacePayPresentation( // recognitionWeight = lastWeight lastFaceTrackId = compareResult.trackId val faceEntity = compareResult.faceEntity - val userId = faceEntity.userName + var userId = faceEntity.userName if (userId == null) return@Observer + // TODO: 测试支付用户id + userId = "1987710988425662466" faceRecSuccess(userId) }) @@ -601,6 +603,7 @@ class FacePayPresentation( binding.root.postDelayed({ hideWaitingDialog() activity.showPayInfo(type = 1, isVip = true, memberInfo = memberInfo) + activity.hidePayTab() binding.root.postDelayed({ dismiss() }, 500) diff --git a/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt b/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt index e0529a5..def66dd 100644 --- a/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt +++ b/app/src/main/java/com/sw/dualscreen/repository/RemoteRepository.kt @@ -207,10 +207,15 @@ class RemoteRepository constructor( /** * 查询订单状态 + * @param orderNo 订单好 + * @param queryType 查询类型 1支付2退款 */ - suspend fun queryOrderState(param: HashMap): ApiResponse { + suspend fun queryOrderState(orderNo: String, queryType: Int = 1): ApiResponse { return safeApiCall { - apiService.queryOrderState(param = param) + apiService.queryOrderState(param = hashMapOf( + "payOrderNo" to orderNo, + "queryType" to "$queryType" + )) } } diff --git a/app/src/main/java/com/sw/dualscreen/utils/IntervalExecutor.kt b/app/src/main/java/com/sw/dualscreen/utils/IntervalExecutor.kt new file mode 100644 index 0000000..3ced4b1 --- /dev/null +++ b/app/src/main/java/com/sw/dualscreen/utils/IntervalExecutor.kt @@ -0,0 +1,64 @@ +package com.sw.dualscreen.utils + +import kotlinx.coroutines.* + +class IntervalExecutor { + + /** + * 启动定时任务 + * @param delayMillis 延迟时间(毫秒) + * @param action 要执行的方法 + * @return Job 可用于取消任务 + */ + fun startIntervalTask(delayMillis: Long, action: suspend () -> Unit): Job { + return CoroutineScope(Dispatchers.Default).launch { + while (isActive) { + action() + delay(delayMillis) + } + } + } + + /** + * 启动定时任务(带初始延迟) + * @param initialDelay 初始延迟时间(毫秒) + * @param delayMillis 后续执行间隔(毫秒) + * @param action 要执行的方法 + * @return Job 可用于取消任务 + */ + fun startIntervalTaskWithInitialDelay( + initialDelay: Long, + delayMillis: Long, + action: suspend () -> Unit + ): Job { + return CoroutineScope(Dispatchers.Default).launch { + delay(initialDelay) + while (isActive) { + action() + delay(delayMillis) + } + } + } +} + +// 使用示例 +fun main() = runBlocking { + val executor = IntervalExecutor() + + // 示例1:每隔10秒执行一次 + val job1 = executor.startIntervalTask(10000) { + println("定时任务执行: ${System.currentTimeMillis()}") + // 这里可以执行你的业务逻辑 + } + + // 示例2:先延迟5秒,然后每隔3秒执行一次 + val job2 = executor.startIntervalTaskWithInitialDelay(5000, 3000) { + println("带初始延迟的定时任务: ${System.currentTimeMillis()}") + } + + // 运行30秒后取消任务 + delay(30000) + job1.cancel() + job2.cancel() + println("所有定时任务已取消") +} \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/view/CustomImageView.java b/app/src/main/java/com/sw/dualscreen/view/CustomImageView.java index b4a2b87..060ad1c 100644 --- a/app/src/main/java/com/sw/dualscreen/view/CustomImageView.java +++ b/app/src/main/java/com/sw/dualscreen/view/CustomImageView.java @@ -13,6 +13,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; +import androidx.appcompat.content.res.AppCompatResources; + import com.sw.dualscreen.R; import com.sw.plate.utils.AppUtil; @@ -33,10 +35,10 @@ public class CustomImageView extends androidx.appcompat.widget.AppCompatImageVie private static final int MAX_HEIGHT = 250; private boolean isDrawText = false; - private Drawable bigRedDrawable; - private Drawable bigGreenDrawable; - private Drawable redDrawable; - private Drawable greenDrawable; +// private Drawable bigRedDrawable; +// private Drawable bigGreenDrawable; +// private Drawable redDrawable; +// private Drawable greenDrawable; public CustomImageView(Context context) { super(context); @@ -60,10 +62,10 @@ public class CustomImageView extends androidx.appcompat.widget.AppCompatImageVie mPaint.setColor(Color.WHITE); // Set your desired color mPaint.setTextSize(mTextSize); // Set your desired text size mPaint.setAntiAlias(true); - bigRedDrawable = context.getDrawable(R.drawable.img_big_red_column); - bigGreenDrawable = context.getDrawable(R.drawable.img_big_green_column); - redDrawable = context.getDrawable(R.drawable.img_red_column); - greenDrawable = context.getDrawable(R.drawable.img_green_column); +// bigRedDrawable = context.getDrawable(R.drawable.img_big_red_column); +// bigGreenDrawable = context.getDrawable(R.drawable.img_big_green_column); +// redDrawable = context.getDrawable(R.drawable.img_red_column); +// greenDrawable = context.getDrawable(R.drawable.img_green_column); // Typeface typeface = getResources().getFont(R.font.dakai); // Typeface typeface = Typeface.create(Typeface.createFromAsset(getContext().getAssets(), "fonts/dakai.TTF"), // Typeface.BOLD); // 创建Typeface @@ -87,31 +89,31 @@ public class CustomImageView extends androidx.appcompat.widget.AppCompatImageVie } } - /** - * 设置图片 - * - * @param isBig 大图 - * @param isMore 是否超过 - */ - public void setImageDrawable(boolean isBig, boolean isMore) { - if (isBig) { - setImageDrawable(isMore ? bigRedDrawable : bigGreenDrawable); - } else { - setImageDrawable(isMore ? redDrawable : greenDrawable); - } - } - - public void setImageDrawable2(boolean isBig, Boolean isRed) { - if (isBig) { - setImageDrawable(isRed ? bigRedDrawable : bigGreenDrawable); - } else { - setImageDrawable(isRed ? redDrawable : greenDrawable); - } - } +// /** +// * 设置图片 +// * +// * @param isBig 大图 +// * @param isMore 是否超过 +// */ +// public void setImageDrawable(boolean isBig, boolean isMore) { +// if (isBig) { +// setImageDrawable(isMore ? bigRedDrawable : bigGreenDrawable); +// } else { +// setImageDrawable(isMore ? redDrawable : greenDrawable); +// } +// } +// +// public void setImageDrawable2(boolean isBig, Boolean isRed) { +// if (isBig) { +// setImageDrawable(isRed ? bigRedDrawable : bigGreenDrawable); +// } else { +// setImageDrawable(isRed ? redDrawable : greenDrawable); +// } +// } public void setCustomHeightPercent(float percent, boolean isAnimation) { Timber.d("setCustomHeightPercent percent = %s", percent); - if (percent<= 0){ + if (percent <= 0) { percent = 0f; } setCustomHeight((int) (percent * MAX_HEIGHT), false); @@ -122,7 +124,7 @@ public class CustomImageView extends androidx.appcompat.widget.AppCompatImageVie Timber.d("setCustomHeight height = %s", height); setVisibility(height == 0 ? View.GONE : VISIBLE); - if (height > MAX_HEIGHT){ + if (height > MAX_HEIGHT) { height = MAX_HEIGHT; } ViewGroup.LayoutParams layoutParams = getLayoutParams(); @@ -184,4 +186,35 @@ public class CustomImageView extends androidx.appcompat.widget.AppCompatImageVie float scale = getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } + + public void setImageDrawable(boolean isBigImage, int index) { + int myIndex = index; + if (index < 0) { + myIndex = 0; + }else if (index > 5) { + myIndex = 5; + } + if (isBigImage) { + //使用大图bigImgArr + setImageDrawable(AppCompatResources.getDrawable(getContext(), bigImgArr[myIndex])); + return; + } + //使用小图smallImgArr + setImageDrawable(AppCompatResources.getDrawable(getContext(), smallImgArr[myIndex])); + } + + private static final Integer[] bigImgArr = new Integer[]{ + R.drawable.ic_gray_big, + R.drawable.ic_green_big, + R.drawable.ic_yellow_big, + R.drawable.ic_orange_big, + R.drawable.ic_red_big + }; + private static final Integer[] smallImgArr = new Integer[]{ + R.drawable.ic_gray_small, + R.drawable.ic_green_small, + R.drawable.ic_yellow_small, + R.drawable.ic_orange_small, + R.drawable.ic_red_small + }; } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt b/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt index 568c174..f232baf 100644 --- a/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt +++ b/app/src/main/java/com/sw/dualscreen/viewmodel/UserViewModel.kt @@ -122,30 +122,30 @@ class UserViewModel : BaseViewModel() { } } - fun getUserFaceCache2(index: Int = 0) { - Timber.d("getUserFaceCache index = $index") - launch { - _loadFaceResult.value = false - val response = repository.getUserFaceCache2(index) - if (parseResponse(response)) { - // 获取成功一次后缓存状态 - SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true) - withContext(Dispatchers.Default) { - val list: List = response.result?.records ?: emptyList() - val faceEntity = list.map { - FaceEntity(it.userId, null, Base64.decode(it.face)) - } - faceApi.updateFaceData2(index, faceEntity) - } - val nextPageIndex = response.result?.nextPageIndex ?: -1 - if (nextPageIndex > 0) { - getUserFaceCache2(nextPageIndex) - } else { - _loadFaceResult.value = true - } - } - } - } + fun getUserFaceCache2(index: Int = 0) { + Timber.d("getUserFaceCache index = $index") + launch { + _loadFaceResult.value = false + val response = repository.getUserFaceCache2(index) + if (parseResponse(response)) { + // 获取成功一次后缓存状态 + SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true) + withContext(Dispatchers.Default) { + val list: List = response.result?.records ?: emptyList() + val faceEntity = list.map { + FaceEntity(it.userId, null, Base64.decode(it.face)) + } + faceApi.updateFaceData2(index, faceEntity) + } + val nextPageIndex = response.result?.nextPageIndex ?: -1 + if (nextPageIndex > 0) { + getUserFaceCache2(nextPageIndex) + } else { + _loadFaceResult.value = true + } + } + } + } fun getCollectedFoodList( pageNo: Int = 1, @@ -155,7 +155,11 @@ class UserViewModel : BaseViewModel() { ) { Timber.tag(TAG).d("getCollectedFoodList index = $pageNo") launch { - val response = repository.getCollectedFoodList(pageNum = pageNo, pageSize = pageSize, foodName = foodName) + val response = repository.getCollectedFoodList( + pageNum = pageNo, + pageSize = pageSize, + foodName = foodName + ) if (parseResponse(response)) { withContext(Dispatchers.Default) { val list: List = response.data ?: emptyList() @@ -269,9 +273,9 @@ class UserViewModel : BaseViewModel() { } /** - * 获取用户就餐数据 + * 获取支付二维码 */ - fun getQrCodeImg(orderId: String, userId: String?=null, block: (String?) -> Unit) { + fun getQrCodeImg(orderId: String, userId: String? = null, block: (String?) -> Unit) { Timber.tag(TAG).d("getQrCodeImg orderId = $orderId, userId = $userId") launch { val response = repository.getQrCodeImg(orderNo = orderId, memberId = userId) @@ -321,11 +325,11 @@ class UserViewModel : BaseViewModel() { } } - fun createOrder(order: FoodOrder, block:(String)-> Unit) { + fun createOrder(order: FoodOrder, block: (String) -> Unit) { Timber.tag(TAG).d("createOrder") launchWithLoading { val response = repository.createOrder(order) - if (parseResponse(response)) { + if (parseResponse(response)) { block(response.data.toString()) } else { block("") @@ -337,72 +341,60 @@ class UserViewModel : BaseViewModel() { /** * 现金支付 */ - fun cashPay(param: HashMap, block:(Boolean)-> Unit) { + fun cashPay(param: HashMap, block: (Boolean) -> Unit) { Timber.tag(TAG).d("cashPay") launchWithLoading { val response = repository.cashPay(param) if (parseResponse(response)) { - block(response.data?:false) + block(response.data ?: false) } else { block(false) } } } - /** - * 查询订单状态 - * - * @param queryType 查询类型 1支付2退款 - * @param orderId 订单号 - */ - fun queryOrderState(queryType:Int, orderId:String, block:(PayResult?)-> Unit) { - Timber.tag(TAG).d("queryOrderState") - val param = hashMapOf( - "queryType" to "$queryType", - "payOrderNo" to orderId - ) - launchWithLoading { - val response = repository.queryOrderState(param) - if (parseResponse(response)) { - block(response.data) - } else { - block(null) - } - } - } +// /** +// * 查询订单状态 +// * +// * @param queryType 查询类型 1支付2退款 +// * @param orderId 订单号 +// */ +// fun queryOrderState(queryType:Int, orderId:String, block:(PayResult?)-> Unit) { +// Timber.tag(TAG).d("queryOrderState") +// val param = hashMapOf( +// "queryType" to "$queryType", +// "payOrderNo" to orderId +// ) +// launchWithLoading { +// val response = repository.queryOrderState(param) +// if (parseResponse(response)) { +// block(response.data) +// } else { +// block(null) +// } +// } +// } /** * 扫码成功回调 * - * @param queryType 查询类型 1支付2退款 * @param orderId 订单号 */ - fun paySuccessCallback(queryType:Int, orderId:String, block:()-> Unit) { - Timber.tag(TAG).d("paySuccessCallback") - val param = hashMapOf( - "queryType" to "$queryType", - "payOrderNo" to orderId - ) - launchWithLoading { - var orderState = false - while (orderState.not()) { - val response = repository.queryOrderState(param) - if (parseResponse(response)) { - orderState = response.data?.paySuc == "1" - if (orderState) { - block() - } - }else { - orderState = false - } - } + suspend fun queryOrderState(orderId: String, block: (Boolean) -> Unit) { + Timber.tag(TAG).d("queryOrderState") + val response = repository.queryOrderState(orderNo = orderId) + if (parseResponse(response)) { + val orderState = response.data == "1" + block(orderState) + } else { + block(false) } } /** * 会员支付 */ - fun memberPay(param: HashMap, block:(Boolean)-> Unit) { + fun memberPay(param: HashMap, block: (Boolean) -> Unit) { Timber.tag(TAG).d("memberPay") launchWithLoading { val response = repository.memberPay(param) @@ -417,7 +409,7 @@ class UserViewModel : BaseViewModel() { /** * 绑定订单 */ - fun bindOrder(userId: String, orderId: String, block:(Boolean)-> Unit){ + fun bindOrder(userId: String, orderId: String, block: (Boolean) -> Unit) { Timber.tag(TAG).d("bindOrder") launchWithLoading { val response = repository.bindOrder(userId = userId, orderId = orderId) @@ -429,7 +421,7 @@ class UserViewModel : BaseViewModel() { } } - fun getMemberInfo(memberId: String, block:(MemberInfo?)-> Unit) { + fun getMemberInfo(memberId: String, block: (MemberInfo?) -> Unit) { Timber.tag(TAG).d("getMemberInfo") launchWithLoading { val response = repository.getMemberInfo(memberId) diff --git a/app/src/main/res/drawable/ic_gray_big.9.png b/app/src/main/res/drawable/ic_gray_big.9.png index c14f79946b385a7cbd4b44697be2f1887489e71f..779db93f94e9f17540907c905a5a4eb1476ccf1f 100644 GIT binary patch delta 63 zcmaFL^@wYN3Zv#mRc=-zg*Jhxj=u|P6=!tDD7J_l5pd#8;#k;vL_kQW@DB5l)|j~Z SYtMf$0D-5gpUXO@geCydCKmqy delta 66 zcmaFF^^|LZ3Zu?ORc=;Ohp-z4tpA-1gbiCRG)XvRIPxfN5ts=ikEpawn9%W9Zh~oi UbllF3{R}|h>FVdQ&MBb@0Q6}V-~a#s diff --git a/app/src/main/res/drawable/ic_gray_small.9.png b/app/src/main/res/drawable/ic_gray_small.9.png index 0ca186f76279dc363108c2bc70f975c951dfc931..35d0ba2188ec3a6a3269a48ee5fcad1b6963561e 100644 GIT binary patch delta 809 zcmV+^1J?ZP2I~fpBmpv!B`<&5xdk+WCK9zK(&!VIxN=9riiOb~vJrGV|0y%J=T6HM zrqI%RlHY>%ew_20d+*%R*QcWULerjJ(9Qgyo)*JIgvb&rTH4ysP4PuD#U}AxGp%3r z_a0%_LZ9#ByJ{P;>GVNg8slIrj5&-sFc+V{8>2s#DqYgd;%zECM+JXZh;1tVFPGCU z4(8e>D#!u3L=%O}$c-o4Q88i^uh8naL#*p&=?5>YgZQaaj>r``^Eyr=`eUZJPEY;; zCAH;~a94obof?e74b;SoY+KwNEncK2YS3A<#gpoKP!rXL8hPEJ#YmD4a8s=6J}-eY z$evScQVenrM~-MBKY)L8?<8LoodRk`?a@qrfO`oXk;vM4%@9*G*l#{TuK@?d6r6BR zO(SkBU8VEl8y~ReAt!Ldeffr#7B{KWjx>nEWe1M9x4MWLVn}V}!-1n{MhtO(PQ+8C zYr1Le@=l6ISi5jmC($sBbM$ulDmPX%1J2;i6RD-FTfC7X7;t~*iKJy(<_#1%~a0YjEB0=tPS;-6l9Kn_AO%e%a zpM0?6V@pzJMHPRzfumYyz9QXiuFgyuIB~agAdvuv=)~L`wbjk)R)z~W;hqi^=`#Op z!_MShNrU$as2vWtmzG7kU`b=pURa^15w-elV?SCF>GH5pu_x!(?c~IBDS>VWHK8`t z$m?##kwn&lCx)}5o24Rm)DU#_`EhKKwcshvEWC5J#OQzcvXpSAfZUKHa&2|xH6m1z z93+WLE1ouf*eC9?19AyV9H*@!{lN7BZ$MmVrysp_3LKk#ZJXIO+n9do z+|y7zRt+w`IP`15XZQ|n&=!5r7h_;7jES)^N29AsJ2-KXXB8zfB$UXIP$EOZ^(cLz nXbrU@LqZ*i3<*!9isQ#W+Jg#7mW(CR00000NkvXXu0mjfovMYz delta 810 zcmV+_1J(TN2J8lqBmpy#B`<&J+yWXw6Ny?AY4iz9T)87*#lq+g*$6tG|CAZqbEjpB zQ|!=tlHY>%ew_20d+*%R*QX+Sp=poL>1J_I&x&CpM&yZAEo*J+rud|pVvG2ynbr^b zd!MlDq0bNSU9FASa{8bzjd3^@#vH~Rn2XOJ#pq9D$`>@Vbdw4%P{DsyVuyBbC zCAIC7a3nzPP7TJ=HPpn5>{#3$EuE()YS3A<&6A2esEKMrjlAyAVkAumxGC0jpO?TX zWZ$VZEe5%VV@Ety9Ke6McakrPZUHr;_IR#1z`X>HSZw{QW{4>o>?fa~*MI|J3QoAE zmXS1;FVlJPg%8;CkQ2D!zI;Q=itE&AR~kg&vI|GtTSLSRF{HNg(ZEqWCx*B`Cz6@+ z72UM0u`V8ERx za>4pw-|B3G6gEBt{gID@+ek)ZIfqGSdDj^N7mCW!>I zkKWnIv1O^Vq6UB5z)`(3Uy<%MS7)XSoVeRLkVt?-bYkw6+UjO)E5ikxa8E~ybeVs$ zY3B+rq``Xy)D8#SOWPt{u%t0)FRW11h+6%&u^(-Tbh*D&wI}B{?DWJ_DS@binot{R z{EAFrJ_0w=EU5{0l9=Fj?+<*e&G6mHy|#w(+^%d1&+Ci|quEuZ6P&on(~1%q5=vx9kiwcw{)M7F ol*o`!B10ZRi3|xxqKa_h53pnnMj!OjcK`qY07*qoM6N<$f{XW&&j0`b diff --git a/app/src/main/res/drawable/ic_green_big.9.png b/app/src/main/res/drawable/ic_green_big.9.png index ead5b82e426b22a6fc8bf155f78066565d1fc81d..4dd15c2fd7107c8f1cc796709557fd2739bce4fd 100644 GIT binary patch delta 1357 zcmV-T1+w~>3zZ9yB!656Tq)yR$RrB%ds7@7#OO`F`il+?nm^k&sAL9D4R1yMLJ9+*{5+?s)E)Q&i8; zXWlNUY1>mLY+s#rO71z^bHBAq?)UWl&rV7GMxTGv_t)w3U-}Hd&41%N`kVTd+W)AJ zp<{I))R*p)`og*rzg>d=sldjudh7*h~5V{d)so%=B61F$KlRCM^I~BT~YqmGJlk43uoTA!A zcdLIzbS9(#tu1NHb&rf(@x>kTfGPbz<6JSngX>=x_U!YPBRh#KaTS_#AA~_S9ZL}h z2`PqFiY4v?9r{;F5eEo==?B_#KlIRzhHNi03bd~?L$0iL@kTa zfs?PutL=;f4}^x;c^e^P5*t9_&)fZlcZVv5v4+CpQl`-+CprZ_tr^c~Neoe5nHG=;WY?^O)} zwthJm^viZMH9$*$Xv%fIZ9{-<=L^Ax5B3|K3*7}YgqB?2rVUYL%V&p!e%XO^9ncKg zaXq7G$`Ak!+qgJo3@RiOXtmm^P)pN>sDkUz;KFOh1cYP&Z5rJxtVGL(sDgd$;QL~X zqyR1WvxR23V?$Jd8}%!6d3Le(P|Z>MR#pT~Y=)>Z`gI|H*!Rrgw5#Xhd5LQ3dbWhtJF|o8!bjBT1n#s2OU98lslG zzHzc9hTz~@how%xYL}O2CR7vD1~rP~zMvU8Vu)Jc_>r@-!9%Ct(09mLe0PGJkvnRD zTC{r=Xhg?<4H3oYS4Z_Pcs4B^q%(y~Qc2Hc2Du<7h1?c{i+>6Xu3FVy>7o=8hbAUP+^C4ABTYn#Hwt_{@=D=#y!E z?Zp|0y*Wf#PuF7zgddXP1`SJeUpe3SnF;+3Z6GdGj={0$1AU=S^o=nv7RJQbm_sv< ziIYew3?ama7(%E+3?bA}^@H&TA)CkwA=Dv;5b6*^2z7*ppum5GY@_3U_67QRdw`I} P00000NkvXXu0mjfTf>X! delta 1359 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 diff --git a/app/src/main/res/drawable/ic_orange_big.9.png b/app/src/main/res/drawable/ic_orange_big.9.png index 08f5b4445de2b094ac616310c26520cf8b311563..c8925b106725e2fe19819838179ba2f111f9c83d 100644 GIT binary patch delta 1331 zcmV-314)! z*~QtlJ?|_1M6^2|&pgkw_IP$tN=m9qHUFLZz^|)a{+Qb5*MFUnhNmZePoHVj^-SRE zE57IaMa zobkEUE{uhbPihcFe@2b!E{H?BVL^*fs z>KhX3x4^CaL7%95hLBZ<=8U;R184zFxK5R>`BC*b-Ge7dgg;4yXNEwQ15F}rpb=@s z^(%daO4S-;YA<~f&eLRXaRG$xM4CZ6(hyp5eM?h|o`2dMc=`fOCg774`h>KErqGt_ zUC5$E(kGPY30h&_FeW49jJ^S_ACuyY}GE>9Qf z{)H`HK7SCQQ0TRQyn<)k$6Tu6sRNX}rg>ta*ytubl^o!H_FYQ{)rS;>-z%|wY%B1N zJcO6r-<~S^7SYxJ8Yd9S3A`jvxzAgw1y}8%4jvkv3gw18T_kV0-(72AOzjUm{le%> zs08q~Ngi|GI~FY-zmg56>Jx2fk=NY+Ox-@Lc7I}3$`2N*if+Plo`bY}uQqEQBvhN) zEYCqy_yv#ISg-+j&-0*Yp&^f#mICiHVQ7x4{k)N27Ym;HHVp(NWQI2o>;f4`13|0J zo4kQw8~SE@AXdxY}@EV?P8VK;}bo9S~jDv-00gvHzyZ0Rf0kGnfP*fLq z3y-<)n+75YMRVNjOei<-v{M+~83^$IWPkif!aEhp3A}`-+~+L^0<@-`@R96fmL7Nr zFS)-x2O{C+FY*LZM&KE|<9>Fcr$7KC?8yo9q(U))SMRziw9|7S5^x`Sc+4DtPz>Nr zx3$7%^c{$VHF}PHAiJA|0balp?$cIz??5CVjrjUh_AUkwG>7*6ToE|A1tOs}<$r|F zf09SlK>&@RH8kfw^h@r6Xa|=rENbM*BtM`fG<~1jLN~TG5DEC6{nbP~k$V!3o`Gi2 z4jMvBu5X?UBoG|j>u{;V0w|EJaRX=qZJ<#e>w;bwN+8-vt{y8J0kQGB6U-TNhX#YV z3Up)Wf#}5R$#`e&>B;!V8&z6^V1F){6Xu3FVy=At!=#Xb=tOHOzLLE7ITjNeFUvm^ z^NNBoVQd&9#)>gx?3e?eSJ5aL_}dhuOcpZ2r<(g zzdy4{Jopc+d))P=C(jCk2rBp&c<`i%Cn0L4dt!p0yU~b7Gxokuce`Vj&+}S zK)-)Nzklx9dYbq^KhM={Yo7kLK=_L+gul~s#5-aN$ArgP56~C-MBl+Va4tG$cy6^B zW8veIT7h~qpw@ba)lL$Bn9RIHW?c6i>mmI+CzdRbMwNT`dR zUAax4s8@!NMTh2$xkCeJ0Zq70g|3M~wT14%qa?x|65&5XpppYk0&SoXX~p%+efdgN zYC~!deG>kr$v)!(2<-_pgLb4LwB-8crluUV-E;ImG=CY7Pg3X-(h{0NTdsE|ixx@i zDbXXe!hU2-Mo1a`2wJ}<&AAVKuNQ-A8x8I%J(qtp2QI86&>Y&s1MW-D>*b)@?%I`G zUUG9s=mUWV4Rzw1>ssDwvWpSydw|cCHJ?Z z3f>~x`l)dOA)mlY@|63$teUjdZtCEz(W#Jc$kQqEmiyhdCWq8s&(WWZ&V)h$Z|meS z_q}D&;&F#;FcqI*LyNrT{wM1BA+-UkQhu;dRDX0Gp7R{U7!;Np&Y<_WFQWNe_@sX`JCBMCIygqI=7K#l# zkNh_Ru`p)&Q%B5$gkl1(;rWt*0AK$I{uhvOuuv@EF}!Z}zGWZ)R-6)w;sS5sG53AR zKt!Ra51X9{`39c03d2tW0ltlfk0iWPA%CC1OL)qCUUncrW8CuJ$xdeOfrs#t``d9K zB0is&Cy+b>&)^;RvlSf$0w7@@PMIeavI)HU*;S#Ljsp>a`_S7H<^Y6j0B_o@6_%pw zKt#;bbL<=0-OLQ|0-kW6mdh^(A_8f|>r>gg=snOJ+IMqB;G`Cah{l-Ze>@|Ps(-xz z8bfPn&VA^X)C18BE?rpE$dgHWKuc))E4PJqtY{!2@SgqaNH~#K5{{06X3!2ALQAf1 zn)Dgxvu#I~U%2VFaGdVG2HxFbI!n_=LhR+^5^^nc#0| zgSI#Z$D$APg+9?Y&Vh5`oH#eefU)rL<%vQBLP!q@gpdGHkU$7A5(puI1SLX9Ab}7P iNFam+K^UZ@n(KeKj+K2ZsgwQy0000$F;@*L}{XItOs{|R+s*R$o3Z(ApktRR1D zR$TXN;kYIFfeKzF0d@L&YRDNC7%LoeHOxUcKOAubx#{_4Dk#xuni(seU8wqw+&2o# z4D!II9K&42v|h*919z4Zxl4EbBQ2{E~m;55i*8q9nMTsBmVR4aegta}(b+*xsxHtgzH9~4ujw5!at&^DU$Nmj;y&3wG&^Aw5 zGT<%}*;qCkFv)md(aYJa7ePaMvXg9KTRc zA>$&Z8#sciwl_m0_(Kh9JTrfL0yl8f=`2=cdztf|X|gkawwx1*1lUA>J?Etk-~cY* zME7*A$TlZ*2M(T^olgp=9S(Fa1B+~fDUD7iVTPhc)Ec*p;}}R}o7QV9_)XJ%d)`bS z@1Q2sh8p#{`!STrPMR-i?|7DPsmL8QpccKpq+D2JCoNhAM@zIMp3p;!{3A2rtbp8* zBXUK~dL6@%sz@CykK^U=Ztqdz_5UCjV`6ONfLsP$vPl`K$T)C(z!MM$+QX%=z@Lj& zuusMAE`*Z{11T<8WJ<8el!!d)UoeBgGcqMuWJ*LLIW8Xm0P-z)zC1&NApigX07*qo IM6N<$f)Vs&ivR!s delta 775 zcmV+i1Ni*n2HysdB!4DJL_t(|UhSC6Zqq;%h9~20Sn&jGK~#thOZo;#Y*5uEc4!NQ zs@y8xAX_95FTsXgHf-oCAhGJMrMA;h^@0RyQ=~N1oPVsi$&8aa!3lPAj`XQjGM+i- z^UQc0Avp3ETeIS-R}y#JqIlq!wR9z7XwE=xzhcqs1?O+nz{}BBBmFz0cTwjgNl%JF#T#aX8HkVa2JW(E{T76y%CcP zxQj%(PT`Z@fJp}2MIwDW%Re$?8~i|XF4D1DdIKgIWt)QvO+FCoNhA$1AiX9??UK{6jP0tbp8* zBXUK~dL6@%sz@CykCWB#Ztqj#_5UCjV`6ONfLsP$vPl`K$T)C(z!MM$+M|`Qz#q$2 za6rZGEryc|11T$@kVU2di%ba?nG!5AC0JxiD2W{D#9w#MeY)~^E0+KO002ovPDHLk FV1kTzVl@B& diff --git a/app/src/main/res/drawable/ic_red_big.9.png b/app/src/main/res/drawable/ic_red_big.9.png index 4b30e9c894848544a562f24e4f7b473eccad1edb..42c5828b236f4dccb421d74266b94e7b93b45b7d 100644 GIT binary patch delta 1281 zcmV+c1^)V&3Y7|wB!ApVL_t(|UhSGqiyT!HhEFBYsHjUfW;LSQfQTpvaqr57OaFkl z^AALq>MpKaD~Mt+aXK@`j|hn$Bqqdw8g!H)F&RM-qi%xZwC~gDD!WcqdZs7U(_MAX zfrp-tTXpY!-?wkot!}fZs4mqpv%QOE3rl8C==GWR&7SX>9e>o%hxGcUUVGxCIIrJV zdRcZ={4V}p%(ClxT^Ic!>%+hCzu)xwGskc&=TKk0;W;_?LHeT4Vc!dk#g8v)3iYD{2d+cisKsX^HugI3h7u z2SQiHZySVVm47)gH|D4nWuKpa(xrFJZVB_K1bRVYy(@vP)Ck#W26NWj(Eu&b#Ou`Q zk^m13uk-JTKfFN6gC^1jjnK;L*ZS(4Wt!aMn&ivkVnu*pJZL8E&=4)XzOAWcv;9i= zE1Jxu$|QsBAuZ7qZN1)eSsLuUx)wes&Q>N9GzuD{HGi6WA7);M%^uQ{_L>s>ryqDQ zWzbyOZMK}R4U(E%(8!L1{TbafhY0?kGyY< z*AcUOl)_hgHy-a+1{2H`*YOI^ypN5PPX3gVce$qHV4jg@c<24xc4_IkODBB2*Nw-= zsj`8Gcz@~rov3t@1#zLKgP?`rC7ybpw^Z8SKBj|z^(PJ54W8ny_j_y|H9Me#{_-aa zx&hwevG={Ube(xP9xx?1MlVY}j^?ZhDiMIcVwo=SrtEyzF-h#&0s zN`oLRzE=i{K&;uF{f})|rBRRucuxk3K>VU#zKc~NS@50=lmbCQPTB5C8N1hDIfP;?i(Wmn;SziA*~ zMF%WLC^`q8;;r|4(?GzgmXz3zb_cw~Q}6SZ0|8fb)A42OK3WeR;-&X@;y~nF)G`x0 zkoJLRc<24BW1>I+2|HtZ`p0TI4(1Cy!hfsHR)tX}4nz*uq0i$oGPmH(xO;`0vF$+Q z{G?7li(t$Rc!4M0r>%0!fyg0^e0&BXgm<3uylQ;{m`NZ;A@O|Tc3zX`4*7!w1Hzn{I~t(Hv{!*~ z%sdcvT#_JsgXgT4N!}@4x(8t{%!#=%N9OA1KTGB^5Or`T&AaCty^9c&2QMddZJoyz zg)uQU#>iM1Gh=UZH!v+)6NqtKm3q)zYxxexw}P$MIT^v;98>s;*rzgxZQ6%~NTw}k zHy-VJGjsSKZH^0$;Zs7+!MQjm=cW((qEGr}42;E(uT69!5J7W9Ac7JRh@eCSA}EpP rq4JL)O=5)zN<<)n5=9`QqVoC=vSQoDCFTC000000NkvXXu0mjf{z-n7 delta 1284 zcmV+f1^fDy3YZFzB!AyYL_t(|UhSPtj}%oDhED;C8g=PLR%3KaVvNy*1oy67xbzPY zcm4r%DeiFPS`(v@2uw30en0|#1cV?7AJNfFKo}E^5p_cxr+uHMyX-nu^h^)c(_MAX zNuKl!bF1#X@B8+xy49Uv78TW|I%c+W-fV8cY>!@FK5F)A$A4_Uemy)kKQjFGW2X2#AO{Jf$zP?tPeg9Wr}LOWNB?@SlF* z!Gu9`X^#iqmn|=aV7F5GVW;?TCzuYac!4M0r-_$3eNw4>e?H6ptr%D^MS7md8$9y9 z)n13q9#IP4>fCv}TN+F-Q{2WYJo7%*QabsIO5XK~j)Pf7p5dMMbJL}z=OLZ&olZL* zAE(M19)IGc_jjz)N#?}GiVlJXf|q#eecn)MfBT#c{?(r}Xf}9?x8CoOb;NA14*JWV zENBOKi^tyg%F=b_>3G1D0P+~Gz5j(eWcFC>Boabid!GkZhuB`Gio7p`L3f>dOO1l0&?@o5aDN~U`UXK-kbyi9S~AZ220>yd1OEpi z%Wjn#1gUW=4@7*gAs_>JAQrOhAKxHI3o?)g;)HFBkG2zs4CH}0V>?O>g0vt5c_4nU z`%4XiwD?{b$OExr4|YGdZKXy*8sI${$OG|M6%#L87KsTgq*hRrN%+KIVI2W zzJC-5xNZ-0k6Zbmpq=0~o)7#l1pLI)8x92A&`rlTvHNH|c!-zY-?0NR;Hs9H z*nu<;Ji|NhXBA@w0!Y|d+tEE%(Qzba2@(8E+aDw-i*3exEq@e z#DJgF>6a0VnE@~G#QU^S?l}+xNFyJg#wXbi)ro_~ zXg$t7!g|ymh+$Z|zEyH#XHp+%iKh2*Ss2Ac12JGl30~3!xa0jSR*tbjGqgiPw14#a z*2$Ix!o#)hJ1up5)E@U7WzYm|(5R04f^nEiAci6FeByRNljjcklLQ08oS8cspv9zD zfl*975LH~0Abf-8oR&%6DQ&t3VJ^&xxiLrP>gPXAW-<^}a3{^X=aSw);rb7(IN!o>L7XfA00002E7K5Eq~2w6Hye$&(zPZd;+(MB5qvj8whUPxbPjsH|SPSd zEQp*4Mb3hYcz+pO!}}U|0p5o}unB&GEf8f{2!h}3&o<++t$%B3%)wmD$=sZSbLsiV zF#lLt65%~-OO)Y1HG~+ojH)~)mw?q!JHeGC~0!1IaEph=x&x3EC#!3N% zerJuWl{M=={zn8TnB46v2i9lD{TtTV4j zvX1Zl1AlvFI?%~_`|F%bB;iA}E_2E7K5Eq}{y(@+qG$K~1;Prw!gLTp&V8z8Y^!-97}yg|1}AYOtEY$&2m zO3FXItUe&VMxx=3p-7WNyyEx%B*H z3=a(*LPO{AdIc=iL_R@4Tg%Cjb~q>IW(}<6mdIh&ri(39py;EwMJ}M|dGOWISRsJW zZ>*8EvS!`K{|FC-oJ3()QP{dJxHO=4_5iV`*pqHDx0n|>h)L&4EpHI)3B9pL-FIej zv$IKD_Z^$S6o0bKUb$&$4-*HH9SNU%JG)U7g*JPq1MMYs;P^0$B$tq^<(QyqwCI9P zw5OqgJ8%pat~e4_8#tjG?aLV$cp7|9Br!thhK{tizQBMpzI~O`(4s5tFO0g#aV*`R zj*AQza7AZ*66Zu_@If;%*cc9+(OoPO%k*4gkdX?y>wgvL>j6eO=q?uN7x+(x!UK1I zMRxw@OAa#9@H-aSkV^ji%LKZMMLw2Yi2+7B=q?udM)oEK80nz9SmbBfA3T(q#2{lh zbVhfv$S*P*yqA5!q9g|!Zs>~6=&nyBS;I1|naq*U5nV;z5+cc446v0s7`maOUT02` zWCP#(2Y>d=Oh6|a-LG>hk%SM?rtAsowmL%xbU`QD(@2pKo45nZ6+UOOcRJ8s#ugdD z9qJj9R$+y*NA?=+%A*)dWW+}-?^jsn_owg~%AVL8d(?doVB9I diff --git a/app/src/main/res/drawable/ic_yellow_big.9.png b/app/src/main/res/drawable/ic_yellow_big.9.png index fe24f3e4f3c42e6269697756ef6abbf40bf7cd91..4beae736966df730ef814cf697e1160c3a55aead 100644 GIT binary patch delta 1356 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 M07*qoM6N<$f^LJ6iB z)X1XTSb1PF{VQrjt*BY-qvU~i)?|&R=pDaj8hTnRxKcpv=pokEaJr{07M&!UHI$4FoBsA->jrTn5O7qkp| zhXc`z=NRs-JwS=N>6T(mUZBdb9cbNfB6=zsiT=jplprM~RHWcW^yM0KKAfQm%PvV2 zn=HeT=q)eetf5AIls!O>;!LX%{n?RZ!4ouSMVh22#0s3{N#uXw@P2xBHC+ZPiU4PD z=ZK_jS|<)tc!M4{>l~3}HYyHKcmwVnkyaW1lc54w%oVxeGC<*h1k?XGBFCc5RrvVl z4`b1$j3e^nvrEzdg*V{N5&13FE)7t41MVD=naNxH!;=frAVqQD4DK9}eCjq|O?L9p zhfUI8g*$MyI@*89;Vw@k_z~~mi3jo|MLuu@S6Oe8NU&^n@TA(A1%Vql%5~-{GW#)~ zQfHJK+E>;6(KFUy)gUk9F~x7a=KmwSeB?K=iU@ky)^% zXNRs-#STS}vqK@*kFgtD5}9Rv{3ieM<~pBzd|oP`(m{Vu=nXxJeHUX}B6ImQdV_y{ z)yk(TSSo5q59meg&nr6?nadiTBTMhv_{_@?AAi&$6t=5H~Ux%YhrEGfLc(KSf?NCsz^6*`+x%+PX$YF+w2BE(H9t+ zogTbs-=|$o47Bi6w3#RSo9vrkJcnIQG!i_Sh-hamL%(7% z{kFxldnVJKScVoe4Q+;ATcp2#(9aEm=R)sq{(W!J9*a4cOF8UZloNlsu?E%>*RQzX zfxteiUps8E;JJ82yOUu05H&kbWJEc;2iDT&?X{@})bfrs96@bjy=4_~qy8A}j!=SW z1~sxIH&z~)O#gx!Q7dW|`zU$flQmi6Df-0knueYh3$7GUJ9>!qH=Hi%ZcQ5Xhs=l` zrXtc}QG0+i?btAS6#IYnEpUL-nbT{!d;yFh8Y7bDN9=fGimlvoqYzJBooQR%^Mq;4xI3-9)2^A^05q-G^oeyVd!iq~0 z#TF}YBznt>IBTd;m$C=QQJiTtqCY#5EO>$jtxA&=g;<5NJc)li9NtgQuBOXiMG@c( z?i`V{P3y!#3UAQkW}PFF%tpll3U9!jBho74e=<}6OSvL9T?QyTkYM_6N91_4xe6cu z{9!!WlyO9UczRJ9pzsFVIU>KtI-~&#Z@`@+GBb6PzkhsQ8l)%=oWY$Vl26~_YsoG? z_Mk}`tZ)ae*2aIjINarl1mEMGJaJ#1q{s)3;414)5(!q!PM%advmkH-N4d^iMP@Ja zX?12wzzN)lz6y#2I7AmluF^JEyAuxJ0!~Cv{}h?!*LXLdeIAmMR}1JJ4n!~87MTTG zdT#h~RqRmoI5!+}y^P)1mdGp{6F2zh*Vp*eqgJVaN(X;Ep*Qp>_Faq}iOl8a*meHt zWgDNaV5z7bJ)jq{Kd=0^$XwRx99e$b&SzhQ_{75&so-(}wV_7Tikihfc7m@WMb=Z@ z{M%>;UwGBV)6XvP$-&l=-t1#7tckTz18PA{Vx4}lt0LXN?E?;QJQXazX}25vNMB%R zc4p{;eV diff --git a/app/src/main/res/layout/dialog_waiting.xml b/app/src/main/res/layout/dialog_waiting.xml index 8904125..4746621 100644 --- a/app/src/main/res/layout/dialog_waiting.xml +++ b/app/src/main/res/layout/dialog_waiting.xml @@ -16,7 +16,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="@color/white" - android:text="请稍等" + android:text="请稍后……" android:textSize="22sp" />