veloria two 6.16 commit

This commit is contained in:
yuyl 2025-06-16 20:29:42 +08:00
parent 85994237a8
commit 41c7432edb
11 changed files with 346 additions and 93 deletions

View File

@ -14,8 +14,8 @@ android {
applicationId = "com.veloria.now.shortapp"
minSdk = 24
targetSdk = 34
versionCode = 3
versionName = "1.0.2"
versionCode = 4
versionName = "1.0.3"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -22,4 +22,8 @@ object TranslationHelper {
}
fun replaces(string: String, new1: String, new2: String): String {
val replace = string.replace("##", new1)
return replace.replace("#1#", new2)
}
}

View File

@ -13,7 +13,6 @@ import android.view.WindowManager
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.android.billingclient.api.AcknowledgePurchaseParams
import com.android.billingclient.api.BillingClient
@ -36,12 +35,13 @@ import com.veloria.now.shortapp.civil.YFHome
import com.veloria.now.shortapp.civil.toast
import com.veloria.now.shortapp.databinding.LayoutVePlayerBuyDialogBinding
import com.veloria.now.shortapp.subtractionCroll.bidirectional.coordinate.VeStoreViewModel
import com.veloria.now.shortapp.subtractionCroll.modificationsPretch.VeBannerVipPayAdapter
import com.veloria.now.shortapp.subtractionCroll.modificationsPretch.VeStoreCoinAdapter
import com.veloria.now.shortapp.subtractionCroll.modificationsPretch.VeStoreVipAdapter
import com.veloria.now.shortapp.texturedAsink.VeCreatePayOrderReqBean
import com.veloria.now.shortapp.texturedAsink.VePayBean
import com.veloria.now.shortapp.texturedAsink.VePaySettingsBean
import com.veloria.now.shortapp.texturedAsink.XAboutBean
import com.youth.banner.listener.OnPageChangeListener
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
@ -52,7 +52,7 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
private val viewModel by lazy { ViewModelProvider(this)[VeStoreViewModel::class.java] }
private var coinAdapter: VeStoreCoinAdapter? = null
private var vipAdapter: VeStoreVipAdapter? = null
private var bannerAdapter: VeBannerVipPayAdapter? = null
private var promise_view_ad: Int? = -1
private var connectNum = 0
private var short_play_id: Int? = 0
@ -68,6 +68,7 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
private var isBuy = false
private var purchaseData: Purchase? = null
private var parcelable: XAboutBean.Episode? = null
interface OnDataPassOnClick {
fun onDataPassOnClick(data: VePaySettingsBean.CoinsBean?)
@ -82,7 +83,7 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
val inflater = requireActivity().layoutInflater
val view = inflater.inflate(R.layout.layout_ve_player_buy_dialog, null)
binding = LayoutVePlayerBuyDialogBinding.bind(view)
val parcelable =
parcelable =
arguments?.getParcelable<XAboutBean.Episode>(JActivityAdapter.BUY_EPISODE)
short_play_id = parcelable?.short_play_id
promise_view_ad = parcelable?.promise_view_ad
@ -137,44 +138,16 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
}
})
vipAdapter = VeStoreVipAdapter()
binding?.recyclerVip?.layoutManager =
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
binding?.recyclerVip?.adapter = vipAdapter
showLoading()
viewModel.getPaySettingsV3(0, 0)
vipAdapter?.setOnItemClickListener { adapter, view, position ->
if (typeOnClick == 0) {
coinAdapter?.currentPosition = -1
coinAdapter?.notifyDataSetChanged()
}
typeOnClick = 1
vipAdapter?.currentPosition = position
vipAdapter?.notifyDataSetChanged()
vipData = vipAdapter!!.getItem(position) as VePaySettingsBean.VipBean
if (parcelable != null) {
short_play_id?.let {
VeCreatePayOrderReqBean(
vipData?.id.toString(),
"google",
it,
parcelable.short_play_video_id
)
}?.let {
viewModel.setCreatePayOrder(
it
)
}
}
}
coinAdapter?.setOnItemClickListener { adapter, view, position ->
if (typeOnClick == 1) {
vipAdapter?.currentPosition = -1
vipAdapter?.notifyDataSetChanged()
if (bannerAdapter?.currentPosition!! >= 0) {
bannerAdapter?.notifyItemChanged(bannerAdapter?.currentPosition!!)
}
bannerAdapter?.oldPosition = -1
bannerAdapter?.currentPosition = -1
}
typeOnClick = 0
coinAdapter?.currentPosition = position
@ -189,7 +162,7 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
coinsData?.id.toString(),
"google",
it,
parcelable.short_play_video_id
parcelable!!.short_play_video_id
)
}?.let {
viewModel.setCreatePayOrder(
@ -216,12 +189,93 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
return dialog
}
private fun setBannerListener() {
binding?.bannerVip?.setOnBannerListener { data, position ->
if (typeOnClick == 0) {
coinAdapter?.currentPosition = -1
coinAdapter?.notifyDataSetChanged()
}
if (bannerAdapter?.currentPosition!! >= 0) {
bannerAdapter?.oldPosition = bannerAdapter?.currentPosition!!
}
typeOnClick = 1
bannerAdapter?.currentPosition = position
bannerAdapter?.notifyItemChanged(position)
if (bannerAdapter?.oldPosition!! >= 0) {
bannerAdapter?.notifyItemChanged(bannerAdapter?.oldPosition!!)
}
vipData =
bannerAdapter?.getData(bannerAdapter!!.currentPosition) as VePaySettingsBean.VipBean
showLoading()
if (parcelable != null) {
short_play_id?.let {
VeCreatePayOrderReqBean(
vipData?.id.toString(),
"google",
it,
parcelable!!.short_play_video_id
)
}?.let {
viewModel.setCreatePayOrder(
it
)
}
}
}
binding?.bannerVip?.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
val data = bannerAdapter?.getData(position)
data?.let { setVipContentText(it) }
}
override fun onPageScrollStateChanged(state: Int) {
}
})
val itemData = bannerAdapter?.getData(0)
itemData?.let { setVipContentText(it) }
}
private fun setVipContentText(data: VePaySettingsBean.VipBean) {
val vipContent1 = TranslationHelper.replaces(
getString(R.string.unlimited_access_to_all_series_for_1_br),
data?.vip_type_key.toString(),
data.send_coin_ttl.toString()
)
binding?.tvBuyHint?.text =
Html.fromHtml(vipContent1, Html.FROM_HTML_MODE_LEGACY)
}
fun observeData() {
viewModel.PaySettingsV3.observe(this) {
if (it?.data != null) {
coinAdapter?.submitList(it.data.list_coins)
vipAdapter?.submitList(it.data.list_sub_vip)
if (it.data.list_sub_vip.isNotEmpty()) {
binding?.tvBuyHint?.visibility = View.VISIBLE
binding?.bannerVip?.visibility = View.VISIBLE
bannerAdapter =
VeBannerVipPayAdapter(it.data.list_sub_vip)
binding?.bannerVip?.setBannerGalleryEffect(
resources.getDimension(R.dimen.dp_5).toInt(),
resources.getDimension(R.dimen.dp_5).toInt()
)
binding?.bannerVip?.setAdapter(bannerAdapter)
setBannerListener()
}
it.data.list_sub_vip.let { it1 -> querySubVipProductDetails(it1) }
it.data.list_coins.let { it1 -> queryInAppCoinsProductDetails(it1) }
}
@ -266,9 +320,8 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
} else {
toast(getString(R.string.shapeSelected))
}
hideLoading()
}
hideLoading()
}
}
@ -389,8 +442,8 @@ class PlayerBuyDialogFragment : BottomSheetDialogFragment() {
} ?: vip
}
vipAdapter?.recyclerView?.postDelayed({
vipAdapter?.submitList(updatedVipList)
binding?.root?.postDelayed({
bannerAdapter?.setDatas(updatedVipList)
hideLoading()
}, 500)
} else {

View File

@ -571,7 +571,7 @@ class MQVAutoWidthActivity :
if (marqueeo < 162.0f) {
}
showLoading()
viewModel.getVideoPlayDetails(shortPlayId, 0, activityId, revolution)
}
@ -624,7 +624,6 @@ class MQVAutoWidthActivity :
showLoading()
var appendK: MutableMap<String, Float> = mutableMapOf<String, Float>()
appendK.put("decklink", 519.0f)
appendK.put("flattened", 285.0f)
@ -1904,10 +1903,11 @@ class MQVAutoWidthActivity :
}
viewModel.detailsRecommendLiveData.observe(this) {
hideLoading()
it?.data?.let {
setDetailsRecommendation(it)
} ?: finish()
hideLoading()
}
viewModel.userInfo.observe(this) {

View File

@ -845,6 +845,7 @@ class PSVHomeSearchActivity : AIXTextActivity<JsDramaFragmentBinding, JService>(
)
needSave = true
w2aSelfAttribution(clipContent)
RYAction.getMMKV().putString(JActivityAdapter.HOME_DDL_URL, "")
}
}
}
@ -976,7 +977,9 @@ class PSVHomeSearchActivity : AIXTextActivity<JsDramaFragmentBinding, JService>(
// setDeeplinkFbApi(facebook_id)
}
}
data?.let { viewModel.setW2aSelfAttribution(it) }
singleOnClick {
data?.let { viewModel.setW2aSelfAttribution(it) }
}
}
}

