1.用户已购套餐页面优化,新增退款详情页面

2.优化退款协议弹窗,写成通用弹窗,可复用显示
This commit is contained in:
2026-09-20 12:17:21 +08:00
parent eab2bbdc93
commit 2ad8d82cc0
31 changed files with 1054 additions and 284 deletions

View File

@@ -28,9 +28,9 @@ android {
applicationId "com.abbidot.tracker" applicationId "com.abbidot.tracker"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 35 targetSdkVersion 35
versionCode 2502 versionCode 2600
// versionName "2.5.2" // versionName "2.6.0"
versionName "2.5.2-Beta1" versionName "2.6.0-Beta1"
4 4
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -88,8 +88,7 @@
tools:targetApi="s" /> tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" /> <!-- 指定微信包名 -->
<!-- 指定微信包名 -->
<queries> <queries>
<package android:name="com.tencent.mm" /> <package android:name="com.tencent.mm" />
</queries> </queries>
@@ -109,6 +108,9 @@
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:replace="android:supportsRtl" tools:replace="android:supportsRtl"
tools:targetApi="33"> tools:targetApi="33">
<activity
android:name=".ui.activity.subscribe.RefundDetailsActivity"
android:exported="false" />
<activity <activity
android:name=".ui.activity.help.HelpTrackerStatusActivity" android:name=".ui.activity.help.HelpTrackerStatusActivity"
android:exported="false" /> android:exported="false" />

View File

@@ -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.MySubscriptionActivity
import com.abbidot.tracker.ui.activity.subscribe.SubscriptionHistoryActivity import com.abbidot.tracker.ui.activity.subscribe.SubscriptionHistoryActivity
import com.abbidot.tracker.ui.activity.subscribe.SubscriptionPlanActivity import com.abbidot.tracker.ui.activity.subscribe.SubscriptionPlanActivity
import com.abbidot.tracker.util.Util
import com.abbidot.tracker.widget.TypefaceTextView import com.abbidot.tracker.widget.TypefaceTextView
import com.qmuiteam.qmui.skin.QMUISkinManager import com.qmuiteam.qmui.skin.QMUISkinManager
import com.qmuiteam.qmui.widget.popup.QMUIPopup 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_device_out_id, item.deviceOutId)
// holder.setText(R.id.tv_my_subscription_plan_name, "${item.mealName}(${item.planCategory})") // 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.setText(R.id.tv_my_subscription_plan_name, item.mealName)
holder.getTextView(R.id.tv_my_subscription_auto_subscription_tips).apply { holder.getTextView(R.id.tv_my_subscription_auto_subscription_tips).apply {
visibility = if (item.subscriptionStatus == ConstantInt.Open) { visibility = if (item.subscriptionStatus == ConstantInt.Open) {
@@ -174,7 +177,11 @@ class MySubscriptionAdapter(
//UserId不一样就是共享设备的订单 //UserId不一样就是共享设备的订单
visibility = if (item.userId == userId) { visibility = if (item.userId == userId) {
setOnClickListener { 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 View.VISIBLE
} else View.GONE } else View.GONE

View File

@@ -4,21 +4,29 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.view.View import android.view.View
import android.widget.TextView 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.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.abbidot.baselibrary.util.LogUtil
import com.abbidot.baselibrary.util.Utils import com.abbidot.baselibrary.util.Utils
import com.abbidot.tracker.R import com.abbidot.tracker.R
import com.abbidot.tracker.bean.SubscriptionsOrderBean import com.abbidot.tracker.bean.SubscriptionsOrderBean
import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.ConstantString
import com.abbidot.tracker.constant.MultipleEntity 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.RequestRefundActivity
import com.abbidot.tracker.ui.activity.subscribe.SubscriptionHistoryActivity import com.abbidot.tracker.ui.activity.subscribe.SubscriptionHistoryActivity
import com.abbidot.tracker.widget.TypefaceRoundButton 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.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.hjq.toast.Toaster import com.hjq.toast.Toaster
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButtonDrawable import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButtonDrawable
import com.stripe.android.core.AppInfo
/** /**
*Created by .yzq on 2024/8/19/019. *Created by .yzq on 2024/8/19/019.
@@ -93,6 +101,7 @@ class SubscriptionHistoryAdapter(
} }
private fun bindOrderData(holder: BaseViewHolder, item: SubscriptionsOrderBean) { private fun bindOrderData(holder: BaseViewHolder, item: SubscriptionsOrderBean) {
val position = getItemPosition(item)
holder.setText( holder.setText(
R.id.tv_subscription_history_order_id, R.id.tv_subscription_history_order_id,
context.getString(R.string.txt_order_id) + item.renewNum context.getString(R.string.txt_order_id) + item.renewNum
@@ -117,39 +126,11 @@ class SubscriptionHistoryAdapter(
visibility = View.VISIBLE visibility = View.VISIBLE
when (item.orderStatus) { when (item.orderStatus) {
1 -> { 1 -> {
if (item.isAutoRenewal == ConstantInt.Type1) { if (item.subscriptionStatus == ConstantInt.Type1) {
visibility = View.GONE visibility = View.GONE
} else { } else {
setRefundState(context, item.isRefundable, this) 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) 4 -> setText(R.string.txt_waiting)
@@ -177,6 +158,7 @@ class SubscriptionHistoryAdapter(
} }
} }
} }
visibility = View.GONE
} }
val cTimeMillis = System.currentTimeMillis() val cTimeMillis = System.currentTimeMillis()
@@ -194,6 +176,83 @@ class SubscriptionHistoryAdapter(
if (item.annualCareType == ConstantInt.Type1) context.getString(R.string.start_txt_yes) if (item.annualCareType == ConstantInt.Type1) context.getString(R.string.start_txt_yes)
else context.getString(R.string.txt_no) else context.getString(R.string.txt_no)
} }
holder.getView<TextView>(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<LinearLayoutCompat>(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<AppCompatImageView>(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<TypefaceTextView>(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<LinearLayoutCompat>(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( private fun setRefundState(

View File

@@ -21,6 +21,7 @@ data class SubscriptionsOrderBean(
var customerId: String, var customerId: String,
var deviceId: String, var deviceId: String,
var deviceOutId: String, var deviceOutId: String,
var deviceType: Int,
var enabled: Int, var enabled: Int,
var id: String, var id: String,
var mealDesc: String, var mealDesc: String,
@@ -40,7 +41,7 @@ data class SubscriptionsOrderBean(
var reactivation: Int, var reactivation: Int,
var simId: String, var simId: String,
var subscriptionId: String, var subscriptionId: String,
var subscriptionStatus: Int, var subscriptionStatus: Int,//是否是自动续订 1:是 0:否
var surplusDays: Long, var surplusDays: Long,
var autoRenewPrice: Double, var autoRenewPrice: Double,
var tax: Double, var tax: Double,
@@ -56,7 +57,6 @@ data class SubscriptionsOrderBean(
var refundTime: Long, var refundTime: Long,
var planTimeMonthsCount: Int, var planTimeMonthsCount: Int,
var isRefundable: Int,//是否显示退款按钮 1:是 0:否 var isRefundable: Int,//是否显示退款按钮 1:是 0:否
var isAutoRenewal: Int,//是否是自动续订 1:是 0:否
@MultipleEntity var menuType: Int, @MultipleEntity var menuType: Int,
var renewNum: String, var renewNum: String,
var createUserId: String,//这个订单是由哪个用户创建的 var createUserId: String,//这个订单是由哪个用户创建的
@@ -71,6 +71,7 @@ data class SubscriptionsOrderBean(
"", "",
"", "",
"", "",
1,
0, 0,
"", "",
"", "",
@@ -106,7 +107,6 @@ data class SubscriptionsOrderBean(
0L, 0L,
0, 0,
0, 0,
0,
menuType, "", "", menuType, "", "",
0 0
) )
@@ -120,6 +120,7 @@ data class SubscriptionsOrderBean(
"", "",
"", "",
"", "",
1,
0, 0,
"", "",
"", "",
@@ -155,7 +156,6 @@ data class SubscriptionsOrderBean(
0L, 0L,
0, 0,
0, 0,
0,
MultipleEntity.TEXT, "", "", MultipleEntity.TEXT, "", "",
0 0
) )

View File

@@ -134,7 +134,8 @@ class AddCreditCardPaymentActivity :
ilAddCardNameOnCard.root, ilAddCardNameOnCard.root,
ilAddCardNumber.root, ilAddCardNumber.root,
llAddCardCvcLayout, llAddCardCvcLayout,
llAddCardMmDdLayout, tvAddCardExperienceBtn llAddCardMmDdLayout,
tvAddCardExperienceBtn
) )
} }
} }
@@ -162,8 +163,7 @@ class AddCreditCardPaymentActivity :
} }
override fun onRequestError(exceptionCode: String?) { override fun onRequestError(exceptionCode: String?) {
setButtonEnabled(mRightImageButton, ConstantInt.Type1) setBtnEnabled(ConstantInt.Type1)
setButtonEnabled(mViewBinding.btnSaveNewCreditCard, ConstantInt.Type1)
} }
}) })
} }
@@ -175,8 +175,7 @@ class AddCreditCardPaymentActivity :
} }
override fun onRequestError(exceptionCode: String?) { override fun onRequestError(exceptionCode: String?) {
setButtonEnabled(mRightImageButton, ConstantInt.Type1) setBtnEnabled(ConstantInt.Type1)
setButtonEnabled(mViewBinding.btnSaveNewCreditCard, ConstantInt.Type1)
} }
}) })
} }
@@ -290,8 +289,8 @@ class AddCreditCardPaymentActivity :
// 用 PaymentMethodCreateParams 封装银行卡,不再直接new Card // 用 PaymentMethodCreateParams 封装银行卡,不再直接new Card
val cardParams = val cardParams =
PaymentMethodCreateParams.Card.Builder().setNumber(cardNumber) PaymentMethodCreateParams.Card.Builder().setNumber(cardNumber)
.setExpiryMonth(dates[0].toInt()) .setExpiryMonth(dates[0].toInt()).setExpiryYear(dates[1].toInt())
.setExpiryYear(dates[1].toInt()).setCvc(cvv).build() .setCvc(cvv).build()
val paymentMethodParams = PaymentMethodCreateParams.create(cardParams) val paymentMethodParams = PaymentMethodCreateParams.create(cardParams)
val stripeKey = ThirdPartyUtil.instance.getStripeKey(mContext) val stripeKey = ThirdPartyUtil.instance.getStripeKey(mContext)
LogUtil.e("支付stripeKey=$stripeKey") LogUtil.e("支付stripeKey=$stripeKey")
@@ -346,8 +345,14 @@ class AddCreditCardPaymentActivity :
} }
}, },
getString(R.string.txt_auto_renewal_on), 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 { } else {
ViewUtil.instance.showDialog( ViewUtil.instance.showDialog(
this@AddCreditCardPaymentActivity, this@AddCreditCardPaymentActivity,
@@ -359,9 +364,20 @@ class AddCreditCardPaymentActivity :
} }
}, },
getString(R.string.txt_remove_pay_method) + if (AppUtils.isChina()) "?" else "?", 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?) { override fun onClick(v: View?) {
@@ -379,8 +395,7 @@ class AddCreditCardPaymentActivity :
ilAddCardNameOnCard.root -> setClickEditViewVisible(ilAddCardNameOnCard.etInputView2Content) ilAddCardNameOnCard.root -> setClickEditViewVisible(ilAddCardNameOnCard.etInputView2Content)
ilAddCardNumber.root -> setClickEditViewVisible(ilAddCardNumber.etInputView2Content) ilAddCardNumber.root -> setClickEditViewVisible(ilAddCardNumber.etInputView2Content)
mRightImageButton -> { mRightImageButton -> {
setButtonEnabled(btnSaveNewCreditCard, ConstantInt.Type0) setBtnEnabled(ConstantInt.Type0)
setButtonEnabled(mRightImageButton, ConstantInt.Type0)
mSubscriptionPayViewModel.getOrderAutoRenewalStatus() mSubscriptionPayViewModel.getOrderAutoRenewalStatus()
} }
} }
@@ -390,12 +405,12 @@ class AddCreditCardPaymentActivity :
override fun onFocusChange(v: View?, hasFocus: Boolean) { override fun onFocusChange(v: View?, hasFocus: Boolean) {
mViewBinding.apply { mViewBinding.apply {
when (v!!) { when (v!!) {
ilAddCardNameOnCard.etInputView2Content -> ilAddCardNameOnCard.etInputView2Content -> setEditViewNoFocusHide(
setEditViewNoFocusHide(ilAddCardNameOnCard.etInputView2Content, hasFocus) ilAddCardNameOnCard.etInputView2Content, hasFocus
)
ilAddCardNumber.etInputView2Content -> setEditViewNoFocusHide( ilAddCardNumber.etInputView2Content -> setEditViewNoFocusHide(
ilAddCardNumber.etInputView2Content, ilAddCardNumber.etInputView2Content, hasFocus
hasFocus
) )
etAddCardMmDdContent -> setEditViewNoFocusHide(etAddCardMmDdContent, hasFocus) etAddCardMmDdContent -> setEditViewNoFocusHide(etAddCardMmDdContent, hasFocus)

View File

@@ -1,5 +1,6 @@
package com.abbidot.tracker.ui.activity.subscribe package com.abbidot.tracker.ui.activity.subscribe
import android.content.Context
import androidx.activity.viewModels import androidx.activity.viewModels
import com.abbidot.baselibrary.constant.EventName import com.abbidot.baselibrary.constant.EventName
import com.abbidot.baselibrary.eventbus.XEventBus 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.R
import com.abbidot.tracker.adapter.MySubscriptionAdapter import com.abbidot.tracker.adapter.MySubscriptionAdapter
import com.abbidot.tracker.base.BaseActivity import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.base.BaseDialog
import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantInt
import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.ActivityMySubscriptionBinding import com.abbidot.tracker.databinding.ActivityMySubscriptionBinding
@@ -91,8 +93,20 @@ class MySubscriptionActivity :
mPosition = position mPosition = position
val messageId = if (0 == status) R.string.txt_auto_recharge_title val messageId = if (0 == status) R.string.txt_auto_recharge_title
else R.string.txt_auto_recharge_content else R.string.txt_auto_recharge_content
ViewUtil.instance.operateDialogTips(mContext, messageId) { operateDialogTips(mContext, messageId) {
mSubscriptionViewModel.updateSubscriptionStatus(subscriptionId, status) 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)
}
} }

View File

@@ -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>(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")
}
}
}
}

View File

@@ -2,6 +2,7 @@ package com.abbidot.tracker.ui.activity.subscribe
import android.text.TextUtils import android.text.TextUtils
import android.view.View import android.view.View
import android.widget.TextView
import androidx.activity.viewModels import androidx.activity.viewModels
import com.abbidot.baselibrary.constant.EventName import com.abbidot.baselibrary.constant.EventName
import com.abbidot.baselibrary.eventbus.XEventBus 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.ConstantString
import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.ActivityRequestRefundBinding import com.abbidot.tracker.databinding.ActivityRequestRefundBinding
import com.abbidot.tracker.ui.fragment.subscribe.RefundPolicyBottomSheetFragment
import com.abbidot.tracker.util.Util import com.abbidot.tracker.util.Util
import com.abbidot.tracker.vm.SubscriptionManageViewModel 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 : class RequestRefundActivity :
BaseActivity<ActivityRequestRefundBinding>(ActivityRequestRefundBinding::inflate) { BaseActivity<ActivityRequestRefundBinding>(ActivityRequestRefundBinding::inflate) {
@@ -46,7 +51,7 @@ class RequestRefundActivity :
tvRequestRefundRefund.text = refundRefund tvRequestRefundRefund.text = refundRefund
} }
setOnClickListenerViews(btnRequestRefundRecharge) setOnClickListenerViews(btnRequestRefundRecharge, tvRequestRefundPolicy)
} }
} }
@@ -106,11 +111,17 @@ class RequestRefundActivity :
} }
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
setButtonEnabled(v!!)
mViewBinding.apply { mViewBinding.apply {
when (v) { when (v) {
btnRequestRefundRecharge -> commitRefund() btnRequestRefundRecharge -> {
setButtonEnabled(v)
commitRefund()
}
tvRequestRefundPolicy -> RefundPolicyBottomSheetFragment.newInstance()
.show(supportFragmentManager, "refund_sheet")
} }
} }
} }

View File

@@ -10,6 +10,7 @@ import com.abbidot.tracker.R
import com.abbidot.tracker.adapter.HelpTextImageTypeAdapter import com.abbidot.tracker.adapter.HelpTextImageTypeAdapter
import com.abbidot.tracker.adapter.SubscriptionHistoryAdapter import com.abbidot.tracker.adapter.SubscriptionHistoryAdapter
import com.abbidot.tracker.base.BaseActivity import com.abbidot.tracker.base.BaseActivity
import com.abbidot.tracker.base.BaseDialog
import com.abbidot.tracker.bean.MenuTxtBean import com.abbidot.tracker.bean.MenuTxtBean
import com.abbidot.tracker.bean.SubscriptionsOrderBean import com.abbidot.tracker.bean.SubscriptionsOrderBean
import com.abbidot.tracker.constant.ConstantInt 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.GetResultCallback
import com.abbidot.tracker.constant.MultipleEntity import com.abbidot.tracker.constant.MultipleEntity
import com.abbidot.tracker.databinding.ActivitySubscriptionHistoryBinding import com.abbidot.tracker.databinding.ActivitySubscriptionHistoryBinding
import com.abbidot.tracker.ui.fragment.subscribe.RefundPolicyBottomSheetFragment
import com.abbidot.tracker.util.ViewUtil import com.abbidot.tracker.util.ViewUtil
import com.abbidot.tracker.vm.SubscriptionManageViewModel import com.abbidot.tracker.vm.SubscriptionManageViewModel
import com.daimajia.androidanimations.library.Techniques import com.daimajia.androidanimations.library.Techniques
@@ -32,6 +34,8 @@ class SubscriptionHistoryActivity :
private var subscriptionId = "" private var subscriptionId = ""
private var mRefreshPackage = true private var mRefreshPackage = true
private var mPosition = 0
override fun getTopBar() = mViewBinding.ilSubscriptionHistoryTopBar.titleTopBar override fun getTopBar() = mViewBinding.ilSubscriptionHistoryTopBar.titleTopBar
override fun initData() { override fun initData() {
@@ -47,72 +51,10 @@ class SubscriptionHistoryActivity :
ViewUtil.instance.setRecyclerViewVerticalLinearLayout( ViewUtil.instance.setRecyclerViewVerticalLinearLayout(
mContext, rvSubscriptionHistoryList, mHistoryAdapter, bottom = AppUtils.dpToPx(12) mContext, rvSubscriptionHistoryList, mHistoryAdapter, bottom = AppUtils.dpToPx(12)
) )
setOnClickListenerViews(btnSubscriptionRefundIssue, tvCloseRefundIssueBtn) setOnClickListenerViews(btnSubscriptionRefundIssue)
}
} }
initIssue()
}
private fun initIssue() {
val menuList = mutableListOf<MenuTxtBean>()
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() { override fun onResume() {
super.onResume() super.onResume()
@@ -126,12 +68,16 @@ class SubscriptionHistoryActivity :
XEventBus.observe(this, EventName.RefreshPackage) { XEventBus.observe(this, EventName.RefreshPackage) {
mRefreshPackage = true mRefreshPackage = true
} }
mSubscriptionViewModel.mSubscriptionsHistoryLiveData.observe(this) { mSubscriptionViewModel.apply {
mSubscriptionsHistoryLiveData.observe(this@SubscriptionHistoryActivity) {
dealRequestResult(it, object : GetResultCallback { dealRequestResult(it, object : GetResultCallback {
override fun onResult(any: Any) { override fun onResult(any: Any) {
it.getOrNull()?.let { list -> it.getOrNull()?.let { list ->
if (mSubscriptionsOrderList.size > 0) { if (mSubscriptionsOrderList.isNotEmpty()) {
mHistoryAdapter.notifyItemRangeRemoved(0, mSubscriptionsOrderList.size) mHistoryAdapter.notifyItemRangeRemoved(
0,
mSubscriptionsOrderList.size
)
mSubscriptionsOrderList.clear() mSubscriptionsOrderList.clear()
} }
for (l in list) { for (l in list) {
@@ -146,31 +92,50 @@ class SubscriptionHistoryActivity :
} }
}) })
} }
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)
}
}
})
}
}
} }
/** fun updateSubscriptionStatus(subscriptionId: String, status: Int, position: Int) {
* 显示问题 mPosition = position
*/ var messageId = 0
private fun showLedIssue() { var renewStatus: Int
mViewBinding.apply { val title = if (0 == status) {
if (llSubscriptionRefundIssueLayout.isGone) { renewStatus = ConstantInt.Open
YoYo.with(Techniques.BounceInUp).duration(700).onStart { R.string.txt_turn_on_auto_renew
llSubscriptionRefundIssueLayout.visibility = View.VISIBLE
vRefundIssueShadeView.visibility = View.VISIBLE
}.playOn(llSubscriptionRefundIssueLayout)
} else { } else {
vRefundIssueShadeView.visibility = View.GONE renewStatus = ConstantInt.Close
YoYo.with(Techniques.SlideOutDown).duration(600).onEnd { messageId = R.string.txt_plan_active_until_expires
llSubscriptionRefundIssueLayout.visibility = View.GONE R.string.txt_turn_off_auto_renew
}.playOn(llSubscriptionRefundIssueLayout)
} }
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?) { override fun onClick(v: View?) {
mViewBinding.apply { mViewBinding.apply {
when (v!!) { when (v!!) {
btnSubscriptionRefundIssue, tvCloseRefundIssueBtn -> showLedIssue() btnSubscriptionRefundIssue -> RefundPolicyBottomSheetFragment.newInstance()
.show(supportFragmentManager, "refund_sheet")
} }
} }
} }

View File

@@ -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<MenuTxtBean>()
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
)
}
}

View File

@@ -462,9 +462,10 @@ class ViewUtil private constructor() {
cancelListener: BaseDialog.OnDialogCancelListener? = null cancelListener: BaseDialog.OnDialogCancelListener? = null
) { ) {
try { try {
val content = if (contentResId == 0) "" else context.getString(contentResId)
showDialog( showDialog(
context, context,
context.getString(contentResId), content,
okListener, okListener,
title, title,
okTextResId, 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)
}
/** /**
* 手动连接蓝牙提示 * 手动连接蓝牙提示
*/ */

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 已完成:绿色圆圈+对勾 -->
<item android:state_selected="true">
<layer-list>
<item>
<shape android:shape="oval">
<solid android:color="#34C759"/>
<size android:width="32dp" android:height="32dp"/>
</shape>
</item>
<item android:drawable="@drawable/icon_permission_check_svg" android:gravity="center"/>
</layer-list>
</item>
<!-- 进行中:空心绿圈,内部填充绿圆 -->
<item android:state_activated="true">
<layer-list>
<item>
<shape android:shape="oval">
<stroke android:width="3dp" android:color="#34C759"/>
<size android:width="32dp" android:height="32dp"/>
</shape>
</item>
<item android:gravity="center">
<shape android:shape="oval">
<solid android:color="#34C759"/>
<size android:width="@dimen/dp_16" android:height="@dimen/dp_16"/>
</shape>
</item>
</layer-list>
</item>
<!-- 未完成:灰色空心圆 -->
<item>
<shape android:shape="oval">
<stroke android:width="2dp" android:color="#AAAAAA"/>
<size android:width="32dp" android:height="32dp"/>
</shape>
</item>
</selector>

View File

@@ -2,7 +2,6 @@
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"

View File

@@ -0,0 +1,246 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.activity.subscribe.RefundDetailsActivity">
<include
android:id="@+id/il_refund_details_top_bar"
layout="@layout/layout_top_bar" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="@dimen/dp_18"
android:layout_marginTop="@dimen/dp_16"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape20_yellow_border_cyan_bg"
android:paddingHorizontal="@dimen/dp_16"
android:paddingVertical="@dimen/dp_18">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_refund_details_state_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@drawable/icon_state_time" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_state_title"
style="@style/my_TextView_style_v2"
android:layout_marginStart="@dimen/dp_16"
android:layout_toEndOf="@id/iv_refund_details_state_image"
android:text="@string/txt_refund_pending"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_bold_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_state_content"
style="@style/my_TextView_style_v2"
android:layout_below="@id/tv_refund_details_state_title"
android:layout_alignStart="@id/tv_refund_details_state_title"
android:layout_marginTop="@dimen/dp_4"
android:gravity="start"
android:text="@string/txt_refund_pending_tips"
android:textSize="@dimen/textSize14"
app:lineHeight="@dimen/dp_16"
app:typeface="@string/roboto_regular_font" />
</RelativeLayout>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:background="@drawable/shape16_white_color_bg"
android:orientation="vertical"
android:padding="@dimen/dp_18">
<!-- 行1 Plan -->
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingVertical="@dimen/dp_8">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="start"
android:text="@string/txt_plan1"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_plan_name"
style="@style/my_TextView_style_v2"
android:text="@string/app_name"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>
<!-- 行2 Order ID -->
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingVertical="@dimen/dp_8">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="start"
android:text="@string/txt_order_id1"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_order_id"
style="@style/my_TextView_style_v2"
android:text="@string/app_name"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>
<!-- 行3 Order Time -->
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingVertical="@dimen/dp_8">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="start"
android:text="@string/txt_order_time"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_order_time"
style="@style/my_TextView_style_v2"
android:text="@string/app_name"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>
<!-- 行4 Paid Method -->
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingVertical="@dimen/dp_8">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="start"
android:text="@string/txt_paid_method"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_paid_method"
style="@style/my_TextView_style_v2"
android:text="@string/app_name"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>
<!-- 分割线 -->
<View
android:layout_width="match_parent"
android:layout_marginVertical="@dimen/dp_2"
android:layout_height="@dimen/dp_1"
android:background="@color/permission_no_check_color" />
<!-- 行5 Refund Amount -->
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingVertical="@dimen/dp_8">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="start"
android:text="@string/txt_refund_amount"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_refund_amount"
style="@style/my_TextView_style_v2"
android:text="@string/app_name"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_bold_font" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_12"
android:background="@drawable/shape16_white_color_bg"
android:orientation="vertical"
android:padding="@dimen/dp_18">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_marginBottom="@dimen/dp_10"
android:text="@string/txt_refund_status"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_bold_font" />
<!-- 步骤1 Request Submitted -->
<include
android:id="@+id/il_refund_details_state_step1"
layout="@layout/layout_refund_state_item" />
<!-- 步骤2 Under Review -->
<include
android:id="@+id/il_refund_details_state_step2"
layout="@layout/layout_refund_state_item" />
<!-- 步骤3 Refund Processing -->
<include
android:id="@+id/il_refund_details_state_step3"
layout="@layout/layout_refund_state_item" />
<!-- 步骤4 Refund Completed -->
<include
android:id="@+id/il_refund_details_state_step4"
layout="@layout/layout_refund_state_item" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.core.widget.NestedScrollView>
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_details_refund_policy"
style="@style/my_TextView_style_v2"
android:layout_gravity="center"
android:layout_marginVertical="@dimen/dp_18"
android:background="@drawable/selector_transparent_pressed"
android:paddingVertical="@dimen/dp_8"
android:text="@string/txt_refund_policy"
android:textColor="@color/blue_color11"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -77,9 +77,21 @@
android:id="@+id/btn_request_refund_recharge" android:id="@+id/btn_request_refund_recharge"
style="@style/my_RoundRect_Button_style" style="@style/my_RoundRect_Button_style"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginBottom="@dimen/dp_80" android:layout_marginBottom="@dimen/dp_40"
android:background="@drawable/shape8_gray_yellow_bg" android:background="@drawable/shape8_gray_yellow_bg"
android:text="@string/register_txt_submit" android:text="@string/register_txt_submit"
app:qmui_radius="@dimen/dp_50" app:qmui_radius="@dimen/dp_50"
app:typeface="@string/roboto_bold_font" /> app:typeface="@string/roboto_bold_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_request_refund_policy"
style="@style/my_TextView_style_v2"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/dp_26"
android:background="@drawable/selector_transparent_pressed"
android:paddingVertical="@dimen/dp_8"
android:text="@string/txt_refund_policy"
android:textColor="@color/blue_color11"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -12,7 +12,6 @@
android:layout_width="290dp" android:layout_width="290dp"
android:layout_height="290dp" android:layout_height="290dp"
android:src="@drawable/abbidot_logo_loading" android:src="@drawable/abbidot_logo_loading"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"

View File

@@ -35,40 +35,4 @@
android:paddingHorizontal="@dimen/dp_20" android:paddingHorizontal="@dimen/dp_20"
android:paddingVertical="@dimen/dp_12" /> android:paddingVertical="@dimen/dp_12" />
<View
android:id="@+id/v_refund_issue_shade_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent_half"
android:visibility="gone" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:id="@+id/ll_subscription_refund_issue_layout"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/shape30_white_half_bottom_shadow_bg"
android:orientation="vertical"
android:visibility="gone">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_subscription_refund_issue_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/dp_20"
android:paddingVertical="@dimen/dp_16" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_close_refund_issue_btn"
style="@style/my_TextView_style_v2"
android:layout_gravity="center"
android:layout_margin="@dimen/dp_12"
android:background="@drawable/selector_transparent_pressed"
android:padding="@dimen/dp_16"
android:text="@string/txt_close"
android:textColor="@color/select_color3"
android:textSize="@dimen/textSize12"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>
</RelativeLayout> </RelativeLayout>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_subscription_refund_issue_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/shape30_white_half_bottom_shadow_bg"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_subscription_refund_issue_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/dp_20"
android:paddingVertical="@dimen/dp_16" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_close_refund_issue_btn"
style="@style/my_TextView_style_v2"
android:layout_gravity="center"
android:layout_margin="@dimen/dp_12"
android:background="@drawable/selector_transparent_pressed"
android:padding="@dimen/dp_16"
android:text="@string/txt_close"
android:textColor="@color/select_color3"
android:textSize="@dimen/textSize12"
app:typeface="@string/roboto_regular_font" />
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@@ -10,10 +10,9 @@
<FrameLayout <FrameLayout
android:id="@+id/fl_my_subscription_btn_layout" android:id="@+id/fl_my_subscription_btn_layout"
android:layout_width="@dimen/dp_50" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_gravity="end">
android:paddingBottom="@dimen/dp_18">
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_my_subscription_btn" android:id="@+id/iv_my_subscription_btn"
@@ -21,7 +20,17 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_gravity="end"
android:layout_marginEnd="@dimen/dp_8" android:layout_marginEnd="@dimen/dp_8"
android:src="@drawable/icon_point_bg_svg" /> android:src="@drawable/icon_point_bg_svg"
android:visibility="gone" />
<com.abbidot.tracker.widget.TypefaceRoundButton
android:id="@+id/btn_more_activity_edit_goal"
style="@style/my_QMUIRoundButton_very_small_style"
android:text="@string/txt_more"
android:textColor="@color/btn_color"
app:qmui_borderColor="@color/btn_color"
app:qmui_borderWidth="0.55dp"
app:typeface="@string/roboto_bold_font" />
</FrameLayout> </FrameLayout>
@@ -34,12 +43,14 @@
android:textSize="@dimen/textSize36" android:textSize="@dimen/textSize36"
android:textStyle="bold" /> android:textStyle="bold" />
<com.abbidot.tracker.widget.TypefaceTextView <androidx.appcompat.widget.AppCompatImageView
style="@style/my_TextView_style_v2" android:id="@+id/iv_my_subscription_device_image"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:text="@string/txt_tracker_id" android:layout_height="@dimen/dp_30"
android:textSize="@dimen/textSize16" android:layout_gravity="center"
app:typeface="@string/roboto_regular_font" /> android:layout_marginTop="@dimen/dp_2"
android:maxWidth="@dimen/dp_53"
android:src="@drawable/icon_tracker_device_small" />
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
@@ -120,9 +131,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10" android:layout_marginTop="@dimen/dp_10"
android:visibility="gone"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal"
android:visibility="gone">
<com.abbidot.tracker.widget.TypefaceTextView <com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"

View File

@@ -19,7 +19,6 @@
android:id="@+id/tv_subscription_history_subscription_state" android:id="@+id/tv_subscription_history_subscription_state"
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/dp_6"
android:text="@string/app_name" android:text="@string/app_name"
android:textSize="@dimen/textSize14" android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" /> app:typeface="@string/roboto_regular_font" />
@@ -37,11 +36,11 @@
android:id="@+id/tv_subscription_history_annual_care_title" android:id="@+id/tv_subscription_history_annual_care_title"
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"
android:layout_below="@id/tv_subscription_history_order_time" 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:layout_marginTop="@dimen/dp_4"
android:text="@string/txt_annual_care_text1"
android:textSize="@dimen/textSize14" android:textSize="@dimen/textSize14"
android:textStyle="bold" /> android:textStyle="bold"
android:visibility="gone" />
<com.abbidot.tracker.widget.TypefaceTextView <com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_subscription_history_annual_care" android:id="@+id/tv_subscription_history_annual_care"
@@ -50,8 +49,8 @@
android:layout_marginStart="@dimen/dp_4" android:layout_marginStart="@dimen/dp_4"
android:layout_toEndOf="@id/tv_subscription_history_annual_care_title" android:layout_toEndOf="@id/tv_subscription_history_annual_care_title"
android:text="@string/app_name" android:text="@string/app_name"
android:visibility="gone"
android:textSize="@dimen/textSize14" android:textSize="@dimen/textSize14"
android:visibility="gone"
app:typeface="@string/roboto_regular_font" /> app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView <com.abbidot.tracker.widget.TypefaceTextView
@@ -66,17 +65,17 @@
<com.abbidot.tracker.widget.TypefaceTextView <com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_subscription_history_package_price" android:id="@+id/tv_subscription_history_package_price"
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"
android:layout_below="@id/tv_subscription_history_package_name" android:layout_alignBaseline="@id/tv_subscription_history_package_name"
android:layout_alignParentEnd="true"
android:layout_marginTop="@dimen/dp_6" android:layout_marginTop="@dimen/dp_6"
android:text="@string/txt_order_id" android:text="@string/txt_order_id"
android:textSize="@dimen/textSize14" android:textSize="@dimen/textSize16"
android:textStyle="bold" /> android:textStyle="bold" />
<com.abbidot.tracker.widget.TypefaceRoundButton <com.abbidot.tracker.widget.TypefaceRoundButton
android:id="@+id/btn_subscription_history_operate" android:id="@+id/btn_subscription_history_operate"
style="@style/my_TextView_style_v2" style="@style/my_TextView_style_v2"
android:layout_alignBaseline="@id/tv_subscription_history_package_price" android:layout_centerHorizontal="true"
android:layout_alignParentEnd="true"
android:paddingHorizontal="@dimen/dp_14" android:paddingHorizontal="@dimen/dp_14"
android:paddingVertical="@dimen/dp_6" android:paddingVertical="@dimen/dp_6"
android:text="@string/txt_refund" android:text="@string/txt_refund"
@@ -85,4 +84,83 @@
app:qmui_borderColor="@color/block_color" app:qmui_borderColor="@color/block_color"
app:qmui_borderWidth="@dimen/dp_1" app:qmui_borderWidth="@dimen/dp_1"
app:qmui_radius="@dimen/dp_50" /> app:qmui_radius="@dimen/dp_50" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/cl_subscription_history_refund_item"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_47"
android:layout_below="@id/tv_subscription_history_package_name"
android:layout_marginTop="@dimen/dp_16"
android:background="@drawable/selector_transparent_pressed"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_height="wrap_content"
android:text="@string/txt_refund"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_bold_font" />
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_subscription_history_refund_result"
style="@style/my_TextView_style_v2"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:text="@string/app_name"
android:textColor="@color/block_color2"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_subscription_history_refund_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ico_list_next" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="@dimen/dp_47"
android:id="@+id/ll_subscription_history_auto_renew_item"
android:layout_below="@id/cl_subscription_history_refund_item"
android:background="@drawable/selector_transparent_pressed"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.abbidot.tracker.widget.TypefaceTextView
style="@style/my_TextView_style_v2"
android:layout_height="wrap_content"
android:text="@string/txt_auto_renew2"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_bold_font" />
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_subscription_history_auto_renew_result"
style="@style/my_TextView_style_v2"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:textAllCaps="true"
android:text="@string/app_name"
android:textColor="@color/block_color2"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ico_list_next" />
</androidx.appcompat.widget.LinearLayoutCompat>
</RelativeLayout> </RelativeLayout>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical" android:gravity="center_vertical"

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- 节点圆圈 -->
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_refund_state_step_dot"
android:layout_width="@dimen/dp_20"
android:layout_height="@dimen/dp_20"
android:src="@drawable/selector_refund_state_step_dot" />
<!-- 下面的竖线 -->
<View
android:id="@+id/view_refund_state_step_line"
android:layout_width="@dimen/dp_2"
android:layout_height="@dimen/dp_26"
android:layout_below="@id/iv_refund_state_step_dot"
android:layout_marginStart="@dimen/dp_10"
android:background="@color/slope_bg" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_state_step_title"
style="@style/my_TextView_style_v2"
android:layout_marginStart="@dimen/dp_10"
android:layout_toEndOf="@id/iv_refund_state_step_dot"
android:gravity="start"
android:text="@string/txt_refund_status"
android:textSize="@dimen/textSize14"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/tv_refund_state_step_desc"
style="@style/my_TextView_style_v2"
android:layout_below="@id/tv_refund_state_step_title"
android:layout_alignStart="@id/tv_refund_state_step_title"
android:layout_marginTop="@dimen/dp_2"
android:gravity="start"
android:text="@string/txt_refund_status"
android:textSize="@dimen/textSize10"
app:typeface="@string/roboto_regular_font" />
</RelativeLayout>

View File

@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/dp_36"
android:paddingTop="@dimen/dp_18"
android:paddingEnd="@dimen/dp_36"
android:paddingBottom="@dimen/dp_18">
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/auto_recharge_title"
style="@style/my_TextView_style"
android:layout_width="wrap_content"
android:gravity="start"
android:text="@string/txt_auto_recharge_title"
android:textSize="@dimen/textSize24"
app:typeface="@string/roboto_bold_font" />
<com.abbidot.tracker.widget.TypefaceTextView
android:id="@+id/auto_recharge_content"
style="@style/my_TextView_style"
android:layout_width="wrap_content"
android:layout_below="@id/auto_recharge_title"
android:layout_marginTop="@dimen/dp_8"
android:gravity="start"
android:text="@string/txt_auto_recharge_content"
android:textColor="@color/text_gray_color"
android:textSize="@dimen/textSize16"
app:typeface="@string/roboto_regular_font" />
<com.abbidot.tracker.widget.TypefaceRoundButton
android:id="@+id/btn_off_auto_recharge"
style="@style/my_QMUIRoundButton_small_style"
android:layout_height="@dimen/dp_47"
android:layout_below="@id/auto_recharge_content"
android:layout_marginTop="@dimen/dp_24"
android:text="@string/txt_cancel"
app:qmui_borderColor="@color/txt_button"
app:qmui_borderWidth="0.55dp"
app:typeface="@string/roboto_bold_font" />
<com.abbidot.tracker.widget.TypefaceRoundButton
android:id="@+id/btn_off_auto_recharge_cancel"
style="@style/my_QMUIRoundButton_small_style"
android:layout_alignTop="@id/btn_off_auto_recharge"
android:layout_alignBottom="@id/btn_off_auto_recharge"
android:layout_alignParentEnd="true"
android:text="@string/txt_sure"
app:qmui_backgroundColor="@color/btn_yellow_color"
app:typeface="@string/roboto_bold_font" />
</RelativeLayout>

View File

@@ -382,4 +382,5 @@
<color name="grey_color_92">#758E94</color> <color name="grey_color_92">#758E94</color>
<color name="orange_color5">#FF996E</color> <color name="orange_color5">#FF996E</color>
<color name="orange_color6">#FEF6E4</color> <color name="orange_color6">#FEF6E4</color>
<color name="blue_color11">#0099CC</color>
</resources> </resources>

View File

@@ -164,7 +164,7 @@
<string name="txt_bluetooth_radar">Bluetooth Radar</string> <string name="txt_bluetooth_radar">Bluetooth Radar</string>
<string name="txt_fence_saved">Saved. Active when online.</string> <string name="txt_fence_saved">Saved. Active when online.</string>
<string name="txt_refund_expired">Refund period has expired</string> <string name="txt_refund_expired">Refund period has expired</string>
<string name="txt_refund_policy">Refund Policy\n</string> <string name="txt_refund_policy">Refund Policy</string>
<string name="txt_automatic_refund">Automatic Refund (Within 48 Hours)</string> <string name="txt_automatic_refund">Automatic Refund (Within 48 Hours)</string>
<string name="txt_automatic_refund_dec">All subscription purchases are eligible for a full automatic refund within 48 hours of payment. Refunds will be processed automatically without manual review.\n</string> <string name="txt_automatic_refund_dec">All subscription purchases are eligible for a full automatic refund within 48 hours of payment. Refunds will be processed automatically without manual review.\n</string>
<string name="txt_standard_refund">Standard Refund Window (30 Days)</string> <string name="txt_standard_refund">Standard Refund Window (30 Days)</string>
@@ -1000,4 +1000,36 @@
<string name="txt_remove">Remove</string> <string name="txt_remove">Remove</string>
<string name="txt_turn_off_remove">Turn Off &amp; Remove</string> <string name="txt_turn_off_remove">Turn Off &amp; Remove</string>
<string name="txt_no_legal_app">Unauthorized app. Download from official sources</string> <string name="txt_no_legal_app">Unauthorized app. Download from official sources</string>
<string name="txt_auto_renew2">Auto-Renewal</string>
<string name="txt_unavailable">Unavailable</string>
<string name="txt_available">Available</string>
<string name="txt_under_review">Under Review</string>
<string name="txt_processing">Processing</string>
<string name="txt_failed">Failed</string>
<string name="txt_declined">Declined</string>
<string name="txt_turn_off_auto_renew">Turn off auto-renew?</string>
<string name="txt_turn_on_auto_renew">Turn on auto-renew?</string>
<string name="txt_refund_pending_tips">Your refund request has been submitted and is being reviewed.</string>
<string name="txt_plan_active_until_expires">Your plan stays active until it expires.</string>
<string name="txt_refund_details">Refund details</string>
<string name="txt_plan1">Plan</string>
<string name="txt_order_id1">Order ID</string>
<string name="txt_order_time">Order Time</string>
<string name="txt_paid_method">Paid Method</string>
<string name="txt_refund_amount">Refund Amount</string>
<string name="txt_refund_status">Refund Status</string>
<string name="txt_refund_processing">Refund Processing</string>
<string name="txt_refund_processing_tips">Your refund has been approved and is being processed.</string>
<string name="txt_refund_completed">Refund Completed</string>
<string name="txt_refund_unsuccessful">Refund Unsuccessful</string>
<string name="txt_refund_success_tips">Your refund has been sent to your original payment method.</string>
<string name="txt_refund_fail_tips">Your refund request was not approved.</string>
<string name="txt_request_submit_dec">Your refund request has been submitted.</string>
<string name="txt_request_submit">Request Submitted</string>
<string name="txt_under_review_dec">Your refund request is being reviewed.</string>
<string name="txt_refund_failed_dec">We couldn\'t complete your refund. Please try again or contact support.</string>
<string name="txt_refund_failed">Refund Failed</string>
<string name="txt_refund_declined">Refund Declined</string>
<string name="txt_refund_pending">Refund Pending</string>
</resources> </resources>

View File

@@ -256,4 +256,13 @@
<!-- <item name="colorPrimary">@color/my_light_primary</item> --> <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style> </style>
<style name="MyBottomSheetStyle" parent="Theme.Design.Light.BottomSheetDialog">
<item name="bottomSheetStyle">@style/bottomSheetWrapper</item>
</style>
<style name="bottomSheetWrapper" parent="Widget.Design.BottomSheet.Modal">
<item name="android:background">@android:color/transparent</item>
</style>
</resources> </resources>

View File

@@ -11,7 +11,7 @@
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true # org.gradle.parallel=true
#Wed Jul 08 17:07:15 CST 2026 #Wed Jul 08 17:07:15 CST 2026
BAIDU_MAP_KEY=YT2CmlqAkpMyzmw1AKNIBlYlBtHESEaW BAIDU_MAP_KEY=Y3ANA8hXCrz0rj2HTXVdq9fWvBMx2B4b
BUGLY_KEY=06fc0a9cd1 BUGLY_KEY=06fc0a9cd1
GOOGLE_MAP_KEY=AIzaSyCFEqlOoo2274NsX7tzoQjs_DA7B9N7-gY GOOGLE_MAP_KEY=AIzaSyCFEqlOoo2274NsX7tzoQjs_DA7B9N7-gY
HTTP_REQUEST_KEY=ODk4OPUpVSSU1TS0hLZWhtYXNkZldFa2poZiEqamZzYWRmODQ1Mw== HTTP_REQUEST_KEY=ODk4OPUpVSSU1TS0hLZWhtYXNkZldFa2poZiEqamZzYWRmODQ1Mw==