From 2ad8d82cc0f683ebd1a4c0ce4e489352c96fe805 Mon Sep 17 00:00:00 2001 From: yezhiqiu <123456@qq.com> Date: Sun, 20 Sep 2026 12:17:21 +0800 Subject: [PATCH] =?UTF-8?q?1.=E7=94=A8=E6=88=B7=E5=B7=B2=E8=B4=AD=E5=A5=97?= =?UTF-8?q?=E9=A4=90=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=80=80=E6=AC=BE=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=202.=E4=BC=98=E5=8C=96=E9=80=80=E6=AC=BE=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=EF=BC=8C=E5=86=99=E6=88=90=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=EF=BC=8C=E5=8F=AF=E5=A4=8D=E7=94=A8=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 6 +- .../tracker/adapter/MySubscriptionAdapter.kt | 9 +- .../adapter/SubscriptionHistoryAdapter.kt | 117 ++++++--- .../tracker/bean/SubscriptionsOrderBean.kt | 8 +- .../subscribe/AddCreditCardPaymentActivity.kt | 49 ++-- .../subscribe/MySubscriptionActivity.kt | 16 +- .../subscribe/RefundDetailsActivity.kt | 184 +++++++++++++ .../subscribe/RequestRefundActivity.kt | 17 +- .../subscribe/SubscriptionHistoryActivity.kt | 157 +++++------ .../RefundPolicyBottomSheetFragment.kt | 112 ++++++++ .../java/com/abbidot/tracker/util/ViewUtil.kt | 15 +- .../res/drawable-xhdpi/icon_state_time.png | Bin 0 -> 529 bytes .../res/drawable-xxhdpi/icon_state_time.png | Bin 0 -> 778 bytes .../res/drawable-xxxhdpi/icon_state_time.png | Bin 0 -> 1098 bytes .../selector_refund_state_step_dot.xml | 39 +++ .../layout/activity_help_tracker_status.xml | 1 - .../res/layout/activity_refund_details.xml | 246 ++++++++++++++++++ .../res/layout/activity_request_refund.xml | 14 +- app/src/main/res/layout/activity_splash.xml | 1 - .../layout/activity_subscription_history.xml | 36 --- .../fragment_refund_policy_bottom_sheet.xml | 30 +++ .../layout/item_my_subscription_layout.xml | 35 ++- .../item_subscription_history_layout.xml | 96 ++++++- .../layout_dfu_custom_qmui_group_right.xml | 1 - .../res/layout/layout_refund_state_item.xml | 45 ++++ .../res/layout/sheet_dialog_auto_recharge.xml | 52 ---- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 34 ++- app/src/main/res/values/themes.xml | 9 + gradle.properties | 2 +- 31 files changed, 1054 insertions(+), 284 deletions(-) create mode 100644 app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RefundDetailsActivity.kt create mode 100644 app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/RefundPolicyBottomSheetFragment.kt create mode 100644 app/src/main/res/drawable-xhdpi/icon_state_time.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_state_time.png create mode 100644 app/src/main/res/drawable-xxxhdpi/icon_state_time.png create mode 100644 app/src/main/res/drawable/selector_refund_state_step_dot.xml create mode 100644 app/src/main/res/layout/activity_refund_details.xml create mode 100644 app/src/main/res/layout/fragment_refund_policy_bottom_sheet.xml create mode 100644 app/src/main/res/layout/layout_refund_state_item.xml delete mode 100644 app/src/main/res/layout/sheet_dialog_auto_recharge.xml diff --git a/app/build.gradle b/app/build.gradle index be248ca..4431e50 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,9 +28,9 @@ android { applicationId "com.abbidot.tracker" minSdkVersion 24 targetSdkVersion 35 - versionCode 2502 -// versionName "2.5.2" - versionName "2.5.2-Beta1" + versionCode 2600 +// versionName "2.6.0" + versionName "2.6.0-Beta1" 4 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 147de58..e87da8b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -88,8 +88,7 @@ tools:targetApi="s" /> - - + @@ -109,6 +108,9 @@ android:usesCleartextTraffic="true" tools:replace="android:supportsRtl" tools:targetApi="33"> + diff --git a/app/src/main/java/com/abbidot/tracker/adapter/MySubscriptionAdapter.kt b/app/src/main/java/com/abbidot/tracker/adapter/MySubscriptionAdapter.kt index af097f3..fb4b018 100644 --- a/app/src/main/java/com/abbidot/tracker/adapter/MySubscriptionAdapter.kt +++ b/app/src/main/java/com/abbidot/tracker/adapter/MySubscriptionAdapter.kt @@ -18,6 +18,7 @@ import com.abbidot.tracker.ui.activity.subscribe.ChoosePlanActivity import com.abbidot.tracker.ui.activity.subscribe.MySubscriptionActivity import com.abbidot.tracker.ui.activity.subscribe.SubscriptionHistoryActivity import com.abbidot.tracker.ui.activity.subscribe.SubscriptionPlanActivity +import com.abbidot.tracker.util.Util import com.abbidot.tracker.widget.TypefaceTextView import com.qmuiteam.qmui.skin.QMUISkinManager import com.qmuiteam.qmui.widget.popup.QMUIPopup @@ -44,6 +45,8 @@ class MySubscriptionAdapter( ) { holder!!.setText(R.id.tv_my_subscription_device_out_id, item.deviceOutId) // holder.setText(R.id.tv_my_subscription_plan_name, "${item.mealName}(${item.planCategory})") + holder.getImageView(R.id.iv_my_subscription_device_image) + .setImageResource(Util.getDeviceTypeImage(item.deviceType)) holder.setText(R.id.tv_my_subscription_plan_name, item.mealName) holder.getTextView(R.id.tv_my_subscription_auto_subscription_tips).apply { visibility = if (item.subscriptionStatus == ConstantInt.Open) { @@ -174,7 +177,11 @@ class MySubscriptionAdapter( //UserId不一样就是共享设备的订单 visibility = if (item.userId == userId) { setOnClickListener { - showPop(holder.getView(R.id.iv_my_subscription_btn), item, position) +// showPop(holder.getView(R.id.iv_my_subscription_btn), item, position) + Intent(mContext, SubscriptionHistoryActivity::class.java).let { + it.putExtra(ConstantString.Id, item.subscriptionId) + mMySubscriptionActivity.startActivity(it) + } } View.VISIBLE } else View.GONE diff --git a/app/src/main/java/com/abbidot/tracker/adapter/SubscriptionHistoryAdapter.kt b/app/src/main/java/com/abbidot/tracker/adapter/SubscriptionHistoryAdapter.kt index 7d47187..46cd4ac 100644 --- a/app/src/main/java/com/abbidot/tracker/adapter/SubscriptionHistoryAdapter.kt +++ b/app/src/main/java/com/abbidot/tracker/adapter/SubscriptionHistoryAdapter.kt @@ -4,21 +4,29 @@ import android.content.Context import android.content.Intent import android.view.View import android.widget.TextView +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.LinearLayoutCompat +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView +import com.abbidot.baselibrary.util.LogUtil import com.abbidot.baselibrary.util.Utils import com.abbidot.tracker.R import com.abbidot.tracker.bean.SubscriptionsOrderBean import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.MultipleEntity +import com.abbidot.tracker.ui.activity.subscribe.RefundDetailsActivity import com.abbidot.tracker.ui.activity.subscribe.RequestRefundActivity import com.abbidot.tracker.ui.activity.subscribe.SubscriptionHistoryActivity import com.abbidot.tracker.widget.TypefaceRoundButton +import com.abbidot.tracker.widget.TypefaceTextView import com.chad.library.adapter.base.BaseMultiItemQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.hjq.toast.Toaster +import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButtonDrawable +import com.stripe.android.core.AppInfo /** *Created by .yzq on 2024/8/19/019. @@ -93,6 +101,7 @@ class SubscriptionHistoryAdapter( } private fun bindOrderData(holder: BaseViewHolder, item: SubscriptionsOrderBean) { + val position = getItemPosition(item) holder.setText( R.id.tv_subscription_history_order_id, context.getString(R.string.txt_order_id) + item.renewNum @@ -117,39 +126,11 @@ class SubscriptionHistoryAdapter( visibility = View.VISIBLE when (item.orderStatus) { 1 -> { - if (item.isAutoRenewal == ConstantInt.Type1) { + if (item.subscriptionStatus == ConstantInt.Type1) { visibility = View.GONE } else { setRefundState(context, item.isRefundable, this) } - -// val updateTimestamp = Utils.stringToTimestamp(item.updateTime, isUtc = true) -// val nowTimestamp = System.currentTimeMillis() -// if (item.enabled == ConstantInt.Type0 || (item.surplusDays == 0L && item.subscriptionStatus == ConstantInt.Close)) { -// visibility = View.GONE -// } else if (item.mealUnit == ConstantString.PackageUnitDay) { -// visibility = View.VISIBLE -// setText(R.string.txt_refund) -// } else if (item.mealUnit == ConstantString.PackageUnitMonth) { -// val day7Timestamp = 7 * 24 * 60 * 60 * 1000L -// //套餐超出7天不能退款 -// if (nowTimestamp - updateTimestamp <= day7Timestamp) { -// visibility = View.VISIBLE -// setText(R.string.txt_refund) -// } else { -// visibility = View.GONE -// } -// } else { -// val day30Timestamp = 30 * 24 * 60 * 60 * 1000L -// //套餐超出30天不能退款 -// if (nowTimestamp - updateTimestamp <= day30Timestamp) { -// visibility = View.VISIBLE -// setText(R.string.txt_refund) -// } else { -// visibility = View.GONE -// } -// } -// setTextColor(ContextCompat.getColor(context, R.color.select_color)) } 4 -> setText(R.string.txt_waiting) @@ -177,6 +158,7 @@ class SubscriptionHistoryAdapter( } } } + visibility = View.GONE } val cTimeMillis = System.currentTimeMillis() @@ -194,6 +176,83 @@ class SubscriptionHistoryAdapter( if (item.annualCareType == ConstantInt.Type1) context.getString(R.string.start_txt_yes) else context.getString(R.string.txt_no) } + holder.getView(R.id.tv_subscription_history_refund_result).apply { + text = + if (item.enabled == ConstantInt.Type0) context.getString(R.string.txt_unavailable) + else + //orderStatus=0 支付取消 1支付成功 2支付失败 3待支付 4申请审核中 5退款中 6退款成功 7退款失败 8审核失败 + when (item.orderStatus) { + 1 -> { + if (item.subscriptionStatus == ConstantInt.Type1) context.getString(R.string.txt_unavailable) + else if (item.isRefundable == ConstantInt.Type1) context.getString(R.string.txt_available) + else context.getString(R.string.txt_unavailable) + } + + 4 -> context.getString(R.string.txt_under_review) + 5 -> context.getString(R.string.txt_processing) + 6 -> context.getString(R.string.login_txt_login_finish) + 7 -> context.getString(R.string.txt_failed) + 8 -> context.getString(R.string.txt_declined) + else -> context.getString(R.string.txt_unavailable) + } + } + holder.getView(R.id.cl_subscription_history_refund_item) + .setOnClickListener { + val intent = if (item.enabled == ConstantInt.Type0) null + else + //orderStatus=0 支付取消 1支付成功 2支付失败 3待支付 4申请审核中 5退款中 6退款成功 7退款失败 8审核失败 + when (item.orderStatus) { + 1 -> { + if (item.subscriptionStatus == ConstantInt.Type1) null + else if (item.isRefundable == ConstantInt.Type1) + Intent(context, RequestRefundActivity::class.java) +// Intent(context, RefundDetailsActivity::class.java) + else null + } + + 4, 5, 6, 7, 8 -> + Intent(context, RefundDetailsActivity::class.java) + + else -> null + } + + intent?.let { + it.putExtra(ConstantString.SetMeal, item) + mHistoryActivity.startActivity(it) + } + } + + holder.getView(R.id.iv_subscription_history_refund_arrow).apply { + visibility = if (item.enabled == ConstantInt.Type0) View.GONE + else when (item.orderStatus) { + 1 -> { + if (item.subscriptionStatus == ConstantInt.Type1) View.GONE + else if (item.isRefundable == ConstantInt.Type1) View.VISIBLE + else View.GONE + } + + 4 -> View.VISIBLE + 5 -> View.VISIBLE + 6 -> View.VISIBLE + 7 -> View.VISIBLE + 8 -> View.VISIBLE + else -> View.GONE + } + } + holder.getView(R.id.tv_subscription_history_auto_renew_result).apply { + text = + if (item.subscriptionStatus == ConstantInt.Type1) context.getString(R.string.tracker_manage_set_led_on) + else context.getString(R.string.tracker_manage_set_led_off) + } + holder.getView(R.id.ll_subscription_history_auto_renew_item).apply { + visibility = if (item.enabled == ConstantInt.Type0 || (expiredTime <= 0)) View.GONE + else View.VISIBLE + setOnClickListener { + mHistoryActivity.updateSubscriptionStatus( + item.subscriptionId, item.subscriptionStatus, position + ) + } + } } private fun setRefundState( diff --git a/app/src/main/java/com/abbidot/tracker/bean/SubscriptionsOrderBean.kt b/app/src/main/java/com/abbidot/tracker/bean/SubscriptionsOrderBean.kt index 0a8fa0d..83448e9 100644 --- a/app/src/main/java/com/abbidot/tracker/bean/SubscriptionsOrderBean.kt +++ b/app/src/main/java/com/abbidot/tracker/bean/SubscriptionsOrderBean.kt @@ -21,6 +21,7 @@ data class SubscriptionsOrderBean( var customerId: String, var deviceId: String, var deviceOutId: String, + var deviceType: Int, var enabled: Int, var id: String, var mealDesc: String, @@ -40,7 +41,7 @@ data class SubscriptionsOrderBean( var reactivation: Int, var simId: String, var subscriptionId: String, - var subscriptionStatus: Int, + var subscriptionStatus: Int,//是否是自动续订 1:是 0:否 var surplusDays: Long, var autoRenewPrice: Double, var tax: Double, @@ -56,7 +57,6 @@ data class SubscriptionsOrderBean( var refundTime: Long, var planTimeMonthsCount: Int, var isRefundable: Int,//是否显示退款按钮 1:是 0:否 - var isAutoRenewal: Int,//是否是自动续订 1:是 0:否 @MultipleEntity var menuType: Int, var renewNum: String, var createUserId: String,//这个订单是由哪个用户创建的 @@ -71,6 +71,7 @@ data class SubscriptionsOrderBean( "", "", "", + 1, 0, "", "", @@ -106,7 +107,6 @@ data class SubscriptionsOrderBean( 0L, 0, 0, - 0, menuType, "", "", 0 ) @@ -120,6 +120,7 @@ data class SubscriptionsOrderBean( "", "", "", + 1, 0, "", "", @@ -155,7 +156,6 @@ data class SubscriptionsOrderBean( 0L, 0, 0, - 0, MultipleEntity.TEXT, "", "", 0 ) diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt index 8aef757..a85c777 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt @@ -134,7 +134,8 @@ class AddCreditCardPaymentActivity : ilAddCardNameOnCard.root, ilAddCardNumber.root, llAddCardCvcLayout, - llAddCardMmDdLayout, tvAddCardExperienceBtn + llAddCardMmDdLayout, + tvAddCardExperienceBtn ) } } @@ -162,8 +163,7 @@ class AddCreditCardPaymentActivity : } override fun onRequestError(exceptionCode: String?) { - setButtonEnabled(mRightImageButton, ConstantInt.Type1) - setButtonEnabled(mViewBinding.btnSaveNewCreditCard, ConstantInt.Type1) + setBtnEnabled(ConstantInt.Type1) } }) } @@ -175,8 +175,7 @@ class AddCreditCardPaymentActivity : } override fun onRequestError(exceptionCode: String?) { - setButtonEnabled(mRightImageButton, ConstantInt.Type1) - setButtonEnabled(mViewBinding.btnSaveNewCreditCard, ConstantInt.Type1) + setBtnEnabled(ConstantInt.Type1) } }) } @@ -290,8 +289,8 @@ class AddCreditCardPaymentActivity : // 用 PaymentMethodCreateParams 封装银行卡,不再直接new Card val cardParams = PaymentMethodCreateParams.Card.Builder().setNumber(cardNumber) - .setExpiryMonth(dates[0].toInt()) - .setExpiryYear(dates[1].toInt()).setCvc(cvv).build() + .setExpiryMonth(dates[0].toInt()).setExpiryYear(dates[1].toInt()) + .setCvc(cvv).build() val paymentMethodParams = PaymentMethodCreateParams.create(cardParams) val stripeKey = ThirdPartyUtil.instance.getStripeKey(mContext) LogUtil.e("支付stripeKey=$stripeKey") @@ -346,8 +345,14 @@ class AddCreditCardPaymentActivity : } }, getString(R.string.txt_auto_renewal_on), - R.string.txt_turn_off_remove, R.string.txt_cancel - ) + R.string.txt_turn_off_remove, + R.string.txt_cancel, + cancelListener = object : BaseDialog.OnDialogCancelListener { + override fun onCancelClick(dialog: BaseDialog<*>) { + dialog.dismiss() + setBtnEnabled(ConstantInt.Type1) + } + }) } else { ViewUtil.instance.showDialog( this@AddCreditCardPaymentActivity, @@ -359,11 +364,22 @@ class AddCreditCardPaymentActivity : } }, getString(R.string.txt_remove_pay_method) + if (AppUtils.isChina()) "?" else "?", - R.string.txt_remove, R.string.txt_cancel - ) + R.string.txt_remove, + R.string.txt_cancel, + cancelListener = object : BaseDialog.OnDialogCancelListener { + override fun onCancelClick(dialog: BaseDialog<*>) { + dialog.dismiss() + setBtnEnabled(ConstantInt.Type1) + } + }) } } + private fun setBtnEnabled(enabledState: Int) { + setButtonEnabled(mViewBinding.btnSaveNewCreditCard, enabledState) + setButtonEnabled(mRightImageButton, enabledState) + } + override fun onClick(v: View?) { mViewBinding.apply { if (v != tvAddCardExperienceBtn && isLimitClick()) return @@ -379,8 +395,7 @@ class AddCreditCardPaymentActivity : ilAddCardNameOnCard.root -> setClickEditViewVisible(ilAddCardNameOnCard.etInputView2Content) ilAddCardNumber.root -> setClickEditViewVisible(ilAddCardNumber.etInputView2Content) mRightImageButton -> { - setButtonEnabled(btnSaveNewCreditCard, ConstantInt.Type0) - setButtonEnabled(mRightImageButton, ConstantInt.Type0) + setBtnEnabled(ConstantInt.Type0) mSubscriptionPayViewModel.getOrderAutoRenewalStatus() } } @@ -390,12 +405,12 @@ class AddCreditCardPaymentActivity : override fun onFocusChange(v: View?, hasFocus: Boolean) { mViewBinding.apply { when (v!!) { - ilAddCardNameOnCard.etInputView2Content -> - setEditViewNoFocusHide(ilAddCardNameOnCard.etInputView2Content, hasFocus) + ilAddCardNameOnCard.etInputView2Content -> setEditViewNoFocusHide( + ilAddCardNameOnCard.etInputView2Content, hasFocus + ) ilAddCardNumber.etInputView2Content -> setEditViewNoFocusHide( - ilAddCardNumber.etInputView2Content, - hasFocus + ilAddCardNumber.etInputView2Content, hasFocus ) etAddCardMmDdContent -> setEditViewNoFocusHide(etAddCardMmDdContent, hasFocus) diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/MySubscriptionActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/MySubscriptionActivity.kt index 2b4bd4f..119a940 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/MySubscriptionActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/MySubscriptionActivity.kt @@ -1,5 +1,6 @@ package com.abbidot.tracker.ui.activity.subscribe +import android.content.Context import androidx.activity.viewModels import com.abbidot.baselibrary.constant.EventName import com.abbidot.baselibrary.eventbus.XEventBus @@ -7,6 +8,7 @@ import com.abbidot.baselibrary.util.AppUtils import com.abbidot.tracker.R import com.abbidot.tracker.adapter.MySubscriptionAdapter import com.abbidot.tracker.base.BaseActivity +import com.abbidot.tracker.base.BaseDialog import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.databinding.ActivityMySubscriptionBinding @@ -91,8 +93,20 @@ class MySubscriptionActivity : mPosition = position val messageId = if (0 == status) R.string.txt_auto_recharge_title else R.string.txt_auto_recharge_content - ViewUtil.instance.operateDialogTips(mContext, messageId) { + operateDialogTips(mContext, messageId) { mSubscriptionViewModel.updateSubscriptionStatus(subscriptionId, status) } } + + /** + * 操作提示框 + */ + private fun operateDialogTips(context: Context, messageID: Int, okCallback: () -> Unit) { + ViewUtil.instance.showDialog(context, messageID, object : BaseDialog.OnDialogOkListener { + override fun onOkClick(dialog: BaseDialog<*>) { + dialog.dismiss() + okCallback() + } + }, okTextResId = R.string.start_txt_yes) + } } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RefundDetailsActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RefundDetailsActivity.kt new file mode 100644 index 0000000..e65427d --- /dev/null +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RefundDetailsActivity.kt @@ -0,0 +1,184 @@ +package com.abbidot.tracker.ui.activity.subscribe + +import android.R.attr.visibility +import android.os.Bundle +import android.view.View +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.abbidot.baselibrary.util.Utils +import com.abbidot.tracker.R +import com.abbidot.tracker.base.BaseActivity +import com.abbidot.tracker.bean.SubscriptionsOrderBean +import com.abbidot.tracker.constant.ConstantString +import com.abbidot.tracker.databinding.ActivityRefundDetailsBinding +import com.abbidot.tracker.ui.fragment.subscribe.RefundPolicyBottomSheetFragment +import com.abbidot.tracker.util.Util +import com.abbidot.tracker.util.ViewUtil +import com.qmuiteam.qmui.widget.QMUITopBar + +class RefundDetailsActivity : + BaseActivity(ActivityRefundDetailsBinding::inflate) { + + //套餐 + private var mSetMealBean: SubscriptionsOrderBean? = null + + override fun getTopBar() = mViewBinding.ilRefundDetailsTopBar.titleTopBar + + override fun initData() { + super.initData() + setTopBarTitle(R.string.txt_refund_details) + setLeftBackImage(R.drawable.icon_white_back_svg) + + mSetMealBean = Util.getParcelableAdaptive( + intent, ConstantString.SetMeal, SubscriptionsOrderBean::class.java + ) + + mViewBinding.apply { + mSetMealBean?.let { + tvRefundDetailsPlanName.text = it.mealName + tvRefundDetailsOrderId.text = it.renewNum + tvRefundDetailsRefundAmount.text = + String.format(getString(R.string.txt_money_unit), "${it.totalAmountWithTax}") + tvRefundDetailsOrderTime.text = + Utils.formatTime(it.payTime, Utils.DATE_FORMAT_PATTERN_CN2) + + val typeface = ViewUtil.instance.setTypeface(mContext, ViewUtil.FONT_BOLD_NAME) + ilRefundDetailsStateStep1.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep1.ivRefundStateStepDot.isActivated = true + ilRefundDetailsStateStep1.tvRefundStateStepTitle.setText(R.string.txt_request_submit) + ilRefundDetailsStateStep1.tvRefundStateStepDesc.setText(R.string.txt_request_submit_dec) + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setText(R.string.txt_under_review) + ilRefundDetailsStateStep2.tvRefundStateStepDesc.visibility = View.GONE + ilRefundDetailsStateStep3.tvRefundStateStepTitle.setText(R.string.txt_refund_processing) + ilRefundDetailsStateStep3.tvRefundStateStepDesc.visibility = View.GONE + ilRefundDetailsStateStep4.tvRefundStateStepTitle.setText(R.string.txt_refund_completed) + ilRefundDetailsStateStep4.tvRefundStateStepDesc.visibility = View.GONE + ilRefundDetailsStateStep4.viewRefundStateStepLine.visibility = View.GONE + + //orderStatus=0 支付取消 1支付成功 2支付失败 3待支付 4申请审核中 5退款中 6退款成功 7退款失败 8审核失败 + when (it.orderStatus) { + 4 -> { + tvRefundDetailsStateTitle.setText(R.string.txt_refund_pending) + tvRefundDetailsStateContent.text = + getString(R.string.txt_refund_pending_tips) + + ilRefundDetailsStateStep1.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep1.tvRefundStateStepDesc.text = + "2026年9月18日 15:40:07" + ilRefundDetailsStateStep2.ivRefundStateStepDot.isActivated = true + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setTextColor( + ContextCompat.getColor( + mContext, R.color.select_color + ) + ) + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep2.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep2.tvRefundStateStepDesc.setText(R.string.txt_under_review_dec) + } + + 5 -> { + tvRefundDetailsStateTitle.text = getString(R.string.txt_refund_processing) + tvRefundDetailsStateContent.text = + getString(R.string.txt_refund_processing_tips) + + ilRefundDetailsStateStep1.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep1.tvRefundStateStepDesc.text = + "2026年9月18日 15:40:07" + ilRefundDetailsStateStep2.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep2.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep2.tvRefundStateStepDesc.setText(R.string.txt_under_review_dec) + ilRefundDetailsStateStep3.tvRefundStateStepTitle.setTextColor( + ContextCompat.getColor( + mContext, R.color.select_color + ) + ) + ilRefundDetailsStateStep3.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep3.tvRefundStateStepDesc.setText(R.string.txt_refund_processing_tips) + ilRefundDetailsStateStep3.ivRefundStateStepDot.isActivated = true + ilRefundDetailsStateStep3.tvRefundStateStepTitle.setTypeface(typeface) + } + + 6 -> { + tvRefundDetailsStateTitle.setText(R.string.txt_refund_completed) + tvRefundDetailsStateContent.setText(R.string.txt_refund_success_tips) + + ilRefundDetailsStateStep1.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep1.tvRefundStateStepDesc.text = + "2026年9月18日 15:40:07" + ilRefundDetailsStateStep2.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep2.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep2.tvRefundStateStepDesc.setText(R.string.txt_under_review_dec) + ilRefundDetailsStateStep3.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep3.tvRefundStateStepDesc.setText(R.string.txt_refund_processing_tips) + ilRefundDetailsStateStep3.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep3.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep4.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep4.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep4.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep4.tvRefundStateStepDesc.setText(R.string.txt_refund_success_tips) + } + + 7 -> { + tvRefundDetailsStateTitle.setText(R.string.txt_refund_unsuccessful) + tvRefundDetailsStateContent.setText(R.string.txt_refund_fail_tips) + + ilRefundDetailsStateStep1.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep1.tvRefundStateStepDesc.text = + "2026年9月18日 15:40:07" + ilRefundDetailsStateStep2.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep2.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep2.tvRefundStateStepDesc.setText(R.string.txt_under_review_dec) + ilRefundDetailsStateStep3.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep3.tvRefundStateStepDesc.setText(R.string.txt_refund_processing_tips) + ilRefundDetailsStateStep3.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep3.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep4.tvRefundStateStepTitle.setText(R.string.txt_refund_failed) + ilRefundDetailsStateStep4.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep4.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep4.tvRefundStateStepDesc.setText(R.string.txt_refund_failed_dec) + ilRefundDetailsStateStep4.ivRefundStateStepDot.setImageResource(R.drawable.icon_permission_error_check_svg) + } + + 8 -> { + tvRefundDetailsStateTitle.setText(R.string.txt_refund_unsuccessful) + tvRefundDetailsStateContent.setText(R.string.txt_refund_fail_tips) + + ilRefundDetailsStateStep1.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep1.tvRefundStateStepDesc.text = + "2026年9月18日 15:40:07" + ilRefundDetailsStateStep2.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep2.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep2.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep2.tvRefundStateStepDesc.setText(R.string.txt_under_review_dec) + ilRefundDetailsStateStep3.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep3.tvRefundStateStepDesc.setText(R.string.txt_refund_processing_tips) + ilRefundDetailsStateStep3.ivRefundStateStepDot.isSelected = true + ilRefundDetailsStateStep3.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep4.tvRefundStateStepTitle.setText(R.string.txt_refund_declined) + ilRefundDetailsStateStep4.tvRefundStateStepTitle.setTypeface(typeface) + ilRefundDetailsStateStep4.tvRefundStateStepDesc.visibility = View.VISIBLE + ilRefundDetailsStateStep4.tvRefundStateStepDesc.setText(R.string.txt_refund_fail_tips) + ilRefundDetailsStateStep4.ivRefundStateStepDot.setImageResource(R.drawable.icon_permission_error_check_svg) + } + } + } + + setOnClickListenerViews(tvRefundDetailsRefundPolicy) + } + } + + override fun onClick(v: View?) { + mViewBinding.apply { + when (v!!) { + tvRefundDetailsRefundPolicy -> RefundPolicyBottomSheetFragment.newInstance() + .show(supportFragmentManager, "refund_sheet") + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RequestRefundActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RequestRefundActivity.kt index 024c721..effc0bb 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RequestRefundActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/RequestRefundActivity.kt @@ -2,6 +2,7 @@ package com.abbidot.tracker.ui.activity.subscribe import android.text.TextUtils import android.view.View +import android.widget.TextView import androidx.activity.viewModels import com.abbidot.baselibrary.constant.EventName import com.abbidot.baselibrary.eventbus.XEventBus @@ -12,8 +13,12 @@ import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.databinding.ActivityRequestRefundBinding +import com.abbidot.tracker.ui.fragment.subscribe.RefundPolicyBottomSheetFragment import com.abbidot.tracker.util.Util import com.abbidot.tracker.vm.SubscriptionManageViewModel +import com.easysocket.utils.LogUtil +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog class RequestRefundActivity : BaseActivity(ActivityRequestRefundBinding::inflate) { @@ -46,7 +51,7 @@ class RequestRefundActivity : tvRequestRefundRefund.text = refundRefund } - setOnClickListenerViews(btnRequestRefundRecharge) + setOnClickListenerViews(btnRequestRefundRecharge, tvRequestRefundPolicy) } } @@ -106,11 +111,17 @@ class RequestRefundActivity : } } + override fun onClick(v: View?) { - setButtonEnabled(v!!) mViewBinding.apply { when (v) { - btnRequestRefundRecharge -> commitRefund() + btnRequestRefundRecharge -> { + setButtonEnabled(v) + commitRefund() + } + + tvRequestRefundPolicy -> RefundPolicyBottomSheetFragment.newInstance() + .show(supportFragmentManager, "refund_sheet") } } } diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SubscriptionHistoryActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SubscriptionHistoryActivity.kt index 5ebac75..b7bd1f0 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SubscriptionHistoryActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SubscriptionHistoryActivity.kt @@ -10,6 +10,7 @@ import com.abbidot.tracker.R import com.abbidot.tracker.adapter.HelpTextImageTypeAdapter import com.abbidot.tracker.adapter.SubscriptionHistoryAdapter import com.abbidot.tracker.base.BaseActivity +import com.abbidot.tracker.base.BaseDialog import com.abbidot.tracker.bean.MenuTxtBean import com.abbidot.tracker.bean.SubscriptionsOrderBean import com.abbidot.tracker.constant.ConstantInt @@ -17,6 +18,7 @@ import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.constant.MultipleEntity import com.abbidot.tracker.databinding.ActivitySubscriptionHistoryBinding +import com.abbidot.tracker.ui.fragment.subscribe.RefundPolicyBottomSheetFragment import com.abbidot.tracker.util.ViewUtil import com.abbidot.tracker.vm.SubscriptionManageViewModel import com.daimajia.androidanimations.library.Techniques @@ -32,6 +34,8 @@ class SubscriptionHistoryActivity : private var subscriptionId = "" private var mRefreshPackage = true + private var mPosition = 0 + override fun getTopBar() = mViewBinding.ilSubscriptionHistoryTopBar.titleTopBar override fun initData() { @@ -47,72 +51,10 @@ class SubscriptionHistoryActivity : ViewUtil.instance.setRecyclerViewVerticalLinearLayout( mContext, rvSubscriptionHistoryList, mHistoryAdapter, bottom = AppUtils.dpToPx(12) ) - setOnClickListenerViews(btnSubscriptionRefundIssue, tvCloseRefundIssueBtn) + setOnClickListenerViews(btnSubscriptionRefundIssue) } - - initIssue() } - private fun initIssue() { - val menuList = mutableListOf() - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_refund_policy), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - isSwitch = true, - state = 16 - ) - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_automatic_refund), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - isSwitch = true, - state = 12 - ) - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_automatic_refund_dec), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - state = 12 - ) - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_standard_refund), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - isSwitch = true, - state = 12 - ) - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_standard_refund_dec), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - state = 12 - ) - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_no_refund), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - isSwitch = true, - state = 12 - ) - ViewUtil.instance.addMenuBean( - menuList, - getString(R.string.txt_no_refund_dec), - menuType = MultipleEntity.TEXT_TEXT_IMG, - colorRedId = R.color.data_black_color, - state = 12 - ) - val helpBatteryAdapter = HelpTextImageTypeAdapter(menuList) - ViewUtil.instance.setRecyclerViewVerticalLinearLayout( - mContext, mViewBinding.rvSubscriptionRefundIssueList, helpBatteryAdapter - ) - } override fun onResume() { super.onResume() @@ -126,51 +68,74 @@ class SubscriptionHistoryActivity : XEventBus.observe(this, EventName.RefreshPackage) { mRefreshPackage = true } - mSubscriptionViewModel.mSubscriptionsHistoryLiveData.observe(this) { - dealRequestResult(it, object : GetResultCallback { - override fun onResult(any: Any) { - it.getOrNull()?.let { list -> - if (mSubscriptionsOrderList.size > 0) { - mHistoryAdapter.notifyItemRangeRemoved(0, mSubscriptionsOrderList.size) - mSubscriptionsOrderList.clear() - } - for (l in list) { - mSubscriptionsOrderList.add(l) - if (l.annualCareType == ConstantInt.Type1) { - val subscriptionsOrder = l.copy(menuType = MultipleEntity.IMG) - mSubscriptionsOrderList.add(subscriptionsOrder) + mSubscriptionViewModel.apply { + mSubscriptionsHistoryLiveData.observe(this@SubscriptionHistoryActivity) { + dealRequestResult(it, object : GetResultCallback { + override fun onResult(any: Any) { + it.getOrNull()?.let { list -> + if (mSubscriptionsOrderList.isNotEmpty()) { + mHistoryAdapter.notifyItemRangeRemoved( + 0, + mSubscriptionsOrderList.size + ) + mSubscriptionsOrderList.clear() } + for (l in list) { + mSubscriptionsOrderList.add(l) + if (l.annualCareType == ConstantInt.Type1) { + val subscriptionsOrder = l.copy(menuType = MultipleEntity.IMG) + mSubscriptionsOrderList.add(subscriptionsOrder) + } + } + mHistoryAdapter.notifyItemRangeChanged(0, mSubscriptionsOrderList.size) } - mHistoryAdapter.notifyItemRangeChanged(0, mSubscriptionsOrderList.size) } - } - }) + }) + } + + mUpdateStatusListLiveData.observe(this@SubscriptionHistoryActivity) { + dealRequestResult(it, object : GetResultCallback { + override fun onResult(any: Any) { + showToast(R.string.txt_successful) + XEventBus.post(EventName.RefreshPackage) + mHistoryAdapter.data[mPosition].let { bean -> + bean.subscriptionStatus = + if (bean.subscriptionStatus == ConstantInt.Close) ConstantInt.Open + else ConstantInt.Close + mHistoryAdapter.notifyItemChanged(mPosition) + } + } + }) + } } } - /** - * 显示问题 - */ - private fun showLedIssue() { - mViewBinding.apply { - if (llSubscriptionRefundIssueLayout.isGone) { - YoYo.with(Techniques.BounceInUp).duration(700).onStart { - llSubscriptionRefundIssueLayout.visibility = View.VISIBLE - vRefundIssueShadeView.visibility = View.VISIBLE - }.playOn(llSubscriptionRefundIssueLayout) - } else { - vRefundIssueShadeView.visibility = View.GONE - YoYo.with(Techniques.SlideOutDown).duration(600).onEnd { - llSubscriptionRefundIssueLayout.visibility = View.GONE - }.playOn(llSubscriptionRefundIssueLayout) - } + fun updateSubscriptionStatus(subscriptionId: String, status: Int, position: Int) { + mPosition = position + var messageId = 0 + var renewStatus: Int + val title = if (0 == status) { + renewStatus = ConstantInt.Open + R.string.txt_turn_on_auto_renew + } else { + renewStatus = ConstantInt.Close + messageId = R.string.txt_plan_active_until_expires + R.string.txt_turn_off_auto_renew } + + ViewUtil.instance.showDialog(mContext, messageId, object : BaseDialog.OnDialogOkListener { + override fun onOkClick(dialog: BaseDialog<*>) { + dialog.dismiss() + mSubscriptionViewModel.updateSubscriptionStatus(subscriptionId, renewStatus) + } + }, okTextResId = R.string.start_txt_yes, title = getString(title)) } override fun onClick(v: View?) { mViewBinding.apply { when (v!!) { - btnSubscriptionRefundIssue, tvCloseRefundIssueBtn -> showLedIssue() + btnSubscriptionRefundIssue -> RefundPolicyBottomSheetFragment.newInstance() + .show(supportFragmentManager, "refund_sheet") } } } diff --git a/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/RefundPolicyBottomSheetFragment.kt b/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/RefundPolicyBottomSheetFragment.kt new file mode 100644 index 0000000..6d25192 --- /dev/null +++ b/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/RefundPolicyBottomSheetFragment.kt @@ -0,0 +1,112 @@ +package com.abbidot.tracker.ui.fragment.subscribe + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.abbidot.tracker.R +import com.abbidot.tracker.adapter.HelpTextImageTypeAdapter +import com.abbidot.tracker.bean.MenuTxtBean +import com.abbidot.tracker.constant.MultipleEntity +import com.abbidot.tracker.databinding.FragmentRefundPolicyBottomSheetBinding +import com.abbidot.tracker.util.ViewUtil +import com.baidu.mshield.x0.EngineImpl.mContext +import com.google.android.material.bottomsheet.BottomSheetDialogFragment + +/** + * 退款政策弹窗 + */ +class RefundPolicyBottomSheetFragment : BottomSheetDialogFragment() { + + private lateinit var mViewBinding: FragmentRefundPolicyBottomSheetBinding + + companion object { + fun newInstance(): RefundPolicyBottomSheetFragment { + return RefundPolicyBottomSheetFragment() + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + mViewBinding = FragmentRefundPolicyBottomSheetBinding.inflate(inflater, container, false) + return mViewBinding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + // Close按钮关闭弹窗 + mViewBinding.tvCloseRefundIssueBtn.setOnClickListener { + dismiss() + } + initIssue() + } + + + // 给Fragment设置圆角样式 + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NORMAL, R.style.MyBottomSheetStyle) + } + + private fun initIssue() { + val menuList = mutableListOf() + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_refund_policy), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + isSwitch = true, + state = 16 + ) + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_automatic_refund), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + isSwitch = true, + state = 12 + ) + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_automatic_refund_dec), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + state = 12 + ) + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_standard_refund), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + isSwitch = true, + state = 12 + ) + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_standard_refund_dec), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + state = 12 + ) + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_no_refund), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + isSwitch = true, + state = 12 + ) + ViewUtil.instance.addMenuBean( + menuList, + getString(R.string.txt_no_refund_dec), + menuType = MultipleEntity.TEXT_TEXT_IMG, + colorRedId = R.color.data_black_color, + state = 12 + ) + val helpBatteryAdapter = HelpTextImageTypeAdapter(menuList) + ViewUtil.instance.setRecyclerViewVerticalLinearLayout( + mContext, mViewBinding.rvSubscriptionRefundIssueList, helpBatteryAdapter + ) + } +} diff --git a/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt b/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt index 6907d9f..798a730 100644 --- a/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt +++ b/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt @@ -462,9 +462,10 @@ class ViewUtil private constructor() { cancelListener: BaseDialog.OnDialogCancelListener? = null ) { try { + val content = if (contentResId == 0) "" else context.getString(contentResId) showDialog( context, - context.getString(contentResId), + content, okListener, title, okTextResId, @@ -1135,18 +1136,6 @@ class ViewUtil private constructor() { } } - /** - * 操作提示框 - */ - fun operateDialogTips(context: Context, messageID: Int, okCallback: () -> Unit) { - showDialog(context, messageID, object : BaseDialog.OnDialogOkListener { - override fun onOkClick(dialog: BaseDialog<*>) { - dialog.dismiss() - okCallback() - } - }, okTextResId = R.string.start_txt_yes) - } - /** * 手动连接蓝牙提示 */ diff --git a/app/src/main/res/drawable-xhdpi/icon_state_time.png b/app/src/main/res/drawable-xhdpi/icon_state_time.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca5815d2b541db096b8773544e4619aa13dfc8a GIT binary patch literal 529 zcmV+s0`C2ZP)4v#PsAtKnwagL2fbJB3tKZHRJ)HH?vj=pVRjfzTv?!GzS{|fWj1k@Om9eb z9c{fO2MhisiPO8S&7B3zatb}kyLk;}{dVGI$q+ybP++^uK}D#r)(R3W5amH*+5a8} zAnIkIXn;Bykhf4(WS_KP(LmKYW)xjz9INd3BntgAv0;|gD7-L%st%Tyyh2rcU!Xyj zq73Wt1dRf@#v`-@RY3(9WiqNL77eNyE;j3fTAGI5mEOq|%$?~-Vu=?CC zMMLuoYfca@5*P1TdqtCA*LclUU(1}0*yy^tkUQ>qzH5O`OqwXU_4k=siqTH?31F=# zL1kNB1hfu3CZOd(&z0QYeV6j$fd$ViykpyEJz20}rT}DaOb2h43zRS}^Mr??9WN1^bkAM>S?`v&LEFmnbL5p}EI6M=IQ7+nk#OD`<&W zx}mo?SFeR>p9T$?2X16hrncG1q)U9bD>6m7*hZ2>$qoXzz!HXaV$z;8>sCW~P)3tP z#m5h_Yht;UKzqOv1xs5yn8MhJw2WJ@nUyu>I$n6xOcQanl<-%RUG4PC3K~ktoc4C` zaV2*8v|vB@xJ5*b6`(7Q-Zr#UMB5kPiV|z+5M9Xk(nE*nVq76SD-7vkTp_%ig&-;y zi96>osvHciA_SI!;HwCMlIR%@!eq?|m<<$e7Gf0GFAb7B1mA0hStnX|I)giB+Hc`9 zTo{{~FXMA!bK+yw+P;>43U`i^Rx#Ad1nyTSxRRXU;x@0F(V?7RKJXDP0X*X}`=V}T zm+>JkWPGxZ@8aVyUh;~lXC?3a;4Lsr0%PFy)N!tD>i*EvZB17)A%GN0e&h4_#oN+Y zyO?YUVFpjzwL3ys!0I;N5kd#n?;u-3RN(bYU+buGeKp?&ncaYEU76(VM!vSCwGqQ` zc{GbCtgh~)_6?7?`#H!CtIg02lXxmRZ!o00tkr*w@-2;NXFHDWd)|MFx}6)`NzlNH zmn&5<*^`1e|Is;PzJDms+;`?fnON5*)E zTykXiwk7DZ-hzGyvQ2+n{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/icon_state_time.png b/app/src/main/res/drawable-xxxhdpi/icon_state_time.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cfd4a7811b0aec7a580a39ca72f47d4d731f51 GIT binary patch literal 1098 zcmV-Q1hxB#P)?Sv|KEIs1VtdEJL+!Lmh-Zg0Xp5e0GiL|{k#gi3OuU7 zx-Q@C^Dlk2pUbj73inx81`LN8G! zz=<;QK?#0PEX54E^Dsa+1I%>IPbY-79oAb;7xIQBAk4t5p0k`P3`nNpdalUBph5ny zl40I*qKC^t8F&JVA6!fjRDI!`iMt~K-vrI*sBathUrJBj&p(` zN`X!W&+O?X$5Upiuc!+Yqig{MYKIb~E(a=EGm2lh0`g3Cv*}f&VwaRxQc*6?RRC4O5S<-cgcus$`MDscq6l$BSKrseb_pl$h;BldGlhZT$}YkbO# z-SI1+WX8~elw+o?4nG3g#!LtlIw4DN4yyxM8{msp$%kP|vP|`033DBS=IBN46KB)m zIW{P8Av($j_x$9R;;`QrK(2RzQqRSPrzE!EXPF6whk-iYWxWjmN1cG;o4A^Tq8eue zwmNXAhWFTQhRfF(D6xz0?uHaL3LbkhqpE~;lAqs~r(x`KH4~COB~^B~s9D{S?*x=i z8l+0tSKkZzdbMeC^^GQt&(&17SR2!K%5`=Ny`=Af+6VfCXnBwxrCRo!ZvOnbt&d5) zt;PJ_$VMS*9)%=pn3K}kfMhjEv>Z+&1-O6@eB%%;UX4>7DDOW&0Umyn9!FM$UmT#= zP?%`<4Z5Z`4ts8`a@^!r#dKFg$9Wv9BdUvuzTiVJ@fUo0lVl!xSO!RjVrfqpIOVJF zL;-Q@+d{bXr$xxu)807%aVK-l;ZD#KboZz>nj4yQEL0k@K!3Je-M8%nlcQ}URc{e# z?Uk8zM-v5G91}f4AFXmQ?9s#&@yqEji=JVsUM<+nJ|+&Wwxg5RN>McthG~ikHSDDS z@!VZ_fu^9II`dNBW#6pW^)o^>Yd)xHfJ_@lYRgQ0nWfKH_mlk9rHWlyGJvgM>R)ez z?0st?da=gK-Z-}fcH1_2M4e&iyaC?jNyD@%ep18u@-$vpp?Bh|z@JgzKk7yviKZ^o QQUCw|07*qoM6N<$f-|iB!~g&Q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/selector_refund_state_step_dot.xml b/app/src/main/res/drawable/selector_refund_state_step_dot.xml new file mode 100644 index 0000000..7c763e7 --- /dev/null +++ b/app/src/main/res/drawable/selector_refund_state_step_dot.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_help_tracker_status.xml b/app/src/main/res/layout/activity_help_tracker_status.xml index 581cd0a..3e883e7 100644 --- a/app/src/main/res/layout/activity_help_tracker_status.xml +++ b/app/src/main/res/layout/activity_help_tracker_status.xml @@ -2,7 +2,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_request_refund.xml b/app/src/main/res/layout/activity_request_refund.xml index 013a2e9..51edfc8 100644 --- a/app/src/main/res/layout/activity_request_refund.xml +++ b/app/src/main/res/layout/activity_request_refund.xml @@ -77,9 +77,21 @@ android:id="@+id/btn_request_refund_recharge" style="@style/my_RoundRect_Button_style" android:layout_gravity="center" - android:layout_marginBottom="@dimen/dp_80" + android:layout_marginBottom="@dimen/dp_40" android:background="@drawable/shape8_gray_yellow_bg" android:text="@string/register_txt_submit" app:qmui_radius="@dimen/dp_50" app:typeface="@string/roboto_bold_font" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index cebb404..f858037 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -12,7 +12,6 @@ android:layout_width="290dp" android:layout_height="290dp" android:src="@drawable/abbidot_logo_loading" - android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" diff --git a/app/src/main/res/layout/activity_subscription_history.xml b/app/src/main/res/layout/activity_subscription_history.xml index 1b45671..936928b 100644 --- a/app/src/main/res/layout/activity_subscription_history.xml +++ b/app/src/main/res/layout/activity_subscription_history.xml @@ -35,40 +35,4 @@ android:paddingHorizontal="@dimen/dp_20" android:paddingVertical="@dimen/dp_12" /> - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_refund_policy_bottom_sheet.xml b/app/src/main/res/layout/fragment_refund_policy_bottom_sheet.xml new file mode 100644 index 0000000..7d22c48 --- /dev/null +++ b/app/src/main/res/layout/fragment_refund_policy_bottom_sheet.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/main/res/layout/item_my_subscription_layout.xml b/app/src/main/res/layout/item_my_subscription_layout.xml index e79c252..bd88f7c 100644 --- a/app/src/main/res/layout/item_my_subscription_layout.xml +++ b/app/src/main/res/layout/item_my_subscription_layout.xml @@ -10,10 +10,9 @@ + android:layout_gravity="end"> + android:src="@drawable/icon_point_bg_svg" + android:visibility="gone" /> + + @@ -34,12 +43,14 @@ android:textSize="@dimen/textSize36" android:textStyle="bold" /> - + + android:orientation="horizontal" + android:visibility="gone"> @@ -37,11 +36,11 @@ android:id="@+id/tv_subscription_history_annual_care_title" style="@style/my_TextView_style_v2" android:layout_below="@id/tv_subscription_history_order_time" - android:text="@string/txt_annual_care_text1" - android:visibility="gone" android:layout_marginTop="@dimen/dp_4" + android:text="@string/txt_annual_care_text1" android:textSize="@dimen/textSize14" - android:textStyle="bold" /> + android:textStyle="bold" + android:visibility="gone" /> + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_dfu_custom_qmui_group_right.xml b/app/src/main/res/layout/layout_dfu_custom_qmui_group_right.xml index 1ab0ae2..e865057 100644 --- a/app/src/main/res/layout/layout_dfu_custom_qmui_group_right.xml +++ b/app/src/main/res/layout/layout_dfu_custom_qmui_group_right.xml @@ -1,6 +1,5 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/sheet_dialog_auto_recharge.xml b/app/src/main/res/layout/sheet_dialog_auto_recharge.xml deleted file mode 100644 index d2320ff..0000000 --- a/app/src/main/res/layout/sheet_dialog_auto_recharge.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ee28900..6a4ec5f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -382,4 +382,5 @@ #758E94 #FF996E #FEF6E4 + #0099CC \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98ce66f..575b148 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -164,7 +164,7 @@ Bluetooth Radar Saved. Active when online. Refund period has expired - Refund Policy\n + Refund Policy Automatic Refund (Within 48 Hours) All subscription purchases are eligible for a full automatic refund within 48 hours of payment. Refunds will be processed automatically without manual review.\n Standard Refund Window (30 Days) @@ -1000,4 +1000,36 @@ Remove Turn Off & Remove Unauthorized app. Download from official sources + + Auto-Renewal + Unavailable + Available + Under Review + Processing + Failed + Declined + Turn off auto-renew? + Turn on auto-renew? + Your refund request has been submitted and is being reviewed. + Your plan stays active until it expires. + Refund details + Plan + Order ID + Order Time + Paid Method + Refund Amount + Refund Status + Refund Processing + Your refund has been approved and is being processed. + Refund Completed + Refund Unsuccessful + Your refund has been sent to your original payment method. + Your refund request was not approved. + Your refund request has been submitted. + Request Submitted + Your refund request is being reviewed. + We couldn\'t complete your refund. Please try again or contact support. + Refund Failed + Refund Declined + Refund Pending \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d0c5efc..8e4f144 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -256,4 +256,13 @@ + + + + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f048349..44ded6e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true #Wed Jul 08 17:07:15 CST 2026 -BAIDU_MAP_KEY=YT2CmlqAkpMyzmw1AKNIBlYlBtHESEaW +BAIDU_MAP_KEY=Y3ANA8hXCrz0rj2HTXVdq9fWvBMx2B4b BUGLY_KEY=06fc0a9cd1 GOOGLE_MAP_KEY=AIzaSyCFEqlOoo2274NsX7tzoQjs_DA7B9N7-gY HTTP_REQUEST_KEY=ODk4OPUpVSSU1TS0hLZWhtYXNkZldFa2poZiEqamZzYWRmODQ1Mw==