diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0461029ea..a6d884e5f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -316,6 +316,9 @@ android:name=".ui.user.activity.UserInfoActivity" android:label="@string/main_androidmanifest_016" android:screenOrientation="portrait" /> + (context: Context, theme: Int = 0) : BaseDialog(context, theme) { +abstract class BaseRoomNotifyDialog(context: Context, theme: Int = 0) : BaseDialog(context, theme) { protected val handle = Handler(Looper.getMainLooper()) protected lateinit var mBinding: VB @@ -39,9 +39,11 @@ abstract class BaseRoomNotifyeBaseDialog(context: Context, the init() - handle.postDelayed({ - dismissDialog() - }, (getStaySecond()*1000).toLong()) + if (useAutoDismiss()) { + handle.postDelayed({ + dismissDialog() + }, (getStaySecond()*1000).toLong()) + } } override fun onDetachedFromWindow() { @@ -110,17 +112,38 @@ abstract class BaseRoomNotifyeBaseDialog(context: Context, the super.setContentView(view, params) } - open fun dismissDialog(){ - try { - dismiss() - } catch (e: Exception) { - } - } - /** * 是否启动侧滑,左滑:删除,右滑:回到原位置 */ protected open fun useSlipSlip(): Boolean { return true } + protected open fun useAutoDismiss(): Boolean { + return true + } + + + var mCallBack : CallBack? = null + interface CallBack{ + fun onHide(); + } + + open fun dismissDialog() { + try { + dismiss() + } catch (e: Exception) { + } + mCallBack?.onHide() + } + + open fun clearDialog() { + try { + dismiss() + } catch (e: Exception) { + } + } + + open fun showDialog(){ + show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyCpBindDialog.kt b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyCpBindDialog.kt new file mode 100644 index 000000000..5071f1ef6 --- /dev/null +++ b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyCpBindDialog.kt @@ -0,0 +1,87 @@ +package com.chwl.app.avroom.dialog + +import android.content.Context +import android.graphics.Bitmap +import android.view.LayoutInflater +import com.chwl.app.databinding.RoomNotifyCpBindBinding +import com.chwl.app.ui.utils.CpUtils +import com.chwl.core.gift.bean.CpMsgBean +import com.chwl.core.utils.LogUtils +import com.tencent.qgame.animplayer.inter.IFetchResource +import com.tencent.qgame.animplayer.mix.Resource +import com.tencent.qgame.animplayer.util.ScaleType + +class RoomNotifyCpBindDialog (private val context: Context) : BaseRoomNotifyDialog(context) { + + override fun createBinding(inflater: LayoutInflater): RoomNotifyCpBindBinding { + return RoomNotifyCpBindBinding.inflate(inflater) + } + + var cpMsgBean : CpMsgBean? = null + var senderAvatar : Bitmap? = null + var receiverAvatar : Bitmap? = null + var index = 0 + + + override fun init() { + cpMsgBean?.let { data-> + mBinding.anim.setScaleType(ScaleType.CENTER_CROP) + + + mBinding.anim.setFetchResource(object : IFetchResource { + + override fun fetchImage(resource: Resource, result: (Bitmap?) -> Unit) { + result(if (resource.tag == "avatar1") senderAvatar else receiverAvatar) + } + + override fun fetchText(resource: Resource, result: (String?) -> Unit) { + var name = "" + try { + name = if (resource.tag == "name1") data.senderNick else data.receiverNick + } catch (e: Exception) { + } + result(name) + } + + override fun releaseResource(resources: List) { + resources?.forEach { + it?.bitmap?.recycle() + } + } + + }) + + mBinding.anim.startPlay(context.assets,"mp4/cp_bind.mp4") + } + + + } + + override fun useSlipSlip() = false + override fun useAutoDismiss() = true + + override fun showDialog() { + index = 0 + cpMsgBean?.let { + CpUtils.downLoadAvatar(it.senderAvatar) { resource -> + index += 1 + senderAvatar = resource + checkImg() + } + CpUtils.downLoadAvatar(it.receiverAvatar) { resource -> + index += 1 + receiverAvatar = resource + checkImg() + } + } + } + + fun checkImg() { + if (index == 2){ + show() + } + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyCpGiftDialog.kt b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyCpGiftDialog.kt new file mode 100644 index 000000000..4184923a8 --- /dev/null +++ b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyCpGiftDialog.kt @@ -0,0 +1,31 @@ +package com.chwl.app.avroom.dialog + +import android.content.Context +import android.view.LayoutInflater +import com.chwl.app.databinding.RoomNotifyCpGiftBinding +import com.chwl.app.ui.utils.ImageLoadUtils +import com.chwl.core.gift.bean.CpMsgBean +import kotlin.math.truncate + +/** + * cp 飘屏 + */ +class RoomNotifyCpGiftDialog (private val context: Context) : BaseRoomNotifyDialog(context) { + + override fun createBinding(inflater: LayoutInflater): RoomNotifyCpGiftBinding { + return RoomNotifyCpGiftBinding.inflate(inflater) + } + + var cpMsgBean : CpMsgBean? = null + + override fun init() { + cpMsgBean?.let { + ImageLoadUtils.loadImage(mBinding.sendAvatar,it.senderAvatar) + ImageLoadUtils.loadImage(mBinding.receiverAvatar,it.receiverNick) + ImageLoadUtils.loadImage(mBinding.gift,it.giftUrl) + } + } + + override fun useSlipSlip() = true + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyLevelUpDialog.kt b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyLevelUpDialog.kt new file mode 100644 index 000000000..6063b0b9d --- /dev/null +++ b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyLevelUpDialog.kt @@ -0,0 +1,101 @@ +package com.chwl.app.avroom.dialog + +import android.content.Context +import android.graphics.Color +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint +import android.view.LayoutInflater +import com.chwl.app.R +import com.chwl.app.avroom.helper.AnimHelper +import com.chwl.app.databinding.RoomNotifyCpLevelUpBinding +import com.chwl.app.ui.utils.CpUtils +import com.chwl.app.ui.utils.loadFromAssets +import com.chwl.app.utils.SpannableBuilder +import com.chwl.core.gift.bean.CpMsgBean +import com.chwl.core.utils.SpanUtils +import com.example.lib_utils.ktx.getColor +import com.example.lib_utils.ktx.getString +import com.opensource.svgaplayer.SVGADrawable +import com.opensource.svgaplayer.SVGADynamicEntity +import com.opensource.svgaplayer.SVGAParser +import com.opensource.svgaplayer.SVGAParser.Companion.shareParser +import com.opensource.svgaplayer.SVGAVideoEntity + +class RoomNotifyLevelUpDialog (private val context: Context) : BaseRoomNotifyDialog(context) { + + override fun createBinding(inflater: LayoutInflater): RoomNotifyCpLevelUpBinding { + return RoomNotifyCpLevelUpBinding.inflate(inflater) + } + + var cpMsgBean : CpMsgBean ? = null + + override fun init() { + cpMsgBean?.let { + SpanUtils.with(mBinding.text) + .append(it.senderNick).setForegroundColor(R.color.white.getColor()) + .append(R.string.avroom_widget_roomeffectview_02.getString()).setForegroundColor(R.color.color_fff664.getColor()) + .append(it.receiverNick).setForegroundColor(R.color.white.getColor()) + .append(R.string.Become.getString()).setForegroundColor(R.color.color_fff664.getColor()) + .append(CpUtils.getCpLevelUpStr(it.cpLevel).toString()).setForegroundColor(R.color.white.getColor()) + .create() + mBinding.text.setBackgroundResource(CpUtils.getCpLevelUpTextBg(it.cpLevel)) + + if (it.cpLevel < 1) return + val svga = "svga/cp_level_up_${it.cpLevel}.svga" + try { + shareParser().decodeFromAssets(svga, object : SVGAParser.ParseCompletion { + override fun onComplete(svgaVideoEntity: SVGAVideoEntity) { + val dynamicEntity = SVGADynamicEntity() +// val textPaint = TextPaint() +// textPaint.color = Color.WHITE //字体颜色 +// textPaint.textSize = 24f //字体大小 +// dynamicEntity.setDynamicText( +// StaticLayout( +// text.build(), +// 0, +// text.build().length, +// textPaint, +// 0, +// Layout.Alignment.ALIGN_CENTER, +// 1.0f, +// 0.0f, +// false +// ), "bg" +// ) + + AnimHelper.addDynamicImage( + mBinding.svga, + dynamicEntity, + it.senderAvatar, + "user_img1" + ) + AnimHelper.addDynamicImage( + mBinding.svga, + dynamicEntity, + it.receiverAvatar, + "user_img2" + ) + + val drawable = SVGADrawable(svgaVideoEntity, dynamicEntity) + mBinding.svga.setImageDrawable(drawable) + mBinding.svga.stepToFrame(0, true) +// mBinding.svga.startAnimation() + } + + override fun onError() { + } + }, null) + } catch (e: Exception) { + e.printStackTrace() + } + + + + + } + } + + override fun useSlipSlip() = false + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/avroom/dialog/BaseRoomNotifyeLuckGiftDialog.kt b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyLuckGiftDialog.kt similarity index 84% rename from app/src/main/java/com/chwl/app/avroom/dialog/BaseRoomNotifyeLuckGiftDialog.kt rename to app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyLuckGiftDialog.kt index ed3fd89f1..03ff60a0d 100644 --- a/app/src/main/java/com/chwl/app/avroom/dialog/BaseRoomNotifyeLuckGiftDialog.kt +++ b/app/src/main/java/com/chwl/app/avroom/dialog/RoomNotifyLuckGiftDialog.kt @@ -18,7 +18,7 @@ import com.example.lib_utils.UiUtils * @Author Vance * 幸运礼物的飘屏,全服但是展示的时候限制只有房间才展示 */ -class BaseRoomNotifyeLuckGiftDialog(private val context: Context) : BaseRoomNotifyeBaseDialog(context) { +class RoomNotifyLuckGiftDialog(private val context: Context) : BaseRoomNotifyDialog(context) { override fun createBinding(inflater: LayoutInflater): RoomNotifyLuckGiftDlgBinding { return RoomNotifyLuckGiftDlgBinding.inflate(inflater) @@ -61,15 +61,4 @@ class BaseRoomNotifyeLuckGiftDialog(private val context: Context) : BaseRoomNoti } - var mCallBack : CallBack? = null - interface CallBack{ - fun onHide(); - } - - override fun dismissDialog() { - super.dismissDialog() - mCallBack?.onHide() - } - - } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt b/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt index 3d98b18a5..0fd2b46bd 100644 --- a/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt +++ b/app/src/main/java/com/chwl/app/avroom/fragment/BaseRoomFragment.kt @@ -79,6 +79,7 @@ import com.chwl.core.auth.AuthModel import com.chwl.core.bean.RoomMicInfo import com.chwl.core.gift.GiftModel import com.chwl.core.gift.bean.GiftInfo +import com.chwl.core.gift.bean.GiftType import com.chwl.core.gift.event.GiftComboEvent import com.chwl.core.gift.event.RoomFreeGiftEvent import com.chwl.core.helper.AtProxy @@ -113,6 +114,7 @@ import com.chwl.core.support.room.RoomWidget import com.chwl.core.user.UserModel import com.chwl.core.user.bean.BaseInfo import com.chwl.core.user.bean.UserInfo +import com.chwl.core.utils.LogUtils import com.chwl.core.utils.net.VipLevelNotEnoughException import com.chwl.library.common.util.LimitClickUtils import com.chwl.library.net.rxnet.utils.RxNetWorkUtils @@ -645,14 +647,14 @@ open class BaseRoomFragment?> : @CallSuper open fun updateMicBtn() { + //todo do 关麦开麦 val currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo if (currentRoomInfo != null) { if (AudioEngineManager.get().isAudienceRole) { bottomView.setMicBtnEnable(false) bottomView.setMicBtnOpen(false) } else { - val roomQueueInfo = AvRoomDataManager.get() - .getRoomQueueMemberInfoByAccount(myUid.toString()) + val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(myUid.toString()) if (roomQueueInfo?.mChatRoomMember != null && myUid.toString() == roomQueueInfo.mChatRoomMember.account && roomQueueInfo.mRoomMicInfo?.isMicMute == true @@ -896,10 +898,12 @@ open class BaseRoomFragment?> : callback.onFail() EventBus.getDefault().post(GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_CANCEL)) } else { - giftDialog?.hide() - val giftComboEvent = GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_END) - giftComboEvent.giftNumber = gift.data.giftNum - EventBus.getDefault().post(giftComboEvent) + if (giftInfo.giftType == GiftType.GIFT_TYPE_NORMAL || giftInfo.giftType == GiftType.GIFT_TYPE_SUPER_LUCKY|| giftInfo.giftType == GiftType.GIFT_TYPE_LUCKY_24) { + giftDialog?.hide() + val giftComboEvent = GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_END) + giftComboEvent.giftNumber = gift.data.giftNum + EventBus.getDefault().post(giftComboEvent) + } callback.onSuccess() } } @@ -1333,8 +1337,8 @@ open class BaseRoomFragment?> : open inner class BaseRoomBottomViewWrapper : BottomViewListenerWrapper() { @SuppressLint("CheckResult") override fun onOpenMicBtnClick() { - val roomQueueInfo = AvRoomDataManager.get() - .getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString()) + //todo do 关麦开麦 + val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString()) if (roomQueueInfo?.mRoomMicInfo == null) return //先判斷麥上是否是開麥的 if (!roomQueueInfo.mRoomMicInfo.isMicMute && !AudioEngineManager.get().isAudienceRole) { diff --git a/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java index 6fc5b9276..ce09d0c1b 100644 --- a/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/chwl/app/avroom/fragment/HomePartyFragment.java @@ -22,15 +22,18 @@ import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import com.chwl.app.avroom.activity.RoomTitleEditActivity; -import com.chwl.app.avroom.dialog.BaseRoomNotifyeLuckGiftDialog; +import com.chwl.app.avroom.dialog.RoomNotifyLuckGiftDialog; import com.chwl.app.databinding.LayoutRoomNotifyLuckyGiftTipBinding; import com.chwl.app.utils.GiftAnimUtil; import com.chwl.app.utils.NumberUtils; +import com.chwl.app.utils.RoomNotifyManager; import com.chwl.app.utils.WeakPool; import com.chwl.core.auth.AuthModel; +import com.chwl.core.gift.bean.CpMsgBean; import com.chwl.core.gift.bean.LuckyGiftMsgAllBean; import com.chwl.core.gift.bean.LuckyGiftMsgSelfBean; import com.chwl.core.gift.bean.MsgSuperLuckyGift; +import com.chwl.core.gift.bean.RoomNotifyDialogBean; import com.chwl.core.utils.ComboUtil; import com.chwl.app.ui.utils.ImageLoadUtilsV2; import com.chwl.app.ui.widget.BonsellaJoinAttackButtonView; @@ -119,8 +122,6 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe //收藏房间 private String FOLLOW_ROOM_TYPE = ""; - //幸运礼物 飘屏队列 - private ArrayList mLuckyGiftList = new ArrayList<>(); public static HomePartyFragment newInstance() { HomePartyFragment homePartyFragment = new HomePartyFragment(); @@ -291,6 +292,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe case RoomEvent.MSG_SUPER_LUCKY_GIFT: onLuckyGiftMsg(roomEvent); break; + case RoomEvent.MSG_CP_ABOUT: + onCpAboutMsg(roomEvent); + break; default: break; } @@ -520,7 +524,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe luckyGiftTipPool.clear(); handler.removeCallbacksAndMessages(null); - mLuckyGiftList.clear(); + RoomNotifyManager.INSTANCE.clear(); if (giftView != null) { giftView.release(); @@ -694,6 +698,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe } + /** + * 幸运礼物 飘屏 跟 圆球提示 + */ private void onLuckyGiftMsg(RoomEvent roomEvent) { MsgSuperLuckyGift msgSuperLuckyGift = roomEvent.getMsgSuperLuckyGift(); if (msgSuperLuckyGift != null) { @@ -708,7 +715,6 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe } - private Handler handler = new Handler(Looper.getMainLooper()); private WeakPool luckyGiftTipPool = new WeakPool<>(3); private void showLuckyGiftDlgNotify(LuckyGiftMsgSelfBean luckyGiftMsgBean) { @@ -757,39 +763,31 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe }, 2300); } - BaseRoomNotifyeLuckGiftDialog allServiceLuckGiftDialog; - private void showLuckyGiftDlg(LuckyGiftMsgAllBean luckyGiftMsgAllBean){ - LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDlg() "); - mLuckyGiftList.add(luckyGiftMsgAllBean); - if (!(allServiceLuckGiftDialog != null && allServiceLuckGiftDialog.isShowing())) { - LuckyGiftMsgAllBean data = mLuckyGiftList.remove(0); - LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDlg() -> showLuckyGiftDialog"+mLuckyGiftList.size()); - showLuckyGiftDialog(data); + private void showLuckyGiftDlg(LuckyGiftMsgAllBean data) { + //todo do 校验数据是否异常 + RoomNotifyManager.INSTANCE.addDialog(new RoomNotifyDialogBean( + CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE, + CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM, + data + )); + } + + + /** + * cp 礼物 + */ + private void onCpAboutMsg(RoomEvent roomEvent) { + //todo do 校验数据是否异常 + CpMsgBean cpMsgBean = roomEvent.getCpMsgBean(); + if (cpMsgBean != null) { + RoomNotifyManager.INSTANCE.addDialog(new RoomNotifyDialogBean( + CustomAttachment.CP_FIRST, + cpMsgBean.getSecond(), + cpMsgBean + )); } } - private void showLuckyGiftDialog(LuckyGiftMsgAllBean luckyGiftMsgAllBean){ - LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() "); - allServiceLuckGiftDialog = new BaseRoomNotifyeLuckGiftDialog(requireContext()); - allServiceLuckGiftDialog.setLuckyGiftMsgBean(luckyGiftMsgAllBean); - allServiceLuckGiftDialog.setMCallBack(new BaseRoomNotifyeLuckGiftDialog.CallBack() { - @Override - public void onHide() { - LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ->onHide"); - gameMainBinding.getRoot().postDelayed(new Runnable() { - @Override - public void run() { - LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ->onHide->postDelayed"); - if (!mLuckyGiftList.isEmpty()){ - LuckyGiftMsgAllBean data = mLuckyGiftList.remove(0); - LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ->onHide->postDelayed-> "+mLuckyGiftList.size()); - showLuckyGiftDialog(data); - } - } - },100); - } - }); - allServiceLuckGiftDialog.show(); - } + diff --git a/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java b/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java index dbccde8de..b6c002755 100644 --- a/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java +++ b/app/src/main/java/com/chwl/app/avroom/widget/BottomView.java @@ -22,6 +22,7 @@ import androidx.annotation.Nullable; import com.chwl.app.avroom.activity.RoomTypeSwitchActivity; import com.chwl.core.utils.extension.StringExtensionKt; +import com.chwl.library.utils.SizeUtils; import com.netease.nim.uikit.api.NimUIKit; import com.netease.nim.uikit.common.util.sys.ScreenUtil; import com.netease.nimlib.sdk.msg.model.RecentContact; @@ -76,6 +77,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener { @Nullable private PopupWindow msgTipPopupWindow; + private PopupWindow micSetPopupWindow; @NonNull private final Runnable msgRunnable = this::dismissMsgPopupWindow; @@ -318,6 +320,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener { if (wrapper != null) { wrapper.onOpenMicBtnClick(); } +// showMicSetDialog(openMic); break; case R.id.tv_room_send_msg_input: @@ -457,4 +460,40 @@ public class BottomView extends LinearLayout implements View.OnClickListener { parent.postDelayed(msgRunnable, 3000); } + + private void showMicSetDialog(View parent){ + //todo do 关麦开麦 + View contentView; + if (micSetPopupWindow == null) { + contentView = LayoutInflater.from(getContext()).inflate(R.layout.popup_mic_set, null); + micSetPopupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + micSetPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); +// micSetPopupWindow.setAnimationStyle(R.style.style_anim_mic_set); + } else { + contentView = micSetPopupWindow.getContentView(); + } + + ImageView micOff = contentView.findViewById(R.id.micOff); + ImageView micMusic = contentView.findViewById(R.id.micMusic); + ImageView micOn = contentView.findViewById(R.id.micOn); + + micOff.setOnClickListener(v -> { + micSetPopupWindow.dismiss(); + }); + micMusic.setOnClickListener(v -> { + micSetPopupWindow.dismiss(); + }); + micOn.setOnClickListener(v -> { + micSetPopupWindow.dismiss(); + }); + + int[] vLoc = new int[2]; + parent.getLocationInWindow(vLoc); + try { + micSetPopupWindow.showAsDropDown(parent,0, -ScreenUtil.dip2px(180),Gravity.CENTER_HORIZONTAL); + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/app/src/main/java/com/chwl/app/base/BaseActivity.java b/app/src/main/java/com/chwl/app/base/BaseActivity.java index b180cc3ab..223d9b24a 100644 --- a/app/src/main/java/com/chwl/app/base/BaseActivity.java +++ b/app/src/main/java/com/chwl/app/base/BaseActivity.java @@ -265,6 +265,18 @@ public abstract class BaseActivity extends RxAppCompatActivity } } + public void initBlackTitleBar(String title) { + mTitleBar = findViewById(R.id.title_bar); + if (mTitleBar != null) { + mTitleBar.setTitle(title); + mTitleBar.setImmersive(false); + mTitleBar.setTitleColor(getResources().getColor(R.color.white)); + mTitleBar.setLeftImageResource(R.drawable.icon_user_back); + mTitleBar.setBackgroundResource(R.color.transparent); + mTitleBar.setLeftClickListener(v -> onLeftClickListener()); + } + } + public void initTitleBar(String title, TitleBar.Action action) { mTitleBar = findViewById(R.id.title_bar); if (mTitleBar != null) { diff --git a/app/src/main/java/com/chwl/app/constants/UserInfoConstants.java b/app/src/main/java/com/chwl/app/constants/UserInfoConstants.java new file mode 100644 index 000000000..99eff9ee8 --- /dev/null +++ b/app/src/main/java/com/chwl/app/constants/UserInfoConstants.java @@ -0,0 +1,10 @@ +package com.chwl.app.constants; + +public @interface UserInfoConstants { + + public @interface CpSet{ + //1-cp头像是否展示,2-cp动画 + int cpAvatar = 1; + int cpAnim = 2; + } +} diff --git a/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt index 6ad15723c..c7e60059c 100644 --- a/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt +++ b/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt @@ -16,6 +16,8 @@ import com.chwl.app.UIHelper import com.chwl.app.application.IReportConstants import com.chwl.app.application.ReportManager import com.chwl.app.avroom.activity.AVRoomActivity +import com.chwl.app.avroom.dialog.RoomNotifyCpBindDialog +import com.chwl.app.avroom.dialog.RoomNotifyLevelUpDialog import com.chwl.app.base.BaseActivity import com.chwl.app.base.BaseFragment import com.chwl.app.databinding.FragmentMeBinding @@ -38,6 +40,7 @@ import com.chwl.app.view.GenderAgeTextView import com.chwl.app.vip.VipCenterActivity import com.chwl.app.vip.VipViewModel import com.chwl.core.auth.AuthModel +import com.chwl.core.gift.bean.CpMsgBean import com.chwl.core.initial.InitialModel import com.chwl.core.level.UserLevelVo import com.chwl.core.manager.IMNetEaseManager @@ -318,11 +321,12 @@ class MeFragment : BaseFragment(), View.OnClickListener { override fun onClick(v: View) { when (v.id) { - R.id.iv_user_head, R.id.rl_user_info -> + R.id.iv_user_head, R.id.rl_user_info ->{ mUserInfo?.let { UIHelper.showUserInfoAct(mContext, it.uid) } - - R.id.iv_edit -> - mUserInfo?.let { UIHelper.showUserInfoModifyAct(mContext, it.uid) } + } +// +// R.id.iv_edit -> +// mUserInfo?.let { UIHelper.showUserInfoModifyAct(mContext, it.uid) } R.id.ll_user_attentions -> startActivity( Intent( diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt b/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt new file mode 100644 index 000000000..c80edcbc8 --- /dev/null +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserCpListActivity.kt @@ -0,0 +1,180 @@ +package com.chwl.app.ui.user.activity + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.view.View +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.chwl.app.R +import com.chwl.app.avroom.activity.AVRoomActivity +import com.chwl.app.base.BaseViewBindingActivity +import com.chwl.app.base.TitleBar +import com.chwl.app.base.TitleBar.ImageAction +import com.chwl.app.common.EmptyViewHelper +import com.chwl.app.common.widget.dialog.DialogManager +import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener +import com.chwl.app.databinding.ActivityUserCpListBinding +import com.chwl.app.ui.user.adapter.UserCpListAdapter +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.core.room.bean.CpListItem +import com.chwl.core.room.bean.RoomIcon +import com.chwl.core.user.bean.UserCPListBean +import com.chwl.core.utils.LogUtils +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.net.rxnet.RxNet +import com.chwl.library.utils.ResUtil +import com.example.lib_utils.ktx.getString +import com.hjq.toast.ToastUtils +import com.netease.nim.uikit.StatusBarUtil +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +class UserCpListActivity : BaseViewBindingActivity() { + + lateinit var mAdapter : UserCpListAdapter + var mPageNum = 1; + + companion object{ + fun start(context: Context) { + val intent = Intent(context, UserCpListActivity::class.java) + context.startActivity(intent) + } + } + + override fun init() { + StatusBarUtil.transparencyBar(this) + StatusBarUtil.StatusBarLightMode(this) + initTitle() + initRvList() + loadData() + } + + private fun initTitle() { + initBlackTitleBar(ResUtil.getString(R.string.My_Cp)) + val titleBar = findViewById(R.id.title_bar) as TitleBar + titleBar.addAction(object : ImageAction(R.drawable.ic_cp_list_more) { + override fun performAction(view: View?) { + //todo 跳转h5 + ToastUtils.show("跳转h5") + } + }) + } + + private fun initRvList(){ + mAdapter = UserCpListAdapter(R.layout.item_user_cp_list,1) + binding.rvList.layoutManager = LinearLayoutManager(context,RecyclerView.VERTICAL,false) + binding.rvList.adapter = mAdapter + mAdapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.cancel -> { + cancelCp(position, mAdapter.data[position]) + } + else -> {} + } + } + mAdapter.setOnLoadMoreListener { + loadData(true) + } + mAdapter.setEmptyView(EmptyViewHelper.createEmptyTextView(this@UserCpListActivity,R.string.empty_data.getString())) + } + + private fun loadData(isAdd: Boolean = false) { + if (!isAdd) { + mPageNum = 1 + } + getCpList() + .compose(bindToLifecycle()) + .doOnSuccess { + if (mPageNum == 1) { + mAdapter.setNewData(it) + } else { + mAdapter.addData(it) + } + + if (it.size == 20) { + mPageNum += 1 + mAdapter.setEnableLoadMore(true) + binding.noMore.isVisible = false + } else { + mAdapter.setEnableLoadMore(false) + binding.noMore.isVisible = true + } + mAdapter.loadMoreComplete() + } + .doOnError { + LogUtils.d(" error = ${it.message}") + mAdapter.loadMoreEnd() + } + .subscribe() + } + + + private fun cancelCp(position: Int, data: UserCPListBean) { + val mDialogManager = DialogManager(context) + mDialogManager?.showOkCancelDialog(ResUtil.getString(R.string.CP_Cancel), true, object : + OkCancelDialogListener { + override fun onCancel() { + mDialogManager?.dismissDialog() + } + + override fun onOk() { + postCpCancel(data.uid,data.cpUid,data.cancelGoldNum) + .compose(bindToLifecycle()) + .doOnSuccess { + runOnUiThread { + mAdapter.remove(position) + } + } + .subscribe() + mDialogManager?.dismissDialog() + } + }) + + + } + + + + /** + * 获-cp列表 + */ + private fun getCpList(): Single> { + return api.getCpList(mPageNum) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + private fun postCpCancel(uid: Long,loverUid: Long,goldNum: Long): Single { + return api.postCpCancel(uid,loverUid,goldNum) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + } + + + private val api: Api = RxNet.create(Api::class.java); + interface Api { + /** + * 获-cp列表 + * page=1 + * pageSize=10 + */ + @GET("/user/cp/list") + fun getCpList(@Query("page") page: Int,@Query("pageSize") pageSize: Int=20): Single>> + + /** + * 取消cp---- + * Long uid + * Long loverUid + * Long goldNum //金币(列表有返回该字段:cancelGoldNum) + */ + @POST("/user/cp/cancel") + fun postCpCancel(@Query("uid") uid: Long,@Query("loverUid") loverUid: Long,@Query("goldNum") goldNum: Long): Single> + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java index 9b4cd45f9..3b363849b 100644 --- a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java @@ -7,6 +7,9 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Bitmap; +import android.graphics.Color; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -14,6 +17,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.core.widget.NestedScrollView; import androidx.fragment.app.Fragment; @@ -24,8 +28,11 @@ import com.chwl.app.avroom.adapter.CommonVPAdapter; import com.chwl.app.ui.user.adapter.UserInfoTopAlbumAdapter; import com.chwl.app.ui.user.fragment.UserInfoDataFragment; import com.chwl.app.ui.user.fragment.UserInfoDynamicFragment; +import com.chwl.app.ui.utils.CpUtils; import com.chwl.app.utils.AppBarStateChangeListener; import com.chwl.app.utils.AvatarHelper; +import com.chwl.core.utils.LogUtils; +import com.chwl.library.utils.ResUtil; import com.chwl.library.widget.SVGAView; import com.chwl.core.decoration.headwear.bean.HeadWearInfo; import com.example.lib_utils.UiUtils; @@ -74,6 +81,9 @@ import com.chwl.core.user.bean.UserPhoto; import com.chwl.core.user.event.LoginUserInfoUpdateEvent; import com.chwl.core.utils.CoreLogger; import com.chwl.library.annatation.ActLayoutRes; +import com.tencent.qgame.animplayer.inter.IFetchResource; +import com.tencent.qgame.animplayer.mix.Resource; +import com.tencent.qgame.animplayer.util.ScaleType; import com.zhpan.bannerview.constants.IndicatorGravity; import org.greenrobot.eventbus.EventBus; @@ -81,8 +91,12 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; + /** * create by lvzebiao on 2018/8/31 */ @@ -98,6 +112,7 @@ public class UserInfoActivity extends BaseBindingActivity { userInfo = infoBean; initData(userInfo); + viewModel.getUserInfoDetail(); }); } @@ -138,7 +155,7 @@ public class UserInfoActivity extends BaseBindingActivity { initPhoto(dataBean.getPrivatePhoto()); setWhereVisible(); + setCpInfo(dataBean); }); viewModel.getUserInfoDetailError().observe(this, String -> { finish(); @@ -270,19 +291,10 @@ public class UserInfoActivity extends BaseBindingActivity { + mBinding.idLayout.setOnClickListener(view -> { copyName(); }); } } + //cp + private void setCpInfo(UserDetailInfo.DataBean dataBean) { + mBinding.ivHeadWear.setVisibility(View.VISIBLE); + UserDetailInfo.DataBean.RelationUserVO cpInfo = dataBean.getRelationUserVO(); + boolean showCpAvatar = false; + if (cpInfo != null) { + if (cpInfo.showCpAvatar) { + showCpAvatar = cpInfo.showCpAvatar; + + // 头像处cp + mBinding.ivHeadWear.loadFile(CpUtils.INSTANCE.getHeadSvga(cpInfo.cpLevel)); + mBinding.ivHeadWearCp.loadFile(CpUtils.INSTANCE.getHeadSvga(cpInfo.cpLevel)); + mBinding.ivHeadWearCpFlag.setImageResource(CpUtils.INSTANCE.getFlag(cpInfo.cpLevel)); + ImageLoadUtils.loadImage(mBinding.ivUserHeadCp, cpInfo.cpAvatar); + if (cpInfo.cpAvatar == null || cpInfo.cpAvatar.isEmpty()) { + mBinding.cpViews.setVisibility(View.INVISIBLE); + return; + } else { + mBinding.cpViews.setVisibility(View.VISIBLE); + } + } + + //cp 卡片 + mBinding.cpCardDay.setText(cpInfo.cpDay + ""+ ResUtil.getString(R.string.days)); + ImageLoadUtilsV2.loadImage(mBinding.cpCardUserAvatar, userInfo.getAvatar()); + ImageLoadUtilsV2.loadImage(mBinding.cpCardUserAvatarCp, cpInfo.cpAvatar); + mBinding.cpCardUserHead.loadFile(CpUtils.INSTANCE.getHeadSvga(cpInfo.cpLevel)); + mBinding.cpCardUserHeadCp.loadFile(CpUtils.INSTANCE.getHeadSvga(cpInfo.cpLevel)); + mBinding.cpCardLevel.setImageResource(CpUtils.INSTANCE.getLevelImg(cpInfo.cpLevel)); + mBinding.cpCardLevelEmpty.setVisibility(cpInfo.cpLevel > 0? View.INVISIBLE : View.VISIBLE); + mBinding.cpCardDay.setVisibility(cpInfo.cpLevel > 0? View.VISIBLE : View.INVISIBLE); + + if (cpInfo.showCpAnim && isFirst) { + String animUrl = CpUtils.INSTANCE.getUserInfoAnim(cpInfo.cpLevel); + HashMap imgMap = new HashMap<>(); + imgMap.put("avatar1", cpInfo.avatar); + imgMap.put("avatar2", cpInfo.cpAvatar); + if (animUrl != null) { + CpUtils.INSTANCE.loadVap( + mBinding.userInfoAnim, + animUrl, + imgMap,null + ); + } + } + } else { + mBinding.cpCardLevelEmpty.setVisibility(View.VISIBLE); + mBinding.cpViews.setVisibility(View.INVISIBLE); + } + + HeadWearInfo headWearInfo = userInfo.getUserHeadwear(); + if (headWearInfo != null && headWearInfo.getFirstUrl() != null) { + if (!showCpAvatar) AvatarHelper.loadAvatarFrame(mBinding.ivHeadWear, headWearInfo.getFirstUrl(), headWearInfo.getType()); + mBinding.ivUserHead.setPadding(0, 0, 0, 0); + mBinding.ivUserHead.setStrokeWidth(0); + } else { + int padding = getResources().getDimensionPixelOffset(R.dimen.dp_0_5); + mBinding.ivUserHead.setPadding(padding, padding, padding, padding); + mBinding.ivUserHead.setStrokeWidth(getResources().getDimensionPixelOffset(R.dimen.dp_1)); + if (!showCpAvatar) mBinding.cpViews.setVisibility(View.INVISIBLE); + } + isFirst = false; + } + private void setMarginTop(View view, int top) { if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams(); @@ -453,10 +529,11 @@ public class UserInfoActivity extends BaseBindingActivity { + dialogManager.showProgressDialog( + this@UserInfoModifyActivity, + ResUtil.getString(R.string.ui_user_userinfomodifyactivity_02) + ) + UserModel.get().areaInfo.subscribe(object : SingleObserver> { + override fun onSubscribe(d: Disposable) { + mCompositeDisposable.add(d) + } + + override fun onSuccess(areaList: List) { + dialogManager.dismissDialog() + if (areaList.isNotEmpty()) { + UserAreaDialog.newInstance(areaList) + .apply { + setAction { + reportArea(it) + } + }.show(this@UserInfoModifyActivity) + } + } + + override fun onError(e: Throwable) { + dialogManager.dismissDialog() + toast(e.message) + } + }) + } + R.id.swCpAnim -> { + postUpDateCpSwitch(binding.swCpAnim,UserInfoConstants.CpSet.cpAnim) + } + + R.id.swCpShow -> { + postUpDateCpSwitch(binding.swCpShow,UserInfoConstants.CpSet.cpAvatar) } else -> {} } } + //post update set + private fun postUpDateCpSwitch(view: ImageView,type:Int){ + val tag = view.tag + if (tag != null && tag is Boolean){ + val tagVal = !tag + UserModel.get().userCpSettingUpdate(type,tagVal) + .compose(bindToLifecycle()) + .doOnSuccess { + setSwitchView(view,tagVal,true) + }.subscribe() + } + } + + // set view + private fun setSwitchView(view: ImageView, on:Boolean,notify:Boolean=false){ + view.setImageResource(if (on) R.drawable.ic_user_edit_sw_on else R.drawable.ic_user_edit_sw_off) + view.tag = on + if (notify) { + //通知 cp设置改变 todo do + + } + } + private fun reportArea(area: String) { binding.tvArea.text = area dialogManager.showProgressDialog( diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/UserCpListAdapter.kt b/app/src/main/java/com/chwl/app/ui/user/adapter/UserCpListAdapter.kt new file mode 100644 index 000000000..515e6e09f --- /dev/null +++ b/app/src/main/java/com/chwl/app/ui/user/adapter/UserCpListAdapter.kt @@ -0,0 +1,50 @@ +package com.chwl.app.ui.user.adapter + +import android.view.View +import android.view.ViewGroup +import com.chwl.app.R +import com.chwl.app.bindadapter.BaseAdapter +import com.chwl.app.bindadapter.BindingViewHolder +import com.chwl.app.databinding.ItemUserCpListBinding +import com.chwl.app.ui.utils.CpUtils.getHeadSvga +import com.chwl.app.ui.utils.CpUtils.getLevelImg +import com.chwl.app.ui.utils.ImageLoadUtils +import com.chwl.app.utils.NumberUtils +import com.chwl.core.user.bean.UserCPListBean +import com.chwl.library.utils.ResUtil +import com.example.lib_utils.ktx.getString + +class UserCpListAdapter : BaseAdapter { + + constructor(layoutResId: Int, brid: Int) : super(layoutResId, brid) + + + override fun convert(helper: BindingViewHolder, data: UserCPListBean?) { + super.convert(helper, data) + if (data == null ) return + val mViewBinding = helper.binding as ItemUserCpListBinding + + mViewBinding.cpLevel.setImageResource(getLevelImg(data.cpLevel)) + + ImageLoadUtils.loadImage(mViewBinding.userAvatar,data.avatar) + ImageLoadUtils.loadImage(mViewBinding.userAvatarCp,data.cpAvatar) + + mViewBinding.userHead.loadFile(getHeadSvga(data.cpLevel)) + mViewBinding.userHeadCp.loadFile(getHeadSvga(data.cpLevel)) + + + + mViewBinding.cpPro.max = data.endExp.toInt() - data.startExp.toInt() + mViewBinding.cpPro.progress = data.currentExp.toInt() + + mViewBinding.cpProVal.text = "${NumberUtils.format(data.currentExp)} / ${NumberUtils.format(data.endExp)}" + mViewBinding.cpNeedVal.text = ResUtil.getString(R.string.CP_Need_tips,NumberUtils.format((data.endExp - data.currentExp))) + + mViewBinding.cpDay.text = "${data.cpDay}${R.string.days.getString()}" + + + helper.addOnClickListener(mViewBinding.cancel.id) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java index 8c73b06b7..25ad352d7 100644 --- a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java +++ b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java @@ -12,6 +12,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -65,6 +66,8 @@ public class UserInfoDynamicAdapter extends BaseQuickAdapter(R.layout.user_info_item_gift) { override fun onCreateDefViewHolder(parent: ViewGroup?, viewType: Int): BaseViewHolder { - return super.onCreateDefViewHolder(parent, viewType).apply { - getView(R.id.iv_bg).setImageResource(itemBgRes) - } + return super.onCreateDefViewHolder(parent, viewType) } override fun convert(helper: BaseViewHolder, item: GiftWallInfo) { helper.setText(R.id.tv_name, item.giftName) helper.setText(R.id.tv_count, "x${item.reciveCount}") val iconView = helper.getView(R.id.iv_icon) - iconView.load(item.picUrl) + iconView.load(item.picUrl,0f,R.drawable.transparent_draw) val rankView = helper.itemView.findViewById(R.id.iv_rank) if (helper.bindingAdapterPosition == 0) { rankView.setImageResource(R.drawable.ic_gift_one) diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoIndicatorAdapter.java b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoIndicatorAdapter.java index cb8ccc5a3..a54621fe2 100644 --- a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoIndicatorAdapter.java +++ b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoIndicatorAdapter.java @@ -1,6 +1,7 @@ package com.chwl.app.ui.user.adapter; import android.content.Context; +import android.graphics.Color; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -38,8 +39,8 @@ public class UserInfoIndicatorAdapter extends CommonNavigatorAdapter { @Override public IPagerTitleView getTitleView(Context context, final int i) { ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true); - scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.color_7F191919)); - scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_191919)); + scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.white_tran_60)); + scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.white)); scaleTransitionPagerTitleView.setMinScale(minScale); scaleTransitionPagerTitleView.setTextSize(textSize); int padding = context.getResources().getDimensionPixelOffset(R.dimen.dp_12); @@ -60,7 +61,7 @@ public class UserInfoIndicatorAdapter extends CommonNavigatorAdapter { indicator.setLineHeight(UIUtil.dip2px(context, 3)); indicator.setRoundRadius(UIUtil.dip2px(context, 1.5)); indicator.setLineWidth(UIUtil.dip2px(context, 17)); - indicator.setColors(context.getResources().getColor(R.color.color_26CC9C)); + indicator.setColors(Color.parseColor("#04d5c6")); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); // lp.bottomMargin = mBottomMargin; indicator.setLayoutParams(lp); diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoMedalAdapter.kt b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoMedalAdapter.kt index 7b6671bda..3a916c7d5 100644 --- a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoMedalAdapter.kt +++ b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoMedalAdapter.kt @@ -56,8 +56,9 @@ class UserInfoMedalAdapter : }) } else { val imageView = helper.getView(R.id.iv_image) - imageView.load(item.picUrl) + imageView.load(item.picUrl,0f,R.drawable.transparent_draw) } } + helper.setText(R.id.medalName,item.medalName) } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt b/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt index d10d62dc3..98d933472 100644 --- a/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt +++ b/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt @@ -2,9 +2,9 @@ package com.chwl.app.ui.user.fragment import android.content.Intent import android.view.View +import android.widget.TextView import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels -import com.chad.library.adapter.base.BaseQuickAdapter import com.chwl.app.R import com.chwl.app.base.BaseViewBindingFragment import com.chwl.app.databinding.UserInfoDataFragmentBinding @@ -16,12 +16,17 @@ import com.chwl.app.ui.user.activity.UserModifyPhotosActivity import com.chwl.app.ui.user.adapter.UserInfoAlbumAdapter import com.chwl.app.ui.user.adapter.UserInfoGameTeamAdapter import com.chwl.app.ui.user.adapter.UserInfoGiftAdapter +import com.chwl.app.ui.user.adapter.UserInfoIndicatorAdapter import com.chwl.app.ui.user.adapter.UserInfoMedalAdapter import com.chwl.app.ui.user.viewmodel.UserInfoViewModel -import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration +import com.chwl.app.ui.utils.load +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator import com.chwl.app.ui.widget.recyclerview.decoration.SpacingDecoration import com.chwl.core.game_team.UserGameTeamInfo +import com.chwl.core.user.UserModel import com.chwl.core.user.bean.UserPhoto +import com.chwl.library.utils.ResUtil +import com.example.lib_utils.ktx.getString class UserInfoDataFragment : BaseViewBindingFragment() { @@ -30,9 +35,10 @@ class UserInfoDataFragment : BaseViewBindingFragment + binding.magicIndicator.onPageSelected(position) + onOtherTabChange(view?.text?.toString() ?: "") + } + commonNavigator.adapter = magicIndicatorAdapter + binding.magicIndicator.setNavigator(commonNavigator) + } + + private fun onOtherTabChange(str: String) { + when (str) { + ResUtil.getString(R.string.medal) -> { + binding.layoutGift.isVisible = false + binding.layoutMedal.isVisible = true + } + + ResUtil.getString(R.string.gift_action) -> { + binding.layoutGift.isVisible = true + binding.layoutMedal.isVisible = false + + } + + else -> {} + } + } + private fun initGameTeam() { val adapter = UserInfoGameTeamAdapter(viewModel.isMe) binding.recyclerViewGameTeam.addItemDecoration( @@ -96,74 +133,80 @@ class UserInfoDataFragment : BaseViewBindingFragment 0) return@observe medalAdapter.setNewData(list) - binding.layoutMedal.isVisible = !list.isNullOrEmpty() } } + var isMiniMode = true private fun initGift() { val giftAdapter = UserInfoGiftAdapter() - var isMiniMode = true binding.ivGiftMore.setOnClickListener { isMiniMode = !isMiniMode - val list = viewModel.giftListLiveData.value ?: emptyList() - loadListData(giftAdapter, 4, isMiniMode, list, binding.ivGiftMore) + loadListData(giftAdapter, 4, isMiniMode, binding.ivGiftMore) binding.ivGiftMore.animate().rotationBy(180f).start() } - binding.recyclerViewGift.addItemDecoration( - GridSpacingItemNewDecoration( - resources.getDimensionPixelOffset(R.dimen.dp_12), - resources.getDimensionPixelOffset(R.dimen.dp_2), - false - ) - ) binding.recyclerViewGift.adapter = giftAdapter viewModel.giftListLiveData.observe(this) { - loadListData(giftAdapter, 4, isMiniMode, it, binding.ivGiftMore) - binding.tvGiftStatus.isVisible = it.isNullOrEmpty() + loadListData(giftAdapter, 4, isMiniMode, binding.ivGiftMore) } - viewModel.requestGiftList() - } - - private fun initLuckyGift() { - val luckyGiftAdapter = UserInfoGiftAdapter(R.drawable.user_info_bg_lucku_gift) - var isMiniMode = true - binding.ivLuckyGiftMore.setOnClickListener { - isMiniMode = !isMiniMode - val list = viewModel.luckyGiftListLiveData.value ?: emptyList() - loadListData(luckyGiftAdapter, 4, isMiniMode, list, binding.ivLuckyGiftMore) - binding.ivLuckyGiftMore.animate().rotationBy(180f).start() - } - binding.recyclerViewLuckyGift.addItemDecoration( - GridSpacingItemNewDecoration( - resources.getDimensionPixelOffset(R.dimen.dp_12), - resources.getDimensionPixelOffset(R.dimen.dp_2), - false - ) - ) - binding.recyclerViewLuckyGift.adapter = luckyGiftAdapter viewModel.luckyGiftListLiveData.observe(this) { - loadListData(luckyGiftAdapter, 4, isMiniMode, it, binding.ivLuckyGiftMore) - binding.tvLuckyGiftStatus.isVisible = it.isNullOrEmpty() + loadListData(giftAdapter, 4, isMiniMode, binding.ivGiftMore) } - viewModel.requestLuckyGiftList() + viewModel.loadUserInfoGiftWallData() } - private fun loadListData( - adapter: BaseQuickAdapter, + + private fun setGuild() { + UserModel.get().getUserInfoDetailCache(viewModel.userId).compose(bindToLifecycle()) + .doOnSuccess { + it?.data?.guildInfo?.let { + + //guildName + binding.guildName.text = "${R.string.Guild_Nick.getString()}:${it.guildName}" + //guildId + binding.guildId.text = "${R.string.Guild_ID.getString()}:${it.guildId}" + //guildAgentId + binding.guildAgentId.text = "${R.string.Agent_ID.getString()}:${it.erbanNo}" + + //guildImg + binding.guildImg.load(it.avatar) + + binding.guildLayout.isVisible = true + } + }.subscribe() + } + + private fun loadListData( + adapter: UserInfoGiftAdapter, miniCount: Int, miniOrFull: Boolean, - list: List, moreView: View ) { - val finalList = if (miniOrFull) { - list.take(miniCount) + if (viewModel.luckyGiftIsRead && viewModel.giftIsRead) { + if (!viewModel.giftWallIsRead) { + val gift = viewModel.giftListLiveData.value ?: emptyList() + val luckyGift = viewModel.luckyGiftListLiveData.value ?: emptyList() + + viewModel.userInfoGiftWallData.addAll(gift) + viewModel.userInfoGiftWallData.addAll(luckyGift) + + viewModel.userInfoGiftWallData.sortBy { it.reciveCount } + + viewModel.giftWallIsRead = true + } } else { - list + return + } + + val finalList = if (miniOrFull) { + viewModel.userInfoGiftWallData.take(miniCount) + } else { + viewModel.userInfoGiftWallData } adapter.setNewData(finalList) - moreView.isVisible = list.size > miniCount + moreView.isVisible = viewModel.userInfoGiftWallData.size > miniCount + binding.tvGiftStatus.isVisible = finalList.isEmpty() } private fun showPhotoPreview(list: ArrayList, position: Int) { @@ -175,10 +218,8 @@ class UserInfoDataFragment : BaseViewBindingFragment>() val luckyGiftListLiveData = MutableLiveData>() + val userInfoGiftWallData = mutableListOf() + var luckyGiftIsRead = false + var giftIsRead = false + var giftWallIsRead = false + fun getUserInfo() { UserModel.get().getUserInfoFromServer(userId) @@ -88,14 +93,32 @@ class UserInfoViewModel : BaseViewModel() { } fun requestGiftList() { - addDisposable(UserModel.get().requestUserGiftWall(userId, 1, 2).subscribe { it -> - giftListLiveData.postValue(it) - }) + addDisposable(UserModel.get().requestUserGiftWall(userId, 1, 2) + .doOnError { + giftIsRead=true + } + .subscribe { it -> + giftIsRead=true + giftListLiveData.postValue(it) + }) } fun requestLuckyGiftList() { - addDisposable(UserModel.get().requestUserGiftWall(userId, 2, 2).subscribe { it -> - luckyGiftListLiveData.postValue(it) - }) + addDisposable(UserModel.get().requestUserGiftWall(userId, 2, 2) + .doOnError { + luckyGiftIsRead=true + } + .subscribe { it -> + luckyGiftListLiveData.postValue(it) + luckyGiftIsRead=true + }) + } + + fun loadUserInfoGiftWallData(){ + giftIsRead = false + luckyGiftIsRead = false + userInfoGiftWallData.clear() + requestGiftList() + requestLuckyGiftList() } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/utils/CpUtils.kt b/app/src/main/java/com/chwl/app/ui/utils/CpUtils.kt new file mode 100644 index 000000000..bc603b3e1 --- /dev/null +++ b/app/src/main/java/com/chwl/app/ui/utils/CpUtils.kt @@ -0,0 +1,161 @@ +package com.chwl.app.ui.utils + +import android.graphics.Bitmap +import android.view.View +import androidx.core.view.isVisible +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestFutureTarget +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.chwl.app.R +import com.chwl.app.application.App +import com.chwl.app.application.GlobalHandleManager +import com.chwl.core.utils.LogUtils +import com.netease.nim.uikit.support.glide.GlideApp +import com.tencent.qgame.animplayer.AnimConfig +import com.tencent.qgame.animplayer.AnimView +import com.tencent.qgame.animplayer.inter.IAnimListener +import com.tencent.qgame.animplayer.inter.IFetchResource +import com.tencent.qgame.animplayer.mix.Resource +import com.tencent.qgame.animplayer.util.ScaleType + +object CpUtils { + + fun getHeadSvga(level: Int) : String { + return "svga/cp_list_head_$level.svga" + } + + fun getUserInfoAnim(level: Int) : String? { + if (level < 3) return null + return "mp4/cp_userinfo_anim_$level.mp4" + } + + + var flags = arrayListOf( + R.drawable.ic_user_info_cp_avatar_flag_0, + R.drawable.ic_user_info_cp_avatar_flag_1, + R.drawable.ic_user_info_cp_avatar_flag_2, + R.drawable.ic_user_info_cp_avatar_flag_3, + R.drawable.ic_user_info_cp_avatar_flag_4, + R.drawable.ic_user_info_cp_avatar_flag_5, + ) + var levels = arrayListOf( + R.drawable.ic_cp_list_level_0, + R.drawable.ic_cp_list_level_1, + R.drawable.ic_cp_list_level_2, + R.drawable.ic_cp_list_level_3, + R.drawable.ic_cp_list_level_4, + R.drawable.ic_cp_list_level_5, + ) + + var levelBgs = arrayListOf( + R.drawable.transparent_draw, + R.drawable.ic_cp_level_up_bg_1, + R.drawable.ic_cp_level_up_bg_2, + R.drawable.ic_cp_level_up_bg_3, + R.drawable.ic_cp_level_up_bg_4, + R.drawable.ic_cp_level_up_bg_5 + ) + + var cpLevelUpStr = arrayListOf( + R.string.Sweet_Duo_CP + ) + + fun getCpLevelUpStr(level: Int) : Int{ + return cpLevelUpStr.getOrNull(level)?:-1 + } + + fun getFlag(level: Int) : Int{ + return flags.getOrNull(level)?:-1 + } + + fun getLevelImg(level: Int) : Int{ + return levels.getOrNull(level)?:-1 + } + + fun getCpLevelUpTextBg(level: Int) : Int{ + return levelBgs.getOrNull(level)?:-1 + } + + fun downLoadAvatar(url:String?, onResourceReady:(resource: Bitmap?)->Unit) { + if (url.isNullOrEmpty()) return + try { + val futureTarget = RequestFutureTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) + GlideApp.with(App.instance()) + .asBitmap() + .circleCrop() + .load(url) + .addListener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { + onResourceReady(null) + return true + } + + override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + onResourceReady(resource) + return true + } + }) + .into(futureTarget) + .get() + } catch (e: Exception) { + + } + } + + fun loadVap(animView: AnimView, url :String?, imgUrlMap: HashMap?=null , textMap: HashMap?=null) { + if (url == null) return + animView.visibility = View.VISIBLE + var index = 0 + val bitmapMap = hashMapOf() + + if (!imgUrlMap.isNullOrEmpty()){ + imgUrlMap.keys.forEach { key -> + downLoadAvatar(imgUrlMap[key]) { resource -> + index++ + bitmapMap[key] = resource + if (index == imgUrlMap.keys.size){ + animView.setFetchResource(object : IFetchResource { + override fun fetchImage(resource: Resource, result: (Bitmap?) -> Unit) { + if (bitmapMap.isEmpty()) { + result(null) + } else { + var bitmap : Bitmap?=null + bitmapMap.keys.forEach { + if (resource.tag == it){ + bitmap = bitmapMap[it] + } + } + result(bitmap) + } + } + + override fun fetchText(resource: Resource, result: (String?) -> Unit) { + if (textMap.isNullOrEmpty()) { + result(null) + } else { + var text = "" + textMap.keys.forEach { + if (resource.tag == it){ + text = textMap[it].toString() + } + } + result(text) + } + } + + override fun releaseResource(resources: List) { + resources?.forEach { + it?.bitmap?.recycle() + } + } + }) + LogUtils.d(" animViewSetAnimListener startPlay url = $url") + animView.startPlay(animView.context.assets, url) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java b/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java index 8c5fbb258..0bc0ddc8d 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/chwl/app/ui/widget/GiftDialog.java @@ -1,11 +1,13 @@ package com.chwl.app.ui.widget; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_COUNTRY; +import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_CP; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_LUCKY; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_NOBLE; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_NORMAL; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_SING_ROOM; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_SUPER_LUCKY; +import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_SUPER_LUCKY_24; import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_WEEK; import android.annotation.SuppressLint; @@ -626,6 +628,10 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene return TYPE_COUNTRY; case GiftType.GIFT_TYPE_SINGLE_ROOM: return TYPE_SING_ROOM; + case GiftType.GIFT_TYPE_LUCKY_24: + return TYPE_SUPER_LUCKY_24; + case GiftType.GIFT_TYPE_CP: + return TYPE_CP; } return TYPE_NORMAL; } @@ -721,6 +727,8 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene currentGiftInfoList = getSuperLuckyGiftInfos(); } else if (position == TYPE_COUNTRY) { currentGiftInfoList = getCountryGiftInfos(); + }else if (position == TYPE_CP) { + currentGiftInfoList = getCpGiftInfos(); } // 有贵族礼物才显示贵族礼物的tab if (ListUtils.isListEmpty(nobleGiftInfos)) { @@ -1226,6 +1234,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene String.valueOf(AvRoomDataManager.get().getRoomUid()), GiftType.GIFT_TYPE_COUNTRY); } + private List getCpGiftInfos() { + return GiftModel.get().getGiftInfosByType( + String.valueOf(AvRoomDataManager.get().getRoomUid()), + GiftType.GIFT_TYPE_CP); + } private List getNobleGiftInfos() { return GiftModel.get().getGiftInfoList(GiftType.GIFT_TYPE_VIP); diff --git a/app/src/main/java/com/chwl/app/ui/widget/dialog/AllServiceGiftLevelDialog.kt b/app/src/main/java/com/chwl/app/ui/widget/dialog/AllServiceGiftLevelDialog.kt index e54de2275..6eb3c15f5 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/dialog/AllServiceGiftLevelDialog.kt +++ b/app/src/main/java/com/chwl/app/ui/widget/dialog/AllServiceGiftLevelDialog.kt @@ -14,7 +14,6 @@ import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import com.example.lib_utils.ktx.getColorById import com.example.lib_utils.ktx.singleClick -import com.example.lib_utils.ktx.toStringRes import com.example.lib_utils.spannable.SpannableTextBuilder import com.chwl.app.R import com.chwl.app.avroom.activity.AVRoomActivity diff --git a/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java b/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java index 3052995c8..3a249db70 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java +++ b/app/src/main/java/com/chwl/app/ui/widget/magicindicator/GiftIndicator.java @@ -76,6 +76,14 @@ public class GiftIndicator extends LinearLayout { * 超级幸运礼物 */ public static final int TYPE_SUPER_LUCKY = 8; + /** + * 超级幸运24礼物 + */ + public static final int TYPE_SUPER_LUCKY_24 = 9; + /** + * cp礼物 + */ + public static final int TYPE_CP = 10; private List tabList = new ArrayList<>(); diff --git a/app/src/main/java/com/chwl/app/utils/RoomNotifyManager.kt b/app/src/main/java/com/chwl/app/utils/RoomNotifyManager.kt new file mode 100644 index 000000000..8774eee8d --- /dev/null +++ b/app/src/main/java/com/chwl/app/utils/RoomNotifyManager.kt @@ -0,0 +1,81 @@ +package com.chwl.app.utils + +import com.chwl.app.application.GlobalHandleManager +import com.chwl.app.avroom.dialog.BaseRoomNotifyDialog +import com.chwl.app.avroom.dialog.RoomNotifyCpBindDialog +import com.chwl.app.avroom.dialog.RoomNotifyCpGiftDialog +import com.chwl.app.avroom.dialog.RoomNotifyLevelUpDialog +import com.chwl.app.avroom.dialog.RoomNotifyLuckGiftDialog +import com.chwl.core.gift.bean.CpMsgBean +import com.chwl.core.gift.bean.LuckyGiftMsgAllBean +import com.chwl.core.gift.bean.RoomNotifyDialogBean +import com.chwl.core.im.custom.bean.CustomAttachment +import java.util.LinkedList + +object RoomNotifyManager { + private val queue = LinkedList() + private var dialog : BaseRoomNotifyDialog<*>?=null + + + fun addDialog(data : RoomNotifyDialogBean) { + queue.add(data) + showNextDialog() + } + + private fun showNextDialog() { + if (dialog?.isShowing == true){ + return + } + + if (queue.isNotEmpty()) { + val data = queue.removeAt(0) + dialog = createDialog(data) + dialog?.mCallBack = object : BaseRoomNotifyDialog.CallBack { + override fun onHide() { + showNextDialog() + } + } + dialog?.showDialog() + } + } + + private fun createDialog(bean: RoomNotifyDialogBean): BaseRoomNotifyDialog<*>?{ + var dialog : BaseRoomNotifyDialog<*>? = null + val activity = GlobalHandleManager.get().activity ?: return null + + if (bean.first == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE) { + if (bean.second == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM || bean.second == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ALL){ + if (bean.data is LuckyGiftMsgAllBean){ + dialog = RoomNotifyLuckGiftDialog(activity) + dialog.luckyGiftMsgBean = bean.data as LuckyGiftMsgAllBean + return dialog + } + } + } else if(bean.first == CustomAttachment.CP_FIRST){ + if (bean.data is CpMsgBean){ + if (bean.second == CustomAttachment.CP_SECOND_GIFT){ + dialog = RoomNotifyCpGiftDialog(activity).apply { + cpMsgBean = bean.data as CpMsgBean + } + }else if (bean.second == CustomAttachment.CP_SECOND_UPGRADE){ + dialog = RoomNotifyLevelUpDialog(activity).apply { + cpMsgBean = bean.data as CpMsgBean + } + }else if (bean.second == CustomAttachment.CP_SECOND_BIND){ + dialog = RoomNotifyCpBindDialog(activity).apply { + cpMsgBean = bean.data as CpMsgBean + } + } + } + + } + return dialog + } + + fun clear() { + dialog?.clearDialog() + dialog = null + queue.clear() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/vip/VipViewModel.kt b/app/src/main/java/com/chwl/app/vip/VipViewModel.kt index 398c18378..1da4348e2 100644 --- a/app/src/main/java/com/chwl/app/vip/VipViewModel.kt +++ b/app/src/main/java/com/chwl/app/vip/VipViewModel.kt @@ -61,28 +61,20 @@ class VipViewModel : BaseViewModel() { vipPageInfo?.let { _authInfosLiveData.value = it.vipAuthInfos _vipInfosLiveData.value = it.vipInfos - if (it.currLevel == 0) { - _myVipInfoLiveData.value = null - onItemSelect(0) - } else { - var position = 0 - _myVipInfoLiveData.value = - it.vipInfos?.find { vipInfo -> it.currLevel == vipInfo.vipLevel } - ?.copy() - ?.apply { - position = it.vipInfos?.indexOf(this) ?: -1 - val nextVipInfo = - it.vipInfos?.getOrNull(position + 1) - nextVipName = - if (nextVipInfo?.vipName == vipName) null else nextVipInfo?.vipName - remainSeconds = it.remainSeconds - currLevel = it.currLevel - currScore = it.currScore - isMaxLevel = it.isMaxLevel - } - - onItemSelect(if (position < 0) 0 else position) - } + var position = 0 + _myVipInfoLiveData.value = it.vipInfos?.findLast { vipInfo -> + vipInfo.remainSeconds > 0 + }?.copy() + ?.apply { + position = it.vipInfos?.indexOf(this) ?: -1 + val nextVipInfo = it.vipInfos?.getOrNull(position + 1) + nextVipName = if (nextVipInfo?.vipName == vipName) null else nextVipInfo?.vipName +// remainSeconds = it.remainSeconds + currLevel = it.currLevel + currScore = it.currScore + isMaxLevel = it.isMaxLevel + } + onItemSelect(if (position < 0) 0 else position) } } diff --git a/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt b/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt index 078723b24..7347ff24d 100644 --- a/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt +++ b/app/src/main/java/com/chwl/app/vip/adapter/VipCenterBannerAdapter.kt @@ -7,7 +7,6 @@ import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.chwl.app.R -import com.chwl.app.ui.utils.loadAnim import com.chwl.core.vip.bean.VipInfo import com.chwl.library.download.DownloadException import com.chwl.library.download.DownloadManager.download @@ -22,8 +21,10 @@ import com.tencent.qgame.animplayer.inter.IAnimListener import com.tencent.qgame.animplayer.util.ScaleType import com.youth.banner.adapter.BannerAdapter import java.io.File +import java.text.DateFormat import java.text.SimpleDateFormat import java.util.Calendar +import java.util.Date import java.util.Locale class VipCenterBannerAdapter( @@ -43,10 +44,10 @@ class VipCenterBannerAdapter( } override fun onBindView(holder: BannerViewHolder, data: VipInfo, position: Int, size: Int) { - + //todo do 旧bug 买完VIP不刷新item holder.dueText.visibility = View.GONE myVipInfo?.let { - if (it.vipLevel == data.vipLevel) { + if (it.vipLevel >= data.vipLevel) { val calendar = Calendar.getInstance() calendar.add(Calendar.SECOND, it.remainSeconds) val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) @@ -147,5 +148,8 @@ class VipCenterBannerAdapter( val dueText: TextView = view.findViewById(R.id.due_date_textview) } + fun millis2String(millis: Long, format: DateFormat): String { + return format.format(Date(millis)) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable-ldrtl/user_info_bg_live.xml b/app/src/main/res/drawable-ldrtl/user_info_bg_live.xml deleted file mode 100644 index 3121b45ee..000000000 --- a/app/src/main/res/drawable-ldrtl/user_info_bg_live.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/base_status_empty.png b/app/src/main/res/drawable-xxhdpi/base_status_empty.png index 02ecbd92e..d2951ffc4 100644 Binary files a/app/src/main/res/drawable-xxhdpi/base_status_empty.png and b/app/src/main/res/drawable-xxhdpi/base_status_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_copy.png b/app/src/main/res/drawable-xxhdpi/ic_copy.png new file mode 100644 index 000000000..a02867409 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_copy.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_gift_bg.png b/app/src/main/res/drawable-xxhdpi/ic_cp_gift_bg.png new file mode 100644 index 000000000..c4c521c5a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_gift_bg.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_1.png b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_1.png new file mode 100644 index 000000000..f0183f1a2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_2.png b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_2.png new file mode 100644 index 000000000..51563e720 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_2.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_3.png b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_3.png new file mode 100644 index 000000000..f28199d70 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_3.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_4.png b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_4.png new file mode 100644 index 000000000..df9ad414c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_4.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_5.png b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_5.png new file mode 100644 index 000000000..30740b89e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_level_up_bg_5.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_item_bg.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_item_bg.png new file mode 100644 index 000000000..647b4a8f6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_item_bg.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_0.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_0.png new file mode 100644 index 000000000..5791017e5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_0.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_1.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_1.png new file mode 100644 index 000000000..0ec8fe393 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_2.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_2.png new file mode 100644 index 000000000..35c37bb19 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_2.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_3.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_3.png new file mode 100644 index 000000000..ad58d7f05 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_3.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_4.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_4.png new file mode 100644 index 000000000..c6ff7478b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_4.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_5.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_5.png new file mode 100644 index 000000000..b0f1b107b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_level_5.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cp_list_more.png b/app/src/main/res/drawable-xxhdpi/ic_cp_list_more.png new file mode 100644 index 000000000..957419d2b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cp_list_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_edit_sw_off.png b/app/src/main/res/drawable-xxhdpi/ic_user_edit_sw_off.png new file mode 100644 index 000000000..14c15b378 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_edit_sw_off.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_edit_sw_on.png b/app/src/main/res/drawable-xxhdpi/ic_user_edit_sw_on.png new file mode 100644 index 000000000..169f1e4e3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_edit_sw_on.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_0.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_0.png new file mode 100644 index 000000000..8f41bf532 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_0.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_1.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_1.png new file mode 100644 index 000000000..1a97ce794 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_2.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_2.png new file mode 100644 index 000000000..5311d0809 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_2.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_3.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_3.png new file mode 100644 index 000000000..a40ede63e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_3.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_4.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_4.png new file mode 100644 index 000000000..9eca74cbd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_4.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_5.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_5.png new file mode 100644 index 000000000..5da915c80 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_flag_5.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_heart.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_heart.png new file mode 100644 index 000000000..13f2187b1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_avatar_heart.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_bg.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_bg.png new file mode 100644 index 000000000..457a200b2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_bg.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_cancel.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_cancel.png new file mode 100644 index 000000000..5fde4cb5b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_cancel.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_def_avatar.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_def_avatar.png new file mode 100644 index 000000000..297b6beec Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_def_avatar.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_heart.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_heart.png new file mode 100644 index 000000000..3362ac424 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_cp_heart.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_edit.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_edit.png new file mode 100644 index 000000000..e362a24ae Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_edit.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_guild_bg.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_guild_bg.png new file mode 100644 index 000000000..2e91a04e4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_guild_bg.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_live.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_live.png new file mode 100644 index 000000000..ea23237e2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_live.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_user_info_more.png b/app/src/main/res/drawable-xxhdpi/ic_user_info_more.png new file mode 100644 index 000000000..c8dc25664 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_user_info_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_message_new.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_message_new.png index a0ea0813a..b80053ad9 100644 Binary files a/app/src/main/res/drawable-xxhdpi/room_menu_ic_message_new.png and b/app/src/main/res/drawable-xxhdpi/room_menu_ic_message_new.png differ diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_close.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_close.png index 9658d2ae1..62b8564ba 100644 Binary files a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_close.png and b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_close.png differ diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_music.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_music.png new file mode 100644 index 000000000..ad7f6b174 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_music.png differ diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_open.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_open.png index a2012d9b0..83c7f58c7 100644 Binary files a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_open.png and b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_open.png differ diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_queue_new.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_queue_new.png index 730b8e4db..717a25dd0 100644 Binary files a/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_queue_new.png and b/app/src/main/res/drawable-xxhdpi/room_menu_ic_mic_queue_new.png differ diff --git a/app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png b/app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png index 075473278..0aef163aa 100644 Binary files a/app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png and b/app/src/main/res/drawable-xxhdpi/room_menu_ic_more_new.png differ diff --git a/app/src/main/res/drawable/bar_cp_progress.xml b/app/src/main/res/drawable/bar_cp_progress.xml new file mode 100644 index 000000000..f38d5137c --- /dev/null +++ b/app/src/main/res/drawable/bar_cp_progress.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_user_info_medal_item.xml b/app/src/main/res/drawable/bg_user_info_medal_item.xml new file mode 100644 index 000000000..fa4be1467 --- /dev/null +++ b/app/src/main/res/drawable/bg_user_info_medal_item.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/transparent_draw.xml b/app/src/main/res/drawable/transparent_draw.xml new file mode 100644 index 000000000..178ae4f82 --- /dev/null +++ b/app/src/main/res/drawable/transparent_draw.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_info_bg_live.xml b/app/src/main/res/drawable/user_info_bg_live.xml index 55f6c659a..6b20f21e0 100644 --- a/app/src/main/res/drawable/user_info_bg_live.xml +++ b/app/src/main/res/drawable/user_info_bg_live.xml @@ -1,13 +1,7 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_info_title_icon.xml b/app/src/main/res/drawable/user_info_title_icon.xml new file mode 100644 index 000000000..7b3287c1a --- /dev/null +++ b/app/src/main/res/drawable/user_info_title_icon.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_cp_list.xml b/app/src/main/res/layout/activity_user_cp_list.xml new file mode 100644 index 000000000..04ebfc8f1 --- /dev/null +++ b/app/src/main/res/layout/activity_user_cp_list.xml @@ -0,0 +1,33 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index bcdb8effa..dee098ae1 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -6,15 +6,15 @@ + android:background="#08151a"> - - + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_57" + android:background="#08151a" + app:layout_constraintTop_toTopOf="@id/ivHeadWear"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + app:layout_constraintTop_toTopOf="@id/bannerView" /> - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -479,8 +642,10 @@ + + + + diff --git a/app/src/main/res/layout/activity_user_info_modify.xml b/app/src/main/res/layout/activity_user_info_modify.xml index 5b9a7d591..51b616218 100644 --- a/app/src/main/res/layout/activity_user_info_modify.xml +++ b/app/src/main/res/layout/activity_user_info_modify.xml @@ -1,9 +1,9 @@ @@ -232,7 +232,7 @@ android:gravity="center_vertical|end" android:textColor="@color/color_6D6B89" android:textSize="@dimen/font_normal" - tools:text="馬來西亞"/> + tools:text="馬來西亞" /> + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_user_cp_list.xml b/app/src/main/res/layout/item_user_cp_list.xml new file mode 100644 index 000000000..12c7fceac --- /dev/null +++ b/app/src/main/res/layout/item_user_cp_list.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_ktv_empty.xml b/app/src/main/res/layout/layout_ktv_empty.xml index 28d1878a9..3dd4cf0df 100644 --- a/app/src/main/res/layout/layout_ktv_empty.xml +++ b/app/src/main/res/layout/layout_ktv_empty.xml @@ -10,7 +10,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="130dp" - android:src="@drawable/icon_common_failure" /> + android:src="@drawable/base_status_empty" /> + android:src="@drawable/base_status_empty" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/room_notify_cp_bind.xml b/app/src/main/res/layout/room_notify_cp_bind.xml new file mode 100644 index 000000000..5626c5291 --- /dev/null +++ b/app/src/main/res/layout/room_notify_cp_bind.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/room_notify_cp_gift.xml b/app/src/main/res/layout/room_notify_cp_gift.xml new file mode 100644 index 000000000..7a51bade9 --- /dev/null +++ b/app/src/main/res/layout/room_notify_cp_gift.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/room_notify_cp_level_up.xml b/app/src/main/res/layout/room_notify_cp_level_up.xml new file mode 100644 index 000000000..23b252276 --- /dev/null +++ b/app/src/main/res/layout/room_notify_cp_level_up.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/user_info_bottom_layout.xml b/app/src/main/res/layout/user_info_bottom_layout.xml index 3f1a2f54f..159d714a1 100644 --- a/app/src/main/res/layout/user_info_bottom_layout.xml +++ b/app/src/main/res/layout/user_info_bottom_layout.xml @@ -7,8 +7,9 @@ android:gravity="center" android:orientation="horizontal"> + + android:textSize="@dimen/sp_16" + android:textStyle="bold" /> + android:textColor="@color/color_FFFFFF" + android:textSize="@dimen/sp_16" + android:textStyle="bold" /> \ No newline at end of file diff --git a/app/src/main/res/layout/user_info_data_fragment.xml b/app/src/main/res/layout/user_info_data_fragment.xml index 49efe7b7d..d6d4ada77 100644 --- a/app/src/main/res/layout/user_info_data_fragment.xml +++ b/app/src/main/res/layout/user_info_data_fragment.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="#08151a" android:clipToPadding="false" android:paddingBottom="@dimen/dp_66"> @@ -12,6 +13,7 @@ android:layout_height="match_parent" android:orientation="vertical"> + + @@ -73,7 +78,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/dp_3" android:text="(0)" - android:textColor="#666666" + android:textColor="@color/white" android:textSize="@dimen/dp_16" android:textStyle="bold" app:layout_constraintBottom_toBottomOf="@id/tv_album_title" @@ -93,16 +98,18 @@ + - - - - - - - - - - - - - - - - - - - - - + - - - + android:layout_height="@dimen/dp_85" + android:background="@drawable/ic_user_info_guild_bg" + android:layout_marginHorizontal="@dimen/dp_15" + android:layout_marginTop="@dimen/dp_10" + app:layout_constraintTop_toBottomOf="@id/guildTitle" /> + android:id="@+id/guildImg" + android:layout_width="@dimen/dp_61" + android:layout_height="@dimen/dp_61" + android:src="@drawable/default_avatar" + android:layout_marginStart="@dimen/dp_12" + app:layout_constraintBottom_toBottomOf="@id/guildBg" + app:layout_constraintStart_toStartOf="@id/guildBg" + app:layout_constraintTop_toTopOf="@id/guildBg" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/user_info_item_album.xml b/app/src/main/res/layout/user_info_item_album.xml index 57a91cfa9..f64a714f2 100644 --- a/app/src/main/res/layout/user_info_item_album.xml +++ b/app/src/main/res/layout/user_info_item_album.xml @@ -2,19 +2,22 @@ + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_4" + android:layout_marginBottom="@dimen/dp_7"> diff --git a/app/src/main/res/layout/user_info_item_gift.xml b/app/src/main/res/layout/user_info_item_gift.xml index a252a1bc8..cbc18796d 100644 --- a/app/src/main/res/layout/user_info_item_gift.xml +++ b/app/src/main/res/layout/user_info_item_gift.xml @@ -4,28 +4,22 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - tools:layout_width="@dimen/dp_84"> + android:layout_marginHorizontal="@dimen/dp_3_5" + android:layout_marginBottom="@dimen/dp_7" + android:background="@drawable/bg_user_info_medal_item"> - - + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_3_5" + android:layout_marginBottom="@dimen/dp_7" + android:background="@drawable/bg_user_info_medal_item" + android:gravity="center_horizontal" + android:orientation="vertical"> - - + - + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2e20cfe2d..ca6068bc3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -764,5 +764,7 @@ #313131 #e29030 + #08151a + #fff664 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 869bfd276..6f1d96980 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -947,6 +947,18 @@ After unbinding, including the duration of companionship and level will be cleared; Are you sure you want to unbind the relationship? After reverting, including the duration of companionship and level will be restored, are you sure you want to restore the relationship? %d people @ you + CP + days + Need %s to upgrade + Agent ID + Guild ID + Guild Nick + CP_Cancel + CP Gift + Become + Sweet Duo CP + My Cp + Waiting for love My Coins diff --git a/core/src/main/java/com/chwl/core/gift/GiftModel.java b/core/src/main/java/com/chwl/core/gift/GiftModel.java index e5fa6589c..0e9e0b461 100644 --- a/core/src/main/java/com/chwl/core/gift/GiftModel.java +++ b/core/src/main/java/com/chwl/core/gift/GiftModel.java @@ -257,6 +257,9 @@ public class GiftModel extends BaseModel implements IGiftModel { case GiftType.GIFT_TYPE_COUNTRY: giftInfos = allGiftListInfo.getCountryGift(); break; + case GiftType.GIFT_TYPE_CP: + giftInfos = allGiftListInfo.getCpGift(); + break; } return giftInfos == null ? new ArrayList<>() : giftInfos; } @@ -608,6 +611,9 @@ public class GiftModel extends BaseModel implements IGiftModel { if (giftInfo == null) { giftInfo = findGiftInfoById(allGiftListInfo.getCountryGift(), giftId); } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getCpGift(), giftId); + } } return giftInfo; } diff --git a/core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt b/core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt new file mode 100644 index 000000000..cdbc3f8e5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt @@ -0,0 +1,26 @@ +package com.chwl.core.gift.bean + + +//private String senderAvatar; //送礼人头像 +//private String senderNick; //送礼人昵称 +//private String receiverAvatar; //收礼人头像 +//private String receiverNick; //收礼人昵称 +//private String giftUrl; //礼物图标 +//private Long senderUid; //送礼人uid +//private Long receiverUid; //收礼人uid +//private Long roomUid; //房间UID +//private Integer cpLevel; +//private Integer partitionId; + +data class CpMsgBean( + var senderAvatar: String = "", + var senderNick: String = "", + var receiverAvatar: String = "", + var receiverNick: String = "", + var giftUrl: String = "", + var senderUid: Long = 0, + var receiverUid: Long = 0, + var roomUid: Long = 0, + var cpLevel: Int = 0, + var partitionId: Int = 0, + var second: Int = 0) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java index f9a2985bb..576276e66 100644 --- a/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java @@ -21,5 +21,6 @@ public class GiftListInfo implements Serializable { private List weekStarGift; private List drawGift; private List singlePopularGift; + private List cpGift; private String giftVersion; } diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftType.java b/core/src/main/java/com/chwl/core/gift/bean/GiftType.java index e11997098..648813f78 100644 --- a/core/src/main/java/com/chwl/core/gift/bean/GiftType.java +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftType.java @@ -47,4 +47,13 @@ public class GiftType { public static final int GIFT_TYPE_SUPER_LUCKY = 16; public static final int GIFT_TYPE_COUNTRY = 17; + + /** + * 幸运24礼物 - 支持连击 + */ + public static final int GIFT_TYPE_LUCKY_24 = 18; + /** + * cp礼物 - 支持连击 + */ + public static final int GIFT_TYPE_CP = 19; } diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java new file mode 100644 index 000000000..6fb679a09 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java @@ -0,0 +1,13 @@ +package com.chwl.core.gift.bean; + +public class RoomNotifyDialogBean { + public int first; + public int second; + public Object data; + + public RoomNotifyDialogBean(int first, int second, Object data) { + this.first = first; + this.second = second; + this.data = data; + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java b/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java index 5d1c9cc81..c00cae01d 100644 --- a/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java +++ b/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java @@ -33,6 +33,8 @@ public class TagsInfo implements Serializable { return GiftType.GIFT_TYPE_COUNTRY; } else if ("singlePopularGift".equals(key)) { return GiftType.GIFT_TYPE_SINGLE_ROOM; + } else if ("cpGift".equals(key)) { + return GiftType.GIFT_TYPE_CP; } return 0; } diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt new file mode 100644 index 000000000..f1e092b48 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt @@ -0,0 +1,34 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson.JSONObject +import com.chwl.core.gift.bean.CpMsgBean +import com.chwl.core.gift.bean.LuckyGiftMsgAllBean +import com.chwl.core.gift.bean.LuckyGiftMsgSelfBean +import com.google.gson.Gson + +class CpMsgAttachment (first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var cpMsgBean : CpMsgBean?=null + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + cpMsgBean = Gson().fromJson( + data.toJSONString(), + CpMsgBean::class.java + ) + cpMsgBean?.second = second + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java index f1e408eca..6f9a5e2c1 100644 --- a/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java @@ -597,6 +597,9 @@ public class CustomAttachParser implements MsgAttachmentParser { attachment = new LuckyGiftNotifyAttachment(first,second); } break; + case CP_FIRST: + attachment = new CpMsgAttachment(first,second); + break; case CustomAttachment.CUSTOM_MSG_CRAZY_ZOO: switch (second) { case CustomAttachment.CUSTOM_MSG_CRAZY_ZOO_SUB_ROOM: diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java index 1f4addcaf..635b466e4 100644 --- a/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java @@ -545,6 +545,13 @@ public class CustomAttachment implements MsgAttachment { // 游戏组队-邀请 public static final int CUSTOM_MSG_GAME_TEAM_INVITE = 1121; + //--------------CP礼物--------------------------- + public static final int CP_FIRST = 64; + public static final int CP_SECOND_GIFT = 641; //CP礼物全服飘屏 + public static final int CP_SECOND_UPGRADE = 642; //CP升级全服飘屏 + public static final int CP_SECOND_BIND = 643; //CP绑定 + + /** * 自定义消息附件的类型,根据该字段区分不同的自定义消息 */ diff --git a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java index 4a8663868..3658b6ff4 100644 --- a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java +++ b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java @@ -18,6 +18,7 @@ import androidx.annotation.Nullable; import com.chwl.core.gift.bean.GiftType; import com.chwl.core.gift.bean.MsgSuperLuckyGift; +import com.chwl.core.im.custom.bean.CpMsgAttachment; import com.chwl.core.im.custom.bean.LuckyGiftNotifyAttachment; import com.chwl.core.im.custom.bean.RoomSerialValueChangedAttachment; import com.chwl.core.initial.InitialModel; @@ -1492,6 +1493,13 @@ public final class IMNetEaseManager { noticeRoomEvent(msg, RoomEvent.TEMPLATE_NOTIFY); } break; + + case CP_FIRST: + CpMsgAttachment cpMsgAttachment = (CpMsgAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_CP_ABOUT) + .setCpMsgBean(cpMsgAttachment.cpMsgBean)); + break; case CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED: if (second == CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED_SUB) { RoomSerialValueChangedAttachment serialValueAttachment = (RoomSerialValueChangedAttachment) attachment; diff --git a/core/src/main/java/com/chwl/core/manager/RoomEvent.java b/core/src/main/java/com/chwl/core/manager/RoomEvent.java index e34b8810e..276421c7a 100644 --- a/core/src/main/java/com/chwl/core/manager/RoomEvent.java +++ b/core/src/main/java/com/chwl/core/manager/RoomEvent.java @@ -1,5 +1,6 @@ package com.chwl.core.manager; +import com.chwl.core.gift.bean.CpMsgBean; import com.chwl.core.gift.bean.MsgSuperLuckyGift; import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; @@ -276,6 +277,9 @@ public class RoomEvent { //幸运礼物中奖飘屏,弹窗 public static final int MSG_SUPER_LUCKY_GIFT = 113; + //CP相关中奖飘屏,弹窗 + public static final int MSG_CP_ABOUT = 114; + private int event = NONE; private int micPosition = Integer.MIN_VALUE; private int posState = -1; @@ -304,6 +308,7 @@ public class RoomEvent { private GiftMultiReceiverInfo giftMultiReceiverInfo; private LuckyBagGifts LuckygiftMultiReceiverInfo; private MsgSuperLuckyGift msgSuperLuckyGift; + private CpMsgBean cpMsgBean; /** * 需要透传出去的消息 @@ -569,4 +574,17 @@ public class RoomEvent { this.msgSuperLuckyGift = msgSuperLuckyGift; return this; } + + + public CpMsgBean getCpMsgBean() { + return cpMsgBean; + } + + public RoomEvent setCpMsgBean(CpMsgBean cpMsgBean) { + this.cpMsgBean = cpMsgBean; + return this; + } + + + } diff --git a/core/src/main/java/com/chwl/core/room/bean/CpListItem.java b/core/src/main/java/com/chwl/core/room/bean/CpListItem.java new file mode 100644 index 000000000..ebc73a5ff --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/CpListItem.java @@ -0,0 +1,17 @@ +package com.chwl.core.room.bean; + +public class CpListItem { + public String uid; + public String cpLevel; + public String maxCpLevel; + public String cpDay; + public String cpAvatar; + public String cpNick; + public String cpUid; + public String currentExp; + public String startExp; //起始值 + public String endExp; + public String avatar; + public String nick; + public String cancelGoldNum; +} diff --git a/core/src/main/java/com/chwl/core/user/IUserModel.java b/core/src/main/java/com/chwl/core/user/IUserModel.java index 96dffe0d8..4a7271a9b 100644 --- a/core/src/main/java/com/chwl/core/user/IUserModel.java +++ b/core/src/main/java/com/chwl/core/user/IUserModel.java @@ -73,6 +73,7 @@ public interface IUserModel extends IModel { * @return */ Single getUserInfoDetail(long userId); + Single getUserInfoDetailCache(long userId); /** * 根据 批量 Uid 去我们后台获取用户的具体信息 @@ -245,6 +246,11 @@ public interface IUserModel extends IModel { */ Single saveArea(String area); + /** + * 保存地区 + */ + Single userCpSettingUpdate(int type,boolean isShow); + boolean isSamePartition(long partitionId); long getPartitionId(); diff --git a/core/src/main/java/com/chwl/core/user/UserModel.java b/core/src/main/java/com/chwl/core/user/UserModel.java index 6887262b3..5978fdd90 100644 --- a/core/src/main/java/com/chwl/core/user/UserModel.java +++ b/core/src/main/java/com/chwl/core/user/UserModel.java @@ -71,6 +71,7 @@ public final class UserModel extends BaseModel implements IUserModel { private static final String TAG = "UserModel"; private volatile UserInfo currentUserInfo = null; + private volatile UserDetailInfo UserDetailInfo = null; private volatile LruCache cache = new LruCache<>(50); private final Api api = RxNet.create(Api.class); @@ -311,10 +312,33 @@ public final class UserModel extends BaseModel implements IUserModel { if (userDetailInfo.getCode() != 200) { return Single.error(new Exception(userDetailInfo.getMessage())); } + UserDetailInfo = userDetailInfo; return Single.just(userDetailInfo); }); } + @Override + public Single getUserInfoDetailCache(long uid){ + if (UserDetailInfo != null && UserDetailInfo.getData() != null && UserDetailInfo.getData().getUid() == uid) { + return Single.just(UserDetailInfo); + } else { + return api.getUserInfoDetail(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()) + .flatMap(userDetailInfo -> { + if (null == userDetailInfo) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_06))); + } + if (userDetailInfo.getCode() != 200) { + return Single.error(new Exception(userDetailInfo.getMessage())); + } + UserDetailInfo = userDetailInfo; + return Single.just(userDetailInfo); + }); + } + } + + + /** * 根据 云信的Uid 去我们后台获取用户的具体信息 * @@ -842,6 +866,13 @@ public final class UserModel extends BaseModel implements IUserModel { .compose(RxHelper.handleSchedulers()); } + @Override + public Single userCpSettingUpdate(int type,boolean isShow) { + return api.userCpSettingUpdate(type,isShow) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + @Override public boolean isSamePartition(long partitionId) { if (currentUserInfo == null) { @@ -1120,5 +1151,12 @@ public final class UserModel extends BaseModel implements IUserModel { @POST("/region/save") Single> saveArea(@Query("region") String region); + /** + * Byte type,//1-cp头像是否展示,2-cp动画 + * Boolean isShow 是否开启 + */ + @POST("/user/setting/update") + Single> userCpSettingUpdate(@Query("type") int type,@Query("isShow") boolean isShow); + } } diff --git a/core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java b/core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java new file mode 100644 index 000000000..8bc38713e --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java @@ -0,0 +1,18 @@ +package com.chwl.core.user.bean; + +public class UserCPListBean { + + public long uid; + public int cpLevel; + public int maxCpLevel; + public long cpDay; + public String cpAvatar; + public String cpNick; + public long cpUid; + public long startExp; //起始值 + public long endExp; + public long currentExp; + public String avatar; + public String nick; + public long cancelGoldNum; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java index e9a764e83..4ff953d7d 100644 --- a/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java +++ b/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java @@ -54,7 +54,7 @@ public class UserDetailInfo implements Serializable { * userGiftWall : [{"uid":935007,"giftPrice":100,"giftId":1362,"giftName":ResUtil.getString(R.string.user_bean_userdetailinfo_013),"picUrl":"http://image.doudouyuyin.com/FutM6ydZBdAn6Iz_ro7mgen1Cmph?imageslim","reciveCount":152}] * dynamicInfo : [{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_014),"likeCount":1,"commentCount":2,"dynamicId":1339,"publishTime":1587726740000,"playCount":0,"type":2,"dynamicResList":[{"id":950,"resUrl":"https://image.zhongjialx.com/FhWRCGNLYybra8--ItDfuN3lpCIX?imageslim","resDuration":0,"format":"jpeg","width":2000,"height":1500}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_015),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_016),"likeCount":1,"commentCount":1,"dynamicId":1337,"publishTime":1587726053000,"playCount":0,"type":2,"dynamicResList":[{"id":948,"resUrl":"https://image.zhongjialx.com/FhwRh_iAaqRkgsOZdHK3n3TM75Zq?imageslim","resDuration":0,"format":"jpeg","width":2000,"height":1500}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_017),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_018),"likeCount":1,"commentCount":1,"dynamicId":1330,"publishTime":1587721604000,"playCount":0,"type":2,"dynamicResList":[{"id":947,"resUrl":"https://image.zhongjialx.com/FpthMLmgrkDHfEatTBKb0h05mnXj?imageslim","resDuration":0,"format":"jpeg","width":1080,"height":1672}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_019),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_020),"likeCount":1,"commentCount":3,"dynamicId":1329,"publishTime":1587720609000,"playCount":0,"type":2,"dynamicResList":[{"id":946,"resUrl":"https://image.zhongjialx.com/FtV48sdlmrKkc69OSft43J-S7wDk?imageslim","resDuration":0,"format":"png","width":1080,"height":1920}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_021),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_022),"likeCount":5,"commentCount":7,"dynamicId":1327,"publishTime":1587711821000,"playCount":0,"type":2,"dynamicResList":[{"id":938,"resUrl":"https://image.zhongjialx.com/FgInE7evjBy8lL33uHkmvORMlC1_?imageslim","resDuration":0,"format":"jpeg","width":1296,"height":1728}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_023),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"}] * privatePhoto : [{"photoUrl":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim","seqNo":0}] - isReview boolean + * isReview boolean */ private int uid; @@ -67,6 +67,7 @@ public class UserDetailInfo implements Serializable { private String roomTitle; private UserLevelVoBean userLevelVo; private List userGiftWall; + private List userLuckyBagGiftWall; private List dynamicInfo; private List privatePhoto; private String nameplatePic; @@ -74,6 +75,24 @@ public class UserDetailInfo implements Serializable { private String region; private UserDetailMedalInfo medals; private List userGamePartner; + private RelationUserVO relationUserVO; + private GuildInfo guildInfo; + + public GuildInfo getGuildInfo() { + return guildInfo; + } + + public void setGuildInfo(GuildInfo guildInfo) { + this.guildInfo = guildInfo; + } + + public RelationUserVO getRelationUserVO() { + return relationUserVO; + } + + public void setRelationUserVO(RelationUserVO relationUserVO) { + this.relationUserVO = relationUserVO; + } public List getUserGamePartner() { return userGamePartner; @@ -211,6 +230,15 @@ public class UserDetailInfo implements Serializable { this.medals = medals; } + + public List getUserLuckyBagGiftWall() { + return userLuckyBagGiftWall; + } + + public void setUserLuckyBagGiftWall(List userLuckyBagGiftWall) { + this.userLuckyBagGiftWall = userLuckyBagGiftWall; + } + public static class UserLevelVoBean { /** * experAmount : 1647 @@ -225,8 +253,8 @@ public class UserDetailInfo implements Serializable { * charmLevelSeq : 2 */ - private int experAmount; - private int charmAmount; + private long experAmount; + private long charmAmount; private String experUrl; private String charmUrl; private String experLevelName; @@ -236,19 +264,19 @@ public class UserDetailInfo implements Serializable { private int experLevelSeq; private int charmLevelSeq; - public int getExperAmount() { + public long getExperAmount() { return experAmount; } - public void setExperAmount(int experAmount) { + public void setExperAmount(long experAmount) { this.experAmount = experAmount; } - public int getCharmAmount() { + public long getCharmAmount() { return charmAmount; } - public void setCharmAmount(int charmAmount) { + public void setCharmAmount(long charmAmount) { this.charmAmount = charmAmount; } @@ -394,8 +422,6 @@ public class UserDetailInfo implements Serializable { } } - - public static class PrivatePhotoBean { /** * photoUrl : https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim @@ -430,5 +456,33 @@ public class UserDetailInfo implements Serializable { isReview = review; } } + + public static class RelationUserVO { + + public int cpLevel; + public int cpDay; + public String cpAvatar; + public String cpNick; + public long cpUid; + public long currentExp; + public long nextLevelExp; + public String avatar; + public String nick; + public long startExp; + public long endExp; + + public Boolean showCpAvatar; + public Boolean showCpAnim; + public long cancelGoldNum = 0L; + + } + + public static class GuildInfo{ + public long erbanNo; + public long guildId; + public String avatar; + public String guildName; + + } } } diff --git a/core/src/main/java/com/chwl/core/utils/SpanUtils.java b/core/src/main/java/com/chwl/core/utils/SpanUtils.java new file mode 100644 index 000000000..e9cd2e9ab --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/SpanUtils.java @@ -0,0 +1,1459 @@ +package com.chwl.core.utils; + +import android.annotation.SuppressLint; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Shader; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.text.Layout; +import android.text.Layout.Alignment; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.AlignmentSpan; +import android.text.style.BackgroundColorSpan; +import android.text.style.CharacterStyle; +import android.text.style.ClickableSpan; +import android.text.style.ForegroundColorSpan; +import android.text.style.LeadingMarginSpan; +import android.text.style.LineHeightSpan; +import android.text.style.MaskFilterSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.ReplacementSpan; +import android.text.style.ScaleXSpan; +import android.text.style.StrikethroughSpan; +import android.text.style.StyleSpan; +import android.text.style.SubscriptSpan; +import android.text.style.SuperscriptSpan; +import android.text.style.TypefaceSpan; +import android.text.style.URLSpan; +import android.text.style.UnderlineSpan; +import android.text.style.UpdateAppearance; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.annotation.DrawableRes; +import androidx.annotation.FloatRange; +import androidx.annotation.IntDef; +import androidx.annotation.IntRange; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import static android.graphics.BlurMaskFilter.Blur; + +import com.example.lib_utils.AppUtils; + +import java.io.InputStream; +import java.io.Serializable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; + +public class SpanUtils { + + private static final int COLOR_DEFAULT = 0xFEFFFFFF; + + public static final int ALIGN_BOTTOM = 0; + public static final int ALIGN_BASELINE = 1; + public static final int ALIGN_CENTER = 2; + public static final int ALIGN_TOP = 3; + + @IntDef({ALIGN_BOTTOM, ALIGN_BASELINE, ALIGN_CENTER, ALIGN_TOP}) + @Retention(RetentionPolicy.SOURCE) + public @interface Align { + } + + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + public static SpanUtils with(final TextView textView) { + return new SpanUtils(textView); + } + + private TextView mTextView; + private CharSequence mText; + private int flag; + private int foregroundColor; + private int backgroundColor; + private int lineHeight; + private int alignLine; + private int quoteColor; + private int stripeWidth; + private int quoteGapWidth; + private int first; + private int rest; + private int bulletColor; + private int bulletRadius; + private int bulletGapWidth; + private int fontSize; + private float proportion; + private float xProportion; + private boolean isStrikethrough; + private boolean isUnderline; + private boolean isSuperscript; + private boolean isSubscript; + private boolean isBold; + private boolean isItalic; + private boolean isBoldItalic; + private String fontFamily; + private Typeface typeface; + private Alignment alignment; + private int verticalAlign; + private ClickableSpan clickSpan; + private String url; + private float blurRadius; + private Blur style; + private Shader shader; + private float shadowRadius; + private float shadowDx; + private float shadowDy; + private int shadowColor; + private Object[] spans; + + private Bitmap imageBitmap; + private Drawable imageDrawable; + private Uri imageUri; + private int imageResourceId; + private int alignImage; + + private int spaceSize; + private int spaceColor; + + private SerializableSpannableStringBuilder mBuilder; + private boolean isCreated; + + private int mType; + private final int mTypeCharSequence = 0; + private final int mTypeImage = 1; + private final int mTypeSpace = 2; + + private SpanUtils(TextView textView) { + this(); + mTextView = textView; + } + + public SpanUtils() { + mBuilder = new SerializableSpannableStringBuilder(); + mText = ""; + mType = -1; + setDefault(); + } + + private void setDefault() { + flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; + foregroundColor = COLOR_DEFAULT; + backgroundColor = COLOR_DEFAULT; + lineHeight = -1; + quoteColor = COLOR_DEFAULT; + first = -1; + bulletColor = COLOR_DEFAULT; + fontSize = -1; + proportion = -1; + xProportion = -1; + isStrikethrough = false; + isUnderline = false; + isSuperscript = false; + isSubscript = false; + isBold = false; + isItalic = false; + isBoldItalic = false; + fontFamily = null; + typeface = null; + alignment = null; + verticalAlign = -1; + clickSpan = null; + url = null; + blurRadius = -1; + shader = null; + shadowRadius = -1; + spans = null; + + imageBitmap = null; + imageDrawable = null; + imageUri = null; + imageResourceId = -1; + + spaceSize = -1; + } + + /** + * Set the span of flag. + * + * @param flag The flag. + *
    + *
  • {@link Spanned#SPAN_INCLUSIVE_EXCLUSIVE}
  • + *
  • {@link Spanned#SPAN_INCLUSIVE_INCLUSIVE}
  • + *
  • {@link Spanned#SPAN_EXCLUSIVE_EXCLUSIVE}
  • + *
  • {@link Spanned#SPAN_EXCLUSIVE_INCLUSIVE}
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils setFlag(final int flag) { + this.flag = flag; + return this; + } + + /** + * Set the span of foreground's color. + * + * @param color The color of foreground + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setForegroundColor(@ColorInt final int color) { + this.foregroundColor = color; + return this; + } + + /** + * Set the span of background's color. + * + * @param color The color of background + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setBackgroundColor(@ColorInt final int color) { + this.backgroundColor = color; + return this; + } + + /** + * Set the span of line height. + * + * @param lineHeight The line height, in pixel. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setLineHeight(@IntRange(from = 0) final int lineHeight) { + return setLineHeight(lineHeight, ALIGN_CENTER); + } + + /** + * Set the span of line height. + * + * @param lineHeight The line height, in pixel. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER}
  • + *
  • {@link Align#ALIGN_BOTTOM}
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils setLineHeight(@IntRange(from = 0) final int lineHeight, + @Align final int align) { + this.lineHeight = lineHeight; + this.alignLine = align; + return this; + } + + /** + * Set the span of quote's color. + * + * @param color The color of quote + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setQuoteColor(@ColorInt final int color) { + return setQuoteColor(color, 2, 2); + } + + /** + * Set the span of quote's color. + * + * @param color The color of quote. + * @param stripeWidth The width of stripe, in pixel. + * @param gapWidth The width of gap, in pixel. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setQuoteColor(@ColorInt final int color, + @IntRange(from = 1) final int stripeWidth, + @IntRange(from = 0) final int gapWidth) { + this.quoteColor = color; + this.stripeWidth = stripeWidth; + this.quoteGapWidth = gapWidth; + return this; + } + + /** + * Set the span of leading margin. + * + * @param first The indent for the first line of the paragraph. + * @param rest The indent for the remaining lines of the paragraph. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setLeadingMargin(@IntRange(from = 0) final int first, + @IntRange(from = 0) final int rest) { + this.first = first; + this.rest = rest; + return this; + } + + /** + * Set the span of bullet. + * + * @param gapWidth The width of gap, in pixel. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setBullet(@IntRange(from = 0) final int gapWidth) { + return setBullet(0, 3, gapWidth); + } + + /** + * Set the span of bullet. + * + * @param color The color of bullet. + * @param radius The radius of bullet, in pixel. + * @param gapWidth The width of gap, in pixel. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setBullet(@ColorInt final int color, + @IntRange(from = 0) final int radius, + @IntRange(from = 0) final int gapWidth) { + this.bulletColor = color; + this.bulletRadius = radius; + this.bulletGapWidth = gapWidth; + return this; + } + + /** + * Set the span of font's size. + * + * @param size The size of font. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setFontSize(@IntRange(from = 0) final int size) { + return setFontSize(size, false); + } + + /** + * Set the span of size of font. + * + * @param size The size of font. + * @param isSp True to use sp, false to use pixel. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setFontSize(@IntRange(from = 0) final int size, final boolean isSp) { + if (isSp) { + final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity; + this.fontSize = (int) (size * fontScale + 0.5f); + } else { + this.fontSize = size; + } + return this; + } + + /** + * Set the span of proportion of font. + * + * @param proportion The proportion of font. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setFontProportion(final float proportion) { + this.proportion = proportion; + return this; + } + + /** + * Set the span of transverse proportion of font. + * + * @param proportion The transverse proportion of font. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setFontXProportion(final float proportion) { + this.xProportion = proportion; + return this; + } + + /** + * Set the span of strikethrough. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setStrikethrough() { + this.isStrikethrough = true; + return this; + } + + /** + * Set the span of underline. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setUnderline() { + this.isUnderline = true; + return this; + } + + /** + * Set the span of superscript. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setSuperscript() { + this.isSuperscript = true; + return this; + } + + /** + * Set the span of subscript. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setSubscript() { + this.isSubscript = true; + return this; + } + + /** + * Set the span of bold. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setBold() { + isBold = true; + return this; + } + + /** + * Set the span of italic. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setItalic() { + isItalic = true; + return this; + } + + /** + * Set the span of bold italic. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setBoldItalic() { + isBoldItalic = true; + return this; + } + + /** + * Set the span of font family. + * + * @param fontFamily The font family. + *
    + *
  • monospace
  • + *
  • serif
  • + *
  • sans-serif
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils setFontFamily(@NonNull final String fontFamily) { + this.fontFamily = fontFamily; + return this; + } + + /** + * Set the span of typeface. + * + * @param typeface The typeface. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setTypeface(@NonNull final Typeface typeface) { + this.typeface = typeface; + return this; + } + + /** + * Set the span of horizontal alignment. + * + * @param alignment The alignment. + *
    + *
  • {@link Alignment#ALIGN_NORMAL }
  • + *
  • {@link Alignment#ALIGN_OPPOSITE}
  • + *
  • {@link Alignment#ALIGN_CENTER }
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils setHorizontalAlign(@NonNull final Alignment alignment) { + this.alignment = alignment; + return this; + } + + /** + * Set the span of vertical alignment. + * + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils setVerticalAlign(@Align final int align) { + this.verticalAlign = align; + return this; + } + + /** + * Set the span of click. + *

Must set {@code view.setMovementMethod(LinkMovementMethod.getInstance())}

+ * + * @param clickSpan The span of click. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setClickSpan(@NonNull final ClickableSpan clickSpan) { + setMovementMethodIfNeed(); + this.clickSpan = clickSpan; + return this; + } + + /** + * Set the span of click. + *

Must set {@code view.setMovementMethod(LinkMovementMethod.getInstance())}

+ * + * @param color The color of click span. + * @param underlineText True to support underline, false otherwise. + * @param listener The listener of click span. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setClickSpan(@ColorInt final int color, + final boolean underlineText, + final View.OnClickListener listener) { + setMovementMethodIfNeed(); + this.clickSpan = new ClickableSpan() { + + @Override + public void updateDrawState(@NonNull TextPaint paint) { + paint.setColor(color); + paint.setUnderlineText(underlineText); + } + + @Override + public void onClick(@NonNull View widget) { + if (listener != null) { + listener.onClick(widget); + } + } + }; + return this; + } + + /** + * Set the span of url. + *

Must set {@code view.setMovementMethod(LinkMovementMethod.getInstance())}

+ * + * @param url The url. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setUrl(@NonNull final String url) { + setMovementMethodIfNeed(); + this.url = url; + return this; + } + + private void setMovementMethodIfNeed() { + if (mTextView != null && mTextView.getMovementMethod() == null) { + mTextView.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + + /** + * Set the span of blur. + * + * @param radius The radius of blur. + * @param style The style. + *
    + *
  • {@link Blur#NORMAL}
  • + *
  • {@link Blur#SOLID}
  • + *
  • {@link Blur#OUTER}
  • + *
  • {@link Blur#INNER}
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils setBlur(@FloatRange(from = 0, fromInclusive = false) final float radius, + final Blur style) { + this.blurRadius = radius; + this.style = style; + return this; + } + + /** + * Set the span of shader. + * + * @param shader The shader. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setShader(@NonNull final Shader shader) { + this.shader = shader; + return this; + } + + /** + * Set the span of shadow. + * + * @param radius The radius of shadow. + * @param dx X-axis offset, in pixel. + * @param dy Y-axis offset, in pixel. + * @param shadowColor The color of shadow. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setShadow(@FloatRange(from = 0, fromInclusive = false) final float radius, + final float dx, + final float dy, + final int shadowColor) { + this.shadowRadius = radius; + this.shadowDx = dx; + this.shadowDy = dy; + this.shadowColor = shadowColor; + return this; + } + + + /** + * Set the spans. + * + * @param spans The spans. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils setSpans(@NonNull final Object... spans) { + if (spans.length > 0) { + this.spans = spans; + } + return this; + } + + /** + * Append the text text. + * + * @param text The text. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils append(@NonNull final CharSequence text) { + apply(mTypeCharSequence); + mText = text; + return this; + } + + /** + * Append one line. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendLine() { + apply(mTypeCharSequence); + mText = LINE_SEPARATOR; + return this; + } + + /** + * Append text and one line. + * + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendLine(@NonNull final CharSequence text) { + apply(mTypeCharSequence); + mText = text + LINE_SEPARATOR; + return this; + } + + /** + * Append one image. + * + * @param bitmap The bitmap of image. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@NonNull final Bitmap bitmap) { + return appendImage(bitmap, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param bitmap The bitmap. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@NonNull final Bitmap bitmap, @Align final int align) { + apply(mTypeImage); + this.imageBitmap = bitmap; + this.alignImage = align; + return this; + } + + /** + * Append one image. + * + * @param drawable The drawable of image. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@NonNull final Drawable drawable) { + return appendImage(drawable, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param drawable The drawable of image. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@NonNull final Drawable drawable, @Align final int align) { + apply(mTypeImage); + this.imageDrawable = drawable; + this.alignImage = align; + return this; + } + + /** + * Append one image. + * + * @param uri The uri of image. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@NonNull final Uri uri) { + return appendImage(uri, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param uri The uri of image. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@NonNull final Uri uri, @Align final int align) { + apply(mTypeImage); + this.imageUri = uri; + this.alignImage = align; + return this; + } + + /** + * Append one image. + * + * @param resourceId The resource id of image. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@DrawableRes final int resourceId) { + return appendImage(resourceId, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param resourceId The resource id of image. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendImage(@DrawableRes final int resourceId, @Align final int align) { + apply(mTypeImage); + this.imageResourceId = resourceId; + this.alignImage = align; + return this; + } + + /** + * Append space. + * + * @param size The size of space. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendSpace(@IntRange(from = 0) final int size) { + return appendSpace(size, Color.TRANSPARENT); + } + + /** + * Append space. + * + * @param size The size of space. + * @param color The color of space. + * @return the single {@link SpanUtils} instance + */ + public SpanUtils appendSpace(@IntRange(from = 0) final int size, @ColorInt final int color) { + apply(mTypeSpace); + spaceSize = size; + spaceColor = color; + return this; + } + + private void apply(final int type) { + applyLast(); + mType = type; + } + + public SpannableStringBuilder get() { + return mBuilder; + } + + /** + * Create the span string. + * + * @return the span string + */ + public SpannableStringBuilder create() { + applyLast(); + if (mTextView != null) { + mTextView.setText(mBuilder); + } + isCreated = true; + return mBuilder; + } + + private void applyLast() { + if (isCreated) { + return; + } + if (mType == mTypeCharSequence) { + updateCharCharSequence(); + } else if (mType == mTypeImage) { + updateImage(); + } else if (mType == mTypeSpace) { + updateSpace(); + } + setDefault(); + } + + private void updateCharCharSequence() { + if (mText.length() == 0) return; + int start = mBuilder.length(); + if (start == 0 && lineHeight != -1) {// bug of LineHeightSpan when first line + mBuilder.append(Character.toString((char) 2)) + .append("\n") + .setSpan(new AbsoluteSizeSpan(0), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + start = 2; + } + mBuilder.append(mText); + int end = mBuilder.length(); + if (verticalAlign != -1) { + mBuilder.setSpan(new VerticalAlignSpan(verticalAlign), start, end, flag); + } + if (foregroundColor != COLOR_DEFAULT) { + mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag); + } + if (backgroundColor != COLOR_DEFAULT) { + mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag); + } + if (first != -1) { + mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag); + } + if (quoteColor != COLOR_DEFAULT) { + mBuilder.setSpan( + new CustomQuoteSpan(quoteColor, stripeWidth, quoteGapWidth), + start, + end, + flag + ); + } + if (bulletColor != COLOR_DEFAULT) { + mBuilder.setSpan( + new CustomBulletSpan(bulletColor, bulletRadius, bulletGapWidth), + start, + end, + flag + ); + } + if (fontSize != -1) { + mBuilder.setSpan(new AbsoluteSizeSpan(fontSize, false), start, end, flag); + } + if (proportion != -1) { + mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag); + } + if (xProportion != -1) { + mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag); + } + if (lineHeight != -1) { + mBuilder.setSpan(new CustomLineHeightSpan(lineHeight, alignLine), start, end, flag); + } + if (isStrikethrough) { + mBuilder.setSpan(new StrikethroughSpan(), start, end, flag); + } + if (isUnderline) { + mBuilder.setSpan(new UnderlineSpan(), start, end, flag); + } + if (isSuperscript) { + mBuilder.setSpan(new SuperscriptSpan(), start, end, flag); + } + if (isSubscript) { + mBuilder.setSpan(new SubscriptSpan(), start, end, flag); + } + if (isBold) { + mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag); + } + if (isItalic) { + mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag); + } + if (isBoldItalic) { + mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag); + } + if (fontFamily != null) { + mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag); + } + if (typeface != null) { + mBuilder.setSpan(new CustomTypefaceSpan(typeface), start, end, flag); + } + if (alignment != null) { + mBuilder.setSpan(new AlignmentSpan.Standard(alignment), start, end, flag); + } + if (clickSpan != null) { + mBuilder.setSpan(clickSpan, start, end, flag); + } + if (url != null) { + mBuilder.setSpan(new URLSpan(url), start, end, flag); + } + if (blurRadius != -1) { + mBuilder.setSpan( + new MaskFilterSpan(new BlurMaskFilter(blurRadius, style)), + start, + end, + flag + ); + } + if (shader != null) { + mBuilder.setSpan(new ShaderSpan(shader), start, end, flag); + } + if (shadowRadius != -1) { + mBuilder.setSpan( + new ShadowSpan(shadowRadius, shadowDx, shadowDy, shadowColor), + start, + end, + flag + ); + } + if (spans != null) { + for (Object span : spans) { + mBuilder.setSpan(span, start, end, flag); + } + } + } + + private void updateImage() { + int start = mBuilder.length(); + mText = ""; + updateCharCharSequence(); + int end = mBuilder.length(); + if (imageBitmap != null) { + mBuilder.setSpan(new CustomImageSpan(imageBitmap, alignImage), start, end, flag); + } else if (imageDrawable != null) { + mBuilder.setSpan(new CustomImageSpan(imageDrawable, alignImage), start, end, flag); + } else if (imageUri != null) { + mBuilder.setSpan(new CustomImageSpan(imageUri, alignImage), start, end, flag); + } else if (imageResourceId != -1) { + mBuilder.setSpan(new CustomImageSpan(imageResourceId, alignImage), start, end, flag); + } + } + + private void updateSpace() { + int start = mBuilder.length(); + mText = "< >"; + updateCharCharSequence(); + int end = mBuilder.length(); + mBuilder.setSpan(new SpaceSpan(spaceSize, spaceColor), start, end, flag); + } + + static class VerticalAlignSpan extends ReplacementSpan { + + static final int ALIGN_CENTER = 2; + static final int ALIGN_TOP = 3; + + final int mVerticalAlignment; + + VerticalAlignSpan(int verticalAlignment) { + mVerticalAlignment = verticalAlignment; + } + + @Override + public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) { + text = text.subSequence(start, end); + return (int) paint.measureText(text.toString()); + } + + @Override + public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { + text = text.subSequence(start, end); + Paint.FontMetricsInt fm = paint.getFontMetricsInt(); +// int need = height - (v + fm.descent - fm.ascent - spanstartv); +// if (need > 0) { +// if (mVerticalAlignment == ALIGN_TOP) { +// fm.descent += need; +// } else if (mVerticalAlignment == ALIGN_CENTER) { +// fm.descent += need / 2; +// fm.ascent -= need / 2; +// } else { +// fm.ascent -= need; +// } +// } +// need = height - (v + fm.bottom - fm.top - spanstartv); +// if (need > 0) { +// if (mVerticalAlignment == ALIGN_TOP) { +// fm.bottom += need; +// } else if (mVerticalAlignment == ALIGN_CENTER) { +// fm.bottom += need / 2; +// fm.top -= need / 2; +// } else { +// fm.top -= need; +// } +// } + + canvas.drawText(text.toString(), x, y - ((y + fm.descent + y + fm.ascent) / 2 - (bottom + top) / 2), paint); + } + } + + static class CustomLineHeightSpan implements LineHeightSpan { + + private final int height; + + static final int ALIGN_CENTER = 2; + static final int ALIGN_TOP = 3; + + final int mVerticalAlignment; + static Paint.FontMetricsInt sfm; + + CustomLineHeightSpan(int height, int verticalAlignment) { + this.height = height; + mVerticalAlignment = verticalAlignment; + } + + @Override + public void chooseHeight(final CharSequence text, final int start, final int end, + final int spanstartv, final int v, final Paint.FontMetricsInt fm) { +// LogUtils.e(fm, sfm); + if (sfm == null) { + sfm = new Paint.FontMetricsInt(); + sfm.top = fm.top; + sfm.ascent = fm.ascent; + sfm.descent = fm.descent; + sfm.bottom = fm.bottom; + sfm.leading = fm.leading; + } else { + fm.top = sfm.top; + fm.ascent = sfm.ascent; + fm.descent = sfm.descent; + fm.bottom = sfm.bottom; + fm.leading = sfm.leading; + } + int need = height - (v + fm.descent - fm.ascent - spanstartv); + if (need > 0) { + if (mVerticalAlignment == ALIGN_TOP) { + fm.descent += need; + } else if (mVerticalAlignment == ALIGN_CENTER) { + fm.descent += need / 2; + fm.ascent -= need / 2; + } else { + fm.ascent -= need; + } + } + need = height - (v + fm.bottom - fm.top - spanstartv); + if (need > 0) { + if (mVerticalAlignment == ALIGN_TOP) { + fm.bottom += need; + } else if (mVerticalAlignment == ALIGN_CENTER) { + fm.bottom += need / 2; + fm.top -= need / 2; + } else { + fm.top -= need; + } + } + if (end == ((Spanned) text).getSpanEnd(this)) { + sfm = null; + } +// LogUtils.e(fm, sfm); + } + } + + static class SpaceSpan extends ReplacementSpan { + + private final int width; + private final Paint paint = new Paint(); + + private SpaceSpan(final int width) { + this(width, Color.TRANSPARENT); + } + + private SpaceSpan(final int width, final int color) { + super(); + this.width = width; + paint.setColor(color); + paint.setStyle(Paint.Style.FILL); + } + + @Override + public int getSize(@NonNull final Paint paint, final CharSequence text, + @IntRange(from = 0) final int start, + @IntRange(from = 0) final int end, + @Nullable final Paint.FontMetricsInt fm) { + return width; + } + + @Override + public void draw(@NonNull final Canvas canvas, final CharSequence text, + @IntRange(from = 0) final int start, + @IntRange(from = 0) final int end, + final float x, final int top, final int y, final int bottom, + @NonNull final Paint paint) { + canvas.drawRect(x, top, x + width, bottom, this.paint); + } + } + + static class CustomQuoteSpan implements LeadingMarginSpan { + + private final int color; + private final int stripeWidth; + private final int gapWidth; + + private CustomQuoteSpan(final int color, final int stripeWidth, final int gapWidth) { + super(); + this.color = color; + this.stripeWidth = stripeWidth; + this.gapWidth = gapWidth; + } + + public int getLeadingMargin(final boolean first) { + return stripeWidth + gapWidth; + } + + public void drawLeadingMargin(final Canvas c, final Paint p, final int x, final int dir, + final int top, final int baseline, final int bottom, + final CharSequence text, final int start, final int end, + final boolean first, final Layout layout) { + Paint.Style style = p.getStyle(); + int color = p.getColor(); + + p.setStyle(Paint.Style.FILL); + p.setColor(this.color); + + c.drawRect(x, top, x + dir * stripeWidth, bottom, p); + + p.setStyle(style); + p.setColor(color); + } + } + + static class CustomBulletSpan implements LeadingMarginSpan { + + private final int color; + private final int radius; + private final int gapWidth; + + private Path sBulletPath = null; + + private CustomBulletSpan(final int color, final int radius, final int gapWidth) { + this.color = color; + this.radius = radius; + this.gapWidth = gapWidth; + } + + public int getLeadingMargin(final boolean first) { + return 2 * radius + gapWidth; + } + + public void drawLeadingMargin(final Canvas c, final Paint p, final int x, final int dir, + final int top, final int baseline, final int bottom, + final CharSequence text, final int start, final int end, + final boolean first, final Layout l) { + if (((Spanned) text).getSpanStart(this) == start) { + Paint.Style style = p.getStyle(); + int oldColor = 0; + oldColor = p.getColor(); + p.setColor(color); + p.setStyle(Paint.Style.FILL); + if (c.isHardwareAccelerated()) { + if (sBulletPath == null) { + sBulletPath = new Path(); + // Bullet is slightly better to avoid aliasing artifacts on mdpi devices. + sBulletPath.addCircle(0.0f, 0.0f, radius, Path.Direction.CW); + } + c.save(); + c.translate(x + dir * radius, (top + bottom) / 2.0f); + c.drawPath(sBulletPath, p); + c.restore(); + } else { + c.drawCircle(x + dir * radius, (top + bottom) / 2.0f, radius, p); + } + p.setColor(oldColor); + p.setStyle(style); + } + } + } + + @SuppressLint("ParcelCreator") + static class CustomTypefaceSpan extends TypefaceSpan { + + private final Typeface newType; + + private CustomTypefaceSpan(final Typeface type) { + super(""); + newType = type; + } + + @Override + public void updateDrawState(final TextPaint textPaint) { + apply(textPaint, newType); + } + + @Override + public void updateMeasureState(final TextPaint paint) { + apply(paint, newType); + } + + private void apply(final Paint paint, final Typeface tf) { + int oldStyle; + Typeface old = paint.getTypeface(); + if (old == null) { + oldStyle = 0; + } else { + oldStyle = old.getStyle(); + } + + int fake = oldStyle & ~tf.getStyle(); + if ((fake & Typeface.BOLD) != 0) { + paint.setFakeBoldText(true); + } + + if ((fake & Typeface.ITALIC) != 0) { + paint.setTextSkewX(-0.25f); + } + + paint.getShader(); + + paint.setTypeface(tf); + } + } + + static class CustomImageSpan extends CustomDynamicDrawableSpan { + private Drawable mDrawable; + private Uri mContentUri; + private int mResourceId; + + private CustomImageSpan(final Bitmap b, final int verticalAlignment) { + super(verticalAlignment); + mDrawable = new BitmapDrawable(AppUtils.getApp().getResources(), b); + mDrawable.setBounds( + 0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight() + ); + } + + private CustomImageSpan(final Drawable d, final int verticalAlignment) { + super(verticalAlignment); + mDrawable = d; + mDrawable.setBounds( + 0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight() + ); + } + + private CustomImageSpan(final Uri uri, final int verticalAlignment) { + super(verticalAlignment); + mContentUri = uri; + } + + private CustomImageSpan(@DrawableRes final int resourceId, final int verticalAlignment) { + super(verticalAlignment); + mResourceId = resourceId; + } + + @Override + public Drawable getDrawable() { + Drawable drawable = null; + if (mDrawable != null) { + drawable = mDrawable; + } else if (mContentUri != null) { + Bitmap bitmap; + try { + InputStream is = + AppUtils.getApp().getContentResolver().openInputStream(mContentUri); + bitmap = BitmapFactory.decodeStream(is); + drawable = new BitmapDrawable(AppUtils.getApp().getResources(), bitmap); + drawable.setBounds( + 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight() + ); + if (is != null) { + is.close(); + } + } catch (Exception e) { + Log.e("sms", "Failed to loaded content " + mContentUri, e); + } + } else { + try { + drawable = ContextCompat.getDrawable(AppUtils.getApp(), mResourceId); + drawable.setBounds( + 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight() + ); + } catch (Exception e) { + Log.e("sms", "Unable to find resource: " + mResourceId); + } + } + return drawable; + } + } + + static abstract class CustomDynamicDrawableSpan extends ReplacementSpan { + + static final int ALIGN_BOTTOM = 0; + + static final int ALIGN_BASELINE = 1; + + static final int ALIGN_CENTER = 2; + + static final int ALIGN_TOP = 3; + + final int mVerticalAlignment; + + private CustomDynamicDrawableSpan() { + mVerticalAlignment = ALIGN_BOTTOM; + } + + private CustomDynamicDrawableSpan(final int verticalAlignment) { + mVerticalAlignment = verticalAlignment; + } + + public abstract Drawable getDrawable(); + + @Override + public int getSize(@NonNull final Paint paint, final CharSequence text, + final int start, final int end, final Paint.FontMetricsInt fm) { + Drawable d = getCachedDrawable(); + Rect rect = d.getBounds(); + if (fm != null) { +// LogUtils.d("fm.top: " + fm.top, +// "fm.ascent: " + fm.ascent, +// "fm.descent: " + fm.descent, +// "fm.bottom: " + fm.bottom, +// "lineHeight: " + (fm.bottom - fm.top)); + int lineHeight = fm.bottom - fm.top; + if (lineHeight < rect.height()) { + if (mVerticalAlignment == ALIGN_TOP) { + fm.top = fm.top; + fm.bottom = rect.height() + fm.top; + } else if (mVerticalAlignment == ALIGN_CENTER) { + fm.top = -rect.height() / 2 - lineHeight / 4; + fm.bottom = rect.height() / 2 - lineHeight / 4; + } else { + fm.top = -rect.height() + fm.bottom; + fm.bottom = fm.bottom; + } + fm.ascent = fm.top; + fm.descent = fm.bottom; + } + } + return rect.right; + } + + @Override + public void draw(@NonNull final Canvas canvas, final CharSequence text, + final int start, final int end, final float x, + final int top, final int y, final int bottom, @NonNull final Paint paint) { + Drawable d = getCachedDrawable(); + Rect rect = d.getBounds(); + canvas.save(); + float transY; + int lineHeight = bottom - top; +// LogUtils.d("rectHeight: " + rect.height(), +// "lineHeight: " + (bottom - top)); + if (rect.height() < lineHeight) { + if (mVerticalAlignment == ALIGN_TOP) { + transY = top; + } else if (mVerticalAlignment == ALIGN_CENTER) { + transY = (bottom + top - rect.height()) / 2; + } else if (mVerticalAlignment == ALIGN_BASELINE) { + transY = y - rect.height(); + } else { + transY = bottom - rect.height(); + } + canvas.translate(x, transY); + } else { + canvas.translate(x, top); + } + d.draw(canvas); + canvas.restore(); + } + + private Drawable getCachedDrawable() { + WeakReference wr = mDrawableRef; + Drawable d = null; + if (wr != null) { + d = wr.get(); + } + if (d == null) { + d = getDrawable(); + mDrawableRef = new WeakReference<>(d); + } + return d; + } + + private WeakReference mDrawableRef; + } + + static class ShaderSpan extends CharacterStyle implements UpdateAppearance { + private Shader mShader; + + private ShaderSpan(final Shader shader) { + this.mShader = shader; + } + + @Override + public void updateDrawState(final TextPaint tp) { + tp.setShader(mShader); + } + } + + static class ShadowSpan extends CharacterStyle implements UpdateAppearance { + private float radius; + private float dx, dy; + private int shadowColor; + + private ShadowSpan(final float radius, + final float dx, + final float dy, + final int shadowColor) { + this.radius = radius; + this.dx = dx; + this.dy = dy; + this.shadowColor = shadowColor; + } + + @Override + public void updateDrawState(final TextPaint tp) { + tp.setShadowLayer(radius, dx, dy, shadowColor); + } + } + + private static class SerializableSpannableStringBuilder extends SpannableStringBuilder + implements Serializable { + + private static final long serialVersionUID = 4909567650765875771L; + } +} diff --git a/core/src/main/java/com/chwl/core/vip/VipModel.kt b/core/src/main/java/com/chwl/core/vip/VipModel.kt index bfcd76ae8..14ac64818 100644 --- a/core/src/main/java/com/chwl/core/vip/VipModel.kt +++ b/core/src/main/java/com/chwl/core/vip/VipModel.kt @@ -57,7 +57,7 @@ object VipModel : BaseModel() { * * @return */ - @GET("vip/getVipPageInfo") + @GET("vip/v2/getVipPageInfo") suspend fun getVipPageInfo(): ServiceResult diff --git a/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java b/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java index f6123dd84..35f1333f7 100644 --- a/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java +++ b/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java @@ -60,6 +60,8 @@ public interface IPlayerModel extends IModel{ void seekRecordingVolume(int volume); + void seekRecordingVolumeForTemp(int volume); + int getCurrentVolume(); int getCurrentRecordingVolume(); diff --git a/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java b/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java index 0568a9234..59c4cf635 100644 --- a/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java +++ b/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java @@ -284,6 +284,11 @@ public class PlayerModel extends BaseModel implements IPlayerModel { AudioEngineManager.get().adjustRecordingSignalVolume(volume); } + @Override + public void seekRecordingVolumeForTemp(int volume) { + AudioEngineManager.get().adjustRecordingSignalVolume(volume); + } + @Override public int getCurrentVolume() { return volume; diff --git a/library/src/main/java/com/chwl/library/utils/ResUtil.java b/library/src/main/java/com/chwl/library/utils/ResUtil.java index 91954d3c3..0cde4ef69 100644 --- a/library/src/main/java/com/chwl/library/utils/ResUtil.java +++ b/library/src/main/java/com/chwl/library/utils/ResUtil.java @@ -3,7 +3,10 @@ package com.chwl.library.utils; import android.app.Application; import android.content.Context; +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; import androidx.annotation.StringRes; +import androidx.core.content.ContextCompat; import androidx.core.util.Supplier; @@ -25,4 +28,24 @@ public class ResUtil { } return context.getString(resId); } + + public static String getString(@StringRes int resId,Object... vars) { + if (contextSupplier != null) { + Context context1 = contextSupplier.get(); + if (context1 != null) { + return context1.getString(resId,vars); + } + } + return context.getString(resId,vars); + } + + public static int getColor(@ColorRes int resId){ + if (contextSupplier != null) { + Context context1 = contextSupplier.get(); + if (context1 != null) { + return ContextCompat.getColor(context1, resId); + } + } + return ContextCompat.getColor(context, resId); + } } diff --git a/library/src/main/java/com/chwl/library/widget/SVGAView.kt b/library/src/main/java/com/chwl/library/widget/SVGAView.kt index 24a4c1990..fd8d33a57 100644 --- a/library/src/main/java/com/chwl/library/widget/SVGAView.kt +++ b/library/src/main/java/com/chwl/library/widget/SVGAView.kt @@ -9,6 +9,7 @@ import com.chwl.library.download.DownloadManager.download import com.chwl.library.download.DownloadRequest.Companion.build import com.chwl.library.download.DownloadTask import com.chwl.library.download.FileDownloadListener +import com.chwl.library.utils.LogUtil import com.chwl.library.utils.PathHelper import com.example.lib_utils.AppUtils import com.example.lib_utils.log.ILog @@ -19,6 +20,7 @@ import com.opensource.svgaplayer.SVGAParser.Companion.shareParser import com.opensource.svgaplayer.SVGAVideoEntity import java.io.BufferedInputStream import java.io.FileInputStream +import java.net.MalformedURLException class SVGAView : SVGAImageView, ILog { companion object { @@ -56,6 +58,25 @@ class SVGAView : SVGAImageView, ILog { defStyleAttr ) + fun loadFile(name: String) { + try { + SVGAParser.shareParser() + .decodeFromAssets(name, object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + val drawable = SVGADrawable(videoItem) + setImageDrawable(drawable) + startAnimation() + } + + override fun onError() { + LogUtil.print("onError") + } + }) + } catch (e: MalformedURLException) { + + } + } + fun loadUrl(url: String?) { logD("loadUrl() url:$url") if (url.isNullOrEmpty()) { diff --git a/library/src/module_common/java/com/chwl/library/common/base/BaseLinearLayout.java b/library/src/module_common/java/com/chwl/library/common/base/BaseLinearLayout.java index 8ac9cd1bb..9c2a138f3 100644 --- a/library/src/module_common/java/com/chwl/library/common/base/BaseLinearLayout.java +++ b/library/src/module_common/java/com/chwl/library/common/base/BaseLinearLayout.java @@ -39,7 +39,7 @@ public abstract class BaseLinearLayout extends LinearLay } private void init() { - mViewBinding = ViewBindingUtil.inflateWithView(this, LayoutInflater.from(getContext()), this); + mViewBinding = ViewBindingUtil.inflateWithView(this, LayoutInflater.from(getContext()), this,true); BaseViewTag.registerLifecycle(this); findView(); } diff --git a/library/src/module_common/java/com/chwl/library/common/util/ViewBindingUtil.kt b/library/src/module_common/java/com/chwl/library/common/util/ViewBindingUtil.kt index 97be55586..62296ed96 100644 --- a/library/src/module_common/java/com/chwl/library/common/util/ViewBindingUtil.kt +++ b/library/src/module_common/java/com/chwl/library/common/util/ViewBindingUtil.kt @@ -40,11 +40,12 @@ object ViewBindingUtil { genericOwner: Any, layoutInflater: LayoutInflater, parent: ViewGroup?, + isAttach:Boolean = true ): VB? = withGenericBindingClass(genericOwner) { clazz -> var vb = try { clazz.getMethod( "inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java - ).invoke(null, layoutInflater, parent, true) as? VB + ).invoke(null, layoutInflater, parent, isAttach) as? VB } catch (e: Exception) { //merge 标签会找不到 LibLogger.debug( diff --git a/libs/lib_utils/src/main/java/com/example/lib_utils/ktx/ResourcesKtx.kt b/libs/lib_utils/src/main/java/com/example/lib_utils/ktx/ResourcesKtx.kt index 3e5f51c82..d86d9bed8 100644 --- a/libs/lib_utils/src/main/java/com/example/lib_utils/ktx/ResourcesKtx.kt +++ b/libs/lib_utils/src/main/java/com/example/lib_utils/ktx/ResourcesKtx.kt @@ -73,21 +73,21 @@ fun Any.getStringById(@StringRes stringResId: Int): String { /** * 获取字符串资源 */ -fun Int.toStringRes(): String { +fun Int.getString(): String { return AppUtils.getApp().getString(this) } /** * 获取资源drawable * */ -fun Int.toDrawableRes(): Drawable? { +fun Int.getDrawable(): Drawable? { return ContextCompat.getDrawable(AppUtils.getApp(), this) } /** * 获取资源color * */ -fun Int.toColorRes(): Int { +fun Int.getColor(): Int { return ContextCompat.getColor(AppUtils.getApp(), this) } diff --git a/modules/module_base/src/main/res/drawable/base_shape_border_theme_23dp.xml b/modules/module_base/src/main/res/drawable/base_shape_border_theme_23dp.xml index f543adaa2..c1c85e01a 100644 --- a/modules/module_base/src/main/res/drawable/base_shape_border_theme_23dp.xml +++ b/modules/module_base/src/main/res/drawable/base_shape_border_theme_23dp.xml @@ -1,24 +1,6 @@ - + + + - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/modules/module_base/src/main/res/drawable/base_shape_theme_23dp.xml b/modules/module_base/src/main/res/drawable/base_shape_theme_23dp.xml index 32d95f99d..9e1572e49 100644 --- a/modules/module_base/src/main/res/drawable/base_shape_theme_23dp.xml +++ b/modules/module_base/src/main/res/drawable/base_shape_theme_23dp.xml @@ -1,6 +1,6 @@ - - + + \ No newline at end of file diff --git a/modules/module_base/src/main/res/drawable/user_info_follow_ed.xml b/modules/module_base/src/main/res/drawable/user_info_follow_ed.xml new file mode 100644 index 000000000..1d64d9b51 --- /dev/null +++ b/modules/module_base/src/main/res/drawable/user_info_follow_ed.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/modules/module_base/src/main/res/drawable/user_info_follow_n.xml b/modules/module_base/src/main/res/drawable/user_info_follow_n.xml new file mode 100644 index 000000000..9e1572e49 --- /dev/null +++ b/modules/module_base/src/main/res/drawable/user_info_follow_n.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file