diff --git a/app/build.gradle b/app/build.gradle
index 4f40698d9..921cbc776 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -204,8 +204,7 @@ dependencies {
implementation "com.llew.huawei:verifier:1.0.3"
annotationProcessor 'androidx.annotation:annotation:1.1.0'
- api "com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar"
- api "com.nex3z:flow-layout:1.2.2"
+ implementation 'io.github.h07000223:flycoTabLayout:3.0.0'
api project(':core')
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e2a46b13b..6ffb6f8c5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1233,6 +1233,10 @@
android:name=".avroom.firstcharge.FirstChargeDialog"
android:theme="@style/dialogactivity" />
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/VipProgressBar.kt b/app/src/main/java/com/yizhuan/erban/avroom/widget/VipProgressBar.kt
new file mode 100644
index 000000000..721cde49e
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/VipProgressBar.kt
@@ -0,0 +1,40 @@
+package com.yizhuan.erban.avroom.widget
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.graphics.Canvas
+import android.util.AttributeSet
+import android.widget.ProgressBar
+import com.netease.nim.uikit.common.util.sys.ScreenUtil
+import com.yizhuan.erban.R
+
+class VipProgressBar(context: Context, attrs: AttributeSet?) : ProgressBar(context, attrs) {
+
+ private var thumbBitmap: Bitmap =
+ BitmapFactory.decodeResource(context.resources, R.drawable.ic_vip_thumb)
+ private var thumbWidth: Float = thumbBitmap.width.toFloat()
+ private var thumbHeight: Float = thumbBitmap.height.toFloat()
+ private var mWidth = 0
+ private var mHeight = 0
+ private val leftPadding = ScreenUtil.dip2px(9f)
+
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+ super.onSizeChanged(w, h, oldw, oldh)
+ mWidth = w
+ mHeight = h
+ }
+
+ @Synchronized
+ override fun onDraw(canvas: Canvas) {
+ super.onDraw(canvas)
+ val radio = progress * 1.0f / max
+ canvas.drawBitmap(
+ thumbBitmap,
+ (mWidth - leftPadding * 2) * radio - thumbWidth / 2f + leftPadding,
+ (mHeight - thumbHeight) / 2f,
+ null
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/MeFragment.java b/app/src/main/java/com/yizhuan/erban/home/fragment/MeFragment.java
index fd22ae454..8b1e7842c 100644
--- a/app/src/main/java/com/yizhuan/erban/home/fragment/MeFragment.java
+++ b/app/src/main/java/com/yizhuan/erban/home/fragment/MeFragment.java
@@ -16,7 +16,6 @@ import com.idlefish.flutterboost.FlutterBoost;
import com.yizhuan.erban.MainActivity;
import com.yizhuan.erban.R;
import com.yizhuan.erban.UIHelper;
-import com.yizhuan.erban.avroom.dialog.CreateRoomDialog;
import com.yizhuan.erban.base.BaseFragment;
import com.yizhuan.erban.databinding.FragmentMeBinding;
import com.yizhuan.erban.decoration.view.MyDecorationActivity;
@@ -34,6 +33,7 @@ import com.yizhuan.erban.ui.relation.FansListActivity;
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
import com.yizhuan.erban.ui.webview.CommonWebViewActivity;
import com.yizhuan.erban.ui.widget.higuide.TuTuGuideHelper;
+import com.yizhuan.erban.vip.VipMainActivity;
import com.yizhuan.xchat_android_core.UriProvider;
import com.yizhuan.xchat_android_core.decoration.headwear.bean.HeadWearInfo;
import com.yizhuan.xchat_android_core.level.UserLevelVo;
@@ -42,7 +42,6 @@ import com.yizhuan.xchat_android_core.manager.RelationShipEvent;
import com.yizhuan.xchat_android_core.noble.NobleInfo;
import com.yizhuan.xchat_android_core.noble.NobleProtocol;
import com.yizhuan.xchat_android_core.noble.NobleUtil;
-import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
import com.yizhuan.xchat_android_core.user.UserModel;
@@ -327,6 +326,9 @@ public class MeFragment extends BaseFragment implements View.OnClickListener {
case R.id.me_item_link_room:
CommonWebViewActivity.start(mContext, UriProvider.getLinkRoomUrl());
break;
+ case R.id.me_item_vip:
+ VipMainActivity.start(mContext,0);
+ break;
default:
break;
}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java
index d046c64f3..a7b4371d4 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java
@@ -147,7 +147,7 @@ public class ChargeActivity extends BaseActivity {
tvCharge.setOnClickListener(v -> {
if (mSelectChargeBean == null) return;
getDialogManager().showProgressDialog(this, false);
- PaymentActivity.start(this, payChannel, String.valueOf(mSelectChargeBean.chargeProdId));
+ PaymentActivity.start(this, payChannel, mSelectChargeBean.chargeProdId);
});
tvAgreement.setOnClickListener(v -> {
CommonWebViewActivity.start(this, UriProvider.getRechargeAgreementUrl());
diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java
index 3a4022bee..f80ec8124 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/LinePagerIndicator.java
@@ -112,6 +112,7 @@ public class LinePagerIndicator extends View implements IPagerIndicator {
@Override
public void onPageSelected(int position) {
+ onPageScrolled(position,0,0);
}
@Override
diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/titles/ColorTransitionPagerTitleView.java b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/titles/ColorTransitionPagerTitleView.java
index e1bd3c9ed..3e44be2fe 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/titles/ColorTransitionPagerTitleView.java
+++ b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/titles/ColorTransitionPagerTitleView.java
@@ -30,9 +30,11 @@ public class ColorTransitionPagerTitleView extends SimplePagerTitleView {
@Override
public void onSelected(int index, int totalCount) {
+ setTextColor(mSelectedColor);
}
@Override
public void onDeselected(int index, int totalCount) {
+ setTextColor(mNormalColor);
}
}
diff --git a/app/src/main/java/com/yizhuan/erban/vip/VipAuthAdapter.kt b/app/src/main/java/com/yizhuan/erban/vip/VipAuthAdapter.kt
new file mode 100644
index 000000000..1c388562b
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/vip/VipAuthAdapter.kt
@@ -0,0 +1,28 @@
+package com.yizhuan.erban.vip
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.vip.VipAuthInfo
+import com.yizhuan.xchat_android_core.vip.VipInfo
+
+class VipAuthAdapter :
+ BaseQuickAdapter(R.layout.item_vip_auth) {
+
+
+ private var vipInfo: VipInfo? = null
+
+ fun setVipInfo(vipInfo: VipInfo?) {
+ this.vipInfo = vipInfo
+ }
+
+ override fun convert(helper: BaseViewHolder, item: VipAuthInfo) {
+ helper.setText(R.id.tv_auth_name, item.authName)
+ .setText(R.id.tv_auth_desc, item.authDesc)
+ helper.getView(R.id.iv_auth_icon).load(item.authIcon)
+ helper.itemView.alpha =
+ if (vipInfo?.ownAuthTypes?.contains(item.authType) == true) 1f else 0.5f
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/vip/VipMagicIndicatorAdapter.java b/app/src/main/java/com/yizhuan/erban/vip/VipMagicIndicatorAdapter.java
new file mode 100644
index 000000000..708300898
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/vip/VipMagicIndicatorAdapter.java
@@ -0,0 +1,109 @@
+package com.yizhuan.erban.vip;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.core.content.ContextCompat;
+
+import com.yizhuan.erban.R;
+import com.yizhuan.erban.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
+
+import java.util.List;
+
+public class VipMagicIndicatorAdapter extends CommonNavigatorAdapter {
+ private final Context mContext;
+ private final List extends CharSequence> mTitleList;
+
+ private int textSize = 14;
+ private float minScale =1f;
+ private boolean showIndicator =true;
+
+ public VipMagicIndicatorAdapter(Context context, List extends CharSequence> charSequences ) {
+ this.mContext = context;
+ this.mTitleList = charSequences;
+ }
+
+ @Override
+ public int getCount() {
+ return mTitleList == null ? 0 : mTitleList.size();
+ }
+
+
+ @Override
+ public IPagerTitleView getTitleView(Context context, final int i) {
+ ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
+ scaleTransitionPagerTitleView.setNormalColor(Color.parseColor("#FFBC9E66"));
+ scaleTransitionPagerTitleView.setSelectedColor(Color.parseColor("#FFFFE3AF"));
+ scaleTransitionPagerTitleView.setMinScale(minScale);
+ scaleTransitionPagerTitleView.setTextSize(textSize);
+ int padding = UIUtil.dip2px(context, 5);
+ scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
+ scaleTransitionPagerTitleView.setText(mTitleList.get(i));
+ scaleTransitionPagerTitleView.setOnClickListener(view -> {
+ if (mOnItemSelectListener != null) {
+ mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView);
+ }
+
+ });
+ return scaleTransitionPagerTitleView;
+ }
+
+
+ @Override
+ public IPagerIndicator getIndicator(Context context) {
+ if (!showIndicator) return null;
+ LinePagerIndicator indicator = new LinePagerIndicator(context);
+ indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
+ indicator.setLineHeight(UIUtil.dip2px(mContext, 3));
+ indicator.setRoundRadius(UIUtil.dip2px(mContext, 10));
+ indicator.setLineWidth(UIUtil.dip2px(mContext, 26));
+ indicator.setColors(Color.parseColor("#FFFFD3A8"));
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.bottomMargin = UIUtil.dip2px(mContext, 0);
+ indicator.setLayoutParams(lp);
+ return indicator;
+ }
+
+ public int getTextSize() {
+ return textSize;
+ }
+
+ public void setTextSize(int textSize) {
+ this.textSize = textSize;
+ }
+
+ public float getMinScale() {
+ return minScale;
+ }
+
+ public void setMinScale(float minScale) {
+ this.minScale = minScale;
+ }
+
+ public boolean isShowIndicator() {
+ return showIndicator;
+ }
+
+ public void setShowIndicator(boolean showIndicator) {
+ this.showIndicator = showIndicator;
+ }
+
+ private OnItemSelectListener mOnItemSelectListener;
+
+ public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
+ mOnItemSelectListener = onItemSelectListener;
+ }
+
+ public interface OnItemSelectListener {
+ void onItemSelect(int position, TextView view);
+ }
+}
diff --git a/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt b/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt
new file mode 100644
index 000000000..227ed5f26
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt
@@ -0,0 +1,266 @@
+package com.yizhuan.erban.vip
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.activity.viewModels
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.isInvisible
+import androidx.core.view.isVisible
+import androidx.recyclerview.widget.GridLayoutManager
+import com.netease.nim.uikit.StatusBarUtil
+import com.netease.nim.uikit.common.util.sys.TimeUtil
+import com.yizhuan.erban.R
+import com.yizhuan.erban.avroom.firstcharge.SelectPayTypeDialog
+import com.yizhuan.erban.bank_card.activity.AddBankCardAgreementActivity
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.base.TitleBar
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.common.widget.dialog.DialogManager
+import com.yizhuan.erban.databinding.ActivityVipMainBinding
+import com.yizhuan.erban.ui.setting.ModifyPwdActivity
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.erban.ui.webview.CommonWebViewActivity
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
+import com.yizhuan.xchat_android_core.UriProvider
+import com.yizhuan.xchat_android_core.auth.AuthModel
+import com.yizhuan.xchat_android_core.pay.PayModel
+import com.yizhuan.xchat_android_core.pay.PaymentActivity
+import com.yizhuan.xchat_android_core.pay.bean.PaymentResult
+import com.yizhuan.xchat_android_core.pay.model.unionpay.UnionPayModel
+import com.yizhuan.xchat_android_core.vip.VipAuthInfo
+import com.yizhuan.xchat_android_core.vip.VipInfo
+import com.yizhuan.xchat_android_core.vip.VipPageInfo
+import com.yizhuan.xchat_android_library.utils.JavaUtil
+import java.util.*
+
+class VipMainActivity : BaseViewBindingActivity(),
+ VipMagicIndicatorAdapter.OnItemSelectListener {
+
+ companion object {
+
+ @JvmStatic
+ fun start(context: Context, roomUid: Long) {
+ val starter = Intent(context, VipMainActivity::class.java)
+ starter.putExtra("roomUid", roomUid)
+ context.startActivity(starter)
+ }
+
+ private const val BIND_CODE_GOLD = 200
+ }
+
+ private val perAdapter = VipAuthAdapter()
+ private lateinit var rvDelegate: RVDelegate
+ private val roomUid by lazy { intent.getLongExtra("roomUid", 0) }
+ private val vipViewModel: VipViewModel by viewModels()
+
+ private var currVipInfo: VipInfo? = null
+ private var vipInfos: List? = null
+ private var myVipInfo: VipInfo? = null
+ private var vipPageInfo: VipPageInfo? = null
+
+ @SuppressLint("SetTextI18n")
+ override fun init() {
+ initWhiteTitleBar("贵族中心")
+ mTitleBar.addAction(object : TitleBar.ImageAction(R.drawable.ic_room_pk_help) {
+ override fun performAction(view: View) {
+ }
+ })
+ rvDelegate = RVDelegate.Builder()
+ .setLayoutManager(GridLayoutManager(this, 3))
+ .setRecyclerView(binding.recyclerView)
+ .setEmptyView(EmptyViewHelper.createEmptyView(context, "没有搜索结果"))
+ .setAdapter(perAdapter)
+ .build()
+ binding.recyclerView.isNestedScrollingEnabled = false
+ vipViewModel.getVipPageInfo()
+ vipViewModel.vipInfoLiveData.observe(this) {
+
+ vipPageInfo = it
+ it?.let {
+ vipInfos = it.vipInfos
+ myVipInfo = it.vipInfos?.find { vipInfo -> it.currLevel == vipInfo.vipLevel }
+ val nextVipInfo =
+ it.vipInfos?.getOrNull((it.vipInfos?.indexOf(myVipInfo) ?: -1) + 1)
+
+ if (nextVipInfo == null || nextVipInfo == myVipInfo) {
+
+ }
+
+ myVipInfo?.let { vipInfo ->
+
+ binding.llMyVipInfo.isVisible = true
+ binding.tvOpenVip.isVisible = false
+ binding.tvNotOpen.text = "当前权力值:${it.currScore}"
+ binding.tvCurrValue.text = "当前${it.currScore}"
+ binding.tvCurrLevelName.text = myVipInfo?.vipName
+ binding.tvNextLevelName.text = nextVipInfo?.vipName
+ binding.tvKeepValue.text = "保级${vipInfo.levelKeepScore}"
+ binding.tvUpValue.text = "升级${vipInfo.levelUpScore}"
+ binding.tvUpgradeValue.text = "${vipInfo.levelUpScore - it.currScore}"
+ binding.tvResidueTime.text = TimeUtil.getElapseTimeForVip(it.remainSeconds)
+ binding.seekBar.max = vipInfo.levelUpScore
+ binding.seekBar.progress = it.currScore
+
+ val currValueParams =
+ binding.tvCurrValue.layoutParams as ConstraintLayout.LayoutParams
+ currValueParams.horizontalBias = it.currScore.toFloat() / vipInfo.levelUpScore
+ binding.tvCurrValue.layoutParams = currValueParams
+
+ val keepParams =
+ binding.ivKeepIndicator.layoutParams as ConstraintLayout.LayoutParams
+ keepParams.horizontalBias =
+ vipInfo.levelKeepScore.toFloat() / vipInfo.levelUpScore
+ binding.ivKeepIndicator.layoutParams = keepParams
+
+ } ?: run {
+ binding.llMyVipInfo.isVisible = false
+ binding.tvOpenVip.isVisible = true
+ binding.tvNotOpen.text = "尚未开通贵族"
+ }
+
+ initTitleTab()
+ perAdapter.setNewData(it.vipAuthInfos)
+ }
+ }
+
+ }
+
+ override fun initWhiteTitleBar(title: String?) {
+ mTitleBar = findViewById(R.id.title_bar)
+ if (mTitleBar != null) {
+ mTitleBar.setTitle(title)
+ mTitleBar.setImmersive(false)
+ mTitleBar.setTitleColor(resources.getColor(R.color.white))
+ mTitleBar.setLeftImageResource(R.drawable.arrow_left_white)
+ mTitleBar.setCommonBackgroundColor(resources.getColor(R.color.transparent))
+ mTitleBar.setLeftClickListener { onLeftClickListener() }
+ }
+ }
+
+
+ /**
+ * 初始化推荐和派对tab
+ */
+ private fun initTitleTab() {
+ val tagList: MutableList = ArrayList()
+ vipInfos?.forEach {
+ tagList.add(it.vipName)
+ }
+ val commonNavigator = CommonNavigator(context)
+ commonNavigator.setTitleWrapContent(true)
+ val magicIndicatorAdapter = VipMagicIndicatorAdapter(context, tagList)
+ magicIndicatorAdapter.setOnItemSelectListener(this)
+ commonNavigator.adapter = magicIndicatorAdapter
+ binding.magicIndicator.navigator = commonNavigator
+ commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
+ onItemSelect(if (myVipInfo == null) 0 else vipInfos?.indexOf(myVipInfo) ?: 0, null)
+ }
+
+ @SuppressLint("SetTextI18n")
+ override fun onItemSelect(position: Int, view: TextView?) {
+ currVipInfo = vipInfos?.getOrNull(position)
+ binding.ivMyLevel.isInvisible = currVipInfo?.vipLevel != myVipInfo?.vipLevel
+ binding.tvNotOpen.text = if (myVipInfo == null) {
+ "尚未开通贵族"
+ } else {
+ "当前权力值:${vipPageInfo?.currScore ?: 0}"
+ }
+ binding.tvNotOpen.isInvisible =
+ !(currVipInfo?.vipLevel == myVipInfo?.vipLevel || myVipInfo == null)
+ binding.ivVipIcon.load(currVipInfo?.vipLogo)
+ binding.tvAuthNum.text =
+ "${currVipInfo?.ownAuthTypes?.size ?: 0}/${vipPageInfo?.vipAuthInfos?.size ?: 0}"
+ perAdapter.setVipInfo(currVipInfo)
+ binding.magicIndicator.onPageSelected(position)
+ perAdapter.notifyDataSetChanged()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ loadData()
+ }
+
+ @SuppressLint("CheckResult", "SetTextI18n")
+ private fun loadData() {
+ PayModel.get().getChargeList(9, AuthModel.get().currentUid)
+ .compose(bindToLifecycle())
+ .subscribe(
+ {
+ val chargeInfo = it.list.getOrNull(0)
+ chargeInfo?.let { chargeBean ->
+ binding.tvOpenVip.text = "¥${chargeBean.getMoney()}立刻成为大鹅贵族"
+ binding.tvOpenVip.setOnClickListener {
+ SelectPayTypeDialog.newInstance(
+ chargeBean.chargeProdId,
+ "¥${chargeBean.money}",
+ )
+ .show(context)
+ }
+ }
+ }, {
+ it.printStackTrace()
+ }
+ )
+
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ dialogManager.dismissDialog()
+ if (resultCode != RESULT_OK) {
+ return
+ }
+ //支付页面返回处理
+ if (requestCode == PaymentActivity.REQUEST_CODE_PAY) {
+ if (data != null && data.extras != null) {
+ val paymentResult: PaymentResult? =
+ data.getParcelableExtra(PaymentActivity.KEY_PAY_RESULT)
+ if (paymentResult != null) {
+ // 充值金额超过限定时,就必须先实名认证
+ when (JavaUtil.str2int(paymentResult.code)) {
+ PayModel.NOT_REAL_NAME_BEFORE_CHARGING -> dialogManager.showTipsDialog(
+ getString(R.string.tips_need_to_certification),
+ getString(R.string.go_to_certification),
+ object : DialogManager.AbsOkDialogListener() {
+ override fun onOk() {
+ // 跳去实名认证页面
+ CommonWebViewActivity.start(
+ this@VipMainActivity,
+ UriProvider.getTutuRealNamePage()
+ )
+ }
+ })
+ UnionPayModel.CODE_NEED_BIND_BANK_CARD_FIRST -> dialogManager.showTipsDialog(
+ getString(R.string.tips_need_bind_bank_card_first),
+ object : DialogManager.AbsOkDialogListener() {
+ override fun onOk() {
+ // 跳去添加银行卡页面
+ AddBankCardAgreementActivity.start(this@VipMainActivity)
+ }
+ })
+ else -> {
+ toast(paymentResult.msg)
+ //重新获取钱包信息
+ PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
+ }
+ }
+ }
+ }
+ }
+ if (requestCode == BIND_CODE_GOLD) {
+ ModifyPwdActivity.start(this, ModifyPwdActivity.FOGERT_PAY_PWD)
+ }
+ }
+
+ override fun needSteepStateBar() = true
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/vip/VipViewModel.kt b/app/src/main/java/com/yizhuan/erban/vip/VipViewModel.kt
new file mode 100644
index 000000000..349e6dbd2
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/vip/VipViewModel.kt
@@ -0,0 +1,28 @@
+package com.yizhuan.erban.vip
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import com.yizhuan.erban.base.BaseViewModel
+import com.yizhuan.xchat_android_core.bean.response.ListResult
+import com.yizhuan.xchat_android_core.home.bean.*
+import com.yizhuan.xchat_android_core.home.model.HomeModel
+import com.yizhuan.xchat_android_core.utils.net.ServerException
+import com.yizhuan.xchat_android_core.utils.toast
+import com.yizhuan.xchat_android_core.vip.VipInfo
+import com.yizhuan.xchat_android_core.vip.VipModel
+import com.yizhuan.xchat_android_core.vip.VipPageInfo
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+
+class VipViewModel : BaseViewModel() {
+
+ private val _vipInfoLiveData = MutableLiveData()
+ val vipInfoLiveData: LiveData = _vipInfoLiveData
+
+ fun getVipPageInfo(){
+ safeLaunch {
+ _vipInfoLiveData.value = VipModel.getVipPageInfo()
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/bg_vip_main_bottom.png b/app/src/main/res/drawable-xhdpi/bg_vip_main_bottom.png
new file mode 100644
index 000000000..9b7a82ee1
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/bg_vip_main_bottom.png differ
diff --git a/app/src/main/res/drawable-xhdpi/bg_vip_main_per.png b/app/src/main/res/drawable-xhdpi/bg_vip_main_per.png
new file mode 100644
index 000000000..60e97ba2d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/bg_vip_main_per.png differ
diff --git a/app/src/main/res/drawable-xhdpi/bg_vip_main_top.png b/app/src/main/res/drawable-xhdpi/bg_vip_main_top.png
new file mode 100644
index 000000000..5a4417af8
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/bg_vip_main_top.png differ
diff --git a/app/src/main/res/drawable-xhdpi/bg_vip_my_level.png b/app/src/main/res/drawable-xhdpi/bg_vip_my_level.png
new file mode 100644
index 000000000..1b34a112e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/bg_vip_my_level.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_vip_auth_text.png b/app/src/main/res/drawable-xhdpi/ic_vip_auth_text.png
new file mode 100644
index 000000000..25ff9583e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_vip_auth_text.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_vip_keep_indicator.png b/app/src/main/res/drawable-xhdpi/ic_vip_keep_indicator.png
new file mode 100644
index 000000000..a6f7ea0d7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_vip_keep_indicator.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_vip_thumb.png b/app/src/main/res/drawable-xhdpi/ic_vip_thumb.png
new file mode 100644
index 000000000..ce81e8332
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_vip_thumb.png differ
diff --git a/app/src/main/res/drawable/bg_vip_open_btn.xml b/app/src/main/res/drawable/bg_vip_open_btn.xml
new file mode 100644
index 000000000..d09317fa7
--- /dev/null
+++ b/app/src/main/res/drawable/bg_vip_open_btn.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_vip_seek_bar.xml b/app/src/main/res/drawable/bg_vip_seek_bar.xml
new file mode 100644
index 000000000..239a4842a
--- /dev/null
+++ b/app/src/main/res/drawable/bg_vip_seek_bar.xml
@@ -0,0 +1,23 @@
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_me.xml b/app/src/main/res/layout/fragment_me.xml
index a2a2fb634..aa6c8ab4b 100644
--- a/app/src/main/res/layout/fragment_me.xml
+++ b/app/src/main/res/layout/fragment_me.xml
@@ -665,6 +665,25 @@
android:textSize="13sp"
android:visibility="gone" />
+
+
+
diff --git a/app/src/main/res/layout/list_room_item_view.xml b/app/src/main/res/layout/list_room_item_view.xml
deleted file mode 100644
index c4e6acc08..000000000
--- a/app/src/main/res/layout/list_room_item_view.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/module_labour_union/res/layout/activity_vip_main.xml b/app/src/module_labour_union/res/layout/activity_vip_main.xml
new file mode 100644
index 000000000..f6616fa58
--- /dev/null
+++ b/app/src/module_labour_union/res/layout/activity_vip_main.xml
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/module_labour_union/res/layout/item_vip_auth.xml b/app/src/module_labour_union/res/layout/item_vip_auth.xml
new file mode 100644
index 000000000..4dd7a70e1
--- /dev/null
+++ b/app/src/module_labour_union/res/layout/item_vip_auth.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/pay/bean/ChargeBean.java b/core/src/main/java/com/yizhuan/xchat_android_core/pay/bean/ChargeBean.java
index e610c83ad..127afc218 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/pay/bean/ChargeBean.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/pay/bean/ChargeBean.java
@@ -17,7 +17,7 @@ public class ChargeBean implements Serializable{
"channel": "wx" //充值渠道
*/
- public int chargeProdId;
+ public String chargeProdId;
public String prodName;
public int money;
public int giftGoldNum;
@@ -42,11 +42,11 @@ public class ChargeBean implements Serializable{
// }
- public int getChargeProdId() {
+ public String getChargeProdId() {
return chargeProdId;
}
- public void setChargeProdId(int chargeProdId) {
+ public void setChargeProdId(String chargeProdId) {
this.chargeProdId = chargeProdId;
}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipAuthInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipAuthInfo.kt
new file mode 100644
index 000000000..081b009a5
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipAuthInfo.kt
@@ -0,0 +1,15 @@
+package com.yizhuan.xchat_android_core.vip
+
+data class VipAuthInfo(
+ val authDesc: String = "",
+ val authIcon: String = "",
+ val authIntro: String = "",
+ val authName: String = "",
+ val authType: Int = 0,
+ val createTime: String = "",
+ val descPic: String = "",
+ val id: Int = 0,
+ val seq: Int = 0,
+ val status: Int = 0,
+ val updateTime: String = ""
+ )
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipInfo.kt
new file mode 100644
index 000000000..42897a897
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipInfo.kt
@@ -0,0 +1,22 @@
+package com.yizhuan.xchat_android_core.vip
+
+data class VipInfo(
+ val comingSoon: Int = 0,
+ val createTime: String = "",
+ val levelKeepScore: Int = 0,
+ val levelUpScore: Int = 0,
+ val ownAuthTypes: List? = null,
+ val updateTime: String = "",
+ val vipIcon: String = "",
+ val vipLevel: Int = 0,
+ val vipLogo: String = "",
+ val vipName: String = ""
+) {
+ override fun equals(other: Any?): Boolean {
+ return other is VipInfo && other.vipLevel == vipLevel
+ }
+
+ override fun hashCode(): Int {
+ return vipLevel
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipModel.kt b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipModel.kt
new file mode 100644
index 000000000..1917e3716
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipModel.kt
@@ -0,0 +1,31 @@
+package com.yizhuan.xchat_android_core.vip
+
+import com.yizhuan.xchat_android_core.base.BaseModel
+import com.yizhuan.xchat_android_core.bean.response.ServiceResult
+import com.yizhuan.xchat_android_core.utils.net.launchRequest
+import com.yizhuan.xchat_android_library.net.rxnet.RxNet
+import retrofit2.http.GET
+
+object VipModel : BaseModel() {
+
+ private val api = RxNet.create(Api::class.java)
+
+ suspend fun getVipPageInfo(): VipPageInfo? =
+ launchRequest {
+ api.getVipPageInfo()
+ }
+
+
+ private interface Api {
+
+ /**
+ * 获取vip主页信息
+ *
+ * @return
+ */
+ @GET("vip/getVipPageInfo")
+ suspend fun getVipPageInfo(): ServiceResult
+
+ }
+
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipPageInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipPageInfo.kt
new file mode 100644
index 000000000..9f3a8892d
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/vip/VipPageInfo.kt
@@ -0,0 +1,9 @@
+package com.yizhuan.xchat_android_core.vip
+
+data class VipPageInfo(
+ val vipAuthInfos: List? = null,
+ val vipInfos: List? = null,
+ val remainSeconds: Int = 0,
+ val currLevel: Int = 0,
+ val currScore: Int = 0
+)
\ No newline at end of file
diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java
index 4211eef3a..1e8c2fa14 100644
--- a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java
+++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java
@@ -1,26 +1,16 @@
package com.yizhuan.xchat_android_core.pay.model.alipay;
import android.app.Activity;
-import android.text.TextUtils;
-import com.alipay.sdk.app.PayTask;
import com.yizhuan.xchat_android_core.Constants;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
-import com.yizhuan.xchat_android_core.exception.NullDataException;
-import com.yizhuan.xchat_android_core.pay.PayModel;
-import com.yizhuan.xchat_android_core.pay.bean.NotRealNameYetException;
-import com.yizhuan.xchat_android_core.pay.bean.PmChargeLimitException;
+import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.pay.bean.alipay.AlipayInfo;
-import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
-import com.yizhuan.xchat_android_library.utils.LogUtil;
import com.yizhuan.xchat_android_library.utils.NetworkUtils;
-import java.util.Arrays;
-import java.util.Map;
-
import io.reactivex.Single;
import retrofit2.http.POST;
import retrofit2.http.Query;
@@ -52,6 +42,7 @@ public class AliPayModel extends BaseModel implements IAliPayModel {
public Single> requestAliPay(Activity context, String chargeProdId) {
return api.requestAilPayOrder(
String.valueOf(AuthModel.get().getCurrentUid()),
+ AvRoomDataManager.get().getRoomUid() == 0 ? null : String.valueOf(AvRoomDataManager.get().getRoomUid()),
chargeProdId,
Constants.CHARGE_ALIPAY,
NetworkUtils.getIPAddress(context),
@@ -72,6 +63,7 @@ public class AliPayModel extends BaseModel implements IAliPayModel {
*/
@POST("/charge/pay/apply")
Single> requestAilPayOrder(@Query("uid") String uid,
+ @Query("roomUid") String roomUid,
@Query("chargeProdId") String chargeProdId,
@Query("payChannel") String payChannel,
@Query("clientIp") String clientIp,
diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/wechatpay/WeChatPayModel.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/wechatpay/WeChatPayModel.java
index 2350f0987..9d61de423 100644
--- a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/wechatpay/WeChatPayModel.java
+++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/wechatpay/WeChatPayModel.java
@@ -6,6 +6,7 @@ import com.yizhuan.xchat_android_core.Constants;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
+import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.pay.bean.wechatpay.WeChatAppParam;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
@@ -49,10 +50,6 @@ public class WeChatPayModel extends BaseModel implements IWeChatPayModel {
super();
}
- private static final class Helper {
- public static final WeChatPayModel INSTANCE = new WeChatPayModel();
- }
-
public static WeChatPayModel get() {
return WeChatPayModel.Helper.INSTANCE;
}
@@ -68,6 +65,7 @@ public class WeChatPayModel extends BaseModel implements IWeChatPayModel {
public Single> requestWeChatPay(Activity context, String chargeProdId) {
return api.requestWeChatPayOrder(
String.valueOf(AuthModel.get().getCurrentUid()),
+ AvRoomDataManager.get().getRoomUid() == 0 ? null : String.valueOf(AvRoomDataManager.get().getRoomUid()),
chargeProdId,
Constants.CHARGE_WX,
NetworkUtils.getIPAddress(context),
@@ -89,9 +87,14 @@ public class WeChatPayModel extends BaseModel implements IWeChatPayModel {
*/
@POST("/charge/pay/apply")
Single> requestWeChatPayOrder(@Query("uid") String uid,
+ @Query("roomUid") String roomUid,
@Query("chargeProdId") String chargeProdId,
@Query("payChannel") String payChannel,
@Query("clientIp") String clientIp,
@Query("ticket") String ticket);
}
+
+ private static final class Helper {
+ public static final WeChatPayModel INSTANCE = new WeChatPayModel();
+ }
}
diff --git a/nim_uikit/src/com/netease/nim/uikit/common/util/sys/TimeUtil.java b/nim_uikit/src/com/netease/nim/uikit/common/util/sys/TimeUtil.java
index 15d8f9ea7..06dafa77a 100644
--- a/nim_uikit/src/com/netease/nim/uikit/common/util/sys/TimeUtil.java
+++ b/nim_uikit/src/com/netease/nim/uikit/common/util/sys/TimeUtil.java
@@ -289,6 +289,19 @@ public class TimeUtil {
return retStr;
}
+ public static String getElapseTimeForVip(int seconds) {
+ StringBuilder sb = new StringBuilder();
+ if (seconds < 1) seconds = 1;
+
+ int day = seconds / (60 * 60 * 24);
+ sb.append(day).append("天");
+
+ int hour = seconds / (60 * 60) % 24;
+ sb.append(hour).append("小时");
+
+ return sb.toString();
+ }
+
public static String getElapseTimeForShow(int milliseconds) {
StringBuilder sb = new StringBuilder();
int seconds = milliseconds / 1000;