diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java index 724792133..062f91199 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/BaseMicroViewAdapter.java @@ -112,18 +112,21 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter by lazy { ArrayList() } + + //頂部飄屏總展示時間 + private val SHOW_TIME = 3500 + + //頂部飄屏周期 + private val PERIOD = 1000 + private val binding: LayoutRoomEffectBinding = + LayoutRoomEffectBinding.inflate(LayoutInflater.from(mContext), this, true) + + private val imDisposable: Disposable? + + private var animationBox: Animation? = null + private var boxDisposable: Disposable? = null + private val messagesBox: MutableList by lazy { ArrayList() } + + private var boxSVGADisposable: Disposable? = null + private val messagesBoxSVGA: MutableList by lazy { ArrayList() } + + private var animationLuckyGift: Animation? = null + private var disposableLuckyGift: Disposable? = null + private val messagesLuckyGift: MutableList by lazy { ArrayList() } + + private var disposableMemberIn: Disposable? = null + private val messagesMemberIn: MutableList by lazy { ArrayList() } + + private var disposableLevelUp: Disposable? = null + private val messagesLevelUp: MutableList by lazy { ArrayList() } + + private var animationDatingAll: Animation? = null + private var disposableDatingAll: Disposable? = null + private val messagesDatingAll: MutableList by lazy { ArrayList() } + private var datingDisposable: Disposable? = null + + + private var disposableRoomPK: Disposable? = null + private val messagesRoomPK: MutableList by lazy { ArrayList() } + + private var disposableSingleRoomPK: Disposable? = null + private val messagesSingleRoomPK: MutableList by lazy { ArrayList() } + + private var disposableGiftCompound: Disposable? = null + private val messagesGiftCompound: MutableList by lazy { ArrayList() } + + private var animationRadish: Animation? = null + private val messagesRadish: MutableList by lazy { java.util.ArrayList() } + private var radishDisposable: Disposable? = null + + private val messagesRadishSVGA: MutableList by lazy { java.util.ArrayList() } + private var radishSVGADisposable: Disposable? = null + + private var isSvgaPlaying = false + + private var isHideCarEffect = false + + private val drawGiftPlayHelper: DrawGiftPlayHelper by lazy { DrawGiftPlayHelper(context as Activity) } + + private fun loopCarAnim() { + if (context.isDestroyed()) return + isSvgaPlaying = false + + if (isHideCarEffect && mCarEffectList.isNotEmpty()) { + mCarEffectList.clear() + } + if (ListUtils.isListEmpty(mCarEffectList)) { + binding.roomCarSvga.visibility = GONE + binding.vapAnimView.visibility = GONE + return + } + mCarEffectList.removeAt(0) + if (!ListUtils.isListEmpty(mCarEffectList)) { + playCarAnim(mCarEffectList[0]) + } + } + + init { + imDisposable = IMNetEaseManager.get().chatRoomEventObservable + .subscribe { roomEvent: RoomEvent? -> + if (roomEvent == null || AvRoomDataManager.get().isSelfGamePlaying) return@subscribe + when (roomEvent.event) { + RoomEvent.BOX_NOTIFY -> addBoxNotify(roomEvent.chatRoomMessage) + RoomEvent.DATING_ALL_NOTIFY -> addDatingAllNotify(roomEvent.chatRoomMessage) + RoomEvent.BOX_NOTIFY_SVGA -> addBoxNotifyBySVGA(roomEvent.chatRoomMessage) + RoomEvent.RADISH_NOTIFY, + RoomEvent.RADISH_NOTIFY_SVGA -> addRadishNotify(roomEvent.chatRoomMessage) + RoomEvent.ROOM_GIFT_COMPOUND -> addGiftCompoundNotify(roomEvent.chatRoomMessage) + RoomEvent.RECEIVE_ROOM_LUCKY_BAG_NOTICE, RoomEvent.RECEIVE_SERVICE_LUCKY_BAG_NOTICE -> //全服福袋 + //廳內福袋 + addLuckyBagNotify(roomEvent.chatRoomMessage) + RoomEvent.DATING_PUBLISH_RESULT -> showHandAnim((roomEvent.chatRoomMessage.attachment as DatingAttachment).datingNotifyInfo) + RoomEvent.RECEIVE_MEMBER_IN_NOTICE -> //進入房間 + addMemberInNotify(roomEvent.chatRoomMessage) + RoomEvent.RECEIVE_EXPER_LEVEL_UP_NOTICE -> addLevelUpNotify(roomEvent.chatRoomMessage) + RoomEvent.ENTER_ROOM -> if (!SuperAdminUtil.isSuperAdmin()) { + playCarSvga(AuthModel.get().currentUid.toString(), null, true) + } + RoomEvent.CAR_MEMBER_IN -> if (roomEvent.mRoomCarMsgAttachment != null) { + playCarSvga( + null, + CarInfo( + roomEvent.mRoomCarMsgAttachment.effect, + roomEvent.mRoomCarMsgAttachment.viewUrl, + roomEvent.mRoomCarMsgAttachment.otherViewType + ), + false + ) + } + RoomEvent.ROOM_PK_NOTIFY -> addRoomPKNotify(roomEvent.chatRoomMessage) + RoomEvent.SINGLE_ROOM_PK_NOTIFY -> addSingleRoomPKNotify(roomEvent.chatRoomMessage) + RoomEvent.SINGLE_ROOM_RANK_TOP_NOTIFY -> showSingleRoomRankNotify(roomEvent.chatRoomMessage) + RoomEvent.ROOM_RANK_TOP_NOTIFY -> showRoomRankNotify(roomEvent.chatRoomMessage) + RoomEvent.ROOM_CAR_EFFECT_HIDE -> { + isHideCarEffect = true + loopCarAnim() + } + RoomEvent.ROOM_CAR_EFFECT_SHOW -> { + isHideCarEffect = false + } + RoomEvent.DRAW_GIFT_EFFECT -> { + val drawGiftAttachment = + (roomEvent.chatRoomMessage?.attachment as? DrawGiftAttachment) + ?: return@subscribe + drawGiftPlayHelper.prepareShowDrawGift( + drawGiftAttachment.giftId, + drawGiftAttachment.drawFixedArray, + false + ) + } + else -> {} + } + } + binding.roomCarSvga.callback = object : SimpleSvgaCallback() { + override fun onFinished() { + loopCarAnim() + } + } + binding.vapAnimView.setAnimListener(object : SimpleAnimListener() { + override fun onVideoComplete() { + loopCarAnim() + } + }) + } + + /** + * 幸運池飄屏 + * + * @param chatRoomMessage + */ + private fun addDatingAllNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesDatingAll.add(chatRoomMessage) + if (disposableDatingAll == null || messagesDatingAll.size == 1) { + disposableDatingAll = Observable.interval(0, 3, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesDatingAll.size > 0 } + .subscribe { + showDatingAllNotify( + messagesDatingAll.removeAt(0) + ) + } + } + } + + private fun showDatingAllNotify(chatRoomMessage: ChatRoomMessage) { + val attachment = chatRoomMessage.attachment as DatingAllNotifyAttachment + val (_, _, oneUserNick, anotherUserNick, roomUid, roomTitle, backgroundUrl, joinHandLevel, _, sweetWords) = attachment.datingAllNotifyInfo + ?: return + //自己房間不需要飄 + if (AvRoomDataManager.get().roomUid == roomUid) return + val textView = LayoutInflater.from(mContext) + .inflate(R.layout.layout_room_dating_all_notify, null) as TextView + textView.setOnClickListener { AVRoomActivity.start(mContext, roomUid) } + var defaultBg = R.drawable.bg_dating_hand_1 + when (joinHandLevel) { + 1 -> defaultBg = R.drawable.bg_dating_hand_1 + 2 -> defaultBg = R.drawable.bg_dating_hand_2 + 3 -> defaultBg = R.drawable.bg_dating_hand_3 + } + textView.setBackgroundResource(defaultBg) + ImageLoadUtils.loadBackground(mContext, backgroundUrl, defaultBg, textView) + val text = SpannableBuilder() + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_01), + ForegroundColorSpan(Color.WHITE) + ) + .append( + getShortString(oneUserNick, 8), + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_02), + ForegroundColorSpan(Color.WHITE) + ) + .append( + getShortString(anotherUserNick, 8), + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_03) + getShortString( + roomTitle, + 10 + ) + ")" + sweetWords, + ForegroundColorSpan(Color.WHITE) + ) + textView.text = text.build() + animationDatingAll = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + binding.flDatingAllNotify.addView(textView) + textView.startAnimation(animationDatingAll) + binding.flDatingAllNotify.postDelayed( + { binding.flDatingAllNotify.removeView(textView) }, + 4500 + ) + } + + private fun getShortString(text: String, max: Int): String { + return if (TextUtils.isEmpty(text) || text.length <= max) text else text.substring( + 0, + max + ) + "…" + } + + /** + * 開福袋飄屏 + * + * @param chatRoomMessage + */ + private fun addLuckyBagNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesLuckyGift.add(chatRoomMessage) + if (disposableLuckyGift == null || messagesLuckyGift.size == 1) { + disposableLuckyGift = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesLuckyGift.size > 0 } + .subscribe { + showLuckyBagNotify( + messagesLuckyGift.removeAt(0) + ) + } + } + } + + private fun showLuckyBagNotify(message: ChatRoomMessage?) { + val attachment = message?.attachment as? RoomReceivedLuckyGiftAttachment ?: return + val noticeInfo = attachment.luckyBagNoticeInfo ?: return + val text = SpannableBuilder() + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_04), + ForegroundColorSpan(Color.WHITE) + ) + .append( + noticeInfo.nick.subAndReplaceDot(6) + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_05), + ForegroundColorSpan(Color.WHITE) + ) + .append( + noticeInfo.luckyBagName + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_06), + ForegroundColorSpan(Color.WHITE) + ) + .append( + noticeInfo.goldPrice + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_07), + ForegroundColorSpan(Color.WHITE) + ) + .append( + noticeInfo.giftName, + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + + val svgaImageView = SVGAImageView(mContext) + svgaImageView.loops = 1 + svgaImageView.clearsAfterStop = true + shareParser().decodeFromAssets( + "svga/lucky_gift_notify.svga", + object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + binding.flLuckyGiftNotify.addView(svgaImageView) + 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 + ), "fdpp_copywriting" + ) + if (AvRoomDataManager.get().roomUid == noticeInfo.roomUid) { + dynamicEntity.setHidden(true, "img_206") + } else { + svgaImageView.setOnClickListener { + //跳轉房間要移除監聽,不然可能NPE + svgaImageView.callback = null + AVRoomActivity.start(mContext, noticeInfo.roomUid) + } + } + val drawable = SVGADrawable(videoItem, dynamicEntity) + svgaImageView.setImageDrawable(drawable) + svgaImageView.stepToFrame(0, true) + } + + override fun onError() {} + }) + svgaImageView.callback = object : SimpleSvgaCallback() { + override fun onFinished() { + binding.flLuckyGiftNotify.post { + binding.flLuckyGiftNotify.removeView(svgaImageView) + } + } + } + } + + /** + * 幸運池飄屏 + * + * @param chatRoomMessage + */ + private fun addBoxNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesBox.add(chatRoomMessage) + if (boxDisposable == null || messagesBox.size == 1) { + boxDisposable = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesBox.size > 0 } + .subscribe { + showBoxNotify( + messagesBox.removeAt(0) + ) + } + } + } + + private fun showBoxNotify(chatRoomMessage: ChatRoomMessage) { + val attachment = chatRoomMessage.attachment as RoomBoxPrizeAttachment + val textView = + LayoutInflater.from(mContext).inflate(R.layout.layout_room_box_notify, null) as TextView + val text = SpannableBuilder() + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_08), + ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.nick + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_09) + attachment.boxTypeStr + ResUtil.getString( + R.string.avroom_widget_roomeffectview_010 + ), ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.prizeName, + ForegroundColorSpan(resources.getColor(R.color.color_00EAFF)) + ) + if (attachment.prizeNum > 1) { + text.append("x" + attachment.prizeNum, ForegroundColorSpan(Color.WHITE)) + } + textView.text = text.build() + animationBox = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + binding.flBoxNotify.addView(textView) + textView.startAnimation(animationBox) + binding.flBoxNotify.postDelayed( + { binding.flBoxNotify.removeView(textView) }, + SHOW_TIME.toLong() + ) + } + + /** + * 幸運池飄屏 五級 SVGA背景的 + * + * @param chatRoomMessage + */ + private fun addBoxNotifyBySVGA(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesBoxSVGA.add(chatRoomMessage) + if (boxSVGADisposable == null || messagesBoxSVGA.size == 1) { + boxSVGADisposable = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesBoxSVGA.size > 0 } + .subscribe { + showBoxNotifyBySVGA( + messagesBoxSVGA.removeAt(0) + ) + } + } + } + + private fun showBoxNotifyBySVGA(chatRoomMessage: ChatRoomMessage) { + val attachment = chatRoomMessage.attachment as RoomBoxPrizeAttachment + val text = SpannableBuilder() + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_011), + ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.nick + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_012) + attachment.boxTypeStr + ResUtil.getString( + R.string.avroom_widget_roomeffectview_013 + ), ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.prizeName, + ForegroundColorSpan(resources.getColor(R.color.color_00EAFF)) + ) + if (attachment.prizeNum > 1) { + text.append("x" + attachment.prizeNum, ForegroundColorSpan(Color.WHITE)) + } + 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.flSvgaBoxNotify.post { binding.flSvgaBoxNotify.removeView(svgaImageView) } + } + } + binding.flSvgaBoxNotify.addView(svgaImageView) + shareParser().decodeFromAssets("svga/box_notify.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 + ), "noble_text_tx" + ) + val drawable = SVGADrawable(videoItem, dynamicEntity) + svgaImageView.setImageDrawable(drawable) + svgaImageView.stepToFrame(0, true) + } + + override fun onError() {} + }, null) + } + + /** + * 幸運池飄屏 + * + * @param chatRoomMessage + */ + private fun addRadishNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesRadish.add(chatRoomMessage) + if (radishDisposable == null || messagesRadish.size == 1) { + radishDisposable = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesRadish.size > 0 } + .subscribe { + showRadishNotify(messagesRadish.removeAt(0)) + } + } + } + + private fun showRadishNotify(chatRoomMessage: ChatRoomMessage?) { + val attachment = chatRoomMessage?.attachment as? RoomBoxPrizeAttachment ?: return + val textView = + LayoutInflater.from(mContext) + .inflate(R.layout.layout_room_radish_notify, null) as TextView + textView.setBackgroundResource(R.drawable.bg_radish_notice) + val text = SpannableBuilder() + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_014), + ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.nick.subAndReplaceDot(6) + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_015), + ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.prizeName, + ForegroundColorSpan(resources.getColor(R.color.notice_gift)) + ) + if (attachment.prizeNum > 1) { + text.append("x" + attachment.prizeNum, ForegroundColorSpan(Color.WHITE)) + } + textView.text = text.build() + setupRoomTitleMarquee(textView) + animationRadish = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + binding.flRadishNotify.addView(textView) + textView.startAnimation(animationRadish) + binding.flRadishNotify.postDelayed( + { binding.flRadishNotify.removeView(textView) }, + SHOW_TIME.toLong() + ) + } + + /** + * 添加跑馬燈 + * 以及反射一些參數影響跑馬燈 + */ + private fun setupRoomTitleMarquee(textView: TextView) { + try { + val configuration = ViewConfiguration.get(context) + val claz: Class<*> = configuration.javaClass + val field = claz.getDeclaredField("mFadingMarqueeEnabled") + field.isAccessible = true + field[configuration] = true + } catch (e: NoSuchFieldException) { + e.printStackTrace() + } catch (e: IllegalArgumentException) { + e.printStackTrace() + } catch (e: IllegalAccessException) { + e.printStackTrace() + } + textView.isSelected = true + } + + /** + * 幸運池飄屏 五級 SVGA背景的 + * + * @param chatRoomMessage + */ + private fun addRadishNotifyBySVGA(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesRadishSVGA.add(chatRoomMessage) + if (radishSVGADisposable == null || messagesRadishSVGA.size == 1) { + radishSVGADisposable = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesRadishSVGA.size > 0 } + .subscribe { + showRadishNotifyBySVGA(messagesRadishSVGA.removeAt(0)) + } + } + } + + private fun showRadishNotifyBySVGA(chatRoomMessage: ChatRoomMessage?) { + val attachment = chatRoomMessage?.attachment as? RoomBoxPrizeAttachment ?: return + val text = SpannableBuilder() + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_016), + ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.nick + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append( + attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_017), + ForegroundColorSpan(Color.WHITE) + ) + .append( + attachment.prizeName, + ForegroundColorSpan(resources.getColor(R.color.notice_gift)) + ) + if (attachment.prizeNum > 1) { + text.append("x" + attachment.prizeNum, ForegroundColorSpan(Color.WHITE)) + } + 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.flSvgaRadishNotify.post { + binding.flSvgaRadishNotify.removeView(svgaImageView) + } + } + } + binding.flSvgaRadishNotify.addView(svgaImageView) + shareParser().decodeFromAssets( + "svga/radish_notify.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 + ), "blb_copywriting" + ) + val drawable = SVGADrawable(videoItem, dynamicEntity) + svgaImageView.setImageDrawable(drawable) + svgaImageView.stepToFrame(0, true) + } + + override fun onError() {} + }) + } + + + /** + * 禮物合成,帶SVGA背景的消息 + * + * @param chatRoomMessage + */ + private fun addGiftCompoundNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + messagesGiftCompound.add(chatRoomMessage) + if (disposableGiftCompound == null || messagesGiftCompound.size == 1) { + disposableGiftCompound = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesGiftCompound.size > 0 } + .subscribe { + showGiftCompoundNotify( + messagesGiftCompound.removeAt(0) + ) + } + } + } + + private fun showGiftCompoundNotify(chatRoomMessage: ChatRoomMessage) { + val msgBean = (chatRoomMessage.attachment as GiftCompoundAttachment).msgBean + val text = SpannableBuilder() + .append( + msgBean.nick.subAndReplaceDot(7) + " ", + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + .append(msgBean.msg + " ", ForegroundColorSpan(Color.WHITE)) + .append( + msgBean.giftName, + ForegroundColorSpan(resources.getColor(R.color.notice_nick)) + ) + 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.flGiftCompoundNotify.post { + binding.flGiftCompoundNotify.removeView(svgaImageView) + } + } + } + binding.flGiftCompoundNotify.addView(svgaImageView) + shareParser().decodeFromAssets( + "svga/gift_compound_notify.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 + ), "noble_text_tx" + ) + val drawable = SVGADrawable(videoItem, dynamicEntity) + svgaImageView.setImageDrawable(drawable) + svgaImageView.startAnimation() + } + + override fun onError() {} + }, + null + ) + } + + /** + * 成員進入飄屏 + * + * @param chatRoomMessage + */ + private fun addMemberInNotify(chatRoomMessage: ChatRoomMessage) { + messagesMemberIn.add(chatRoomMessage) + if (disposableMemberIn == null || messagesMemberIn.size == 1) { + disposableMemberIn = Observable.interval(0, 6, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesMemberIn.size > 0 } + .subscribe { + showMemberInNotify( + messagesMemberIn.removeAt(0) + ) + } + } + } + + private fun showMemberInNotify(chatRoomMessage: ChatRoomMessage) { + val attachment = chatRoomMessage.attachment as ChatRoomNotificationAttachment + val remoteExtension = chatRoomMessage.remoteExtension ?: return + val experLevelSeq = remoteExtension["experLevelSeq"] as Int + val targetNicks: List = attachment.targetNicks + if (ListUtils.isListEmpty(targetNicks)) { + return + } + val fromType = remoteExtension["fromType"] as Int + val fromNick = remoteExtension["fromNick"] as String? + val textView = LayoutInflater.from(mContext) + .inflate(R.layout.layout_member_in_notify, null) as SuperTextView + // 內容 + val text = MessageView.SpannableBuilder(textView) + .append(targetNicks[0], ForegroundColorSpan(Color.WHITE)) + var enterText = ResUtil.getString(R.string.avroom_widget_roomeffectview_018) + if (fromType == AVRoomActivity.FROM_TYPE_RECOMMEND) { + enterText = ResUtil.getString(R.string.avroom_widget_roomeffectview_019) + } + if (fromType == AVRoomActivity.FROM_TYPE_USER) { + enterText = + ResUtil.getString(R.string.avroom_widget_roomeffectview_020) + fromNick.subAndReplaceDot( + 7 + ) + ResUtil.getString(R.string.avroom_widget_roomeffectview_021) + } + if (fromType == AVRoomActivity.FROM_TYPE_GAME_RECOMMEND) { + enterText = + ResUtil.getString(R.string.avroom_widget_roomeffectview_022) + fromNick.subAndReplaceDot( + 7 + ) + ResUtil.getString(R.string.avroom_widget_roomeffectview_023) + } + text.append(enterText, ForegroundColorSpan(Color.WHITE)) + textView.text = text.build() + var enterRoomEffects: String? = "" + if (remoteExtension.containsKey(UserInfo.ENTER_ROOM_EFFECTS)) { + enterRoomEffects = remoteExtension[UserInfo.ENTER_ROOM_EFFECTS] as String? + } + val wrapNick = "【" + targetNicks[0].subAndReplaceDot(7) + "】" + enterText + if (!TextUtils.isEmpty(enterRoomEffects)) { + playMemberInAnimByUrl(wrapNick, enterRoomEffects) + } else { + playMemberInAnimByPath(wrapNick, memberInSvgaPath(experLevelSeq)) + } + } + + private fun memberInSvgaPath(level: Int): String { + var path = "" + if (level in 30..39) { + path = "svga/svga_member_in_lv30.svga" + } else if (level in 40..49) { + path = "svga/svga_member_in_lv40.svga" + } else if (level in 50..59) { + path = "svga/svga_member_in_lv50.svga" + } else if (level in 60..69) { + path = "svga/svga_member_in_lv60.svga" + } else if (level in 70..79) { + path = "svga/svga_member_in_lv70.svga" + } else if (level in 80..89) { + path = "svga/svga_member_in_lv80.svga" + } else if (level >= 90) { + path = "svga/svga_member_in_lv90.svga" + } + return path + } + + private fun playMemberInAnimByPath(text: String, path: String) { + shareParser().decodeFromAssets(path, object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + playMemberInAnim(text, videoItem) + } + + override fun onError() {} + }, null) + } + + private fun playMemberInAnimByUrl(text: String, url: String?) { + try { + shareParser().decodeFromURL(URL(url), object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + playMemberInAnim(text, videoItem) + } + + override fun onError() {} + }, null) + } catch (e: MalformedURLException) { + e.printStackTrace() + } + } + + private fun playMemberInAnim(text: String, svgaVideoEntity: SVGAVideoEntity) { + binding.roomMenberInSvga.visibility = VISIBLE + binding.roomMenberInSvga.loops = 1 + binding.roomMenberInSvga.clearsAfterStop = true + val dynamicEntity = SVGADynamicEntity() + val textPaint = TextPaint() + textPaint.color = Color.WHITE //字體顏色 + textPaint.textSize = 22f //字體大小 + dynamicEntity.setDynamicText( + StaticLayout( + text, + 0, + text.length, + textPaint, + 0, + Layout.Alignment.ALIGN_NORMAL, + 1.0f, + 0.0f, + false + ), "room_text" + ) + val drawable = SVGADrawable(svgaVideoEntity, dynamicEntity) + binding.roomMenberInSvga.setImageDrawable(drawable) + binding.roomMenberInSvga.stepToFrame(0, true) + } + + /** + * 升級飄屏 + * + * @param chatRoomMessage + */ + private fun addLevelUpNotify(chatRoomMessage: ChatRoomMessage) { + messagesLevelUp.add(chatRoomMessage) + if (disposableLevelUp == null || messagesLevelUp.size == 1) { + disposableLevelUp = Observable.interval(0, 6, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesLevelUp.size > 0 } + .subscribe { + showLevelUpNotify( + messagesLevelUp.removeAt(0) + ) + } + } + } + + private fun showLevelUpNotify(chatRoomMessage: ChatRoomMessage) { + val attachment = chatRoomMessage.attachment as LevelUpNoticeAttachment + val message = attachment.getMessage() + val picUrl = attachment.getPicUrl() + val roomUid = attachment.getRoomUid() + if (picUrl == null || message == null) { + return + } + playLevelUpAnim(message, picUrl, roomUid) + } + + private fun playLevelUpAnim(message: String, picUrl: String, roomUid: Long) { + try { + shareParser().decodeFromURL(URL(picUrl), object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + binding.roomLevelUpSvga.visibility = VISIBLE + binding.roomLevelUpSvga.loops = 1 + binding.roomLevelUpSvga.clearsAfterStop = true + val dynamicEntity = SVGADynamicEntity() + val textPaint = TextPaint() + textPaint.color = Color.WHITE //字體顏色 + textPaint.textSize = 22f //字體大小 Util.dip2px(mContext,11) + // textPaint.setShadowLayer(3, 2, 2, 0xff000000);//字體陰影,不需要可以不用設置 + dynamicEntity.setDynamicText(message, textPaint, "y_yhname") + val drawable = SVGADrawable(videoItem, dynamicEntity) + binding.roomLevelUpSvga.setImageDrawable(drawable) + binding.roomLevelUpSvga.stepToFrame(0, true) + binding.roomLevelUpSvga.callback = object : SimpleSvgaCallback() { + override fun onFinished() { + binding.roomLevelUpSvga.visibility = GONE + } + } + } + + override fun onError() {} + }, null) + binding.roomLevelUpSvga.setOnClickListener { v: View? -> + AVRoomActivity.start( + mContext, + roomUid + ) + } + } catch (e: MalformedURLException) { + e.printStackTrace() + } + } + + @SuppressLint("SetTextI18n") + private fun showHandAnim(datingNotifyInfo: DatingNotifyInfo) { + datingDisposable?.dispose() + binding.flSvgaDating.setOnClickListener { } + binding.ivDatingSvgaClose.setOnClickListener { + binding.flSvgaDating.visibility = GONE + datingDisposable?.dispose() + } + binding.flSvgaDating.post { binding.flSvgaDating.visibility = GONE } + datingDisposable = Single.just(datingNotifyInfo) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap { info: DatingNotifyInfo -> + if (datingNotifyInfo.hasSelectUser && !datingNotifyInfo.hasHeart) { + showHeartAnim(datingNotifyInfo.position, datingNotifyInfo.targetPosition) + return@flatMap Single.timer( + XChatConstants.SELECT_ANIM_DURATION.toLong(), + TimeUnit.MILLISECONDS + ).map { info } + } + Single.just(info) + } + .observeOn(AndroidSchedulers.mainThread()) + .filter { datingNotifyInfo.hasHeart } + .toObservable() + .flatMap { info: DatingNotifyInfo -> + Observable.create( + ObservableOnSubscribe { emitter: ObservableEmitter -> + shareParser().decodeFromURL( + URL(datingNotifyInfo.svgaUrl), object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + binding.flSvgaDating.visibility = VISIBLE + binding.llDatingSvgaTime.visibility = GONE + val dynamicEntity = SVGADynamicEntity() + val textPaint = TextPaint() + textPaint.color = Color.WHITE + textPaint.textSize = ScreenUtil.sp2px(10f).toFloat() + AnimHelper.addDynamicImage( + binding.svgaDating, + dynamicEntity, + datingNotifyInfo.avatar, + "z_tx" + ) + AnimHelper.addDynamicImage( + binding.svgaDating, + dynamicEntity, + datingNotifyInfo.targetAvatar, + "y_tx" + ) + val nickName = datingNotifyInfo.nickname.subAndReplaceDot(5) + dynamicEntity.setDynamicText( + StaticLayout( + nickName, + 0, + nickName.length, + textPaint, + 0, + Layout.Alignment.ALIGN_CENTER, + 1.0f, + 0.0f, + false + ), "z_yhname" + ) + val targetNickName = + datingNotifyInfo.targetNickname.subAndReplaceDot(5) + dynamicEntity.setDynamicText( + StaticLayout( + targetNickName, + 0, + targetNickName.length, + textPaint, + 0, + Layout.Alignment.ALIGN_CENTER, + 1.0f, + 0.0f, + false + ), "y_yhname" + ) + val drawable = SVGADrawable(videoItem, dynamicEntity) + binding.svgaDating.setImageDrawable(drawable) + binding.svgaDating.startAnimation() + emitter.onNext(info) + emitter.onComplete() + } + + override fun onError() { + emitter.onError(Throwable(ResUtil.getString(R.string.avroom_widget_roomeffectview_024))) + } + }, null + ) + } as ObservableOnSubscribe) + } + .flatMap { + Observable.intervalRange( + 1, + datingNotifyInfo.svgaSecond.toLong(), + 1, + 1, + TimeUnit.SECONDS + ) + } + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate { binding.flSvgaDating.visibility = GONE } + .subscribe { aLong: Long -> + val residueTime = datingNotifyInfo.svgaSecond - aLong + binding.tvDatingSecond.text = residueTime.toString() + "S" + if (residueTime == 5L) { //剩余5秒開始顯示倒計時 + binding.llDatingSvgaTime.visibility = VISIBLE + } + } + } + + private fun showHeartAnim(position: Int, targetPosition: Int) { + val micViewPoint = AvRoomDataManager.get().mMicPointMap + AnimHelper.showDatingSelectUserAnim( + context, + binding.root as ViewGroup, + micViewPoint[position], + micViewPoint[targetPosition] + ) + } + + @SuppressLint("CheckResult") + private fun playCarSvga(account: String?, carInfo: CarInfo?, isSendMsg: Boolean) { + if (isSendMsg) { + UserModel.get().getUserInfoFromServer(account?.toLong() ?: 0) + .subscribe { userInfo: UserInfo? -> + //播放座駕動效 + if (userInfo != null && userInfo.carInfo != null && userInfo.carInfo.isUsing + && userInfo.carInfo.getStatus() == CarInfo.STATUS_USER_CAN_USE + ) { + + // 貴族人員,要先判斷是否隱身 + if (userInfo.userVipInfoVO == null || !userInfo.userVipInfoVO.enterHide) { + if (AvRoomDataManager.get().mIsNeedGiftEffect && + !AvRoomDataManager.get().isSelfGamePlaying && + !isHideCarEffect + ) { + mCarEffectList.add(userInfo.carInfo) + if (!binding.roomCarSvga.isAnimating && !isSvgaPlaying) { + // 播放座駕動畫 + playCarAnim(userInfo.carInfo) + } + } + + // 公屏進入房間的提示語 + IMNetEaseManager.get() + .sendCarPlayRoomMsgBySdk( + userInfo.carInfo, + userInfo.uid, + userInfo.nick + ) + .subscribe() + } + } + } + } else { + if (carInfo == null) return + if (AvRoomDataManager.get().mIsNeedGiftEffect && + !AvRoomDataManager.get().isSelfGamePlaying && + !isHideCarEffect + ) { + mCarEffectList.add(carInfo) + if (!binding.roomCarSvga.isAnimating && !isSvgaPlaying) { + playCarAnim(carInfo) + } + } + + } + } + + private fun playCarAnim(carInfo: CarInfo?) { + if (carInfo?.otherViewType == 1 && !TextUtils.isEmpty(carInfo.viewUrl)) { + playCarVAPEnterRoom(carInfo.viewUrl) + } else { + playCarSvagEnterRoom(carInfo?.effect) + } + } + + /** + * 真實播放svga + * + * @param effect + */ + private fun playCarSvagEnterRoom(effect: String?) { + if (TextUtils.isEmpty(effect)) return + if (!AvRoomDataManager.get().mIsNeedGiftEffect || + AvRoomDataManager.get().isSelfGamePlaying + ) { + return + } + isSvgaPlaying = true + try { + shareParser().decodeFromURL( + URL(effect), + object : SVGAParser.ParseCompletion { + override fun onComplete(videoItem: SVGAVideoEntity) { + binding.roomCarSvga.visibility = VISIBLE + binding.roomCarSvga.loops = 1 + binding.roomCarSvga.clearsAfterStop = true + binding.roomCarSvga.setImageDrawable(SVGADrawable(videoItem)) + binding.roomCarSvga.startAnimation() + } + + override fun onError() { + isSvgaPlaying = false + binding.roomCarSvga.visibility = GONE + } + }, null + ) + } catch (e: MalformedURLException) { + e.printStackTrace() + isSvgaPlaying = false + } + } + + /** + * 真實播放vap + * + * @param viewUrl + */ + private fun playCarVAPEnterRoom(viewUrl: String) { + if (TextUtils.isEmpty(viewUrl)) return + if (!AvRoomDataManager.get().mIsNeedGiftEffect || + AvRoomDataManager.get().isSelfGamePlaying + ) { + return + } + isSvgaPlaying = true + binding.vapAnimView.visibility = VISIBLE + binding.vapAnimView.loadAnim(viewUrl) + } + + /** + * 跨房PK飄屏 + * + * @param chatRoomMessage + */ + private fun addRoomPKNotify(chatRoomMessage: ChatRoomMessage) { + messagesRoomPK.add(chatRoomMessage) + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + if (disposableRoomPK == null || messagesRoomPK.size == 1) { + disposableRoomPK = Observable.interval(0, 4, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesRoomPK.size > 0 } + .subscribe { + showRoomPKNotify( + messagesRoomPK.removeAt(0) + ) + } + } + } + + private fun showRoomPKNotify(chatRoomMessage: ChatRoomMessage) { + val roomPkBean = (chatRoomMessage.attachment as RoomPKAttachment).roomPkBean + val rootView = LayoutInflater.from(mContext).inflate(R.layout.layout_room_pk_notify, null) + (rootView.findViewById(R.id.tv_title_left) as TextView).text = + roomPkBean.winTitle.subAndReplaceDot(7) + (rootView.findViewById(R.id.tv_title_right) as TextView).text = + roomPkBean.failTitle.subAndReplaceDot(7) + (rootView.findViewById(R.id.tv_win_text) as TextView).text = roomPkBean.msg + rootView.findViewById(R.id.iv_avatar_left).load(roomPkBean.winAvatar) + rootView.findViewById(R.id.iv_avatar_right).load(roomPkBean.failAvatar) + rootView.findViewById(R.id.tv_go_room).setOnClickListener { + AVRoomActivity.start( + context, roomPkBean.winUid + ) + } + binding.flRoomPkNotify.addView(rootView) + animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + rootView.startAnimation(animationLuckyGift) + binding.flRoomPkNotify.postDelayed( + { binding.flRoomPkNotify.removeView(rootView) }, + SHOW_TIME.toLong() + ) + } + + /** + * 個播跨房PK飄屏 + * + * @param chatRoomMessage + */ + private fun addSingleRoomPKNotify(chatRoomMessage: ChatRoomMessage) { + messagesSingleRoomPK.add(chatRoomMessage) + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + if (disposableSingleRoomPK == null || messagesSingleRoomPK.size == 1) { + disposableSingleRoomPK = Observable.interval(0, 4, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .takeWhile { messagesSingleRoomPK.size > 0 } + .subscribe { + showSingleRoomPKNotify( + messagesSingleRoomPK.removeAt(0) + ) + } + } + } + + private fun showSingleRoomPKNotify(chatRoomMessage: ChatRoomMessage) { + val roomPkBean = (chatRoomMessage.attachment as RoomPKAttachment).roomPkBean + val rootView = + LayoutInflater.from(mContext).inflate(R.layout.layout_single_room_pk_notify, null) + (rootView.findViewById(R.id.tv_title_left) as TextView).text = + roomPkBean.winNick.subAndReplaceDot(7) + (rootView.findViewById(R.id.tv_title_right) as TextView).text = + roomPkBean.failNick.subAndReplaceDot(7) + (rootView.findViewById(R.id.tv_win_text) as TextView).text = roomPkBean.msg + rootView.findViewById(R.id.iv_avatar_left).load(roomPkBean.winAvatar) + rootView.findViewById(R.id.iv_avatar_right).load(roomPkBean.failAvatar) + rootView.findViewById(R.id.tv_go_room).setOnClickListener { v: View? -> + AVRoomActivity.start( + context, roomPkBean.winUid + ) + } + binding.flSingleRoomPkNotify.addView(rootView) + animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + rootView.startAnimation(animationLuckyGift) + binding.flSingleRoomPkNotify.postDelayed( + { binding.flSingleRoomPkNotify.removeView(rootView) }, + SHOW_TIME.toLong() + ) + } + + private fun showSingleRoomRankNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + val roomPkBean = (chatRoomMessage.attachment as SingleRoomRankAttachment).msgBean + val rootView = + LayoutInflater.from(mContext).inflate(R.layout.layout_single_room_rank_notify, null) + (rootView.findViewById(R.id.tv_nick) as TextView).text = + roomPkBean.nick.subAndReplaceDot(6) + (rootView.findViewById(R.id.tv_desc) as TextView).text = roomPkBean.desc + rootView.findViewById(R.id.iv_avatar).load(roomPkBean.avatar) + rootView.setOnClickListener { AVRoomActivity.start(context, roomPkBean.uid) } + binding.flSingleRoomRankNotify.addView(rootView) + animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + rootView.startAnimation(animationLuckyGift) + binding.flSingleRoomRankNotify.postDelayed({ + binding.flSingleRoomRankNotify.removeView( + rootView + ) + }, SHOW_TIME.toLong()) + } + + private fun showRoomRankNotify(chatRoomMessage: ChatRoomMessage) { + if (binding.clNotify.visibility == GONE) { + binding.clNotify.visibility = VISIBLE + } + val msgBean = (chatRoomMessage.attachment as RoomRankAttachment).msgBean + val rootView = LayoutInflater.from(mContext).inflate(R.layout.layout_room_rank_notify, null) + val textView = rootView.findViewById(R.id.tv_content) + val text = MessageView.SpannableBuilder(textView) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_025), + ForegroundColorSpan(Color.WHITE) + ) + .append("「${msgBean.title}」房間", ForegroundColorSpan(Color.parseColor("#FFFC4C"))) + .append(msgBean.desc, ForegroundColorSpan(Color.WHITE)) + .append("TOP1", ForegroundColorSpan(Color.parseColor("#FFFC4C"))) + textView.text = text.build() + rootView.setOnClickListener { AVRoomActivity.start(context, msgBean.uid) } + binding.flSingleRoomRankNotify.addView(rootView) + animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify) + rootView.startAnimation(animationLuckyGift) + binding.flSingleRoomRankNotify.postDelayed({ + binding.flSingleRoomRankNotify.removeView( + rootView + ) + }, SHOW_TIME.toLong()) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + boxDisposable?.dispose() + disposableLuckyGift?.dispose() + disposableMemberIn?.dispose() + disposableLevelUp?.dispose() + datingDisposable?.dispose() + imDisposable?.dispose() + disposableDatingAll?.dispose() + disposableRoomPK?.dispose() + disposableSingleRoomPK?.dispose() + disposableGiftCompound?.dispose() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt index fed514082..232bd479a 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt @@ -30,6 +30,7 @@ import com.yizhuan.erban.avroom.activity.AVRoomActivity import com.yizhuan.erban.avroom.helper.AnimHelper import com.yizhuan.erban.common.svga.SimpleSvgaCallback import com.yizhuan.erban.databinding.LayoutRoomEffectBinding +import com.yizhuan.erban.treasure_box.activity.TreasureBoxActivity import com.yizhuan.erban.ui.utils.ImageLoadUtils import com.yizhuan.erban.ui.utils.isDestroyed import com.yizhuan.erban.ui.utils.load @@ -126,7 +127,6 @@ class RoomEffectView @JvmOverloads constructor( private val drawGiftPlayHelper: DrawGiftPlayHelper by lazy { DrawGiftPlayHelper(context as Activity) } - private fun loopCarAnim() { if (context.isDestroyed()) return isSvgaPlaying = false @@ -150,9 +150,17 @@ class RoomEffectView @JvmOverloads constructor( .subscribe { roomEvent: RoomEvent? -> if (roomEvent == null || AvRoomDataManager.get().isSelfGamePlaying) return@subscribe when (roomEvent.event) { - RoomEvent.BOX_NOTIFY -> addBoxNotify(roomEvent.chatRoomMessage) + RoomEvent.BOX_NOTIFY -> { + if((mContext as AVRoomActivity).isTopActivity) { + addBoxNotify(roomEvent.chatRoomMessage) + } + } RoomEvent.DATING_ALL_NOTIFY -> addDatingAllNotify(roomEvent.chatRoomMessage) - RoomEvent.BOX_NOTIFY_SVGA -> addBoxNotifyBySVGA(roomEvent.chatRoomMessage) + RoomEvent.BOX_NOTIFY_SVGA -> { + if((mContext as AVRoomActivity).isTopActivity) { + addBoxNotifyBySVGA(roomEvent.chatRoomMessage) + } + } RoomEvent.RADISH_NOTIFY, RoomEvent.RADISH_NOTIFY_SVGA -> addRadishNotify(roomEvent.chatRoomMessage) RoomEvent.ROOM_GIFT_COMPOUND -> addGiftCompoundNotify(roomEvent.chatRoomMessage) @@ -253,18 +261,27 @@ class RoomEffectView @JvmOverloads constructor( textView.setBackgroundResource(defaultBg) ImageLoadUtils.loadBackground(mContext, backgroundUrl, defaultBg, textView) val text = SpannableBuilder() - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_01), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_01), + ForegroundColorSpan(Color.WHITE) + ) .append( getShortString(oneUserNick, 8), ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_02), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_02), + ForegroundColorSpan(Color.WHITE) + ) .append( getShortString(anotherUserNick, 8), ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) .append( - ResUtil.getString(R.string.avroom_widget_roomeffectview_03) + getShortString(roomTitle, 10) + ")" + sweetWords, + ResUtil.getString(R.string.avroom_widget_roomeffectview_03) + getShortString( + roomTitle, + 10 + ) + ")" + sweetWords, ForegroundColorSpan(Color.WHITE) ) textView.text = text.build() @@ -310,22 +327,34 @@ class RoomEffectView @JvmOverloads constructor( val attachment = message?.attachment as? RoomReceivedLuckyGiftAttachment ?: return val noticeInfo = attachment.luckyBagNoticeInfo ?: return val text = SpannableBuilder() - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_04), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_04), + ForegroundColorSpan(Color.WHITE) + ) .append( noticeInfo.nick.subAndReplaceDot(6) + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_05), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_05), + ForegroundColorSpan(Color.WHITE) + ) .append( noticeInfo.luckyBagName + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_06), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_06), + ForegroundColorSpan(Color.WHITE) + ) .append( noticeInfo.goldPrice + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_07), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_07), + ForegroundColorSpan(Color.WHITE) + ) .append( noticeInfo.giftName, ForegroundColorSpan(resources.getColor(R.color.notice_nick)) @@ -408,15 +437,22 @@ class RoomEffectView @JvmOverloads constructor( val textView = LayoutInflater.from(mContext).inflate(R.layout.layout_room_box_notify, null) as TextView val text = SpannableBuilder() - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_08), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_08), + ForegroundColorSpan(Color.WHITE) + ) .append( attachment.nick + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_09) + attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_010), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_09) + attachment.boxTypeStr + ResUtil.getString( + R.string.avroom_widget_roomeffectview_010 + ), ForegroundColorSpan(Color.WHITE) + ) .append( attachment.prizeName, - ForegroundColorSpan(resources.getColor(R.color.notice_gift)) + ForegroundColorSpan(resources.getColor(R.color.color_00EAFF)) ) if (attachment.prizeNum > 1) { text.append("x" + attachment.prizeNum, ForegroundColorSpan(Color.WHITE)) @@ -446,9 +482,11 @@ class RoomEffectView @JvmOverloads constructor( .observeOn(AndroidSchedulers.mainThread()) .takeWhile { messagesBoxSVGA.size > 0 } .subscribe { - showBoxNotifyBySVGA( - messagesBoxSVGA.removeAt(0) - ) + if((mContext as AVRoomActivity).isTopActivity) { + showBoxNotifyBySVGA( + messagesBoxSVGA.removeAt(0) + ) + } } } } @@ -456,15 +494,22 @@ class RoomEffectView @JvmOverloads constructor( private fun showBoxNotifyBySVGA(chatRoomMessage: ChatRoomMessage) { val attachment = chatRoomMessage.attachment as RoomBoxPrizeAttachment val text = SpannableBuilder() - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_011), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_011), + ForegroundColorSpan(Color.WHITE) + ) .append( attachment.nick + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_012) + attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_013), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_012) + attachment.boxTypeStr + ResUtil.getString( + R.string.avroom_widget_roomeffectview_013 + ), ForegroundColorSpan(Color.WHITE) + ) .append( attachment.prizeName, - ForegroundColorSpan(resources.getColor(R.color.notice_gift)) + ForegroundColorSpan(resources.getColor(R.color.color_00EAFF)) ) if (attachment.prizeNum > 1) { text.append("x" + attachment.prizeNum, ForegroundColorSpan(Color.WHITE)) @@ -497,7 +542,7 @@ class RoomEffectView @JvmOverloads constructor( 1.0f, 0.0f, false - ), "tgs_copywriting" + ), "noble_text_tx" ) val drawable = SVGADrawable(videoItem, dynamicEntity) svgaImageView.setImageDrawable(drawable) @@ -535,12 +580,18 @@ class RoomEffectView @JvmOverloads constructor( .inflate(R.layout.layout_room_radish_notify, null) as TextView textView.setBackgroundResource(R.drawable.bg_radish_notice) val text = SpannableBuilder() - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_014), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_014), + ForegroundColorSpan(Color.WHITE) + ) .append( attachment.nick.subAndReplaceDot(6) + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_015), ForegroundColorSpan(Color.WHITE)) + .append( + attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_015), + ForegroundColorSpan(Color.WHITE) + ) .append( attachment.prizeName, ForegroundColorSpan(resources.getColor(R.color.notice_gift)) @@ -603,12 +654,18 @@ class RoomEffectView @JvmOverloads constructor( private fun showRadishNotifyBySVGA(chatRoomMessage: ChatRoomMessage?) { val attachment = chatRoomMessage?.attachment as? RoomBoxPrizeAttachment ?: return val text = SpannableBuilder() - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_016), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_016), + ForegroundColorSpan(Color.WHITE) + ) .append( attachment.nick + " ", ForegroundColorSpan(resources.getColor(R.color.notice_nick)) ) - .append(attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_017), ForegroundColorSpan(Color.WHITE)) + .append( + attachment.boxTypeStr + ResUtil.getString(R.string.avroom_widget_roomeffectview_017), + ForegroundColorSpan(Color.WHITE) + ) .append( attachment.prizeName, ForegroundColorSpan(resources.getColor(R.color.notice_gift)) @@ -778,10 +835,16 @@ class RoomEffectView @JvmOverloads constructor( enterText = ResUtil.getString(R.string.avroom_widget_roomeffectview_019) } if (fromType == AVRoomActivity.FROM_TYPE_USER) { - enterText = ResUtil.getString(R.string.avroom_widget_roomeffectview_020) + fromNick.subAndReplaceDot(7) + ResUtil.getString(R.string.avroom_widget_roomeffectview_021) + enterText = + ResUtil.getString(R.string.avroom_widget_roomeffectview_020) + fromNick.subAndReplaceDot( + 7 + ) + ResUtil.getString(R.string.avroom_widget_roomeffectview_021) } if (fromType == AVRoomActivity.FROM_TYPE_GAME_RECOMMEND) { - enterText = ResUtil.getString(R.string.avroom_widget_roomeffectview_022) + fromNick.subAndReplaceDot(7) + ResUtil.getString(R.string.avroom_widget_roomeffectview_023) + enterText = + ResUtil.getString(R.string.avroom_widget_roomeffectview_022) + fromNick.subAndReplaceDot( + 7 + ) + ResUtil.getString(R.string.avroom_widget_roomeffectview_023) } text.append(enterText, ForegroundColorSpan(Color.WHITE)) textView.text = text.build() @@ -1288,7 +1351,10 @@ class RoomEffectView @JvmOverloads constructor( val rootView = LayoutInflater.from(mContext).inflate(R.layout.layout_room_rank_notify, null) val textView = rootView.findViewById(R.id.tv_content) val text = MessageView.SpannableBuilder(textView) - .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_025), ForegroundColorSpan(Color.WHITE)) + .append( + ResUtil.getString(R.string.avroom_widget_roomeffectview_025), + ForegroundColorSpan(Color.WHITE) + ) .append("「${msgBean.title}」房間", ForegroundColorSpan(Color.parseColor("#FFFC4C"))) .append(msgBean.desc, ForegroundColorSpan(Color.WHITE)) .append("TOP1", ForegroundColorSpan(Color.parseColor("#FFFC4C"))) diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeTopAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeTopAdapter.java index a58be1297..ed328916d 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/HomeTopAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/HomeTopAdapter.java @@ -22,7 +22,6 @@ public class HomeTopAdapter extends BaseBannerAdapter { @Override protected void bindData(BaseViewHolder helper, HomeTabMapInfo item, int position, int pageSize) { - helper.setText(R.id.tv_online_number, item.getOnlineNum() + ""); helper.setText(R.id.tv_title, item.getTitle()); diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java b/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java index 251d7b8eb..80d5682dc 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java +++ b/app/src/main/java/com/yizhuan/erban/ui/im/RouterHandler.java @@ -5,7 +5,9 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import com.orhanobut.logger.Logger; import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; +import com.umeng.commonsdk.statistics.common.DeviceConfig; import com.yizhuan.erban.R; import com.yizhuan.erban.UIHelper; import com.yizhuan.erban.audio.VoiceMatchActivity; @@ -44,6 +46,7 @@ import com.yizhuan.erban.ui.withdraw.BinderAlipayActivity; import com.yizhuan.erban.vip.VipMainActivity; import com.yizhuan.tutu.mentoring_relationship.activity.MentoringRelationshipActivity; import com.yizhuan.xchat_android_core.DemoCache; +import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.community.event.SquareTaskEvent; import com.yizhuan.xchat_android_core.im.custom.bean.RouterType; @@ -59,6 +62,7 @@ import com.yizhuan.xchat_android_core.utils.net.BeanObserver; import com.yizhuan.xchat_android_core.utils.net.RxHelper; import com.yizhuan.xchat_android_core.withdraw.WithdrawModel; import com.yizhuan.xchat_android_library.net.rxnet.callback.CallBack; +import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil; import com.yizhuan.xchat_android_library.utils.JavaUtil; import com.yizhuan.xchat_android_library.utils.ResUtil; import com.yizhuan.xchat_android_library.utils.SingleToastUtil; @@ -95,7 +99,16 @@ public class RouterHandler { CommonWebViewActivity.start(context, routerValue); break; case RouterType.RECHARGE: - ChargeActivity.start(context); + if(AppMetaDataUtil.getChannelID().equals("google")) { + ChargeActivity.start(context); + }else { + CommonWebViewActivity.start( + context, UriProvider.getOfficialPay( + 4, + DeviceConfig.getDeviceId(context) + ) + ); + } break; case RouterType.PERSON: UserInfoActivity.Companion.start(context, JavaUtil.str2long(routerValue)); diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java index 9951ceb3e..2bf5c27f0 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginActivity.java @@ -27,6 +27,7 @@ import com.yizhuan.xchat_android_core.DemoCache; import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.event.LoginEvent; +import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -61,6 +62,11 @@ public class LoginActivity extends BaseActivity implements View.OnClickListener private void onFindViews() { tvProtocol = findViewById(R.id.tv_protocol); tvProtocolHint = findViewById(R.id.tv_protocol_hint); + if(AppMetaDataUtil.getChannelID().equals("google")){ + findViewById(R.id.tv_google).setVisibility(View.VISIBLE); + }else { + findViewById(R.id.tv_google).setVisibility(View.GONE); + } } private void onSetListener() { diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java b/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java index 9742065ce..6261fd3ea 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/login/LoginPasswordActivity.java @@ -65,7 +65,7 @@ public class LoginPasswordActivity extends BaseActivity { edtPassword.addTextChangedListener(textWatcher); btnNext.setOnClickListener(v -> login()); findViewById(R.id.tv_forget_password).setOnClickListener(v -> - getDialogManager().showOkCancelWithTitleDialog(getString(R.string.login_contact_service), "LINE:tlw20220510", getString(R.string.button_ok), "", true, () -> { + getDialogManager().showOkCancelWithTitleDialog(getString(R.string.login_contact_service), "LINE:pekoyuyin", getString(R.string.button_ok), "", true, () -> { }) ); diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/JSInterface.java b/app/src/main/java/com/yizhuan/erban/ui/webview/JSInterface.java index 737bf4bbf..745758ea8 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/JSInterface.java +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/JSInterface.java @@ -33,6 +33,7 @@ import com.yizhuan.erban.ui.webview.event.ShowNavEvent; import com.yizhuan.erban.ui.webview.event.TaroPayResultEvent; import com.yizhuan.erban.ui.widget.ShareDialog; import com.yizhuan.xchat_android_constants.XChatConstants; +import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.decoration.bean.DecorationStoreRouterType; import com.yizhuan.xchat_android_core.file.FileModel; @@ -108,7 +109,16 @@ public class JSInterface { @JavascriptInterface public void openChargePage() { if (context != null) { - ChargeActivity.start(context); + if(AppMetaDataUtil.getChannelID().equals("google")) { + ChargeActivity.start(context); + }else { + CommonWebViewActivity.start( + context, UriProvider.getOfficialPay( + 4, + DeviceConfig.getDeviceId(context) + ) + ); + } } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.java b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.java deleted file mode 100644 index 2c2167d58..000000000 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indicators; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.LinearGradient; -import android.graphics.Paint; -import android.graphics.RectF; -import android.graphics.Shader; -import android.view.View; -import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; - -import com.yizhuan.erban.ui.widget.magicindicator.FragmentContainerHelper; -import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil; -import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; -import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.model.PositionData; - -import java.util.List; - - -/** - * 包裹住内容区域的指示器,类似天天快报的切换效果,需要和IMeasurablePagerTitleView配合使用 - * 博客: http://hackware.lucode.net - * Created by hackware on 2016/6/26. - */ -public class WrapPagerIndicator extends View implements IPagerIndicator { - private final int[] mGradientColors = {0xFF13E2F5, 0xFFCC66FF}; - //渐变位置 - private final float[] mGradientPosition = new float[]{0, 1}; - private int mVerticalPadding; - private int mHorizontalPadding; - private int mFillColor; - private float mRoundRadius; - private Interpolator mStartInterpolator = new LinearInterpolator(); - private Interpolator mEndInterpolator = new LinearInterpolator(); - private List mPositionDataList; - private Paint mPaint; - private RectF mRect = new RectF(); - private boolean mRoundRadiusSet; - - public WrapPagerIndicator(Context context) { - super(context); - init(context); - } - - private void init(Context context) { - mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mPaint.setStyle(Paint.Style.FILL); - mHorizontalPadding = UIUtil.dip2px(context, 10); - } - - @Override - protected void onDraw(Canvas canvas) { - //mPaint.setColor(mFillColor); - canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, mPaint); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if (mPositionDataList == null || mPositionDataList.isEmpty()) { - return; - } - - // 计算锚点位置 - PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position); - PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1); - - mRect.left = current.mContentLeft - mHorizontalPadding + (next.mContentLeft - current.mContentLeft) * mEndInterpolator.getInterpolation(positionOffset); - mRect.top = current.mContentTop - mVerticalPadding; - mRect.right = current.mContentRight + mHorizontalPadding + (next.mContentRight - current.mContentRight) * mStartInterpolator.getInterpolation(positionOffset); - mRect.bottom = current.mContentBottom + mVerticalPadding; - - mPaint.setShader(new LinearGradient(mRect.left, mRect.top, mRect.right, mRect.bottom, mGradientColors, mGradientPosition, Shader.TileMode.CLAMP)); - - if (!mRoundRadiusSet) { - mRoundRadius = mRect.height() / 2; - } - - invalidate(); - } - - @Override - public void onPageSelected(int position) { - } - - @Override - public void onPageScrollStateChanged(int state) { - } - - @Override - public void onPositionDataProvide(List dataList) { - mPositionDataList = dataList; - } - - public Paint getPaint() { - return mPaint; - } - - public int getVerticalPadding() { - return mVerticalPadding; - } - - public void setVerticalPadding(int verticalPadding) { - mVerticalPadding = verticalPadding; - } - - public int getHorizontalPadding() { - return mHorizontalPadding; - } - - public void setHorizontalPadding(int horizontalPadding) { - mHorizontalPadding = horizontalPadding; - } - - public int getFillColor() { - return mFillColor; - } - - public void setFillColor(int fillColor) { - mFillColor = fillColor; - } - - public float getRoundRadius() { - return mRoundRadius; - } - - public void setRoundRadius(float roundRadius) { - mRoundRadius = roundRadius; - mRoundRadiusSet = true; - } - - public Interpolator getStartInterpolator() { - return mStartInterpolator; - } - - public void setStartInterpolator(Interpolator startInterpolator) { - mStartInterpolator = startInterpolator; - if (mStartInterpolator == null) { - mStartInterpolator = new LinearInterpolator(); - } - } - - public Interpolator getEndInterpolator() { - return mEndInterpolator; - } - - public void setEndInterpolator(Interpolator endInterpolator) { - mEndInterpolator = endInterpolator; - if (mEndInterpolator == null) { - mEndInterpolator = new LinearInterpolator(); - } - } -} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.kt b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.kt new file mode 100644 index 000000000..1d358271c --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/magicindicator/buildins/commonnavigator/indicators/WrapPagerIndicator.kt @@ -0,0 +1,120 @@ +package com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indicators + +import android.content.Context +import android.graphics.* +import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator +import android.view.animation.LinearInterpolator +import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.model.PositionData +import android.view.View +import android.view.animation.Interpolator +import com.yizhuan.erban.R +import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil +import com.yizhuan.erban.ui.widget.magicindicator.FragmentContainerHelper + +/** + * 包裹住内容区域的指示器,类似天天快报的切换效果,需要和IMeasurablePagerTitleView配合使用 + * 博客: http://hackware.lucode.net + * Created by hackware on 2016/6/26. + */ +class WrapPagerIndicator(context: Context) : View(context), IPagerIndicator { + private val mGradientColors = intArrayOf(-0xec1d0b, -0x339901) + + //渐变位置 + private val mGradientPosition = floatArrayOf(0f, 1f) + var verticalPadding = 0 + var horizontalPadding = 0 + var fillColor = 0 + private var mRoundRadius = 0f + private var mStartInterpolator: Interpolator? = LinearInterpolator() + private var mEndInterpolator: Interpolator? = LinearInterpolator() + private var mPositionDataList: List? = null + var paint: Paint? = null + private set + private val mRect = RectF() + private var mRoundRadiusSet = false + + init { + init(context) + } + + private fun init(context: Context) { + paint = Paint(Paint.ANTI_ALIAS_FLAG) + paint!!.style = Paint.Style.FILL + horizontalPadding = UIUtil.dip2px(context, 10.0) + } + + private val mIndicatorBmp: Bitmap by lazy { + BitmapFactory.decodeResource( + context.resources, + R.drawable.bg_home_tab + ) + } + + override fun onDraw(canvas: Canvas) { + //mPaint.setColor(mFillColor); + canvas.drawBitmap(mIndicatorBmp, null, mRect, paint!!) +// canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, paint!!) + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + if (mPositionDataList == null || mPositionDataList!!.isEmpty()) { + return + } + + // 计算锚点位置 + val current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position) + val next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1) + mRect.left = + current.mContentLeft - horizontalPadding + (next.mContentLeft - current.mContentLeft) * mEndInterpolator!!.getInterpolation( + positionOffset + ) + mRect.top = (current.mContentTop - verticalPadding).toFloat() + mRect.right = + current.mContentRight + horizontalPadding + (next.mContentRight - current.mContentRight) * mStartInterpolator!!.getInterpolation( + positionOffset + ) + mRect.bottom = (current.mContentBottom + verticalPadding).toFloat() + paint!!.shader = LinearGradient( + mRect.left, + mRect.top, + mRect.right, + mRect.bottom, + mGradientColors, + mGradientPosition, + Shader.TileMode.CLAMP + ) + if (!mRoundRadiusSet) { + mRoundRadius = mRect.height() / 2 + } + invalidate() + } + + override fun onPageSelected(position: Int) {} + override fun onPageScrollStateChanged(state: Int) {} + override fun onPositionDataProvide(dataList: List) { + mPositionDataList = dataList + } + + var roundRadius: Float + get() = mRoundRadius + set(roundRadius) { + mRoundRadius = roundRadius + mRoundRadiusSet = true + } + var startInterpolator: Interpolator? + get() = mStartInterpolator + set(startInterpolator) { + mStartInterpolator = startInterpolator + if (mStartInterpolator == null) { + mStartInterpolator = LinearInterpolator() + } + } + var endInterpolator: Interpolator? + get() = mEndInterpolator + set(endInterpolator) { + mEndInterpolator = endInterpolator + if (mEndInterpolator == null) { + mEndInterpolator = LinearInterpolator() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt b/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt index 7659143b1..0c9590168 100644 --- a/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt +++ b/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt @@ -76,7 +76,8 @@ class VipMainActivity : BaseViewBindingActivity(), private lateinit var rvDelegate: RVDelegate private val vipViewModel: VipViewModel by viewModels() private var billingManager: BillingManager? = null - private var bean: ChargeBean? = null + private var bean: ChargeBean? = null//google + private var chargeInfo: ChargeBean? = null//official @SuppressLint("SetTextI18n") override fun init() { @@ -222,6 +223,31 @@ class VipMainActivity : BaseViewBindingActivity(), } } + binding.tvOpenVip.setOnClickListener { + if(AppMetaDataUtil.getChannelID().equals("google")){ + bean?.let { charge -> + StatisticManager.Instance() + .onEvent( + StatisticsProtocol.EVENT_VIP_OPEN_CLICK, + getString(R.string.me_open_nobleman_click_event) + ) + buyProduct(charge.skuDetails) + } + }else{ + chargeInfo?.let { + StatisticManager.Instance() + .onEvent( + StatisticsProtocol.EVENT_VIP_OPEN_CLICK, + getString(R.string.me_open_nobleman_click_event) + ) + CommonWebViewActivity.start( + context, + UriProvider.getOfficialPay(5, DeviceConfig.getDeviceId(context)) + ) + } + } + } + } @SuppressLint("CheckResult", "SetTextI18n") @@ -230,21 +256,10 @@ class VipMainActivity : BaseViewBindingActivity(), .compose(bindToLifecycle()) .subscribe( { - val chargeInfo = it.list.getOrNull(0) + chargeInfo = it.list.getOrNull(0) chargeInfo?.let { chargeBean -> binding.tvOpenVip.text = "${chargeBean.getMoney()}${getString(R.string.me_immediately_become_a_Peko_nobleman)}" - binding.tvOpenVip.setOnClickListener { - StatisticManager.Instance() - .onEvent( - StatisticsProtocol.EVENT_VIP_OPEN_CLICK, - getString(R.string.me_open_nobleman_click_event) - ) - CommonWebViewActivity.start( - context, - UriProvider.getOfficialPay(5, DeviceConfig.getDeviceId(context)) - ) - } } }, { it.printStackTrace() @@ -358,16 +373,6 @@ class VipMainActivity : BaseViewBindingActivity(), binding.tvOpenVip.text = "${ bean?.getMoney() }${getString(R.string.me_immediately_become_a_Peko_nobleman)}" - binding.tvOpenVip.setOnClickListener { - StatisticManager.Instance() - .onEvent( - StatisticsProtocol.EVENT_VIP_OPEN_CLICK, - getString(R.string.me_open_nobleman_click_event) - ) - bean?.let { charge -> - buyProduct(charge.skuDetails) - } - } } } } @@ -472,6 +477,8 @@ class VipMainActivity : BaseViewBindingActivity(), super.onDestroy() EventBus.getDefault().unregister(this) billingManager?.destroy() + bean = null + chargeInfo = null } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/res/layout/activity_home_top_banner.xml b/app/src/main/res/layout/activity_home_top_banner.xml index 72d497f4b..7017088cf 100644 --- a/app/src/main/res/layout/activity_home_top_banner.xml +++ b/app/src/main/res/layout/activity_home_top_banner.xml @@ -21,24 +21,6 @@ app:riv_corner_radius_top_left="8dp" app:riv_corner_radius_top_right="8dp" /> - - @@ -46,7 +47,8 @@ android:background="@drawable/shape_white_top_25dp" android:gravity="center_horizontal" android:orientation="vertical" - app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginTop="-20dp" + app:layout_constraintTop_toBottomOf="@+id/view_bg_top" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> @@ -106,37 +108,39 @@ android:textSize="12sp" app:drawableEndCompat="@drawable/ic_login_arrow_right" /> - - - - + + + + diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index 4a24966d5..d8b4d23cf 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -234,6 +234,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_8" + android:gravity="center_vertical" android:orientation="horizontal" app:layout_constraintTop_toBottomOf="@id/ll_id"> diff --git a/app/src/main/res/layout/item_boss_micro.xml b/app/src/main/res/layout/item_boss_micro.xml index c3244bc58..5f5c5826d 100644 --- a/app/src/main/res/layout/item_boss_micro.xml +++ b/app/src/main/res/layout/item_boss_micro.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" android:clipChildren="false" android:clipToPadding="false" android:paddingTop="11dp" @@ -101,7 +102,7 @@ - - @@ -136,7 +137,8 @@ android:id="@+id/iv_tag" android:layout_width="wrap_content" android:layout_height="15dp" - android:layout_marginEnd="5dp" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + android:textSize="@dimen/sp_10" + android:layout_marginStart="@dimen/dp_5" + app:layout_goneMarginStart="0dp" + tools:text="@string/layout_item_boss_micro_02" + app:layout_constraintStart_toEndOf="@+id/iv_tag" + app:layout_constraintTop_toTopOf="parent"/> + android:paddingEnd="4dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/nick"> - + #75FBE2 #A8041D #141B3B + #00EAFF diff --git a/app/src/module_community/res/layout/item_square_dynamic.xml b/app/src/module_community/res/layout/item_square_dynamic.xml index dcd797417..fe646f727 100644 --- a/app/src/module_community/res/layout/item_square_dynamic.xml +++ b/app/src/module_community/res/layout/item_square_dynamic.xml @@ -13,7 +13,7 @@ android:id="@+id/cl_user_info" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_15" + android:layout_marginTop="@dimen/dp_20" app:layout_constraintTop_toTopOf="parent"> diff --git a/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/activity/TreasureBoxActivity.java b/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/activity/TreasureBoxActivity.java index 7820d6ef0..8bd7af1d2 100644 --- a/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/activity/TreasureBoxActivity.java +++ b/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/activity/TreasureBoxActivity.java @@ -72,7 +72,7 @@ public class TreasureBoxActivity extends BaseBindingActivity 6) { diff --git a/app/src/module_treasure_box/res/drawable/bg_ee8833_f7d377_r9.xml b/app/src/module_treasure_box/res/drawable/bg_ee8833_f7d377_r9.xml new file mode 100644 index 000000000..6b07ca44d --- /dev/null +++ b/app/src/module_treasure_box/res/drawable/bg_ee8833_f7d377_r9.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/module_treasure_box/res/layout/activity_treasure_box.xml b/app/src/module_treasure_box/res/layout/activity_treasure_box.xml index 462c2a962..770b2b3ec 100644 --- a/app/src/module_treasure_box/res/layout/activity_treasure_box.xml +++ b/app/src/module_treasure_box/res/layout/activity_treasure_box.xml @@ -19,7 +19,7 @@ + app:layout_constraintTop_toTopOf="@+id/view_bg" /> + app:layout_constraintBottom_toBottomOf="@+id/view_bg" /> + + diff --git a/app/src/module_treasure_box/res/layout/item_box_prize_hint.xml b/app/src/module_treasure_box/res/layout/item_box_prize_hint.xml index 4d3007316..5d6c6521c 100644 --- a/app/src/module_treasure_box/res/layout/item_box_prize_hint.xml +++ b/app/src/module_treasure_box/res/layout/item_box_prize_hint.xml @@ -8,7 +8,7 @@ android:orientation="horizontal" android:paddingStart="10dp" android:paddingEnd="10dp" - android:background="@drawable/bg_box_prize_hint_v3"> + android:background="@drawable/bg_ee8833_f7d377_r9"> \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 4e4e1e2f7..afc532c16 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,5 +24,5 @@ only_arm64=false channel_file=channel.txt -version_name=1.1.0.0 -version_code=110 \ No newline at end of file +version_name=1.1.1.0 +version_code=111 \ No newline at end of file diff --git a/nim_uikit/assets/emoji/emoji.xml b/nim_uikit/assets/emoji/emoji.xml index a9c52dbde..50ff9795f 100644 --- a/nim_uikit/assets/emoji/emoji.xml +++ b/nim_uikit/assets/emoji/emoji.xml @@ -1,88 +1,88 @@ - + - - + + - + - - + + - + - + - + - - - + + + - + - - - - - + + + + + - + - + - + - + - - + + - - + + - + - + - - - - + + + + - + - + - - - + + + - - + + - - - + + + @@ -91,41 +91,41 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - + + - - - - + + + +