保险服务优化
This commit is contained in:
		
							
								
								
									
										1
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,4 +1,3 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="ExternalStorageConfigurationManager" enabled="true" /> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| #Tue Sep 09 14:41:15 CST 2025 | ||||
| #Fri Oct 17 18:14:44 CST 2025 | ||||
|   | ||||
| @@ -29,8 +29,8 @@ android { | ||||
|         minSdkVersion 23 | ||||
|         targetSdkVersion 35 | ||||
|         versionCode 2020 | ||||
| //        versionName "2.0.20" | ||||
|         versionName "2.0.20-Beta4" | ||||
|         versionName "2.0.20" | ||||
| //        versionName "2.0.20-Beta5" | ||||
|  | ||||
|         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								app/src/main/java/com/abbidot/tracker/bean/CommonDataBean.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/java/com/abbidot/tracker/bean/CommonDataBean.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| package com.abbidot.tracker.bean | ||||
|  | ||||
| /** | ||||
|  *Created  by .yzq on 2025/10/16/周四. | ||||
|  * @link | ||||
|  * @description: | ||||
|  */ | ||||
| data class CommonDataBean( | ||||
|     var taxRate: Double, var surplusSafeValidMonths: Int, var reactivationFee: Double | ||||
| ) | ||||
| @@ -3,6 +3,7 @@ package com.abbidot.tracker.retrofit2 | ||||
| import com.abbidot.baselibrary.network.base.BaseResponse | ||||
| import com.abbidot.tracker.bean.ActiveTimeBean | ||||
| import com.abbidot.tracker.bean.AlipayOrderBean | ||||
| import com.abbidot.tracker.bean.CommonDataBean | ||||
| import com.abbidot.tracker.bean.CountryCodeBean | ||||
| import com.abbidot.tracker.bean.DeviceBean | ||||
| import com.abbidot.tracker.bean.DeviceDetailBean | ||||
| @@ -55,7 +56,7 @@ interface INetworkService { | ||||
|  | ||||
|         //亚马逊服务器(国外ip) | ||||
|         const val BASE_URL_ABROAD = "https://aws.abbidot.com/abbidot/" | ||||
| //        const val BASE_URL_ABROAD = "http://192.168.0.229:8080/abbidot/" | ||||
| //        const val BASE_URL_ABROAD = "http://192.168.0.220:8080/abbidot/" | ||||
| //        const val BASE_URL_ABROAD = "$IP_SERVER:8443/abbidotServer/" | ||||
|  | ||||
|         //亚马逊服务器(国内ip) | ||||
| @@ -1267,7 +1268,15 @@ interface INetworkService { | ||||
|     @GET("order$SUBSCRIPTIONS_V3/reactivation/fee") | ||||
|     suspend fun getReactivationFee( | ||||
|         @Query("orderId") orderId: String | ||||
|     ): BaseResponse<Double> | ||||
|     ): BaseResponse<CommonDataBean> | ||||
|  | ||||
|     /** | ||||
|      * 获取具体国家地区税率 | ||||
|      */ | ||||
|     @GET("order$SUBSCRIPTIONS_V3/plan/getTaxRateByRegionName") | ||||
|     suspend fun getTaxRateByRegionName( | ||||
|         @Query("countryCode") countryCode: String, @Query("regionName") regionName: String | ||||
|     ): BaseResponse<CommonDataBean> | ||||
|  | ||||
|     /** | ||||
|      * 创建Stripe订单发起支付 | ||||
|   | ||||
| @@ -1143,6 +1143,13 @@ object NetworkApi : BaseNetworkApi<INetworkService>(INetworkService.BASE_URL) { | ||||
|         service.updateSubscriptionStatus(subscriptionId, status) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取具体国家地区税率 | ||||
|      */ | ||||
|     suspend fun getTaxRateByRegionName(countryCode: String, regionName: String) = getResult { | ||||
|         service.getTaxRateByRegionName(countryCode, regionName) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取SIM卡重新激活费用 | ||||
|      */ | ||||
|   | ||||
| @@ -139,22 +139,27 @@ class ChoosePlanActivity : | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun goSureSubscriptionPlan() { | ||||
|         Util.checkLocationPermissionsGpsEnabled(mContext, { | ||||
|             Intent( | ||||
|                 mContext, SureSubscriptionPlanActivity::class.java | ||||
|             ).let { | ||||
|                 if (mChoosePlanAdapter.getData().isNotEmpty()) { | ||||
|                     val cPlan = mChoosePlanAdapter.getData()[mSelectPlanIndex] | ||||
|                     it.putExtra(ConstantString.SetMeal, cPlan) | ||||
|                     it.putExtra(ConstantString.Upgrade, isUpgrade) | ||||
|                     it.putExtra(ConstantString.LkSetMeal, mOrderBean) | ||||
|                     it.putExtra(ConstantString.RechargeType, mRechargeType) | ||||
|                     startActivity(it) | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     override fun onClick(v: View?) { | ||||
|         mViewBinding.apply { | ||||
|             when (v!!) { | ||||
|                 btnSelectChoosePlanContinue -> Intent( | ||||
|                     mContext, SureSubscriptionPlanActivity::class.java | ||||
|                 ).let { | ||||
|                     if (mChoosePlanAdapter.getData().isNotEmpty()) { | ||||
|                         val cPlan = mChoosePlanAdapter.getData()[mSelectPlanIndex] | ||||
|                         it.putExtra(ConstantString.SetMeal, cPlan) | ||||
|                         it.putExtra(ConstantString.Upgrade, isUpgrade) | ||||
|                         it.putExtra(ConstantString.LkSetMeal, mOrderBean) | ||||
|                         it.putExtra(ConstantString.RechargeType, mRechargeType) | ||||
|                         startActivity(it) | ||||
|                     } | ||||
|                 } | ||||
|                 btnSelectChoosePlanContinue -> goSureSubscriptionPlan() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -25,6 +25,8 @@ import com.abbidot.tracker.databinding.ActivitySureSubscriptionPlanBinding | ||||
| import com.abbidot.tracker.ui.activity.WebViewActivity | ||||
| import com.abbidot.tracker.util.Util | ||||
| import com.abbidot.tracker.util.ViewUtil | ||||
| import com.abbidot.tracker.vm.GeoCoderViewModel | ||||
| import com.abbidot.tracker.vm.GoogleLocationViewModel | ||||
| import com.abbidot.tracker.vm.SubscriptionManageViewModel | ||||
| import kotlin.math.abs | ||||
|  | ||||
| @@ -32,6 +34,8 @@ class SureSubscriptionPlanActivity : | ||||
|     BaseActivity<ActivitySureSubscriptionPlanBinding>(ActivitySureSubscriptionPlanBinding::inflate) { | ||||
|  | ||||
|     private val mSubscriptionViewModel: SubscriptionManageViewModel by viewModels() | ||||
|     private val mGoogleLocationViewModel: GoogleLocationViewModel by viewModels() | ||||
|     private val mGeoCoderViewModel: GeoCoderViewModel by viewModels() | ||||
|  | ||||
|     private var mPackageBean: PackageBean? = null | ||||
|     private var mOrderBean: SubscriptionsOrderBean? = null | ||||
| @@ -43,7 +47,7 @@ class SureSubscriptionPlanActivity : | ||||
|     private var mSumInsuranceMoney = 0.0 | ||||
|  | ||||
|     //税率 | ||||
|     private val mTaxRate = 0.0825 | ||||
|     private var mTaxRate = 0.0825 | ||||
|  | ||||
|     //付款的总金额(含税) | ||||
|     private var mTotalWithTaxMoney = 0.0 | ||||
| @@ -81,21 +85,21 @@ class SureSubscriptionPlanActivity : | ||||
|  | ||||
|         mSummaryAdapter = SureSubscribeSummaryAdapter(this, mutableListOf()) | ||||
|  | ||||
|         mOrderBean?.let { | ||||
|             if (isUpgrade) { | ||||
|                 it.isUpdateOrder = ConstantInt.Type1 | ||||
|                 //套餐总天数 | ||||
|                 val totalDay = if (it.mealUnit == ConstantString.PackageUnitYear) { | ||||
|                     it.mealPeriod * 365 | ||||
|                 } else { | ||||
|                     30 * it.planTimeMonthsCount | ||||
|                 } | ||||
|                 mResidualMoney = | ||||
|                     ((it.totalAmountWithTax - it.tax - it.reactivatePrice) / totalDay) * it.surplusDays | ||||
|             } else { | ||||
|                 it.isUpdateOrder = ConstantInt.Type0 | ||||
|             } | ||||
|         } | ||||
| //        mOrderBean?.let { | ||||
| //            if (isUpgrade) { | ||||
| //                it.isUpdateOrder = ConstantInt.Type1 | ||||
| //                //套餐总天数 | ||||
| //                val totalDay = if (it.mealUnit == ConstantString.PackageUnitYear) { | ||||
| //                    it.mealPeriod * 365 | ||||
| //                } else { | ||||
| //                    30 * it.planTimeMonthsCount | ||||
| //                } | ||||
| //                mResidualMoney = | ||||
| //                    ((it.totalAmountWithTax - it.tax - it.reactivatePrice) / totalDay) * it.surplusDays | ||||
| //            } else { | ||||
| //                it.isUpdateOrder = ConstantInt.Type0 | ||||
| //            } | ||||
| //        } | ||||
|  | ||||
|         mViewBinding.apply { | ||||
|             ViewUtil.instance.setRecyclerViewVerticalLinearLayout( | ||||
| @@ -105,7 +109,186 @@ class SureSubscriptionPlanActivity : | ||||
|                 bottom = AppUtils.dpToPx(4) | ||||
|             ) | ||||
|  | ||||
| //            mOrderBean?.let { | ||||
| //                ilSubscribePlanDetail.tvSureSubscribePlanDeviceId.text = it.deviceOutId | ||||
| //                val nowTimestamp = System.currentTimeMillis() | ||||
| // | ||||
| //                mPackageBean?.let { p -> | ||||
| //                    ilSubscribePlanDetail.tvSureSubscribePlanPer.text = String.format( | ||||
| //                        getString(R.string.txt_month_unit), "${p.planTimeMonthsCount}" | ||||
| //                    ) | ||||
| //                    val renewalString = if (p.mealUnit == ConstantString.PackageUnitYear) { | ||||
| ////                        ilSubscribePlanDetail.tvSureSubscribePlanPer.text = | ||||
| ////                            String.format(getString(R.string.txt_year_unit), p.period) | ||||
| //                        val renewalTimestamp = | ||||
| //                            Utils.getAfterHowTimestamp(nowTimestamp, p.period * 365L) | ||||
| //                        val renewalDate = | ||||
| //                            Utils.formatTime(renewalTimestamp, Utils.DATE_FORMAT_PATTERN_EN7) | ||||
| //                        if (p.period > 1) { | ||||
| //                            String.format( | ||||
| //                                getString(R.string.txt_renewal_years), | ||||
| //                                "${p.autoRenewPrice}", | ||||
| //                                "${p.period}", | ||||
| //                                renewalDate | ||||
| //                            ) | ||||
| //                        } else { | ||||
| //                            String.format( | ||||
| //                                getString(R.string.txt_renewal_year), | ||||
| //                                "${p.autoRenewPrice}", | ||||
| //                                renewalDate | ||||
| //                            ) | ||||
| //                        } | ||||
| //                    } else { | ||||
| //                        val renewalTimestamp = | ||||
| //                            Utils.getAfterHowTimestamp(nowTimestamp, 30L * p.planTimeMonthsCount) | ||||
| //                        val renewalDate = | ||||
| //                            Utils.formatTime(renewalTimestamp, Utils.DATE_FORMAT_PATTERN_EN7) | ||||
| //                        if (p.planTimeMonthsCount > 1) { | ||||
| //                            String.format( | ||||
| //                                getString(R.string.txt_renewal_months), | ||||
| //                                "${p.autoRenewPrice}", | ||||
| //                                "${p.planTimeMonthsCount}", | ||||
| //                                renewalDate | ||||
| //                            ) | ||||
| //                        } else { | ||||
| //                            String.format( | ||||
| //                                getString(R.string.txt_renewal_month), | ||||
| //                                "${p.autoRenewPrice}", | ||||
| //                                renewalDate | ||||
| //                            ) | ||||
| //                        } | ||||
| //                    } | ||||
| //                    ilSubscribePlanDetail.tvSureSubscribePlanUnderused.text = renewalString | ||||
| //                    ilSubscribePlanDetail.tvSureSubscribePlanMoneySum.text = String.format( | ||||
| //                        getString(R.string.txt_money_unit), "${p.autoRenewPrice}" | ||||
| //                    ) | ||||
| // | ||||
| //                    val packageName = "${p.planName}(${p.planCategory})" | ||||
| //                    ilSubscribePlanDetail.tvSureSubscribePlanName.text = packageName | ||||
| //                    val price = p.planPrice | ||||
| ////                    val price = if (p.discountedPrice > 0.0) p.discountedPrice else p.planPrice | ||||
| //                    val priceString = String.format( | ||||
| //                        getString(R.string.txt_money_unit), | ||||
| //                        Utils.formatDecimal(price / p.planTimeMonthsCount, 1) | ||||
| //                    ) | ||||
| //                    ilSubscribePlanDetail.tvSureSubscribePlanMoney.text = priceString | ||||
| // | ||||
| //                    ViewUtil.instance.addMenuBean( | ||||
| //                        mSummaryAdapter.getData(), | ||||
| //                        p.planName, | ||||
| //                        "$price", | ||||
| //                        colorRedId = R.color.data_black_color | ||||
| //                    ) | ||||
| //                    mTotalMoney += price | ||||
| //                    mSumInsuranceMoney = | ||||
| //                        Utils.formatDecimal(p.everyMonthSafeFee * p.period * 12, 1).toDouble() | ||||
| //                    ViewUtil.instance.addMenuBean( | ||||
| //                        mSummaryAdapter.getData(), | ||||
| //                        getString(R.string.txt_annual_care_text), | ||||
| //                        "$mSumInsuranceMoney", | ||||
| //                        colorRedId = R.color.data_black_color | ||||
| //                    ) | ||||
| //                    mTotalMoney += mSumInsuranceMoney | ||||
| // | ||||
| //                    val insuranceMoneyString = | ||||
| //                        String.format(getString(R.string.txt_month_unit), "${p.period * 12}") | ||||
| //                    ilSubscribePlanInsurance.tvSureSubscribePlanInsurancePer.text = | ||||
| //                        insuranceMoneyString | ||||
| //                    ilSubscribePlanInsurance.tvSureSubscribePlanInsurancePerMoney.text = | ||||
| //                        String.format(getString(R.string.txt_money_unit), "${p.everyMonthSafeFee}") | ||||
| //                    ilSubscribePlanInsurance.tvSureSubscribePlanInsuranceMoney.text = | ||||
| //                        String.format(getString(R.string.txt_money_unit), "$mSumInsuranceMoney") | ||||
| // | ||||
| //                    if (isUpgrade) { | ||||
| //                        mTotalMoney -= mResidualMoney | ||||
| //                        ViewUtil.instance.addMenuBean( | ||||
| //                            mSummaryAdapter.getData(), | ||||
| //                            getString(R.string.txt_residual_value), | ||||
| //                            Utils.formatDecimal(mResidualMoney, 1), | ||||
| //                            colorRedId = R.color.red_color5, | ||||
| //                            isSwitch = true | ||||
| //                        ) | ||||
| //                    } | ||||
| //                    ViewUtil.instance.addMenuBean( | ||||
| //                        mSummaryAdapter.getData(), | ||||
| //                        getString(R.string.txt_sales_tax), | ||||
| //                        "0", | ||||
| //                        colorRedId = R.color.data_black_color | ||||
| //                    ) | ||||
| //                } | ||||
| // | ||||
| //                //判断套餐是否过期 | ||||
| //                if (!TextUtils.isEmpty(it.orderNum) && it.surplusDays == 0L && it.subscriptionStatus == ConstantInt.Close) { | ||||
| //                    mOrderBean?.reactivation = 1 | ||||
| //                    mSubscriptionViewModel.getReactivationFee(it.orderNum) | ||||
| //                } else { | ||||
| //                    mOrderBean?.reactivation = 0 | ||||
| //                    mOrderBean?.reactivatePrice = 0.0 | ||||
| //                    updateMoney() | ||||
| //                } | ||||
| //            } | ||||
|  | ||||
|             //添加下划线 | ||||
|             ilSubscribePlanDetail.tvSureSubscribePlanTermsConditions.paint.flags = | ||||
|                 Paint.UNDERLINE_TEXT_FLAG | ||||
|  | ||||
|             ilSubscribePlanInsurance.cbSureSubscribeInsureSwitch.setOnCheckedChangeListener { buttonView, isChecked -> | ||||
|                 mOrderBean?.let { order -> | ||||
|                     if (isUpgrade && order.annualCareType == ConstantInt.Type1) { | ||||
|                         ilSubscribePlanInsurance.cbSureSubscribeInsureSwitch.isChecked = !isChecked | ||||
|                         showToast(R.string.txt_annual_care_included, gravity = Gravity.CENTER) | ||||
|                         return@setOnCheckedChangeListener | ||||
|                     } | ||||
|                     val list = mSummaryAdapter.getData() | ||||
|                     if (isChecked) { | ||||
|                         MenuTxtBean( | ||||
|                             getString(R.string.txt_annual_care_text), "$mSumInsuranceMoney" | ||||
|                         ).let { | ||||
|                             it.colorRedId = R.color.data_black_color | ||||
|                             list.add(1, it) | ||||
|                         } | ||||
|                         mTotalMoney += mSumInsuranceMoney | ||||
|                     } else { | ||||
|                         list.removeAt(1) | ||||
|                         mTotalMoney -= mSumInsuranceMoney | ||||
|                         mSummaryAdapter.notifyItemRemoved(1) | ||||
|                     } | ||||
|                     updateMoney() | ||||
|                 } | ||||
|             } | ||||
|             setOnClickListenerViews( | ||||
|                 btnSureSubscribePlan1Continue, | ||||
|                 ilSubscribePlanDetail.tvSureSubscribePlanTermsConditions, | ||||
|                 ilSubscribePlanInsurance.ivSureSubscribePlanInsurance | ||||
|             ) | ||||
|  | ||||
|             if (AppUtils.isChina(AppUtils.SWITCH_MAP_TYPE)) { | ||||
|                 sureSubscriptionDetail() | ||||
|             } else { | ||||
|                 setButtonEnabled(btnSureSubscribePlan1Continue, ConstantInt.Type0) | ||||
|                 mGoogleLocationViewModel.getLastLocation(mContext) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun sureSubscriptionDetail() { | ||||
|         mViewBinding.apply { | ||||
|             setButtonEnabled(btnSureSubscribePlan1Continue, ConstantInt.Type1) | ||||
|             mOrderBean?.let { | ||||
|                 if (isUpgrade) { | ||||
|                     it.isUpdateOrder = ConstantInt.Type1 | ||||
|                     //套餐总天数 | ||||
|                     val totalDay = if (it.mealUnit == ConstantString.PackageUnitYear) { | ||||
|                         it.mealPeriod * 365 | ||||
|                     } else { | ||||
|                         30 * it.planTimeMonthsCount | ||||
|                     } | ||||
|                     mResidualMoney = (it.autoRenewPrice / totalDay) * it.surplusDays | ||||
|                 } else { | ||||
|                     it.isUpdateOrder = ConstantInt.Type0 | ||||
|                 } | ||||
|  | ||||
|  | ||||
|                 ilSubscribePlanDetail.tvSureSubscribePlanDeviceId.text = it.deviceOutId | ||||
|                 val nowTimestamp = System.currentTimeMillis() | ||||
|  | ||||
| @@ -155,6 +338,9 @@ class SureSubscriptionPlanActivity : | ||||
|                         } | ||||
|                     } | ||||
|                     ilSubscribePlanDetail.tvSureSubscribePlanUnderused.text = renewalString | ||||
|                     ilSubscribePlanDetail.tvSureSubscribePlanMoneySum.text = String.format( | ||||
|                         getString(R.string.txt_money_unit), "${p.autoRenewPrice}" | ||||
|                     ) | ||||
|  | ||||
|                     val packageName = "${p.planName}(${p.planCategory})" | ||||
|                     ilSubscribePlanDetail.tvSureSubscribePlanName.text = packageName | ||||
| @@ -211,49 +397,22 @@ class SureSubscriptionPlanActivity : | ||||
|                 } | ||||
|  | ||||
|                 //判断套餐是否过期 | ||||
|                 if (!TextUtils.isEmpty(it.orderNum) && it.surplusDays == 0L && it.subscriptionStatus == ConstantInt.Close) { | ||||
|                     mOrderBean?.reactivation = 1 | ||||
|                     mSubscriptionViewModel.getReactivationFee(it.orderNum) | ||||
|                 } else { | ||||
| //                if (!TextUtils.isEmpty(it.orderNum) && it.surplusDays == 0L && it.subscriptionStatus == ConstantInt.Close) { | ||||
| //                    mOrderBean?.reactivation = 1 | ||||
| //                    mSubscriptionViewModel.getReactivationFee(it.orderNum) | ||||
| //                } else { | ||||
| //                    mOrderBean?.reactivation = 0 | ||||
| //                    mOrderBean?.reactivatePrice = 0.0 | ||||
| //                    updateMoney() | ||||
| //                } | ||||
|                 if (TextUtils.isEmpty(it.orderNum)) { | ||||
|                     mOrderBean?.reactivation = 0 | ||||
|                     mOrderBean?.reactivatePrice = 0.0 | ||||
|                     updateMoney() | ||||
|                 } else { | ||||
|                     mSubscriptionViewModel.getReactivationFee(it.orderNum) | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             //添加下划线 | ||||
|             ilSubscribePlanDetail.tvSureSubscribePlanTermsConditions.paint.flags = | ||||
|                 Paint.UNDERLINE_TEXT_FLAG | ||||
|  | ||||
|             ilSubscribePlanInsurance.cbSureSubscribeInsureSwitch.setOnCheckedChangeListener { buttonView, isChecked -> | ||||
|                 mOrderBean?.let { order -> | ||||
|                     if (isUpgrade && order.annualCareType == ConstantInt.Type1) { | ||||
|                         ilSubscribePlanInsurance.cbSureSubscribeInsureSwitch.isChecked = !isChecked | ||||
|                         showToast(R.string.txt_annual_care_included, gravity = Gravity.CENTER) | ||||
|                         return@setOnCheckedChangeListener | ||||
|                     } | ||||
|                     val list = mSummaryAdapter.getData() | ||||
|                     if (isChecked) { | ||||
|                         MenuTxtBean( | ||||
|                             getString(R.string.txt_annual_care_text), "$mSumInsuranceMoney" | ||||
|                         ).let { | ||||
|                             it.colorRedId = R.color.data_black_color | ||||
|                             list.add(1, it) | ||||
|                         } | ||||
|                         mTotalMoney += mSumInsuranceMoney | ||||
|                     } else { | ||||
|                         list.removeAt(1) | ||||
|                         mTotalMoney -= mSumInsuranceMoney | ||||
|                         mSummaryAdapter.notifyItemRemoved(1) | ||||
|                     } | ||||
|                     updateMoney() | ||||
|                 } | ||||
|             } | ||||
|             setOnClickListenerViews( | ||||
|                 btnSureSubscribePlan1Continue, | ||||
|                 ilSubscribePlanDetail.tvSureSubscribePlanTermsConditions, | ||||
|                 ilSubscribePlanInsurance.ivSureSubscribePlanInsurance | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -267,9 +426,10 @@ class SureSubscriptionPlanActivity : | ||||
|             XEventBus.post(EventName.RefreshPackage) | ||||
|             finish() | ||||
|         } | ||||
|         mSubscriptionViewModel.mReactivationFeeLiveData.observe(this) { | ||||
|             dealRequestResult(it, object : GetResultCallback { | ||||
|                 override fun onResult(any: Any) { | ||||
|         mSubscriptionViewModel.apply { | ||||
|             mReactivationFeeLiveData.observe(this@SureSubscriptionPlanActivity) { | ||||
|                 dealRequestResult(it, object : GetResultCallback { | ||||
|                     override fun onResult(any: Any) { | ||||
| //                    it.getOrNull()?.apply { | ||||
| //                        mOrderBean?.reactivatePrice = this | ||||
| //                        mSummaryAdapter.getData().add( | ||||
| @@ -280,16 +440,64 @@ class SureSubscriptionPlanActivity : | ||||
| //                            }) | ||||
| //                        mTotalMoney += this | ||||
| //                    } | ||||
|                     updateMoney() | ||||
|                 } | ||||
|             }) | ||||
|                         it.getOrNull()?.apply { | ||||
|                             mPackageBean?.let { p -> | ||||
|                                 mTotalMoney -= mSumInsuranceMoney | ||||
|                                 val howSafeValidMonths = | ||||
|                                     p.planTimeMonthsCount - surplusSafeValidMonths | ||||
|                                 if (howSafeValidMonths > 0) { | ||||
|                                     val insuranceMoneyString = String.format( | ||||
|                                         getString(R.string.txt_month_unit), "$howSafeValidMonths" | ||||
|                                     ) | ||||
|                                     mViewBinding.ilSubscribePlanInsurance.tvSureSubscribePlanInsurancePer.text = | ||||
|                                         insuranceMoneyString | ||||
|                                     mSumInsuranceMoney = Utils.formatDecimal( | ||||
|                                         howSafeValidMonths * p.everyMonthSafeFee, 1 | ||||
|                                     ).toDouble() | ||||
|                                     mTotalMoney += mSumInsuranceMoney | ||||
|                                     mViewBinding.ilSubscribePlanInsurance.tvSureSubscribePlanInsuranceMoney.text = | ||||
|                                         String.format( | ||||
|                                             getString(R.string.txt_money_unit), | ||||
|                                             "$mSumInsuranceMoney" | ||||
|                                         ) | ||||
|                                 } else { | ||||
|                                     mSumInsuranceMoney = 0.0 | ||||
|                                     mViewBinding.ilSubscribePlanInsurance.root.visibility = | ||||
|                                         View.GONE | ||||
|                                 } | ||||
|                                 mSummaryAdapter.getData()[1].menuValue = "$mSumInsuranceMoney" | ||||
|                             } | ||||
|                         } | ||||
|                         updateMoney() | ||||
|                     } | ||||
|                 }) | ||||
|             } | ||||
|  | ||||
|             mRegionalTaxRateLiveData.observe(this@SureSubscriptionPlanActivity) { | ||||
|                 dealRequestResult(it, object : GetResultCallback { | ||||
|                     override fun onResult(any: Any) { | ||||
|                         it.getOrNull()?.apply { | ||||
|                             mTaxRate = taxRate | ||||
|                             sureSubscriptionDetail() | ||||
|                         } | ||||
|                     } | ||||
|                 }) | ||||
|             } | ||||
|         } | ||||
|         mGoogleLocationViewModel.mGoogleLocationLiveData.observe(this) { | ||||
|             mGeoCoderViewModel.getLatLonAddress(it.latitude, it.longitude) | ||||
|         } | ||||
|         mGeoCoderViewModel.mLatLonAddressLiveData.observe(this) { | ||||
|             mSubscriptionViewModel.getTaxRateByRegionName( | ||||
|                 mGeoCoderViewModel.mCountryCode, mGeoCoderViewModel.mRegion | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun updateMoney() { | ||||
|         mViewBinding.apply { | ||||
|             val list = mSummaryAdapter.getData() | ||||
|             val taxMoney = Utils.formatDecimal(mTaxRate * mTotalMoney, 1).toDouble() | ||||
|             val taxMoney = abs(Utils.formatDecimal(mTaxRate * mTotalMoney, 1).toDouble()) | ||||
|             mOrderBean?.tax = taxMoney | ||||
|             list[list.size - 1].menuValue = taxMoney.toString() | ||||
|             mTotalWithTaxMoney = taxMoney + mTotalMoney | ||||
| @@ -332,8 +540,10 @@ class SureSubscriptionPlanActivity : | ||||
|                 planTimeMonthsCount = cPlan.planTimeMonthsCount | ||||
|                 mealUnit = cPlan.mealUnit | ||||
|                 planCategory = cPlan.planCategory | ||||
| //                autoRenewPrice = Utils.formatDecimal(cPlan.autoRenewPrice * mTaxRate, 1).toDouble() | ||||
|                 autoRenewPrice = cPlan.autoRenewPrice | ||||
|                 autoRenewPrice = | ||||
|                     Utils.formatDecimal(cPlan.autoRenewPrice + cPlan.autoRenewPrice * mTaxRate, 1) | ||||
|                         .toDouble() | ||||
| //                autoRenewPrice = cPlan.autoRenewPrice | ||||
|                 mealDesc = | ||||
|                     mViewBinding.ilSubscribePlanDetail.tvSureSubscribePlanMoney.text.toString() + mViewBinding.ilSubscribePlanDetail.tvSureSubscribePlanPer.text.toString() | ||||
|             } | ||||
|   | ||||
| @@ -161,6 +161,9 @@ abstract class BaseBaiduMapFragment : | ||||
|         mMapView.onPause() | ||||
|     } | ||||
|  | ||||
|     override fun liveDataObserve() { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 卫星标准地图模式切换 | ||||
| @@ -653,7 +656,7 @@ abstract class BaseBaiduMapFragment : | ||||
|         //通过LocationClientOption设置LocationClient相关参数 | ||||
|         val option = LocationClientOption() | ||||
|         // 打开gps | ||||
|         option.isOpenGps = true | ||||
|         option.openGps = true | ||||
|         // 设置坐标类型 | ||||
|         option.setCoorType(mCoordType) | ||||
|         //设置定位刷新间隔 | ||||
|   | ||||
| @@ -883,7 +883,7 @@ abstract class BaseGoogleMapFragment : | ||||
|  | ||||
|     // The Fused Location Provider provides access to location APIs. | ||||
|     private val mFusedLocationClient: FusedLocationProviderClient by lazy { | ||||
|         LocationServices.getFusedLocationProviderClient(mContext!!)// | ||||
|         LocationServices.getFusedLocationProviderClient(mContext!!) | ||||
|     } | ||||
|     private var mCancellationTokenSource: CancellationTokenSource? = null | ||||
|  | ||||
|   | ||||
| @@ -31,6 +31,12 @@ class GeoCoderViewModel : ViewModel() { | ||||
|  | ||||
|     var mLat = 0.0 | ||||
|     var mLon = 0.0 | ||||
|  | ||||
|     //地区、州、省 | ||||
|     var mRegion = "" | ||||
|  | ||||
|     //国家缩写 | ||||
|     var mCountryCode = "" | ||||
|     var mAddress = "" | ||||
|     val mLatLonAddressLiveData = MutableLiveData<String>() | ||||
|  | ||||
| @@ -64,6 +70,8 @@ class GeoCoderViewModel : ViewModel() { | ||||
|         if (AppUtils.isChina(AppUtils.SWITCH_MAP_TYPE)) { | ||||
|             baiduMapReverseGeocoder(latitude, longitude) | ||||
|         } else { | ||||
| //            baiduMapReverseGeocoder(-110.95, 44.65) | ||||
| //            mapBoxReverseGeocoder(42.23, -103.18) | ||||
|             mapBoxReverseGeocoder(latitude, longitude) | ||||
|         } | ||||
|     } | ||||
| @@ -77,52 +85,59 @@ class GeoCoderViewModel : ViewModel() { | ||||
|                 SearchEngine.createSearchEngineWithBuiltInDataProviders(SearchEngineSettings()) | ||||
|         } | ||||
|         mMapboxSearchRequestTask?.cancel() | ||||
|         mMapboxSearchRequestTask = mSearchEngine?.search(ReverseGeoOptions( | ||||
|             center = Point.fromLngLat(longitude, latitude) | ||||
|         ), object : SearchCallback { | ||||
|             override fun onError(e: Exception) { | ||||
|                 LogUtil.e(" Mapbox反地理编码error,${e.message}") | ||||
|         mMapboxSearchRequestTask = mSearchEngine?.search( | ||||
|             ReverseGeoOptions( | ||||
|                 center = Point.fromLngLat(longitude, latitude) | ||||
|             ), object : SearchCallback { | ||||
|                 override fun onError(e: Exception) { | ||||
|                     LogUtil.e(" Mapbox反地理编码error,${e.message}") | ||||
| //                        mLatLonAddressLiveData.value = "" | ||||
|                 baiduMapReverseGeocoder(latitude, longitude) | ||||
|             } | ||||
|                     baiduMapReverseGeocoder(latitude, longitude) | ||||
|                 } | ||||
|  | ||||
|             override fun onResults( | ||||
|                 results: List<SearchResult>, responseInfo: ResponseInfo | ||||
|             ) { | ||||
|                 LogUtil.e(results.toString()) | ||||
|                 if (results.isNotEmpty()) { | ||||
|                     val searchResult = results[0] | ||||
|                     var address = "" | ||||
|                     searchResult.address?.let { | ||||
|                         if (!TextUtils.isEmpty(it.street)) { | ||||
|                             address += "${it.street} " | ||||
|                 override fun onResults( | ||||
|                     results: List<SearchResult>, responseInfo: ResponseInfo | ||||
|                 ) { | ||||
|                     LogUtil.e(results.toString()) | ||||
|                     if (results.isNotEmpty()) { | ||||
|                         val searchResult = results[0] | ||||
|                         var address = "" | ||||
|                         searchResult.metadata?.let { | ||||
|                             it.countryIso1?.let { countryCode -> | ||||
|                                 mCountryCode = countryCode.uppercase() | ||||
|                             } | ||||
|                         } | ||||
|                         searchResult.address?.let { | ||||
|                             if (!TextUtils.isEmpty(it.street)) { | ||||
|                                 address += "${it.street} " | ||||
|                             } | ||||
| //                        if (!TextUtils.isEmpty(it.houseNumber)) { | ||||
| //                            address += "${it.houseNumber} " | ||||
| //                        } | ||||
|                         if (!TextUtils.isEmpty(it.locality)) { | ||||
|                             address += "${it.locality} " | ||||
|                             if (!TextUtils.isEmpty(it.locality)) { | ||||
|                                 address += "${it.locality} " | ||||
|                             } | ||||
|                             if (!TextUtils.isEmpty(it.place)) { | ||||
|                                 address += "${it.place} " | ||||
|                             } | ||||
|                             if (isShowDetailAddress && !TextUtils.isEmpty(it.region)) { | ||||
|                                 address += "${it.region} " | ||||
|                             } | ||||
|                             if (isShowDetailAddress && !TextUtils.isEmpty(it.country)) { | ||||
|                                 address += "${it.country}" | ||||
|                             } | ||||
|                             mRegion = it.region.toString() | ||||
|                         } | ||||
|                         if (!TextUtils.isEmpty(it.place)) { | ||||
|                             address += "${it.place} " | ||||
|                         } | ||||
|                         if (isShowDetailAddress && !TextUtils.isEmpty(it.region)) { | ||||
|                             address += "${it.region} " | ||||
|                         } | ||||
|                         if (isShowDetailAddress && !TextUtils.isEmpty(it.country)) { | ||||
|                             address += "${it.country}" | ||||
|                         } | ||||
|                     } | ||||
| //                    address = address?.replace("null", "") | ||||
|                     mAddress = address | ||||
|                     LogUtil.e("Mapbox反地理编码:$mAddress") | ||||
|                     mLatLonAddressLiveData.value = mAddress | ||||
|                 } else { | ||||
|                         mAddress = address | ||||
|                         LogUtil.e("Mapbox反地理编码:$mAddress") | ||||
|                         mLatLonAddressLiveData.value = mAddress | ||||
|                     } else { | ||||
| //                            mLatLonAddressLiveData.value = ""- | ||||
|                     baiduMapReverseGeocoder(latitude, longitude) | ||||
|                         baiduMapReverseGeocoder(latitude, longitude) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|             }) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -164,6 +179,8 @@ class GeoCoderViewModel : ViewModel() { | ||||
|                         if (!TextUtils.isEmpty(streetNumber)) { | ||||
|                             address += streetNumber | ||||
|                         } | ||||
|                         mRegion = province | ||||
|                         mCountryCode = countryCodeIso2.uppercase() | ||||
|                         LogUtil.e("百度地图反向地理编码详细地址,${streetNumber},${town},${street},$result") | ||||
|                     } | ||||
|                     //详细地址 | ||||
|   | ||||
| @@ -0,0 +1,104 @@ | ||||
| package com.abbidot.tracker.vm | ||||
|  | ||||
| import android.annotation.SuppressLint | ||||
| import android.content.Context | ||||
| import android.location.Location | ||||
| import androidx.lifecycle.MutableLiveData | ||||
| import androidx.lifecycle.ViewModel | ||||
| import com.abbidot.baselibrary.util.LogUtil | ||||
| import com.abbidot.tracker.util.LonAndLatUtil | ||||
| import com.google.android.gms.location.FusedLocationProviderClient | ||||
| import com.google.android.gms.location.LocationServices | ||||
| import com.google.android.gms.location.Priority | ||||
| import com.google.android.gms.tasks.CancellationTokenSource | ||||
| import com.google.android.gms.tasks.Task | ||||
|  | ||||
| /** | ||||
|  *Created  by .yzq on 2025/10/16/周四. | ||||
|  * @link | ||||
|  * @description: | ||||
|  */ | ||||
| class GoogleLocationViewModel : ViewModel() { | ||||
|  | ||||
|     val mGoogleLocationLiveData = MutableLiveData<Location>() | ||||
|  | ||||
|     // The Fused Location Provider provides access to location APIs. | ||||
|     private var mFusedLocationClient: FusedLocationProviderClient? = null | ||||
|     private var mCancellationTokenSource: CancellationTokenSource? = null | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 获取最后位置,用户当前的位置 | ||||
|      */ | ||||
|     @SuppressLint("MissingPermission") | ||||
|     fun getLastLocation(context: Context) { | ||||
|         if (null == mFusedLocationClient) { | ||||
|             mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context) | ||||
|         } | ||||
|         mFusedLocationClient!!.lastLocation.addOnCompleteListener { taskLocation -> | ||||
|             var location: Location? = null | ||||
|             if (taskLocation.isSuccessful && taskLocation.result != null) { | ||||
|                 location = taskLocation.result | ||||
|                 LonAndLatUtil.currentUserGPSLat = location.latitude | ||||
|                 LonAndLatUtil.currentUserGPSLon = location.longitude | ||||
|                 LogUtil.e("Google,getLastLocation:${location.latitude}, ${location.longitude}") | ||||
|             } else { | ||||
|                 LogUtil.e("Google,getLastLocation:exception" + taskLocation.exception) | ||||
|             } | ||||
|             location?.let { | ||||
|                 mGoogleLocationLiveData.value = it | ||||
|             } | ||||
|             if (null == location) requestCurrentLocation(context) | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 请求用户当前的位置 | ||||
|      */ | ||||
|     @SuppressLint("MissingPermission") | ||||
|     private fun requestCurrentLocation(context: Context) { | ||||
|         try { | ||||
|             if (null == mFusedLocationClient) { | ||||
|                 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context) | ||||
|             } | ||||
|             if (null == mCancellationTokenSource) { | ||||
|                 mCancellationTokenSource = CancellationTokenSource() | ||||
|             } | ||||
| //        val currentLocationTask = mFusedLocationClient.getCurrentLocation( | ||||
| //            LocationRequest.PRIORITY_HIGH_ACCURACY, mCancellationTokenSource!!.token | ||||
| //        ) | ||||
|             val currentLocationTask = mFusedLocationClient!!.getCurrentLocation( | ||||
|                 Priority.PRIORITY_HIGH_ACCURACY, mCancellationTokenSource!!.token | ||||
|             ) | ||||
|             currentLocationTask.addOnCompleteListener { task: Task<Location> -> | ||||
|                 var location: Location? = null | ||||
|                 val result = if (task.isSuccessful && task.result != null) { | ||||
|                     location = task.result | ||||
|                     LonAndLatUtil.currentUserGPSLat = location.latitude | ||||
|                     LonAndLatUtil.currentUserGPSLon = location.longitude | ||||
|                     "(success): ${location.latitude}, ${location.longitude}" | ||||
|                 } else { | ||||
|                     val exception = task.exception | ||||
|                     "(failure): $exception" | ||||
|                 } | ||||
|  | ||||
|                 LogUtil.e("Google,requestCurrentLocation $result") | ||||
|                 location?.let { | ||||
|                     mGoogleLocationLiveData.value = it | ||||
|                 } | ||||
|             } | ||||
|         } catch (e: Exception) { | ||||
|             LogUtil.e("Google,requestCurrentLocation异常:${e.message}") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun stopLocation() { | ||||
|         mCancellationTokenSource?.cancel() | ||||
|     } | ||||
|  | ||||
|     override fun onCleared() { | ||||
|         super.onCleared() | ||||
|         stopLocation() | ||||
|     } | ||||
| } | ||||
| @@ -5,6 +5,7 @@ import androidx.lifecycle.ViewModel | ||||
| import androidx.lifecycle.viewModelScope | ||||
| import com.abbidot.baselibrary.constant.MMKVKey | ||||
| import com.abbidot.baselibrary.util.MMKVUtil | ||||
| import com.abbidot.tracker.bean.CommonDataBean | ||||
| import com.abbidot.tracker.bean.OrderBean | ||||
| import com.abbidot.tracker.bean.PackageBean | ||||
| import com.abbidot.tracker.bean.PackageTypeBean | ||||
| @@ -26,8 +27,9 @@ class SubscriptionManageViewModel : ViewModel() { | ||||
|     val mUpdateStatusListLiveData = MutableLiveData<Result<String>>() | ||||
|     val mSubscriptionsHistoryLiveData = | ||||
|         MutableLiveData<Result<MutableList<SubscriptionsOrderBean>>>() | ||||
|     val mReactivationFeeLiveData = MutableLiveData<Result<Double>>() | ||||
|     val mReactivationFeeLiveData = MutableLiveData<Result<CommonDataBean>>() | ||||
|     val mRefundLiveData = MutableLiveData<Result<String>>() | ||||
|     val mRegionalTaxRateLiveData = MutableLiveData<Result<CommonDataBean>>() | ||||
|  | ||||
|     fun getSubscriptionsOrder() { | ||||
|         viewModelScope.launch { | ||||
| @@ -113,4 +115,14 @@ class SubscriptionManageViewModel : ViewModel() { | ||||
|             mReactivationFeeLiveData.value = result | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取具体国家地区税率 | ||||
|      */ | ||||
|     fun getTaxRateByRegionName(countryCode: String, regionName: String) { | ||||
|         viewModelScope.launch { | ||||
|             val result = NetworkApi.getTaxRateByRegionName(countryCode, regionName) | ||||
|             mRegionalTaxRateLiveData.value = result | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -64,13 +64,30 @@ | ||||
|             android:layout_marginTop="@dimen/dp_10" | ||||
|             android:text="@string/txt_renewal_year" | ||||
|             android:textSize="@dimen/textSize14" | ||||
|             app:typeface="@string/roboto_bold_font" /> | ||||
|             app:typeface="@string/roboto_regular_font" /> | ||||
|  | ||||
|         <View | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="@dimen/dp_1" | ||||
|             android:layout_below="@id/tv_sure_subscribe_plan_underused" | ||||
|             android:layout_marginTop="@dimen/dp_10" | ||||
|             android:background="@color/block_color" /> | ||||
|  | ||||
|         <com.abbidot.tracker.widget.TypefaceTextView | ||||
|             android:id="@+id/tv_sure_subscribe_plan_money_sum" | ||||
|             style="@style/my_TextView_style_v2" | ||||
|             android:layout_below="@id/tv_sure_subscribe_plan_underused" | ||||
|             android:layout_alignParentEnd="true" | ||||
|             android:layout_marginTop="@dimen/dp_20" | ||||
|             android:text="@string/txt_money_unit" | ||||
|             android:textColor="@color/select_color" | ||||
|             android:textStyle="bold" /> | ||||
|  | ||||
|         <com.abbidot.tracker.widget.TypefaceTextView | ||||
|             android:id="@+id/tv_sure_subscribe_plan_terms_conditions" | ||||
|             style="@style/my_TextView_style_v2" | ||||
|             android:layout_below="@id/tv_sure_subscribe_plan_underused" | ||||
|             android:layout_marginTop="@dimen/dp_10" | ||||
|             android:layout_alignTop="@id/tv_sure_subscribe_plan_money_sum" | ||||
|             android:layout_alignBottom="@id/tv_sure_subscribe_plan_money_sum" | ||||
|             android:text="@string/txt_terms_conditions_v2" | ||||
|             android:textColor="@color/select_color" | ||||
|             android:textSize="@dimen/textSize14" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 yezhiqiu
					yezhiqiu