View File

@ -30,11 +30,13 @@ import com.veloria.now.shortapp.civil.toast
import com.veloria.now.shortapp.databinding.ActivityVeStoreBinding
import com.veloria.now.shortapp.newsletter.AIXTextActivity
import com.veloria.now.shortapp.subtractionCroll.bidirectional.coordinate.VeStoreViewModel
import com.veloria.now.shortapp.subtractionCroll.modificationsPretch.VeBannerVipPayAdapter
import com.veloria.now.shortapp.subtractionCroll.modificationsPretch.VeStoreCoinAdapter
import com.veloria.now.shortapp.subtractionCroll.modificationsPretch.VeStoreVipAdapter
import com.veloria.now.shortapp.texturedAsink.VeCreatePayOrderReqBean
import com.veloria.now.shortapp.texturedAsink.VePayBean
import com.veloria.now.shortapp.texturedAsink.VePaySettingsBean
import com.youth.banner.listener.OnPageChangeListener
import kotlinx.coroutines.launch
class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel>() {
@ -44,11 +46,11 @@ class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel
override fun getViewBinding() = ActivityVeStoreBinding.inflate(layoutInflater)
private var coinAdapter: VeStoreCoinAdapter? = null
private var vipAdapter: VeStoreVipAdapter? = null
private var typeOnClick = 0
private var isConnect = false
private var vipData: VePaySettingsBean.VipBean? = null
private var coinsData: VePaySettingsBean.CoinsBean? = null
private var bannerAdapter: VeBannerVipPayAdapter? = null
private var payBeanReq: VePayBean? = null
private var billingClientData: BillingClient? = null
@ -123,28 +125,16 @@ class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel
}
})
vipAdapter = VeStoreVipAdapter()
binding.recyclerVip.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
binding.recyclerVip.adapter = vipAdapter
viewModel.getPaySettingsV3(0, 0)
vipAdapter?.setOnItemClickListener { adapter, view, position ->
if (typeOnClick == 0) {
coinAdapter?.currentPosition = -1
coinAdapter?.notifyDataSetChanged()
}
typeOnClick = 1
vipAdapter?.currentPosition = position
vipAdapter?.notifyDataSetChanged()
setOnPayNowClick()
}
coinAdapter?.setOnItemClickListener { adapter, view, position ->
if (typeOnClick == 1) {
vipAdapter?.currentPosition = -1
vipAdapter?.notifyDataSetChanged()
if (bannerAdapter?.currentPosition!! >= 0) {
bannerAdapter?.notifyItemChanged(bannerAdapter?.currentPosition!!)
}
bannerAdapter?.oldPosition = -1
bannerAdapter?.currentPosition = -1
}
typeOnClick = 0
coinAdapter?.currentPosition = position
@ -156,6 +146,61 @@ class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel
initPayData()
}
private fun setBannerListener() {
binding.bannerVip.setOnBannerListener { data, position ->
if (typeOnClick == 0) {
coinAdapter?.currentPosition = -1
coinAdapter?.notifyDataSetChanged()
}
if (bannerAdapter?.currentPosition!! >= 0) {
bannerAdapter?.oldPosition = bannerAdapter?.currentPosition!!
}
typeOnClick = 1
bannerAdapter?.currentPosition = position
bannerAdapter?.notifyItemChanged(position)
if (bannerAdapter?.oldPosition!! >= 0) {
bannerAdapter?.notifyItemChanged(bannerAdapter?.oldPosition!!)
}
setOnPayNowClick()
}
binding.bannerVip.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
val data = bannerAdapter?.getData(position)
data?.let { setVipContentText(it) }
}
override fun onPageScrollStateChanged(state: Int) {
}
})
val itemData = bannerAdapter?.getData(0)
itemData?.let { setVipContentText(it) }
}
private fun setVipContentText(data: VePaySettingsBean.VipBean) {
val vipContent1 =
"Unlimited access to all series for <font color='#05CEA0'>1 ".plus(data?.vip_type_key)
.plus("</font> (No Ads)")
binding.tvVipContent1.text =
Html.fromHtml(vipContent1, Html.FROM_HTML_MODE_LEGACY)
val vipContent2 =
"The donate coins will expire in <font color='#05CEA0'>".plus(data.send_coin_ttl.toString())
.plus(" days</font>")
binding.tvVipContent2.text =
Html.fromHtml(vipContent2, Html.FROM_HTML_MODE_LEGACY)
}
fun setOnPayNowClick() {
singleOnClick {
if (!isConnect) {
@ -170,7 +215,7 @@ class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel
coinAdapter!!.getItem(coinAdapter!!.currentPosition) as VePaySettingsBean.CoinsBean
} else {
vipData =
vipAdapter!!.getItem(vipAdapter!!.currentPosition) as VePaySettingsBean.VipBean
bannerAdapter?.getData(bannerAdapter!!.currentPosition) as VePaySettingsBean.VipBean
}
showLoading()
viewModel.setCreatePayOrder(
@ -187,8 +232,25 @@ class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel
override fun observeData() {
viewModel.PaySettingsV3.observe(this) {
if (it?.data != null) {
if (it.data.list_coins.isNotEmpty() && it.data.list_sub_vip.isNotEmpty()){
binding.llTab.visibility = View.VISIBLE
}
if (it.data.list_sub_vip.isNotEmpty()){
binding.clTwo.visibility = View.VISIBLE
bannerAdapter =
VeBannerVipPayAdapter(it.data.list_sub_vip)
binding.bannerVip.setBannerGalleryEffect(
resources.getDimension(R.dimen.dp_5).toInt(),
resources.getDimension(R.dimen.dp_5).toInt()
)
binding.bannerVip.setAdapter(bannerAdapter)
setBannerListener()
}else {
binding.clTwo.visibility = View.GONE
binding.clOne.visibility = View.VISIBLE
}
coinAdapter?.submitList(it.data.list_coins)
vipAdapter?.submitList(it.data.list_sub_vip)
it.data.list_sub_vip.let { it1 -> querySubVipProductDetails(it1) }
it.data.list_coins.let { it1 -> queryInAppCoinsProductDetails(it1) }
@ -356,8 +418,8 @@ class VeStoreActivity : AIXTextActivity<ActivityVeStoreBinding, VeStoreViewModel
} ?: vip
}
vipAdapter?.recyclerView?.postDelayed({
vipAdapter?.submitList(updatedVipList)
binding.root.postDelayed({
bannerAdapter?.setDatas(updatedVipList)
hideLoading()
}, 500)
} else {

View File

@ -0,0 +1,119 @@
package com.veloria.now.shortapp.subtractionCroll.modificationsPretch
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import androidx.appcompat.widget.AppCompatImageView
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.veloria.now.shortapp.R
import com.veloria.now.shortapp.civil.TranslationHelper
import com.veloria.now.shortapp.texturedAsink.VePaySettingsBean
import com.youth.banner.adapter.BannerAdapter
class VeBannerVipPayAdapter(items: List<VePaySettingsBean.VipBean?>?) :
BannerAdapter<VePaySettingsBean.VipBean, VeBannerVipPayAdapter.BannerViewHolder>(
items
) {
var oldPosition = -1
var currentPosition = -1
override fun onCreateHolder(parent: ViewGroup, viewType: Int): BannerViewHolder {
val view: View = LayoutInflater.from(parent.context)
.inflate(R.layout.item_ve_store_vip, parent, false)
view.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
return BannerViewHolder(view)
}
override fun onBindView(
holder: BannerViewHolder?,
item: VePaySettingsBean.VipBean?,
position: Int,
size: Int
) {
if (null != item) {
val tvDay =
holder?.view?.findViewById<AppCompatTextView>(R.id.tv_day)
val tvMoney =
holder?.view?.findViewById<AppCompatTextView>(R.id.tv_money)
val tvMoneyDay =
holder?.view?.findViewById<AppCompatTextView>(R.id.tv_money_day)
val tvExtra =
holder?.view?.findViewById<AppCompatTextView>(R.id.tv_extra)
val tvSelect =
holder?.view?.findViewById<AppCompatImageView>(R.id.tv_select)
val rlLayout =
holder?.view?.findViewById<RelativeLayout>(R.id.rl_layout)
tvDay?.text = item.brief
tvMoney?.text = item.price_google
tvMoneyDay?.text = "/".plus(item.vip_type_key)
if ((item.send_coins ?: 0) > 0) {
tvExtra?.text =
"+".plus(
TranslationHelper.getTranslation()
?.let { TranslationHelper.getTranslation()?.veloria_extra } ?: "Extra")
.plus(" ").plus(item.send_coins)
tvExtra?.visibility = View.VISIBLE
} else {
tvExtra?.visibility = View.GONE
}
if (currentPosition == position) {
tvSelect?.visibility = View.VISIBLE
} else {
tvSelect?.visibility = View.GONE
}
when (item.vip_type_key) {
"week" -> {
rlLayout?.setBackgroundResource(R.mipmap.iv_store_vip_bg_1)
tvDay?.setTextColor(Color.parseColor("#64A3A7"))
tvMoney?.setTextColor(Color.parseColor("#64A3A7"))
tvMoneyDay?.setTextColor(Color.parseColor("#64A3A7"))
tvExtra?.setTextColor(Color.parseColor("#416767"))
tvExtra?.setBackgroundResource(R.drawable.bg_store_vip_1)
}
"month" -> {
rlLayout?.setBackgroundResource(R.mipmap.iv_store_vip_bg_2)
tvDay?.setTextColor(Color.parseColor("#9C7565"))
tvMoney?.setTextColor(Color.parseColor("#9C7565"))
tvMoneyDay?.setTextColor(Color.parseColor("#9C7565"))
tvExtra?.setTextColor(Color.parseColor("#573D31"))
tvExtra?.setBackgroundResource(R.drawable.bg_store_vip_2)
}
"quarter" -> {
rlLayout?.setBackgroundResource(R.mipmap.iv_store_vip_bg_3)
tvDay?.setTextColor(Color.parseColor("#647DA7"))
tvMoney?.setTextColor(Color.parseColor("#647DA7"))
tvMoneyDay?.setTextColor(Color.parseColor("#647DA7"))
tvExtra?.setTextColor(Color.parseColor("#303962"))
tvExtra?.setBackgroundResource(R.drawable.bg_store_vip_3)
}
"year" -> {
rlLayout?.setBackgroundResource(R.mipmap.iv_store_vip_bg_4)
tvDay?.setTextColor(Color.parseColor("#9C6586"))
tvMoney?.setTextColor(Color.parseColor("#9C6586"))
tvMoneyDay?.setTextColor(Color.parseColor("#9C6586"))
tvExtra?.setTextColor(Color.parseColor("#674162"))
tvExtra?.setBackgroundResource(R.drawable.bg_store_vip_4)
}
}
}
}
inner class BannerViewHolder(var view: View) : RecyclerView.ViewHolder(
view
)
}

View File

@ -60,6 +60,7 @@
android:id="@+id/ll_tab"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_45"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
@ -92,6 +93,7 @@
android:id="@+id/fl_tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ll_tab">
@ -100,7 +102,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="@dimen/dp_10"
android:paddingVertical="@dimen/dp_15"
android:paddingTop="@dimen/dp_15"
android:visibility="gone">
<androidx.appcompat.widget.AppCompatTextView
@ -154,7 +156,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="@dimen/dp_10"
android:paddingVertical="@dimen/dp_15"
android:paddingTop="@dimen/dp_15"
android:visibility="visible">
<androidx.appcompat.widget.AppCompatTextView
@ -240,15 +242,16 @@
app:layout_constraintStart_toEndOf="@+id/tv_vip_content2"
app:layout_constraintTop_toBottomOf="@+id/tv_vip_text" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_vip"
<com.youth.banner.Banner
android:id="@+id/banner_vip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="@dimen/dp_135"
android:layout_marginTop="@dimen/dp_12"
app:banner_auto_loop="false"
app:banner_infinite_loop="false"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_vip_content1" />
app:layout_constraintTop_toBottomOf="@+id/tv_vip_content1"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
@ -260,6 +263,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_10"
android:lineSpacingExtra="@dimen/dp_2"
android:text="@string/ve_store_tips"
android:textColor="@color/white50"

View File

@ -1,9 +1,9 @@
<?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="@dimen/dp_330"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_12"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rl_layout"
android:background="@mipmap/iv_store_vip_bg_1">
<TextView

View File

@ -46,16 +46,17 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_vip"
<com.youth.banner.Banner
android:id="@+id/banner_vip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_15"
android:layout_height="@dimen/dp_135"
android:layout_marginTop="@dimen/dp_12"
android:visibility="gone"
app:banner_auto_loop="false"
app:banner_infinite_loop="false"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_coins_text" />
app:layout_constraintTop_toBottomOf="@+id/tv_coins_text"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_buy_hint"
@ -64,6 +65,7 @@
android:layout_marginHorizontal="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_10"
android:background="@drawable/bg_player_buy_hint"
android:visibility="gone"
android:lineSpacingExtra="@dimen/dp_5"
android:paddingHorizontal="@dimen/dp_15"
android:paddingVertical="@dimen/dp_10"
@ -71,7 +73,7 @@
android:textColor="@color/white80"
android:textSize="@dimen/sp_12"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recycler_vip" />
app:layout_constraintTop_toBottomOf="@+id/banner_vip" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_coin"

View File

@ -42,7 +42,13 @@
<string name="feedback_history">Feedback History</string>
<string name="feedback_detail">Feedback Detail</string>
<string name="unlimited_access_to_all_series_for_1">· Unlimited access to all series for 1 week (No Ads).\n· The donate coins will expire in 8 days.\n· Auto renew, cancel anytime.</string>
<string name="unlimited_access_to_all_series_for_1_br"><![CDATA[· Unlimited access to all series for 1 week (No Ads).<br>· The donate coins will expire in 8 days.<br>· Auto renew, cancel anytime.]]></string>
<string name="unlimited_access_to_all_series_for_1_br">
<![CDATA[
· Unlimited access to all series for <font color="#05CEA0">1 ##</font> (No Ads).<br>
· The donate coins will expire in <font color="#05CEA0">#1# days</font>.<br>
· Auto renew, cancel anytime.
]]>
</string>
<string name="your_coins">Your Coins:</string>
<string name="language">Language</string>
<string name="welcome_to_veloria">Welcome to Veloria</string>