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 mTitleList; + + private int textSize = 14; + private float minScale =1f; + private boolean showIndicator =true; + + public VipMagicIndicatorAdapter(Context context, List 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;