diff --git a/app/src/main/assets/svga/all_fairy.svga b/app/src/main/assets/svga/all_fairy.svga new file mode 100644 index 000000000..9307d13a3 Binary files /dev/null and b/app/src/main/assets/svga/all_fairy.svga differ diff --git a/app/src/main/java/com/mango/moshen/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/mango/moshen/avroom/activity/AVRoomActivity.java index ed0c0cb46..ab25f0403 100644 --- a/app/src/main/java/com/mango/moshen/avroom/activity/AVRoomActivity.java +++ b/app/src/main/java/com/mango/moshen/avroom/activity/AVRoomActivity.java @@ -36,6 +36,7 @@ import androidx.viewpager2.widget.ViewPager2; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.mango.core.initial.InitialModel; import com.netease.nim.uikit.StatusBarUtil; import com.netease.nimlib.sdk.NIMSDK; import com.netease.nimlib.sdk.Observer; @@ -408,7 +409,7 @@ public class AVRoomActivity extends BaseMvpActivity { HomeFairyActivity.start(context); dismiss(); diff --git a/app/src/main/java/com/mango/moshen/avroom/widget/BottomView.java b/app/src/main/java/com/mango/moshen/avroom/widget/BottomView.java index c89bc693f..9aae40a73 100644 --- a/app/src/main/java/com/mango/moshen/avroom/widget/BottomView.java +++ b/app/src/main/java/com/mango/moshen/avroom/widget/BottomView.java @@ -452,6 +452,15 @@ public class BottomView extends FrameLayout implements View.OnClickListener { }); } } + if (GoldBoxHelper.isShowFairy()) { + showPlayEntrance = true; + if (DemoCache.readShowFairyTip()) { + iconPlay.post(() -> { + showPlayTipsPopup(iconPlay); + DemoCache.saveShowFairyTip(false); + }); + } + } iconPlay.setVisibility(showPlayEntrance ? VISIBLE : GONE); } diff --git a/app/src/main/java/com/mango/moshen/avroom/widget/MessageView.java b/app/src/main/java/com/mango/moshen/avroom/widget/MessageView.java index 7e6c814c3..11326048e 100644 --- a/app/src/main/java/com/mango/moshen/avroom/widget/MessageView.java +++ b/app/src/main/java/com/mango/moshen/avroom/widget/MessageView.java @@ -1,9 +1,21 @@ package com.mango.moshen.avroom.widget; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_FAIRY; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GIFT_COMPOUND; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_KITCHEN; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_RED_PACKAGE; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_BOX_ME; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CONVERT_L1; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CONVERT_L2; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CONVERT_L3; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_BALL_L1; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_BALL_L2; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_BALL_L3; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L1; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L2; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L3; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L4; +import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L5; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_FANS_TEAM_JOIN; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_GIFT_COMPOUND; import static com.mango.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_WISH_LIST; @@ -42,9 +54,14 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; +import com.mango.core.im.custom.bean.FairyMsgAttachment; import com.mango.core.im.custom.bean.RoomKitchenAttachment; import com.mango.core.im.custom.bean.WishListAttachment; import com.mango.core.room.wishlist.WishListModel; +import com.mango.core.treasurefairy.FairyMsgInfo; +import com.mango.core.utils.StringExtensionKt; +import com.mango.moshen.treasure_box.widget.GoldBoxHelper; +import com.mango.moshen.treasurefairy.HomeFairyActivity; import com.mango.moshen.utils.MsgBuilder; import com.netease.nim.uikit.business.uinfo.UserInfoHelper; import com.netease.nim.uikit.common.ui.span.RadiusBackgroundSpan; @@ -984,6 +1001,8 @@ public class MessageView extends FrameLayout { } } else if (first == CUSTOM_MSG_KITCHEN) { setKitchenMsg(chatRoomMessage, tvContent); + } else if (first == CUSTOM_MSG_FAIRY) { + setFairyMsg(chatRoomMessage, tvContent); } else { tvContent.setTextColor(Color.WHITE); tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); @@ -997,6 +1016,74 @@ public class MessageView extends FrameLayout { } } + private void setFairyMsg(ChatRoomMessage chatRoomMessage, TextView tvContent) { + if (chatRoomMessage.getAttachment() instanceof FairyMsgAttachment) { + FairyMsgAttachment attachment = (FairyMsgAttachment) chatRoomMessage.getAttachment(); + FairyMsgInfo fairyMsgInfo = attachment.getFairyMsgInfo(); + if (fairyMsgInfo == null) return; + SpannableBuilder builder = null; + switch (attachment.getSecond()) { + case CUSTOM_MSG_SUB_DRAW_GIFT_L1: + case CUSTOM_MSG_SUB_DRAW_GIFT_L2: + case CUSTOM_MSG_SUB_DRAW_BALL_L1: + builder = builderDrawMsg(tvContent, fairyMsgInfo, "厉害了!"); + break; + case CUSTOM_MSG_SUB_DRAW_GIFT_L3: + case CUSTOM_MSG_SUB_DRAW_GIFT_L4: + case CUSTOM_MSG_SUB_DRAW_GIFT_L5: + case CUSTOM_MSG_SUB_DRAW_BALL_L2: + case CUSTOM_MSG_SUB_DRAW_BALL_L3: + builder = builderDrawMsg(tvContent, fairyMsgInfo, "好运爆棚!"); + break; + case CUSTOM_MSG_SUB_CONVERT_L1: + builder = builderConvertMsg(tvContent, fairyMsgInfo, "初级召唤"); + break; + case CUSTOM_MSG_SUB_CONVERT_L2: + builder = builderConvertMsg(tvContent, fairyMsgInfo, "史诗召唤"); + break; + case CUSTOM_MSG_SUB_CONVERT_L3: + builder = builderConvertMsg(tvContent, fairyMsgInfo, "传说召唤"); + break; + } + + if (builder != null) { + if (GoldBoxHelper.isShowFairy()) { + builder.append(" 去参加!", new OriginalDrawStatusClickSpan(Color.parseColor("#FFBC51")) { + @Override + public void onClick(@NonNull View widget) { + + } + }); + tvContent.setOnClickListener(v -> HomeFairyActivity.start(mContext)); + } else { + tvContent.setOnClickListener(null); + } + tvContent.setText(builder.build()); + } + } + + } + + private SpannableBuilder builderConvertMsg(TextView textView, @NonNull FairyMsgInfo fairyMsgInfo, String type) { + return new SpannableBuilder(textView) + .append("厉害了!", new ForegroundColorSpan(whiteColor)) + .append(StringExtensionKt.subAndReplaceDot(fairyMsgInfo.getNick(), 7), new ForegroundColorSpan(roomTipNickColor)) + .append("在夺宝精灵中 " + type, new ForegroundColorSpan(whiteColor)) + .append(fairyMsgInfo.getRewardShowValue() + "钻" + fairyMsgInfo.getRewardName(), new ForegroundColorSpan(roomTipColor)); + } + + private SpannableBuilder builderDrawMsg(TextView textView, @NonNull FairyMsgInfo fairyMsgInfo, String desc) { + SpannableBuilder builder = new SpannableBuilder(textView) + .append(desc, new ForegroundColorSpan(whiteColor)) + .append(StringExtensionKt.subAndReplaceDot(fairyMsgInfo.getNick(), 7), new ForegroundColorSpan(roomTipNickColor)) + .append(" 在夺宝精灵中获得 ", new ForegroundColorSpan(whiteColor)) + .append(fairyMsgInfo.getRewardName(), new ForegroundColorSpan(Color.WHITE)); + if (fairyMsgInfo.getRewardNum() > 1) { + builder.append(" x" + fairyMsgInfo.getRewardNum(), new ForegroundColorSpan(roomTipNickColor)); + } + return builder; + } + private void setKitchenMsg(ChatRoomMessage chatRoomMessage, TextView tvContent) { if (chatRoomMessage.getAttachment() instanceof RoomKitchenAttachment) { RoomKitchenAttachment attachment = (RoomKitchenAttachment) chatRoomMessage.getAttachment(); diff --git a/app/src/main/java/com/mango/moshen/avroom/widget/RoomEffectView.kt b/app/src/main/java/com/mango/moshen/avroom/widget/RoomEffectView.kt index 1c1a4f94e..bd888ce71 100644 --- a/app/src/main/java/com/mango/moshen/avroom/widget/RoomEffectView.kt +++ b/app/src/main/java/com/mango/moshen/avroom/widget/RoomEffectView.kt @@ -132,6 +132,10 @@ class RoomEffectView @JvmOverloads constructor( private var kitchenSVGADisposable: Disposable? = null private val kitchenMessagesSVGA: MutableList by lazy { ArrayList() } + private var fairyAnimation: Animation? = null + private var fairyDisposable: Disposable? = null + private val fairyMessages: MutableList> by lazy { ArrayList() } + private var isSvgaPlaying = false private var isHideCarEffect = false @@ -228,6 +232,14 @@ class RoomEffectView @JvmOverloads constructor( } RoomEvent.KITCHEN_ROOM -> addKitchenNotify(roomEvent.chatRoomMessage) RoomEvent.KITCHEN_ALL_ROOM -> addKitchenNotifyBySVGA(roomEvent.chatRoomMessage) + RoomEvent.FAIRY_DRAW_GIFT_L4, + RoomEvent.FAIRY_DRAW_GIFT_L5, + RoomEvent.FAIRY_CONVERT_L1, + RoomEvent.FAIRY_CONVERT_L2, + RoomEvent.FAIRY_CONVERT_L3 -> addFairyNotify( + roomEvent.event, + roomEvent.chatRoomMessage + ) else -> {} } } @@ -614,7 +626,8 @@ class RoomEffectView @JvmOverloads constructor( private fun showKitchenNotify(chatRoomMessage: ChatRoomMessage) { val attachment = chatRoomMessage.attachment as RoomKitchenAttachment val textView = - LayoutInflater.from(mContext).inflate(R.layout.layout_room_kitchen_notify, null) as TextView + LayoutInflater.from(mContext) + .inflate(R.layout.layout_room_kitchen_notify, null) as TextView val text = MsgBuilder.buildKitchenMsg(attachment) textView.text = text.build() MsgBuilder.setUpKitchenClick(textView, attachment.skipUrl, attachment.needLevel) @@ -627,6 +640,106 @@ class RoomEffectView @JvmOverloads constructor( ) } + /** + * 幸运池飘屏 + * + * @param chatRoomMessage + */ + private fun addFairyNotify(roomEvent: Int, chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + fairyMessages.add(Pair(roomEvent, chatRoomMessage)) + if (fairyDisposable == null || fairyMessages.size == 1) { + fairyDisposable = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { fairyMessages.size > 0 } + .subscribe { + showFairyNotify( + fairyMessages.removeAt(0) + ) + } + } + } + + private fun showFairyNotify(pair: Pair) { + val attachment = pair.second.attachment as FairyMsgAttachment + when (pair.first) { + RoomEvent.FAIRY_DRAW_GIFT_L4, + RoomEvent.FAIRY_CONVERT_L1, + RoomEvent.FAIRY_CONVERT_L2 -> { + val textView = + LayoutInflater.from(mContext) + .inflate(R.layout.layout_room_fairy_notify, null) as TextView + val text = MsgBuilder.buildFairyMsg(pair.first, attachment) + textView.text = text.build() + kitchenAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + binding.flFairyNotify.addView(textView) + textView.startAnimation(kitchenAnimation) + binding.flFairyNotify.postDelayed( + { binding.flFairyNotify.removeView(textView) }, + SHOW_TIME.toLong() + ) + } + RoomEvent.FAIRY_DRAW_GIFT_L5, + RoomEvent.FAIRY_CONVERT_L3 -> { + showFairyNotifyBySVGA(pair) + } + } + + } + + private fun showFairyNotifyBySVGA(pair: Pair) { + val attachment = pair.second.attachment as FairyMsgAttachment + val text = MsgBuilder.buildFairyMsg(pair.first, attachment) + val svgaImageView = SVGAImageView(mContext) + svgaImageView.loops = 1 + svgaImageView.clearsAfterStop = true + val params = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + svgaImageView.layoutParams = params + svgaImageView.callback = object : SimpleSvgaCallback() { + override fun onFinished() { + binding.flFairyNotify.post { + binding.flFairyNotify.removeView( + svgaImageView + ) + } + } + } + binding.flFairyNotify.addView(svgaImageView) + shareParser().decodeFromAssets( + "svga/all_fairy.svga", + object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: 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 + ), "touming_text_name" + ) + val drawable = SVGADrawable(videoItem, dynamicEntity) + svgaImageView.setImageDrawable(drawable) + svgaImageView.startAnimation() + } + + override fun onError() {} + }, + null + ) + } + + /** * 幸运池飘屏 五级 SVGA背景的 * diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt b/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt index 06086476f..36a88731b 100644 --- a/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt +++ b/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt @@ -315,6 +315,10 @@ class FairyViewModel : BaseViewModel() { fun oneKeyAdd(fairyInfos: List) { val compoundFairyInfos = _compoundFairyInfosLiveData.value ?: SparseArray() var needNum = 3 - compoundFairyInfos.size() + if (needNum == 0) { + "试炼炉已满!".toast() + return + } fairyInfos.forEach { while (it.elfNum - it.selectedNum > 0 && needNum > 0) { it.selectedNum++ diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/dialog/ExchangeFairyResultDialog.kt b/app/src/main/java/com/mango/moshen/treasurefairy/dialog/ExchangeFairyResultDialog.kt index 1f5ed1272..00eb455f8 100644 --- a/app/src/main/java/com/mango/moshen/treasurefairy/dialog/ExchangeFairyResultDialog.kt +++ b/app/src/main/java/com/mango/moshen/treasurefairy/dialog/ExchangeFairyResultDialog.kt @@ -7,12 +7,10 @@ import android.view.WindowManager import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import com.mango.core.treasurefairy.ExchangeGiftInfo -import com.mango.core.treasurefairy.FairyInfo import com.mango.moshen.base.BaseDialog import com.mango.moshen.databinding.TreasureFairyDialogTestFairyResultBinding import com.mango.moshen.treasurefairy.FairyViewModel import com.mango.moshen.treasurefairy.adapter.ExchangeFairyResultAdapter -import com.mango.moshen.treasurefairy.adapter.TestFairyResultAdapter import com.mango.moshen.ui.utils.RVDelegate class ExchangeFairyResultDialog : BaseDialog() { @@ -40,6 +38,10 @@ class ExchangeFairyResultDialog : BaseDialog() @@ -50,7 +52,7 @@ class ExchangeFairyResultDialog : BaseDialog() .setAdapter(prizeAdapter) @@ -48,7 +48,7 @@ class TestFairyResultDialog : BaseDialog { + builder.append("好运爆棚!", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + fairyMsgInfo.nick.sub(6), + ForegroundColorSpan("#EC4613".toColorInt()) + ) + .append(" 在夺宝精灵中获得 ", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + fairyMsgInfo.rewardName, + ForegroundColorSpan("#EC4613".toColorInt()) + ) + } + + RoomEvent.FAIRY_CONVERT_L1 -> { + builder.append("厉害了!", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + fairyMsgInfo.nick.sub(6), + ForegroundColorSpan("#EC4613".toColorInt()) + ) + .append(" 在夺宝精灵中初级召唤 ", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + "${fairyMsgInfo.rewardShowValue}钻${fairyMsgInfo.rewardName}", + ForegroundColorSpan("#EC4613".toColorInt()) + ) + } + RoomEvent.FAIRY_CONVERT_L2 -> { + builder.append("厉害了!", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + fairyMsgInfo.nick.sub(6), + ForegroundColorSpan("#EC4613".toColorInt()) + ) + .append(" 在夺宝精灵中史诗召唤 ", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + "${fairyMsgInfo.rewardShowValue}钻${fairyMsgInfo.rewardName}", + ForegroundColorSpan("#EC4613".toColorInt()) + ) + } + + RoomEvent.FAIRY_CONVERT_L3 -> { + builder.append("厉害了!", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + fairyMsgInfo.nick.sub(6), + ForegroundColorSpan("#EC4613".toColorInt()) + ) + .append(" 在夺宝精灵中传说召唤 ", ForegroundColorSpan("#8C4700".toColorInt())) + .append( + "${fairyMsgInfo.rewardShowValue}钻${fairyMsgInfo.rewardName}", + ForegroundColorSpan("#EC4613".toColorInt()) + ) + } + } + return builder + + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_notify.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_notify.png new file mode 100644 index 000000000..05ebaeb25 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_notify.png differ diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_legend.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_legend.png new file mode 100644 index 000000000..0f3b2d5e8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_legend.png differ diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.png index 2fa47c820..347519fc1 100644 Binary files a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.png and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.png differ diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.png index 9e33f37d7..239cb2aad 100644 Binary files a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.png and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.png differ diff --git a/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml b/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml index 8be12338a..3fe25b59c 100644 --- a/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml +++ b/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml @@ -5,4 +5,5 @@ android:angle="90" android:endColor="#00B9AF" android:startColor="#006E7C" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_room_play.xml b/app/src/main/res/layout/dialog_room_play.xml index 45c7594fd..20a62fb04 100644 --- a/app/src/main/res/layout/dialog_room_play.xml +++ b/app/src/main/res/layout/dialog_room_play.xml @@ -47,7 +47,7 @@ android:id="@+id/iv_fairy" android:layout_width="64dp" android:layout_height="64dp" - android:src="@drawable/ic_radish_entrance" /> + android:src="@drawable/ic_fairy_entrance" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml b/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml index 11fad13ba..5f089bfca 100644 --- a/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml +++ b/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml @@ -97,7 +97,8 @@ android:background="@drawable/treasure_fairy_bg_test_fairy_record" android:gravity="center" android:includeFontPadding="false" - android:lineSpacingExtra="-5dp" + android:lineSpacingExtra="0dp" + android:lineSpacingMultiplier="0.8" android:paddingStart="2dp" android:paddingEnd="2dp" android:text="兑换记录" diff --git a/app/src/main/res/layout/treasure_fairy_dialog_forest.xml b/app/src/main/res/layout/treasure_fairy_dialog_forest.xml index 78c6f4815..4012aa17b 100644 --- a/app/src/main/res/layout/treasure_fairy_dialog_forest.xml +++ b/app/src/main/res/layout/treasure_fairy_dialog_forest.xml @@ -79,36 +79,34 @@ android:id="@+id/view_bg_forest_base" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginTop="8dp" android:layout_marginBottom="1dp" android:background="@drawable/treasure_fairy_bg_forest_base" app:layout_constraintBottom_toBottomOf="@id/view_bg_forest" app:layout_constraintDimensionRatio="678:522" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@id/view_bg_forest" /> + app:layout_constraintWidth_percent="0.89" /> + app:layout_constraintTop_toBottomOf="@id/iv_record" + app:layout_constraintWidth_percent="0.97" /> + app:layout_constraintBottom_toBottomOf="@id/view_bg_forest_base" + app:layout_constraintEnd_toEndOf="@id/view_bg_forest_base" + app:layout_constraintStart_toStartOf="@id/view_bg_forest_base" + app:layout_constraintTop_toTopOf="@id/view_bg_forest_base" /> + app:layout_constraintWidth_percent="0.70" /> + app:layout_constraintVertical_bias="0.325" + app:layout_constraintWidth_percent="0.40" /> - + android:background="@drawable/shape_006e7c_to_00b9af"> + + + + - + android:background="@drawable/shape_006e7c_to_00b9af"> + + + + diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml index d418d8487..b0e34d389 100644 --- a/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml +++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml @@ -39,14 +39,14 @@ android:id="@+id/tv_fairy_num" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="13dp" + android:layout_marginTop="9dp" android:ellipsize="end" android:gravity="center" android:includeFontPadding="false" android:maxLines="1" android:text="精灵球" android:textColor="#59FDFF" - android:textSize="11dp" + android:textSize="12dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_fairy_name" /> diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml index f367a3236..e5d1549f0 100644 --- a/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml +++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml @@ -81,14 +81,14 @@ android:id="@+id/tv_fairy_num" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="13dp" + android:layout_marginTop="9dp" android:ellipsize="end" android:gravity="center" android:includeFontPadding="false" android:maxLines="1" android:text="精灵球" android:textColor="#FFE8AA" - android:textSize="11dp" + android:textSize="12dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_fairy_name" /> diff --git a/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml b/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml index 1102e57de..3af9d0be8 100644 --- a/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml +++ b/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml @@ -1,5 +1,5 @@ - + android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintDimensionRatio="132:156" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> @@ -49,5 +54,5 @@ android:textSize="11sp" /> - + diff --git a/app/src/module_treasure_box/java/com/mango/moshen/treasure_box/widget/GoldBoxHelper.java b/app/src/module_treasure_box/java/com/mango/moshen/treasure_box/widget/GoldBoxHelper.java index 75af27ee5..067aa834e 100644 --- a/app/src/module_treasure_box/java/com/mango/moshen/treasure_box/widget/GoldBoxHelper.java +++ b/app/src/module_treasure_box/java/com/mango/moshen/treasure_box/widget/GoldBoxHelper.java @@ -5,6 +5,7 @@ import android.content.Context; import androidx.annotation.Nullable; import com.mango.core.initial.InitialModel; +import com.mango.core.initial.bean.FairyOpenInfo; import com.mango.core.initial.bean.InitInfo; import com.mango.core.level.UserLevelVo; import com.mango.core.manager.AvRoomDataManager; @@ -64,5 +65,12 @@ public class GoldBoxHelper { return userInfo.getUserLevelVo().getExperLevelSeq() >= initInfo.getLinearlyPoolOpenLevel(); } + public static boolean isShowFairy() { + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + FairyOpenInfo fairyOpenInfo = InitialModel.get().getFairyOpenInfo(); + if (fairyOpenInfo == null || userInfo == null) return false; + return userInfo.getUserLevelVo().getExperLevelSeq() >= fairyOpenInfo.getLevelLimit(); + } + } diff --git a/app/src/module_treasure_box/res/drawable-xhdpi/ic_fairy_entrance.png b/app/src/module_treasure_box/res/drawable-xhdpi/ic_fairy_entrance.png new file mode 100644 index 000000000..244287a57 Binary files /dev/null and b/app/src/module_treasure_box/res/drawable-xhdpi/ic_fairy_entrance.png differ diff --git a/core/src/diff_src_erban/java/com/mango/core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/mango/core/manager/IMNetEaseManager.java index 6ddcac0e4..dc35b3f12 100644 --- a/core/src/diff_src_erban/java/com/mango/core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/mango/core/manager/IMNetEaseManager.java @@ -1424,6 +1424,29 @@ public final class IMNetEaseManager { noticeRoomEvent(msg, RoomEvent.KITCHEN_ALL_ROOM); addMessages(msg); } + break; + case CUSTOM_MSG_FAIRY: + if (second != CUSTOM_MSG_SUB_FAIRY_SEND && second != CUSTOM_MSG_SUB_FAIRY_ASK_FOR) { + addMessages(msg); + } + switch (second) { + case CUSTOM_MSG_SUB_DRAW_GIFT_L4: + noticeRoomEvent(msg, RoomEvent.FAIRY_DRAW_GIFT_L4); + break; + case CUSTOM_MSG_SUB_DRAW_GIFT_L5: + noticeRoomEvent(msg, RoomEvent.FAIRY_DRAW_GIFT_L5); + break; + case CUSTOM_MSG_SUB_CONVERT_L1: + noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L1); + break; + case CUSTOM_MSG_SUB_CONVERT_L2: + noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L2); + break; + case CUSTOM_MSG_SUB_CONVERT_L3: + noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L3); + break; + } + break; default: break; diff --git a/core/src/diff_src_erban/java/com/mango/core/manager/trtc/TRtcEngineHandler.java b/core/src/diff_src_erban/java/com/mango/core/manager/trtc/TRtcEngineHandler.java index cc3a1f744..b6d8e6420 100644 --- a/core/src/diff_src_erban/java/com/mango/core/manager/trtc/TRtcEngineHandler.java +++ b/core/src/diff_src_erban/java/com/mango/core/manager/trtc/TRtcEngineHandler.java @@ -59,6 +59,7 @@ public class TRtcEngineHandler extends Handler { for (IRtcEngineEventHandler.AudioVolumeInfo speaker : speakers) { // 0 代表的是房主,其他代表的是uid long uid = speaker.uid == 0 ? rtcEngineManager.uid : speaker.uid; + if (speaker.volume < 5) continue; int micPosition = AvRoomDataManager.get().getMicPosition(uid); // 如果是房主的话,并且房主的mic位置没有的啊,则把房主的位置设置为-1(兼容ios轻聊房光晕) if (uid == AvRoomDataManager.get().mCurrentRoomInfo.getUid() && diff --git a/core/src/main/java/com/mango/core/DemoCache.java b/core/src/main/java/com/mango/core/DemoCache.java index 1f233907f..4d8b7f92f 100644 --- a/core/src/main/java/com/mango/core/DemoCache.java +++ b/core/src/main/java/com/mango/core/DemoCache.java @@ -62,6 +62,7 @@ public class DemoCache { private static final String KEY_PM_MODE = "key_pm_mode"; private static final String KEY_SHOW_BOX_TIP = "key_show_box_tip"; private static final String KEY_SHOW_RADISH_TIP = "key_show_radish_tip"; + private static final String KEY_SHOW_FAIRY_TIP = "key_show_fairy_tip"; private static final String KEY_NEW_GIFT_TYPE_TIP = "key_new_gift_type_tip"; private static final String KEY_NEW_GIFT_TYPE_TIP_INDICATOR = "key_new_gift_type_tip_indicator"; @@ -369,6 +370,13 @@ public class DemoCache { return SettingsPref.instance().getBoolean(KEY_SHOW_RADISH_TIP + AuthModel.get().getCurrentUid(), true); } + public static void saveShowFairyTip(boolean value) { + SettingsPref.instance().putBoolean(KEY_SHOW_FAIRY_TIP + AuthModel.get().getCurrentUid(), value); + } + + public static boolean readShowFairyTip() { + return SettingsPref.instance().getBoolean(KEY_SHOW_FAIRY_TIP + AuthModel.get().getCurrentUid(), true); + } public static void saveNewGiftTypeTip(boolean value) { SettingsPref.instance().putBoolean(KEY_NEW_GIFT_TYPE_TIP, value); } diff --git a/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachParser.java index 37679966d..fbdfb6002 100644 --- a/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachParser.java +++ b/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachParser.java @@ -612,8 +612,9 @@ public class CustomAttachParser implements MsgAttachmentParser { if (second == CUSTOM_MSG_SUB_FAIRY_SEND || second == CUSTOM_MSG_SUB_FAIRY_ASK_FOR) { attachment = new FairySendAttachment(first, second); + } else { + attachment = new FairyMsgAttachment(first, second); } - break; default: LogUtils.e("未定义的first,请现在CustomAttachParser中解析first=" + first + " second=" + second); diff --git a/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachment.java index 7a17c6161..ba8cc234b 100644 --- a/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachment.java +++ b/core/src/main/java/com/mango/core/im/custom/bean/CustomAttachment.java @@ -436,6 +436,20 @@ public class CustomAttachment implements MsgAttachment { public static final int CUSTOM_MSG_FAIRY = 97; // 夺宝精灵 public static final int CUSTOM_MSG_SUB_FAIRY_SEND = 9701; // 赠送小精灵 public static final int CUSTOM_MSG_SUB_FAIRY_ASK_FOR = 9702; // 索要小精灵 + + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L1 = 9711; // 抽奖L1礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L2 = 9712; // 抽奖L2礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L3 = 9713; // 抽奖L3礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L4 = 9714; // 抽奖L4礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L5 = 9715; // 抽奖L5礼物 + + public static final int CUSTOM_MSG_SUB_DRAW_BALL_L1 = 9721; // 抽奖L1精灵球 + public static final int CUSTOM_MSG_SUB_DRAW_BALL_L2 = 9722; // 抽奖L2精灵球 + public static final int CUSTOM_MSG_SUB_DRAW_BALL_L3 = 9723; // 抽奖L3精灵球 + + public static final int CUSTOM_MSG_SUB_CONVERT_L1 = 9731; // 召唤L1 + public static final int CUSTOM_MSG_SUB_CONVERT_L2 = 9732; // 召唤L2 + public static final int CUSTOM_MSG_SUB_CONVERT_L3 = 9733; // 召唤L3 /** * 自定义消息附件的类型,根据该字段区分不同的自定义消息 */ diff --git a/core/src/main/java/com/mango/core/im/custom/bean/FairyMsgAttachment.java b/core/src/main/java/com/mango/core/im/custom/bean/FairyMsgAttachment.java new file mode 100644 index 000000000..47e55acdb --- /dev/null +++ b/core/src/main/java/com/mango/core/im/custom/bean/FairyMsgAttachment.java @@ -0,0 +1,36 @@ +package com.mango.core.im.custom.bean; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.mango.core.treasurefairy.FairyMsgInfo; + +/** + * Created by chenran on 2017/10/4. + */ + +public class FairyMsgAttachment extends CustomAttachment { + private FairyMsgInfo fairyMsgInfo; + + public FairyMsgAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject jsonObject) { + fairyMsgInfo = new Gson().fromJson(jsonObject.toJSONString(), FairyMsgInfo.class); + } + + public FairyMsgInfo getFairyMsgInfo() { + return fairyMsgInfo; + } + + public void setFairyMsgInfo(FairyMsgInfo fairyMsgInfo) { + this.fairyMsgInfo = fairyMsgInfo; + } + + @Override + protected JSONObject packData() { + return null; + } + +} diff --git a/core/src/main/java/com/mango/core/initial/IInitialModel.java b/core/src/main/java/com/mango/core/initial/IInitialModel.java index 0187e9ab4..2316aafc5 100644 --- a/core/src/main/java/com/mango/core/initial/IInitialModel.java +++ b/core/src/main/java/com/mango/core/initial/IInitialModel.java @@ -10,6 +10,7 @@ import com.mango.core.base.IModel; import com.mango.core.bean.response.ServiceResult; import com.mango.core.home.bean.MainTabInfo; import com.mango.core.initial.bean.BoxInfo; +import com.mango.core.initial.bean.FairyOpenInfo; import com.mango.core.initial.bean.InitInfo; import java.util.List; @@ -52,6 +53,11 @@ public interface IInitialModel extends IModel { long getTimeDiff(); + Single requestFairyOpenInfo(); + + @Nullable + FairyOpenInfo getFairyOpenInfo(); + int getFindNewbieCharmLevel(); int getTeenagerMode(); diff --git a/core/src/main/java/com/mango/core/initial/InitialModel.java b/core/src/main/java/com/mango/core/initial/InitialModel.java index 9fc5d6abf..16065336e 100644 --- a/core/src/main/java/com/mango/core/initial/InitialModel.java +++ b/core/src/main/java/com/mango/core/initial/InitialModel.java @@ -14,6 +14,8 @@ import androidx.lifecycle.MutableLiveData; import com.bumptech.glide.request.FutureTarget; import com.bumptech.glide.request.target.Target; +import com.mango.core.auth.event.LogoutEvent; +import com.mango.core.initial.bean.FairyOpenInfo; import com.mango.core.user.event.LoadLoginUserInfoEvent; import com.netease.nim.uikit.support.glide.GlideApp; import com.mango.core.DemoCache; @@ -93,6 +95,12 @@ public class InitialModel extends BaseModel implements IInitialModel { */ private BoxInfo boxInfo; + /** + * 宝箱开关,等级限制 + */ + @Nullable + private FairyOpenInfo fairyOpenInfo; + /** * 记录服务器与本地的时间差 */ @@ -196,6 +204,12 @@ public class InitialModel extends BaseModel implements IInitialModel { public void onLoadLoginUserInfoEvent(LoadLoginUserInfoEvent event) { heartbeat(); startApp(); + getFairyOpenInfo(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogoutEvent(LogoutEvent event) { + fairyOpenInfo = null; } @Override @@ -474,6 +488,25 @@ public class InitialModel extends BaseModel implements IInitialModel { .subscribe(); } + @Override + public Single requestFairyOpenInfo() { + return api.getFairyOpenInfo() + .compose(RxHelper.handleCommon()); + } + + @Nullable + @Override + public FairyOpenInfo getFairyOpenInfo() { + if (fairyOpenInfo != null) { + return fairyOpenInfo; + } + requestFairyOpenInfo() + .doOnSuccess(fairyOpenInfo -> this.fairyOpenInfo = fairyOpenInfo) + .subscribe(); + return null; + } + + @Override public int getFindNewbieCharmLevel() { return findNewbieCharmLevel; @@ -511,5 +544,13 @@ public class InitialModel extends BaseModel implements IInitialModel { */ @GET("/app/bottomBar/getCurrentAppBottomBar") Single>> getMainTabList(); + + /** + * 夺宝精灵开放状态 + * + * @return - + */ + @GET("act/seize-treasure/status") + Single> getFairyOpenInfo(); } } diff --git a/core/src/main/java/com/mango/core/initial/bean/FairyOpenInfo.java b/core/src/main/java/com/mango/core/initial/bean/FairyOpenInfo.java new file mode 100644 index 000000000..3914e189e --- /dev/null +++ b/core/src/main/java/com/mango/core/initial/bean/FairyOpenInfo.java @@ -0,0 +1,22 @@ +package com.mango.core.initial.bean; + +public class FairyOpenInfo { + private int levelLimit; + private boolean open; + + public int getLevelLimit() { + return levelLimit; + } + + public void setLevelLimit(int levelLimit) { + this.levelLimit = levelLimit; + } + + public boolean isOpen() { + return open; + } + + public void setOpen(boolean open) { + this.open = open; + } +} diff --git a/core/src/main/java/com/mango/core/manager/RoomEvent.java b/core/src/main/java/com/mango/core/manager/RoomEvent.java index e891ad265..5989930bf 100644 --- a/core/src/main/java/com/mango/core/manager/RoomEvent.java +++ b/core/src/main/java/com/mango/core/manager/RoomEvent.java @@ -255,6 +255,12 @@ public class RoomEvent { public static final int KITCHEN_ALL_ROOM = 101; + public static final int FAIRY_DRAW_GIFT_L4 = 102; + public static final int FAIRY_DRAW_GIFT_L5 = 103; + public static final int FAIRY_CONVERT_L1 = 104; + public static final int FAIRY_CONVERT_L2 = 105; + public static final int FAIRY_CONVERT_L3 = 106; + private int event = NONE; private int micPosition = Integer.MIN_VALUE; private int posState = -1; diff --git a/core/src/main/java/com/mango/core/treasurefairy/FairyMsgInfo.kt b/core/src/main/java/com/mango/core/treasurefairy/FairyMsgInfo.kt new file mode 100644 index 000000000..fe3d7fef8 --- /dev/null +++ b/core/src/main/java/com/mango/core/treasurefairy/FairyMsgInfo.kt @@ -0,0 +1,48 @@ +package com.mango.core.treasurefairy + +data class FairyMsgInfo( + /** + * uid + */ + val uid: Long? = null, + + /** + * 昵称 + */ + val nick: String? = null, + + /** + * 所在房间uid + */ + val roomUid: Long? = null, + + /** + * 奖励类型 + */ + val rewardType: String? = null, + + /** + * 奖励名称 + */ + val rewardName: String? = null, + + /** + * 奖励等级 + */ + val rewardLevel: Int? = null, + + /** + * 奖励数量 + */ + val rewardNum: Int = 0, + + /** + * 限制等级 + */ + val userLevelLimit: Int? = null, + + /** + * 展示价值 + */ + val rewardShowValue: Int? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/mango/core/treasurefairy/TestResultInfo.kt b/core/src/main/java/com/mango/core/treasurefairy/TestResultInfo.kt deleted file mode 100644 index 77bcdd999..000000000 --- a/core/src/main/java/com/mango/core/treasurefairy/TestResultInfo.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mango.core.treasurefairy - -data class TestResultInfo( - val level: Int, - val fairyInfo: FairyInfo? -) -