From 8e719de57034af7e8a863b593ce8745cf182c45d Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 14 Jan 2021 17:38:00 +0800 Subject: [PATCH 01/49] =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=AD=97=E5=A2=9E=E5=8A=A0=E5=8E=BB=E7=A9=BA=E6=A0=BC=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yizhuan/erban/ui/search/SearchActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java b/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java index 19042d585..cb5d60f6c 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/search/SearchActivity.java @@ -438,7 +438,7 @@ public class SearchActivity extends BaseMvpActivity Date: Tue, 19 Jan 2021 11:54:03 +0800 Subject: [PATCH 02/49] =?UTF-8?q?=E9=BA=A6=E5=BA=8F=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E9=87=8C=E7=9A=84ChatRoomMember=E6=94=B9=E4=B8=BAMicMemberInfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/ButtonItemFactory.java | 48 +++++----- .../avroom/activity/RoomSettingActivity.java | 5 +- .../avroom/adapter/BaseMicroViewAdapter.java | 5 +- .../avroom/adapter/KtvMicroViewAdapter.java | 3 +- .../avroom/adapter/MicroViewAdapter.java | 36 +------ .../adapter/OnMicroItemClickListener.java | 5 +- .../avroom/dialog/PKSelectPeopleDialog.java | 3 +- .../fragment/HomePartyRoomFragment.java | 6 +- .../avroom/presenter/AvRoomPresenter.java | 22 +---- .../avroom/presenter/HomePartyPresenter.java | 89 +++++++----------- .../erban/ui/im/actions/GiftAction.java | 2 +- .../yizhuan/erban/ui/widget/GiftDialog.java | 12 +-- .../ApprenticeMissionTwoViewHolder.java | 2 +- .../activity/MWTeamRoomMessageAct.java | 2 +- .../MiniWorldTeamMessageActivity.java | 2 +- .../PublicChatHallMessageFragment.java | 2 +- .../manager/IMNetEaseManager.java | 56 +++++------ .../manager/RtcEngineManager.java | 3 +- .../bean/RoomQueueInfo.java | 6 +- .../xchat_android_core/gift/GiftModel.java | 12 +-- .../xchat_android_core/gift/IGiftModel.java | 6 +- .../im/custom/bean/RoomQueueAttachment.java | 57 ----------- .../xchat_android_core/noble/NobleUtil.java | 85 +++++++++++++++++ .../room/face/DynamicFaceModel.java | 3 +- .../room/model/RoomBaseModel.java | 9 +- .../room/queue/bean/MicMemberInfo.java | 16 +++- .../room/queue/bean/RoomQueueInfo.java | 94 ------------------- .../room/queue/bean/RoomQueueMemberInfo.java | 34 ------- 28 files changed, 234 insertions(+), 391 deletions(-) delete mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/RoomQueueAttachment.java delete mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueInfo.java delete mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueMemberInfo.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java b/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java index 8761ee9dc..efcd597cc 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java @@ -90,8 +90,12 @@ public class ButtonItemFactory { ChatRoomMember chatRoomMember = null; String currentUid = String.valueOf(AuthModel.get().getCurrentUid()); //null表示不在麦位,比如,点击公屏的用户时 - if (roomQueueInfo != null) { - chatRoomMember = roomQueueInfo.mChatRoomMember; + + if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null) { + chatRoomMember = new ChatRoomMember(); + chatRoomMember.setAccount(roomQueueInfo.mChatRoomMember.getAccount()); + chatRoomMember.setNick(roomQueueInfo.mChatRoomMember.getNick()); + chatRoomMember.setAvatar(roomQueueInfo.mChatRoomMember.getAvatar()); } if (chatRoomMember == null) { chatRoomMember = AvRoomDataManager.get().getChatRoomMember(account); @@ -201,9 +205,9 @@ public class ButtonItemFactory { /** * 创建相关的buttons 添加到资料卡片 * - * @param context context - * @param uid uid or 云信account - * @param listener dialog的监听回调 + * @param context context + * @param uid uid or 云信account + * @param listener dialog的监听回调 * @return List */ public static List createPublicChatHallButtonItems( @@ -393,22 +397,22 @@ public class ButtonItemFactory { IMNetEaseManager.get().kickMemberFromRoomBySdk(JavaUtil.str2long(roomId), JavaUtil.str2long(account), reason) .subscribe((s, throwable) -> { - if (throwable != null) { - if (throwable.getMessage().contains("404")) { - SingleToastUtil.showToast(BasicConfig.INSTANCE.getAppContext(), "用户不在房间"); - } else { - SingleToastUtil.showToast(BasicConfig.INSTANCE.getAppContext(), throwable.getMessage()); - } - } else { - IMNetEaseManager.get().kickMemberFromRoomBySdk(Long.valueOf(roomId), - Long.valueOf(account), nick) - .subscribe(chatRoomMessage -> - KickModel.get().sendMessage(chatRoomMessage)); + if (throwable != null) { + if (throwable.getMessage().contains("404")) { + SingleToastUtil.showToast(BasicConfig.INSTANCE.getAppContext(), "用户不在房间"); + } else { + SingleToastUtil.showToast(BasicConfig.INSTANCE.getAppContext(), throwable.getMessage()); + } + } else { + IMNetEaseManager.get().kickMemberFromRoomBySdk(Long.valueOf(roomId), + Long.valueOf(account), nick) + .subscribe(chatRoomMessage -> + KickModel.get().sendMessage(chatRoomMessage)); - Logger.e("kick out mic and room: " + s); - IMNetEaseManager.get().noticeKickOutChatMember(null, account); - } - }); + Logger.e("kick out mic and room: " + s); + IMNetEaseManager.get().noticeKickOutChatMember(null, account); + } + }); } }); } @@ -502,7 +506,7 @@ public class ButtonItemFactory { //发送礼物 /** - * @param isInRoom true 在房间内弹起 + * @param isInRoom true 在房间内弹起 * @param isHideMagicTab true 隐藏魔法 * @return ViewItem */ @@ -647,7 +651,7 @@ public class ButtonItemFactory { // 私聊 buttonItems.add(createPrivateChatItem(context, account, isInRoom)); //装扮和关注目前是都有的操作 - // buttonItems.add(createSendDecorationItem(context, uid)); + // buttonItems.add(createSendDecorationItem(context, uid)); buttonItems.add(createAttentItem()); buttonItems.add(createFindMeItem()); return buttonItems; diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomSettingActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomSettingActivity.java index f3a5bb9e2..6bbeee269 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomSettingActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomSettingActivity.java @@ -42,6 +42,7 @@ import com.yizhuan.xchat_android_core.room.giftvalue.GiftValueModel; import com.yizhuan.xchat_android_core.room.giftvalue.helper.GiftValueMrg; import com.yizhuan.xchat_android_core.room.model.AvRoomModel; import com.yizhuan.xchat_android_core.room.model.RoomSettingModel; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_core.utils.net.BeanObserver; @@ -660,7 +661,7 @@ public class RoomSettingActivity extends BaseMvpActivity targetUids = new ArrayList<>(); for (int i = 0; i < micMemberInfos.size(); i++) { - targetUids.add(micMemberInfos.get(i).getUid()); + targetUids.add(Long.parseLong(micMemberInfos.get(i).getAccount())); } boolean canUseNobleGiftOrNot = GiftModel.get().canUseNobleGiftOrNot(giftInfo); if (canUseNobleGiftOrNot) { @@ -1925,7 +1925,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment { List accounts = new ArrayList<>(); if (!ListUtils.isListEmpty(entries)) { JsonParser jsonParser = new JsonParser(); - ChatRoomMember chatRoomMember; + MicMemberInfo chatRoomMember; for (Entry entry : entries) { RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(Integer.parseInt(entry.key)); if (roomQueueInfo != null) { JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); if (valueJsonObj != null) { - chatRoomMember = new ChatRoomMember(); - if (valueJsonObj.has("uid")) { - int uid = valueJsonObj.get("uid").getAsInt(); - accounts.add(String.valueOf(uid)); - chatRoomMember.setAccount(String.valueOf(uid)); - } - if (valueJsonObj.has("nick")) { - chatRoomMember.setNick(valueJsonObj.get("nick").getAsString()); - } - if (valueJsonObj.has("avatar")) { - chatRoomMember.setAvatar(valueJsonObj.get("avatar").getAsString()); - } - if (valueJsonObj.has("gender")) { - roomQueueInfo.gender = valueJsonObj.get("gender").getAsInt(); - } - if (valueJsonObj.has("groupType")) { - roomQueueInfo.groupType = valueJsonObj.get("groupType").getAsInt(); - } + chatRoomMember = mGson.fromJson(valueJsonObj,MicMemberInfo.class); roomQueueInfo.mChatRoomMember = chatRoomMember; } AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.valueOf(entry.key), roomQueueInfo); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java index cf7f53c14..f5dc21ca7 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java @@ -6,6 +6,7 @@ import android.util.Log; import androidx.annotation.NonNull; +import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.netease.nimlib.sdk.NIMClient; @@ -51,6 +52,7 @@ import com.yizhuan.xchat_android_core.room.model.AvRoomModel; import com.yizhuan.xchat_android_core.room.model.HomePartyModel; import com.yizhuan.xchat_android_core.room.model.RoomBaseModel; import com.yizhuan.xchat_android_core.room.model.RoomSettingModel; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.super_admin.model.SuperAdminModel; import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; import com.yizhuan.xchat_android_core.user.UserModel; @@ -124,7 +126,7 @@ public class HomePartyPresenter extends BaseMvpPresenter { * @param micPosition 麦序位置 * @param chatRoomMember 坑上的用户 */ - public void microPhonePositionClick(final int micPosition, ChatRoomMember chatRoomMember) { + public void microPhonePositionClick(final int micPosition, MicMemberInfo chatRoomMember) { final RoomInfo currentRoom = AvRoomDataManager.get().mCurrentRoomInfo; if (currentRoom == null) { return; @@ -459,61 +461,42 @@ public class HomePartyPresenter extends BaseMvpPresenter { mHomePartyMode.queryRoomMicInfo(String.valueOf(roomInfo.getRoomId())) .delay(1, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer>>() { - @Override - public void accept(List> entries) throws Exception { - if (!ListUtils.isListEmpty(entries)) { - JsonParser jsonParser = new JsonParser(); - ChatRoomMember chatRoomMember; - for (Entry entry : entries) { - RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(Integer.parseInt(entry.key)); - if (roomQueueInfo != null) { - JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); - if (valueJsonObj != null) { - chatRoomMember = new ChatRoomMember(); - if (valueJsonObj.has("uid")) { - int uid = valueJsonObj.get("uid").getAsInt(); - chatRoomMember.setAccount(String.valueOf(uid)); - } - if (valueJsonObj.has("nick")) { - chatRoomMember.setNick(valueJsonObj.get("nick").getAsString()); - } - if (valueJsonObj.has("avatar")) { - chatRoomMember.setAvatar(valueJsonObj.get("avatar").getAsString()); - } - if (valueJsonObj.has("gender")) { - roomQueueInfo.gender = valueJsonObj.get("gender").getAsInt(); - } - if (valueJsonObj.has("groupType")) { - roomQueueInfo.groupType = valueJsonObj.get("groupType").getAsInt(); - } - roomQueueInfo.mChatRoomMember = chatRoomMember; - } - AvRoomDataManager.get().addRoomQueueInfo(entry.key, roomQueueInfo); + .subscribe(entries -> { + if (!ListUtils.isListEmpty(entries)) { + JsonParser jsonParser = new JsonParser(); + MicMemberInfo chatRoomMember; + for (Entry entry : entries) { + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(Integer.parseInt(entry.key)); + if (roomQueueInfo != null) { + JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); + if (valueJsonObj != null) { + chatRoomMember =new Gson().fromJson(valueJsonObj,MicMemberInfo.class); + roomQueueInfo.mChatRoomMember = chatRoomMember; } - } - } else { - //麦上都没有人 - AvRoomDataManager.get().resetMicMembers(); - } - if (getMvpView() != null) - getMvpView().chatRoomReConnectView(); - //之前在麦上 - if (queueInfo != null && queueInfo.mChatRoomMember != null && queueInfo.mRoomMicInfo != null) { - RoomQueueInfo roomQueueInfo = AvRoomDataManager.get() - .getRoomQueueMemberInfoByMicPosition(queueInfo.mRoomMicInfo.getPosition()); - //麦上没人 - String account = queueInfo.mChatRoomMember.getAccount(); - if (roomQueueInfo != null && (roomQueueInfo.mChatRoomMember == null || - Objects.equals(account, roomQueueInfo.mChatRoomMember.getAccount()))) { - roomQueueInfo.mChatRoomMember = null; - //断网重连,不要清除麦上的礼物值 - upMicroPhone(queueInfo.mRoomMicInfo.getPosition(), account, true, true); + AvRoomDataManager.get().addRoomQueueInfo(entry.key, roomQueueInfo); } } - IMNetEaseManager.get().mCacheRoomQueueInfo = null; - Logger.i("断网重连获取队列信息成功...." + entries); + } else { + //麦上都没有人 + AvRoomDataManager.get().resetMicMembers(); } + if (getMvpView() != null) + getMvpView().chatRoomReConnectView(); + //之前在麦上 + if (queueInfo != null && queueInfo.mChatRoomMember != null && queueInfo.mRoomMicInfo != null) { + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get() + .getRoomQueueMemberInfoByMicPosition(queueInfo.mRoomMicInfo.getPosition()); + //麦上没人 + String account = queueInfo.mChatRoomMember.getAccount(); + if (roomQueueInfo != null && (roomQueueInfo.mChatRoomMember == null || + Objects.equals(account, roomQueueInfo.mChatRoomMember.getAccount()))) { + roomQueueInfo.mChatRoomMember = null; + //断网重连,不要清除麦上的礼物值 + upMicroPhone(queueInfo.mRoomMicInfo.getPosition(), account, true, true); + } + } + IMNetEaseManager.get().mCacheRoomQueueInfo = null; + Logger.i("断网重连获取队列信息成功...." + entries); }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { @@ -745,7 +728,7 @@ public class HomePartyPresenter extends BaseMvpPresenter { if (AvRoomDataManager.get().isManager()) { if (queueInfo != null) { - ChatRoomMember chatRoomMember = queueInfo.mChatRoomMember; + MicMemberInfo chatRoomMember = queueInfo.mChatRoomMember; if (chatRoomMember != null) { closeLeaveMode(-1, null); return; diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/actions/GiftAction.java b/app/src/main/java/com/yizhuan/erban/ui/im/actions/GiftAction.java index dd535397e..133924979 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/im/actions/GiftAction.java +++ b/app/src/main/java/com/yizhuan/erban/ui/im/actions/GiftAction.java @@ -58,7 +58,7 @@ public class GiftAction extends BaseAction implements GiftDialog.OnGiftDialogBtn if (giftInfo == null) return; boolean canUseNobleGiftOrNot = GiftModel.get().canUseNobleGiftOrNot(giftInfo); if (canUseNobleGiftOrNot) { - GiftModel.get().sendPersonalGift(giftInfo.getGiftId(), micMemberInfos.get(0).getUid(), number, msg, isknap) + GiftModel.get().sendPersonalGift(giftInfo.getGiftId(), micMemberInfos.get(0).getAccount(), number, msg, isknap) .doOnError(throwable -> { if (callback != null) { callback.onFail(); diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java index a9178b39d..f3361cbb1 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java @@ -240,7 +240,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene for (int i = 0; i < micMemberMap.size(); i++) { MicMemberInfo micMemberInfo = new MicMemberInfo(); RoomQueueInfo roomQueueInfo = micMemberMap.get(micMemberMap.keyAt(i)); - ChatRoomMember mChatRoomMember = roomQueueInfo.mChatRoomMember; + MicMemberInfo mChatRoomMember = roomQueueInfo.mChatRoomMember; if (mChatRoomMember == null) continue; // 合法判断 if (TextUtils.isEmpty(mChatRoomMember.getAccount()) || @@ -263,7 +263,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene micMemberInfo.setNick(mChatRoomMember.getNick()); micMemberInfo.setAvatar(mChatRoomMember.getAvatar()); micMemberInfo.setMicPosition(micMemberMap.keyAt(i)); - micMemberInfo.setUid(Long.valueOf(mChatRoomMember.getAccount())); + micMemberInfo.setAccount(mChatRoomMember.getAccount()); //添加性别信息 micMemberInfo.setGender(roomQueueInfo.gender); micMemberInfos.add(micMemberInfo); @@ -278,7 +278,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene micMemberInfo.setNick(AvRoomDataManager.get().nick); micMemberInfo.setAvatar(AvRoomDataManager.get().avatar); micMemberInfo.setMicPosition(-1); - micMemberInfo.setUid(AvRoomDataManager.get().getRoomUid()); + micMemberInfo.setAccount(String.valueOf(AvRoomDataManager.get().getRoomUid())); //添加性别信息 micMemberInfo.setGender(AvRoomDataManager.get().gender); micMemberInfos.add(0, micMemberInfo); @@ -1037,7 +1037,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene if (!isInRoom) {//不在房间的情况 List targetUids = new ArrayList<>(); MicMemberInfo micMemberInfo = new MicMemberInfo(); - micMemberInfo.setUid(uid); + micMemberInfo.setAccount(String.valueOf(AvRoomDataManager.get().getRoomUid())); targetUids.add(micMemberInfo); Log.e(TAG, "onClick: indicator type: " + giftIndicator.getCurrrentType()); giftDialogBtnClickListener.onSendGiftBtnClick(current, targetUids, giftNumber == -1 ? current.getCount() : giftNumber, giftMessage, @@ -1063,7 +1063,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene if (!userOnMic && uid > 0) { List targetUids = new ArrayList<>(); MicMemberInfo micMemberInfo = new MicMemberInfo(); - micMemberInfo.setUid(uid); + micMemberInfo.setAccount(String.valueOf(uid)); targetUids.add(micMemberInfo); Log.e(TAG, "onClick: indicator type: " + giftIndicator.getCurrrentType()); giftDialogBtnClickListener.onSendGiftBtnClick(current, targetUids, @@ -1248,7 +1248,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene private void sendBatchMagic(MagicInfo magicInfo, int magicNum, List micMemberInfos, boolean isWholeMic, SenGiftCallback callback) { List targetUids = new ArrayList<>(); for (MicMemberInfo memberInfo : micMemberInfos) { - targetUids.add(memberInfo.getUid()); + targetUids.add(Long.parseLong(memberInfo.getAccount())); } MagicModel.get().sendBatchMagic(magicInfo.getMagicId(), magicNum, targetUids, isWholeMic) .subscribe((multiMagicReceivedInfo, throwable) -> { diff --git a/app/src/module_mentoring_relationship/java/com/yizhuan/tutu/mentoring_relationship/viewholder/ApprenticeMissionTwoViewHolder.java b/app/src/module_mentoring_relationship/java/com/yizhuan/tutu/mentoring_relationship/viewholder/ApprenticeMissionTwoViewHolder.java index 9eb482fb3..9c3e224fa 100644 --- a/app/src/module_mentoring_relationship/java/com/yizhuan/tutu/mentoring_relationship/viewholder/ApprenticeMissionTwoViewHolder.java +++ b/app/src/module_mentoring_relationship/java/com/yizhuan/tutu/mentoring_relationship/viewholder/ApprenticeMissionTwoViewHolder.java @@ -158,7 +158,7 @@ public class ApprenticeMissionTwoViewHolder extends MissionViewHolderBase implem boolean canUseNobleGiftOrNot = GiftModel.get().canUseNobleGiftOrNot(giftInfo); if (canUseNobleGiftOrNot) { GiftModel.get() - .sendPersonalGift(giftInfo.getGiftId(), micMemberInfos.get(0).getUid(), number, msg, isknap) + .sendPersonalGift(giftInfo.getGiftId(), micMemberInfos.get(0).getAccount(), number, msg, isknap) .compose(RxHelper.handleSchedulers()) .flatMap(giftReceiveInfoServiceResult -> GiftToolbox.sendGiftPrivateChatMessage(giftReceiveInfoServiceResult.getData())) diff --git a/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MWTeamRoomMessageAct.java b/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MWTeamRoomMessageAct.java index 9c25cd025..806479485 100644 --- a/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MWTeamRoomMessageAct.java +++ b/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MWTeamRoomMessageAct.java @@ -191,7 +191,7 @@ public class MWTeamRoomMessageAct extends BaseMessageActivity implements IMWTeam boolean canUseNobleGiftOrNot = GiftModel.get().canUseNobleGiftOrNot(giftInfo); if (canUseNobleGiftOrNot) { - GiftModel.get().sendTeamGift(giftInfo.getGiftId(), micMemberInfos.get(0).getUid(), number, msg, isKnap, sessionId) + GiftModel.get().sendTeamGift(giftInfo.getGiftId(), micMemberInfos.get(0).getAccount(), number, msg, isKnap, sessionId) .doOnError(throwable -> { if (callback != null) { callback.onFail(); diff --git a/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldTeamMessageActivity.java b/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldTeamMessageActivity.java index f37a37b74..2badbefca 100644 --- a/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldTeamMessageActivity.java +++ b/app/src/module_mini_world/java/com/yizhuan/erban/miniworld/activity/MiniWorldTeamMessageActivity.java @@ -215,7 +215,7 @@ public class MiniWorldTeamMessageActivity extends BaseMessageActivity implements boolean canUseNobleGiftOrNot = GiftModel.get().canUseNobleGiftOrNot(giftInfo); if (canUseNobleGiftOrNot) { - GiftModel.get().sendTeamGift(giftInfo.getGiftId(), micMemberInfos.get(0).getUid(), number, msg, isKnap, sessionId) + GiftModel.get().sendTeamGift(giftInfo.getGiftId(), micMemberInfos.get(0).getAccount(), number, msg, isKnap, sessionId) .doOnError(throwable -> { if (callback != null) { callback.onFail(); diff --git a/app/src/module_public_chat_hall/java/com/yizhuan/erban/public_chat_hall/fragment/PublicChatHallMessageFragment.java b/app/src/module_public_chat_hall/java/com/yizhuan/erban/public_chat_hall/fragment/PublicChatHallMessageFragment.java index 960ba9588..7167a12ce 100644 --- a/app/src/module_public_chat_hall/java/com/yizhuan/erban/public_chat_hall/fragment/PublicChatHallMessageFragment.java +++ b/app/src/module_public_chat_hall/java/com/yizhuan/erban/public_chat_hall/fragment/PublicChatHallMessageFragment.java @@ -323,7 +323,7 @@ public class PublicChatHallMessageFragment extends TFragment implements ModulePr boolean canUseNobleGiftOrNot = GiftModel.get().canUseNobleGiftOrNot(giftInfo); if (canUseNobleGiftOrNot) { GiftModel.get().sendPersonalGiftInPublicChatHall(giftInfo.getGiftId(), - micMemberInfos.get(0).getUid(), number, msg, isKnap) + micMemberInfos.get(0).getAccount(), number, msg, isKnap) .doOnError(throwable -> { if (callback != null) { callback.onFail(); diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 22eb6d37a..fa94d69bb 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -131,6 +131,7 @@ import com.yizhuan.xchat_android_core.room.pk.bean.PKTeamInfo; import com.yizhuan.xchat_android_core.room.pk.bean.RoomPKInvitedUpMicMember; import com.yizhuan.xchat_android_core.room.pk.bean.RoomPkData; import com.yizhuan.xchat_android_core.room.pk.model.PkModel; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.room.queuing_mic.attachment.QueuingMicAttachment; import com.yizhuan.xchat_android_core.room.queuing_mic.bean.QueuingMicInfo; import com.yizhuan.xchat_android_core.room.queuing_mic.event.QueuingMicEmptyEvent; @@ -1389,26 +1390,23 @@ public final class IMNetEaseManager { private void chatRoomMemberIn(final String account, ChatRoomMessage msg) { List list = new ArrayList<>(1); list.add(account); - fetchRoomMembersByIds(list) - .subscribe((chatRoomMemberList, throwable) -> { - if (ListUtils.isListEmpty(chatRoomMemberList)) return; - ChatRoomMember chatRoomMember = chatRoomMemberList.get(0); - AvRoomDataManager.get().mRoomAllMemberList.add(chatRoomMember); - if (chatRoomMember.getMemberType() == MemberType.ADMIN) { - addManagerMember(chatRoomMember); - } - noticeRoomMemberChange(true, account); - }); - + noticeRoomMemberChange(true, account); ChatRoomMessageExtension messageExtension = msg.getChatRoomMessageExtension(); ChatRoomMember chatRoomMember = new ChatRoomMember(); Map extensionMap = null; if (messageExtension != null) { chatRoomMember.setNick(messageExtension.getSenderNick()); chatRoomMember.setAvatar(messageExtension.getSenderAvatar()); -// chatRoomMember.setMemberLevel(messageExtension); extensionMap = messageExtension.getSenderExtension(); } + //如果这里昵称不为空则用这个,公屏通知也用的这个,messageExtension里面的基本是空的 + ChatRoomNotificationAttachment attachment = (ChatRoomNotificationAttachment) msg.getAttachment(); + String senderNick = ""; + List nicks = attachment.getTargetNicks(); + if (nicks != null && nicks.size() > 0) { + senderNick = attachment.getTargetNicks().get(0); + chatRoomMember.setNick(senderNick); + } chatRoomMember.setAccount(account); if (extensionMap != null) { Object extensionData = extensionMap.get(chatRoomMember.getAccount()); @@ -1852,7 +1850,7 @@ public final class IMNetEaseManager { if (!TextUtils.isEmpty(key) && mMicQueueMemberMap != null) { RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(Integer.parseInt(key)); if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null) { - ChatRoomMember chatRoomMember = roomQueueInfo.mChatRoomMember; + MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; RoomPkData roomPkData = PkModel.get().getCurPkInfo(); //这里处理把这个人添加到队伍,或者移除队伍 @@ -1899,7 +1897,7 @@ public final class IMNetEaseManager { if (roomQueueInfo == null) { return; } - ChatRoomMember chatRoomMember = parseChatRoomMember(contentJsonObj, roomQueueInfo); + MicMemberInfo chatRoomMember = parseChatRoomMember(contentJsonObj, roomQueueInfo); //这里处理把这个人添加到队伍,或者移除队伍 UserInfo userInfo = new UserInfo(); userInfo.setUid(Long.parseLong(chatRoomMember.getAccount())); @@ -1963,25 +1961,8 @@ public final class IMNetEaseManager { } @NonNull - private ChatRoomMember parseChatRoomMember(JsonObject contentJsonObj, RoomQueueInfo roomQueueInfo) { - ChatRoomMember chatRoomMember = new ChatRoomMember(); - if (contentJsonObj.has("uid")) { - int uid = contentJsonObj.get("uid").getAsInt(); - chatRoomMember.setAccount(String.valueOf(uid)); - } - if (contentJsonObj.has("nick")) { - chatRoomMember.setNick(contentJsonObj.get("nick").getAsString()); - } - if (contentJsonObj.has("avatar")) { - chatRoomMember.setAvatar(contentJsonObj.get("avatar").getAsString()); - } - if (contentJsonObj.has("gender")) { - roomQueueInfo.gender = contentJsonObj.get("gender").getAsInt(); - } - if (contentJsonObj.has("groupType")) { - roomQueueInfo.groupType = contentJsonObj.get("groupType").getAsInt(); - } - return chatRoomMember; + private MicMemberInfo parseChatRoomMember(JsonObject contentJsonObj, RoomQueueInfo roomQueueInfo) { + return new Gson().fromJson(contentJsonObj,MicMemberInfo.class); } public Single> fetchRoomMembersByIds(final List accounts) { @@ -2636,7 +2617,14 @@ public final class IMNetEaseManager { if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) continue; // 有拓展字段 if (roomQueueInfo.mChatRoomMember.getExtension() != null) { - chatRoomMembers.add(roomQueueInfo.mChatRoomMember); + MicMemberInfo micMemberInfo = roomQueueInfo.mChatRoomMember; + ChatRoomMember chatRoomMember = new ChatRoomMember(); + chatRoomMember.setAccount(micMemberInfo.getAccount()); + chatRoomMember.setAvatar(micMemberInfo.getAvatar()); + chatRoomMember.setNick(micMemberInfo.getNick()); + chatRoomMember.setExtension(micMemberInfo.getExtension()); + chatRoomMembers.add(chatRoomMember); + } else { // 用于重新获取拓展字段 accounts.add(roomQueueInfo.mChatRoomMember.getAccount()); diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java index f2c9f8bfc..6c3274767 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java @@ -13,6 +13,7 @@ import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.ktv.event.RemoteVideoEvent; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.statistic.LogFactory; import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.LogProtocol; @@ -243,7 +244,7 @@ public final class RtcEngineManager { } } - public void setRemoteMute(ChatRoomMember chatRoomMember, boolean mute) { + public void setRemoteMute(MicMemberInfo chatRoomMember, boolean mute) { if (chatRoomMember != null && !TextUtils.isEmpty(chatRoomMember.getAccount())) { String account = chatRoomMember.getAccount(); Integer uid = Integer.valueOf(account); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/bean/RoomQueueInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/bean/RoomQueueInfo.java index e178baced..731a75597 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/bean/RoomQueueInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/bean/RoomQueueInfo.java @@ -1,7 +1,7 @@ package com.yizhuan.xchat_android_core.bean; -import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; import com.yizhuan.xchat_android_core.room.giftvalue.bean.GiftValueData; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; /** *

房间麦序单个坑位信息实体,包含麦序状态,成员信息

@@ -13,7 +13,7 @@ public class RoomQueueInfo { /** 坑位信息(是否所坑,开麦等) */ public RoomMicInfo mRoomMicInfo; /** 坑上人员信息 */ - public ChatRoomMember mChatRoomMember; + public MicMemberInfo mChatRoomMember; /** 当前成员的性别,本属于ChatRoomMember的 */ public int gender; /** @@ -25,7 +25,7 @@ public class RoomQueueInfo { public GiftValueData giftValueData = new GiftValueData(); - public RoomQueueInfo(RoomMicInfo roomMicInfo, ChatRoomMember chatRoomMember) { + public RoomQueueInfo(RoomMicInfo roomMicInfo, MicMemberInfo chatRoomMember) { mRoomMicInfo = roomMicInfo; mChatRoomMember = chatRoomMember; } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/gift/GiftModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/gift/GiftModel.java index de57932b6..5d7369054 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/gift/GiftModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/gift/GiftModel.java @@ -506,10 +506,10 @@ public class GiftModel extends BaseModel implements IGiftModel { */ @Override public Single> sendPersonalGift(final int giftId, - final long targetUid, final int giftNum, + final String targetUid, final int giftNum, String msg, boolean isKnap) { List targetUids = new ArrayList<>(); - targetUids.add(targetUid); + targetUids.add(Long.parseLong(targetUid)); return sendGift(giftId, giftNum, targetUids, GiftSendType.TYPE_PRIVATE_CHAT, isKnap ? GiftSource.BACKPACK : GiftSource.COMMON, msg, isKnap, false, null); } @@ -525,10 +525,10 @@ public class GiftModel extends BaseModel implements IGiftModel { */ @Override public Single> sendPersonalGiftInPublicChatHall(final int giftId, - final long targetUid, final int giftNum, + final String targetUid, final int giftNum, String msg, boolean isKnap) { List targetUids = new ArrayList<>(); - targetUids.add(targetUid); + targetUids.add(Long.parseLong(targetUid)); return sendGift(giftId, giftNum, targetUids, GiftSendType.TYPE_PUBLIC_CHAT_HALL, isKnap ? GiftSource.BACKPACK : GiftSource.COMMON, msg, isKnap, false, null); } @@ -599,9 +599,9 @@ public class GiftModel extends BaseModel implements IGiftModel { } @Override - public Single> sendTeamGift(int giftId, long targetUid, int giftNum, String msg, boolean isKnap, String chatSessionId) { + public Single> sendTeamGift(int giftId, String targetUid, int giftNum, String msg, boolean isKnap, String chatSessionId) { List targetUids = new ArrayList<>(); - targetUids.add(targetUid); + targetUids.add(Long.parseLong(targetUid)); return sendGift(giftId, giftNum, targetUids, GiftSendType.TYPE_TEAM, isKnap ? GiftSource.BACKPACK : GiftSource.COMMON, msg, isKnap, false, chatSessionId); } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/gift/IGiftModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/gift/IGiftModel.java index 1f76e0651..db81867b6 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/gift/IGiftModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/gift/IGiftModel.java @@ -104,7 +104,7 @@ public interface IGiftModel { * @return - */ Single> sendPersonalGift(int giftId, - long targetUid, + String targetUid, int giftNum, String msg, boolean isKnap); @@ -118,7 +118,7 @@ public interface IGiftModel { * @return - */ Single> sendPersonalGiftInPublicChatHall(final int giftId, - final long targetUid, + final String targetUid, final int giftNum, String msg, boolean isKnap); @@ -161,7 +161,7 @@ public interface IGiftModel { * @return - */ Single> sendTeamGift(int giftId, - long targetUid, + String targetUid, int giftNum, String msg, boolean isKnap, String chatSessionId); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/RoomQueueAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/RoomQueueAttachment.java deleted file mode 100644 index d8eaa8318..000000000 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/RoomQueueAttachment.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.yizhuan.xchat_android_core.im.custom.bean; - -import com.alibaba.fastjson.JSONObject; -import com.yizhuan.xchat_android_core.room.queue.bean.RoomQueueInfo; - -/** - * Created by chenran on 2017/9/7. - */ - -public class RoomQueueAttachment extends CustomAttachment { - private long uid; - private RoomQueueInfo roomQueueInfo; - - public RoomQueueAttachment(int first, int second) { - super(first, second); - } - - public long getUid() { - return uid; - } - - public void setUid(long uid) { - this.uid = uid; - } - - public RoomQueueInfo getRoomQueueInfo() { - return roomQueueInfo; - } - - public void setRoomQueueInfo(RoomQueueInfo roomQueueInfo) { - this.roomQueueInfo = roomQueueInfo; - } - - @Override - protected void parseData(JSONObject data) { - uid = data.getLong("uid"); - JSONObject jsonObject = data.getJSONObject("data"); - int queueType = jsonObject.getIntValue("queueType"); - roomQueueInfo = new RoomQueueInfo(queueType); - roomQueueInfo.setMute(jsonObject.getBoolean("isMute")); - roomQueueInfo.setInviteUid(jsonObject.getString("inviteUid")); - roomQueueInfo.setPosition(jsonObject.getString("position")); - } - - @Override - protected JSONObject packData() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("queueType", roomQueueInfo.getQueueType()); - jsonObject.put("isMute", roomQueueInfo.isMute()); - jsonObject.put("inviteUid", roomQueueInfo.getInviteUid()); - jsonObject.put("position", roomQueueInfo.getPosition()); - JSONObject object = new JSONObject(); - object.put("uid", uid); - object.put("data", jsonObject); - return object; - } -} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java b/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java index 4c2cfc2a5..6f4ae7dd2 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java @@ -29,6 +29,7 @@ import com.bumptech.glide.request.transition.Transition; import com.netease.nim.uikit.support.glide.GlideApp; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.user.bean.UserInfo; import com.yizhuan.xchat_android_core.utils.ExtensionUtil; import com.yizhuan.xchat_android_core.utils.ImageSplitter; @@ -539,6 +540,22 @@ public class NobleUtil { } } + public static Object getResource(String type, MicMemberInfo chatRoomMember) { + // 判断是否有权限 + if (!hasRightToDo(type, chatRoomMember)) return ""; + Object o; + if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount()) + || chatRoomMember.getExtension() == null + || (o = chatRoomMember.getExtension().get(chatRoomMember.getAccount())) == null) + return ""; + Map map = (Map) o; + if (map.get(type) instanceof Integer || map.get(type) instanceof Long || + map.get(type) instanceof Float || map.get(type) instanceof Double) { + return String.valueOf(map.get(type)); + } + return map.get(type); + } + public static Object getResource(String type, ChatRoomMember chatRoomMember) { // 判断是否有权限 if (!hasRightToDo(type, chatRoomMember)) return ""; @@ -569,6 +586,20 @@ public class NobleUtil { return (String) map.get(type); } + public static String getHeadResource(String type, MicMemberInfo chatRoomMember) { + Object o; + if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount()) + || chatRoomMember.getExtension() == null + || (o = chatRoomMember.getExtension().get(chatRoomMember.getAccount())) == null) + return ""; + Map map = (Map) o; + if (map.get(type) instanceof Integer || map.get(type) instanceof Long || + map.get(type) instanceof Float || map.get(type) instanceof Double) { + return String.valueOf(map.get(type)); + } + return (String) map.get(type); + } + /** * 该等级是否有权限做这个操作 / 获取这个资源 * @@ -609,6 +640,18 @@ public class NobleUtil { return hasRight; } + /** + * @param type 参数的类型 + * @param chatRoomMember 房间的用户信息 + * @return 是否有权限去获取这个资源 + */ + private static boolean hasRightToDo(String type, MicMemberInfo chatRoomMember) { + if (TextUtils.isEmpty(type) || chatRoomMember == null) return false; + int level = getLevel(chatRoomMember); + if (level == 0) return false; + return hasRightToDo(type, level); + } + /** * @param type 参数的类型 * @param chatRoomMember 房间的用户信息 @@ -640,6 +683,25 @@ public class NobleUtil { return 0; } + /** + * 获取某个聊天室成员的贵族等级 + * + * @param chatRoomMember 某个聊天室成员 + * @return - + */ + private static int getLevel(MicMemberInfo chatRoomMember) { + Map extension = getExtension(chatRoomMember); + if (extension == null) return 0; + Object o = extension.get(NobleResourceType.KEY_LEVEL); + if (o == null) return 0; + if (o instanceof String) { + return Integer.valueOf((String) o); + } else if (o instanceof Integer) { + return (int) o; + } + return 0; + } + private static String getLevel(Object level) { if (level == null) return null; if (level instanceof String) { @@ -688,6 +750,19 @@ public class NobleUtil { return (String) o1; } + /** + * 获取用户经验等级的图片 + * 获取用户魅力等级的图片 + * + * @return - + */ + public static String getLevel(String type, MicMemberInfo chatRoomMember) { + Map extension = getExtension(chatRoomMember); + if (extension == null) return ""; + if (extension.get(type) == null) return ""; + return extension.get(type).toString(); + } + /** * 获取用户经验等级的图片 * 获取用户魅力等级的图片 @@ -701,6 +776,7 @@ public class NobleUtil { return extension.get(type).toString(); } + /** * 获取用户座驾名称 * @@ -795,6 +871,15 @@ public class NobleUtil { * @param chatRoomMember 某个聊天室成员 * @return - */ + private static Map getExtension(MicMemberInfo chatRoomMember) { + Object o; + if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount()) + || chatRoomMember.getExtension() == null + || (o = chatRoomMember.getExtension().get(chatRoomMember.getAccount())) == null) + return null; + return (Map) o; + } + private static Map getExtension(ChatRoomMember chatRoomMember) { Object o; if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount()) diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/face/DynamicFaceModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/face/DynamicFaceModel.java index 1e9c7ffa0..fe2916e0c 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/face/DynamicFaceModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/face/DynamicFaceModel.java @@ -28,6 +28,7 @@ import com.yizhuan.xchat_android_core.noble.NobleInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.event.FaceIsReadyEvent; import com.yizhuan.xchat_android_core.room.event.ReceiveFaceEvent; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; import com.yizhuan.xchat_android_library.net.rxnet.RxNet; @@ -154,7 +155,7 @@ public class DynamicFaceModel extends BaseModel implements IDynamicFaceModel { SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; List faceReceiveInfos = new ArrayList<>(); for (int i = 0; i < mMicQueueMemberMap.size(); i++) { - ChatRoomMember mChatRoomMember = mMicQueueMemberMap.get(mMicQueueMemberMap.keyAt(i)).mChatRoomMember; + MicMemberInfo mChatRoomMember = mMicQueueMemberMap.get(mMicQueueMemberMap.keyAt(i)).mChatRoomMember; if (mChatRoomMember == null || TextUtils.isEmpty(mChatRoomMember.getNick()) || TextUtils.isEmpty(mChatRoomMember.getAccount())) continue; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java index b2a1698c7..712ad58b5 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java @@ -41,6 +41,7 @@ import com.yizhuan.xchat_android_core.room.giftvalue.helper.GiftValueMrg; import com.yizhuan.xchat_android_core.room.model.inteface.IRoomBaseModel; import com.yizhuan.xchat_android_core.room.pk.bean.RoomPKInvitedUpMicMember; import com.yizhuan.xchat_android_core.room.pk.model.PkModel; +import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.BaseInfo; import com.yizhuan.xchat_android_core.user.bean.UserInfo; @@ -342,7 +343,7 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { if (roomQueueInfo == null) { return; } - ChatRoomMember chatRoomMember = roomQueueInfo.mChatRoomMember; + MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; final RoomMicInfo roomMicInfo = roomQueueInfo.mRoomMicInfo; if (chatRoomMember != null) { SingleToastUtil.showToast("该麦位已经有人了哦~"); @@ -398,14 +399,14 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { List accounts = new ArrayList<>(); if (!ListUtils.isListEmpty(entries)) { JsonParser jsonParser = new JsonParser(); - ChatRoomMember chatRoomMember; + MicMemberInfo chatRoomMember; for (Entry entry : entries) { RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(Integer.parseInt(entry.key)); //当前坑上有人就不要去管了 if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember == null) { JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); if (valueJsonObj != null) { - chatRoomMember = new ChatRoomMember(); + chatRoomMember = new MicMemberInfo(); if (valueJsonObj.has("uid")) { int uid = valueJsonObj.get("uid").getAsInt(); accounts.add(String.valueOf(uid)); @@ -467,7 +468,7 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { if (roomQueueInfo == null) { return; } - ChatRoomMember chatRoomMember = roomQueueInfo.mChatRoomMember; + MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; final RoomMicInfo roomMicInfo = roomQueueInfo.mRoomMicInfo; //坑上没人且没锁 diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java index 3f4c6e33d..861cb7c0d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java @@ -1,5 +1,10 @@ package com.yizhuan.xchat_android_core.room.queue.bean; +import com.google.gson.annotations.SerializedName; + +import java.util.Map; +import java.util.Objects; + import lombok.Data; /** @@ -9,7 +14,8 @@ import lombok.Data; @Data public class MicMemberInfo { - private long uid; + @SerializedName("uid") + private String account; private String avatar; private String nick; private int micPosition; @@ -20,6 +26,8 @@ public class MicMemberInfo { private boolean inPkMode = false; private int teamId = 0; private boolean isSelected = false; + private Map extension; + private int groupType; public MicMemberInfo() { @@ -30,14 +38,12 @@ public class MicMemberInfo { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MicMemberInfo that = (MicMemberInfo) o; - - return uid == that.uid; + return Objects.equals(account, that.account); } @Override public int hashCode() { - return (int) (uid ^ (uid >>> 32)); + return Objects.hash(account); } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueInfo.java deleted file mode 100644 index 5521b7fac..000000000 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueInfo.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.yizhuan.xchat_android_core.room.queue.bean; - -import androidx.annotation.IntDef; - -import com.alibaba.fastjson.JSONObject; - -import java.io.Serializable; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * 房间坑位状态信息 - * - * @author chenran - * @date 2017/9/5 - */ -public class RoomQueueInfo implements Serializable { - - public static final int CLOSE = 1; - public static final int OPEN = 0; - - @IntDef({CLOSE, OPEN}) - @Retention(RetentionPolicy.SOURCE) - public @interface QueueLockStatus { - } - - @IntDef({CLOSE, OPEN}) - @Retention(RetentionPolicy.SOURCE) - public @interface QueueMuteStatus { - } - - /** 当前坑位状态:是否开锁 0--开锁, 1---闭锁 */ - public int lockStatus; - /** 当前坑位是否静音 0---开麦, 1---闭麦 */ - public int muteStatus; - - private String inviteUid; - private String position; - - - public static final int QUEUE_TYPE_FREE = 0; - public static final int QUEUE_TYPE_LOCK = 1; - public static final String KEY_INVITEUID = "inviteUid"; - public static final String KEY_POSITION = "position"; - - /** 当前坑位状态 */ - private int queueType; - /** 是否静音 */ - private boolean isMute; - - public RoomQueueInfo(int queueType) { - this.queueType = queueType; - this.isMute = false; - } - - public int getQueueType() { - return queueType; - } - - public void setQueueType(int queueType) { - this.queueType = queueType; - } - - public boolean isMute() { - return isMute; - } - - public void setMute(boolean mute) { - isMute = mute; - } - - public String getInviteUid() { - return inviteUid; - } - - public void setInviteUid(String inviteUid) { - this.inviteUid = inviteUid; - } - - public String getPosition() { - return position; - } - - public void setPosition(String position) { - this.position = position; - } - - public String toJsonString() { - JSONObject object = new JSONObject(); - object.put("queueType", queueType); - object.put("isMute", isMute); - return object.toJSONString(); - } -} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueMemberInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueMemberInfo.java deleted file mode 100644 index 716ba38fb..000000000 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/RoomQueueMemberInfo.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.yizhuan.xchat_android_core.room.queue.bean; - -import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; - -/** - * 坑上单个队列信息 - * Created by chenran on 2017/9/8. - */ - -public class RoomQueueMemberInfo { - private RoomQueueInfo roomQueueInfo; - public ChatRoomMember chatRoomMember; - - public RoomQueueMemberInfo(RoomQueueInfo roomQueueInfo, ChatRoomMember chatRoomMember) { - this.roomQueueInfo = roomQueueInfo; - this.chatRoomMember = chatRoomMember; - } - - public RoomQueueInfo getRoomQueueInfo() { - return roomQueueInfo; - } - - public void setRoomQueueInfo(RoomQueueInfo roomQueueInfo) { - this.roomQueueInfo = roomQueueInfo; - } - - public ChatRoomMember getChatRoomMember() { - return chatRoomMember; - } - - public void setChatRoomMember(ChatRoomMember chatRoomMember) { - this.chatRoomMember = chatRoomMember; - } -} From 1bbb464cf59488ec46c327edb46a03eb1a75e37f Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 19 Jan 2021 14:35:06 +0800 Subject: [PATCH 03/49] =?UTF-8?q?=E6=8A=8ARoomQueueInfo=E4=B8=AD=E6=9C=AC?= =?UTF-8?q?=E5=B1=9E=E4=BA=8EMicMemberInfo=E7=9A=84=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=94=BE=E5=9B=9E=E5=8E=BB=E4=BA=86...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/BaseMicroViewAdapter.java | 2 +- .../avroom/adapter/KtvMicroViewAdapter.java | 11 ++++++---- .../avroom/adapter/MicroViewAdapter.java | 22 ++++++++++++------- .../avroom/dialog/PKSelectPeopleDialog.java | 2 +- .../yizhuan/erban/ui/widget/GiftDialog.java | 2 +- .../manager/IMNetEaseManager.java | 10 +++------ .../bean/RoomQueueInfo.java | 9 -------- .../room/model/RoomBaseModel.java | 22 ++++--------------- .../room/pk/model/PkModel.java | 12 +++++----- .../room/queue/bean/MicMemberInfo.java | 6 +++++ gradle.properties | 4 ++-- 11 files changed, 45 insertions(+), 57 deletions(-) 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 9bdbc26ed..829fc4bf9 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 @@ -177,7 +177,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter 0 && roomQueueInfo.mChatRoomMember != null) { + if (roomQueueInfo.mChatRoomMember != null && roomQueueInfo.mChatRoomMember.getGroupType() > 0) { PKMemberInfo pkMemberInfo = new PKMemberInfo(); - pkMemberInfo.setTeamId(roomQueueInfo.groupType); + pkMemberInfo.setTeamId(roomQueueInfo.mChatRoomMember.getGroupType()); UserInfo userInfo = new UserInfo(); - userInfo.setGroupType(roomQueueInfo.groupType); + userInfo.setGroupType(roomQueueInfo.mChatRoomMember.getGroupType()); userInfo.setUid(Long.parseLong(roomQueueInfo.mChatRoomMember.getAccount())); userInfo.setNick(roomQueueInfo.mChatRoomMember.getNick()); userInfo.setAvatar(roomQueueInfo.mChatRoomMember.getAvatar()); - userInfo.setGender(roomQueueInfo.gender); + userInfo.setGender(roomQueueInfo.mChatRoomMember.getGender()); pkMemberInfo.setUserInfo(userInfo); pkMemberInfoList.add(pkMemberInfo); } @@ -705,8 +705,8 @@ public class PkModel extends BaseModel implements IPkModel { RoomQueueInfo roomQueueInfo = micQueue.get(key); if (null != roomQueueInfo.mChatRoomMember && roomQueueInfo.mChatRoomMember.getAccount().equals(String.valueOf(pkMemberInfo.getUserInfo().getUid()))) { - roomQueueInfo.groupType = getTeamIdInPKMemberList(roomQueueInfo.mChatRoomMember.getAccount()); - pkMemberInfo.getUserInfo().setGroupType(roomQueueInfo.groupType); + roomQueueInfo.mChatRoomMember.setGroupType(getTeamIdInPKMemberList(roomQueueInfo.mChatRoomMember.getAccount())); + pkMemberInfo.getUserInfo().setGroupType(roomQueueInfo.mChatRoomMember.getGroupType()); //改变麦状态 AvRoomModel.get().updateMyMicQueue( key, diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java index 861cb7c0d..dcf7a6c53 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java @@ -27,6 +27,12 @@ public class MicMemberInfo { private int teamId = 0; private boolean isSelected = false; private Map extension; + + /** + * GroupType_default = 0,//默认 + * GroupTyp_red = 1, //蓝队 + * GroupType_Blue = 2,//红队 + */ private int groupType; diff --git a/gradle.properties b/gradle.properties index 09a17100a..a0754c18e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,5 +20,5 @@ with_jenkins=false #\u6253\u652F\u6301x86\u7684\u6A21\u62DF\u5668\u5305\u4F7F\u7528 ndk_abi_filters=arm -version_name=2.1.1 -version_code=211 \ No newline at end of file +version_name=5.1.1 +version_code=511 \ No newline at end of file From 81f96e0c394e3b1652539ac19cdbfc12da8e0467 Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 19 Jan 2021 15:23:14 +0800 Subject: [PATCH 04/49] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81=E5=92=8C=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E6=8E=89=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/BaseMicroViewAdapter.java | 21 -- .../avroom/fragment/HomePartyFragment.java | 31 +- .../fragment/HomePartyRoomFragment.java | 355 +++++------------- .../avroom/presenter/HomePartyPresenter.java | 11 +- .../manager/IMNetEaseManager.java | 25 +- 5 files changed, 108 insertions(+), 335 deletions(-) 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 829fc4bf9..9853c1e56 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 @@ -88,11 +88,6 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter 0) { ivUpImage.setVisibility(View.GONE); ivAvatar.setVisibility(View.VISIBLE); -// tvNick.setText(StringUtil.removeBlanks(chatRoomMember.getNick())); -// tvNick.setTextColor(context.getResources().getColor(R.color.white)); -// if (AvRoomDataManager.get().isOpenPKMode()) { -// ViewAdapter.setViewBackground(tvNick, R.color.black_transparent_20, 50, 0, 0); -// } else { -// int nickBgColor = context.getResources().getColor( -// info.gender == 1 ? R.color.color_male_16AEFD : R.color.color_female_FE3F77); -// ViewAdapter.setViewBackground(tvNick, nickBgColor, 50, 0, 0); -// } setSelectText(position, chatRoomMember.getNick(), chatRoomMember.getGender()); ImageLoadUtils.loadAvatar(BasicConfig.INSTANCE.getAppContext(), chatRoomMember.getAvatar(), ivAvatar); // 加载贵族 @@ -208,9 +194,6 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter handGameEvent(gameEvent)); + .subscribe(this::handGameEvent); RxBus.get().toFlowable(AiPlayEndEvent.class) .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) .observeOn(AndroidSchedulers.mainThread()) .delay(2, TimeUnit.SECONDS) - .subscribe(aiPlayEndEvent -> { - getMvpPresenter().kickAi(aiPlayEndEvent); - }); + .subscribe(aiPlayEndEvent -> getMvpPresenter().kickAi(aiPlayEndEvent)); // 接收公屏消息点击 可点击房间编辑页查看 事件 RxBus.get().toFlowable(OpenRoomIntroEvent.class) .compose(bindToLifecycle()) .subscribe(showUserInfoDialog -> showRoomIntroduction(false)); + //换个对手重新发起游戏 RxBus.get().toFlowable(ChangeUserEvent.class) .compose(bindToLifecycle()) .subscribe(changeUserEvent -> ImGameMode.get().sendRoomSponsorGameMsg(changeUserEvent.gameInfo)); + //换个游戏 RxBus.get().toFlowable(ChangeGameEvent.class) .compose(bindToLifecycle()) @@ -479,94 +466,12 @@ public class HomePartyRoomFragment extends BaseMvpFragment { - if (!ActivityUtil.isValidContext(mContext)) { - return; - } - int count = microView.recyclerView.getChildCount(); - if (count > 0) { - View kingView = microView.recyclerView.getChildAt(count - 1); - if (kingView == null) { - return; - } - View micro_layout = kingView.findViewById(R.id.micro_layout); - if (micro_layout == null) { - return; - } -// TuTuGuideHelper helper = new TuTuGuideHelper(mContext); -// helper.createHiGuide(() -> helper.createRoomGuide(micro_layout, bottomView.getSendGiftView()), -// new TuTuGuideView.IGuideShowFinishListener() { -// @Override -// public void onSkip() { -// checkNewUserTask();// 跳过指引,判断是否有新人有礼 -// } -// -// @Override -// public void onGuideFinish() { -// checkNewUserTask();// 引导图显示结束,判断是否有新人有礼 -// } -// }); -// TuTuGuideHelper.setNoNeedHiGuide(TuTuGuideHelper.KEY_GUIDE_FIRST_ROOM); -// checkNewUserTask();// 引导图显示结束,判断是否有新人有礼[20190719 直接去掉新人有礼dialog] - } - }, 500); - } checkFollowOwner(); checkMiniWorld(); otherInitView(); getMvpPresenter().loadMessageHistory(); } - private void checkNewUserTask() { - new TaskModel().checkNewUserTask(AuthModel.get().getCurrentUid()) - .compose(bindUntilEvent(FragmentEvent.DESTROY)) - .subscribe(new DontWarnObserver() { - @Override - public void accept(CheckNewUserTaskInfo checkNewUserTaskInfo, String error) { - super.accept(checkNewUserTaskInfo, error); - if (error == null) { - if (checkNewUserTaskInfo.isHasNewUser()) {// 可以领取新人礼物 - if (getFragmentManager() != null) { - NewUserTaskDialog newUserTaskDialog = NewUserTaskDialog.newInstance(() -> { - StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_POPUP_NEW_USER_REWARD, "语音房-新人有礼弹窗-领取奖励"); - // 领取奖励 - receiveNewUserTaskAward(checkNewUserTaskInfo.getConfigId()); - }); - newUserTaskDialog.show(getFragmentManager(), "new_user_task_dialog"); - } - } - } - } - }); - } - - private void receiveNewUserTaskAward(long configId) { -// getDialogManager().showProgressDialog(mContext, "正在领取奖励..."); - new TaskModel().receivePrice(configId, PrizeType.RADISH) - .compose(bindUntilEvent(FragmentEvent.DESTROY)) - .subscribe(new DontWarnObserver() { - @Override - public void accept(String s, String error) { - super.accept(s, error); -// getDialogManager().dismissDialog(); - if (error == null) { - SingleToastUtil.showToast("送个萝卜礼物试试吧~"); - // 领取成功,刷新Dialog布局并且三秒后dismiss - if (getFragmentManager() != null) { - Fragment newUserTaskDialog = getFragmentManager().findFragmentByTag("new_user_task_dialog"); - if (newUserTaskDialog instanceof NewUserTaskDialog) { - ((NewUserTaskDialog) newUserTaskDialog).refreshDialogWithReceiveAwardFinish(); - } - } - } else { - SingleToastUtil.showToast(error); - } - } - }); - } - private void handGameEvent(GameEvent gameEvent) { switch (gameEvent.getType()) { case GameEvent.OPEN_GAME_MODEL: @@ -641,7 +546,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment() { - @Override - public void accept(UserInfo userInfo) throws Exception { - //如果贵族是超管,则不显示贵族进房提示 - if (userInfo != null && userInfo.isSuperAdmin()) { - return; - } - if (userInfo != null && userInfo.getNobleInfo() != null && !userInfo.getNobleInfo().isNobleEnterHide()) - IMNetEaseManager.get().sendNobleInRoomMsgBySdk(userInfo.getNobleInfo(), - userInfo.getNick(), userInfo.getUid()) - .subscribe(chatRoomMessage -> { - if (mNobleWelcomeView == null) { - mNobleWelcomeView = (AvRoomNobleWelcomeView) mVsNobleWelcome.inflate(); - } - mNobleWelcomeView.setData(userInfo.getNobleInfo(), userInfo.getNick()); - }); + UserModel.get().getUserInfoFromServer(myUid).subscribe(userInfo -> { + //如果贵族是超管,则不显示贵族进房提示 + if (userInfo != null && userInfo.isSuperAdmin()) { + return; } + if (userInfo != null && userInfo.getNobleInfo() != null && !userInfo.getNobleInfo().isNobleEnterHide()) + IMNetEaseManager.get().sendNobleInRoomMsgBySdk(userInfo.getNobleInfo(), + userInfo.getNick(), userInfo.getUid()) + .subscribe(chatRoomMessage -> { + if (mNobleWelcomeView == null) { + mNobleWelcomeView = (AvRoomNobleWelcomeView) mVsNobleWelcome.inflate(); + } + mNobleWelcomeView.setData(userInfo.getNobleInfo(), userInfo.getNick()); + }); }); gameBinding.setRoomInfo(AvRoomDataManager.get().mCurrentRoomInfo); updateView(); @@ -1530,20 +1431,12 @@ public class HomePartyRoomFragment extends BaseMvpFragment { + ((AVRoomActivity) requireActivity()).giveUpDragonBar().subscribe(s -> { gameBinding.playDragon.setVisibility(View.INVISIBLE); gameBinding.cancelDragon.setVisibility(View.INVISIBLE); getMvpPresenter().cancelDragon(); @@ -1794,7 +1682,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment { + if (roomMicInfo.isMicLock()) { + if (SuperAdminUtil.isSuperAdmin()) { + SingleToastUtil.showToast(SaConstant.TOAST_ERROR_TIPS); + return; } + getMvpPresenter().unLockMicroPhone(micPosition); + } else { + if (GameModel.get().needRemovePool()) { + GameModel.get().removePool(GameModel.get().getGameId()).subscribe(); + } + getMvpPresenter().roomOperate(SuperAdminModel.LOCK_MIC); + getMvpPresenter().lockMicroPhone(micPosition); } }); - ButtonItem buttonItem4 = new ButtonItem("上麦", new ButtonItem.OnClickListener() { - @Override - public void onClick() { - toUpMicroPhone(micPosition, currentUid + "", false); - - - } - }); + ButtonItem buttonItem4 = new ButtonItem("上麦", () -> toUpMicroPhone(micPosition, currentUid + "", false)); //别问为什么,ui调整了顺序 //禁用超管的上麦和抱TA上麦 if (!SuperAdminUtil.isSuperAdmin()) { @@ -2000,7 +1877,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment() { - @Override - public void accept(Boolean aBoolean) throws Exception { - if (aBoolean) { - AvRoomDataManager.get().mIsNeedOpenMic = false; - RtcEngineManager.get().setMute(!RtcEngineManager.get().isMute); - RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER); -// AvRoomDataManager.get().mIsNeedOpenMic = RtcEngineManager.get().isMute; - updateMicBtn(); - } else { - toast("开启权限后才能开麦"); - } + rxPermissions.request(Manifest.permission.RECORD_AUDIO).subscribe(aBoolean -> { + if (aBoolean) { + AvRoomDataManager.get().mIsNeedOpenMic = false; + RtcEngineManager.get().setMute(!RtcEngineManager.get().isMute); + RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER); + updateMicBtn(); + } else { + toast("开启权限后才能开麦"); } }); return; @@ -2164,32 +2037,24 @@ public class HomePartyRoomFragment extends BaseMvpFragment onFilter(List faceInfoList) { - //审核中版本过滤表情,显示 - if (MarketVerifyModel.get().isMarketChecking()) { - Iterator faceInfoIterator = faceInfoList.iterator(); - while (faceInfoIterator.hasNext()) { - FaceInfo faceInfo = faceInfoIterator.next(); - if (faceInfo.getId() == 24 - || faceInfo.getId() == 17 - || faceInfo.getId() == 40) { - faceInfoIterator.remove(); - } + dynamicFaceDialog.setOnDismissListener(dialog -> dynamicFaceDialog = null); + dynamicFaceDialog.setFaceFilter(faceInfoList -> { + //审核中版本过滤表情,显示 + if (MarketVerifyModel.get().isMarketChecking()) { + Iterator faceInfoIterator = faceInfoList.iterator(); + while (faceInfoIterator.hasNext()) { + FaceInfo faceInfo = faceInfoIterator.next(); + if (faceInfo.getId() == 24 + || faceInfo.getId() == 17 + || faceInfo.getId() == 40) { + faceInfoIterator.remove(); } - return faceInfoList; - } else { - return faceInfoList; } - + return faceInfoList; + } else { + return faceInfoList; } + }); } if (!dynamicFaceDialog.isShowing()) { @@ -2263,11 +2128,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment { if (hide != null && !hide) { @@ -3139,23 +2987,17 @@ public class HomePartyRoomFragment extends BaseMvpFragment { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (roomInfo == null || userInfo == null || roomOwnner == null) { + return; } + RoomFollowOwnerAttachment roomFollowOwnerAttachment = new RoomFollowOwnerAttachment(); + roomFollowOwnerAttachment.setOwnerUid(roomOwnner.getUid()); + roomFollowOwnerAttachment.setUserInfo(userInfo); + messageView.addMessages(ChatRoomMessageBuilder.createChatRoomCustomMessage(String.valueOf(roomInfo.getRoomId()), roomFollowOwnerAttachment)); + }); } @@ -3181,22 +3023,16 @@ public class HomePartyRoomFragment extends BaseMvpFragment { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (roomInfo == null || userInfo == null) { + return; } + JoinMiniWorldAttachment joinMiniWorldAttachment = new JoinMiniWorldAttachment(); + joinMiniWorldAttachment.setMiniWorldInfo(miniWorldInWorldInfo); + mJoinMiniWorldOperationPosition = messageView.addMessages(ChatRoomMessageBuilder.createChatRoomCustomMessage(String.valueOf(roomInfo.getRoomId()), joinMiniWorldAttachment)); + }, SHOW_JOIN_MINI_WORLD_TIME); } @@ -3214,17 +3050,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment { private boolean isLeaveMode = false; + private Gson gson = new Gson(); + protected WalletInfo walletInfo; public HomePartyPresenter() { @@ -470,7 +472,7 @@ public class HomePartyPresenter extends BaseMvpPresenter { if (roomQueueInfo != null) { JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); if (valueJsonObj != null) { - chatRoomMember =new Gson().fromJson(valueJsonObj,MicMemberInfo.class); + chatRoomMember = gson.fromJson(valueJsonObj, MicMemberInfo.class); roomQueueInfo.mChatRoomMember = chatRoomMember; } AvRoomDataManager.get().addRoomQueueInfo(entry.key, roomQueueInfo); @@ -665,13 +667,14 @@ public class HomePartyPresenter extends BaseMvpPresenter { /** * 全服红包公屏 + * * @param isOpenPackage */ - public void updateRedPackage(boolean isOpenPackage){ + public void updateRedPackage(boolean isOpenPackage) { String contentText; - if (isOpenPackage){ + if (isOpenPackage) { contentText = "管理员已开启全服红包"; - }else { + } else { ChatRoomMessage firstMsg = IMNetEaseManager.get().getFirstMessageContent(); IMNetEaseManager.get().addCloseScreenMessages(firstMsg); contentText = "管理员已关闭全服红包"; diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 66ab448da..4b3c7b3a9 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -284,6 +284,9 @@ public final class IMNetEaseManager { private final AvRoomModel model; + @NonNull + private final Gson gson = new Gson(); + public RoomQueueInfo mCacheRoomQueueInfo; private static PublishProcessor roomProcessor; @@ -1505,9 +1508,8 @@ public final class IMNetEaseManager { * 麦序更新 * * @param extension - - * @param gson - */ - private void roomQueueMicUpdate(Map extension, Gson gson) { + private void roomQueueMicUpdate(Map extension) { String micInfo = (String) extension.get("micInfo"); if (!TextUtils.isEmpty(micInfo)) { int type = (int) extension.get("type"); @@ -1552,17 +1554,16 @@ public final class IMNetEaseManager { ChatRoomNotificationAttachment notificationAttachment = (ChatRoomNotificationAttachment) msg.getAttachment(); Map extension = notificationAttachment.getExtension(); if (extension != null) { - Gson gson = new Gson(); // 1----房间信息更新 2-----麦序信息更新 // 3----更新房间信息和麦序信息(排麦模式) int type = (int) extension.get("type"); if (type == 2) { - roomQueueMicUpdate(extension, gson); + roomQueueMicUpdate(extension); } else if (type == 1) { - roomInfoUpdate(extension, gson); + roomInfoUpdate(extension); } else if (type == 3) { - roomQueueMicUpdate(extension, gson); - roomInfoUpdate(extension, gson); + roomQueueMicUpdate(extension); + roomInfoUpdate(extension); } } } @@ -1572,9 +1573,8 @@ public final class IMNetEaseManager { * 房间信息更新 * * @param extension -- - * @param gson -- */ - private void roomInfoUpdate(Map extension, Gson gson) { + private void roomInfoUpdate(Map extension) { String roomInfoStr = (String) extension.get("roomInfo"); if (!TextUtils.isEmpty(roomInfoStr)) { RoomInfo roomInfo = gson.fromJson(roomInfoStr, RoomInfo.class); @@ -1893,7 +1893,7 @@ public final class IMNetEaseManager { if (roomQueueInfo == null) { return; } - MicMemberInfo chatRoomMember = parseChatRoomMember(contentJsonObj, roomQueueInfo); + MicMemberInfo chatRoomMember = gson.fromJson(contentJsonObj, MicMemberInfo.class); //这里处理把这个人添加到队伍,或者移除队伍 UserInfo userInfo = new UserInfo(); userInfo.setUid(Long.parseLong(chatRoomMember.getAccount())); @@ -1956,11 +1956,6 @@ public final class IMNetEaseManager { } } - @NonNull - private MicMemberInfo parseChatRoomMember(JsonObject contentJsonObj, RoomQueueInfo roomQueueInfo) { - return new Gson().fromJson(contentJsonObj,MicMemberInfo.class); - } - public Single> fetchRoomMembersByIds(final List accounts) { return Single.create((SingleOnSubscribe>) e -> { final RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; From 06e4d8878ab683011222e63c67f889b77dab8223 Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 19 Jan 2021 18:51:17 +0800 Subject: [PATCH 05/49] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=9D=91=E4=BD=8D=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/BaseMicroViewAdapter.java | 372 ++++++++++++++- .../avroom/adapter/DatingMicroViewAdapter.kt | 133 ++++++ .../avroom/adapter/MicroViewAdapter.java | 434 +----------------- .../fragment/HomePartyRoomFragment.java | 34 ++ .../erban/avroom/widget/MicroView.java | 9 + .../com/yizhuan/erban/ui/utils/ImageLoad.kt | 50 ++ .../drawable-xhdpi/bg_dating_man_selected.png | Bin 0 -> 2581 bytes .../res/drawable-xhdpi/bg_dating_step.png | Bin 0 -> 4358 bytes .../drawable-xhdpi/bg_dating_unselected.png | Bin 0 -> 1644 bytes .../bg_dating_woman_selected.png | Bin 0 -> 2624 bytes .../drawable-xhdpi/icon_gift_value_man.png | Bin 0 -> 438 bytes .../selector_dating_select_man_bg.xml | 5 + .../selector_dating_select_woman_bg.xml | 5 + .../res/drawable/selector_dating_step.xml | 11 + .../drawable/shape_circle_micro_man_bg.xml | 11 + .../drawable/shape_circle_micro_woman_bg.xml | 11 + app/src/main/res/layout/item_micro_dating.xml | 194 ++++++++ .../res/layout/item_micro_dating_boss.xml | 278 +++++++++++ .../res/layout/fragment_av_room_game.xml | 18 + .../xchat_android_core/UriProvider.java | 7 +- .../manager/AvRoomDataManager.java | 15 + .../room/bean/RoomInfo.java | 17 + .../room/queue/bean/MicMemberInfo.java | 8 + 23 files changed, 1174 insertions(+), 438 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt create mode 100644 app/src/main/java/com/yizhuan/erban/ui/utils/ImageLoad.kt create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_man_selected.png create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_step.png create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_unselected.png create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_woman_selected.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_gift_value_man.png create mode 100644 app/src/main/res/drawable/selector_dating_select_man_bg.xml create mode 100644 app/src/main/res/drawable/selector_dating_select_woman_bg.xml create mode 100644 app/src/main/res/drawable/selector_dating_step.xml create mode 100644 app/src/main/res/drawable/shape_circle_micro_man_bg.xml create mode 100644 app/src/main/res/drawable/shape_circle_micro_woman_bg.xml create mode 100644 app/src/main/res/layout/item_micro_dating.xml create mode 100644 app/src/main/res/layout/item_micro_dating_boss.xml 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 9853c1e56..6f6e825fd 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 @@ -1,26 +1,45 @@ package com.yizhuan.erban.avroom.adapter; import android.content.Context; + +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.RecyclerView; + +import android.graphics.drawable.BitmapDrawable; import android.text.TextUtils; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; import android.widget.TextView; import com.alibaba.security.biometrics.build.G; +import com.coorchice.library.SuperTextView; import com.netease.nim.uikit.common.util.string.StringUtil; import com.netease.nim.uikit.support.glide.GlideApp; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; import com.yizhuan.erban.R; import com.yizhuan.erban.common.widget.CircleImageView; import com.yizhuan.erban.ui.utils.ImageLoadUtils; +import com.yizhuan.erban.ui.webview.DialogWebViewActivity; +import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil; +import com.yizhuan.erban.utils.RegexUtil; +import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.bean.RoomMicInfo; import com.yizhuan.xchat_android_core.bean.RoomQueueInfo; import com.yizhuan.xchat_android_core.decoration.headwear.bean.HeadWearInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.noble.NobleResourceType; import com.yizhuan.xchat_android_core.noble.NobleUtil; +import com.yizhuan.xchat_android_core.room.bean.RoomInfo; +import com.yizhuan.xchat_android_core.room.giftvalue.bean.GiftValueData; +import com.yizhuan.xchat_android_core.room.giftvalue.helper.GiftValueFormat; +import com.yizhuan.xchat_android_core.room.pk.bean.PKTeamInfo; import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; +import com.yizhuan.xchat_android_core.user.UserModel; +import com.yizhuan.xchat_android_core.user.bean.UserInfo; +import com.yizhuan.xchat_android_core.utils.ActivityUtil; import com.yizhuan.xchat_android_library.utils.CommonUtils; import com.yizhuan.xchat_android_library.utils.config.BasicConfig; @@ -34,6 +53,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter showObserver = showValue -> + clParentGiftValue.setVisibility(showValue != null && showValue ? View.VISIBLE : View.GONE); + charmData.getLdShow().observeForever(showObserver); + charmData.setShowObserver(showObserver); + //礼物值的增加显示 + Observer valueObserver = longValue -> { + if (longValue == null) { + return; + } + if (isNpe()) { + return; + } + tvCharmValue.setText(GiftValueFormat.longToString(longValue)); + llCharmClick.setOnClickListener(v -> { + if (info.mChatRoomMember != null) { + DialogWebViewActivity.start(context, + UriProvider.getPersonalCharismaRank() + "?uid=" + info.mChatRoomMember.getAccount()); + } + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return; + if (roomInfo.isLeaveMode() && position == -1) { + DialogWebViewActivity.start(context, + UriProvider.getPersonalCharismaRank() + "?uid=" + roomInfo.getUid()); + } + }); + llCharmClick.setOnLongClickListener(v -> { + if (longValue < 100 * 10000L) { + //小于100万,不需要长按弹框 + return false; + } + View contentView = View.inflate(context, R.layout.popwindow_mic_charm_value, null); + SuperTextView stv_mic_charm_value = contentView.findViewById(R.id.stv_mic_charm_value); + String gvString; + if (longValue >= 10000 * 10000L) { + gvString = "99999999+"; + } else { + gvString = String.valueOf(longValue); + } + stv_mic_charm_value.setText(gvString); + PopupWindow window = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, true); + //设置透明度 + ActivityUtil.addAlpha(context, 0.7f); + window.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + window.setOutsideTouchable(true); + window.setFocusable(true); + window.setBackgroundDrawable(new BitmapDrawable()); + int width = window.getContentView().getMeasuredWidth(); + + int[] location = new int[2]; + viewCenterOfCharm.getLocationOnScreen(location); + int showWidth = UIUtil.getScreenWidth(context) - location[0] - UIUtil.dip2px(context, 1); + int offsetX = width / 2; + //以下的处理就是当popWindow靠近屏幕右边的时候,要计算箭头的位置 + if (showWidth < offsetX) { + View iv_center_arrow = contentView.findViewById(R.id.iv_center_arrow); + View iv_move_arrow = contentView.findViewById(R.id.iv_move_arrow); + iv_center_arrow.setVisibility(View.GONE); + iv_move_arrow.setVisibility(View.VISIBLE); + if (iv_move_arrow.getLayoutParams() instanceof RelativeLayout.LayoutParams) { + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_move_arrow.getLayoutParams(); + params.leftMargin = width / 2 + offsetX - showWidth - UIUtil.dip2px(context, 6.5f); + } + offsetX = offsetX + offsetX - showWidth + UIUtil.dip2px(context, 2); + } + int offsetY = UIUtil.dip2px(context, 19.5f + 39f); + window.showAsDropDown(viewCenterOfCharm, + -offsetX, -offsetY); + window.setOnDismissListener(() -> ActivityUtil.removeAlpha(context)); + return true; + }); + }; + + charmData.getLdValue().observeForever(valueObserver); + charmData.setValueObserver(valueObserver); + + //控制最高最低头饰 + Observer headWearObserver = headWearValue -> { + if (ivCharmLevelTag == null) return; + ivCharmLevelTag.setVisibility(View.GONE); + if (headWearValue == 1) { + ivCharmLevelTag.setVisibility(View.VISIBLE); + ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_min)); + } else if (headWearValue == 2) { + ivCharmLevelTag.setVisibility(View.VISIBLE); + ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_max)); + } else { + ivCharmLevelTag.setVisibility(View.GONE); + } + }; + charmData.getLdHeadWear().observeForever(headWearObserver); + charmData.setHeadWearObserver(headWearObserver); + + + } + + private boolean isNpe() { + return tvCharmValue == null || llCharmClick == null || + viewCenterOfCharm == null || clParentGiftValue == null; + } + } + + + public class BossMicroViewHolder extends MicroViewAdapter.GiftValueViewHolder { + /** + * 主席位特有 + */ + TextView tvRoomType; + TextView tvRoomDesc; + View ivRoomCanEdit; + ImageView ivTag; + TextView tvLabelLeaveMode; + CircleImageView ivLeaveMode; + + View inOfficialMask; + TextView tvOfficialMask; + ImageView ivOfficialMask; + ImageView ivRedPackage; + + BossMicroViewHolder(View itemView) { + super(itemView); + tvRoomType = itemView.findViewById(R.id.tv_room_type); + tvRoomDesc = itemView.findViewById(R.id.tv_room_desc); + ivRoomCanEdit = itemView.findViewById(R.id.iv_room_can_edit); + ivTag = itemView.findViewById(R.id.iv_tag); + tvLabelLeaveMode = itemView.findViewById(R.id.tv_label_leave_mode); + ivLeaveMode = itemView.findViewById(R.id.iv_bg_leave_mode); + tvRoomDesc.setOnClickListener(this); + tvRoomType.setOnClickListener(this); + ivRoomCanEdit.setOnClickListener(this); + + inOfficialMask = itemView.findViewById(R.id.in_official_mask); + if (inOfficialMask != null) { + tvOfficialMask = inOfficialMask.findViewById(R.id.tv_official_mask); + ivOfficialMask = inOfficialMask.findViewById(R.id.iv_official_mask); + } + + ivRedPackage = itemView.findViewById(R.id.iv_red_package); + ivRedPackage.setOnClickListener(this); + } + + @Override + void bind(RoomQueueInfo info, int position) { + super.bind(info, position); + onRoomInfoUpdate(); + + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return; + //红包 + ivRedPackage.setVisibility(AvRoomDataManager.get().isRedEnvelopeOpen() ? View.VISIBLE : View.GONE); + + // 新版房主位优先判断麦序是否有人,麦序没人再判断是否是离开模式(防止新版展示离开模式,实际麦位有人) + MicMemberInfo chatRoomMember = info.mChatRoomMember; + if (chatRoomMember == null) { + inOfficialMask.setVisibility(View.GONE); + + if (roomInfo.isLeaveMode()) { + tvLabelLeaveMode.setVisibility(View.VISIBLE); + ivLeaveMode.setVisibility(View.VISIBLE); + ImageLoadUtils.loadDefaultImage(BasicConfig.INSTANCE.getAppContext(), ivLeaveMode, R.drawable.bg_leave_mode); + + ivAvatar.setVisibility(View.VISIBLE); + ivLockImage.setVisibility(View.INVISIBLE); + ivUpImage.setVisibility(View.INVISIBLE); + + AvRoomDataManager avRoomDataManager = AvRoomDataManager.get(); + ImageLoadUtils.loadAvatar(BasicConfig.INSTANCE.getAppContext(), avRoomDataManager.avatar, ivAvatar); + setSelectText(-1, avRoomDataManager.nick, avRoomDataManager.gender); + + } else { + ivLeaveMode.setVisibility(View.GONE); + tvLabelLeaveMode.setVisibility(View.GONE); + } + + } else { + ivLeaveMode.setVisibility(View.GONE); + tvLabelLeaveMode.setVisibility(View.GONE); + + String fixedWord = NobleUtil.getLevel(UserInfo.OAC_NAME, chatRoomMember); + String iconPic = NobleUtil.getLevel(UserInfo.OAC_ICON, chatRoomMember); + if (!TextUtils.isEmpty(fixedWord) && !TextUtils.isEmpty(iconPic)) { + inOfficialMask.setVisibility(View.VISIBLE); + tvOfficialMask.setText(fixedWord); + NobleUtil.loadResource(iconPic, ivOfficialMask); + + } else { + inOfficialMask.setVisibility(View.GONE); + } + + } + + tvNick.setBackgroundColor(context.getResources().getColor(R.color.transparent)); + tvNick.setTextColor(context.getResources().getColor(R.color.white)); + if (AvRoomDataManager.get().isManager()) { + ivRoomCanEdit.setVisibility(View.VISIBLE); + } else { + ivRoomCanEdit.setVisibility(View.GONE); + } + + + } + + @Override + protected void setDefalutText(int index) { + //重新覆盖掉用户名的逻辑 + tvNick.setText(""); + tvNick.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); + ivTag.setVisibility(View.GONE); + } + + @Override + protected void setSelectText(int index, String nick, int gender) { + super.setSelectText(index, nick, gender); + if (UserModel.get().getCacheLoginUserInfo() != null && + UserModel.get().getCacheLoginUserInfo().getUserInfoSkillVo() != null) { + if (AvRoomDataManager.get().isRoomOwner() && !TextUtils.isEmpty(UserModel.get().getCacheLoginUserInfo().getUserInfoSkillVo().getSkillTag())) { +// ImageLoadUtils.loadImage(context, UserModel.get().getCacheLoginUserInfo().getUserInfoSkillVo().getSkillTag(), ivTag); + ivTag.setVisibility(View.GONE); + tvNick.setCompoundDrawablePadding(4); + tvNick.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); + } else { + setBossViewGender(tvNick, gender == 1); + ivTag.setVisibility(View.GONE); + } + } + + } + + void onRoomInfoUpdate() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + if (!TextUtils.isEmpty(roomInfo.getRoomDesc())) { + tvRoomDesc.setText(RegexUtil.getPrintableString(roomInfo.getRoomDesc())); + } else { + if (AvRoomDataManager.get().isManager()) { + tvRoomDesc.setText(BasicConfig.INSTANCE.getAppContext().getString(R.string.room_manager_edit_desc)); + } else { + tvRoomDesc.setText(BasicConfig.INSTANCE.getAppContext().getString(R.string.room_no_desc)); + } + } + tvRoomType.setText(roomInfo.getRoomTag()); + } + + @Override + public void clear() { + super.clear(); + tvRoomDesc.setText(BasicConfig.INSTANCE.getAppContext().getString(R.string.room_no_desc)); + tvRoomType.setText("聊天"); + ivTag.setVisibility(View.GONE); + } + + @Override + public void onClick(View v) { + super.onClick(v); + } + } + + public void clear(NormalMicroViewHolder holder) { holder.clear(); } public abstract void bindToRecyclerView(RecyclerView recyclerView); + public abstract void dispose(); @Override diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt b/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt new file mode 100644 index 000000000..8f2ace015 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt @@ -0,0 +1,133 @@ +package com.yizhuan.erban.avroom.adapter + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.RadioGroup +import android.widget.TextView +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.yizhuan.erban.R +import com.yizhuan.erban.ui.utils.load +import com.yizhuan.erban.ui.webview.DialogWebViewActivity +import com.yizhuan.erban.utils.UserUtils +import com.yizhuan.xchat_android_core.UriProvider +import com.yizhuan.xchat_android_core.bean.RoomQueueInfo +import com.yizhuan.xchat_android_core.manager.AvRoomDataManager +import com.yizhuan.xchat_android_core.room.bean.RoomInfo + + +/** + * @author xiaoyu + * @date 2017/12/18 + */ +class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) { + + private val manPosition = arrayOf(0, 1, 4, 5) + + /** + * Set LayoutManager and bind this to RecyclerView + */ + override fun bindToRecyclerView(recyclerView: RecyclerView) { + val layoutManager = GridLayoutManager(context, 4) + layoutManager.orientation = LinearLayoutManager.VERTICAL + recyclerView.layoutManager = layoutManager + recyclerView.adapter = this + } + + override fun dispose() { + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == TYPE_BOSS) { + DatingBossMicroViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_micro_dating_boss, parent, false)) + } else { + DatingMicroViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_micro_dating, parent, false)) + } + } + + override fun getItemViewType(position: Int) = if (position == 0) TYPE_BOSS else TYPE_NORMAL + + override fun microType() = MICRO_TYPE_DATING + + + private inner class DatingMicroViewHolder constructor(itemView: View) :GiftValueViewHolder(itemView) { + + private val viewGenderBg: View = itemView.findViewById(R.id.view_gender_bg) + private val tvSelectedStatus: TextView = itemView.findViewById(R.id.tv_selected_status) + private val ivCap: ImageView = itemView.findViewById(R.id.iv_cap) + private val ivValue: ImageView = itemView.findViewById(R.id.iv_value_icon) + + @SuppressLint("SetTextI18n") + public override fun bind(info: RoomQueueInfo, position: Int) { + super.bind(info, position) + val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo ?: return + val roomMicInfo = info.mRoomMicInfo + val manMicro = manPosition.contains(position) + val uid = UserUtils.getUserUid() + if (roomMicInfo != null) { + viewGenderBg.setBackgroundResource(if (manMicro) R.drawable.shape_circle_micro_man_bg else R.drawable.shape_circle_micro_woman_bg) + tvSelectedStatus.setBackgroundResource(if (manMicro) R.drawable.selector_dating_select_man_bg else R.drawable.selector_dating_select_woman_bg) + ivValue.setImageResource(if (manMicro) R.drawable.icon_gift_value_man else R.drawable.icon_gift_value) + } + info.mChatRoomMember?.let { + + if (roomInfo.blindDateState == RoomInfo.DATING_STATE_FLOW) { + tvSelectedStatus.visibility = View.GONE + } else { + tvSelectedStatus.visibility = View.VISIBLE + if (it.isHasSelectUser) { + tvSelectedStatus.isSelected = true + if (roomInfo.blindDateState == RoomInfo.DATING_STATE_PUBLISH || uid == it.account.toLong() || AvRoomDataManager.get().isPreside(uid)) { + tvSelectedStatus.text = "选${it.selectMicPosition + 1}号" + } else { + tvSelectedStatus.text = "已选择" + } + } else { + tvSelectedStatus.isSelected = false + tvSelectedStatus.text = "未选择" + } + } + if (!it.capUrl.isNullOrEmpty()) { + ivCap.load(it.capUrl, 0f, 0) + ivCap.visibility = View.VISIBLE + } else { + ivCap.visibility = View.GONE + } + } ?: run { + tvSelectedStatus.visibility = View.GONE + ivCap.visibility = View.GONE + if (position != -1) { + tvNick.text = "号${if (manMicro) "男神" else "女神"}位" + } + } + } + + } + + inner class DatingBossMicroViewHolder internal constructor(itemView: View) :BossMicroViewHolder(itemView) { + + private val radioGroup: RadioGroup = itemView.findViewById(R.id.radio_group) + public override fun bind(info: RoomQueueInfo, position: Int) { + super.bind(info, position) + val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo ?: return + when (roomInfo.blindDateState) { + RoomInfo.DATING_STATE_FLOW -> radioGroup.check(R.id.rb_step_free) + RoomInfo.DATING_STATE_SELECT -> radioGroup.check(R.id.rb_step_select) + RoomInfo.DATING_STATE_PUBLISH -> radioGroup.check(R.id.rb_step_public) + } + radioGroup.setOnClickListener { + DialogWebViewActivity.start(context, UriProvider.getDatingRule()) + } + + if (info.mChatRoomMember == null) { + tvNick.alpha = 1f + tvNick.text = "主持人" + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicroViewAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicroViewAdapter.java index 60c3bd928..147301fce 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicroViewAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicroViewAdapter.java @@ -1,52 +1,17 @@ package com.yizhuan.erban.avroom.adapter; -import androidx.lifecycle.Observer; - import android.content.Context; -import android.graphics.drawable.BitmapDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import android.os.Looper; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.LinearInterpolator; -import android.view.animation.RotateAnimation; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.PopupWindow; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.coorchice.library.SuperTextView; -import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; import com.yizhuan.erban.R; -import com.yizhuan.erban.common.widget.CircleImageView; -import com.yizhuan.erban.ui.utils.ImageLoadUtils; -import com.yizhuan.erban.ui.webview.CommonWebViewActivity; -import com.yizhuan.erban.ui.webview.DialogWebViewActivity; -import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil; -import com.yizhuan.erban.utils.RegexUtil; -import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.bean.RoomQueueInfo; -import com.yizhuan.xchat_android_core.initial.InitialModel; -import com.yizhuan.xchat_android_core.initial.bean.InitInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; -import com.yizhuan.xchat_android_core.noble.NobleUtil; -import com.yizhuan.xchat_android_core.room.bean.RoomInfo; -import com.yizhuan.xchat_android_core.room.giftvalue.bean.GiftValueData; -import com.yizhuan.xchat_android_core.room.giftvalue.helper.GiftValueFormat; -import com.yizhuan.xchat_android_core.room.pk.bean.PKTeamInfo; -import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; -import com.yizhuan.xchat_android_core.user.UserModel; -import com.yizhuan.xchat_android_core.user.bean.UserInfo; -import com.yizhuan.xchat_android_core.utils.ActivityUtil; -import com.yizhuan.xchat_android_library.utils.config.BasicConfig; /** * @author xiaoyu @@ -92,14 +57,10 @@ public class MicroViewAdapter extends BaseMicroViewAdapter { item = LayoutInflater.from(parent.getContext()). inflate(R.layout.item_boss_micro, parent, false); return new BossMicroViewHolder(item); - } else if (viewType == TYPE_NORMAL) { + } else { item = LayoutInflater.from(parent.getContext()). inflate(R.layout.list_item_micro, parent, false); return new GiftValueViewHolder(item); - } else { - item = LayoutInflater.from(parent.getContext()). - inflate(R.layout.list_item_micro_king, parent, false); - return new MicroViewHolder(item); } } @@ -120,394 +81,7 @@ public class MicroViewAdapter extends BaseMicroViewAdapter { @Override public int getItemViewType(int position) { - // RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; if (position == 0) return TYPE_BOSS; - - // 新秀房,牌照房展示老板位 - //if (roomInfo != null && (roomInfo.getIsPermitRoom() == 1 || roomInfo.getIsPermitRoom() == 3) && position == 8) - // return TYPE_KING; return TYPE_NORMAL; } - - /** - * 增加礼物值展示 - */ - class GiftValueViewHolder extends BasicMicroViewHolder { - - TextView tvCharmValue; - View viewCenterOfCharm; - View llCharmClick; - View clParentGiftValue; -// ImageView ivCharmLevelTag; - - GiftValueViewHolder(View itemView) { - super(itemView); - tvCharmValue = itemView.findViewById(R.id.tv_charm_value); - viewCenterOfCharm = itemView.findViewById(R.id.view_center_of_charm); - llCharmClick = itemView.findViewById(R.id.ll_charm_click); - clParentGiftValue = itemView.findViewById(R.id.cl_parent_gift_value); -// ivCharmLevelTag = itemView.findViewById(R.id.iv_charm_level_tag); - } - - @Override - void bind(RoomQueueInfo info, int position) { - super.bind(info, position); - //增加非空判断,防止被非法继承 - if (isNpe()) { - return; - } - if (info == null) { - return; - } - GiftValueData charmData = info.giftValueData; - if (charmData == null) { - return; - } - if (!AvRoomDataManager.get().isShowGiftValue()) { - clParentGiftValue.setVisibility(View.GONE); - return; - } - clParentGiftValue.setVisibility(View.VISIBLE); - charmData.removeObserver(); - //控制是否展示礼物值 - Observer showObserver = showValue -> - clParentGiftValue.setVisibility(showValue != null && showValue ? View.VISIBLE : View.GONE); - charmData.getLdShow().observeForever(showObserver); - charmData.setShowObserver(showObserver); - //礼物值的增加显示 - Observer valueObserver = longValue -> { - if (longValue == null) { - return; - } - if (isNpe()) { - return; - } - tvCharmValue.setText(GiftValueFormat.longToString(longValue)); - llCharmClick.setOnClickListener(v -> { - if (info.mChatRoomMember != null) { - DialogWebViewActivity.start(context, - UriProvider.getPersonalCharismaRank() + "?uid=" + info.mChatRoomMember.getAccount()); - } - RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; - if (roomInfo == null) - return; - if (roomInfo.isLeaveMode() && position == -1) { - DialogWebViewActivity.start(context, - UriProvider.getPersonalCharismaRank() + "?uid=" + roomInfo.getUid()); - } - }); - llCharmClick.setOnLongClickListener(v -> { - if (longValue < 100 * 10000L) { - //小于100万,不需要长按弹框 - return false; - } - View contentView = View.inflate(context, R.layout.popwindow_mic_charm_value, null); - SuperTextView stv_mic_charm_value = contentView.findViewById(R.id.stv_mic_charm_value); - String gvString; - if (longValue >= 10000 * 10000L) { - gvString = "99999999+"; - } else { - gvString = String.valueOf(longValue); - } - stv_mic_charm_value.setText(gvString); - PopupWindow window = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT, true); - //设置透明度 - ActivityUtil.addAlpha(context, 0.7f); - window.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); - window.setOutsideTouchable(true); - window.setFocusable(true); - window.setBackgroundDrawable(new BitmapDrawable()); - int width = window.getContentView().getMeasuredWidth(); - - int[] location = new int[2]; - viewCenterOfCharm.getLocationOnScreen(location); - int showWidth = UIUtil.getScreenWidth(context) - location[0] - UIUtil.dip2px(context, 1); - int offsetX = width / 2; - //以下的处理就是当popWindow靠近屏幕右边的时候,要计算箭头的位置 - if (showWidth < offsetX) { - View iv_center_arrow = contentView.findViewById(R.id.iv_center_arrow); - View iv_move_arrow = contentView.findViewById(R.id.iv_move_arrow); - iv_center_arrow.setVisibility(View.GONE); - iv_move_arrow.setVisibility(View.VISIBLE); - if (iv_move_arrow.getLayoutParams() instanceof RelativeLayout.LayoutParams) { - RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_move_arrow.getLayoutParams(); - params.leftMargin = width / 2 + offsetX - showWidth - UIUtil.dip2px(context, 6.5f); - } - offsetX = offsetX + offsetX - showWidth + UIUtil.dip2px(context, 2); - } - int offsetY = UIUtil.dip2px(context, 19.5f + 39f); - window.showAsDropDown(viewCenterOfCharm, - -offsetX, -offsetY); - window.setOnDismissListener(() -> ActivityUtil.removeAlpha(context)); - return true; - }); - }; - - charmData.getLdValue().observeForever(valueObserver); - charmData.setValueObserver(valueObserver); - - //控制最高最低头饰 - Observer headWearObserver = headWearValue -> { - if (ivCharmLevelTag == null) return; - ivCharmLevelTag.setVisibility(View.GONE); - if (headWearValue == 1) { - ivCharmLevelTag.setVisibility(View.VISIBLE); - ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_min)); - } else if (headWearValue == 2) { - ivCharmLevelTag.setVisibility(View.VISIBLE); - ivCharmLevelTag.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_charm_level_max)); - } else { - ivCharmLevelTag.setVisibility(View.GONE); - } - }; - charmData.getLdHeadWear().observeForever(headWearObserver); - charmData.setHeadWearObserver(headWearObserver); - - - } - - private boolean isNpe() { - return tvCharmValue == null || llCharmClick == null || - viewCenterOfCharm == null || clParentGiftValue == null; - } - } - - public class BossMicroViewHolder extends GiftValueViewHolder { - /** - * 主席位特有 - */ - TextView tvRoomType; - TextView tvRoomDesc; - View ivRoomCanEdit; - ImageView ivTag; - TextView tvLabelLeaveMode; - CircleImageView ivLeaveMode; - - View inOfficialMask; - TextView tvOfficialMask; - ImageView ivOfficialMask; - ImageView ivRedPackage; - - BossMicroViewHolder(View itemView) { - super(itemView); - tvRoomType = itemView.findViewById(R.id.tv_room_type); - tvRoomDesc = itemView.findViewById(R.id.tv_room_desc); - ivRoomCanEdit = itemView.findViewById(R.id.iv_room_can_edit); - ivTag = itemView.findViewById(R.id.iv_tag); - tvLabelLeaveMode = itemView.findViewById(R.id.tv_label_leave_mode); - ivLeaveMode = itemView.findViewById(R.id.iv_bg_leave_mode); - tvRoomDesc.setOnClickListener(this); - tvRoomType.setOnClickListener(this); - ivRoomCanEdit.setOnClickListener(this); - - inOfficialMask = itemView.findViewById(R.id.in_official_mask); - if (inOfficialMask != null) { - tvOfficialMask = inOfficialMask.findViewById(R.id.tv_official_mask); - ivOfficialMask = inOfficialMask.findViewById(R.id.iv_official_mask); - } - - ivRedPackage = itemView.findViewById(R.id.iv_red_package); - ivRedPackage.setOnClickListener(this); - } - - @Override - void bind(RoomQueueInfo info, int position) { - super.bind(info, position); - onRoomInfoUpdate(); - - RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; - if (roomInfo == null) - return; - //红包 - ivRedPackage.setVisibility(AvRoomDataManager.get().isRedEnvelopeOpen() ? View.VISIBLE : View.GONE); - - // 新版房主位优先判断麦序是否有人,麦序没人再判断是否是离开模式(防止新版展示离开模式,实际麦位有人) - MicMemberInfo chatRoomMember = info.mChatRoomMember; - if (chatRoomMember == null) { - inOfficialMask.setVisibility(View.GONE); - - if (roomInfo.isLeaveMode()) { - tvLabelLeaveMode.setVisibility(View.VISIBLE); - ivLeaveMode.setVisibility(View.VISIBLE); - ImageLoadUtils.loadDefaultImage(BasicConfig.INSTANCE.getAppContext(), ivLeaveMode, R.drawable.bg_leave_mode); - - ivAvatar.setVisibility(View.VISIBLE); - ivLockImage.setVisibility(View.INVISIBLE); - ivUpImage.setVisibility(View.INVISIBLE); - - AvRoomDataManager avRoomDataManager = AvRoomDataManager.get(); - ImageLoadUtils.loadAvatar(BasicConfig.INSTANCE.getAppContext(), avRoomDataManager.avatar, ivAvatar); - setSelectText(-1, avRoomDataManager.nick, avRoomDataManager.gender); - - } else { - ivLeaveMode.setVisibility(View.GONE); - tvLabelLeaveMode.setVisibility(View.GONE); - } - - } else { - ivLeaveMode.setVisibility(View.GONE); - tvLabelLeaveMode.setVisibility(View.GONE); - - String fixedWord = NobleUtil.getLevel(UserInfo.OAC_NAME, chatRoomMember); - String iconPic = NobleUtil.getLevel(UserInfo.OAC_ICON, chatRoomMember); - if (!TextUtils.isEmpty(fixedWord) && !TextUtils.isEmpty(iconPic)) { - inOfficialMask.setVisibility(View.VISIBLE); - tvOfficialMask.setText(fixedWord); - NobleUtil.loadResource(iconPic, ivOfficialMask); - - } else { - inOfficialMask.setVisibility(View.GONE); - } - - } - - tvNick.setBackgroundColor(context.getResources().getColor(R.color.transparent)); - tvNick.setTextColor(context.getResources().getColor(R.color.white)); - if (AvRoomDataManager.get().isManager()) { - ivRoomCanEdit.setVisibility(View.VISIBLE); - } else { - ivRoomCanEdit.setVisibility(View.GONE); - } - - - } - - @Override - protected void setDefalutText(int index) { - //重新覆盖掉用户名的逻辑 - tvNick.setText(""); - tvNick.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - ivTag.setVisibility(View.GONE); - } - - @Override - protected void setSelectText(int index, String nick, int gender) { - super.setSelectText(index, nick, gender); - if (UserModel.get().getCacheLoginUserInfo() != null && - UserModel.get().getCacheLoginUserInfo().getUserInfoSkillVo() != null) { - if (AvRoomDataManager.get().isRoomOwner() && !TextUtils.isEmpty(UserModel.get().getCacheLoginUserInfo().getUserInfoSkillVo().getSkillTag())) { -// ImageLoadUtils.loadImage(context, UserModel.get().getCacheLoginUserInfo().getUserInfoSkillVo().getSkillTag(), ivTag); - ivTag.setVisibility(View.GONE); - tvNick.setCompoundDrawablePadding(4); - tvNick.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - } else { - setBossViewGender(tvNick, gender == 1); - ivTag.setVisibility(View.GONE); - } - } - - } - - void onRoomInfoUpdate() { - RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; - if (roomInfo == null) return; - if (!TextUtils.isEmpty(roomInfo.getRoomDesc())) { - tvRoomDesc.setText(RegexUtil.getPrintableString(roomInfo.getRoomDesc())); - } else { - if (AvRoomDataManager.get().isManager()) { - tvRoomDesc.setText(BasicConfig.INSTANCE.getAppContext().getString(R.string.room_manager_edit_desc)); - } else { - tvRoomDesc.setText(BasicConfig.INSTANCE.getAppContext().getString(R.string.room_no_desc)); - } - } - tvRoomType.setText(roomInfo.getRoomTag()); - } - - @Override - public void clear() { - super.clear(); - tvRoomDesc.setText(BasicConfig.INSTANCE.getAppContext().getString(R.string.room_no_desc)); - tvRoomType.setText("聊天"); - ivTag.setVisibility(View.GONE); - } - - @Override - public void onClick(View v) { - super.onClick(v); - } - } - - - class BasicMicroViewHolder extends NormalMicroViewHolder { - - TextView tvPkMark; - - BasicMicroViewHolder(View itemView) { - super(itemView); - tvPkMark = (TextView) itemView.findViewById(R.id.tv_pk_mark); - } - - @Override - public void clear() { - super.clear(); - if (tvPkMark != null) { - tvPkMark.setVisibility(View.GONE); - } - } - - @Override - void bind(RoomQueueInfo info, int position) { - super.bind(info, position); - if (tvPkMark == null) { - return; - } - MicMemberInfo micMemberInfo = info.mChatRoomMember; - if (micMemberInfo != null) { - if (micMemberInfo.getGroupType() == PKTeamInfo.TEAM_RED) { - tvPkMark.setVisibility(View.VISIBLE); - tvPkMark.setBackgroundResource(R.drawable.shape_pk_mic_queue_mark_red); - tvPkMark.setText("红队"); - } else if (micMemberInfo.getGroupType() == PKTeamInfo.TEAM_BLUE) { - tvPkMark.setVisibility(View.VISIBLE); - tvPkMark.setBackgroundResource(R.drawable.shape_pk_mic_queue_mark_blue); - tvPkMark.setText("蓝队"); - } else { - tvPkMark.setVisibility(View.GONE); - } - } else { - tvPkMark.setVisibility(View.GONE); - } - - } - } - - public class MicroViewHolder extends GiftValueViewHolder { - - ImageView ivBossChair; - - FrameLayout flKing; - - ImageView ivKing; - - MicroViewHolder(View itemView) { - super(itemView); - ivBossChair = itemView.findViewById(R.id.iv_boss_chair); -// flKing = itemView.findViewById(R.id.fl_king); -// ivKing = itemView.findViewById(R.id.up_image_img); - } - - @Override - void bind(RoomQueueInfo info, int position) { - super.bind(info, position); - MicMemberInfo chatRoomMember = info.mChatRoomMember; - if (rotateAnimation == null) { - rotateAnimation = new RotateAnimation(0, 359, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); - rotateAnimation.setDuration(3000); - rotateAnimation.setFillAfter(true); - rotateAnimation.setRepeatMode(Animation.RESTART); - rotateAnimation.setInterpolator(new LinearInterpolator()); - rotateAnimation.setRepeatCount(-1); - } - } - - private RotateAnimation rotateAnimation; - - @Override - public void clear() { - super.clear(); - if (rotateAnimation != null) rotateAnimation.cancel(); - } - } - } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index f45aeb163..40884902e 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -54,6 +54,7 @@ import com.yizhuan.erban.avroom.activity.RoomSettingActivity; import com.yizhuan.erban.avroom.activity.RoomTitleEditActivity; import com.yizhuan.erban.avroom.adapter.BaseMicroViewAdapter; import com.yizhuan.erban.avroom.adapter.CpMicroViewAdapter; +import com.yizhuan.erban.avroom.adapter.DatingMicroViewAdapter; import com.yizhuan.erban.avroom.adapter.KtvMicroViewAdapter; import com.yizhuan.erban.avroom.adapter.MicroViewAdapter; import com.yizhuan.erban.avroom.adapter.OnMicroItemClickListener; @@ -104,6 +105,7 @@ import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView; import com.yizhuan.erban.ui.widget.rollviewpager.Util; import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView; import com.yizhuan.erban.utils.KeyBoardUtils; +import com.yizhuan.erban.utils.UserUtils; import com.yizhuan.tutu.music.widget.MusicPlayerView; import com.yizhuan.tutu.room_chat.activity.RoomInviteFansActivity; import com.yizhuan.tutu.room_chat.activity.RoomMsgActivity; @@ -253,6 +255,8 @@ public class HomePartyRoomFragment extends BaseMvpFragment+QUixw&EypJm_{08?+$i~fK8tmhcGZDATeyOpRNcha#y?O)_A#JG=v56OpK zeI7XV8^-eA7^~-i0T_cG(Dn#}1{m}hZBMp9zei}B`d;@pK-9U*y?Kl z@`G63#J?>1PHG7>0BFGSBOsTg@B2WbTif6C8I8ZzeX)Oy(6o%6$l(IQ#>;^#=Lnmo z4H^O-ZyMaRcN;xF4Auxx^GEp;)L=h=cdVQOp7}|Of1i;HwF^{G21)>GS%F~%h!hwM*g%r~{Q!&|th@#^YZXiZ zk_M!J%J!m5fZg9DT(VWa`yWi0`}7PQ%3yVXIA;l0oQz0Az5vJ>t|=^_W@P`>cJ(xd@#V{AZ$E-7vrB#8Ay7u z%BEmadanSu1Qo;#ptCGwDCd%6MREbYe|yL-FzNv1(hHddNWuh@p-IssCTk))lVOou zyqDvgSp{STyq@d5JAhr^)gQLfG`MDV8y$C90&d)Y5>Gn)3&u+a8SFk{{^H>#px)HegYowlabQ;^m;1#<01^zq%_ntioEZo+rm*|D4bestjjK0gLO0fEq zdeek~X#35N%+vfFvKAn@M~$#afs!vbi3MoF9CFn;Ce8QN`qdHYkWadB^h`Bl@i3+Gu z5cGyHF5E=e^PuwR#N0Hd=>8@CNYmnvublvvZg15;)SF6K_j2z3qoyqv?J^Xpm3R=x zctj|k6|8iS!mC1Ix$2EGa$#7bvU4LZ2Ha&eAQDQm(eXITgIxDk<~QjuG? z;>lfRuTom^YM#>9;W5dN%zKMQYoVBi-D{3O3*ZRnP=57 zYK5RmP(R~9HN==b+{pd=yD;i?02_{c$^9uYC?uoOQ~wERnW5|2gfUK97Ym&=pw{*! zWv2jXNO~RF<-n=YAmV^W1(%dwRJ!P3h_*0V=_+uVm6BJ56eDmNqjC(9PJl4?gayz7 zlrk!Z!2m2L?Gz{_3KV8JU;}AQCOm|Cf2W=m#UVw5U{YW*0+eSbjtnIy(YwtZCRy05 zaX>xC<3Kj?V(I~G@~|So+&}vF&IV8+y(3>~OOtBB&{`6`NR0?CCzqPEB(bJUb2--b z##mU2LW%{tHe}+p$MX!O2JRIoyd;`nE#;P^)3HdTQoR-rS;pwiDJj*3n5+zbwbP=5az(eZ&G!_`%{9xbAMkQ%ga1wIXTaG@e!|BWvW?+bR{!&26STRX4-jTU;{eO zUcss%ph~qHBR$d+_{=6!^#zOEo0X{WJ$ zAF0^w@BU}_eN7*SWpKB6H{<1}&5*^|bvo(u@FFn}n%1^>0FAI2;Z!3=S9&=XjAW>^ zQ|`WGs4!L?ucSy&s$Ch@ML(BAW-u)EgFaIaMrjb0F|$khJ-Y}y?@&lq+8(amx0Rli zH|vgqPd>yrebB04ObQ|+MJg|mAhk9+*emSv_C>&ov9DLWAkb*VvyqB*@Xn+d{T6?U zaf!DcY5dzs-y@SwAFZU}UwEE;-1#C0G(OH=g1y_ZW;dITkQRF0KRu@8bAG?9)M;L;*mNtZh$;e rXT1L{@kpKU7cd?p!mt0EN9z9pVyymAz95q#00000NkvXXu0mjf=1tZ` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/bg_dating_step.png b/app/src/main/res/drawable-xhdpi/bg_dating_step.png new file mode 100644 index 0000000000000000000000000000000000000000..042ec579da3f587951db22408a39db04da34aa15 GIT binary patch literal 4358 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 + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_dating_select_woman_bg.xml b/app/src/main/res/drawable/selector_dating_select_woman_bg.xml new file mode 100644 index 000000000..f9bc2f1c3 --- /dev/null +++ b/app/src/main/res/drawable/selector_dating_select_woman_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_dating_step.xml b/app/src/main/res/drawable/selector_dating_step.xml new file mode 100644 index 000000000..31736bc2a --- /dev/null +++ b/app/src/main/res/drawable/selector_dating_step.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_micro_man_bg.xml b/app/src/main/res/drawable/shape_circle_micro_man_bg.xml new file mode 100644 index 000000000..9ec10c6de --- /dev/null +++ b/app/src/main/res/drawable/shape_circle_micro_man_bg.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml b/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml new file mode 100644 index 000000000..95029bc76 --- /dev/null +++ b/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_micro_dating.xml b/app/src/main/res/layout/item_micro_dating.xml new file mode 100644 index 000000000..249aa2f3b --- /dev/null +++ b/app/src/main/res/layout/item_micro_dating.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_micro_dating_boss.xml b/app/src/main/res/layout/item_micro_dating_boss.xml new file mode 100644 index 000000000..6b0786601 --- /dev/null +++ b/app/src/main/res/layout/item_micro_dating_boss.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml index 749da3257..cd7ca5000 100644 --- a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml +++ b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml @@ -133,6 +133,24 @@ android:src="@mipmap/ic_speedymsg_close" /> + + + extension; + /** + * 相亲模式使用 + */ + private String capUrl; + private int selectMicPosition; + //是否有选择心动对象 + private boolean hasSelectUser; + /** * GroupType_default = 0,//默认 * GroupTyp_red = 1, //蓝队 From 143dfe8a28abb735cd61b4908d1a55225e582110 Mon Sep 17 00:00:00 2001 From: huangjian Date: Wed, 20 Jan 2021 15:23:27 +0800 Subject: [PATCH 06/49] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomePartyRoomFragment.java | 88 +++++++++++------ .../avroom/presenter/HomePartyPresenter.java | 20 ++++ .../erban/ui/widget/UserInfoDialog.java | 57 ++++++++--- app/src/main/res/layout/dialog_user_info.xml | 20 ++++ .../manager/AvRoomDataManager.java | 11 +++ .../room/bean/DatingNotifyInfo.kt | 52 ++++++++++ .../room/event/DatingSelectUserEvent.java | 26 +++++ .../room/model/AvRoomModel.java | 14 +++ .../room/model/HomePartyModel.java | 98 +++++-------------- .../room/model/RoomBaseModel.java | 29 ++++++ .../room/model/inteface/IAvRoomModel.java | 23 +++++ .../room/model/inteface/IHomePartyModel.java | 4 + 12 files changed, 325 insertions(+), 117 deletions(-) create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingNotifyInfo.kt create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/event/DatingSelectUserEvent.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 40884902e..b5cc16c59 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -138,10 +138,10 @@ import com.yizhuan.xchat_android_core.mentoring_relationship.event.MentoringStop import com.yizhuan.xchat_android_core.mentoring_relationship.model.MentoringRelationshipModel; import com.yizhuan.xchat_android_core.miniworld.bean.MiniWorldInWorldInfo; import com.yizhuan.xchat_android_core.music.model.PlayerModel; -import com.yizhuan.xchat_android_core.redPacket.bean.ActionDialogInfo; import com.yizhuan.xchat_android_core.redpackage.RedPackageModel; import com.yizhuan.xchat_android_core.room.activitytimer.ActivityTimerEvent; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; +import com.yizhuan.xchat_android_core.room.event.DatingSelectUserEvent; import com.yizhuan.xchat_android_core.room.event.RoomClearScreenEvent; import com.yizhuan.xchat_android_core.room.face.DynamicFaceModel; import com.yizhuan.xchat_android_core.room.face.FaceInfo; @@ -242,8 +242,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment mActionDialogInfoList; - private Disposable mDisposable; private int audioQulity; @@ -254,7 +252,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment { -// getMvpPresenter().sendTextMsg(aLong + "app-test"); -// }); updateMentoringCountDownTimer(); } @@ -1106,7 +1095,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment + getDialogManager().showOkCancelDialog(finalHintText, true, () -> getMvpPresenter().datingNext())); + } else { + gameBinding.tvDatingNext.setVisibility(View.GONE); + } + } + + private void updateRemoteMuteBtn() { if (AvRoomDataManager.get().mCurrentRoomInfo != null) { bottomView.setRemoteMuteOpen(!RtcEngineManager.get().isRemoteMute); @@ -1327,12 +1342,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment buttonItems = new ArrayList<>(4); - final ButtonItem buttonItem1 = new ButtonItem(getString(R.string.embrace_up_mic), new ButtonItem.OnClickListener() { + final boolean presideMic = AvRoomDataManager.get().isDatingMode() && micPosition == -1; + final String presideText = presideMic ? "当主持人" : ""; + final ButtonItem buttonItem1 = new ButtonItem(getString(R.string.embrace_up_mic) + presideText, new ButtonItem.OnClickListener() { @Override public void onClick() { RoomInviteActivity.openActivity(getActivity(), micPosition); @@ -3096,5 +3114,15 @@ public class HomePartyRoomFragment extends BaseMvpFragment { } }); } + + public void datingNext() { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + mHomePartyMode.datingNext(roomInfo.getUid()) + .compose(bindToLifecycle()) + .doOnError(e -> SingleToastUtil.showToast(e.getMessage())) + .subscribe(); + } + + @SuppressLint("CheckResult") + public void datingSelect(long chosenUserId) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + mHomePartyMode.datingSelect(chosenUserId, UserUtils.getUserUid(), roomInfo.getUid()) + .compose(bindToLifecycle()) + .subscribe(s -> SingleToastUtil.showToast("选择成功") + , e -> SingleToastUtil.showToast(e.getMessage())); + } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java index aefd0fd33..b96a749a3 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java @@ -58,6 +58,7 @@ import com.yizhuan.xchat_android_core.praise.PraiseModel; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomResult; import com.yizhuan.xchat_android_core.room.dragonball.DragonBallModel; +import com.yizhuan.xchat_android_core.room.event.DatingSelectUserEvent; import com.yizhuan.xchat_android_core.room.face.FaceReceiveInfo; import com.yizhuan.xchat_android_core.room.giftvalue.GiftValueModel; import com.yizhuan.xchat_android_core.room.giftvalue.bean.RoomGiftValue; @@ -79,6 +80,8 @@ import com.yizhuan.xchat_android_library.utils.ListUtils; import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import com.yizhuan.xchat_android_library.utils.config.BasicConfig; +import org.greenrobot.eventbus.EventBus; + import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -107,7 +110,6 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private boolean isAttention; private UserInfo userInfo; private ImageView closeImage; - //private ImageView ivTopBg; private FrameLayout avatarLayout; private ImageView ivAvatarHeadWear; private ImageView avatar; @@ -125,9 +127,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private AppCompatImageView ivNewUser; private AppCompatImageView mIvGoodNumber; private AppCompatImageView mIvUserLevel; - private AppCompatImageView ivNamePlateView; private AppCompatImageView mIvUserCharm; - private LinearLayout llFamily; private TextView tvFamilyNameLabel; private TextView tvFamilyName; private FlexboxLayout flexbox; @@ -150,6 +150,8 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private ViewItem findHimView; + private TextView tvSelectHim; + public UserInfoDialog(Context context, long uid, List buttons, boolean isInRoom) { super(context, R.style.ErbanUserInfoDialog); this.context = context; @@ -186,7 +188,6 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe ivGender = findViewById(R.id.iv_gender); fansNumber = findViewById(R.id.fans_number); - //ivTopBg = findViewById(R.id.iv_top_bg); flexbox = findViewById(R.id.flexbox); inOfficialMask = findViewById(R.id.in_official_mask); @@ -201,10 +202,9 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe mIvUserLevel = findViewById(R.id.iv_user_level); mIvUserCharm = findViewById(R.id.iv_user_charm); - llFamily = (LinearLayout) findViewById(R.id.ll_family); tvFamilyNameLabel = (TextView) findViewById(R.id.tv_family_name_label); tvFamilyName = (TextView) findViewById(R.id.tv_family_name); - + tvSelectHim = findViewById(R.id.tv_select_him); avatarLayout.setOnClickListener(this); closeImage.setOnClickListener(this); TextView tvReport = findViewById(R.id.tv_report); @@ -223,7 +223,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe addMainAndMicBottons(); subscribe = IMNetEaseManager.get().getChatRoomEventObservable().subscribe(this::onReceiveRoomEvent); initAttentData(); - + initDatingData(); UserModel.get().getUserInfo(uid) .subscribe(new SingleObserver() { @Override @@ -263,6 +263,37 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe } } + private void initDatingData() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && + AvRoomDataManager.get().isDatingMode() && + RoomInfo.DATING_STATE_SELECT.equals(roomInfo.getBlindDateState()) && + AvRoomDataManager.get().isOwnerOnMic() && + !AvRoomDataManager.get().isSelectUser(myUid) && + AvRoomDataManager.get().isOnMic(uid) && + myUid != uid && + !AvRoomDataManager.get().isPreside(myUid) && + !AvRoomDataManager.get().isPreside(uid)) { + tvSelectHim.setVisibility(View.VISIBLE); + tvSelectHim.setOnClickListener(v -> { + int micPosition = AvRoomDataManager.get().getMicPosition(uid); + if (micPosition == Integer.MIN_VALUE) { + SingleToastUtil.showToast("该用户已不在麦位上,请重新选择"); + } else { + new DialogManager(context).showOkCancelDialog("确认选择" + (micPosition + 1) + "号嘉宾?", + true, () -> { + EventBus.getDefault().post(new DatingSelectUserEvent(uid, myUid, roomInfo.getUid())); + dismiss(); + }); + } + } + ); + } else { + tvSelectHim.setVisibility(View.GONE); + } + } + + /** * @param isVisiable ture则表示上麦的网格布局可见 */ @@ -478,10 +509,10 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe } //铭牌 - if (!TextUtils.isEmpty(userInfo.getNameplatePic()) && !TextUtils.isEmpty(userInfo.getNameplateWord())){ - setNamePlate(userInfo.getNameplatePic(),userInfo.getNameplateWord()); - }else { - setNamePlate(null,null); + if (!TextUtils.isEmpty(userInfo.getNameplatePic()) && !TextUtils.isEmpty(userInfo.getNameplateWord())) { + setNamePlate(userInfo.getNameplatePic(), userInfo.getNameplateWord()); + } else { + setNamePlate(null, null); } // 改变贵族 updateNobleView(); @@ -553,7 +584,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe ImageView ivNamePlate; ivNamePlate = inNamePlate.findViewById(R.id.iv_official_mask); if (ivNamePlate != null) { - ImageLoadUtils.loadImage(context,nameplatePic, ivNamePlate); + ImageLoadUtils.loadImage(context, nameplatePic, ivNamePlate); } } else { @@ -615,7 +646,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe // 设置普通人 if (userHeadwear != null && !TextUtils.isEmpty(userHeadwear.getPic())) { havaHead = true; - NobleUtil.loadHeadWear(userHeadwear.getEffect()!=null?userHeadwear.getEffect():userHeadwear.getPic(), ivAvatarHeadWear); + NobleUtil.loadHeadWear(userHeadwear.getEffect() != null ? userHeadwear.getEffect() : userHeadwear.getPic(), ivAvatarHeadWear); } if (nobleInfo == null || TextUtils.isEmpty(nobleInfo.getCardBg())) { diff --git a/app/src/main/res/layout/dialog_user_info.xml b/app/src/main/res/layout/dialog_user_info.xml index f7ce65d88..ce1560f24 100644 --- a/app/src/main/res/layout/dialog_user_info.xml +++ b/app/src/main/res/layout/dialog_user_info.xml @@ -321,6 +321,26 @@ android:visibility="gone"> + + + diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index cabbd842a..d0e5ce63f 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -1053,4 +1053,15 @@ public final class AvRoomDataManager { return mCurrentRoomInfo != null && mCurrentRoomInfo.getPlayType() == RoomInfo.PLAY_TYPE_DATING; } + /** + * @return 相亲模式是否已经选择心动对象了 + */ + public boolean isSelectUser(long uid) { + RoomQueueInfo roomQueueInfo = getRoomQueueMemberInfoByAccount(String.valueOf(uid)); + if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) return false; + return mCurrentRoomInfo != null && + mCurrentRoomInfo.getPlayType() == RoomInfo.PLAY_TYPE_DATING && + roomQueueInfo.mChatRoomMember.isHasSelectUser(); + } + } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingNotifyInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingNotifyInfo.kt new file mode 100644 index 000000000..48a71dfc4 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingNotifyInfo.kt @@ -0,0 +1,52 @@ +package com.yizhuan.xchat_android_core.room.bean + +import java.io.Serializable + +data class DatingNotifyInfo( + + /** 操作用户uid */ + val uid: Long = 0, + + /** 操作用户昵称 */ + val nickname: String = "", + + /** 操作用户麦位 */ + val position: Int = -1, + + /** 操作用户性别 */ + val gender: Int = 0, + + /** 操作用户头像 */ + val avatar: String = "", + + /** 目标用户uid */ + val targetUid: Long = 0, + + /** 目标用户昵称 */ + val targetNickname: String = "", + + /** 目标用户麦位 */ + val targetPosition: Int = -1, + + /** 目标用户性别 */ + val targetGender: Int = 0, + + /** 目标用户头像 */ + val targetAvatar: String = "", + + /** 相亲步骤变更提示文案 */ + val content: String = "", + + /** 是否有互选对象 */ + val hasHeart: Boolean = false, + + /** svga地址 */ + val svgaUrl: String = "", + + /** svga时长 */ + val svgaSecond: Int = 0, + + /** 是否有选择的对象 */ + val hasSelectUser: Boolean = false + +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/event/DatingSelectUserEvent.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/event/DatingSelectUserEvent.java new file mode 100644 index 000000000..7d2351b63 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/event/DatingSelectUserEvent.java @@ -0,0 +1,26 @@ +package com.yizhuan.xchat_android_core.room.event; + +public class DatingSelectUserEvent { + + private long chosenUserId; + private long electorUserId; + private long roomUserId; + + public DatingSelectUserEvent(long chosenUserId, long electorUserId, long roomUserId) { + this.chosenUserId = chosenUserId; + this.electorUserId = electorUserId; + this.roomUserId = roomUserId; + } + + public long getChosenUserId() { + return chosenUserId; + } + + public long getElectorUserId() { + return electorUserId; + } + + public long getRoomUserId() { + return roomUserId; + } +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java index 67e0bdeef..485d698b2 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java @@ -576,4 +576,18 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { return mRoomService.apiGetWelcomeConfig(toUid) .compose(RxHelper.handleCommon()); } + + @Override + public Single upMicroPhone(int micPosition, String uId, String roomId) { + return mRoomService.upMicroPhone(micPosition, uId, roomId) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single downMicroPhone(int micPosition, String uId, String roomId) { + return mRoomService.downMicroPhone(micPosition, uId, roomId) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java index fe55d8cb7..8c3c1150d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java @@ -203,42 +203,24 @@ public class HomePartyModel extends RoomBaseModel implements IHomePartyModel { } + @Override + public Single datingNext(long roomUserId) { + return mHomePartyService.datingNext(roomUserId) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleStringData()); + } + + @Override + public Single datingSelect(long chosenUserId, long electorUserId, long roomUserId) { + return mHomePartyService.datingSelect(chosenUserId, electorUserId, roomUserId) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleStringData()); + } + /** * 轰趴房间服务器相关接口 */ private interface HomePartyService { - /** - * 上麦接口 - * - * @param micPosition 上麦的位置 - * @param uId 上麦的用户id - * @param roomId 房间id - * @param ticket - * @return - */ - @FormUrlEncoded - @POST("room/mic/upmic") - Observable> upMicroPhone(@Field("position") int micPosition, - @Field("micUid") String uId, - @Field("roomId") String roomId, - @Field("ticket") String ticket); - - - /** - * 下麦接口 - * - * @param micPosition 上麦的位置 - * @param uId 上麦的用户id - * @param roomId 房间id - * @param ticket - * @return - */ - @FormUrlEncoded - @POST("room/mic/downmic") - Observable> downMicroPhone(@Field("position") int micPosition, - @Field("micUid") String uId, - @Field("roomId") String roomId, - @Field("ticket") String ticket); /** * 锁坑,开坑操作 @@ -276,58 +258,26 @@ public class HomePartyModel extends RoomBaseModel implements IHomePartyModel { @Field("uid") long uid); /** - * 邀请上麦 + * 相亲开始下一步 * - * @param micPosition - * @param micUid 被邀上麦用户uid - * @param roomId - * @param roomUid 房主或管理员UID - * @param ticket * @return */ @FormUrlEncoded - @POST("room/mic/invitemic") - Observable> inviteMictoPhone(@Field("position") int micPosition, - @Field("micUid") String micUid, - @Field("roomId") String roomId, - @Field("roomUid") String roomUid, - @Field("ticket") String ticket); + @POST("blind-date/state") + Single> datingNext(@Field("roomUserId") long roomUserId); /** - * 踢人下麦 + * 相亲选人 * - * @param micPosition - * @param micUid 被踢下麦用户uid - * @param roomId - * @param roomUid 房主或管理员UID - * @param ticket * @return */ @FormUrlEncoded - @POST("room/mic/kickmic") - Observable> kickMicroPhone(@Field("position") int micPosition, - @Field("micUid") long micUid, - @Field("roomId") long roomId, - @Field("roomUid") long roomUid, - @Field("ticket") String ticket); - - /** - * 邀请上麦 - * - * @param micUid 上麦用户uid - * @param roomId 房间ID - * @param position - * @param ticket - * @param roomUid 房主或管理员UID - * @return - */ - @FormUrlEncoded - @POST("room/mic/invitemic") - Observable> inviteMicroPhone(@Field("micUid") long micUid, - @Field("roomId") long roomId, - @Field("position") int position, - @Field("ticket") String ticket, - @Field("roomUid") long roomUid); + @POST("blind-date/connection") + Single> datingSelect(@Field("chosenUserId") long chosenUserId, + @Field("electorUserId") long electorUserId, + @Field("roomUserId") long roomUserId); } + + } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java index 7e0d33455..589b6e9d7 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java @@ -1028,6 +1028,35 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { @GET("/welcome/room/msg/getOne") Single> apiGetWelcomeConfig(@Query("toUid") long toUid); + /** + * 上麦接口 + * + * @param micPosition 上麦的位置 + * @param uId 上麦的用户id + * @param roomId 房间id + * @return + */ + @FormUrlEncoded + @POST("room/mic/upmic") + Single> upMicroPhone(@Field("position") int micPosition, + @Field("micUid") String uId, + @Field("roomId") String roomId); + + + /** + * 下麦接口 + * + * @param micPosition 上麦的位置 + * @param uId 上麦的用户id + * @param roomId 房间id + * @return + */ + @FormUrlEncoded + @POST("room/mic/downmic") + Single> downMicroPhone(@Field("position") int micPosition, + @Field("micUid") String uId, + @Field("roomId") String roomId); + } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java index ccef8a27c..77e0773e3 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java @@ -139,4 +139,27 @@ public interface IAvRoomModel extends IModel { */ Single>> roomSearch(String key); + /** + * 上麦 + * + * @param micPosition 上麦的位置 + * @param uId 上麦的用户id + * @param roomId 房间id + * @return + */ + + Single upMicroPhone(int micPosition, String uId, String roomId); + + + /** + * 下麦 + * + * @param micPosition 上麦的位置 + * @param uid 上麦的用户id + * @param roomId 房间id + * @return + */ + + Single downMicroPhone(int micPosition, String uid, String roomId); + } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java index 5c264dfb3..c9810371e 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java @@ -62,4 +62,8 @@ public interface IHomePartyModel extends IModel { * @param ticket */ Single openOrCloseMicroPhone(int micPosition, int state, long roomUid, String ticket); + + Single datingNext(long roomUserId); + + Single datingSelect(long chosenUserId, long electorUserId, long roomUserId); } From 972f635e70b4b362badfaf0dc36dbf9c6734610a Mon Sep 17 00:00:00 2001 From: huangjian Date: Wed, 20 Jan 2021 18:57:32 +0800 Subject: [PATCH 07/49] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8FIM=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/fragment/HomePartyFragment.java | 83 +++++++++++++ .../erban/avroom/helper/AnimHelper.java | 110 ++++++++++++++++++ .../res/drawable-xhdpi/ic_dating_like.png | Bin 0 -> 4866 bytes .../res/drawable/shape_dating_second_bg.xml | 6 + .../layout/fragment_chatroom_game_main.xml | 53 +++++++++ .../XChatConstants.java | 1 + .../manager/IMNetEaseManager.java | 58 ++++++++- .../im/custom/bean/CustomAttachParser.java | 18 ++- .../im/custom/bean/CustomAttachment.java | 8 ++ .../im/custom/bean/DatingAttachment.java | 38 ++++++ .../custom/bean/DatingPublishAttachment.java | 43 +++++++ .../manager/AvRoomDataManager.java | 1 + .../xchat_android_core/manager/RoomEvent.java | 2 + 13 files changed, 413 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/avroom/helper/AnimHelper.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_dating_like.png create mode 100644 app/src/main/res/drawable/shape_dating_second_bg.xml create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAttachment.java create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingPublishAttachment.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java index 887f64785..ae54f84c0 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.graphics.Color; +import android.graphics.Point; import android.media.MediaPlayer; import android.os.Bundle; import android.os.SystemClock; @@ -13,9 +14,11 @@ import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; +import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewConfiguration; +import android.view.ViewGroup; import android.view.ViewStub; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -29,6 +32,7 @@ import androidx.databinding.DataBindingUtil; import com.coorchice.library.SuperTextView; import com.netease.nim.uikit.common.util.string.StringUtil; +import com.netease.nim.uikit.common.util.sys.ScreenUtil; import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.netease.nimlib.sdk.chatroom.model.ChatRoomNotificationAttachment; @@ -44,6 +48,7 @@ import com.yizhuan.erban.R; import com.yizhuan.erban.UIHelper; import com.yizhuan.erban.avroom.activity.AVRoomActivity; import com.yizhuan.erban.avroom.activity.RoomOnlineUserActivity; +import com.yizhuan.erban.avroom.helper.AnimHelper; import com.yizhuan.erban.avroom.presenter.HomePartyPresenter; import com.yizhuan.erban.avroom.widget.GiftV2View; import com.yizhuan.erban.avroom.widget.MessageView; @@ -70,6 +75,7 @@ import com.yizhuan.xchat_android_core.home.bean.BannerInfo; import com.yizhuan.xchat_android_core.home.event.FollowRoomEvent; import com.yizhuan.xchat_android_core.home.model.CollectionRoomModel; import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.DatingAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.LevelUpNoticeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomBoxPrizeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomInfoAttachment; @@ -81,6 +87,7 @@ import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.manager.RoomEvent; import com.yizhuan.xchat_android_core.monsterhunting.SimpleAnimationListener; import com.yizhuan.xchat_android_core.praise.PraiseModel; +import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.game.GameEvent; import com.yizhuan.xchat_android_core.room.game.GameResultInfo; @@ -91,6 +98,7 @@ import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; +import com.yizhuan.xchat_android_core.utils.StringExtensionKt; import com.yizhuan.xchat_android_library.rxbus.RxBus; import com.yizhuan.xchat_android_library.utils.ListUtils; import com.yizhuan.xchat_android_library.utils.LogUtil; @@ -99,6 +107,7 @@ import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.lang.reflect.Field; @@ -112,6 +121,8 @@ import java.util.concurrent.TimeUnit; import cn.sharesdk.framework.Platform; import io.reactivex.Observable; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Single; import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -119,6 +130,8 @@ import io.reactivex.functions.Action; import nl.dionsegijn.konfetti.models.Shape; import nl.dionsegijn.konfetti.models.Size; +import static com.yizhuan.xchat_android_constants.XChatConstants.SELECT_ANIM_DURATION; + /** * 轰趴房 * Created by 2016/9/22. @@ -156,6 +169,8 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi private ShareDialog shareDialog; + private Disposable datingDisposable; + //收藏房间 private String FOLLOW_ROOM_TYPE = ""; //取消收藏房间 @@ -405,6 +420,9 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi //厅内福袋 addLuckyBagNotify(roomEvent.getChatRoomMessage()); break; + case RoomEvent.DATING_PUBLISH_RESULT: + showHandAnim(((DatingAttachment) roomEvent.getChatRoomMessage().getAttachment()).getDatingNotifyInfo()); + break; default: break; } @@ -841,6 +859,7 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi if (disposableLuckyGift != null) disposableLuckyGift.dispose(); if (disposableMemberIn != null) disposableMemberIn.dispose(); if (disposableLevelUp != null) disposableLevelUp.dispose(); + if (datingDisposable != null) datingDisposable.dispose(); } @@ -1341,4 +1360,68 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi } gameMainBinding.roomNums.setText("在线" + onlineNumber); } + + @SuppressLint({"SetTextI18n"}) + private void showHandAnim(final DatingNotifyInfo datingNotifyInfo) { + if (datingDisposable != null) datingDisposable.dispose(); + gameMainBinding.flSvgaDating.post(() -> gameMainBinding.flSvgaDating.setVisibility(View.GONE)); + datingDisposable = Single.just(datingNotifyInfo) + .compose(bindToLifecycle()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(info -> { + if (datingNotifyInfo.getHasSelectUser() && !datingNotifyInfo.getHasHeart()) { + showHeartAnim(datingNotifyInfo.getPosition(), datingNotifyInfo.getTargetPosition()); + return Single.timer(SELECT_ANIM_DURATION, TimeUnit.MILLISECONDS).map(aLong -> info); + } + return Single.just(info); + }) + .observeOn(AndroidSchedulers.mainThread()) + .filter(info -> datingNotifyInfo.getHasHeart()) + .toObservable() + .flatMap(info -> Observable.create((ObservableOnSubscribe) emitter -> + SVGAParser.Companion.shareParser().decodeFromURL(new URL(datingNotifyInfo.getSvgaUrl()), new SVGAParser.ParseCompletion() { + + @Override + public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) { + gameMainBinding.flSvgaDating.setVisibility(View.VISIBLE); + gameMainBinding.llDatingSvgaTime.setVisibility(View.GONE); + SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); + TextPaint textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE); + textPaint.setTextSize(ScreenUtil.sp2px(10)); + AnimHelper.addDynamicImage(gameMainBinding.svgaDating, dynamicEntity, datingNotifyInfo.getAvatar(), "z_tx"); + AnimHelper.addDynamicImage(gameMainBinding.svgaDating, dynamicEntity, datingNotifyInfo.getTargetAvatar(), "y_tx"); + dynamicEntity.setDynamicText(StringExtensionKt.subAndReplaceDot(datingNotifyInfo.getNickname(), 5), textPaint, "z_yhname"); + dynamicEntity.setDynamicText(StringExtensionKt.subAndReplaceDot(datingNotifyInfo.getTargetNickname(), 5), textPaint, "y_yhname"); + SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); + gameMainBinding.svgaDating.setImageDrawable(drawable); + gameMainBinding.svgaDating.startAnimation(); + emitter.onNext(info); + emitter.onComplete(); + } + + @Override + public void onError() { + emitter.onError(new Throwable("svga解析失败")); + } + }))) + .flatMap(info -> Observable.intervalRange(1, info.getSvgaSecond(), 1, 1, TimeUnit.SECONDS)) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> gameMainBinding.flSvgaDating.setVisibility(View.GONE)) + .subscribe(aLong -> { + long residueTime = datingNotifyInfo.getSvgaSecond() - aLong; + gameMainBinding.tvDatingSecond.setText(residueTime + "S"); + if (residueTime == 5) {//剩余5秒开始显示倒计时 + gameMainBinding.llDatingSvgaTime.setVisibility(View.VISIBLE); + } + }); + } + + public void showHeartAnim(int position, int targetPosition) { + SparseArray micViewPoint = AvRoomDataManager.get().mMicPointMap; + AnimHelper.showDatingSelectUserAnim(getContext(), + (ViewGroup) gameMainBinding.getRoot(), + micViewPoint.get(position), + micViewPoint.get(targetPosition)); + } } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/helper/AnimHelper.java b/app/src/main/java/com/yizhuan/erban/avroom/helper/AnimHelper.java new file mode 100644 index 000000000..fbbd20944 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/helper/AnimHelper.java @@ -0,0 +1,110 @@ +package com.yizhuan.erban.avroom.helper; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.Keyframe; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Point; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import androidx.annotation.Nullable; + +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; +import com.coorchice.library.utils.LogUtils; +import com.netease.nim.uikit.common.util.sys.ScreenUtil; +import com.netease.nim.uikit.support.glide.GlideApp; +import com.opensource.svgaplayer.SVGADynamicEntity; +import com.yizhuan.erban.R; + +import static com.yizhuan.xchat_android_constants.XChatConstants.SELECT_ANIM_DURATION; + +public class AnimHelper { + + public static void showDatingSelectUserAnim(Context context, ViewGroup viewGroup, Point senderPoint, Point receivePoint) { + if (viewGroup == null || context == null || senderPoint == null || receivePoint == null) + return; + + final int width = ScreenUtil.dip2px(80); + final int height = ScreenUtil.dip2px(80); + final ImageView imageView = new ImageView(context); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, height); + layoutParams.leftMargin = senderPoint.x; + layoutParams.topMargin = senderPoint.y; + imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + imageView.setImageResource(R.drawable.ic_dating_like); + viewGroup.addView(imageView,layoutParams); + Keyframe kx0 = Keyframe.ofFloat(0f, 0f); + Keyframe kx1 = Keyframe.ofFloat(0.2f, 0f); + Keyframe kx2 = Keyframe.ofFloat(0.8f, receivePoint.x - senderPoint.x); + Keyframe kx3 = Keyframe.ofFloat(1f, receivePoint.x - senderPoint.x); + + Keyframe ky0 = Keyframe.ofFloat(0f, 0); + Keyframe ky1 = Keyframe.ofFloat(0.2f, 0); + Keyframe ky2 = Keyframe.ofFloat(0.8f, receivePoint.y - senderPoint.y); + Keyframe ky3 = Keyframe.ofFloat(1f, receivePoint.y - senderPoint.y); + + Keyframe ks0 = Keyframe.ofFloat(0f, 0f); + Keyframe ks1 = Keyframe.ofFloat(0.2f, 1f); + Keyframe ks2 = Keyframe.ofFloat(0.8f, 1f); + Keyframe ks3 = Keyframe.ofFloat(1f, 1.6f); + + Keyframe ka0 = Keyframe.ofFloat(0f, 0f); + Keyframe ka1 = Keyframe.ofFloat(0.2f, 1f); + Keyframe ka2 = Keyframe.ofFloat(0.8f, 1f); + Keyframe ka3 = Keyframe.ofFloat(1f, 0f); + + PropertyValuesHolder p0 = PropertyValuesHolder.ofKeyframe("translationX", kx0, kx1, kx2, kx3); + PropertyValuesHolder p1 = PropertyValuesHolder.ofKeyframe("translationY", ky0, ky1, ky2, ky3); + PropertyValuesHolder p2 = PropertyValuesHolder.ofKeyframe("scaleX", ks0, ks1, ks2, ks3); + PropertyValuesHolder p3 = PropertyValuesHolder.ofKeyframe("scaleY", ks0, ks1, ks2, ks3); + PropertyValuesHolder p4 = PropertyValuesHolder.ofKeyframe("alpha", ka0, ka1, ka2, ka3); + ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView, p0, p1, p2, p3, p4); + objectAnimator.setDuration(SELECT_ANIM_DURATION); + objectAnimator.start(); + objectAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + ViewGroup viewGroup = (ViewGroup) imageView.getParent(); + viewGroup.removeView(imageView); + } + }); + } + + public static void addDynamicImage(View view, SVGADynamicEntity dynamicEntity, String url, String forKey) { + if (TextUtils.isEmpty(url) || TextUtils.isEmpty(forKey)) { + LogUtils.e("addDynamicImage: url or forKey is null or empty"); + return; + } + GlideApp.with(view) + .asBitmap() + .circleCrop() + .load(url) + .addListener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + view.post(() -> dynamicEntity.setDynamicImage(BitmapFactory.decodeResource(view.getResources(), R.drawable.default_avatar), forKey)); + return false; + } + + @Override + public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + view.post(() -> dynamicEntity.setDynamicImage(resource, forKey)); + return false; + } + }) + .submit(); + } + +} diff --git a/app/src/main/res/drawable-xhdpi/ic_dating_like.png b/app/src/main/res/drawable-xhdpi/ic_dating_like.png new file mode 100644 index 0000000000000000000000000000000000000000..fccb6833a07eaa7999019a5748daf154a5af4dba GIT binary patch literal 4866 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/shape_dating_second_bg.xml b/app/src/main/res/drawable/shape_dating_second_bg.xml new file mode 100644 index 000000000..8a3917023 --- /dev/null +++ b/app/src/main/res/drawable/shape_dating_second_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_chatroom_game_main.xml b/app/src/main/res/layout/fragment_chatroom_game_main.xml index 7d8a75e82..879a0aae3 100644 --- a/app/src/main/res/layout/fragment_chatroom_game_main.xml +++ b/app/src/main/res/layout/fragment_chatroom_game_main.xml @@ -219,6 +219,59 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> + + + + + + + + + + + + + + + + + roomProcessor; private static PublishProcessor relationShipProcessor; private static PublishSubject msgProcessor; - + private Disposable datingDisposable; private static final class Helper { private static final IMNetEaseManager INSTANCE = new IMNetEaseManager(); @@ -1268,14 +1277,46 @@ public final class IMNetEaseManager { break; } break; - case CustomAttachment.CUSTOM_MSG_LEVEL_UP: + if (second == CUSTOM_MSG_EXPER_LEVEL_UP_NOTICE) { + noticeExperLevelUpNotice(msg); + } + break; + case CUSTOM_MSG_DATING: switch (second) { - case CUSTOM_MSG_EXPER_LEVEL_UP_NOTICE: - noticeExperLevelUpNotice(msg); + case CUSTOM_MSG_SUB_DATING_SELECT: + if (((DatingAttachment) msg.getAttachment()).getDatingNotifyInfo().getUid() == AuthModel.get().getCurrentUid()) { + addMessages(msg); + } + break; + case CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE: + case CUSTOM_MSG_SUB_DATING_PUBLISH_HEART: + addMessages(msg); + break; + case CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT: + DatingPublishAttachment dpAttachment = (DatingPublishAttachment) msg.getAttachment(); + if (datingDisposable != null) datingDisposable.dispose(); + datingDisposable = Observable.fromIterable(dpAttachment.getDatingNotifyInfos()) + .concatMap(datingNotifyInfo -> { + DatingAttachment datingAttachment = new DatingAttachment(datingNotifyInfo.getHasHeart() ? + CUSTOM_MSG_SUB_DATING_PUBLISH_HEART : CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE); + datingAttachment.setDatingNotifyInfo(datingNotifyInfo); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(AvRoomDataManager.get().getRoomId()), + datingAttachment); + addMessages(message); + noticeRoomEvent(message, RoomEvent.DATING_PUBLISH_RESULT); + //延迟发送消息,是心动则在Svga时长上加一秒,避免过早结束,选人则是SELECT_ANIM_DURATION时长,没选择就是0了 + return Observable.timer(datingNotifyInfo.getHasHeart() ? (datingNotifyInfo.getSvgaSecond() * 1000 + 1000) : + (datingNotifyInfo.getHasSelectUser() ? SELECT_ANIM_DURATION : 0), TimeUnit.MILLISECONDS); + }) + .subscribe(aLong -> { + }, Throwable::printStackTrace); break; } + break; default: + break; } } else if (msg.getMsgType() == MsgTypeEnum.text) { addMessages(msg); @@ -3474,4 +3515,13 @@ public final class IMNetEaseManager { getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.LEAVE_MODE)); } + + //释放退出房间云信需要释放的资源 + public void release() { + mCacheRoomQueueInfo = null; + if (datingDisposable != null) { + datingDisposable.dispose(); + datingDisposable = null; + } + } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java index d507fe4ed..87895f86d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java @@ -6,8 +6,8 @@ import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; import com.netease.nimlib.sdk.msg.attachment.MsgAttachmentParser; import com.yizhuan.xchat_android_core.bean.attachmsg.RoomQueueMsgAttachment; import com.yizhuan.xchat_android_core.community.attachment.DynamicSysAttachment; -import com.yizhuan.xchat_android_core.community.im.WorldDynamicAttachment; import com.yizhuan.xchat_android_core.community.attachment.UnReadCountAttachment; +import com.yizhuan.xchat_android_core.community.im.WorldDynamicAttachment; import com.yizhuan.xchat_android_core.im.custom.AttachManager; import com.yizhuan.xchat_android_core.mentoring_relationship.attachment.MentoringApprenticeMissionFourAttachment; import com.yizhuan.xchat_android_core.mentoring_relationship.attachment.MentoringApprenticeMissionOneAttachment; @@ -44,11 +44,11 @@ import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUS import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_CHATTER_BOX_ASK; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_CHATTER_BOX_DROP; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_CHATTER_BOX_INIT; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DRAGON_BAR; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_EXPER_LEVEL_UP; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_EXPER_LEVEL_UP_NOTICE; -import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GAME_RESPOND; -import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DRAGON_BAR; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GAME; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GAME_RESPOND; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_TOPIC; @@ -533,7 +533,17 @@ public class CustomAttachParser implements MsgAttachmentParser { attachment = new NewbieHelloAttachment(second); } break; - + case CustomAttachment.CUSTOM_MSG_DATING: + switch (second) { + case CustomAttachment.CUSTOM_MSG_SUB_DATING_SELECT: + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE: + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_HEART: + attachment = new DatingAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT: + attachment = new DatingPublishAttachment(first, second); + break; + } default: break; } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java index 888f8e403..0b3db94c6 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java @@ -369,6 +369,14 @@ public class CustomAttachment implements MsgAttachment { // public static final int CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_CHAT_ROOM = 702;// 推送进入聊天页 // public static final int CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_DYNAMIC_MSG = 703;// 推送进入动态消息 + + //相亲模式 + public static final int CUSTOM_MSG_DATING = 71; + public static final int CUSTOM_MSG_SUB_DATING_SELECT = 711; + public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT = 712; + public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE = 713; + public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_HEART = 714; + public CustomAttachment() { } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAttachment.java new file mode 100644 index 000000000..e95b4fcf7 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAttachment.java @@ -0,0 +1,38 @@ +package com.yizhuan.xchat_android_core.im.custom.bean; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; + +/** + * @author xiaoyu + */ + +public class DatingAttachment extends CustomAttachment { + + private DatingNotifyInfo datingNotifyInfo; + + + public DatingAttachment(int second) { + super(CUSTOM_MSG_DATING, second); + } + + public DatingNotifyInfo getDatingNotifyInfo() { + return datingNotifyInfo; + } + + public void setDatingNotifyInfo(DatingNotifyInfo datingNotifyInfo) { + this.datingNotifyInfo = datingNotifyInfo; + } + + @Override + protected void parseData(JSONObject data) { + datingNotifyInfo = new Gson().fromJson(data.toJSONString(), DatingNotifyInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(datingNotifyInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingPublishAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingPublishAttachment.java new file mode 100644 index 000000000..411109164 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingPublishAttachment.java @@ -0,0 +1,43 @@ +package com.yizhuan.xchat_android_core.im.custom.bean; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; + +import java.util.List; + +/** + * @author xiaoyu + */ + +public class DatingPublishAttachment extends CustomAttachment { + private List datingNotifyInfos; + + public DatingPublishAttachment(int first, int second) { + super(first, second); + } + + public List getDatingNotifyInfos() { + return datingNotifyInfos; + } + + public void setDatingNotifyInfos(List datingNotifyInfos) { + this.datingNotifyInfos = datingNotifyInfos; + } + + @Override + protected void parseData(JSONObject data) { + if (data.containsKey("list")) { + datingNotifyInfos = new Gson().fromJson(data.getJSONArray("list").toJSONString(), new TypeToken>() { + }.getType()); + } + + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(datingNotifyInfos); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index d0e5ce63f..04c5a5b6d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -189,6 +189,7 @@ public final class AvRoomDataManager { } public void release() { + IMNetEaseManager.get().release(); GameModel.get().clear(); RtcEngineManager.get().leaveChannel(); clear(); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java index 060cc1285..c9abc643f 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java @@ -206,6 +206,8 @@ public class RoomEvent { //开宝箱横幅,SVGA背景的 public static final int BOX_NOTIFY_SVGA = 69; + public static final int DATING_PUBLISH_RESULT = 70; + private int event = NONE; private int micPosition = Integer.MIN_VALUE; private int posState = -1; From efde73af0d1e395ba79981a87542bd4e074b08d4 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 21 Jan 2021 14:10:50 +0800 Subject: [PATCH 08/49] =?UTF-8?q?=E5=A1=94=E7=BD=97=E7=89=8C=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomePartyRoomFragment.java | 3 +- .../avroom/presenter/AvRoomPresenter.java | 2 - .../erban/home/adapter/RoomActAdapter.java | 13 +------ .../ui/webview/CommonWebViewActivity.java | 39 +++++++++++++++---- .../ui/webview/DialogWebViewActivity.java | 5 +++ .../yizhuan/erban/ui/webview/JSInterface.java | 16 +++++++- .../ui/webview/event/TaroPayResultEvent.java | 20 ++++++++++ .../XChatConstants.java | 10 +++++ .../yizhuan/xchat_android_core/Constants.java | 5 +++ .../room/bean/ActivityInfo.java | 33 ---------------- .../room/model/AvRoomModel.java | 1 - .../room/model/RoomBaseModel.java | 1 - .../room/model/inteface/IAvRoomModel.java | 2 - 13 files changed, 89 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/ui/webview/event/TaroPayResultEvent.java delete mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/bean/ActivityInfo.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 91e57fdac..ccbe87861 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -35,6 +35,7 @@ import android.widget.TextView; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.coorchice.library.SuperTextView; +import com.yizhuan.erban.ui.webview.DialogWebViewActivity; import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView; import com.yizhuan.erban.ui.widget.rollviewpager.Util; import com.yizhuan.erban.ui.widget.rollviewpager.hintview.ColorPointHintView; @@ -1133,7 +1134,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment map = new HashMap<>(); + map.put("Referer", Constants.WXPAY_REFERER); + webView.loadUrl(url, map); + } else { + toast("网页链接无效"); + finish(); + } } @Override @@ -486,4 +504,9 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O StatusBarUtil.transparencyBar(this); StatusBarUtil.StatusBarLightMode(this); } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onTaroPayResultEvent(TaroPayResultEvent event) { + finish(); + } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/DialogWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/DialogWebViewActivity.java index 5893de409..f3601f436 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/DialogWebViewActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/DialogWebViewActivity.java @@ -3,12 +3,17 @@ package com.yizhuan.erban.ui.webview; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import com.netease.nim.uikit.common.util.sys.ScreenUtil; import com.yizhuan.erban.R; +import com.yizhuan.xchat_android_core.Constants; + +import java.util.HashMap; +import java.util.Map; public class DialogWebViewActivity extends CommonWebViewActivity { 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 61a6f5e74..2cbac5cf9 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 @@ -30,6 +30,7 @@ import com.yizhuan.erban.ui.webview.event.CloseDialogWebViewEvent; import com.yizhuan.erban.ui.webview.event.CloseWebViewEvent; import com.yizhuan.erban.ui.webview.event.H5NotifyClientEvent; 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_core.auth.AuthModel; import com.yizhuan.xchat_android_core.certification.event.CertificationResultEvent; @@ -501,7 +502,20 @@ public class JSInterface { @JavascriptInterface public void closeDialogWebView() { - EventBus.getDefault().post(new CloseDialogWebViewEvent()); + if (mActivity!=null) mActivity.finish(); + } + + /** + * 打开弹窗式 WebViewActivity + */ + @JavascriptInterface + public void openDialogWebview(String url) { + DialogWebViewActivity.start(mActivity, url); + } + + @JavascriptInterface + public void checkResultFinish(int result) { + EventBus.getDefault().post(new TaroPayResultEvent().setResult(result)); } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/event/TaroPayResultEvent.java b/app/src/main/java/com/yizhuan/erban/ui/webview/event/TaroPayResultEvent.java new file mode 100644 index 000000000..8f14d8e03 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/event/TaroPayResultEvent.java @@ -0,0 +1,20 @@ +package com.yizhuan.erban.ui.webview.event; + + +/** + * Created by MadisonRong on 26/06/2018. + */ + +public class TaroPayResultEvent { + + private int result; + + public int getResult() { + return result; + } + + public TaroPayResultEvent setResult(int result) { + this.result = result; + return this; + } +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java index 66364f683..d4c2394b8 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java @@ -289,6 +289,16 @@ public class XChatConstants { public static final String OPPO_APP_KEY = "631b6753a1fa481e88dd57793a04e531"; public static final String OPPO_SECRET = "c963ee7c0ba54fbfb3124b4aa7011b17"; + /** + * Referer (DEBUG) + */ + public static final String KEY_REFERER_DEBUG = "http://120.79.211.243/"; + + /** + * Referer (RELEASE) + */ + public static final String KEY_REFERER_RELEASE = "https://api.zhongjialx.com/"; + // 侧耳 // public static final String QUICK_PASS_BUSINESS_ID = BuildConfig.DEBUG ? "cadbb4ed892549dab4d1adc9d62013bb" : "ba4a642810294561b9cd17034a448b49"; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java b/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java index 9e0a560bb..7931a0389 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java @@ -1,6 +1,8 @@ package com.yizhuan.xchat_android_core; import com.yizhuan.xchat_android_constants.XChatConstants; +import com.yizhuan.xchat_android_library.utils.config.BasicConfig; +import com.yizhuan.xchat_android_library.utils.pref.CommonPref; import java.io.File; @@ -101,4 +103,7 @@ public class Constants { public static final byte TYPE_JOINED = 1; public static final byte TYPE_RECOMMEND = 2; public static final byte TYPE_ALL = 0; + + public static final String WXPAY_REFERER = (BuildConfig.DEBUG && CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("enviroment") != 0) ? + XChatConstants.KEY_REFERER_DEBUG : XChatConstants.KEY_REFERER_RELEASE; } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/ActivityInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/ActivityInfo.java deleted file mode 100644 index a8f5ee842..000000000 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/ActivityInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.yizhuan.xchat_android_core.room.bean; - -import com.yizhuan.xchat_android_core.redPacket.bean.ActionDialogInfo; - -import java.util.List; - -public class ActivityInfo { - - /** - * list : [{"actId":5,"actName":"51大酬宾","seqNo":1,"alertWinPic":"https://image.zhongjialx.com/Fo5iOjNLYe6vwMk69OxSXlsgqGNJ?imageslim","imageType":"png","skipType":2,"skipUrl":"https://www.baidu.com","startTime":1556985600000,"endTime":1557763199000,"packName":"测试大礼包"},{"actId":7,"actName":"测试活动xxx","seqNo":10,"alertWinPic":"https://image.zhongjialx.com/Fts-bIveVbuHZj-UOOuT0ksncp3T?imageslim","imageType":"png","skipType":1,"skipUrl":"901485","startTime":1556640000000,"endTime":1559231999000,"packName":"情人礼包"}] - * rotateInterval : 3 - */ - - private int rotateInterval; - private List list; - - public int getRotateInterval() { - return rotateInterval; - } - - public void setRotateInterval(int rotateInterval) { - this.rotateInterval = rotateInterval; - } - - public List getList() { - return list; - } - - public void setList(List list) { - this.list = list; - } - -} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java index 67e0bdeef..af28a4541 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java @@ -31,7 +31,6 @@ import com.yizhuan.xchat_android_core.patriarch.exception.PmRoomLimitException; import com.yizhuan.xchat_android_core.room.activitytimer.ActivityTimerEvent; import com.yizhuan.xchat_android_core.room.activitytimer.TimerBean; -import com.yizhuan.xchat_android_core.room.bean.ActivityInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomResult; import com.yizhuan.xchat_android_core.room.bean.RoomWelcomeConfig; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java index b2a1698c7..3e530721c 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java @@ -30,7 +30,6 @@ import com.yizhuan.xchat_android_core.home.bean.BannerInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.room.activitytimer.TimerBean; -import com.yizhuan.xchat_android_core.room.bean.ActivityInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomResult; import com.yizhuan.xchat_android_core.room.bean.RoomSettingTabInfo; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java index ccef8a27c..8d90aa35e 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java @@ -5,9 +5,7 @@ import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData; import com.yizhuan.xchat_android_core.base.IModel; import com.yizhuan.xchat_android_core.bean.response.ServiceResult; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; -import com.yizhuan.xchat_android_core.redPacket.bean.ActionDialogInfo; import com.yizhuan.xchat_android_core.room.activitytimer.TimerBean; -import com.yizhuan.xchat_android_core.room.bean.ActivityInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomResult; import com.yizhuan.xchat_android_core.room.bean.RoomWelcomeConfig; From 05ae643df5dfc3014124f1cf3bdabb43d93fcfa8 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 21 Jan 2021 14:29:00 +0800 Subject: [PATCH 09/49] =?UTF-8?q?=E7=9B=B8=E4=BA=B2=E6=8A=B1=E4=BA=BA?= =?UTF-8?q?=E4=B8=8A=E9=BA=A6=E5=BD=93=E4=B8=BB=E6=8C=81=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E9=9D=9E=E6=88=BF=E4=B8=BB=E5=92=8C=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/activity/RoomInviteActivity.java | 9 ++++++--- .../avroom/fragment/HomePartyRoomFragment.java | 2 +- .../avroom/presenter/RoomInvitePresenter.java | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomInviteActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomInviteActivity.java index ba79f6760..18ae39603 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomInviteActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/RoomInviteActivity.java @@ -42,10 +42,12 @@ public class RoomInviteActivity extends BaseMvpActivity { * 填0会使用当前服务器最新时间开始查询,即第一页,单位毫秒 */ @SuppressLint("CheckResult") - public void requestChatMemberByPage(final int page, long time) { + public void requestChatMemberByPage(final int page, long time, boolean onlyManager) { mRoomInviteModel.getPageMembers(page, time) .map(chatRoomMemberList -> { SparseArray queueInfoSparseArray = AvRoomDataManager.get().mMicQueueMemberMap; @@ -53,20 +54,29 @@ public class RoomInvitePresenter extends BaseMvpPresenter { //移除麦上人员 ChatRoomMember chatRoomMember; ListIterator iterator = chatRoomMemberList.listIterator(); - for (; iterator.hasNext(); ) { + while (iterator.hasNext()) { chatRoomMember = iterator.next(); + boolean removed = false; //过滤超管 if (SuperAdminUtil.isSuperAdmin(chatRoomMember)) { iterator.remove(); + removed = true; } else { for (int i = 0; i < size; i++) { RoomQueueInfo roomQueueInfo = queueInfoSparseArray.valueAt(i); if (roomQueueInfo.mChatRoomMember != null && Objects.equals(chatRoomMember.getAccount(), roomQueueInfo.mChatRoomMember.getAccount())) { iterator.remove(); + removed = true; + break; } } } + //过滤掉非管理和房主的固定成员 + if (!removed && onlyManager && chatRoomMember.getMemberType() != MemberType.ADMIN && + chatRoomMember.getMemberType() != MemberType.CREATOR) { + iterator.remove(); + } } return chatRoomMemberList; }) From 3d80ccd003e9003c23a84bf95793e3e39d26b868 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 21 Jan 2021 15:32:40 +0800 Subject: [PATCH 10/49] =?UTF-8?q?=E5=A1=94=E7=BD=97=E7=89=8C=E5=85=AC?= =?UTF-8?q?=E5=B1=8F=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/widget/MessageView.java | 23 ++++++++++++ .../ui/webview/CommonWebViewActivity.java | 18 +++------ .../yizhuan/erban/ui/webview/JSInterface.java | 11 +++--- .../ui/webview/event/CloseWebViewEvent.java | 8 ---- .../XChatConstants.java | 2 +- .../manager/IMNetEaseManager.java | 3 +- .../im/custom/bean/CustomAttachParser.java | 4 ++ .../im/custom/bean/CustomAttachment.java | 5 ++- .../im/custom/bean/TarotAttachment.java | 37 +++++++++++++++++++ .../im/custom/bean/TarotMsgBean.java | 31 ++++++++++++++++ gradle.properties | 4 +- 11 files changed, 114 insertions(+), 32 deletions(-) delete mode 100644 app/src/main/java/com/yizhuan/erban/ui/webview/event/CloseWebViewEvent.java create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotAttachment.java create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotMsgBean.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java index b93f4a0f4..d8404fc46 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java @@ -98,6 +98,8 @@ import com.yizhuan.xchat_android_core.im.custom.bean.RoomFollowOwnerAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomFollowOwnerAttachment2; import com.yizhuan.xchat_android_core.im.custom.bean.RoomNoticeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomTipAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.TarotAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.TarotMsgBean; import com.yizhuan.xchat_android_core.im.custom.bean.WelcomeAttachment; import com.yizhuan.xchat_android_core.im.game.ImGameInfo; import com.yizhuan.xchat_android_core.im.game.ImGameMode; @@ -793,6 +795,9 @@ public class MessageView extends FrameLayout { if (second == CustomAttachment.CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_MSG) { setRedPackageMsg(chatRoomMessage, tvContent); } + } else if (first == CustomAttachment.CUSTOM_MESS_TAROT) { + clearBackground(tvContent); + setTarotMsg(chatRoomMessage, tvContent); } else { tvContent.setTextColor(Color.WHITE); tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); @@ -805,6 +810,20 @@ public class MessageView extends FrameLayout { } } + private void setTarotMsg(ChatRoomMessage chatRoomMessage, TextView tvContent) { + TarotAttachment attachment = (TarotAttachment) chatRoomMessage.getAttachment(); + if (attachment.getSecond() == CustomAttachment.CUSTOM_MESS_TAROT_SUCCESS) { + TarotMsgBean tarotMsgBean = attachment.getTarotMsgBean(); + String nickName = RegexUtil.getPrintableString(tarotMsgBean.getNick()); + SpannableBuilder text = new SpannableBuilder(tvContent) + .append("恭喜 ", new ForegroundColorSpan(textColor)) + .append(nickName, new ForegroundColorSpan(roomTipNickColor)) + .append(" 在塔罗占卜中运气爆发,收获", new ForegroundColorSpan(textColor)) + .append(tarotMsgBean.getDrawGoldNum() + "金币", new ForegroundColorSpan(roomTipColor)); + tvContent.setText(text.build()); + } + } + /** * 提示已经加入的话题的通知 * @@ -2595,6 +2614,10 @@ public class MessageView extends FrameLayout { EventBus.getDefault().post(new FollowRoomEvent()); PraiseModel.get().setFollowRoomSuccessRoomTip(JavaUtil.str2long(chatRoomMessage.getFromAccount())); }); + } else if (attachment.getFirst() == CustomAttachment.CUSTOM_MESS_TAROT) { + if (attachment instanceof TarotAttachment) { + account = ((TarotAttachment) attachment).getTarotMsgBean().getUid() + ""; + } } } if (TextUtils.isEmpty(account)) return; diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java index fb6aab901..fdf2ddef8 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java @@ -37,7 +37,6 @@ import com.yizhuan.erban.R; import com.yizhuan.erban.application.XChatApplication; import com.yizhuan.erban.base.BaseActivity; import com.yizhuan.erban.ui.im.RouterHandler; -import com.yizhuan.erban.ui.webview.event.CloseWebViewEvent; import com.yizhuan.erban.ui.webview.event.ShowNavEvent; import com.yizhuan.erban.ui.webview.event.TaroPayResultEvent; import com.yizhuan.erban.ui.widget.ShareDialog; @@ -158,7 +157,7 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O initView(); initData(); setListener(); - ShowWebView(url); + showWebView(url); RxBus.get().toFlowable(ShareH5Event.class) .compose(bindUntilEvent(ActivityEvent.DESTROY)) .subscribeOn(Schedulers.newThread()) @@ -390,7 +389,7 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O } } - public void ShowWebView(String url) { + public void showWebView(String url) { Logger.d("ShowWebView--------" + url); if (!TextUtils.isEmpty(url)) { Map map = new HashMap<>(); @@ -442,7 +441,7 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O @Subscribe(threadMode = ThreadMode.MAIN) public void onRecieveNeedRefreshWebView(WebViewRefreshEvent event) { if (!StringUtil.isEmpty(url)) { - ShowWebView(url); + showWebView(url); } } @@ -451,13 +450,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O webView.evaluateJavascript("renderByStatus(" + event.getStatus() + ")", null); } - @Subscribe(threadMode = ThreadMode.MAIN) - public void closeWebViewEvent(CloseWebViewEvent event) { - if (event != null) { - finish(); - } - } - @Subscribe(threadMode = ThreadMode.MAIN) public void showNavEvent(ShowNavEvent event) { if (event != null) { @@ -507,6 +499,8 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O @Subscribe(threadMode = ThreadMode.MAIN) public void onTaroPayResultEvent(TaroPayResultEvent event) { - finish(); + if (webView != null) { + webView.evaluateJavascript("taroPayResultCallback(" + event.getResult() + ")", null); + } } } 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 2cbac5cf9..2909f069e 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 @@ -26,8 +26,6 @@ import com.yizhuan.erban.public_chat_hall.activity.PublicChatHallHomeActivity; import com.yizhuan.erban.ui.im.RouterHandler; import com.yizhuan.erban.ui.im.avtivity.NimP2PMessageActivity; import com.yizhuan.erban.ui.pay.ChargeActivity; -import com.yizhuan.erban.ui.webview.event.CloseDialogWebViewEvent; -import com.yizhuan.erban.ui.webview.event.CloseWebViewEvent; import com.yizhuan.erban.ui.webview.event.H5NotifyClientEvent; import com.yizhuan.erban.ui.webview.event.ShowNavEvent; import com.yizhuan.erban.ui.webview.event.TaroPayResultEvent; @@ -114,7 +112,7 @@ public class JSInterface { @JavascriptInterface public void openChargePage() { if (context != null) { - ChargeActivity.start(context,true); + ChargeActivity.start(context, true); } } @@ -272,7 +270,7 @@ public class JSInterface { */ @JavascriptInterface public void closeWebView() { - EventBus.getDefault().post(new CloseWebViewEvent()); + if (mActivity != null) mActivity.finish(); } /** @@ -454,7 +452,7 @@ public class JSInterface { } else if (audit == RPSDK.AUDIT.AUDIT_FAIL) { // 认证不通过 result = 1; - } else if (audit == RPSDK.AUDIT.AUDIT_NOT) { + } else if (audit == RPSDK.AUDIT.AUDIT_NOT) { // 未认证,用户取消 result = -1; } else if (audit == RPSDK.AUDIT.AUDIT_EXCEPTION) { @@ -502,7 +500,7 @@ public class JSInterface { @JavascriptInterface public void closeDialogWebView() { - if (mActivity!=null) mActivity.finish(); + if (mActivity instanceof DialogWebViewActivity) mActivity.finish(); } /** @@ -516,6 +514,7 @@ public class JSInterface { @JavascriptInterface public void checkResultFinish(int result) { EventBus.getDefault().post(new TaroPayResultEvent().setResult(result)); + if (mActivity instanceof DialogWebViewActivity) mActivity.finish(); } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/event/CloseWebViewEvent.java b/app/src/main/java/com/yizhuan/erban/ui/webview/event/CloseWebViewEvent.java deleted file mode 100644 index b65432089..000000000 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/event/CloseWebViewEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.yizhuan.erban.ui.webview.event; - -import lombok.Data; - -@Data -public class CloseWebViewEvent { - -} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java index d4c2394b8..43d4d0e02 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_constants/XChatConstants.java @@ -292,7 +292,7 @@ public class XChatConstants { /** * Referer (DEBUG) */ - public static final String KEY_REFERER_DEBUG = "http://120.79.211.243/"; + public static final String KEY_REFERER_DEBUG = "http://api.uat.zhongjialx.com/"; /** * Referer (RELEASE) diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 22eb6d37a..e34982e99 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -726,7 +726,8 @@ public final class IMNetEaseManager { || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FOLLOW_ROOM || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT - || customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_KICK_MIC + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_KICK_MIC + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MESS_TAROT || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_MINI_WORLD) { addMessages(msg); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java index d507fe4ed..f19edcaf0 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java @@ -534,6 +534,10 @@ public class CustomAttachParser implements MsgAttachmentParser { } break; + case CustomAttachment.CUSTOM_MESS_TAROT: + attachment = new TarotAttachment(CustomAttachment.CUSTOM_MESS_TAROT, CustomAttachment.CUSTOM_MESS_TAROT_SUCCESS); + break; + default: break; } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java index 888f8e403..bf38a4dc4 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java @@ -366,8 +366,9 @@ public class CustomAttachment implements MsgAttachment { //推送消息 public static final int CUSTOM_MSG_PUSH_NOTIFIFICATION = 70; public static final int CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_ROOM = 701;// 推送进入房间 -// public static final int CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_CHAT_ROOM = 702;// 推送进入聊天页 -// public static final int CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_DYNAMIC_MSG = 703;// 推送进入动态消息 + + public static final int CUSTOM_MESS_TAROT = 71; //塔罗牌充值消息 + public static final int CUSTOM_MESS_TAROT_SUCCESS = 711; //塔罗牌充值中奖消息 public CustomAttachment() { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotAttachment.java new file mode 100644 index 000000000..8a55a431d --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotAttachment.java @@ -0,0 +1,37 @@ +package com.yizhuan.xchat_android_core.im.custom.bean; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; + +public class TarotAttachment extends CustomAttachment { + private TarotMsgBean tarotMsgBean; + + public TarotAttachment(int first, int second) { + super(first, second); + } + + public TarotMsgBean getTarotMsgBean() { + return tarotMsgBean; + } + + public void setTarotMsgBean(TarotMsgBean tarotMsgBean) { + this.tarotMsgBean = tarotMsgBean; + } + + @Override + protected void parseData(JSONObject data) { + tarotMsgBean = new Gson().fromJson(data.toJSONString(), TarotMsgBean.class); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("chargeProdId", tarotMsgBean.getChargeProdId()); + jsonObject.put("chargeProdName", tarotMsgBean.getChargeProdName()); + jsonObject.put("drawGoldNum", tarotMsgBean.getDrawGoldNum()); + jsonObject.put("nick", tarotMsgBean.getNick()); + jsonObject.put("roomUid", tarotMsgBean.getRoomUid()); + jsonObject.put("uid", tarotMsgBean.getUid()); + return jsonObject; + } +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotMsgBean.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotMsgBean.java new file mode 100644 index 000000000..c5e1c6871 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/TarotMsgBean.java @@ -0,0 +1,31 @@ +package com.yizhuan.xchat_android_core.im.custom.bean; + +import lombok.Data; + +@Data +public class TarotMsgBean { + /** + * 中奖用户uid + **/ + private long uid; + /** + * 中奖用户昵称 + **/ + private String nick; + /** + * 中奖的房间uid + **/ + private long roomUid; + /** + * 中奖的产品ID + **/ + private String chargeProdId; + /** + * 中奖的产品名称 + **/ + private String chargeProdName; + /** + * 中奖的金币数量 + **/ + private long drawGoldNum; +} diff --git a/gradle.properties b/gradle.properties index 09a17100a..a0754c18e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,5 +20,5 @@ with_jenkins=false #\u6253\u652F\u6301x86\u7684\u6A21\u62DF\u5668\u5305\u4F7F\u7528 ndk_abi_filters=arm -version_name=2.1.1 -version_code=211 \ No newline at end of file +version_name=5.1.1 +version_code=511 \ No newline at end of file From 8b0f55fcde1cbd873efa7b22c57ebe3af5735619 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 21 Jan 2021 17:55:27 +0800 Subject: [PATCH 11/49] =?UTF-8?q?=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=9D=91=E4=BD=8D=E6=8A=A5=E9=94=99=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/DatingMicroViewAdapter.kt | 18 +- .../res/layout/include_mic_charm_layout.xml | 6 +- app/src/main/res/layout/item_micro_dating.xml | 58 +---- .../res/layout/item_micro_dating_boss.xml | 237 ++++++++++++------ app/src/main/res/layout/layout_micro_view.xml | 2 +- .../res/layout/fragment_av_room_game.xml | 34 ++- .../manager/AvRoomDataManager.java | 8 +- .../room/bean/RoomInfo.java | 9 +- .../room/bean/RoomModeType.java | 12 + .../room/queuing_mic/bean/RoomModeType.java | 12 - 10 files changed, 228 insertions(+), 168 deletions(-) create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomModeType.java delete mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/RoomModeType.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt b/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt index 8f2ace015..696929027 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt @@ -34,6 +34,15 @@ class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) */ override fun bindToRecyclerView(recyclerView: RecyclerView) { val layoutManager = GridLayoutManager(context, 4) + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (position == 0) { + 4 + } else { + 1 + } + } + } layoutManager.orientation = LinearLayoutManager.VERTICAL recyclerView.layoutManager = layoutManager recyclerView.adapter = this @@ -55,12 +64,12 @@ class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) override fun microType() = MICRO_TYPE_DATING - private inner class DatingMicroViewHolder constructor(itemView: View) :GiftValueViewHolder(itemView) { + private inner class DatingMicroViewHolder constructor(itemView: View) : GiftValueViewHolder(itemView) { private val viewGenderBg: View = itemView.findViewById(R.id.view_gender_bg) private val tvSelectedStatus: TextView = itemView.findViewById(R.id.tv_selected_status) private val ivCap: ImageView = itemView.findViewById(R.id.iv_cap) - private val ivValue: ImageView = itemView.findViewById(R.id.iv_value_icon) + //private val ivValue: ImageView = itemView.findViewById(R.id.iv_value_icon) @SuppressLint("SetTextI18n") public override fun bind(info: RoomQueueInfo, position: Int) { @@ -72,7 +81,7 @@ class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) if (roomMicInfo != null) { viewGenderBg.setBackgroundResource(if (manMicro) R.drawable.shape_circle_micro_man_bg else R.drawable.shape_circle_micro_woman_bg) tvSelectedStatus.setBackgroundResource(if (manMicro) R.drawable.selector_dating_select_man_bg else R.drawable.selector_dating_select_woman_bg) - ivValue.setImageResource(if (manMicro) R.drawable.icon_gift_value_man else R.drawable.icon_gift_value) + //ivValue.setImageResource(if (manMicro) R.drawable.icon_gift_value_man else R.drawable.icon_gift_value) } info.mChatRoomMember?.let { @@ -109,9 +118,10 @@ class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) } - inner class DatingBossMicroViewHolder internal constructor(itemView: View) :BossMicroViewHolder(itemView) { + inner class DatingBossMicroViewHolder internal constructor(itemView: View) : BossMicroViewHolder(itemView) { private val radioGroup: RadioGroup = itemView.findViewById(R.id.radio_group) + public override fun bind(info: RoomQueueInfo, position: Int) { super.bind(info, position) val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo ?: return diff --git a/app/src/main/res/layout/include_mic_charm_layout.xml b/app/src/main/res/layout/include_mic_charm_layout.xml index 07ff1ce41..8c19d51b0 100644 --- a/app/src/main/res/layout/include_mic_charm_layout.xml +++ b/app/src/main/res/layout/include_mic_charm_layout.xml @@ -2,6 +2,7 @@ @@ -42,6 +43,7 @@ android:orientation="horizontal"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_micro_dating.xml b/app/src/main/res/layout/item_micro_dating.xml index 249aa2f3b..fd6a1a4be 100644 --- a/app/src/main/res/layout/item_micro_dating.xml +++ b/app/src/main/res/layout/item_micro_dating.xml @@ -1,5 +1,4 @@ - - @@ -110,7 +112,7 @@ app:layout_constraintTop_toBottomOf="@id/micro_layout"> - - - - - - - + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_micro_dating_boss.xml b/app/src/main/res/layout/item_micro_dating_boss.xml index 6b0786601..da9ac0aed 100644 --- a/app/src/main/res/layout/item_micro_dating_boss.xml +++ b/app/src/main/res/layout/item_micro_dating_boss.xml @@ -21,7 +21,7 @@ android:layout_height="match_parent" android:layout_gravity="center" /> - @@ -96,7 +99,7 @@ - + app:layout_constraintTop_toBottomOf="@id/micro_layout"> - + + + + + + + + - + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/rl_nick"> + + + + + + + + app:layout_constraintTop_toBottomOf="@id/desc_layout"> - + - + + + + + android:layout_height="wrap_content"> - + - + + + + + + + + - - - + Date: Thu, 21 Jan 2021 18:49:10 +0800 Subject: [PATCH 12/49] =?UTF-8?q?=E5=A1=94=E7=BD=97=E7=89=8C=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=BC=B9=E7=AA=97=E4=BD=BF=E7=94=A8=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 + .../yizhuan/erban/ui/webview/JSInterface.java | 6 +- .../ui/webview/TarotPayWebViewActivity.java | 38 ++++++++ .../layout/activity_tarot_pay_web_view.xml | 93 +++++++++++++++++++ 4 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/ui/webview/TarotPayWebViewActivity.java create mode 100644 app/src/main/res/layout/activity_tarot_pay_web_view.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5abe76162..e160e16f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1255,6 +1255,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 881cd1d6c4b329b1e47ecc16617d61e407213fbb Mon Sep 17 00:00:00 2001 From: huangjian Date: Fri, 22 Jan 2021 16:17:08 +0800 Subject: [PATCH 13/49] =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=20=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=85=AC=E5=B1=8F=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/dialog/RoomOperationDialog.java | 30 +++++ .../fragment/HomePartyRoomFragment.java | 11 +- .../avroom/presenter/HomePartyPresenter.java | 22 ++++ .../erban/avroom/widget/MessageView.java | 107 ++++++++++++++++-- .../drawable-xhdpi/ic_room_opt_in_dating.png | Bin 0 -> 3890 bytes .../res/drawable-xhdpi/ic_room_opt_in_pk.png | Bin 0 -> 4414 bytes .../res/drawable-xhdpi/ic_room_opt_in_pk.webp | Bin 1560 -> 0 bytes .../drawable-xhdpi/ic_room_opt_op_dating.png | Bin 0 -> 2086 bytes .../res/drawable-xhdpi/ic_room_opt_op_pk.png | Bin 0 -> 1756 bytes .../res/drawable-xhdpi/ic_room_opt_op_pk.webp | Bin 1150 -> 0 bytes .../manager/IMNetEaseManager.java | 2 + .../im/custom/bean/CustomAttachParser.java | 10 +- .../im/custom/bean/CustomAttachment.java | 10 +- .../room/bean/RoomInfo.java | 44 +------ .../room/model/HomePartyModel.java | 37 +++++- .../room/model/inteface/IHomePartyModel.java | 4 + 16 files changed, 212 insertions(+), 65 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_in_dating.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_in_pk.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_in_pk.webp create mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_op_dating.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_op_pk.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_op_pk.webp diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java index c3643065c..b04bb2890 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java @@ -88,6 +88,7 @@ public class RoomOperationDialog extends BottomSheetDialog { rvOPtList.setLayoutManager(new FullyGridLayoutManager(getContext(), 4)); optAdapter = new OptAdapter(context, null); addPKAction(optAdapter); + addDatingAction(optAdapter); addKTVAction(optAdapter); //addGameAction(optAdapter); addRoomLimit(optAdapter); @@ -158,6 +159,33 @@ public class RoomOperationDialog extends BottomSheetDialog { } + /** + * 相亲 模式 + * + * @param optAdapter + */ + private void addDatingAction(OptAdapter optAdapter) { + if (SuperAdminUtil.isSuperAdmin()) { + return; + } + if (AvRoomDataManager.get().isManager() && !AvRoomDataManager.get().isCpRoom()) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return; + } + String str = AvRoomDataManager.get().isDatingMode() ? "相亲中..." :"相亲模式"; + int icon = AvRoomDataManager.get().isOpenPKMode() ? + R.drawable.ic_room_opt_op_dating : + R.drawable.ic_room_opt_in_dating; + optAdapter.addData(new OptAction(icon, str, () -> { + if (onActionListener != null) { + onActionListener.onDatingAction(); + } + })); + } + + } + /** * 添加KTV 操作 * @@ -455,6 +483,8 @@ public class RoomOperationDialog extends BottomSheetDialog { void onPKAction(); + void onDatingAction(); + void onGameAction(); void onRoomHall(); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 9cec658f9..27efdc37d 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -1122,6 +1122,8 @@ public class HomePartyRoomFragment extends BaseMvpFragment { }); } + public void datingOpen(){ + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + if (AvRoomDataManager.get().isOpenPKMode()){ + SingleToastUtil.showToast("PK中不可以开启相亲模式!"); + return; + } + if (!AvRoomDataManager.get().isDatingMode()){ + mHomePartyMode.datingOpen(roomInfo.getUid()) + .compose(bindToLifecycle()) + .doOnError(e -> SingleToastUtil.showToast(e.getMessage())) + .subscribe(); + } + else { + mHomePartyMode.datingClose(roomInfo.getUid()) + .compose(bindToLifecycle()) + .doOnError(e -> SingleToastUtil.showToast(e.getMessage())) + .subscribe(); + } + + } + public void datingNext() { final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; if (roomInfo == null) return; diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java index b93f4a0f4..8c7d34db1 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java @@ -75,6 +75,7 @@ import com.yizhuan.xchat_android_core.home.model.CollectionRoomModel; import com.yizhuan.xchat_android_core.im.custom.bean.AuctionAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.CarveUpGoldAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.DatingAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.FaceAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.GameAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.GameRespondAttachment; @@ -119,6 +120,7 @@ import com.yizhuan.xchat_android_core.noble.NobleResourceType; import com.yizhuan.xchat_android_core.noble.NobleUtil; import com.yizhuan.xchat_android_core.praise.PraiseModel; import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeRoomMsg; +import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomMessageViewNoticeInfo; import com.yizhuan.xchat_android_core.room.bean.WelcomeInfo; @@ -508,16 +510,10 @@ public class MessageView extends FrameLayout { // 房间通告 if ("礼物特效".equals(chatRoomMessage.getContent())) { setUpdateGiftEffectMsg(tvContent); - } -// else if (chatRoomMessage.getContent().contains(IMNetEaseManager.ROOM_INTRO_TAG)) { -// tvContent.setTextColor(ContextCompat.getColor(mContext, R.color.color_FFE96E)); -// tvContent.setText(chatRoomMessage.getContent()); -// } - else if (XChatConstants.ROOM_INTRODUCTION.equals(chatRoomMessage.getContent()) || chatRoomMessage.getContent().contains(IMNetEaseManager.ROOM_INTRO_TAG)) { + } else if (XChatConstants.ROOM_INTRODUCTION.equals(chatRoomMessage.getContent()) || chatRoomMessage.getContent().contains(IMNetEaseManager.ROOM_INTRO_TAG)) { tvContent.setTextColor(ContextCompat.getColor(mContext, R.color.white)); tvContent.setText(chatRoomMessage.getContent()); } else { -// tvContent.setTextColor(Color.WHITE); tvContent.setTextColor(ContextCompat.getColor(mContext, R.color.appColor)); tvContent.setText(chatRoomMessage.getContent()); } @@ -793,6 +789,9 @@ public class MessageView extends FrameLayout { if (second == CustomAttachment.CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_MSG) { setRedPackageMsg(chatRoomMessage, tvContent); } + } else if (first == CustomAttachment.CUSTOM_MSG_DATING) { + clearBackground(tvContent); + setDatingMsg(chatRoomMessage, tvContent, second); } else { tvContent.setTextColor(Color.WHITE); tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); @@ -800,11 +799,105 @@ public class MessageView extends FrameLayout { } } catch (UnsupportedOperationException e) { + e.printStackTrace(); tvContent.setTextColor(Color.WHITE); tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); } } + + private void setDatingMsg(ChatRoomMessage chatRoomMessage, TextView tvContent, int second) { + if (chatRoomMessage.getAttachment() instanceof DatingAttachment) { + DatingAttachment datingAttachment = (DatingAttachment) chatRoomMessage.getAttachment(); + DatingNotifyInfo notifyInfo = datingAttachment.getDatingNotifyInfo(); + SpannableBuilder text = new SpannableBuilder(tvContent); + switch (second) { + case CustomAttachment.CUSTOM_MSG_SUB_DATING_SELECT: + text.append("本轮您选择了 ", new ForegroundColorSpan(roomTipColor)) + .append((notifyInfo.getTargetPosition() + 1) + "号" + (notifyInfo.getTargetGender() == 1 ? "男" : "女") + "嘉宾 ", new ForegroundColorSpan(textColor)) + .append(notifyInfo.getTargetNickname(),new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + + @Override + public void onClick(@NonNull View widget) { + if (clickConsumer != null) { + Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + } + } + } ) + .append(" 作为你的心动对象", new ForegroundColorSpan(textColor)); + break; + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE: + if (notifyInfo.getHasSelectUser()) { + text.append(notifyInfo.getNickname(),new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + + @Override + public void onClick(@NonNull View widget) { + if (clickConsumer != null) { + Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + } + } + }) + .append(" 的心动对象是 ", new ForegroundColorSpan(textColor)) + .append(notifyInfo.getTargetNickname(), new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + + @Override + public void onClick(@NonNull View widget) { + if (clickConsumer != null) { + Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + } + } + }); + } else { + text.append(notifyInfo.getNickname(),new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + + @Override + public void onClick(@NonNull View widget) { + if (clickConsumer != null) { + Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + } + } + }) + .append(" 未选择心动对象", new ForegroundColorSpan(roomTipColor)); + } + break; + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_HEART: + text.append("恭喜 ", new ForegroundColorSpan(textColor)) + .append(notifyInfo.getNickname(), new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + + @Override + public void onClick(@NonNull View widget) { + if (clickConsumer != null) { + Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + } + } + }) + .append(" 和 ", new ForegroundColorSpan(textColor)) + .append(notifyInfo.getTargetNickname(), new ForegroundColorSpan(roomTipNickColor), + new OriginalDrawStatusClickSpan() { + + @Override + public void onClick(@NonNull View widget) { + if (clickConsumer != null) { + Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + } + } + }) + .append(" 牵手成功,让我们见证他们幸福的开端", new ForegroundColorSpan(0xFFF84C95)); + break; + } + tvContent.setText(text.build()); + } else { + tvContent.setTextColor(Color.WHITE); + tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip)); + } + + } + /** * 提示已经加入的话题的通知 * diff --git a/app/src/main/res/drawable-xhdpi/ic_room_opt_in_dating.png b/app/src/main/res/drawable-xhdpi/ic_room_opt_in_dating.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf4b1e2eb45e062953c90bd409f9433ea1c1ccb GIT binary patch literal 3890 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 As{jB1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_room_opt_in_pk.png b/app/src/main/res/drawable-xhdpi/ic_room_opt_in_pk.png new file mode 100644 index 0000000000000000000000000000000000000000..9b00b9ea0233761123712802bdee2be175b7096c GIT binary patch literal 4414 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 Ef-%d7#sB~S literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_room_opt_in_pk.webp b/app/src/main/res/drawable-xhdpi/ic_room_opt_in_pk.webp deleted file mode 100644 index b53ade97c3e7bc65e4631479fa95340889661aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1560 zcmV+z2Iu)wNk&Ex1^@t8MM6+kP&il$0000G0000-002h-06|PpNb~^!00FPUD3T;8 zWbeHT{PC|94-t`9L1;fYC&%kXXMPnT^&)gH>BC>RN_Z-jE$XX`;e0R7MfrZ(Vmoi5xznsj# zukrn_fFX6>cgNw))K!j7a#vIEV(g+sXT^&#xLZrni_{t%O+E$mBzT&Hi-kBnN-Q9} zjS9W0ZXm3^Ha%m!?m3XN1oZD%r0Gx5pc@km3D zLz|U=hJuwLP4u6p{-c9&PGjc-%~X-bN>lxDNpn|y%|xE&@)Nz-r-1!ld{e*=fVqGI zf;r%X5>9~+O87vuK?#l6GDR#OQ^fH-MLfJw#A}=){<9R3ty4seGFntopon^!BC>xJ z@h@}#zv(=WI`0Ra_f<^h{VDT4*ZICEeedu?0Y5VNz(KbW%1>}jb2sQSRid%dRDam# zlNSSxP=1S5+kAT!L+IrHm`u`4a&mZJ(XKvP#3(ZL8nA6sKkgs|oq85J^);|jrB~HW zgtwTWM~Owakog}1VBOdMnRU1uyC~CH`C<%SOyA__BzHRvZ^jRPLvOD0xjPQO=FdKw zqsKHq&SqdCwtRT^9M3k$MmGL@ceosb3sz7#Aoc?Q05B5(odGIH07w8nkvf-1C8HuC zFtUA6uo4Mu0L&CZ{U61COLIigPZVPc^8wIP&a0@;&;z9F`=g0=g!>tk4*)c!etoX* z^IuRdji0!_z#p;1g0FNFdo4%fkJw+F6+Y?;U3wfZIKE|0BG4c8#Ek&5sPv6VxJ>5@ zM_)7su-c2y)o9>Kdaj=TGt6shZTss}0~=V8OKp$RCqjJ_EDadr zQa0t}gJ@|xX?&2hMP`opM(e@NWQpH;VzW$ZzFg8SJ%_<12#S7{yqfT@LY}Z zxWs*q_rg5W58K!86&|8%FlV!hAmhdD2#z0{>I<}#`?jKlmarvrKAfR0wb3D&h2g=s z2B!q8s}D#$uG#+N@H)5#c)f<%_Mo&NQg^;@=7*&w?tgNw3e(mIs0Ej%rO*|P1+36n z2V&h(j0`{1?NL3Hgni`iXAGOLsMi#&lHd1{6@Y-C&=(HML33)kLB`t+cY7|y8nl#WZ1MRE2NR;hL^2c)mfkOX<3|L4spR=UL5#&oEvd{lV8!DoHepm zYQH3am+Ql2wU6dHlO|BMhJK@Y4M%xKS=%R+O!LS!#R}Ke8iVnPI{@Oe>9d}?m-d25 zTN_=k=yPyVTG-Q+RbPN#-_&ku4GQ)Bqig18q!RzL>Lq8@hxQ0qhcEp_`9`I%kr+bU zJ&b@bew*;x^~~<>0%{{2-)|EP)& zYiv|S6#mX`sg$ZUDL&xdQg+!y5`uvE2tlc}^aoXAAxb0ggJ=yR_$Z=LL-nWlLc%6cGinfNgijoVz>g?e=c(z1uClg!#4EIcLuK z=A1d_%-k754>iBvpVQhJ8AC+(L?SedNcaFK0B!+rV@&Kn0L}wAB?JXM9#JoZ_$4#b zvnLn~Ug!zcD4l~UNBN>6z@M(b0an$)4*|3oz=PdY#3ui4Kr9G_j{jhjK0OxB z&(9wa4trJrn3}5KZt{KV^+sN8YHB*|bR5SPRutcpMED3mj#FW2roSKrp4GI*4Nk_j z4S3kFVVM^$Tv`QSwi5wYfwrn|U+>(8hK7Ib$g%~vfB!pg>f5(Uk?$@P&a^o%gm<{6HH3_8CV>5$05Q?o z*lwk!&7n|mQc}Q*l3z&V+2L08Q_)KZ8n0==?UJ{Hg%!oOn+Ol2GO$~DgusuQ))?R1 z!~w^)c-`K9xe+)K3QnGE+{L=Z0jsL-D*%tWQQ>Ua^}pj-*pQs%HWrYsM3k1<>k|{Zryq(EGf~B8Z|=aJ8%b2xjp^F}Bb3}VI%TU+#SW+vs5s^(7sJhir`9e^3&C!Uyy%1S;T zNZyPSB&pbnUw+A3?bKUk<$HMd-PJY*h?G!Xp6^W|u+)lLQ3j%-;zgZo#E82vbm&lh z*0*ho=5z+LaNz>|cSXf3*tqe35L>s_>hxxSnciq&rsH<`@?|tNHFZ$SXz>##PU6y~ z7MwZrJEl#WZl%87PlN@eD84U8R)zvlny5=TlU()60 z=j(yT%);zBW5)2AeYBO9K8}Kdar$p|RURv`kF7s%-u(Fg$BqT)P&f5X2vpNE73>rqk9AK)d)}$p$Cjye|-z;h~ZA(iFX3cuZZb8%P$feD!D;4B` zBvXoAmuB8%ljy|jk`**2WBh45Xvt!O2VskH>R^!EWR8`9lPQ}lO0QY-KC-j3P1&q0 z%uLIdudwUVO}5jLv@Tn3&z?OUN=sgcg@pz29O=Zui6}Y!aeAw(`&O@>j77_9uf2h( zQ=f{(3ukqCOwK;rg$E1fs%F)yN?mATEp1FoPJ)&ZFjrh9CDGbkx~UQH+O;3W10%2L zcivgyXhWeF9(j4b`9ffc)tccHB6m7gwX{>fJT|+vv67SZaiWE*s#bSMW3{!lb~g{v z(y}Ku4?B16LUVI-d=AHtFN&{uxx12`?838W&(iy4w`-_Ogwrc^1T^%D4Dn4~87{_#de=dz$IiM1S z4_`MQ#A9oDG7+lnx{Vv@Y+reh$}7s?4~S@{8^KuVB!u`-(~g^7$g#M#bm=<)4_OIt zS^ut_oPNcQuPsGgTgfHL2lDA+uA(i z`5SOodRhWz=0G5D^OY-+Er2L=Dd^omTWMM@mr8(vK;VWeSHgVoY8tg18ZM^a%j11ZYa{SXO-Q^@>-n$`b%1Kz`&Q1TDE*ce{x2 zQzR03OVgU1eJ3?2Z7XP5Sy5F77XT!m@p!E09rj0J&v;h!`ZJzH#Rm-V56Z|8lZ61^ zZ{%;z-FT>leMI1gS~aeFsAXm`<5N5?T!a8W#p|EsDc&DMXasP$r=Q~e2d6RSGl?YO Q&;S4c07*qoM6N<$f?KirL;wH) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_room_opt_op_pk.png b/app/src/main/res/drawable-xhdpi/ic_room_opt_op_pk.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ee07ee777eb688d3a470f761ecb765c939acf7 GIT binary patch literal 1756 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 diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 40e7d1691..934ad93ca 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -727,6 +727,8 @@ public final class IMNetEaseManager { noticeQueueMemberInfoUpdate(); } } + } else if (msg.getMsgType() == MsgTypeEnum.tip) { + addMessages(msg); } else if (msg.getMsgType() == MsgTypeEnum.custom) { MsgAttachment attachment = msg.getAttachment(); if (attachment == null) return; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java index 87895f86d..c0852d404 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java @@ -508,15 +508,10 @@ public class CustomAttachParser implements MsgAttachmentParser { break; case CustomAttachment.CUSTOM_MSG_PUSH_NOTIFIFICATION: - switch (second){ - case CustomAttachment.CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_ROOM: - attachment = new RoomInviteFansAttachment(second); - break; - default: - break; + if (second == CustomAttachment.CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_ROOM) { + attachment = new RoomInviteFansAttachment(second); } break; - case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT: switch (second){ case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT_ROOM_NOTIFY: @@ -544,6 +539,7 @@ public class CustomAttachParser implements MsgAttachmentParser { attachment = new DatingPublishAttachment(first, second); break; } + break; default: break; } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java index 0b3db94c6..33baeb774 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java @@ -371,11 +371,11 @@ public class CustomAttachment implements MsgAttachment { //相亲模式 - public static final int CUSTOM_MSG_DATING = 71; - public static final int CUSTOM_MSG_SUB_DATING_SELECT = 711; - public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT = 712; - public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE = 713; - public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_HEART = 714; + public static final int CUSTOM_MSG_DATING = 72; + public static final int CUSTOM_MSG_SUB_DATING_SELECT = 721; + public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT = 722; + public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE = 723; + public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_HEART = 724; public CustomAttachment() { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java index b71b0e9a9..c5d3bc835 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java @@ -10,6 +10,7 @@ import java.io.Serializable; import java.util.List; import lombok.Data; +import lombok.ToString; /** @@ -17,6 +18,7 @@ import lombok.Data; * @date 2017/5/24 */ @Data +@ToString public class RoomInfo implements Parcelable,Serializable { public static final int ROOMTYPE_AUCTION = 1;//竞拍房间 public static final int ROOMTYPE_LIGHT_CHAT = 2;//轻聊房 @@ -183,47 +185,6 @@ public class RoomInfo implements Parcelable,Serializable { // private String badge; - @Override - public String toString() { - return "RoomInfo{" + - "uid=" + uid + - ", officeUser=" + officeUser + - ", roomId=" + roomId + - ", title='" + title + '\'' + - ", avatar='" + avatar + '\'' + - ", type=" + type + - ", roomDesc='" + roomDesc + '\'' + - ", backPic='" + backPic + '\'' + - ", valid=" + valid + - ", operatorStatus=" + operatorStatus + - ", hasAnimationEffect=" + hasAnimationEffect + - ", audioQuality=" + audioQuality + - ", isCloseScreen=" + isCloseScreen + - ", hasDragonGame=" + hasDragonGame + - ", meetingName='" + meetingName + '\'' + - ", roomPwd='" + roomPwd + '\'' + - ", roomTag='" + roomTag + '\'' + - ", tagId=" + tagId + - ", tagPict='" + tagPict + '\'' + - ", onlineNum=" + onlineNum + - ", isRecom=" + isRecom + - ", isRoomFans=" + isRoomFans + - ", background=" + background + - ", hasKTVPriv=" + hasKTVPriv + - ", isOpenKTV=" + isOpenKTV + - ", isOpenGame=" + isOpenGame + - ", roomGame=" + roomGame + - ", boxSwitchVo=" + boxSwitchVo + - ", serverRedEnvelopeSwitch=" + serverRedEnvelopeSwitch + - ", singingMusicName='" + singingMusicName + '\'' + - ", limitType='" + limitType + '\'' + - ", roomModeType=" + roomModeType + - ", isPermitRoom=" + isPermitRoom + - ", showGiftValue=" + showGiftValue + - - '}'; - } - public RoomInfo() { } @@ -567,5 +528,4 @@ public class RoomInfo implements Parcelable,Serializable { } - } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java index 8c3c1150d..4bb5cb7b8 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/HomePartyModel.java @@ -28,12 +28,10 @@ import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import java.util.List; -import io.reactivex.Observable; import io.reactivex.Single; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; -import retrofit2.http.Path; /** *

轰趴房model层:数据获取

@@ -203,6 +201,21 @@ public class HomePartyModel extends RoomBaseModel implements IHomePartyModel { } + @Override + public Single datingOpen(long roomUid) { + return mHomePartyService.datingOpen(roomUid) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleStringData()); + } + + @Override + public Single datingClose(long roomUid) { + return mHomePartyService.datingClose(roomUid) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleStringData()); + } + + @Override public Single datingNext(long roomUserId) { return mHomePartyService.datingNext(roomUserId) @@ -257,6 +270,26 @@ public class HomePartyModel extends RoomBaseModel implements IHomePartyModel { @Field("ticket") String ticket, @Field("uid") long uid); + + + /** + * 开启相亲模式 + * + * @return + */ + @FormUrlEncoded + @POST("/blind-date/enable") + Single> datingOpen(@Field("roomUid") long roomUid); + + /** + * 关闭相亲模式 + * + * @return + */ + @FormUrlEncoded + @POST("/blind-date/disable") + Single> datingClose(@Field("roomUid") long roomUid); + /** * 相亲开始下一步 * diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java index c9810371e..8a9925342 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IHomePartyModel.java @@ -63,6 +63,10 @@ public interface IHomePartyModel extends IModel { */ Single openOrCloseMicroPhone(int micPosition, int state, long roomUid, String ticket); + Single datingOpen(long roomUid); + + Single datingClose(long roomUid); + Single datingNext(long roomUserId); Single datingSelect(long chosenUserId, long electorUserId, long roomUserId); From 4caa10326b7095e9a06ec7875954009219d3a857 Mon Sep 17 00:00:00 2001 From: huangjian Date: Fri, 22 Jan 2021 18:52:22 +0800 Subject: [PATCH 14/49] =?UTF-8?q?=E6=8E=92=E9=BA=A6=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0GroupType=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/dialog/MicQueueDialog.java | 38 +++++++++++++----- .../avroom/dialog/RoomOperationDialog.java | 2 +- .../fragment/HomePartyRoomFragment.java | 7 ++-- .../res/drawable/shape_518eff_20dp_round.xml | 8 ++++ .../res/drawable/shape_ff6b77_20dp_round.xml | 8 ++++ app/src/main/res/layout/dialog_mic_queue.xml | 39 +++++++++++++++++++ .../manager/IMNetEaseManager.java | 2 + .../manager/AvRoomDataManager.java | 6 +-- .../room/model/MicQueueModel.java | 8 ++-- .../room/model/inteface/IMicQueueModel.java | 2 +- .../room/queuing_mic/bean/GroupType.java | 6 +++ .../bean/QueuingMicMemeberInfo.java | 5 +++ 12 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/drawable/shape_518eff_20dp_round.xml create mode 100644 app/src/main/res/drawable/shape_ff6b77_20dp_round.xml create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java index 75e58594d..37d9a0bd8 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java @@ -3,10 +3,12 @@ package com.yizhuan.erban.avroom.dialog; import android.content.Context; import android.graphics.Color; import android.os.Bundle; + import androidx.annotation.NonNull; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; @@ -35,6 +37,7 @@ import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.giftvalue.helper.GiftValueMrg; import com.yizhuan.xchat_android_core.room.model.HomePartyModel; import com.yizhuan.xchat_android_core.room.model.MicQueueModel; +import com.yizhuan.xchat_android_core.room.queuing_mic.bean.GroupType; import com.yizhuan.xchat_android_core.room.queuing_mic.bean.QueuingMicMemeberInfo; import com.yizhuan.xchat_android_core.room.queuing_mic.bean.RespQueuingMicListInfo; import com.yizhuan.xchat_android_core.user.bean.BaseInfo; @@ -84,6 +87,13 @@ public class MicQueueDialog extends BaseDialog implements FrameLayout flBottomButton; @BindView(R.id.fl_main_content) FrameLayout flMainContent; + @BindView(R.id.ll_join_queue) + View llJoinQueue; + @BindView(R.id.tv_join_male) + TextView tvJoinMale; + @BindView(R.id.tv_join_female) + TextView tvJoinFemale; + private LoadPageDataHelper> loadPageDataHelper; private boolean noMoreData = false; private MicQueueAdapter adapter; @@ -171,7 +181,9 @@ public class MicQueueDialog extends BaseDialog implements refreshData(); } - /**抱TA上麦*/ + /** + * 抱TA上麦 + */ private void inviteToMic(QueuingMicMemeberInfo member, int itemPos) { int micPosition = -1; for (int i = 0; i < AvRoomDataManager.get().mMicQueueMemberMap.size(); i++) { @@ -232,11 +244,13 @@ public class MicQueueDialog extends BaseDialog implements } - /**将队列减一*/ + /** + * 将队列减一 + */ private void reduceQueueInfo() { if (queueMicListInfo != null) { int count = queueMicListInfo.getCount(); - count --; + count--; if (count < 0) { count = 0; } @@ -502,24 +516,31 @@ public class MicQueueDialog extends BaseDialog implements } } - @OnClick(R.id.tv_apply_mic_queue) - public void onViewClicked() { + @OnClick({R.id.tv_apply_mic_queue, R.id.tv_join_male, R.id.tv_join_female}) + public void onViewClicked(View view) { if (queueMicListInfo == null) { return; } + //报名排麦 if (AvRoomDataManager.get().isManager()) { if (actionListener != null) { actionListener.onShareRoom(MicQueueDialog.this); } } else { + int groupType = 0; + if (view.getId() == R.id.tv_join_male) { + groupType = GroupType.MALE; + } else if (view.getId() == R.id.tv_join_female) { + groupType = GroupType.FEMALE; + } if (actionListener != null) { if (queueMicListInfo.getMyPos() < 0) { if (!AvRoomDataManager.get().isQueuingMicro()) { toast("排麦模式已关闭"); return; } - actionListener.onApplyMicQueue(MicQueueDialog.this); + actionListener.onApplyMicQueue(MicQueueDialog.this, groupType); } else { actionListener.onCancelMicQueue(MicQueueDialog.this); } @@ -534,7 +555,7 @@ public class MicQueueDialog extends BaseDialog implements public interface OnActionListener { void onShareRoom(MicQueueDialog micQueueDialog); - void onApplyMicQueue(MicQueueDialog micQueueDialog); + void onApplyMicQueue(MicQueueDialog micQueueDialog, int groupType); void onCancelMicQueue(MicQueueDialog micQueueDialog); } @@ -543,7 +564,4 @@ public class MicQueueDialog extends BaseDialog implements this.actionListener = actionListener; } - private void onReceiveRoomEvent(RoomEvent roomEvent) { - - } } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java index b04bb2890..e1483eb3e 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java @@ -174,7 +174,7 @@ public class RoomOperationDialog extends BottomSheetDialog { return; } String str = AvRoomDataManager.get().isDatingMode() ? "相亲中..." :"相亲模式"; - int icon = AvRoomDataManager.get().isOpenPKMode() ? + int icon = AvRoomDataManager.get().isDatingMode() ? R.drawable.ic_room_opt_op_dating : R.drawable.ic_room_opt_in_dating; optAdapter.addData(new OptAction(icon, str, () -> { diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 27efdc37d..160f3465b 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -2347,15 +2347,16 @@ public class HomePartyRoomFragment extends BaseMvpFragment() { @Override diff --git a/app/src/main/res/drawable/shape_518eff_20dp_round.xml b/app/src/main/res/drawable/shape_518eff_20dp_round.xml new file mode 100644 index 000000000..e8831c937 --- /dev/null +++ b/app/src/main/res/drawable/shape_518eff_20dp_round.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml b/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml new file mode 100644 index 000000000..88c97f2a2 --- /dev/null +++ b/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_mic_queue.xml b/app/src/main/res/layout/dialog_mic_queue.xml index 15c09b205..90aeec31e 100644 --- a/app/src/main/res/layout/dialog_mic_queue.xml +++ b/app/src/main/res/layout/dialog_mic_queue.xml @@ -99,9 +99,48 @@ android:singleLine="true" android:textColor="@color/color_white" android:textSize="16sp" + android:visibility="gone" android:background="@drawable/shape_appcolor_corner" tools:text="@string/apply_mic_queue" /> + + + + + + + + + diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 934ad93ca..d281732a2 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -1600,6 +1600,7 @@ public final class IMNetEaseManager { // 1----房间信息更新 2-----麦序信息更新 // 3----更新房间信息和麦序信息(排麦模式) int type = (int) extension.get("type"); + LogUtil.print("chatRoomInfoUpdate type =" + type); if (type == 2) { roomQueueMicUpdate(extension); } else if (type == 1) { @@ -1620,6 +1621,7 @@ public final class IMNetEaseManager { private void roomInfoUpdate(Map extension) { String roomInfoStr = (String) extension.get("roomInfo"); if (!TextUtils.isEmpty(roomInfoStr)) { + LogUtil.print(roomInfoStr); RoomInfo roomInfo = gson.fromJson(roomInfoStr, RoomInfo.class); if (roomInfo != null) { AvRoomDataManager.get().mCurrentRoomInfo = roomInfo; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index 45abc9282..e37938a4e 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -833,8 +833,7 @@ public final class AvRoomDataManager { * @return */ public boolean isQueuingMicro() { - if (mCurrentRoomInfo == null) return false; - return mCurrentRoomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE; + return isRoomInQueuingMicMode(mCurrentRoomInfo); } /** @@ -844,7 +843,8 @@ public final class AvRoomDataManager { */ public boolean isRoomInQueuingMicMode(RoomInfo roomInfo) { if (roomInfo == null) return false; - return roomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE; + return roomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE + ||roomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE; } public void addManagerMember(ChatRoomMember member) { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/MicQueueModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/MicQueueModel.java index c70baed21..d1ad629c1 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/MicQueueModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/MicQueueModel.java @@ -116,8 +116,8 @@ public class MicQueueModel extends BaseModel implements IMicQueueModel { * @return 新的排麦列表 */ @Override - public Single applyForQueuing(long roomUid, long openUid) { - return api.applyForQueuing(roomUid, openUid) + public Single applyForQueuing(long roomUid, long openUid,int groupType) { + return api.applyForQueuing(roomUid, openUid,groupType) .compose(RxHelper.handleBeanData()) .compose(RxHelper.handleSchedulers()); } @@ -192,12 +192,14 @@ public class MicQueueModel extends BaseModel implements IMicQueueModel { * * @param roomUid 房间 UID * @param operUid 操作者的 UID (房主 or 管理员) + * @param groupType 报名的分组类型 * @return */ @FormUrlEncoded @POST("/room/queue") Single> applyForQueuing(@Field("roomUid") long roomUid, - @Field("operUid") long operUid); + @Field("operUid") long operUid, + @Field("groupType") int groupType); /** * 取消报名排麦 diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IMicQueueModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IMicQueueModel.java index 824cb5b73..e954aaeca 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IMicQueueModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IMicQueueModel.java @@ -38,7 +38,7 @@ public interface IMicQueueModel { * @param openUid 报名者uid * @return 新的排麦列表 */ - Single applyForQueuing(long roomUid, long openUid); + Single applyForQueuing(long roomUid, long openUid,int groupType); /** * 取消报名排麦 diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java new file mode 100644 index 000000000..2f0896747 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java @@ -0,0 +1,6 @@ +package com.yizhuan.xchat_android_core.room.queuing_mic.bean; + +public interface GroupType { + int MALE = 1; + int FEMALE = 2; +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/QueuingMicMemeberInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/QueuingMicMemeberInfo.java index 0ed171675..871b18305 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/QueuingMicMemeberInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/QueuingMicMemeberInfo.java @@ -18,4 +18,9 @@ public class QueuingMicMemeberInfo { private String avatar; // 排麦用户性别 private int gender; + + /** + * {@link GroupType} + */ + private int groupType; } From f3c8c55965faf444e83076a6bf7379da4741371c Mon Sep 17 00:00:00 2001 From: huangjian Date: Mon, 25 Jan 2021 14:27:25 +0800 Subject: [PATCH 15/49] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8E=92=E9=BA=A6?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=AF=B9=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/DatingMicroViewAdapter.kt | 4 +- .../erban/avroom/adapter/MicQueueAdapter.java | 41 ++- .../erban/avroom/dialog/MicQueueDialog.java | 76 ++++-- .../fragment/HomePartyRoomFragment.java | 2 +- .../res/drawable/shape_518eff_20dp_round.xml | 20 +- .../drawable/shape_app_color_20dp_round.xml | 19 ++ .../res/drawable/shape_ff6b77_20dp_round.xml | 21 +- app/src/main/res/layout/dialog_mic_queue.xml | 245 +++++++++--------- .../main/res/layout/item_mic_queue_list.xml | 7 +- app/src/main/res/values/colors.xml | 1 + .../manager/AvRoomDataManager.java | 1 + .../room/queuing_mic/bean/GroupType.java | 1 + 12 files changed, 259 insertions(+), 179 deletions(-) create mode 100644 app/src/main/res/drawable/shape_app_color_20dp_round.xml diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt b/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt index 696929027..2bea4701a 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/DatingMicroViewAdapter.kt @@ -91,7 +91,9 @@ class DatingMicroViewAdapter(context: Context?) : BaseMicroViewAdapter(context) tvSelectedStatus.visibility = View.VISIBLE if (it.isHasSelectUser) { tvSelectedStatus.isSelected = true - if (roomInfo.blindDateState == RoomInfo.DATING_STATE_PUBLISH || uid == it.account.toLong() || AvRoomDataManager.get().isPreside(uid)) { + if (roomInfo.blindDateState == RoomInfo.DATING_STATE_PUBLISH || + uid == it.account.toLong() || + AvRoomDataManager.get().isPreside(uid)) { tvSelectedStatus.text = "选${it.selectMicPosition + 1}号" } else { tvSelectedStatus.text = "已选择" diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java index 0ce3d417e..424dd22d0 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java @@ -1,7 +1,9 @@ package com.yizhuan.erban.avroom.adapter; import android.graphics.drawable.GradientDrawable; + import androidx.appcompat.widget.AppCompatImageView; + import android.view.View; import android.widget.TextView; @@ -11,6 +13,7 @@ import com.netease.nim.uikit.support.glide.GlideApp; import com.yizhuan.erban.R; import com.yizhuan.erban.common.widget.CircleImageView; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; +import com.yizhuan.xchat_android_core.room.queuing_mic.bean.GroupType; import com.yizhuan.xchat_android_core.room.queuing_mic.bean.QueuingMicMemeberInfo; import com.yizhuan.xchat_android_core.user.bean.UserInfo; @@ -32,7 +35,6 @@ public class MicQueueAdapter extends BaseQuickAdapter { + if (onUpMicListener != null) { + onUpMicListener.onUpMic(item, itemPos); } }); } else { - tvOpt.setText("排麦中"); - tvOpt.setTextColor(mContext.getResources().getColor(R.color.appColor)); - attentionBg.setColor(mContext.getResources().getColor(R.color.color_f0f0f0)); + if (item.getGroupType() == GroupType.MALE) { + tvOpt.setText("已选男神"); + attentionBg.setColor(mContext.getResources().getColor(R.color.color_518EFF)); + } else if (item.getGroupType() == GroupType.FEMALE) { + tvOpt.setText("已选女神"); + attentionBg.setColor(mContext.getResources().getColor(R.color.color_FF6B82)); + } else { + tvOpt.setText("排麦中"); + tvOpt.setTextColor(mContext.getResources().getColor(R.color.appColor)); + attentionBg.setColor(mContext.getResources().getColor(R.color.color_f0f0f0)); + } tvOpt.setOnClickListener(null); } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java index 37d9a0bd8..733e1aacb 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java @@ -48,6 +48,7 @@ import com.yizhuan.xchat_android_library.utils.ListUtils; import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import butterknife.BindView; @@ -83,8 +84,6 @@ public class MicQueueDialog extends BaseDialog implements RelativeLayout llContainer; @BindView(R.id.fl_queue_count) FrameLayout flQueueCount; - @BindView(R.id.fl_bottom_button) - FrameLayout flBottomButton; @BindView(R.id.fl_main_content) FrameLayout flMainContent; @BindView(R.id.ll_join_queue) @@ -181,6 +180,8 @@ public class MicQueueDialog extends BaseDialog implements refreshData(); } + private final List malePositionList = Arrays.asList(0, 1, 4, 5); + /** * 抱TA上麦 */ @@ -188,10 +189,18 @@ public class MicQueueDialog extends BaseDialog implements int micPosition = -1; for (int i = 0; i < AvRoomDataManager.get().mMicQueueMemberMap.size(); i++) { int key = AvRoomDataManager.get().mMicQueueMemberMap.keyAt(i); - RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(key); //-1这个位置是 房主,不让上去 + if (key == -1) continue; + //相亲模式只能抱上对应的坑位 + if (AvRoomDataManager.get().isDatingMode()) { + if (member.getGroupType() == GroupType.MALE && !malePositionList.contains(key)) + continue; + if (member.getGroupType() == GroupType.FEMALE && malePositionList.contains(key)) + continue; + } + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(key); //排麦模式下,选择被锁的坑,即是排麦坑才能上 - if (key != -1 && roomQueueInfo != null + if (roomQueueInfo != null && roomQueueInfo.mRoomMicInfo != null && roomQueueInfo.mRoomMicInfo.isMicLock() && roomQueueInfo.mChatRoomMember == null) { @@ -309,50 +318,48 @@ public class MicQueueDialog extends BaseDialog implements } private void showHaveDataLayout() { - llContainer.setBackgroundColor(getContext().getResources().getColor(R.color.color_F5F5F5)); + resetApplyButton(); srlRefreshContainer.setVisibility(View.VISIBLE); llNoDataContainer.setVisibility(View.GONE); setTopLayout(); - tvApplyMicQueue.setClickable(true); + llJoinQueue.setActivated(true); + setApplyButtonClickable(true); if (AvRoomDataManager.get().isManager()) { - flBottomButton.setVisibility(View.GONE); + llJoinQueue.setVisibility(View.GONE); } else { if (queueMicListInfo != null) { - flBottomButton.setVisibility(View.VISIBLE); + llJoinQueue.setVisibility(View.VISIBLE); if (queueMicListInfo.getMyPos() < 0) { //我不在队列 //点击报名 if (AvRoomDataManager.get().isOnMic(AuthModel.get().getCurrentUid())) { - //如果我在麦上 设置不可点击 - tvApplyMicQueue.setClickable(false); - tvApplyMicQueue.setBackgroundResource(R.drawable.shape_dbdbdb_corner); - } else { - tvApplyMicQueue.setBackgroundResource(R.drawable.shape_appcolor_corner); + llJoinQueue.setActivated(false); + setApplyButtonClickable(false); } - tvApplyMicQueue.setTextColor(context.getResources().getColor(R.color.white)); tvApplyMicQueue.setText(context.getResources().getString(R.string.apply_mic_queue)); } else { //我在队列 //取消报名 - tvApplyMicQueue.setBackgroundResource(R.drawable.shape_dbdbdb_corner); - tvApplyMicQueue.setTextColor(context.getResources().getColor(R.color.color_333333)); + llJoinQueue.setActivated(false); tvApplyMicQueue.setText(context.getResources().getString(R.string.cancel_mic_queue)); + tvApplyMicQueue.setVisibility(View.VISIBLE); + tvJoinFemale.setVisibility(View.GONE); + tvJoinMale.setVisibility(View.GONE); } } } } private void showNoDataLayout() { - llContainer.setBackgroundColor(getContext().getResources().getColor(R.color.color_white)); + resetApplyButton(); srlRefreshContainer.setVisibility(View.GONE); llNoDataContainer.setVisibility(View.VISIBLE); - flBottomButton.setVisibility(View.VISIBLE); - tvApplyMicQueue.setClickable(true); + llJoinQueue.setVisibility(View.VISIBLE); + llJoinQueue.setActivated(true); + setApplyButtonClickable(true); if (AvRoomDataManager.get().isManager()) { flQueueCount.setVisibility(View.GONE); //立即邀请 - tvApplyMicQueue.setBackgroundResource(R.drawable.shape_appcolor_corner); - tvApplyMicQueue.setTextColor(context.getResources().getColor(R.color.white)); tvApplyMicQueue.setText(R.string.invite_to_mic_queue); tvNoDataTip.setText(getContext().getResources().getString(R.string.manager_no_mic_queue_tip)); } else { @@ -360,18 +367,34 @@ public class MicQueueDialog extends BaseDialog implements tvMicQueueTip.setText(R.string.apply_mic_queue_tip); //点击报名 if (AvRoomDataManager.get().isOnMic(AuthModel.get().getCurrentUid())) { - tvApplyMicQueue.setClickable(false); - tvApplyMicQueue.setBackgroundResource(R.drawable.shape_dbdbdb_corner); - } else { - tvApplyMicQueue.setBackgroundResource(R.drawable.shape_appcolor_corner); + llJoinQueue.setActivated(false); + setApplyButtonClickable(false); } - tvApplyMicQueue.setTextColor(context.getResources().getColor(R.color.white)); tvApplyMicQueue.setText(R.string.apply_mic_queue); tvNoDataTip.setText(getContext().getResources().getString(R.string.no_mic_queue_tip)); } } + //相亲模式下有两按钮,但是管理员依然只有一个 + private void resetApplyButton() { + if (AvRoomDataManager.get().isDatingMode() && !AvRoomDataManager.get().isManager()) { + tvApplyMicQueue.setVisibility(View.GONE); + tvJoinFemale.setVisibility(View.VISIBLE); + tvJoinMale.setVisibility(View.VISIBLE); + } else { + tvApplyMicQueue.setVisibility(View.VISIBLE); + tvJoinFemale.setVisibility(View.GONE); + tvJoinMale.setVisibility(View.GONE); + } + } + + private void setApplyButtonClickable(boolean clickable) { + tvApplyMicQueue.setClickable(clickable); + tvJoinFemale.setClickable(clickable); + tvJoinMale.setClickable(clickable); + } + private void loadMoreData() { loadPageDataHelper.loadMoreData().subscribe(new SingleObserver>() { @@ -391,7 +414,6 @@ public class MicQueueDialog extends BaseDialog implements @Override public void onError(Throwable e) { -// Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); SingleToastUtil.showToastShort(e.getMessage()); } }); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 160f3465b..bcacdbb67 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -1307,7 +1307,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment - + - + + + + + + - - \ No newline at end of file + + + + + + + + diff --git a/app/src/main/res/drawable/shape_app_color_20dp_round.xml b/app/src/main/res/drawable/shape_app_color_20dp_round.xml new file mode 100644 index 000000000..56fab520a --- /dev/null +++ b/app/src/main/res/drawable/shape_app_color_20dp_round.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml b/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml index 88c97f2a2..7c272e62c 100644 --- a/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml +++ b/app/src/main/res/drawable/shape_ff6b77_20dp_round.xml @@ -1,8 +1,19 @@ - - + - - \ No newline at end of file + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_mic_queue.xml b/app/src/main/res/layout/dialog_mic_queue.xml index 90aeec31e..72422a1bd 100644 --- a/app/src/main/res/layout/dialog_mic_queue.xml +++ b/app/src/main/res/layout/dialog_mic_queue.xml @@ -1,147 +1,140 @@ - + android:fitsSystemWindows="true" + android:orientation="vertical"> - - + android:ellipsize="marquee" + android:gravity="center" + android:singleLine="true" + android:textColor="@color/color_999999" + android:textSize="14sp" /> - + + + + + + + + - - + android:layout_height="match_parent" /> + + android:layout_height="match_parent" + tools:visibility="visible"> - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_gravity="center" + android:src="@drawable/icon_common_failure" /> + - + + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/item_mic_queue_list.xml b/app/src/main/res/layout/item_mic_queue_list.xml index 1cc3db988..6c621ffd5 100644 --- a/app/src/main/res/layout/item_mic_queue_list.xml +++ b/app/src/main/res/layout/item_mic_queue_list.xml @@ -43,11 +43,14 @@ #3ECAFC #602A06 #79674E + #518EFF diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index e37938a4e..3b80e7793 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -838,6 +838,7 @@ public final class AvRoomDataManager { /** * 给定房间是否开启排麦模式 + * 相亲模式必开排麦模式 * * @return */ diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java index 2f0896747..bd24aba37 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queuing_mic/bean/GroupType.java @@ -1,6 +1,7 @@ package com.yizhuan.xchat_android_core.room.queuing_mic.bean; public interface GroupType { + int NORMAL = 1; int MALE = 1; int FEMALE = 2; } From e225881602c603458bf4cdf0e5b7fd5785c227d8 Mon Sep 17 00:00:00 2001 From: huangjian Date: Mon, 25 Jan 2021 19:44:19 +0800 Subject: [PATCH 16/49] =?UTF-8?q?1.=E7=94=A8=E6=88=B7=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E6=8A=B1=E4=BA=BA=E4=B8=8A=E9=BA=A6=E5=A2=9E=E5=8A=A0=E7=9B=B8?= =?UTF-8?q?=E4=BA=B2=E6=A8=A1=E5=BC=8F=E4=B8=BB=E6=8C=81=E4=BA=BA=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E5=A4=84=E7=90=86=202.=E7=9B=B8=E4=BA=B2=E8=A7=84?= =?UTF-8?q?=E5=88=99webview=E5=BC=B9=E7=AA=97=203.=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=BC=80=E5=85=B3=E6=8F=90=E7=A4=BA=E5=BC=B9?= =?UTF-8?q?=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 + .../erban/application/XChatApplication.java | 2 + .../avroom/activity/RoomSettingActivity.java | 4 + .../avroom/adapter/DatingMicroViewAdapter.kt | 7 +- .../erban/avroom/adapter/UpMicAdapter.java | 42 ++++---- .../erban/avroom/dialog/MicQueueDialog.java | 6 +- .../fragment/HomePartyRoomFragment.java | 16 ++- .../avroom/presenter/AvRoomPresenter.java | 4 +- .../avroom/presenter/HomePartyPresenter.java | 4 - .../ui/webview/CommonWebViewActivity.java | 2 - .../ui/webview/DatingRuleWebViewActivity.java | 32 ++++++ .../erban/ui/widget/UserInfoDialog.java | 2 +- .../res/drawable-xhdpi/dating_bg_rule.9.png | Bin 0 -> 35529 bytes .../res/drawable-xhdpi/icon_up_mic_false.png | Bin 0 -> 2229 bytes .../res/drawable-xhdpi/icon_up_mic_false.webp | Bin 1126 -> 0 bytes .../icon_up_mic_false_preside.png | Bin 0 -> 2736 bytes .../icon_up_mic_true_preside.png | Bin 0 -> 3796 bytes .../res/drawable-xhdpi/icon_up_mic_ture.png | Bin 0 -> 3255 bytes .../res/drawable-xhdpi/icon_up_mic_ture.webp | Bin 1594 -> 0 bytes .../main/res/layout/activity_chat_room.xml | 1 - .../layout/activity_dating_rule_web_view.xml | 102 ++++++++++++++++++ .../layout/fragment_chatroom_game_main.xml | 102 +++++++++--------- .../xchat_android_core/UriProvider.java | 2 +- .../manager/IMNetEaseManager.java | 1 + .../yizhuan/xchat_android_core/Constants.java | 8 +- .../manager/AvRoomDataManager.java | 9 ++ .../nim/uikit/common/util/log/LogUtil.java | 2 +- 27 files changed, 258 insertions(+), 94 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/ui/webview/DatingRuleWebViewActivity.java create mode 100644 app/src/main/res/drawable-xhdpi/dating_bg_rule.9.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_up_mic_false.png delete mode 100644 app/src/main/res/drawable-xhdpi/icon_up_mic_false.webp create mode 100644 app/src/main/res/drawable-xhdpi/icon_up_mic_false_preside.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_up_mic_true_preside.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_up_mic_ture.png delete mode 100644 app/src/main/res/drawable-xhdpi/icon_up_mic_ture.webp create mode 100644 app/src/main/res/layout/activity_dating_rule_web_view.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5abe76162..115882268 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1255,6 +1255,10 @@ + + radioGroup.check(R.id.rb_step_public) } radioGroup.setOnClickListener { - DialogWebViewActivity.start(context, UriProvider.getDatingRule()) + DatingRuleWebViewActivity.start(context, UriProvider.getDatingRule()) } if (info.mChatRoomMember == null) { diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/UpMicAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/UpMicAdapter.java index 7f2b3f874..d5b567c71 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/UpMicAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/UpMicAdapter.java @@ -1,5 +1,6 @@ package com.yizhuan.erban.avroom.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.widget.ImageView; import android.widget.TextView; @@ -7,6 +8,7 @@ import android.widget.TextView; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.yizhuan.erban.R; +import com.yizhuan.xchat_android_core.Constants; import com.yizhuan.xchat_android_core.bean.RoomQueueInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; @@ -27,10 +29,13 @@ public class UpMicAdapter extends BaseQuickAdapter { private Consumer consumer; - public UpMicAdapter(Context context, Consumer consumer) { + private long upUid; + + public UpMicAdapter(Context context, long upUid, Consumer consumer) { super(R.layout.item_user_card_up_mic); this.context = context; this.consumer = consumer; + this.upUid = upUid; List list = new ArrayList<>(); int size = AvRoomDataManager.get().isCpRoom() ? 2 : 9; for (int i = 0; i < size; i++) { @@ -39,40 +44,35 @@ public class UpMicAdapter extends BaseQuickAdapter { setNewData(list); } + @SuppressLint("SetTextI18n") @Override protected void convert(BaseViewHolder helper, String item) { int position = helper.getAdapterPosition(); RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByMicPosition(position - 1); if (roomQueueInfo == null) return; - boolean isUp = false; ImageView imageView = helper.getView(R.id.iv_mic); - if (roomQueueInfo.mChatRoomMember == null) { - - if (AvRoomDataManager.get().isLeaveMode() && position == 0) { // 离开模式房主位不可上麦 - isUp = true; - - } else { - imageView.setImageResource(R.drawable.icon_up_mic_false); - helper.itemView.setClickable(true); - helper.itemView.setOnClickListener(v -> Single.just(position).subscribe(consumer)); - } - + //麦上没人,且不是离开模式房主位,相亲模式的管理才能上房主位 + if (roomQueueInfo.mChatRoomMember == null && + (!AvRoomDataManager.get().isLeaveMode() || position != 0) && + (!AvRoomDataManager.get().isDatingMode() || AvRoomDataManager.get().isManager(String.valueOf(upUid)) || position != 0)) { + imageView.setImageResource(position == 0 ? R.drawable.icon_up_mic_true_preside : R.drawable.icon_up_mic_ture); + helper.itemView.setClickable(true); + helper.itemView.setOnClickListener(v -> Single.just(position).subscribe(consumer)); } else { - isUp = true; - } - - if (isUp) { - imageView.setImageResource(R.drawable.icon_up_mic_ture); + imageView.setImageResource(position == 0 ? R.drawable.icon_up_mic_false_preside : R.drawable.icon_up_mic_false); helper.itemView.setClickable(false); } TextView textView = helper.getView(R.id.tv_pos); if (position == 0) { - textView.setText("房主位"); + textView.setText(AvRoomDataManager.get().isDatingMode() ? "主持位" : "房主位"); } else { - textView.setText(String.format( - context.getResources().getString(R.string.which_mic_position), position)); + if (AvRoomDataManager.get().isDatingMode()) { + textView.setText(position + (Constants.maleIndex.contains(position - 1) ? "号男神位" : "号女神位")); + } else { + textView.setText(String.format(context.getResources().getString(R.string.which_mic_position), position)); + } } } } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java index 733e1aacb..b2cc30ac9 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java @@ -180,8 +180,6 @@ public class MicQueueDialog extends BaseDialog implements refreshData(); } - private final List malePositionList = Arrays.asList(0, 1, 4, 5); - /** * 抱TA上麦 */ @@ -193,9 +191,9 @@ public class MicQueueDialog extends BaseDialog implements if (key == -1) continue; //相亲模式只能抱上对应的坑位 if (AvRoomDataManager.get().isDatingMode()) { - if (member.getGroupType() == GroupType.MALE && !malePositionList.contains(key)) + if (member.getGroupType() == GroupType.MALE && !Constants.maleIndex.contains(key)) continue; - if (member.getGroupType() == GroupType.FEMALE && malePositionList.contains(key)) + if (member.getGroupType() == GroupType.FEMALE && Constants.maleIndex.contains(key)) continue; } RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(key); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index bcacdbb67..03d8fc388 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -2255,12 +2255,24 @@ public class HomePartyRoomFragment extends BaseMvpFragment getMvpPresenter().datingOpen()); } @Override @@ -2347,7 +2359,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment { public void onNext(Long aLong) { RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; if (roomInfo == null) return; - Log.e(TAG, "onNext: roomInfo in startGetOnlineMemberNumberJob: " + roomInfo); - Log.e(TAG, "onNext: has login in IM: " + AuthModel.get().isImLogin()); + Log.d(TAG, "onNext: roomInfo in startGetOnlineMemberNumberJob: " + roomInfo); + Log.d(TAG, "onNext: has login in IM: " + AuthModel.get().isImLogin()); Disposable subscribe = mAvRoomModel.startGetOnlineMemberNumberJob(roomInfo.getRoomId()) .observeOn(AndroidSchedulers.mainThread()) .compose(AvRoomPresenter.this.bindUntilEvent(PresenterEvent.DESTROY)) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java index 76acb5b9c..67c0ca049 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java @@ -913,10 +913,6 @@ public class HomePartyPresenter extends BaseMvpPresenter { public void datingOpen(){ final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; if (roomInfo == null) return; - if (AvRoomDataManager.get().isOpenPKMode()){ - SingleToastUtil.showToast("PK中不可以开启相亲模式!"); - return; - } if (!AvRoomDataManager.get().isDatingMode()){ mHomePartyMode.datingOpen(roomInfo.getUid()) .compose(bindToLifecycle()) diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java index dabb9196f..3ecfcd6a1 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java @@ -341,8 +341,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O private void initView() { layoutTitleBar = findViewById(R.id.layout_title_bar); - layoutTitleBar.setVisibility(View.VISIBLE); - webView = (WebView) findViewById(R.id.webview); imgShare = (ImageView) findViewById(R.id.img_share); mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/DatingRuleWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/DatingRuleWebViewActivity.java new file mode 100644 index 000000000..d59b42961 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/DatingRuleWebViewActivity.java @@ -0,0 +1,32 @@ +package com.yizhuan.erban.ui.webview; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.Gravity; +import android.view.WindowManager; + +import com.netease.nim.uikit.common.util.sys.ScreenUtil; +import com.yizhuan.erban.R; + + +public class DatingRuleWebViewActivity extends CommonWebViewActivity { + + public static void start(Context context, String url) { + Intent intent = new Intent(context, DatingRuleWebViewActivity.class); + intent.putExtra("url", url); + context.startActivity(intent); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ScreenUtil.getDisplayHeight()); + getWindow().setGravity(Gravity.CENTER); + } + + @Override + protected int getLayoutId() { + return R.layout.activity_dating_rule_web_view; + } +} diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java index b96a749a3..d8914aa36 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java @@ -1207,7 +1207,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe setMicViewVisiable(true); RecyclerView recyclerView = findViewById(R.id.recycler_view_mic); - UpMicAdapter adapter = new UpMicAdapter(context, + UpMicAdapter adapter = new UpMicAdapter(context,uid, position -> { if (AvRoomDataManager.get().isLeaveMode() && uid == AvRoomDataManager.get().getRoomUid()) { SingleToastUtil.showToast(context.getString(R.string.tips_close_leave_mode_first)); diff --git a/app/src/main/res/drawable-xhdpi/dating_bg_rule.9.png b/app/src/main/res/drawable-xhdpi/dating_bg_rule.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5be6f8381e74bf45aaa04ab25751f7f9cd99f248 GIT binary patch literal 35529 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

Jlw>qnQxAC>C1)QGW(*?cX!kh0OS=ZtK{tf{I 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_up_mic_false.png b/app/src/main/res/drawable-xhdpi/icon_up_mic_false.png new file mode 100644 index 0000000000000000000000000000000000000000..8737ee19dbe271b583e20a3ce7aa825d6c603274 GIT binary patch literal 2229 zcmV;m2uk;fP)vR7mhtXaOOD0F~Y36&}oSWp7ajLjyS%Vu|zU9aa^ zC=1a*_aPB^W@u>W#fgatR{zi?bb#4xcAa4u4*+-^z}dqw14rPS9! z^9c;lw(Z-r*3Sdj7}S^!KR+uX_ba9T93Oy~9KSE|=TpIL-$E&TmF(AEf!xFpMkG>GTo5viJf#aNxl3*x1;= zwbnoNQ`S#^7m<(V=jVU6W5ceuElUgAtLncQBvJg@?wWmyjbcs6cU$IPCGOw)YMv#AV_t7o=tbN)9O zGlS!1&LO4LdERPY8K7<3JGIsvx(vjJfQVeLlq#_*1GFrQT{IVk2I5cPucm31Sd{>} zLl;J4qh9p(H?22P%qJ3wb5g0)ya(_mt@T^IVS7BR6p@>iQg3?zU(j0L8xPZ>wPM}6 zb)^hWpANRZE+V^?QumbrT9)+%fF04A-hJ(xHf_S_=-F24`0?XGAx@d5d4aeqY~Oaj zc+pz0apOj;U(elgXC(xHU^^(bZC|Igem7e4yQ_V}h7I74CkqP;IC0`cV51DfxIrw- zdIG>xfwjd{0lkji=Ly?BdS6KLBmwqq$e!&T+dWUtoHC|yg%Ui+iDakmGy%>6_^ylUVUlastSP}0IXlIV7#_2jBf!vF z)NZn`hPS-DjH5@7M&)_sq7ooi-iNzc_@H?Y4-aGO)~#jFBRp2yVzC%hweRx;$PL&$ z*wT}dOeRb448thdPiXYKPQdf3FxNmLJBAR}rg7D~p9g=BI<#@{Hk|;8) z98QEih#eXl!ua@j+4BgG)s`Jc2cIG7Duy%LE;2_An_x&)7H?)#BX z<*K6~ghz<&dJ3Vj&7%iWI4z^+aj@J4DNW@f4<>M0#W|@rK4YOdCuOy6Mc7f$^D5!- zWpJ9-C3&)A;Vh2RIKA?EOBQ%`b{2DU%^hLmbM!oR9G>U3^Af@Y?KsXaIvP-==WwRr zc@PW3*xbpJCmYUFtKsoEdS0s@940*KDg{*e56iNqI<^0qFbI)@Ur*S65lF51Dyuy` zuQGiY(c}0Rs;2#;+hqbr`Us?X2!JazYF#j<8TpC2t2iwtXZd|{n{2&%G& zCMbHHH;ZYt!|4Ftl?&@`JIFJ%zwAKftFmCv%Bt!OjH?rzI&}*CiIJ?_+Cjs*y*fvD zgy;=ZJXjp&aJUmEskynx-QM<9lz|052-WRgSj&%o`L_7?ua#0iTD85+t;Vs~V9Dtp zhdW`c-L?qFH@S#BqLg~ZOIT}*@1b6f5Bd@amZ0$#U)Ku4PaMY{0_xyL$G;1Dvs|zrf%WZcY=RbqPhL}wx z5|`DxOQGR;VcWKE*IK{Y+)L`uR3dVRQmXEe-@$?F#_#dUvG#R2FtWfoTp5dabO_Q9T00000NkvXXu0mjf D-=|BY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_up_mic_false.webp b/app/src/main/res/drawable-xhdpi/icon_up_mic_false.webp deleted file mode 100644 index 4868c4eb1385ed01c5b0ca1e9c68e03981f5ac8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmV-s1eyC%Nk&Fq1ONb6MM6+kP&il$0000G0000_002(_06|PpNT31$009@mrjaB^ zUw!YQ&pdyq4!lqFnsn%kE zwpGE@1_L#982Nw!4|xE!!=PO)rFsm$S0dRQBb;XfxyC4U&Q=(V)D%pG!Dvmvl4*=s zXAEkNQP0)19wYB3)fjy}A$Re)e6;}+IIL7-66+O|NrO?#T1;fSL|Li*llzbF?~nVF zeJQKP8k9YJq7|PGWw04DBI~z5R?b+6@ zJ(0g&o3?iCiTw2%TR*T}(dfmrD;m9E8#J4z1H=RJ(>xs@9*}3#mW>Dzk!TtbA|er+ zb*XWf8g$9Asc|MXc99xAh;a%HeQNqvh+m*BQ&VNB$v~$?1N3R>04f<`m8k%fONmne zFcZSbLNfq>G9~4IV0b(oApRpi&C>zmKk_^VMjM_h8oiu$MWdHI&6u(*YuBF0U$0GD zyY@u>dX2@ZF=$z$Y+?%h|cPvYsw6y0aj2rAeaFF0PqU{ zodGIP08juvkwTnFrKBREEY#Qluo4Mr029$2=l%on(shRFjF1oNzu-L)zsB-+^jEMa z@xSezKs^abFYR@ggG@0WYv)NN;}qg7qxkB7t)y{;w3Wcsib#I(5ooT$mkTCT0092^ z&_MV4RXdek;SLc7KE&fahaz8-C&R3Fs%m(|-8(g1Kk65jnv_~3UI`9rJuc03`}2C= z!uMlT*}f>BJLombGrgO<9{@KLpnnMpvH4C*nPg72oriLlQ7&aK0HfK)XYm`b0R6FM zm#2YR=o~6--)_|G3cU?fB!aDtF(Hp;Lg|r#fV37(0HAdE&zfEInBDdIqcPcrIo);=d!}w_5nO$z{qSg ztdzLl=Ukwjf*<7_+b^ipz^gz1(5TPY#V3yO@OoEN@pKdZMIZ9^|KP8HRpzMNk}6{J sqf#jxZjcP~E(tO^L_f+!VGFy%Q8W5=*zGr}_%uNJcmX93E$9FM01o#JhX4Qo diff --git a/app/src/main/res/drawable-xhdpi/icon_up_mic_false_preside.png b/app/src/main/res/drawable-xhdpi/icon_up_mic_false_preside.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2049eebd8cff40f8ae414a792f974324f4e4fc GIT binary patch literal 2736 zcmV;h3QzTkP)J;Opwn?jMO;0e(edZ9`IRcfComm)+eT5*5i(*6b9`qCDp zMrsNI#N`Dl^#MW&DLk~|siG)Q>Q+g+nc0n|dy#U@9yxRcw0vHA`3Sb$)yw>`nh|B|+0q`FHuku|) zURFw-Evg%mXT`4T4r{IN)LP#mBDVv$1wh(1XaKKht&fYyUqs}XQfe`;ex+@E*LG^H zt$MwFm)80V0PX=W(lt}M1PcJ36Oo@)DwXFkFP=iEI5aAsy^bai$0L9O*S0POE& zCpwgUN<o+i8rI`-j*7@bN~t%~ z){`1Q*L6Rqwf+f!U1=MWbN)FI`HE8Nmuc!v4B*L=C$|p`4H396rfEPQy6(+d>puffaVoiv(z+t@F{RYMqqaFRfVEofM$58}19)fD z!mrbGr#;WRy;`ll9;N+}0Ib*R6Q1Y22;jyjg>Hc~uUnRNYo$_|?besB0G>E;VrXn^ z>~C7@4|gkUD}65_e_vQw_~?NH2bMbZt1Ezx<2()E&{hH`MqiHDw*6pY00Sra7cnZ# zEUAcqFUzv9y1MFr)|$*!z9J$IbaJ-aYGANDdnL~m20(C{AhvDWwhkJBTU%Sh z($W&HUcKsn&Jj$mSZ-;z>}w04<2Zi=a4@guJvurHzNm4Xgy1bMF8W|DFO#g!MUL9G z-Ey7Z62O2}`E@Q$15l|{d~FL0hb=*(3=9mQR4V!4@Ni;jo=v}D06djJ}92Ikw_+p1dm#}efxGl3)7rCcMdBnD|tNYw?yRT=5WC# z03F965lT+4=dy3#K3}saoZBv5ytoOt=0*_oUAuN+$BrHA2Il^YOXbLUR*MY(e23NBo@5V`+G6KQbxnfVER4u<92;Nal?aCl$?fR5vQ z4ZstTdy*odQvX{{yRI9%Bm%d4_ikSkX;=uLnKNS-7B9osZQFj*WLXE0(KFX|x&E7q zS6=+oBO@bz=P5HYGl_>E=f&~yabF7;78ZP?l7pO5O5I?hed_?au6s~xP1mL8vS-g8 z-w<%f)$8?C^>IF=VWAez&dzq7LsL~2WEPQ+E2Vs_)&X=JhbEdqp`J^*T=unwLylH7 zjc^E$jg9#agW60WbCBQKw(Vo(0~ok2WMg|B^!EKd0?7BvmoNLTG{RNO#Kc7E=^$ns z7D}bkzH+&|U;w;VYyJC}g(ON&;OM?k1G4~-^Wfyv3mEb9~EIL;#gzLy4&xOvTb zmJYRHRg$bC42zS6KN+_VLHb7tU?G$}tuVERT1fDyiL{_m*0aql4vj}Mdy^25xY>>n zz+(XJh?_Hu^c;dTC9mEY9hsGpdnbpfAe#gc+J8MO4;dG2_P--HBYo4A%L6@DbzMY>k}}(%-{UZ1e^Go zL$_d=A%JrLt`Tzui2;ycaW%nVYQQs~QbP$EIYbf>G(KGW7A*4wF#lL#Q?E$|kQ9gl zigCiDq|F0d0?5eCP#%@Ft0Sy|XU?4IXi*J-aartM^^X8@12zw~6ei)7Ni!wY98f25 zz~S5n284L|Lzpp;qK+Z>56v*toa3m0#`1EFOR&PhCgVKk$Ut{etQjulc*^Gkg{dFl z8wD=y!iMa$3OC<@7rm)=Xswjgivj6 zP#75QP@s?3O2X;-K?8k4l?`||ZT8&iw{{S;BBFEQ zhh@T(r1t6anceweLX|5PL;ur_DN0&yE(*4{y-^ggK&P2jHi|HALN}%$c~dF%o=w}^ zf?=H72FvEon=NnrKV2CUM4~pD^CFxhi)N!mGWLn8m)rgu}n{CiB3U@OGhGjyZ%oVSGGVSQ?1tjgsMAT?Ntk z(T+I;TKH)Ize@O&5@ids(&PkN?KCKoOcjyODy24I(lF{hN6 zhSG^}Nc8l&XZn+E+bxg1wFR(VukZIf?;m*`HVkj`=++-@OpmgMrdv4?zn?3WN*`=@ zmqN$$!mjH+ptb&a#EMcU+e)p58VxGV<5|$0PqsOG~$PyO5_VfP7$YUpmoVZ6g85 z?7_7sF96^bom*KP&+~4}^x6}HR&epoQ2^B~ieODd4))~Y9Rrx-I0TR9#NNNfK>Qc4 z@3U>Y7N=j4hj6&iTCKLnvaII-+#08{K2H0h=Xv*3tJTRZG&)f-%c%+SEM^SHbs zV#gUkdCc>?C;Ivtb=tgIaBhl{ue2M3Q#OiZLZ+1=(zWjcgg)$#UK@DayI zlw_eFBe*m8F#>KaPWupfOyi%yj}aW(az94U3D|(7;Ll;))Z*tbxXr|DHQ`oNzIa20 q6Z$!f*DT9=Im%6wQ66xTH2(z;W@O4Cv=)2-0000Tgiht^6}tRfYu0s_fy9^}1yr{A2-MnV#D_YKZJkmQ^>bAD&enK?6a zE+MVNdRtRIz?ksc>c!`)K?;FPO( zAJ!Vweodfp0EQWsF1Ci-!0aPv%gZZmAH~MPc(0@a=yp_H2-1oHTmrykT&%>jB%%+P zx!hW1^CfGWCk4P_r~guoXeKlNG%--b&1DNfv#nKyD-#W5LIIrY@Sms=766d5?Lef@ zbmo!;l|`>5O1Ojo=yrXR4bGhbpcH^PQNksW&ni>MGWp@>^LNENM%(}vkFGg|NPilH zkbS1tOQBfghzUTKi%kPK z@ECwwV;S_o>%(h$TVRHWxzx7CZb4i7>G@W2)N1enZ#*+R%GAozFb z>i@wuhMuxORd^=E7+YRxf4Zl6^{9b2kKCS}) zjG@ynF3-XUR~9m}38H}!Vn)Z$qJ6d1I{x`~D>nYK4gcGmnm{yzUa#;Kj!^oz4|NM* zsiSJJPTGc4UD4*OC`4BF_o4`ByLW`}#fC6IeGb)N>!ZPH*N~knTN&83J%q}ojo9*e zia;b9SK+m-Gz6gAS^Z`z{Jo4!!h=s2cF44QhmMz4G~(+of@r7@FScl-09w>fLt&AI zb4O<3gwrhQZ+mJPi|?z)_ODa2pSQJ8aPUI!A(BGqpe`EdcKAnv@KOxBFzPPT7h4r5 zLZ7_fhG!QybO6^AGttybug=EFXIhYN)$rXnA*`%uz>fbVA4CRCukhJs?*~98w=?iB z04GO{MwA^ca%3qWg#P_rD^@OOfNl_jtQ^9Hqp~pkyiDX-2_L@Q3g41Ov@~})qN0?l z*XFexq(K!g*lHpzJ89r#NA(De=+$1?B%ndL*Ve(M#1)8|qX2isxE!2zP6h&1I#&Im z0bhQalJjty$7i3@Er4!U;B_!x81-zT?C|r8GvS<&qk275Qm3|IEYzpJ2KR#n5RH82 zZ!LIfWusv&j%B>|K0B;cwj(0Bl@1NOYfR12!I1u?oZE3QH`H~)-FZ0v6pQllre4>v z8w~Z`x6u{jvLP-|O|_1BrFF_@Og0fPvfO8XS;pxAtJvYcj|kI}J~#ohmK7p5pRnoU zHY}dq$*4s={K-Ghz}VtkwHOafszY5M`BxQYtgfiEU)>2nx6?1$cTChXh_ZuR$!0%k zh1@#U_?q$R>ZT|;bZ&mwk4z|?SD;)SISzJhi|sgwQi$dZLVt({p6*~N`Ydt#;IPO{*Zd-BxX_?{bU(9#qKv*?6aDA)N{hB_3E};9E%@rQAgo0i1f<*oO+}xZ8g%4YHJHs%(VI~>g|C4^FF)OcwJ$cO zT=w<>KPI=c`VD|CNS6f1oM6V7iMcA?Clm?-!5}L~Tm39$Btq}K(E{(| zjp-6yE^<4`?et6d>L+QGLIoBiz#z1zj**i~YJ19d7C^=6mQYu76C)!toNQ`pU`)Fq zzI${6=G-6vZUt~e0+_|bLX5%a-{j!T5t%CMHrHJTTVG9Sn*b*MojAuu{Y+@wqvMh> z*%)$)MY%o_JV-aC9Y6srb4Kj~@>;t0?yJ@`iLPAPxus&%ZJYmtU8yLh}2Dq$CF- zTUkiXMF|`na+nDptZT)e|8QUcxDmjRbS|Zwe~$4v%9opUOKnHe{PJtF(f(dFKgtsI;X|_NGSS8RZ{~vs^MQNo3 z8-xxY^nLzg{#|w0zBNVR`<}pIOr-WQHYsII+Y2KBrsSb;UPH<>HoO}y3XRmoMC6Yo zkmUCgh~4^SYU6)ha3uZoa8AS-SP$^%#9y2-zNXhou4K-Kh)c`8Mdb>>n{Q@I zu0OB?Kv6OW?TNQs(Te93V8Br(yk6OiS5|eOEB@uR*|^}UEEVRG6sBlmnuys{Y%ZDRUN>bkzx~*Hi*{)+L!LJ0}3nzOA;~Qr($Lt?FsR{(Qw`$xPtc<-VdW z6&yX*L%W^Tl>m)SmO%URJ?Uo|7&|#vSzjp_-&3cfdZ(_8M`0gL6_THFR)z}eukd^y za7cxG%=j;94Z}R%fn7ZO9sw-5x_Tf7=~F;`MJ?$hWgfSe<*P7OgnDvkq%hq`4NZcC zX42_`^5<-l`shOYt;jES`mZIR$EThN60n2K85d@%{P3V-O$hAP!|qETP5FgQjjY@k zi5I4#5io0bK0eVafHI3aT=jj;+$JyAll}}M z-Ke#XUkk$795VmP%g0sSFH|zsP1)u=pcGMgN(&hVmKeX*!1EQ;pYTjN}I(j{se9g{&TAM{y z>D1_ZACNtE=!{DiRNA9{trfKfMy7w8Ygb-|ZeB`+F$W|h#)VoR)Y;jawT;;i>`jhh zhyQjW%mWa9etz%}Gm|IOSor%#U!j<5L}J#!y>TjaRS(fY%fL9}Ai-}7L7PzSD||Cv zc@qMl2vJtXTHVILEzFoDUn+@Luq5?wVaCIat<7_u_{(7lDK1PHfRPCoUll0S%zQTk zzXkC9gN`I2Vvwyaud&Q#ZRWhyh5t3!$569`0~i^#-BM3#|4gXekTi*J)C|T7GKc1u zukO1k@$6IZeFVv~5a+oVd?SE!q|`YX6Y0d0@Nek69GZE#$7}T`bG)Q!V0S_nkKTPK zk?Bg1`ZTZ?(RBTV`IUV>kDsM64k-n2Z;|Ak^1xutP-yya2Av4P zv0xem;==*t_8`90^vd_2w-D${Fg{`8kAe-h_v3Lzj6v0XtN#OEx{d~h;D9jz0000< KMNUMnLSTZMbwteo literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_up_mic_ture.png b/app/src/main/res/drawable-xhdpi/icon_up_mic_ture.png new file mode 100644 index 0000000000000000000000000000000000000000..3b60b02ebcdacead6ae770827fe112e2e329c699 GIT binary patch literal 3255 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_up_mic_ture.webp b/app/src/main/res/drawable-xhdpi/icon_up_mic_ture.webp deleted file mode 100644 index 6cb277cc45528f34f10199f37b79699f2a0c2b63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1594 zcmV-A2F3YONk&F81^@t8MM6+kP&il$0000G0001Y004IY06|PpNCX4`00H;Kplu{a z?|gs$jPDzSh{(xD9&-^z5%c1fuRMy(2s6=Tk5cZtU%6#07RW8P{DQRGwhT#nS#I05 zZH;Z)wr$(fwymmaWmZJ|xl&eSyzdeHp8(+991@*WbMW%hU%fN)4q~0@`~B?7k=o># z5Q_xj)~BpGe)CJ8%v4kczTG*sCeMKrt9reV-(ZYclnFn^}7S#Xl(1ApKn)tS!^3$BRs(D{t1BHI(vr zk}}QG=~r1=30ynCG(Ns1NDI3BM+(!t^1MXP-ErVm0N5|NQlG3uRPVM3R$s3mP-!r!S=C%0dGV`ZuY-gAhLybe=i zt-=sgwyTgf%upQ7^vd{%A^FbiP1O_@)-7HH-KSX4kKvw`EHE^e>OC@iXNdkbda{9H zLbrS1|AV3066CIY5*O=wH>Pt07jnnXRb(qewmZR99mR%jboG{@`^iPzGCnKuP6rsm z#{fY87Neg=fcPGa#?k;Pr!lf^25G;Hk>jjnzC__>10DO{|Z!EL}FT-t)& z!3K&6-3}g_e`E6B;t7;5;~}pCkAv=0Ea<0j&!B!93)>FK3)4$1zL~+>^kE!EGr{|< z3I>k7pkmN{B0l;tLJi367vESpsH)p7z5{x70In)xbKC;eLmv^5kxwz|L0Y%SM)M^f zKivY!SXxAclc2>VH^K@G696FPg#B9_SZgH4Q24#-P3DQ zjUa9*ASNky!^s* z58Mv0-#`y6Pub6cFWVnQ7cWJeVfJt+rS2^4(OTya$}PUgi}XIM_ylPZt6a4aV~bh3 zpI=(AxKp2w%NtDn<(=*YDp3o4t}?F}D7ydv{_m{U?U{b*$xxP? zE@VS03S0>h`|o3(`am2lV^z%k=eXQ|^R4v+GN`ba07UJh4qsxZ<1Gmm96iW zW<$`ZmHzw|G+TWf>FAE$VGvL;7yl@VA^KNkeF6iiIDEj0($B~^1CpxraVXP~`%r-( zF<6t21~0)h5Uq6)X+K1u>VwWh+F$tmRpbpt1`KtfYJ1sNBOk~p{`=B#QFHie$-o+3 zmC4dhQwHa<_Ljy40v#*OIv0xd1c(K4X9>{muU5_h3IPO--XImg>XtFh2MyBCzYilP zN8Tz|WAX-~g9gcETLJD?yG;Ozh@aqI841?{EhAuu3jT;vuEEB!!>Jqd-*nQAT-@RO z8B_QPRr&8&;=c4zemQj3u<&!X_p-miWJAb@-{8(E{GgBmDlVV+$Z_7N3g=Vr;P~}jTa2N@o_*~V{Js*^%?Z6n1R88+VB7P1tp)PZ2zDD0929#&;S4c diff --git a/app/src/main/res/layout/activity_chat_room.xml b/app/src/main/res/layout/activity_chat_room.xml index db8d58624..1c5ef129c 100644 --- a/app/src/main/res/layout/activity_chat_room.xml +++ b/app/src/main/res/layout/activity_chat_room.xml @@ -22,7 +22,6 @@ android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:clipToPadding="true" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_chatroom_game_main.xml b/app/src/main/res/layout/fragment_chatroom_game_main.xml index 879a0aae3..c2c939083 100644 --- a/app/src/main/res/layout/fragment_chatroom_game_main.xml +++ b/app/src/main/res/layout/fragment_chatroom_game_main.xml @@ -30,10 +30,12 @@ android:layout_marginStart="@dimen/dp_5" android:layout_marginBottom="0dp" android:padding="10dp" + android:layout_marginTop="30dp" android:scaleType="fitCenter" android:src="@drawable/arrow_left_white" /> + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java index eaff81fc9..e2410243c 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java @@ -368,6 +368,6 @@ public class UriProvider { * @return */ public static String getDatingRule() { - return JAVA_WEB_URL.concat("/yinbao/modules/rules/dating-rule.html"); + return JAVA_WEB_URL.concat("/accompany/modules/rules/dating-rule.html"); } } diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index d281732a2..b099d4bcb 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -1634,6 +1634,7 @@ public final class IMNetEaseManager { ChatRoomQueueChangeAttachment roomQueueChangeAttachment = (ChatRoomQueueChangeAttachment) msg.getAttachment(); //麦上成员信息(uid...) key:坑位 ,content:{"nick":"行走的老者","uid":90972,"gender":1,"avatar":"https://image.zhongjialx.com/Fmtbprx5cGc3KABKjDxs_udJZb3O?imageslim"} String content = roomQueueChangeAttachment.getContent(); + LogUtil.print(content); String key = roomQueueChangeAttachment.getKey(); switch (roomQueueChangeAttachment.getChatRoomQueueChangeType()) { case DROP: diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java b/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java index 9e0a560bb..157cba5c5 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java @@ -3,6 +3,8 @@ package com.yizhuan.xchat_android_core; import com.yizhuan.xchat_android_constants.XChatConstants; import java.io.File; +import java.util.Arrays; +import java.util.List; /** *

常量集合

@@ -27,13 +29,12 @@ public class Constants { public static final String DYNAMIC_CACHE_DIR = ERBAN_DIR_NAME + File.separator + "dynamic"; - public static final String KEY_MAIN_POSITION = "key_main_position"; public static final int RESULT_OK = 200; public static final int PAGE_START = 1; - public static final int PAGE_SIZE =20; + public static final int PAGE_SIZE = 20; public static final int PAGE_HOME_HOT_SIZE = 12; public static final int BILL_PAGE_SIZE = 50; @@ -101,4 +102,7 @@ public class Constants { public static final byte TYPE_JOINED = 1; public static final byte TYPE_RECOMMEND = 2; public static final byte TYPE_ALL = 0; + + //相亲模式男神坑位下标 + public static final List maleIndex = Arrays.asList(0, 1, 4, 5); } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index 3b80e7793..5c22a1801 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -646,6 +646,15 @@ public final class AvRoomDataManager { return isRoomAdmin() || isRoomOwner(); } + /** + * 是否是房主或管理员 + * + * @return - + */ + public boolean isManager(String account) { + return isRoomAdmin(account) || isRoomOwner(account); + } + /** * 判断坑位是否被锁了 */ diff --git a/nim_uikit/src/com/netease/nim/uikit/common/util/log/LogUtil.java b/nim_uikit/src/com/netease/nim/uikit/common/util/log/LogUtil.java index 47dd6cd1f..b2e16f742 100644 --- a/nim_uikit/src/com/netease/nim/uikit/common/util/log/LogUtil.java +++ b/nim_uikit/src/com/netease/nim/uikit/common/util/log/LogUtil.java @@ -42,7 +42,7 @@ public class LogUtil extends NimLog { public static void print(String msg) { if (BasicConfig.INSTANCE.isDebuggable()) { - Log.e("mouse_debug", msg); + Log.d("mouse_debug", msg); } } From d7087a1779da27d9523bc6f954541f57a07c777d Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 26 Jan 2021 10:49:23 +0800 Subject: [PATCH 17/49] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=96=AD=E7=BD=91?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/IMNetEaseManager.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index b099d4bcb..44924cad1 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -30,6 +30,7 @@ import com.netease.nimlib.sdk.chatroom.model.ChatRoomMemberUpdate; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessageExtension; import com.netease.nimlib.sdk.chatroom.model.ChatRoomNotificationAttachment; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomPartClearAttachment; import com.netease.nimlib.sdk.chatroom.model.ChatRoomQueueChangeAttachment; import com.netease.nimlib.sdk.chatroom.model.ChatRoomStatusChangeData; import com.netease.nimlib.sdk.chatroom.model.MemberOption; @@ -671,6 +672,8 @@ public final class IMNetEaseManager { if (attachment == null) continue; if (attachment.getType() == NotificationType.ChatRoomQueueChange) { chatRoomQueueChangeNotice(msg); + } else if (attachment.getType() == NotificationType.ChatRoomQueueBatchChange) { + chatRoomQueueBatchChange(msg); } else if (attachment.getType() == NotificationType.ChatRoomInfoUpdated) { //房间信息更新 chatRoomInfoUpdate(msg); @@ -1510,26 +1513,11 @@ public final class IMNetEaseManager { noticeRoomMemberChange(false, account); RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; if (mCurrentRoomInfo == null) return; - if (AvRoomDataManager.get().isOnMic(Long.valueOf(account))) { - //在麦上的要退出麦,这里云信已经在队列上清理了,这边不需要调用,改别人的麦信息 - - SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; - int size = mMicQueueMemberMap.size(); - for (int i = 0; i < size; i++) { - RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); - if (roomQueueInfo.mChatRoomMember != null - && Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), account)) { - roomQueueInfo.mChatRoomMember = null; - noticeDownMic(String.valueOf(mMicQueueMemberMap.keyAt(i)), account); - break; - } - } - } ChatRoomMember removeChatMember = null; boolean isAdmin = false; ListIterator iterator = AvRoomDataManager.get().mRoomAllMemberList.listIterator(); - for (; iterator.hasNext(); ) { + while (iterator.hasNext()) { removeChatMember = iterator.next(); if (Objects.equals(removeChatMember.getAccount(), account)) { if (removeChatMember.getMemberType() == MemberType.ADMIN) { @@ -1544,7 +1532,6 @@ public final class IMNetEaseManager { // 这里要清理调退出房间的PK 队员 PkModel.get().onTeamMemberExitRoom(account); - noticePKInfo(); } /** @@ -1679,6 +1666,24 @@ public final class IMNetEaseManager { } } + /** + * 在麦位的用户退出房间处理退出房间 + * 标题:关于聊天室队列变更通知的特别说明 + * 链接:https://faq.yunxin.163.com/#KB0361 + */ + private void chatRoomQueueBatchChange(ChatRoomMessage msg) { + if (msg.getAttachment() instanceof ChatRoomPartClearAttachment) { + ChatRoomPartClearAttachment clearAttachment = (ChatRoomPartClearAttachment) msg.getAttachment(); + Map contentMap = clearAttachment.getContentMap(); + if (contentMap != null) { + //LogUtils.d(Arrays.toString(clearAttachment.getContentMap().entrySet().toArray())); + for (String key : contentMap.keySet()) { + downMicroQueue(key); + } + } + } + } + /** * 进入聊天室 */ From 6b077cc39a0597685aeb784e0615884db91193a2 Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 26 Jan 2021 16:20:48 +0800 Subject: [PATCH 18/49] =?UTF-8?q?1.=E6=88=BF=E9=97=B4=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=B4=E9=A5=B0=E5=AD=97=E6=AE=B5,?= =?UTF-8?q?=E6=96=B0=E7=89=88=E5=BC=80=E5=A7=8B=E4=BC=98=E5=85=88=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E9=98=9F=E5=88=97=E5=AD=97=E6=AE=B5=202.=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=BA=86=E4=B8=80=E4=BA=9B=E6=97=A0=E7=94=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/ButtonItemFactory.java | 45 ---- .../avroom/adapter/BaseMicroViewAdapter.java | 10 +- .../erban/avroom/dialog/MicQueueDialog.java | 2 +- .../avroom/presenter/HomePartyPresenter.java | 7 - .../erban/avroom/widget/MicroView.java | 2 + .../erban/ui/widget/UserInfoDialog.java | 2 - .../main/res/layout/layout_official_mask.xml | 2 +- .../manager/IMNetEaseManager.java | 61 +----- .../xchat_android_core/noble/NobleUtil.java | 198 +----------------- .../room/model/RoomBaseModel.java | 11 +- .../room/queue/bean/MicMemberInfo.java | 1 + .../user/bean/BaseInfo.java | 6 + .../user/bean/UserInfo.java | 8 - 13 files changed, 35 insertions(+), 320 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java b/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java index efcd597cc..ad56417b7 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/ButtonItemFactory.java @@ -298,51 +298,6 @@ public class ButtonItemFactory { }); } - /** - * 抱Ta下麦 用户卡片 - */ - public static ViewItem createKickDownMicItem(final String account, String nick) { - return new ViewItem(BasicConfig.INSTANCE.getAppContext().getString(R.string.embrace_down_mic), - () -> { - if (AvRoomDataManager.get().isOnMic(Long.valueOf(account))) { - int micPosition = AvRoomDataManager.get().getMicPosition(Long.valueOf(account)); - RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(micPosition); - if (roomQueueInfo != null) { - String level = (String) NobleUtil.getResource(NobleResourceType.KEY_LEVEL, roomQueueInfo.mChatRoomMember); - String name = NobleUtil.getNobleName(level); - if (!NobleUtil.canKickMicroOrNot(level)) { - // 如果不能被踢下麦,则直接返回 -// Toast.makeText(BasicConfig.INSTANCE.getAppContext(), "不能踢" + name + "陛下哦", Toast.LENGTH_SHORT).show(); - SingleToastUtil.showToastShort("不能踢" + name + "陛下哦"); - return; - } - } - IMNetEaseManager.get().downMicroPhoneBySdk(micPosition, null); - - RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; - if (roomInfo != null) { - IMNetEaseManager.get().kickMicroPhoneBySdk(Long.valueOf(account), nick, - roomInfo.getRoomId()).subscribe(chatRoomMessage -> - KickModel.get().sendMessage(chatRoomMessage) - , throwable -> throwable.printStackTrace()); - } - } - - - }); - } - - /** - * 送装扮 - */ - public static ViewItem createSendDecorationItem(final Context context, final long uid) { - return new ViewItem("送装扮", R.drawable.icon_dialog_send_decaration, () -> { - StatisticManager.Instance().onEvent(StatisticsProtocol.Event.data_card_decoration_send_click, "资料卡片-送装扮"); - - DecorationStoreActivity.start(context, uid); - }); - } - /** * 关注or取消 */ 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 6f6e825fd..9abd5c3fe 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 @@ -240,9 +240,15 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter { } } - // 第一次进房,离开模式下更新本地房主位ui -// UserModel.get().getUserInfo(AvRoomDataManager.get().getRoomUid()).subscribe((userInfo, throwable) -> { -// if (userInfo != null && AvRoomDataManager.get().mCurrentRoomInfo != null && AvRoomDataManager.get().mCurrentRoomInfo.isLeaveMode()) { -// IMNetEaseManager.get().sendLeaveModeEvent(userInfo.getNick(), userInfo.getGender(), userInfo.getAvatar()); -// } -// }); - } } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java index 4e51590cd..2fc65d03d 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java @@ -1,5 +1,6 @@ package com.yizhuan.erban.avroom.widget; +import android.annotation.SuppressLint; import android.content.Context; import androidx.databinding.DataBindingUtil; import android.graphics.Point; @@ -290,6 +291,7 @@ public class MicroView extends RelativeLayout { mBinding.tvRoomType.setText(roomInfo.getRoomTag()); } + @SuppressLint("CheckResult") public void onSpeakQueueUpdate(List positions) { int count = recyclerView.getChildCount(); for (int i = 0; i < positions.size(); i++) { diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java index d8914aa36..21b81d00f 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java @@ -573,7 +573,6 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private void setNamePlate(String nameplatePic, String nameplateWord) { if (!TextUtils.isEmpty(nameplateWord) && !TextUtils.isEmpty(nameplatePic)) { - inNamePlate.setVisibility(View.VISIBLE); inNamePlate.setVisibility(View.VISIBLE); TextView tvNamePlate; tvNamePlate = inNamePlate.findViewById(R.id.tv_official_mask); @@ -594,7 +593,6 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe private void setOfficialMask(String name, String icon) { if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(icon)) { - inOfficialMask.setVisibility(View.VISIBLE); inOfficialMask.setVisibility(View.VISIBLE); TextView tvOfficialMask; tvOfficialMask = inOfficialMask.findViewById(R.id.tv_official_mask); diff --git a/app/src/main/res/layout/layout_official_mask.xml b/app/src/main/res/layout/layout_official_mask.xml index 7a1aea7f4..557fe2c00 100644 --- a/app/src/main/res/layout/layout_official_mask.xml +++ b/app/src/main/res/layout/layout_official_mask.xml @@ -6,7 +6,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="20dp" - android:visibility="gone" + android:visibility="visible" tools:visibility="visible"> 0) { for (int j = 0; j < size; j++) { @@ -1975,6 +1974,12 @@ public final class IMNetEaseManager { noticeDownCrowdedMic(micPosition, tempRoomQueueInfo.mChatRoomMember.getAccount()); } + if (extension == null) { + ChatRoomMember cacheChatRoomMember = AvRoomDataManager.get().getChatRoomMember(chatRoomMember.getAccount()); + if (cacheChatRoomMember != null && cacheChatRoomMember.getExtension() != null) { + extension = cacheChatRoomMember.getExtension(); + } + } chatRoomMember.setExtension(extension); roomQueueInfo.mChatRoomMember = chatRoomMember; // 这个人上麦后,恢复之前他因为是黑麦被禁言 @@ -2399,60 +2404,6 @@ public final class IMNetEaseManager { return sendChatRoomMessage(message, false); } - /** - * 关闭房间礼物特效 - * - * @param roomId 聊天室 id - */ - public Single updateRedPackageSwitch(final long roomId) { - RoomInfoAttachment queueMsgAttachment = new RoomInfoAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, - CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_REDPACKAGE); - queueMsgAttachment.roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; - ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( - String.valueOf(roomId), queueMsgAttachment); - return sendChatRoomMessage(message, false); - } - - /** - *

下麦

- * 云信聊天室队列服务:加入或者更新队列元素,支持当用户掉线或退出聊天室后,是否删除这个元素 - *

roomId - 聊天室id

- *

key - 新元素(或待更新元素)的唯一键

- *

value - 新元素(待待更新元素)的内容

- *

isTransient - (可选参数,不传默认false)。true表示当提交这个新元素的用户从聊天室掉线或退出的时候,需要删除这个元素;默认false表示不删除

- * - * @param micPosition - - */ - public Single updateQueueEx(final long roomId, final int micPosition, final String value) { - return Single.create(new SingleOnSubscribe() { - @Override - public void subscribe(SingleEmitter e) throws Exception { - NIMChatRoomSDK.getChatRoomService().updateQueueEx( - String.valueOf(roomId), - String.valueOf(micPosition), - value, - true - ) - .setCallback(new RequestCallback() { - @Override - public void onSuccess(Void param) { - e.onSuccess(true); - } - - @Override - public void onFailed(int code) { - e.onError(new Exception("错误码: " + code)); - } - - @Override - public void onException(Throwable exception) { - e.onError(exception); - } - }); - } - }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); - } - /** * 邀请上麦的自定义消息 * diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java b/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java index 6f4ae7dd2..147fa71ff 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/noble/NobleUtil.java @@ -11,14 +11,13 @@ import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; - -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; - import android.text.TextUtils; import android.view.View; import android.widget.ImageView; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; + import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; @@ -42,7 +41,6 @@ import java.io.FileNotFoundException; import java.lang.reflect.Field; import java.util.List; import java.util.Map; -import java.util.Random; /** * @author xiaoyu @@ -229,33 +227,6 @@ public class NobleUtil { }).submit(); } - public static void loadStoreHeadWear(String url, ImageView imageView) { - GlideApp.with(BasicConfig.INSTANCE.getAppContext()) - .asBitmap() - .dontAnimate() - .dontTransform() - .load(url) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - return false; - } - - @Override - public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - List split = ImageSplitter.split(resource); - AnimationDrawable animationDrawable = new AnimationDrawable(); - for (int i = 0; i < split.size(); i++) { - animationDrawable.addFrame(split.get(i), 200); - } - imageView.setImageDrawable(animationDrawable); - animationDrawable.setOneShot(false); - animationDrawable.start(); - return false; - } - }).submit(); - } - public static int getNobleRightItemCounts(int level) { NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); if (nobleRight == null) return 0; @@ -302,16 +273,6 @@ public class NobleUtil { return Color.argb(255, rColor, gColor, bColor); } - public static int getRandomColor() { - if (!BasicConfig.INSTANCE.isDebuggable()) return 0; - String[] colors = new String[4]; - colors[0] = "#767BFC"; - colors[1] = "#9E64F9"; - colors[2] = "#E43B57"; - colors[3] = "#FF9622"; - return getColor(colors[new Random().nextInt(colors.length)]); - } - /** * 补全贵族字段的信息 * 贵族的banner @@ -343,13 +304,6 @@ public class NobleUtil { return userInfo; } - public static UserInfo setRandomMockNobleInfo(UserInfo userInfo) { - if (!BasicConfig.INSTANCE.isDebuggable()) return userInfo; - int nobleCounts = NobleDataManager.get().getNobleCounts(); - Random random = new Random(); - int level = random.nextInt(nobleCounts + 1); - return setMockNobleInfo(userInfo, level); - } public static String getBadgeByLevel(int level) { NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); @@ -407,82 +361,6 @@ public class NobleUtil { return names.get(0); } - - private static String getRandomNobleResource(List names) { - if (ListUtils.isListEmpty(names)) return ""; - Random random = new Random(); - int num = random.nextInt(names.size()); - return names.get(num); - } - - private static UserInfo setMockNobleInfo(UserInfo userInfo, int level) { - if (!BasicConfig.INSTANCE.isDebuggable()) return userInfo; - NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); - if (nobleConfig == null) return userInfo; - userInfo = new UserInfo(userInfo); - NobleInfo nobleInfo = new NobleInfo(); - nobleInfo.setLevel(level); - nobleInfo.setBadge(getBiggerBadge(nobleConfig.getBadge(), level)); - // 设置卡片背景 - nobleInfo.setCardBg(getRandomNobleResource(nobleConfig.getCardBg())); - // 设置空间背景 - nobleInfo.setZoneBg(getRandomNobleResource(nobleConfig.getZoneBg())); - // 设置开通的特效,现在默认都是banner - nobleInfo.setOpenEffect(getRandomNobleResource(nobleConfig.getBanner())); - nobleInfo.setBanner(getRandomNobleResource(nobleConfig.getBanner())); - // 设置头饰 - nobleInfo.setHeadWear(getRandomNobleResource(nobleConfig.getHeadWear())); - nobleInfo.setHalo(getRandomNobleResource(nobleConfig.getHalo())); - nobleInfo.setBubble(getRandomNobleResource(nobleConfig.getBubble())); - userInfo.setNobleInfo(nobleInfo); - return userInfo; - } - - public static NobleInfo getMockNobleInfo() { - if (!BasicConfig.INSTANCE.isDebuggable()) return null; - NobleInfo nobleInfo = new NobleInfo(); - nobleInfo.setLevel(7); - nobleInfo.setBadge("badge_13"); - nobleInfo.setCardBg("https://image.zhongjialx.com/cardbg_7.png"); - nobleInfo.setZoneBg("https://image.zhongjialx.com/zonebg_7.png"); - nobleInfo.setOpenEffect("banner_7"); - nobleInfo.setBanner("banner_7"); - nobleInfo.setHeadWear("headwear_4"); - nobleInfo.setHalo("#FF9622"); - nobleInfo.setBubble("bubble_4.9_android"); -// return nobleInfo; - - int nobleCounts = NobleDataManager.get().getNobleCounts(); - Random random = new Random(); - int level = random.nextInt(nobleCounts + 1); - NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); - if (nobleConfig == null) return nobleInfo; - nobleInfo.setLevel(level); - nobleInfo.setBadge(getBiggerBadge(nobleConfig.getBadge(), level)); - // 设置卡片背景 - nobleInfo.setCardBg(getRandomNobleResource(nobleConfig.getCardBg())); - // 设置空间背景 - nobleInfo.setZoneBg(getRandomNobleResource(nobleConfig.getZoneBg())); - // 设置开通的特效,现在默认都是banner - nobleInfo.setOpenEffect(getRandomNobleResource(nobleConfig.getBanner())); - nobleInfo.setBanner(getRandomNobleResource(nobleConfig.getBanner())); - // 设置头饰 - nobleInfo.setHeadWear(getRandomNobleResource(nobleConfig.getHeadWear())); - nobleInfo.setHalo(getRandomNobleResource(nobleConfig.getHalo())); - nobleInfo.setBubble(getRandomNobleResource(nobleConfig.getBubble())); - return nobleInfo; - } - - public static String getRandomBubble() { - String[] bubbles = new String[4]; - bubbles[0] = "bubble_1.9"; - bubbles[1] = "bubble_2.9"; - bubbles[2] = "bubble_3.9"; - bubbles[3] = "bubble_4.9"; - return bubbles[new Random().nextInt(bubbles.length)]; - } - - public static void loadResource(final Context context, String name, View view) { String resourcePath = NobleDataManager.get().getResourcePath(); if (TextUtils.isEmpty(resourcePath) || TextUtils.isEmpty(name)) return; @@ -572,20 +450,6 @@ public class NobleUtil { return map.get(type); } - public static String getHeadResource(String type, ChatRoomMember chatRoomMember) { - Object o; - if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount()) - || chatRoomMember.getExtension() == null - || (o = chatRoomMember.getExtension().get(chatRoomMember.getAccount())) == null) - return ""; - Map map = (Map) o; - if (map.get(type) instanceof Integer || map.get(type) instanceof Long || - map.get(type) instanceof Float || map.get(type) instanceof Double) { - return String.valueOf(map.get(type)); - } - return (String) map.get(type); - } - public static String getHeadResource(String type, MicMemberInfo chatRoomMember) { Object o; if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount()) @@ -933,20 +797,6 @@ public class NobleUtil { return nobleRight.getName(); } - /** - * 贵族剩下日期 - * - * @param expire - - * @return 天数 - */ - public static int getNobleExpire(long expire) { - long now = System.currentTimeMillis(); - if (now > expire) return 0; - long dis = expire - now; - float days = ((float) dis) / (3600 * 1000 * 24); - return (int) Math.ceil(days); - } - /** * 判断该等级的贵族能否被踢下麦 * @@ -985,36 +835,6 @@ public class NobleUtil { } - public static boolean canShowHaloOrNot(ChatRoomMember chatRoomMember) { - if (chatRoomMember == null) return false; - String account = chatRoomMember.getAccount(); - if (TextUtils.isEmpty(account)) return false; - return canShowHaloOrNot(Integer.valueOf(account)); - } - - /** - * 能不能显示光晕 - * - * @param level -贵族等级 - * @return - - */ - public static boolean canShowHaloOrNot(int level) { - if (level <= 0) return false; - NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); - if (nobleRight == null) return false; - return nobleRight.isMicHalo(); - } - - /** - * 该等级的贵族是否有进场欢迎 - * - * @param level 贵族等级 - * @return - - */ - public static boolean canShowEnterRoomWelcome(String level) { - if (TextUtils.isEmpty(level)) return false; - return canShowEnterRoomWelcome(Integer.valueOf(level)); - } /** * 该等级的贵族是否有进场欢迎 @@ -1029,16 +849,4 @@ public class NobleUtil { return nobleRight.isEnterNotice(); } - /** - * 得到皇帝的推荐tag - * - * @return - - */ - public static String getEmperorRecommendTag(int level) { - NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); - if (nobleConfig == null) return ""; - List recommend = nobleConfig.getRecommend(); - if (ListUtils.isListEmpty(recommend)) return ""; - return recommend.get(0); - } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java index 589b6e9d7..da87f174b 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java @@ -26,12 +26,12 @@ import com.yizhuan.xchat_android_core.base.BaseModel; import com.yizhuan.xchat_android_core.bean.RoomMicInfo; import com.yizhuan.xchat_android_core.bean.RoomQueueInfo; import com.yizhuan.xchat_android_core.bean.response.ServiceResult; +import com.yizhuan.xchat_android_core.decoration.headwear.bean.HeadWearInfo; import com.yizhuan.xchat_android_core.exception.ErrorThrowable; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.room.activitytimer.TimerBean; -import com.yizhuan.xchat_android_core.room.bean.ActivityInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.bean.RoomResult; import com.yizhuan.xchat_android_core.room.bean.RoomSettingTabInfo; @@ -55,7 +55,6 @@ import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import java.util.ArrayList; import java.util.List; -import java.util.Map; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; @@ -68,7 +67,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; import retrofit2.http.Field; -import retrofit2.http.FieldMap; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; @@ -608,6 +606,13 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { contentJsonObj.put("avatar", userInfo.getAvatar()); contentJsonObj.put("gender", userInfo.getGender()); contentJsonObj.put("groupType", userInfo.getGroupType()); + HeadWearInfo headWearInfo = userInfo.getUserHeadwear(); + if (headWearInfo != null) { + String headWearUrl = headWearInfo.getEffect() != null ? headWearInfo.getEffect() : headWearInfo.getPic(); + if (!TextUtils.isEmpty(headWearUrl)){ + contentJsonObj.put("headWearUrl", headWearUrl); + } + } NIMChatRoomSDK.getChatRoomService() .updateQueueEx(roomId, String.valueOf(micPosition), contentJsonObj.toJSONString(), true) .setCallback(new RequestCallback() { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java index 247bd2990..ecbdac1de 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java @@ -19,6 +19,7 @@ public class MicMemberInfo { private String avatar; private String nick; private int micPosition; + private String headWearUrl; private boolean isRoomOwnner; private boolean isAllMember = false; //添加性别信息,在礼物面板显示 diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/BaseInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/BaseInfo.java index 1c5bb75b0..81d820808 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/BaseInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/BaseInfo.java @@ -38,6 +38,12 @@ public class BaseInfo { this.nick = nick; } + public BaseInfo(long uid, String nick, int groupType) { + this.uid = uid; + this.nick = nick; + this.groupType = groupType; + } + public String getNick() { if (nick == null) { nick = ""; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java index e0d71207d..a088f8ecc 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/user/bean/UserInfo.java @@ -538,14 +538,6 @@ public class UserInfo implements Serializable { this.userHeadwear = userHeadwear; } - public Map toMap(Map map) { - if (map == null) { - map = new HashMap<>(); - } - map.put(IS_NEW_USER, isNewUser()); - return map; - } - public Map toMap(@Nullable Map map, UserInfo userInfo) { if (map == null) { map = new HashMap<>(); From 2153648abbd69fb32e7b3b7e9ff8b4df2045e458 Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 26 Jan 2021 19:03:04 +0800 Subject: [PATCH 19/49] =?UTF-8?q?=E9=80=81=E7=A4=BC=E7=89=A9=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E4=BD=8D=E7=BD=AE=E8=AE=A1=E7=AE=97=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/BaseMicroViewAdapter.java | 21 --- .../erban/avroom/widget/GiftV2View.java | 2 - .../erban/avroom/widget/MicroView.java | 134 ++++++------------ app/src/main/res/layout/dialog_user_info.xml | 4 +- app/src/main/res/layout/item_boss_micro.xml | 82 +++++------ .../res/layout/item_micro_dating_boss.xml | 9 -- .../xchat_android_core/UriProvider.java | 2 +- .../manager/IMNetEaseManager.java | 7 +- .../xchat_android_core/utils/LogUtils.java | 124 ++++++++++++++++ 9 files changed, 210 insertions(+), 175 deletions(-) create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/utils/LogUtils.java 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 9abd5c3fe..b714f7fbe 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 @@ -477,9 +477,6 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter faceImageViews; @@ -72,8 +78,8 @@ public class MicroView extends RelativeLayout { private KtvView ktvView; private LayoutMicroViewBinding mBinding; - /**状态栏高度*/ - private int statusBarHeight = 0; + + private boolean isNeedResetMicCenterPoint = true; public MicroView(Context context) { this(context, null); @@ -102,8 +108,6 @@ public class MicroView extends RelativeLayout { super.onAttachedToWindow(); EventBus.getDefault().register(this); subMsg(); - /*mDisposable.add(CoreManager.getCore(IFaceCore.class).getChatRoomMsgFlowable() - .subscribe(this::onReceiveFace));*/ } private void subMsg() { @@ -160,37 +164,30 @@ public class MicroView extends RelativeLayout { faceAnima(faceReceiveInfos, true, needAnim, needResult, needGone); } - /** - * 根据位置获取想要的表情view的宽高 - */ - private int getFaceSize(int i) { - int dp; - if (isKtvMode) { - if (i == 4) {//ktv模式boss麦位置 - dp = 55; - } else { - dp = 45; - } - } else { - if (i == 0) {//普通模式boss麦位置 - dp = 65; - } else { - dp = 55; - } + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + //高度和位置都没发生变化,就没必要要reset了 + if (top == oldTop && bottom == oldBottom) return; + if (isNeedResetMicCenterPoint) {//这里有时候会重复调用,简单处理下(都是在500毫秒内重复调用的) + isNeedResetMicCenterPoint = false; + recyclerView.post(() -> { + isNeedResetMicCenterPoint = true; + faceImageViews = setMicCenterPoint(faceImageViews); + if (AvRoomDataManager.get().hasDragonGame()) { + dragonBarImageViews = setMicCenterPoint(dragonBarImageViews); + } + }); } - //放大4/3倍 - return UIUtil.dip2px(mContext, dp * 4 / 3); } - public SparseArray setMicCenterPoint() { - SparseArray array = new SparseArray<>(9); + public SparseArray setMicCenterPoint(SparseArray array) { + if (array == null) array = new SparseArray<>(9); SparseArray centerPoints = new SparseArray<>(); // 算出每一个麦位的位置 int childCount = recyclerView.getChildCount(); View child; for (int i = 0; i < childCount; i++) { child = recyclerView.getChildAt(i); - int position = getRealPosition(i); int[] location = new int[2]; // 找到头像 View view = child.findViewById(R.id.micro_layout); @@ -198,26 +195,25 @@ public class MicroView extends RelativeLayout { child.getLocationInWindow(location); int x = (location[0] + child.getWidth() / 2) - giftWidth / 2; int y = (location[1] + child.getHeight() / 2) - giftHeight / 2; - //修复礼物落点偏下的问题,减去状态栏高度,沉浸式版本开始的bug - //原因:是因为这个位置计算出来是屏幕最开始0开始的 - //但是giftV2View的位置,是相对于状态栏高度开始的 - y = y - statusBarHeight; // 放置表情占位image view - int faceSize = getFaceSize(i); - if (array.get(position - 1) == null) { - LayoutParams params = new LayoutParams(faceSize, faceSize); - child.getLocationInWindow(location); - int[] containerLocation = new int[2]; - this.getLocationInWindow(containerLocation); - params.leftMargin = ((location[0] - containerLocation[0] + child.getWidth() / 2) - faceSize / 2); - params.topMargin = ((location[1] - containerLocation[1] + child.getHeight() / 2) - faceSize / 2); - ImageView face = new ImageView(mContext); + ImageView face = array.get(i - 1); + LayoutParams params = new LayoutParams(giftHeight, giftHeight); + child.getLocationInWindow(location); + int[] containerLocation = new int[2]; + this.getLocationInWindow(containerLocation); + params.leftMargin = ((location[0] - containerLocation[0] + child.getWidth() / 2) - giftHeight / 2); + params.topMargin = ((location[1] - containerLocation[1] + child.getHeight() / 2) - giftHeight / 2); + //如果不为空,只改变View的位置就行了 + if (face == null) { + face = new ImageView(mContext); + array.put(i - 1, face); face.setLayoutParams(params); - array.put(position - 1, face); addView(face); + } else { + face.setLayoutParams(params); } Point point = new Point(x, y); - centerPoints.put(position - 1, point); + centerPoints.put(i - 1, point); } AvRoomDataManager.get().mMicPointMap = centerPoints; return array; @@ -232,6 +228,7 @@ public class MicroView extends RelativeLayout { inflate(mContext, R.layout.layout_micro_view, this); mBinding = DataBindingUtil.bind(findViewById(R.id.container)); recyclerView = findViewById(R.id.recycler_view); + recyclerView.addOnLayoutChangeListener(this); if (AvRoomDataManager.get().isCpRoom()) { bindAdapter(new CpMicroViewAdapter(mContext)); } else { @@ -241,20 +238,6 @@ public class MicroView extends RelativeLayout { ViewGroup.LayoutParams ktvParam = ktvView.getLayoutParams(); ktvParam.height = (UIUtil.getScreenWidth(context) - UIUtil.dip2px(context, 24)) * 198 / 352; -// recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { -// @Override -// public void onGlobalLayout() { -// recyclerView.postDelayed(() -> { -// dragonBarImageViews = setMicCenterPoint(); -// faceImageViews = setMicCenterPoint(); -// }, 500); -// recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); -// } -// }); -// -// MicroViewAdapter adapter = new MicroViewAdapter(mContext); -// adapter.bindToRecyclerView(recyclerView); - giftWidth = UIUtil.dip2px(mContext, 80); giftHeight = UIUtil.dip2px(mContext, 80); @@ -263,8 +246,6 @@ public class MicroView extends RelativeLayout { mBinding.setRoomInfo(AvRoomDataManager.get().mCurrentRoomInfo); - statusBarHeight = TitleBar.getStatusBarHeight(); - } public void updateRoomInfo() { @@ -412,46 +393,21 @@ public class MicroView extends RelativeLayout { } public void resetPoint() { - recyclerView.postDelayed(() -> { - removeFaceAndDragonView(faceImageViews); - removeFaceAndDragonView(dragonBarImageViews); - faceImageViews = setMicCenterPoint(); - dragonBarImageViews = setMicCenterPoint(); - }, 500); - } - - private void removeFaceAndDragonView(SparseArray array) { - if (array == null) { - return; - } - for (int i = 0; i < array.size(); i++) { - int key = array.keyAt(i); - ImageView view = array.get(key); - if (view == null) { - continue; - } - view.setImageDrawable(null); - view.clearAnimation(); - if (this == view.getParent()) { - removeView(view); - } - } + /* recyclerView.postDelayed(() -> { + faceImageViews = setMicCenterPoint(faceImageViews); + dragonBarImageViews = setMicCenterPoint(dragonBarImageViews); + }, 500);*/ } public void bindAdapter(BaseMicroViewAdapter adapter) { adapter.bindToRecyclerView(recyclerView); adapter.setOnMicroItemClickListener(onMicroItemClickListener); - recyclerView.postDelayed(() -> { - removeFaceAndDragonView(faceImageViews); - removeFaceAndDragonView(dragonBarImageViews); - faceImageViews = setMicCenterPoint(); - dragonBarImageViews = setMicCenterPoint(); - }, 500); + resetPoint(); } public void closeKtvMode() { isKtvMode = false; - mBinding.setKtvModel(isKtvMode); + mBinding.setKtvModel(false); ktvView.setVisibility(GONE); if (AvRoomDataManager.get().isCpRoom()) { bindAdapter(new CpMicroViewAdapter(mContext)); diff --git a/app/src/main/res/layout/dialog_user_info.xml b/app/src/main/res/layout/dialog_user_info.xml index ce1560f24..f5a563fb2 100644 --- a/app/src/main/res/layout/dialog_user_info.xml +++ b/app/src/main/res/layout/dialog_user_info.xml @@ -324,10 +324,12 @@ + tools:visibility="visible" /> + tools:visibility="visible" /> + android:visibility="visible" + tools:text="红队" /> + android:gravity="center_vertical"> - + android:layout_height="15dp" + android:layout_marginRight="5dp" /> - - - - - - - + android:ellipsize="end" + android:gravity="center_vertical" + android:maxWidth="120dp" + android:maxLines="1" + android:singleLine="true" + android:text="" + android:textColor="@color/white" + android:textSize="13sp" + tools:text="我是名字" + tools:textColor="#000" /> + app:layout_constraintTop_toTopOf="@id/view_center_of_charm"> \ No newline at end of file diff --git a/app/src/main/res/layout/item_micro_dating_boss.xml b/app/src/main/res/layout/item_micro_dating_boss.xml index da9ac0aed..7064e0976 100644 --- a/app/src/main/res/layout/item_micro_dating_boss.xml +++ b/app/src/main/res/layout/item_micro_dating_boss.xml @@ -123,15 +123,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/micro_layout"> - - Date: Wed, 27 Jan 2021 18:12:04 +0800 Subject: [PATCH 20/49] =?UTF-8?q?=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=A6=81=E6=AD=A2=E5=85=B3=E9=97=AD=E7=A4=BC=E7=89=A9=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 03d8fc388..01d74da86 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -2286,6 +2286,10 @@ public class HomePartyRoomFragment extends BaseMvpFragment Date: Thu, 28 Jan 2021 10:44:46 +0800 Subject: [PATCH 21/49] =?UTF-8?q?=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=99=90=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/dialog/RoomOperationDialog.java | 31 ++++++++----------- .../room/bean/RoomInfo.java | 2 ++ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java index e1483eb3e..ede797abf 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java @@ -105,7 +105,6 @@ public class RoomOperationDialog extends BottomSheetDialog { } - private void addGameAction(OptAdapter optAdapter) { if (SuperAdminUtil.isSuperAdmin()) { return; @@ -123,8 +122,6 @@ public class RoomOperationDialog extends BottomSheetDialog { } - - /** * PK 模式 * @@ -145,14 +142,9 @@ public class RoomOperationDialog extends BottomSheetDialog { int icon = AvRoomDataManager.get().isOpenPKMode() ? R.drawable.ic_room_opt_op_pk : R.drawable.ic_room_opt_in_pk; - optAdapter.addData(new OptAction(icon, - str, - new OptAction.OnAction() { - @Override - public void onAction() { - if (onActionListener != null) { - onActionListener.onPKAction(); - } + optAdapter.addData(new OptAction(icon, str, () -> { + if (onActionListener != null) { + onActionListener.onPKAction(); } })); } @@ -173,15 +165,18 @@ public class RoomOperationDialog extends BottomSheetDialog { if (roomInfo == null) { return; } - String str = AvRoomDataManager.get().isDatingMode() ? "相亲中..." :"相亲模式"; + if (!roomInfo.isCanOpenBlindDate()) { + return; + } + String str = AvRoomDataManager.get().isDatingMode() ? "相亲中..." : "相亲模式"; int icon = AvRoomDataManager.get().isDatingMode() ? R.drawable.ic_room_opt_op_dating : R.drawable.ic_room_opt_in_dating; optAdapter.addData(new OptAction(icon, str, () -> { - if (onActionListener != null) { - onActionListener.onDatingAction(); - } - })); + if (onActionListener != null) { + onActionListener.onDatingAction(); + } + })); } } @@ -314,13 +309,13 @@ public class RoomOperationDialog extends BottomSheetDialog { } @SuppressLint("CheckResult") - private void addRedPackageSwitch(){ + private void addRedPackageSwitch() { if (!AvRoomDataManager.get().isManager()) { return; } boolean getIsShowRedPackage = AvRoomDataManager.get().isOpenRedPackage(); - LogUtils.e("getIsShowRedPackage:"+getIsShowRedPackage); + LogUtils.e("getIsShowRedPackage:" + getIsShowRedPackage); String text = getIsShowRedPackage ? context.getResources().getString(R.string.close_redpackage_notice) : context.getResources().getString(R.string.open_redpackage_notice); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java index c5d3bc835..35cc7db60 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomInfo.java @@ -179,6 +179,8 @@ public class RoomInfo implements Parcelable,Serializable { */ private String blindDateState = ""; + private boolean canOpenBlindDate; + // /** // * 房间角标 // */ From e721b7d180c55aa187ac59fab1c0ca0c2efb17b1 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 28 Jan 2021 15:59:48 +0800 Subject: [PATCH 22/49] =?UTF-8?q?1.=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8FUI?= =?UTF-8?q?=E8=B0=83=E6=95=B4=202.=E5=85=AC=E5=B1=8FUI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomePartyRoomFragment.java | 6 ++-- .../erban/avroom/widget/MessageView.java | 29 +++++++----------- .../drawable-xhdpi/bg_dating_man_selected.png | Bin 2581 -> 2634 bytes .../res/drawable-xhdpi/bg_dating_step.png | Bin 4358 -> 4064 bytes .../drawable-xhdpi/bg_dating_unselected.png | Bin 1644 -> 1622 bytes .../bg_dating_woman_selected.png | Bin 2624 -> 2703 bytes .../drawable-xhdpi/icon_room_mute_micro.png | Bin 0 -> 1434 bytes .../drawable-xhdpi/icon_room_mute_micro.webp | Bin 640 -> 0 bytes .../res/drawable/selector_dating_step.xml | 2 +- .../drawable/shape_circle_micro_man_bg.xml | 2 +- .../drawable/shape_circle_micro_woman_bg.xml | 2 +- .../res/drawable/shape_room_message_bg.xml | 2 +- .../res/layout/item_micro_dating_boss.xml | 24 +++++++-------- app/src/main/res/values/colors.xml | 2 ++ .../res/layout/fragment_av_room_game.xml | 6 +++- 15 files changed, 37 insertions(+), 38 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/icon_room_mute_micro.png delete mode 100644 app/src/main/res/drawable-xhdpi/icon_room_mute_micro.webp diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 01d74da86..d3961dc3c 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -1311,15 +1311,15 @@ public class HomePartyRoomFragment extends BaseMvpFragment"); hintText = "进入心动选人环节?"; break; case RoomInfo.DATING_STATE_SELECT: - gameBinding.tvDatingNext.setText("公布心动"); + gameBinding.tvDatingNext.setText("公布心动>"); hintText = "进入公布心动环节?"; break; case RoomInfo.DATING_STATE_PUBLISH: - gameBinding.tvDatingNext.setText("结束本轮"); + gameBinding.tvDatingNext.setText("结束本轮>"); hintText = "结束本轮,同时清空魅力值?"; break; } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java index 8c7d34db1..28af0ec9e 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java @@ -270,18 +270,11 @@ public class MessageView extends FrameLayout { super.onDetachedFromWindow(); } - - private int imageHeight; - private int imageWidth; - private void init(Context context) { - imageHeight = Utils.dip2px(context, 15); - imageWidth = Utils.dip2px(context, 59); - whiteColor = ContextCompat.getColor(context, R.color.white); greyColor = ContextCompat.getColor(context, R.color.white_transparent_50); - roomTipNickColor = ContextCompat.getColor(context, R.color.color_FFEA7F); - roomTipColor = ContextCompat.getColor(context, R.color.color_FFEA7F); + roomTipNickColor = ContextCompat.getColor(context, R.color.color_FEE057); + roomTipColor = ContextCompat.getColor(context, R.color.color_FEE057); paddingWidth = Utils.dip2px(context, 11); paddingHeight = Utils.dip2px(context, 6); badgeWidth = Utils.dip2px(context, 15); @@ -514,7 +507,7 @@ public class MessageView extends FrameLayout { tvContent.setTextColor(ContextCompat.getColor(mContext, R.color.white)); tvContent.setText(chatRoomMessage.getContent()); } else { - tvContent.setTextColor(ContextCompat.getColor(mContext, R.color.appColor)); + tvContent.setTextColor(roomTipColor); tvContent.setText(chatRoomMessage.getContent()); } } else if (chatRoomMessage.getMsgType() == MsgTypeEnum.text) { @@ -813,8 +806,8 @@ public class MessageView extends FrameLayout { SpannableBuilder text = new SpannableBuilder(tvContent); switch (second) { case CustomAttachment.CUSTOM_MSG_SUB_DATING_SELECT: - text.append("本轮您选择了 ", new ForegroundColorSpan(roomTipColor)) - .append((notifyInfo.getTargetPosition() + 1) + "号" + (notifyInfo.getTargetGender() == 1 ? "男" : "女") + "嘉宾 ", new ForegroundColorSpan(textColor)) + text.append("本轮您选择了 ", new ForegroundColorSpan(whiteColor)) + .append((notifyInfo.getTargetPosition() + 1) + "号" + (notifyInfo.getTargetGender() == 1 ? "男" : "女") + "嘉宾:", new ForegroundColorSpan(whiteColor)) .append(notifyInfo.getTargetNickname(),new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() { @@ -825,7 +818,7 @@ public class MessageView extends FrameLayout { } } } ) - .append(" 作为你的心动对象", new ForegroundColorSpan(textColor)); + .append("作为你的心动对象", new ForegroundColorSpan(whiteColor)); break; case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE: if (notifyInfo.getHasSelectUser()) { @@ -839,7 +832,7 @@ public class MessageView extends FrameLayout { } } }) - .append(" 的心动对象是 ", new ForegroundColorSpan(textColor)) + .append(" 的心动对象是 ", new ForegroundColorSpan(whiteColor)) .append(notifyInfo.getTargetNickname(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() { @@ -861,11 +854,11 @@ public class MessageView extends FrameLayout { } } }) - .append(" 未选择心动对象", new ForegroundColorSpan(roomTipColor)); + .append(" 未选择心动对象", new ForegroundColorSpan(whiteColor)); } break; case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_HEART: - text.append("恭喜 ", new ForegroundColorSpan(textColor)) + text.append("恭喜 ", new ForegroundColorSpan(whiteColor)) .append(notifyInfo.getNickname(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() { @@ -876,7 +869,7 @@ public class MessageView extends FrameLayout { } } }) - .append(" 和 ", new ForegroundColorSpan(textColor)) + .append(" 和 ", new ForegroundColorSpan(whiteColor)) .append(notifyInfo.getTargetNickname(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() { @@ -887,7 +880,7 @@ public class MessageView extends FrameLayout { } } }) - .append(" 牵手成功,让我们见证他们幸福的开端", new ForegroundColorSpan(0xFFF84C95)); + .append(" 牵手成功,让我们见证他们幸福的开端", new ForegroundColorSpan(whiteColor)); break; } tvContent.setText(text.build()); diff --git a/app/src/main/res/drawable-xhdpi/bg_dating_man_selected.png b/app/src/main/res/drawable-xhdpi/bg_dating_man_selected.png index 18bb431ea5d5af863faafecf9b80b6f61f02777b..9825ac505ae24d308798dec6c36ca15935fb8277 100644 GIT binary patch delta 2626 zcmV-I3cdA}6v`BkBYz4JNklg6dzCnLqWZ>@vyvU3vyAHqHz5&OGh+pe`>D7L`hq-(2JZ@s(^8nVqK`;9Mby_bl zaPQm*58Ol4FL%&ofjTtL*AQbr0~=+hg+BtbM;T{dVVs`;7pH*96o4rP%X^yib3Xwo08PWG{-ewMe~NCH^SM3%O&mwYL2xdf68dj|EglsBN4=1UqAXkz=x zQa?`!m;l{`Kx4+`7YT1=!s>SuHf|=YzS{ndfD>JZT_4{-FE0h_5}*z~!yly%hXB0e z+#i64f5!OJzXTAwc)dsgU`oL0+jl>`Gv#8!*NqIi3I}AUPVc-fyWg zD&0Z=5PwkYN9r3u17-ztlvMQ*tj0pyi*}r?0_xXXXw!Y zD}g$4ir+Jt-~~$~2d$$Wzvlv(Eh~B&cWL9(4&w z?o-MzVM<6Z{76_4J{7(s9#v#!fGq{ae6CZO#_zEoW7DX^4WBa4dS--8V(<#o!8yK# zfPee`_A;>ld%z@oB;+P{-=!sh^e)E)BUq%~<-VhyRle8H;Y$MO5}*`}G;^1pv&jsb z-Oz{9G4>2iT}?k^rt&M>B+G(Lc02)IJZ<-_gq3UbMD~1QhVCQDNr&el^jdS^OTd|b zn2%Vs^2#I^sU~i+Q6mpf9Hayy@Cige_4TgamNU2>A)%eP}k$=xtD++eLqUJ zvq8>Ut{HaUO(tn52 zyd@G?L`YLlfI@B_GeU;?KZF}^0amSrSkQ;*;IsTSBHaC}A25D<+NzP2ZOKE8S-~#L zO_7ZVy)w#6zhk-lQdf@PyC> zn4YDg@(n!9CCS3rtb(NMUAGe0c7Lamc`qHB}7Mc!>nctl~R<5eZ6MSmYv?Sbz}8e3+wJ@EinG0ZZ9yjGA5q z?)avzdPNv@0l-_neV1y{c<=IPi8?O6wkR$!H+YK&UI1!ja1b>w1;Y}g(y!D+UMin4 z$WA;=I@^_Ck(T*kur#JchJR|3RPzonBB^^zl>e2%mT~7^3!s+(HE1n7A6cFXv$myr zlUGK~Q{iU?tmyNqzv+!w0+iz7AxclnrDsx$bS_{;j~C|b-v?Q#FUw* z#mRd*Z}N!1=@Wuzl7Ax?)j(O&_t3lCxFd)bd8?UEfIZ*PGdkAd!9K>*FZsBngY{sw zye~27Y+VMqY1kx3^~~{#m_x>oI!`GhmhdO<@f1nVPc}txfHX^as`kp)#wuafBA*6m zgv+Rw5mxQHC;rS*g!L;KTR*4OcJCl?KCq8LTJZ=Z?C_Wn?SD&71Tss7{7SaU9m8=1`u()4Ou&S@-uM5ED%SuQbB1*5m12^=W1f?mS3ZJZNzs z&AH5%T7Op)w>QR_;)imJ2-1xSpZ*N6@|w~V%f~uqIe+Rey4tqa36hK>0~{pi=K~6W6IhP3Af3ZPUpxWtoZR)S$$GI+My^8a-b4n)}k| zO2U>q^nA|uQ@DQTdU`HmURp#Q1^?y|#?j-9aWt`&Eh0Ms<1%538G37Ne59he%f>8O z>0-p9()0e#jXYz4_>s&zb535yzag2Zd`ky(ReySQgrZTQNHr>3?G?ws#u4EI#-v3e zY}+xSM*^H=RIKoa3x@%`ec=r7(2*X0zA$8u$S_!xX6{d2v^UHrFXdrE6o&xGeaf?? z6+rhTN#GhJ2Lrp-!sq}l0%DqU0O7HrG{XwI&(SknMo-uSD*$ZSZG$=j&h^0d*L=7T zV1GS$ir4l%_5-+H*8TMiaN;S(*>gS4_rOI><^fh2;#Kb|ZBJG>H*!^#WVM2l&BW~t zbW#AHgGZz46)xlz63dx+PA{z*vH(*+G)6J#B4K(Ayp4g?D+t$qgs^&Dit1!Pg z)9-VQf4GEEv4I%;%sg%;djM+w|K@$Y06XBT&yH~a|MUQ~;t`M3nej2mBX!2rZ;D6i kgwtR=NrYegH;>f+1KY|JQT@J(KL7v#07*qoM6N<$f()_lHUIzs delta 2573 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 Sle literal 4358 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 D?l}8|FQh&DoZi0zfMWpI zwATLSdESq?TyDk~W0T@FuAA0cF9?G70pL>r=y^{6^s@@Eqd(Bu3%$h1J2LSqksq$3Y321k%NStl*{F)FCL%_mV=AWCsLn*qyZ$squ(@0 z)HlW@uQfI{LVtfh;L%$9w=w3ud_F(J>#pp<|5Fi4p z7B*2^0!JRx0FyvTR&mC2P>5L?XxJ{B%|b^<2fiM4Y$Bh}|3b0EKoyI{SIXt`yfNmb zot+)n+uMslz{VPzh~|<}JpJT32Z_$BNxL}Un>0@Xho@c|IP!j5TO0KC_2DZ{J z9H>>UqJ!;6M@ONdp#i)7IG@koH|UdsAV7L`Eq^aB!`azcBAa*`rd2%2Bu$%Y(I=i# z)tqbkq=`Fc9>s{lJ~A?bw>Ev>??E&9Rv3oAVueFCX(QvRcEl_VkfdtI!QncUSoVY! zAjXhR(g1P*T|zGHf@Bu`9vd5rSmk-%+h%QT?F(bfCs^SQ4-YGVasfm^@rtL>_*n`$ z4S%3k@mwh=H7M=3j2DG{aBvVU!?($K! zq@EV1WSds)G{Y%Vk$}VhI5jneuRTDZE`I=^es*@&2~v_P$9t}hI3OH2?5I``rTHe8 zpv$R?WRg||U79*QJ&oO5RRG0Q!g=b^A9i&l0n(Ut8zyO5l_caz6)?%xaG>JU z!w0zAmMN&+BX(2+l+-DDwpyTE;3QQ%nQAVRDF+PEDUQXHMdN8-IYL zJ*XBaS@|d~Ed@1w;vmtaos1{GL+UDu`Q+pz-kOQ+!PeGRWDjU`G&X4tU8Ak+klJu< zx=qD%RX!OjX9ouiuXBb`JGv${745;$(9mOhzzyf(;$qcvylST|RBAb(JmrX8NvzVC zx?S<~{ zZVdC`%`!_lUbtIdU+*ZDO26a6-R|ygv_?*;rU^XP0!dpf-CTgBu_?(fY2wZeu&i>L z(Ui6T1$} zX}n#fIa%pLo>rfD+HujQb3T(G&|DUPGYX%ttE+?7)>i21>f+l~4^%Um%)M+j`dP@B3fZv;oQip)GZ5?Yp?8Zmq>t_y7Esx-n)8x73X>KUA}& Z{s?K6*l`S1f0Y0L002ovPDHLkV1fYrB%uHR diff --git a/app/src/main/res/drawable-xhdpi/bg_dating_woman_selected.png b/app/src/main/res/drawable-xhdpi/bg_dating_woman_selected.png index a5872177731793e6f0c97b10afa0dda30c43cf5b..4278589ea88b85b560a528d5a60f61484de8d56e 100644 GIT binary patch delta 2694 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 AQBq8U3bmmmYLwWD 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 Z{{iZ2%9|og9z6g6002ovPDHLkV1inj0TBQI diff --git a/app/src/main/res/drawable-xhdpi/icon_room_mute_micro.png b/app/src/main/res/drawable-xhdpi/icon_room_mute_micro.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5d70c5da32fbc453918bdcb5a0d5b5652c1e88 GIT binary patch literal 1434 zcmV;L1!ek)P)Fq&S3@JPZgF zO(jh%btcdlR>(!vu`R7oa;ET!0lMz8dz*V@w*_&(Pjkle&o{gGJbw4Q?l}Y!$;&Ii zsfS579h3wT0&h?Z1wn5vPH`Iq4V0oDgjU=WWaa12SGGz~O~jadycENTiL3C#nV^qr{949_kKN!czE;84XG)YN~%i=Ef{sZfNA9 zyh#Gtbl@=BTHCs+JL}K_fAtmhU3Opr;3HS26VL=Po;AWaC;)4w{HtH=D6AY7zcyydrj=HknBnNPOh}5d@@EjN5!}4In%7a}?$k zV^wlI-UtstYfCE@&3_LUez_<~9R-afzHG7u@jWY$l3sVdwYJ{qWlshezXFi5i=3<<`SINoI%l^ z9q84oCqk!3N&z4qf~a{BI9OJW;hw{gm9rT#naq-eEC(XyhViapx%zWxX=#P4n+x(ww!_WM z6=A`%asAp2F%PgL6fZ;fA@0a8{(>7gQhtngKGp%vL?C~im%>nyX9j`|G(p3nYGyxyP$Km&je{dt7au2xmapSEwC22jc7AeFV zk*!wj;_8Agcje%D_dz_l;$l?L8}taC5d`IU1;z)A<#tX~RzY1=!@a{Al0>>AGYQXj zJVuH<0B?5{jGQ|QD?U`=SM3G7vmlnYT5H-_R>Xfs&73FEW+%4$j}iN;V-otg>vQbv z?1X7Eg7AI$QQU66{eY4G0l;8{$*W#lbMcV|lJGfUaIqRh!XjsKPTYdqx@-|!N%MK^EUL{Px%FdB^yV>^qUdWA-#xzh=N zRVbd$P-=$zRL62Nh>oOWf$TOMkCF0csen*Pi-}n|Th0D))Ta zm)o~Q5L_P_?-AbGG>IRJ(rg*UnJ5jX3HyV>-T9i)%Yf>=UNFyTwDz%#GT^;)z7{UF$|?+Urza zmeY^N$B)^V93!}7^l#0W?mz#mN1r!!B#wlcgPp7S`yrD8JZaXQ>Nmfc6!wf~=X$5p zY0wObMd{gIcBN>CARR&I@GiMRwaw}Vr9fES09H^qAoc(N01yTModGHy03HB7ku;e{ zrJ|ytFc=H~uo4Mr00ZG>f*;a<)2@YH=0@TtBJhp#X=7|Ev%aE`DgXff|D7U#r)~eT zoX1{Dz1sVDbF~;gL(VNxTX%o{V#i2BVHxXa>zZvzX1HHi$^ef^KUGi&XP3Y>TN(vs=Q&sS*>nB%>$P?Y zVm}1RBOa}1isD}7wfPb!loy0??yr>Nt*>4qa>gia0b-%WzDqyt@BO#`!vG87FMW0| arZ*4pVVs6{_rW$JmKR;{mMms~0000R2QHTY diff --git a/app/src/main/res/drawable/selector_dating_step.xml b/app/src/main/res/drawable/selector_dating_step.xml index 31736bc2a..bfda8ff84 100644 --- a/app/src/main/res/drawable/selector_dating_step.xml +++ b/app/src/main/res/drawable/selector_dating_step.xml @@ -4,7 +4,7 @@ - + diff --git a/app/src/main/res/drawable/shape_circle_micro_man_bg.xml b/app/src/main/res/drawable/shape_circle_micro_man_bg.xml index 9ec10c6de..bbe73e11c 100644 --- a/app/src/main/res/drawable/shape_circle_micro_man_bg.xml +++ b/app/src/main/res/drawable/shape_circle_micro_man_bg.xml @@ -5,7 +5,7 @@ + android:color="#A6D2FF" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml b/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml index 95029bc76..d131c8396 100644 --- a/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml +++ b/app/src/main/res/drawable/shape_circle_micro_woman_bg.xml @@ -5,7 +5,7 @@ + android:color="#FFB1D0" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_room_message_bg.xml b/app/src/main/res/drawable/shape_room_message_bg.xml index 23d4ccf6f..0a7562b5d 100644 --- a/app/src/main/res/drawable/shape_room_message_bg.xml +++ b/app/src/main/res/drawable/shape_room_message_bg.xml @@ -1,7 +1,7 @@ - + true - true + false shortEdges true From f39ad33dc42c7195a0ad7b3160ab09853fd5d667 Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Sun, 31 Jan 2021 10:00:18 +0800 Subject: [PATCH 25/49] =?UTF-8?q?1.=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=98=B5=E7=A7=B0=E7=82=B9=E5=87=BB=E6=94=B9=E4=B8=BA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=AD=A3=E7=A1=AE=E7=9A=84uid=202.=E5=A1=94=E7=BD=97?= =?UTF-8?q?=E6=B6=88=E6=81=AF=20=E9=87=91=E5=B8=81->=E9=92=BB=E7=9F=B3=203?= =?UTF-8?q?.=E7=9B=B8=E4=BA=B2=E7=89=B5=E6=89=8Bsvga=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=8C=89=E9=92=AE=E7=82=B9=E5=87=BB=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/fragment/HomePartyFragment.java | 3 +++ .../erban/avroom/widget/MessageView.java | 8 ++++---- .../layout/fragment_chatroom_game_main.xml | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java index ae54f84c0..dd1266592 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java @@ -1364,6 +1364,9 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi @SuppressLint({"SetTextI18n"}) private void showHandAnim(final DatingNotifyInfo datingNotifyInfo) { if (datingDisposable != null) datingDisposable.dispose(); + gameMainBinding.flSvgaDating.setOnClickListener(v -> { + //do noting + }); gameMainBinding.flSvgaDating.post(() -> gameMainBinding.flSvgaDating.setVisibility(View.GONE)); datingDisposable = Single.just(datingNotifyInfo) .compose(bindToLifecycle()) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java index f64daa1d7..62e55f3d0 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java @@ -841,7 +841,7 @@ public class MessageView extends FrameLayout { @Override public void onClick(@NonNull View widget) { if (clickConsumer != null) { - Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + Single.just(String.valueOf(notifyInfo.getUid())).subscribe(clickConsumer); } } }) @@ -863,7 +863,7 @@ public class MessageView extends FrameLayout { @Override public void onClick(@NonNull View widget) { if (clickConsumer != null) { - Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + Single.just(String.valueOf(notifyInfo.getUid())).subscribe(clickConsumer); } } }) @@ -878,7 +878,7 @@ public class MessageView extends FrameLayout { @Override public void onClick(@NonNull View widget) { if (clickConsumer != null) { - Single.just(String.valueOf(notifyInfo.getTargetUid())).subscribe(clickConsumer); + Single.just(String.valueOf(notifyInfo.getUid())).subscribe(clickConsumer); } } }) @@ -913,7 +913,7 @@ public class MessageView extends FrameLayout { .append("恭喜 ", new ForegroundColorSpan(textColor)) .append(nickName, new ForegroundColorSpan(roomTipNickColor)) .append(" 在塔罗占卜中运气爆发,收获", new ForegroundColorSpan(textColor)) - .append(tarotMsgBean.getDrawGoldNum() + "金币", new ForegroundColorSpan(roomTipColor)); + .append(tarotMsgBean.getDrawGoldNum() + "钻石", new ForegroundColorSpan(roomTipColor)); tvContent.setText(text.build()); } } diff --git a/app/src/main/res/layout/fragment_chatroom_game_main.xml b/app/src/main/res/layout/fragment_chatroom_game_main.xml index c2c939083..ed41a2b59 100644 --- a/app/src/main/res/layout/fragment_chatroom_game_main.xml +++ b/app/src/main/res/layout/fragment_chatroom_game_main.xml @@ -28,17 +28,17 @@ android:layout_height="42dp" android:layout_alignBottom="@+id/ll_room_info" android:layout_marginStart="@dimen/dp_5" + android:layout_marginTop="30dp" android:layout_marginBottom="0dp" android:padding="10dp" - android:layout_marginTop="30dp" android:scaleType="fitCenter" android:src="@drawable/arrow_left_white" /> @@ -234,8 +234,8 @@ android:id="@+id/cl_notify" android:layout_width="match_parent" android:layout_height="wrap_content" - android:visibility="gone" - android:layout_marginTop="80dp"> + android:layout_marginTop="80dp" + android:visibility="gone"> + android:visibility="visible"> From 7a42b8c8033fcb0dd532261e8257964e6d8e4cb3 Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Mon, 1 Feb 2021 13:51:41 +0800 Subject: [PATCH 26/49] =?UTF-8?q?=E7=9B=B8=E4=BA=B2=E7=89=B5=E6=89=8Bsvga?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E5=85=B3=E9=97=AD=E6=8C=89=E9=92=AE=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yizhuan/erban/avroom/fragment/HomePartyFragment.java | 4 ++++ app/src/main/res/layout/fragment_chatroom_game_main.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java index dd1266592..57d6c3617 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java @@ -1367,6 +1367,10 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi gameMainBinding.flSvgaDating.setOnClickListener(v -> { //do noting }); + gameMainBinding.ivDatingSvgaClose.setOnClickListener(v -> { + gameMainBinding.flSvgaDating.setVisibility(View.GONE); + if (datingDisposable != null) datingDisposable.dispose(); + }); gameMainBinding.flSvgaDating.post(() -> gameMainBinding.flSvgaDating.setVisibility(View.GONE)); datingDisposable = Single.just(datingNotifyInfo) .compose(bindToLifecycle()) diff --git a/app/src/main/res/layout/fragment_chatroom_game_main.xml b/app/src/main/res/layout/fragment_chatroom_game_main.xml index ed41a2b59..82783417c 100644 --- a/app/src/main/res/layout/fragment_chatroom_game_main.xml +++ b/app/src/main/res/layout/fragment_chatroom_game_main.xml @@ -276,7 +276,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#66000000" - android:visibility="visible"> + android:visibility="gone"> Date: Tue, 2 Feb 2021 21:25:18 +0800 Subject: [PATCH 27/49] =?UTF-8?q?=E7=A7=81=E8=81=8A=E9=80=81=E7=A4=BC?= =?UTF-8?q?=E7=89=A9bug=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java index b170c3b9a..08d487920 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/GiftDialog.java @@ -1037,7 +1037,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene if (!isInRoom) {//不在房间的情况 List targetUids = new ArrayList<>(); MicMemberInfo micMemberInfo = new MicMemberInfo(); - micMemberInfo.setAccount(String.valueOf(AvRoomDataManager.get().getRoomUid())); + micMemberInfo.setAccount(String.valueOf(uid)); targetUids.add(micMemberInfo); Log.e(TAG, "onClick: indicator type: " + giftIndicator.getCurrrentType()); giftDialogBtnClickListener.onSendGiftBtnClick(current, targetUids, giftNumber == -1 ? current.getCount() : giftNumber, giftMessage, From e3fb64e981b67dcec38445e6e4e8d8daed57a6a6 Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Tue, 2 Feb 2021 22:46:17 +0800 Subject: [PATCH 28/49] =?UTF-8?q?=E6=88=BF=E9=97=B4=E9=A3=98=E5=B1=8F=20bu?= =?UTF-8?q?g=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yizhuan/erban/avroom/fragment/HomePartyFragment.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java index 57d6c3617..4d1067e0e 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java @@ -961,6 +961,9 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi */ private void addLuckyBagNotify(ChatRoomMessage chatRoomMessage) { if (messagesLuckyGift == null) messagesLuckyGift = new ArrayList<>(); + if (gameMainBinding.clNotify.getVisibility() == View.GONE) { + gameMainBinding.clNotify.setVisibility(View.VISIBLE); + } messagesLuckyGift.add(chatRoomMessage); if (disposableLuckyGift == null || messagesLuckyGift.size() == 1) { isCreateLuckyGift = true; @@ -1002,6 +1005,9 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi */ private void addBoxNotify(ChatRoomMessage chatRoomMessage) { if (messages == null) messages = new ArrayList<>(); + if (gameMainBinding.clNotify.getVisibility() == View.GONE) { + gameMainBinding.clNotify.setVisibility(View.VISIBLE); + } messages.add(chatRoomMessage); if (boxDisposable == null || messages.size() == 1) { isCreate = true; @@ -1040,6 +1046,9 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi */ private void addBoxNotifyBySVGA(ChatRoomMessage chatRoomMessage) { if (messagesBoxSVGA == null) messagesBoxSVGA = new ArrayList<>(); + if (gameMainBinding.clNotify.getVisibility() == View.GONE) { + gameMainBinding.clNotify.setVisibility(View.VISIBLE); + } messagesBoxSVGA.add(chatRoomMessage); if (boxSVGADisposable == null || messagesBoxSVGA.size() == 1) { isBoxSVGACreate = true; From b6e666590ff32c3c420efa5e7ee3b739ee54446b Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Wed, 3 Feb 2021 17:06:41 +0800 Subject: [PATCH 29/49] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98(?= =?UTF-8?q?=E5=8D=8E=E4=B8=BA=E5=AE=A1=E6=A0=B8=E6=89=8B=E6=9C=BA=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=B0=83=E8=B5=B7=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F,=E4=BD=86=E6=98=AF=E6=B5=8B=E8=AF=95=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=A4=8D=E7=8E=B0,=E4=B8=B4=E6=97=B6=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E6=96=B9=E6=A1=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yizhuan/erban/ui/pay/ChargeActivity.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java index f8d6174de..0886861c2 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java @@ -39,6 +39,7 @@ import com.yizhuan.xchat_android_core.pay.event.UpdateWalletInfoEvent; import com.yizhuan.xchat_android_core.pay.model.unionpay.UnionPayModel; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; +import com.yizhuan.xchat_android_core.utils.CheckUtils; import com.yizhuan.xchat_android_core.utils.net.BeanObserver; import com.yizhuan.xchat_android_core.web.event.WebViewRefreshEvent; import com.yizhuan.xchat_android_library.utils.JavaUtil; @@ -584,6 +585,12 @@ public class ChargeActivity extends BaseActivity { tv_type_second.setText("微信"); ll_type_first.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType)); ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX,defaultType)); + + if (CheckUtils.isCheckUser()){ + tv_type_first.setVisibility(View.VISIBLE); + ll_type_second.setVisibility(View.GONE); + ll_more.setVisibility(View.GONE); + } } private void setWxPayFirst(int defaultType){ @@ -593,6 +600,13 @@ public class ChargeActivity extends BaseActivity { tv_type_second.setText("支付宝"); ll_type_first.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX,defaultType)); ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType)); + + if (CheckUtils.isCheckUser()){ + tv_type_first.setVisibility(View.GONE); + ll_type_second.setVisibility(View.VISIBLE); + ll_more.setVisibility(View.GONE); + } + } @Subscribe(threadMode = ThreadMode.MAIN) From 92373b6164a3742122552258eb0746ed9203d22b Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Wed, 3 Feb 2021 17:32:59 +0800 Subject: [PATCH 30/49] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E9=9A=90=E8=97=8F=E7=9A=84=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java index 0886861c2..9019dafb6 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java @@ -587,7 +587,7 @@ public class ChargeActivity extends BaseActivity { ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX,defaultType)); if (CheckUtils.isCheckUser()){ - tv_type_first.setVisibility(View.VISIBLE); + ll_type_first.setVisibility(View.VISIBLE); ll_type_second.setVisibility(View.GONE); ll_more.setVisibility(View.GONE); } @@ -602,7 +602,7 @@ public class ChargeActivity extends BaseActivity { ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType)); if (CheckUtils.isCheckUser()){ - tv_type_first.setVisibility(View.GONE); + ll_type_first.setVisibility(View.GONE); ll_type_second.setVisibility(View.VISIBLE); ll_more.setVisibility(View.GONE); } From 2cb4a17364ff9777df51c6311b9b5fc667a34b5f Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Wed, 3 Feb 2021 17:52:26 +0800 Subject: [PATCH 31/49] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=A1=B5=E9=9D=A2=E9=BB=98=E8=AE=A4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java index 9019dafb6..5a7b12704 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java @@ -590,6 +590,7 @@ public class ChargeActivity extends BaseActivity { ll_type_first.setVisibility(View.VISIBLE); ll_type_second.setVisibility(View.GONE); ll_more.setVisibility(View.GONE); + selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType); } } @@ -605,6 +606,7 @@ public class ChargeActivity extends BaseActivity { ll_type_first.setVisibility(View.GONE); ll_type_second.setVisibility(View.VISIBLE); ll_more.setVisibility(View.GONE); + selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType); } } From 17de971139ff46eb1b06dc049f4f5eb7255bf3d7 Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Wed, 3 Feb 2021 17:55:15 +0800 Subject: [PATCH 32/49] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=A1=B5=E9=9D=A2=E9=BB=98=E8=AE=A4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98(again)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java index 5a7b12704..0e8c96384 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java @@ -537,6 +537,7 @@ public class ChargeActivity extends BaseActivity { if (walletInfo == null)return; mTv_gold.setText(getString(R.string.charge_gold, walletInfo.getDiamondNum())); int defaultPay = walletInfo.getDefaultPay(); + selectPayChannelDisplay(payChannel,defaultPay); switch (defaultPay){ case ALI_PAY_CLOSE: payChannel = Constants.CHARGE_ALIPAY; @@ -565,7 +566,6 @@ public class ChargeActivity extends BaseActivity { defaultPay(defaultPay); break; } - selectPayChannelDisplay(payChannel,defaultPay); } /** From ff6037ce20556f943f01abb6914d2d3da0168f5f Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Wed, 3 Feb 2021 17:58:37 +0800 Subject: [PATCH 33/49] =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=A1=B5=E9=9D=A2=E9=BB=98=E8=AE=A4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98(double?= =?UTF-8?q?=20again)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yizhuan/erban/ui/pay/ChargeActivity.java | 74 ++++++++++--------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java index 0e8c96384..04219fc11 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/pay/ChargeActivity.java @@ -3,8 +3,10 @@ package com.yizhuan.erban.ui.pay; import android.content.Context; import android.content.Intent; import android.os.Bundle; + import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; + import android.text.TextUtils; import android.view.View; import android.widget.ImageView; @@ -108,11 +110,11 @@ public class ChargeActivity extends BaseActivity { context.startActivity(intent); } - public static void start(Context context,boolean isFromH5) { + public static void start(Context context, boolean isFromH5) { UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); if (context == null || userInfo == null) return; Intent intent = new Intent(context, ChargeActivity.class); - intent.putExtra("isFromH5",isFromH5); + intent.putExtra("isFromH5", isFromH5); context.startActivity(intent); } @@ -134,7 +136,7 @@ public class ChargeActivity extends BaseActivity { PaymentActivity.start(this, payChannel, String.valueOf(mSelectChargeBean.chargeProdId)); }); tvAgreement.setOnClickListener(v -> { - CommonWebViewActivity.start(this,UriProvider.getRechargeAgreementUrl()); + CommonWebViewActivity.start(this, UriProvider.getRechargeAgreementUrl()); }); } @@ -163,13 +165,13 @@ public class ChargeActivity extends BaseActivity { tv_type_second = findViewById(R.id.tv_type_second); } - public void selectPayChannelDisplay(String payChannel,int defaultPay) { + public void selectPayChannelDisplay(String payChannel, int defaultPay) { this.payChannel = payChannel; boolean selectWeChatPay = (Objects.equals(this.payChannel, Constants.CHARGE_WX)); boolean selectAliPay = (Objects.equals(this.payChannel, Constants.CHARGE_ALIPAY)); if (!ListUtils.isListEmpty(mBigList)) { if (selectAliPay) { - if (mList.size() == mListSize){ + if (mList.size() == mListSize) { for (ChargeBean bigList : mBigList) { mList.add(bigList); } @@ -188,7 +190,7 @@ public class ChargeActivity extends BaseActivity { } } - switch (defaultPay){ + switch (defaultPay) { case ALI_PAY_CLOSE: iv_sel_first.setSelected(selectAliPay); iv_sel_second.setSelected(selectWeChatPay); @@ -209,17 +211,18 @@ public class ChargeActivity extends BaseActivity { iv_sel_second.setSelected(selectAliPay); break; default: - defaultSetPay(selectWeChatPay,selectAliPay); + defaultSetPay(selectWeChatPay, selectAliPay); break; } } /** * 默认选择的支付方式 + * * @param selectWeChatPay * @param selectAliPay */ - private void defaultSetPay(boolean selectWeChatPay,boolean selectAliPay){ + private void defaultSetPay(boolean selectWeChatPay, boolean selectAliPay) { iv_sel_first.setSelected(selectWeChatPay); iv_sel_second.setSelected(selectAliPay); } @@ -235,7 +238,7 @@ public class ChargeActivity extends BaseActivity { titleBar.setLeftImageResource(R.drawable.arrow_left_white); titleBar.setCommonBackgroundColor(getResources().getColor(R.color.transparent)); titleBar.setLeftClickListener(v -> finishPage()); - titleBar.addAction(new TitleBar.TextAction("我的收益",getResources().getColor(R.color.white)) { + titleBar.addAction(new TitleBar.TextAction("我的收益", getResources().getColor(R.color.white)) { @Override public void performAction(View view) { CommonWebViewActivity.start(ChargeActivity.this, @@ -246,14 +249,14 @@ public class ChargeActivity extends BaseActivity { } private void initiate() { - mIsFromH5 = getIntent().getBooleanExtra("isFromH5",false); + mIsFromH5 = getIntent().getBooleanExtra("isFromH5", false); mRecyclerView = findViewById(R.id.recyclerView); mRecyclerView.setNestedScrollingEnabled(false); - mRecyclerView.setLayoutManager(new GridLayoutManager(this,3)); + mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3)); mChargeAdapter = new ChargeAdapter(); mRecyclerView.setAdapter(mChargeAdapter); mChargeAdapter.setOnItemClickListener((baseQuickAdapter, view, position) -> { - setItemSelect(position); + setItemSelect(position); // int money = mSelectChargeBean.getMoney(); // if (money >= 30000) { // // 大于 3w 的时候,隐藏微信支付的选项 @@ -268,7 +271,7 @@ public class ChargeActivity extends BaseActivity { onLoadingData(); } - private void setItemSelect(int position){ + private void setItemSelect(int position) { List list = mChargeAdapter.getData(); if (ListUtils.isListEmpty(list)) return; @@ -308,10 +311,10 @@ public class ChargeActivity extends BaseActivity { } public void onRefreshing() { - PayModel.get().getChargeList(1,AuthModel.get().getCurrentUid()).subscribe(new BeanObserver() { + PayModel.get().getChargeList(1, AuthModel.get().getCurrentUid()).subscribe(new BeanObserver() { @Override public void onSuccess(ChargeListResult chargeBeans) { - if (chargeBeans == null)return; + if (chargeBeans == null) return; mBigList = chargeBeans.getBigList(); mList = chargeBeans.getList(); mListSize = chargeBeans.getList().size(); @@ -532,13 +535,14 @@ public class ChargeActivity extends BaseActivity { } } - /**defaultPay 1:默认支付宝,2:默认微信 */ + /** + * defaultPay 1:默认支付宝,2:默认微信 + */ private void setWalletData(WalletInfo walletInfo) { - if (walletInfo == null)return; + if (walletInfo == null) return; mTv_gold.setText(getString(R.string.charge_gold, walletInfo.getDiamondNum())); int defaultPay = walletInfo.getDefaultPay(); - selectPayChannelDisplay(payChannel,defaultPay); - switch (defaultPay){ + switch (defaultPay) { case ALI_PAY_CLOSE: payChannel = Constants.CHARGE_ALIPAY; showMoreButton(); @@ -566,47 +570,49 @@ public class ChargeActivity extends BaseActivity { defaultPay(defaultPay); break; } + if (CheckUtils.isCheckUser()) { + selectPayChannelDisplay(Constants.CHARGE_ALIPAY, defaultPay); + } else { + selectPayChannelDisplay(payChannel, defaultPay); + } } /** * 默认支付方式 + * * @param defaultPay */ - private void defaultPay(int defaultPay){ + private void defaultPay(int defaultPay) { payChannel = Constants.CHARGE_WX; hideMoreButton(); setWxPayFirst(defaultPay); } - private void setAliPayFirst(int defaultType){ + private void setAliPayFirst(int defaultType) { iv_type_first.setImageDrawable(getResources().getDrawable(R.drawable.ic_ali_charge)); iv_type_second.setImageDrawable(getResources().getDrawable(R.drawable.ic_wechat_charge)); tv_type_first.setText("支付宝"); tv_type_second.setText("微信"); - ll_type_first.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType)); - ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX,defaultType)); - - if (CheckUtils.isCheckUser()){ + ll_type_first.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY, defaultType)); + ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX, defaultType)); + if (CheckUtils.isCheckUser()) { ll_type_first.setVisibility(View.VISIBLE); ll_type_second.setVisibility(View.GONE); ll_more.setVisibility(View.GONE); - selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType); } } - private void setWxPayFirst(int defaultType){ + private void setWxPayFirst(int defaultType) { iv_type_first.setImageDrawable(getResources().getDrawable(R.drawable.ic_wechat_charge)); iv_type_second.setImageDrawable(getResources().getDrawable(R.drawable.ic_ali_charge)); tv_type_first.setText("微信"); tv_type_second.setText("支付宝"); - ll_type_first.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX,defaultType)); - ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType)); - - if (CheckUtils.isCheckUser()){ + ll_type_first.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_WX, defaultType)); + ll_type_second.setOnClickListener(v -> selectPayChannelDisplay(Constants.CHARGE_ALIPAY, defaultType)); + if (CheckUtils.isCheckUser()) { ll_type_first.setVisibility(View.GONE); ll_type_second.setVisibility(View.VISIBLE); ll_more.setVisibility(View.GONE); - selectPayChannelDisplay(Constants.CHARGE_ALIPAY,defaultType); } } @@ -635,9 +641,9 @@ public class ChargeActivity extends BaseActivity { finishPage(); } - private void finishPage(){ + private void finishPage() { finish(); - if (!mIsFromH5)return; + if (!mIsFromH5) return; EventBus.getDefault().post(new WebViewRefreshEvent()); } } From b335f8c8520e92695fe949c6cf8e46360d31f9d0 Mon Sep 17 00:00:00 2001 From: zu Date: Fri, 5 Feb 2021 19:24:13 +0800 Subject: [PATCH 34/49] =?UTF-8?q?WebView=E5=85=BC=E5=AE=B9=E5=92=8C?= =?UTF-8?q?=E5=B9=B3=E7=B2=BE=E8=8B=B1=E7=9A=84=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/webview/CommonWebViewActivity.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java index a44b49f36..5c0b0d218 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java @@ -16,6 +16,7 @@ import android.text.TextUtils; import android.view.View; import android.webkit.SslErrorHandler; import android.webkit.ValueCallback; +import android.webkit.WebBackForwardList; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; @@ -42,6 +43,7 @@ import com.yizhuan.erban.ui.webview.event.TaroPayResultEvent; import com.yizhuan.erban.ui.widget.ShareDialog; import com.yizhuan.erban.utils.WebViewUtils; import com.yizhuan.xchat_android_core.Constants; +import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.certification.event.CertificationResultEvent; import com.yizhuan.xchat_android_core.share.ShareModel; import com.yizhuan.xchat_android_core.web.bean.WebJsBeanInfo; @@ -254,6 +256,31 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O //删除直接拨打电话的功能 return true; } + if (url.startsWith("pubgmhd1106467070://")) { + // 跳转和平精英 + Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + if (in.resolveActivity(getPackageManager()) == null) { + toast("您尚未安装游戏,跳转失败。"); + } else { + in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + startActivity(in); + } + // 跳转成功或失败与否,都重新回到最后打开的App内非第三方网页 + view.post(() -> { + WebBackForwardList list = view.copyBackForwardList(); + final int length = list.getSize(); + int steps = 1; + for (int i = length - 1; i >=0 ; i--) { + String lastUrl = list.getItemAtIndex(i).getUrl(); + steps--; + if (lastUrl != null && lastUrl.startsWith(UriProvider.JAVA_WEB_URL)) { + view.goBackOrForward(steps); + break; + } + } + }); + return true; + } // ------- 处理结束 ------- if (!(url.startsWith("http") || url.startsWith("https"))) { From d00247945ae491759ab5128a0eff9b0d780a74e0 Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Sat, 6 Feb 2021 11:07:37 +0800 Subject: [PATCH 35/49] =?UTF-8?q?=E6=88=BF=E9=97=B4=E9=80=8F=E6=98=8E?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=A0=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yizhuan/erban/avroom/activity/AVRoomActivity.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java index 1ab0f237b..9d7c6b946 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java @@ -27,6 +27,7 @@ import androidx.viewpager.widget.ViewPager; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.netease.nim.uikit.StatusBarUtil; import com.netease.nim.uikit.common.util.log.LogUtil; import com.netease.nimlib.sdk.NIMSDK; import com.netease.nimlib.sdk.Observer; @@ -944,7 +945,13 @@ public class AVRoomActivity extends BaseMvpActivity Date: Sat, 6 Feb 2021 21:40:38 +0800 Subject: [PATCH 36/49] =?UTF-8?q?bugly=20bug=20fix=201.=E5=8F=91=E9=80=81?= =?UTF-8?q?=E7=BA=A2=E5=8C=85=E9=97=AA=E9=80=80=202.=E6=8E=92=E9=BA=A6?= =?UTF-8?q?=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java | 1 + .../yizhuan/erban/avroom/redpackage/RedPackageSendDialog.kt | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java index 424dd22d0..3a56c7934 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/MicQueueAdapter.java @@ -32,6 +32,7 @@ public class MicQueueAdapter extends BaseQuickAdapter(), GridPass PayModel.get().currentWalletInfo?.let { binding.tvBalanceNum.text = it.diamondNum.toInt().toString() } + if (InitialModel.get().cacheInitInfo == null) { + InitialModel.get().init(true) + SingleToastUtil.showToast("获取红包信息失败,请稍后再试!") + dismissAllowingStateLoss() + return + } val initInfo = InitialModel.get().cacheInitInfo ?: InitInfo() /** From cdb4dba2e1b9e7c377c0fda5ef5351e37989122b Mon Sep 17 00:00:00 2001 From: memory <547527489@qq.com> Date: Mon, 8 Feb 2021 14:22:41 +0800 Subject: [PATCH 37/49] =?UTF-8?q?=E4=BA=91=E4=BF=A1=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8E=BB=E6=8E=89=E4=B8=80=E4=BA=9B=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xchat_android_core/manager/IMNetEaseManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index f34c67a26..69e278032 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -2652,6 +2652,14 @@ public final class IMNetEaseManager { tmp.remove("pic"); tmp.remove("cardbg"); tmp.remove("zonebg"); + tmp.remove("newUser"); + tmp.remove("official"); + tmp.remove("defUser"); + tmp.remove("hasPrettyErbanNo"); + tmp.remove("officialAnchorCertificationName"); + tmp.remove("officialAnchorCertificationIcon"); + tmp.remove("inRoomNameplateWord"); + tmp.remove("inRoomNameplatePic"); map.put(chatRoomMembers.get(i).getAccount(), tmp); } chatRoomMessage.setLocalExtension(map); From 1a6e8ba54f437926b27fe8a596d33ea7b7090b55 Mon Sep 17 00:00:00 2001 From: huangjian Date: Mon, 22 Feb 2021 10:46:12 +0800 Subject: [PATCH 38/49] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=8F=91=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B6=88=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E5=AD=97=E6=AE=B5(=E7=9C=8B=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E6=98=AF=E8=B4=B5=E6=97=8F=E4=BD=BF=E7=94=A8=E7=9A=84?= =?UTF-8?q?,=E4=BC=9A=E5=AF=BC=E8=87=B4=E4=BA=91=E4=BF=A1=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E8=B6=85=E9=95=BF=E5=8F=91=E9=80=81=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/IMNetEaseManager.java | 110 +++--------------- 1 file changed, 17 insertions(+), 93 deletions(-) diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 69e278032..6e645166a 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -2591,102 +2591,26 @@ public final class IMNetEaseManager { if (chatRoomMessage == null) { throw new IllegalArgumentException("ChatRoomMessage can't be null!"); } - // 设置聊天室的贵族信息字段(包括发的人和麦上的所有人) - final List accounts = new ArrayList<>(); - final List chatRoomMembers = new ArrayList<>(); - return Single.create((SingleOnSubscribe>) e -> { - // 发的人 - ChatRoomMember roomMember = AvRoomDataManager.get().getChatRoomMember(chatRoomMessage.getFromAccount()); - if (roomMember != null && roomMember.getExtension() != null) { - chatRoomMembers.add(roomMember); - } else { - accounts.add(chatRoomMessage.getFromAccount()); - } - //只有自定义消息的时候才传坑上的人的ext信息 - if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) { - // 麦上的人 - SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; - for (int i = 0; i < mMicQueueMemberMap.size(); i++) { - int key = mMicQueueMemberMap.keyAt(i); - RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(key); - if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) continue; - // 有拓展字段 - if (roomQueueInfo.mChatRoomMember.getExtension() != null) { - MicMemberInfo micMemberInfo = roomQueueInfo.mChatRoomMember; - ChatRoomMember chatRoomMember = new ChatRoomMember(); - chatRoomMember.setAccount(micMemberInfo.getAccount()); - chatRoomMember.setAvatar(micMemberInfo.getAvatar()); - chatRoomMember.setNick(micMemberInfo.getNick()); - chatRoomMember.setExtension(micMemberInfo.getExtension()); - chatRoomMembers.add(chatRoomMember); + return Single.create((SingleOnSubscribe) e -> { + NIMChatRoomSDK.getChatRoomService().sendMessage(chatRoomMessage, resend) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(Void param) { + e.onSuccess(chatRoomMessage); + } - } else { - // 用于重新获取拓展字段 - accounts.add(roomQueueInfo.mChatRoomMember.getAccount()); - } - } - } - e.onSuccess(chatRoomMembers); - }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(chatRoomMembers1 -> { - if (!ListUtils.isListEmpty(accounts)) { - return fetchRoomMembersByIds(accounts); - } else { - return Single.just(chatRoomMembers1); - } - }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(roomMembers -> { - // 旧版的人上麦可能并没有extension字段 - chatRoomMembers.addAll(roomMembers); - Map map = new HashMap<>(chatRoomMembers.size()); - for (int i = 0; i < chatRoomMembers.size(); i++) { - Map extension = chatRoomMembers.get(i).getExtension(); - if (extension == null || extension.get(chatRoomMembers.get(i).getAccount()) == null) - continue; - //去掉一些不需要的东西,长度超过4096 会导致发消息失败。 - Map tmp = new HashMap<>(); - tmp.putAll((Map) extension.get(chatRoomMembers.get(i).getAccount())); - tmp.remove("banner"); - tmp.remove("open_effect"); - tmp.remove("halo"); - tmp.remove("headwear"); - tmp.remove("recommend"); - tmp.remove("pic"); - tmp.remove("cardbg"); - tmp.remove("zonebg"); - tmp.remove("newUser"); - tmp.remove("official"); - tmp.remove("defUser"); - tmp.remove("hasPrettyErbanNo"); - tmp.remove("officialAnchorCertificationName"); - tmp.remove("officialAnchorCertificationIcon"); - tmp.remove("inRoomNameplateWord"); - tmp.remove("inRoomNameplatePic"); - map.put(chatRoomMembers.get(i).getAccount(), tmp); - } - chatRoomMessage.setLocalExtension(map); - chatRoomMessage.setRemoteExtension(map); - return Single.create((SingleOnSubscribe) e -> { - NIMChatRoomSDK.getChatRoomService().sendMessage( - chatRoomMessage, - resend - ) - .setCallback(new RequestCallback() { - @Override - public void onSuccess(Void param) { - e.onSuccess(chatRoomMessage); - } + @Override + public void onFailed(int code) { + e.onError(new Exception("错误码: " + code)); + } - @Override - public void onFailed(int code) { - e.onError(new Exception("错误码: " + code)); - } - - @Override - public void onException(Throwable exception) { - e.onError(exception); - } - }); - }); + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); + } public boolean isExitRoom() { From 9c562a76df91bc2644975383abb12d16973ac1bb Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 23 Feb 2021 17:37:14 +0800 Subject: [PATCH 39/49] =?UTF-8?q?=E5=8F=91=E6=88=BF=E9=97=B4=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/IMNetEaseManager.java | 10 ++++ .../utils/ExtensionUtils.java | 47 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/utils/ExtensionUtils.java diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 6e645166a..025dab1f9 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -156,6 +156,7 @@ import com.yizhuan.xchat_android_core.team.bean.TeamInfo; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.BaseInfo; import com.yizhuan.xchat_android_core.user.bean.UserInfo; +import com.yizhuan.xchat_android_core.utils.ExtensionUtils; import com.yizhuan.xchat_android_core.utils.LogUtils; import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver; @@ -2591,6 +2592,15 @@ public final class IMNetEaseManager { if (chatRoomMessage == null) { throw new IllegalArgumentException("ChatRoomMessage can't be null!"); } + + Map map = chatRoomMessage.getLocalExtension(); + if (map == null) map = new HashMap<>(); + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo != null) { + ExtensionUtils.setupExtension(map, userInfo); + } + chatRoomMessage.setLocalExtension(map); + chatRoomMessage.setRemoteExtension(map); return Single.create((SingleOnSubscribe) e -> { NIMChatRoomSDK.getChatRoomService().sendMessage(chatRoomMessage, resend) .setCallback(new RequestCallback() { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/utils/ExtensionUtils.java b/core/src/main/java/com/yizhuan/xchat_android_core/utils/ExtensionUtils.java new file mode 100644 index 000000000..1c76c5cff --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/utils/ExtensionUtils.java @@ -0,0 +1,47 @@ +package com.yizhuan.xchat_android_core.utils; + + +import androidx.annotation.NonNull; + +import com.yizhuan.xchat_android_core.decoration.car.bean.CarInfo; +import com.yizhuan.xchat_android_core.decoration.headwear.bean.HeadWearInfo; +import com.yizhuan.xchat_android_core.level.UserLevelVo; +import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; +import com.yizhuan.xchat_android_core.user.bean.UserInfo; + +import java.util.HashMap; +import java.util.Map; + +public class ExtensionUtils { + + public static void setupExtension(@NonNull Map map, @NonNull UserInfo userInfo) { + HeadWearInfo headWearInfo = userInfo.getUserHeadwear(); + UserLevelVo userLevelVo = userInfo.getUserLevelVo(); + CarInfo carInfo = userInfo.getCarInfo(); + Map valueMap = new HashMap<>(); + valueMap = userInfo.toMap(valueMap, userInfo); + if (userLevelVo != null) { + valueMap = userLevelVo.toMap(valueMap); + } + if (carInfo != null) { + valueMap = carInfo.toMap(valueMap, carInfo); + } + if (!TextUtils.isEmptyText(userInfo.getNameplateWord())) { + valueMap.put(UserInfo.NAMEPLATE_WORD, userInfo.getNameplateWord()); + } + if (!TextUtils.isEmptyText(userInfo.getNameplatePic())) { + valueMap.put(UserInfo.NAMEPLATE_PIC, userInfo.getNameplatePic()); + } + + valueMap.put(SuperAdminUtil.PLATFORM_ROLE, userInfo.getPlatformRole()); + + //多个判断,头饰不过期才传pic + if (headWearInfo != null && headWearInfo.getStatus() == HeadWearInfo.STATUS_IN_USED) { + valueMap = headWearInfo.toMap(valueMap); + } + if (valueMap.size() > 0) { + map.put(String.valueOf(userInfo.getUid()), valueMap); + } + } + +} From 6b50d67aa959d6777658bc6a37e5debe23fcda36 Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 23 Feb 2021 19:07:23 +0800 Subject: [PATCH 40/49] =?UTF-8?q?1.=E6=8E=92=E9=BA=A6=E6=8A=B1=E4=B8=8D?= =?UTF-8?q?=E5=9C=A8=E6=88=BF=E9=97=B4=E7=94=A8=E6=88=B7=E5=B0=86=E5=85=B6?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=8E=92=E9=BA=A6=E9=98=9F=E5=88=97=202.?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B5=84=E6=96=99=E6=98=B5=E7=A7=B0=E5=88=A4?= =?UTF-8?q?=E7=A9=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/dialog/MicQueueDialog.java | 42 +++++++++---------- .../login/fragment/AddUserInfoFragment.java | 2 +- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java index 11bbd58b7..e4fe86da6 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/MicQueueDialog.java @@ -131,28 +131,26 @@ public class MicQueueDialog extends BaseDialog implements rvMicQueue.addItemDecoration(new ColorDecoration(Color.TRANSPARENT, 0, Utils.dip2px(getContext(), 5), true)); adapter = new MicQueueAdapter(dataList); - adapter.setOnUpMicListener(new MicQueueAdapter.OnUpMicListener() { - @Override - public void onUpMic(QueuingMicMemeberInfo member, final int itemPos) { - long targetUid = member.getUid(); - if (AvRoomDataManager.get().isOnMic(member.getUid())) { - toast("TA已经在麦上了"); - return; - } - AvRoomDataManager.get().checkMemberInRoomById(targetUid) - .subscribe(new BeanObserver() { - @Override - public void onErrorMsg(String error) { - toast(error); - } - - @Override - public void onSuccess(ChatRoomMember mem) { - inviteToMic(member, itemPos); - } - }); - + adapter.setOnUpMicListener((member, itemPos) -> { + long targetUid = member.getUid(); + if (AvRoomDataManager.get().isOnMic(member.getUid())) { + toast("TA已经在麦上了"); + return; } + AvRoomDataManager.get().checkMemberInRoomById(targetUid) + .subscribe(new BeanObserver() { + @Override + public void onErrorMsg(String error) { + toast(error); + MicQueueModel.get().cancelApplyForQueuing(AvRoomDataManager.get().getRoomUid(), targetUid).subscribe(); + } + + @Override + public void onSuccess(ChatRoomMember mem) { + inviteToMic(member, itemPos); + } + }); + }); rvMicQueue.setAdapter(adapter); @@ -242,7 +240,7 @@ public class MicQueueDialog extends BaseDialog implements return; } //抱别人上麦 - model.inviteMicroPhone(new BaseInfo(targetUid, member.getNick(),member.getGroupType()), micPosition) + model.inviteMicroPhone(new BaseInfo(targetUid, member.getNick(), member.getGroupType()), micPosition) .subscribe(); } else { diff --git a/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java b/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java index 4664b3b28..35f526e5d 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java +++ b/app/src/main/java/com/yizhuan/erban/ui/login/fragment/AddUserInfoFragment.java @@ -107,7 +107,7 @@ public class AddUserInfoFragment extends BaseFragment public void onClick(View v) { switch (v.getId()) { case R.id.ok_btn: - if (TextUtils.isEmpty(tvNick.getText())) { + if (TextUtils.isEmpty(tvNick.getText().toString().trim())) { toast("昵称不能为空!"); return; } From cd49d1fa89a5f61e6e0b5798014046f9f3431975 Mon Sep 17 00:00:00 2001 From: huangjian Date: Wed, 24 Feb 2021 15:15:03 +0800 Subject: [PATCH 41/49] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E6=88=90=E5=91=98=E5=A2=9E=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/application/XChatApplication.java | 2 +- .../room/model/AvRoomModel.java | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java index 8e760625d..6f38948b1 100644 --- a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java +++ b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java @@ -202,7 +202,7 @@ public class XChatApplication extends Application { Logger.addLogAdapter(new AndroidLogAdapter() { @Override public boolean isLoggable(int priority, String tag) { - return isDebug(); + return BuildConfig.DEBUG; } }); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java index a42f156dc..76bb5f779 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java @@ -437,15 +437,26 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { @Override public void getNormalChatMember(String roomId, final long currentUid) { + AvRoomDataManager.get().clearMembers(); + loadNormalChatMember(roomId, currentUid, 0); + } + + /** + * 该接口每次最多返回200个数据,房间黑名单过多会导致200个不够用,做个分页加载(云信房间固定成员最多为1000个) + * + * @param roomId 房间id + * @param currentUid 当前用户id + * @param time 固定成员列表用updateTime + */ + private void loadNormalChatMember(String roomId, final long currentUid, long time) { NIMChatRoomSDK.getChatRoomService() - .fetchRoomMembers(roomId, MemberQueryType.NORMAL, 0, 500) + .fetchRoomMembers(roomId, MemberQueryType.NORMAL, time, 200) .setCallback(new RequestCallbackWrapper>() { @Override public void onResult(int i, List chatRoomMemberList, Throwable throwable) { if (ListUtils.isListEmpty(chatRoomMemberList)) { return; } - AvRoomDataManager.get().clearMembers(); for (ChatRoomMember chatRoomMember : chatRoomMemberList) { if (Objects.equals(chatRoomMember.getAccount(), String.valueOf(currentUid))) { @@ -461,10 +472,14 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { } AvRoomDataManager.get().mRoomFixedMemberList.addAll(chatRoomMemberList); AvRoomDataManager.get().mRoomAllMemberList.addAll(chatRoomMemberList); - IMNetEaseManager.get().noticeManagerChange(); - Logger.i("进入房间获取固定成员成功,人数:" + chatRoomMemberList.size()); + int size = chatRoomMemberList.size(); + Logger.i("进入房间获取固定成员成功,人数:" + size); + if (size == 200) { + loadNormalChatMember(roomId, currentUid, chatRoomMemberList.get(size - 1).getUpdateTime()); + } } }); + } @Override From 6875eaa0f8d62c1c745915e68af5d4d7599c7083 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 25 Feb 2021 14:30:19 +0800 Subject: [PATCH 42/49] =?UTF-8?q?=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=9D=91=E4=BD=8DUI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/BaseMicroViewAdapter.java | 10 +- .../avroom/adapter/DatingMicroViewAdapter.kt | 36 ++---- .../adapter/OnMicroItemClickListener.java | 1 - .../fragment/HomePartyRoomFragment.java | 37 ++---- .../erban/avroom/widget/MicroView.java | 22 ++-- .../decoration/DatingItemDecoration.java | 39 +++++++ .../res/drawable-xhdpi/bg_dating_step.png | Bin 4064 -> 3028 bytes .../res/drawable-xhdpi/ic_dating_spot.png | Bin 0 -> 52514 bytes .../res/drawable/selector_dating_step.xml | 11 -- .../res/layout/include_mic_charm_layout.xml | 4 +- app/src/main/res/layout/item_micro_dating.xml | 109 ++++++++++++++---- .../res/layout/item_micro_dating_boss.xml | 107 +++-------------- .../res/layout/fragment_av_room_game.xml | 28 +++++ .../CommonApplication.java | 25 ---- 14 files changed, 204 insertions(+), 225 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/ui/widget/recyclerview/decoration/DatingItemDecoration.java create mode 100644 app/src/main/res/drawable-xhdpi/ic_dating_spot.png delete mode 100644 app/src/main/res/drawable/selector_dating_step.xml delete mode 100644 library/src/main/java/com/yizhuan/xchat_android_library/CommonApplication.java 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 b714f7fbe..3fe52d8ee 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 @@ -243,7 +243,7 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter micPosition = 1 + 1, 3 -> micPosition = 2 + 4, 6 -> micPosition = 3 + 5, 7 -> micPosition = 4 + } + tvNumber.text = micPosition.toString() + } } } inner class DatingBossMicroViewHolder internal constructor(itemView: View) : BossMicroViewHolder(itemView) { - private val radioGroup: RadioGroup = itemView.findViewById(R.id.radio_group) - public override fun bind(info: RoomQueueInfo, position: Int) { super.bind(info, position) - val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo ?: return - when (roomInfo.blindDateState) { - RoomInfo.DATING_STATE_FLOW -> radioGroup.check(R.id.rb_step_free) - RoomInfo.DATING_STATE_SELECT -> radioGroup.check(R.id.rb_step_select) - RoomInfo.DATING_STATE_PUBLISH -> radioGroup.check(R.id.rb_step_public) - } - radioGroup.setOnClickListener { - DatingRuleWebViewActivity.start(context, UriProvider.getDatingRule()) - } - if (info.mChatRoomMember == null) { tvNick.alpha = 1f tvNick.text = "主持人" diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/OnMicroItemClickListener.java b/app/src/main/java/com/yizhuan/erban/avroom/adapter/OnMicroItemClickListener.java index eca15b10b..9f2b8cf23 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/adapter/OnMicroItemClickListener.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/OnMicroItemClickListener.java @@ -15,5 +15,4 @@ public interface OnMicroItemClickListener { void onRoomSettingsClick(); - void onRedPackageClick(int position, MicMemberInfo chatRoomMember); } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index b37b18575..4feda15ef 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -29,6 +29,7 @@ import androidx.viewpager.widget.ViewPager; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.coorchice.library.SuperTextView; +import com.yizhuan.erban.ui.webview.DatingRuleWebViewActivity; import com.yizhuan.erban.ui.webview.DialogWebViewActivity; import com.yizhuan.erban.ui.widget.rollviewpager.RollPagerView; import com.yizhuan.erban.ui.widget.rollviewpager.Util; @@ -116,6 +117,7 @@ import com.yizhuan.tutu.room_chat.activity.RoomMsgActivity; import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_core.Constants; 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.bean.RoomMicInfo; import com.yizhuan.xchat_android_core.bean.RoomQueueInfo; @@ -281,8 +283,6 @@ public class HomePartyRoomFragment extends BaseMvpFragment"); + gameBinding.tvDatingStep.setText("自由交流"); hintText = "进入心动选人环节?"; break; case RoomInfo.DATING_STATE_SELECT: gameBinding.tvDatingNext.setText("公布心动>"); + gameBinding.tvDatingStep.setText("心动选人"); hintText = "进入公布心动环节?"; break; case RoomInfo.DATING_STATE_PUBLISH: gameBinding.tvDatingNext.setText("结束本轮>"); + gameBinding.tvDatingStep.setText("公布心动"); hintText = "结束本轮,同时清空魅力值?"; break; } @@ -1857,21 +1846,10 @@ public class HomePartyRoomFragment extends BaseMvpFragment DatingRuleWebViewActivity.start(mContext, UriProvider.getDatingRule())); } private void closeDatingMode() { @@ -2719,6 +2699,7 @@ public class HomePartyRoomFragment extends BaseMvpFragmentPsfCwlNH7ag`JZ6aq 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 Sle diff --git a/app/src/main/res/drawable-xhdpi/ic_dating_spot.png b/app/src/main/res/drawable-xhdpi/ic_dating_spot.png new file mode 100644 index 0000000000000000000000000000000000000000..ad63b8d966c84e7374c80aba734f9abf0161d4a1 GIT binary patch literal 52514 zcmV)4K+3;~P)Q=Y9WsETy z$}Uyc($!V>zTbD=@BNm;@XgCNkH9KNz!)$v00$1xzZWlu4lTXEe|qWt^Lv-x-_l%q zzj&u(v+Wfh-!ob_mpv)xhc7e!EI!1^B_Br4R(jyQ#3)uXf_?+&2fzC+Jp)+L^1ca%Zytf3 z*Iy3)ey`u}@z(+T<)HT##vJ~(0irg{RHtch29Sf(OT2f#0np2r7{OCC0P_Cd1pohG zI5%dU=ls3zy%ZZy6YzVWFOIz!Oqe&eji>3fBJlTL`VFBpf_1F`Yk2?vqru->($@k0 zk|VC;rO(=z^g#b!FzhSn%vf>TC~jMh3uBsY?^*g?4j(os!M_^EUxn)Qd;FDv&uc@> zAKxwViQ`Il=8am2mU{lam0(30)bIW2Q?C(U_ZTW-sh6*(8nHBJX9msB8w?L?96rpj?~t)Ju@c=`1Ni-*Cr@7< zUjllxx#0yjzsQddel{iW_di$uywVD=gaWNae^w5BpLUErE8cM3Kwqw8EdTU{m$=-Q zdbS$G5{mN~h#u&(ih%M3e8!M+j)*%$kj5a?8nM=BPijk$5n+kxRL<#(U(DQa`pV#%!MC1E>|N3i#_@6%!>-Itq{PY~XX0?@IMH*BZ zLB9%At^lP0{A>37>jM5-pua*RSj_-d`Yg|cu`HoE!Q`ZNhvulenVU5Iz$cFH4U92TaOi2i z*e7jHP1#@J^+D(P+Y6@l{MT2#n{KYhAN$j}Z04lwf35^S#Rc}~0VjQuG9(wBDnu*5 ziVD!>xc|Q<@UI27OA<9}+tTG%lnJY|-tgAb@VP+R70^gvvJ`omBM>>_S&fWK1gABcO^r^+tpMH$ zeR8hVqdD|Yh`pQ~weJmy@;LBL%yir_l@gwiak+rN>^d8Hn2nlcW!g#Ik|{woE({~Ex*D(IgMFTY;&k|8Yrdr!eQo=zh$ z2Mo8tElzq^toz`3h#;&0riLhFYHDJ4cI@GAGp+1)(~^6cfnr{DmW?zXi1uIeK@1I_ zMUwb{Ou_ODU@3GiktaE1M*e>oIy=yD25<%-eox+7jEr;9U>r?= z1r=tp*r@qw4a@+ufYON`c=30Rc(=TKV{*@bJC$CTOfgDtvH`r3GTyj`vmj(9OO2_; z#$=HpRVWvU?#~IV+W`7_|2K@zzaq#>z^w$dD*^xVbUhvW<(a|N4526g^`+6v*FFUU zpkIADjKG3_A3O|B`7o6bd0s)Ns|Z7=spbuxLyx~3t?qL;8w7&@*9uS)CXIorJ{i97 z#&?Uck)!A&93D#`Wd@U{kXde50alyYDxR)eiRsdu_h*tvra*(fP1eese ztn#MKn<+o$yRe~^7!%JP>bd^&mzdhw*&-JB>qjBgAbU8DtEr% z0KBLJ5ww9cL7Ew4ixP&VFmVc%N~jBRzLVyOr*-#9(=S*0l`$cP#<(}O&0{qo zSTM?2-r{CH(YkqDc8?y6hrj*bZ5KDbWY63mzT+#RGu8F4eL=u$LxNQr0;t09w$h8K zB=G0m3sO#>u`x$K_)G3jw<`v}-)P{!ERSCa{HuX^B>=An`2B{^{~lNJcUD?4)@cw= zbp_~wfBLMCY9m6BSD=F`bT^0}zyC+l8SiZ#DqwkHfp1e=eQ70oS7}7IjK0$wA9+ws zoE!sVU9oZd2@H?Vqq$gt?&gr)1iX{A7dld^^O%Gsjx>=Y8un{?41PoBhbIecJaC``d1;v7jQrYs~OO>BZ?x&n)Em z!bF~@^9oZ_Rw6A8;EK6_aW0>go`22YmA>^_m4@r#>&r8h>-nAKRf8-24jtU5ab>tt zBUnOtL^XnuH5d`1eQsy_kw6Fy1d7Y=n6|AT;1zyh>s|+x2<8I-P z>I(1g~f3D&HMStmK*c0eB$HU_hUXXT4Tx=M&-(6-9(-{(p58O zq+V27u}Q6_6YKd`Gk{B!pXI90vlaYL3HWp**7D>}1?ZPEhV>Z1YAeU`_g%+Ia3u!N z1AjOZf+&w*b#U&hxv5**kDUHJCI<$2)&(P;L%_G-ckriw$s<~ukP0g6!te+tZ9}(b z!ICDtk%5N>U;VOoiVefZ(P{xE?{?Hgs^ghlCKFOloL0Jh%#@NPtE5brkbB$r``-AT zh*yWJyf#n)6I|!rj<;dQbJ)=6E$YiWI-N0WSWUd8#8^A8BIbROIOKQ-U)rl{E{pG+< ze`^`XWCsou+PDSSrKQ48qX8@de@$1Bp$=aJd2{L|twS@v@1+u4Dlq3ip^SzmZ{KGG zFd9ZHcahIc|`F_Kmq>$$FK&t`JrTrRVNN=={D1b)^{ z8L#9{?;qO4{Y}?|VtjXnk8WwOuo8hYDF!y(j%wppGkfMQb)L_`WX5#kwqBU&s;QH) zeDa}GB~2UTTB^h9x=e(T_g{(oFX8>qcJQwW{F3IZ)kv`(>eBz3<)H6>Zh51`S_aT> zV0~VuANb{4d@T*22mbn81f#0((SRp{e0JuAiwDpBfygvOuD~q0H;^Em(?HYmqRApO z{a~pN1;of>r+BK&f}iK~v%$bCZvA)uuD$nXaWhx4+fm7MqS{CDyw#Ly`XOstmiBZ9 z7)hG${vZpt?hpKHo>LPWHVm++S`ovWzLkZI=jztG`iHuwAXJ_DVhZ9thiX2fN+J>X(yxTP zK3oe1M~6{uj504AM5X#d?ge{wmVN{x!}|um@8A4nuHsDVR!3)XY-)1~Rh!TfoC4cQEn;D< z#;Uaj6JA63;UG9RK(mdS>0vN2z!}>E#y1<{<1x~R+F5wTUFAd)H=C|cZ8fz1`RCYem@ocX3X+^3J3sc55 z=S)-tuLlC2&ob@%)s5S$Y~$`hHc%gAUbW8ZLoa1vLS{?lH7P%)+A%r~jpDhcj4u_s0VkK%`t%39^mU&tp8txxzWv~R zjnkI{|7xCnl}73w)L-~~A4g70D%7&oioFY2!)>tDi_04)%GWFh|AEh_wY)z4>Z+c< zeBYOfr+7etlh>EI zH3AEKqCvDW*m_Nda6|H;#_PWSx3aX8=qzq4IoZ{%qe?cP$kp7WHq}K#e4hed9s7oE z{Vm%9Z_6zq-@LQVtAkZ~Coy)_OHdzru9-f6k4`%mU{b9Y7Z>&P*^WH(cp{IV&Xq|o z3I^5CR(?|aK(}Sk`wheSuec_ste;u2o9JZ)R6YZoFAJ>ty>|iJ@}ZH<%mTc)P(>ou zpAUY^Ys1dLFJ{S!$9o6ba>r$_x4*WM5%dgTZLYsA;6FtJxFpHNRSm!ZD!$I9Ccdlr zxi9~!$0BeFZjDoUDBva4hxokp{JH=?Q6K_8-9mv_JiGufop$xwvHw`P^^PxONs=fz z-_dd|Roy3ZH8Z7Ta$J$pV}smE&NvIX*l?BbcH9v0v8`1e4b&loFnQ7y<2#?nYQs0F z%805^A}=y{E@C~p3be*8T>!r@i*6J){ z9ZO_F8mIBz0|MjcFGl|pTinkhvkY^i1*i|XcOe>+p5d758;3z)-n@&S>@1p{tuLEn zM*#x=hBy4^K1;ZFZ(bV2&V9oSlT!B^%c|g~C&&QS;q}+__{)yLWCdUYs8lLgnAp_3_rc%Ho9YH(BpC5`!z}nqX_G=<^88HZR`4fpPwNAO zfbk<}rr{6!A8)+q#sAs!_&oABwo+$uE?4byxsvA)8z-zdOMzUg}|NkC+B9 zc5+(c)S=#L(8J|Q-oM$@?4Emin)GrEUy;XOrva=8{<5&GpZAmMQxDtiuN?lh)Q2af;ew<_V7ib2P@$R_85g3yG2lZR16CUd>~WZ#%G#4p%njZ0>RY{A?)*b4%h4Ck z{=(ds{^5T%#x`uSuSvU7&rPN(UC8zPlu}cRYAx_zR_S?Gf`64lwbi6T^TAKn5OG_Z z1>a-ndJKMtA+H%^GX{RBk>&=;S%WlHw$9db9-O>-wCg%vzvZRj(BP=woSn?FiBodq z<=?TV`_O%-yXI&*zURdiG^Lq7`()NR{1v$qo%Ml#%M*qj_>5c$^yOn$?DflET!sIy z3VteSZcha8YY~{NftxzKP~@kMyk!0>2Y=n9XmIlGR@x+=p-ZTPQ3i|>U!0S2163IU zI%lNU2*1#H!OK1njMk5$(*bne=_U)Yj?d>RnUP9PDK$qW%LM*uu*z=cH#T~r9{GIZ zxL{#TKq`);t5kC;kB=YfR$uw%J+<4v>!-j`i9i3BzZXCF=|`d+d+RK!2?T-B-34hn z3smEyve_r|GQ(@V|FR_4C6uRJjp_E;kl|go*C)@>ml^GW$9lCd4q5UUdK^-4h?GHT zW3TX3JIS^2=Cn$sq>@{7I+B_%PA)#;x_?Hd%+QYS4L00zO9L|UW3{OK!K-eNvu7WV zSeT&^cnil*wg$iQspMD@1FSenY(?(BMO{wcw=36Exm*eO%Vw5->cdP8oDag|N%Qkx z`bc*A+zq1WTqM*}O%Hi`;|Va&cNE7D04|NEXCA6IAX`bh zvykcRj8tkysrfmr_=Kk7Gcgu%UfIEfR}-Q>>a(cILD9#;ywR;WrROFTHLncb`QzL8 z4R>x$KJ}4@CMQ3!xGCG#K%)UxX>c|=#vyZK(ymrBi!yIrkd*W)fls$(hBuLI`?x(% z&(@OWOTbTFe_#Iyyt`nh1&og~OiWw?B=c9FZ-5OABi9}RPgpXVXAHvEP>BH(DuGmy zP9@TI4o~LDW+XLUOnB3JJe^f|G}YL$#o&&85w5v*2-T4hL<4sqPVPeT}^*k;HGsIeki&J@4c(_ z*s1qGb8zzf%yVxbI1E=n7#P9RNk3wTf=2jxZ}awtg7F=vz&wSxrNK>%ZZ}0Tl|#(r zbF;IGN}4f!0TQm{xGZO8LCOTL2>2lbl>&9nIH@u|Yh*>Lf!lvzv$*lan>rtS-{HL3 zmR^MAQoOYpBNxz$H`zHU9db{ZI6-doIo+_#V6 z@EF7R6U<7A!xe_k1&$33j=*PF@N(dgLUT9A@NgBPGYV0OY`dMubL2dO2uPUrpmhM9 zbI4RfWI3{~OHr~cTZpH$$ugt;mKLldM8)&P*pA4%<~iejb>w>Z(YHbA2W7H&zdCpF zZ2sgIn<|!ho-`%3&ZQHXz7qNayi6AdnM%kUJl}X1$6fU0?LQYUWb7+m?f~{p8_?XG z^70-xa<6w`mo~ukz;8#Dob@qQ57Esdc)9}PSE16%^k+Z+(Y(vHan%L#1+Xw^`BiV4 zN9-}bT6sJe-*$)%3`}_8*bID6BG(E!&SBCNrkh&Fk}pamQ*vrPnoau}6Zxic+jk9lH{HG={poCiP1H85vW@Wp z!A%;PQsI%ZrTT07`-E2W;4hbb0{z$+!}LaO!Cng)25TG(9z#9gNIecO^NX50Ot|FtMDQT$upI8_Od*?Mgui&FlRVBE*gz9;6@`$1LR4Znj}?TnrPLL^;#Vm z_BqBH5eA3rV0r{R+Kw=|0gSyA+B^=K-7C}hn8(Ew(zu28nGTMgPAAkcIeubRtxNeS zWzX@w%&i`U980TNc^P&M-stqLEOZRYODDYu^4dm?W^AyxWiWlIF)a7|7Ca^Op$2ve zeA6%hvd|g;Dqix$!Eb3FKlH<11rtHFdPLL*&w8Un=fuFaHY&p%6(r(-Q+7qdJESO=%z+VyCbn;;hnOyiy1gvvbgK%j*680FQ2ZRn6Ob z`%wBfzjq-|r*nFafKT7SIo14jgy5Jm(LB3E(yS|si7Q=QIDQ28!H z396kiA^Wzvu5?vSXC*WJqZ!uPqB`J2_J_l(6Isv>AFvJx{ zr^wLToWZASU!EdwIPmA%Aj~zQA&rGxqn>CxP-^Ug3&P15?z&4e#ta=_x-ISJlCCZq zTS5k4ywHmG&0`f*1{pT&lu#^$%zel%vt3(4n_FN&LCYF{&C)Ut23h{A+ z3FwnJiJc=;=Hy(=Xiks6C9>a*cP@@Bq5J*Xe+lmBy4xdf|84c`3wJMMlhb*b6zhEl zN@~?2L+?emx>HPW7;qCDR-E2&xw$>`#?N#EdvBJ^J@;^6zW@dV27Qih>?4#uxbIoO zv)lvo$m4sK$}sMMA%f;U7|&$3@EX&a{wZVfQA#&5<|Z$iRKa8#x=kzxEjAQ=DBQX2 z&medkCZ_U`P9)M~Az4fY&p(!d#Ize;P{pQ^3R2G0$nXnftNCEasEiSqx&OX}4G;c( z3LM6<+3jrA(b@f+|F)jrh66p_-zQM1Ff;>(!5ti_&oPh)-mSMp>6ibmBPZsT$izf-$}Dd0unf3yhUMszofx~Q#I0v;&oe!= zYRM3#*F)HG8ezwSsCZB+05c(iAh0JSFJc0ZhADX=l&OQOIyBEA7jBX9)O!sX17#a2 zfKZg6VKBLZNepGjLCU0Qr4U2n!@<72{~erV(5(b<)@|cLTt_==jf{9=>quB_FJyBU z&Se8PzwoBy$@`Dg+gXYm_SF$DWO(AUUEF_2l03S)*S{aQ?KU^W3H#kpr}PGn&6~N+ zL2MotNa>_k1P}<+`c^dx);&&9rT}LQk|dXm!2}Lel!m1$Gv+Jg#m|ACqeBJxxdKlW z_<(}wC~VxLaU2?VS=pYPf?WyhsKRngAsN6}C?GunC4?PbMT4vQFQGAZXjL+=Ap>bw zorO~xQA4A1#GrOcW3o&r(#qIoltgriK?i=Cyj(W1U(Nui1R~seOCWYW&rd)1@tA1Q z5|3Y$FZ6)l*R*a8pnqo1<$zBw{(4PpyCeW3;DuSX z1W+M){2H{WP|=m@q&tzeUkjwqVItoIAqT*C%7V&SBcjhi=Ye7EpCN6-G94>U7r@U9 zoiyl<1miw1Sc5*b-G~{TEGSv1lU`zl~z#H%& z>pp_ehv)k+Iso^4s%*EOUN8>MI5Hie6^tO`b#P&jnmU9@AasJdYN4T z&Mer=LACTIG_1Cq)oB4&?835aUS~O(d9?wxWple-p(+hV6CUKm@!m1+r#k(!I#(@T zE5G1cT)zPSGdiN&mf4nc$Cn|3S_EUN;5s5O=;?*m>vr?s!&h5T0eHy4sD_E0BBO#T z25`|f9QERq*-ZRJ@N1w;b7u_rb9O;oHx700Dad~~2Gfe+U$^C5-u6u&g`}-;WEW<- zi`Ha3(K#kd@Q=Rc2WstyJ|ENl@>pKBu+5(E!rM#9v0*>AYE|2Ks1F4&2wW@0);)&( z^{c^ojH8{$>`Wb!dVL-v_PVHLd2bas47p?lD8E=awb=q1tQRlX`}Z&_t&$o?W0?={ zH@!T}@+r-$7{EzP_o&oLW676Lp-r3MheKke$qfB$Y(?O&m>!@H!$ zye$jhvl;?V>I-vkP&2c?f*KdB%7KW1hX%~2q>B@=?V?S^SLE{Tr)DlCZ)?k816_2L z<@*p+5<(+xlBzGDF(zLbbcVbc|**KRNM5O&Q;jJ>MU8 zAHP2@t2!?m;P!w&%OH1gY~3n=-2$HSqeS!o001BWNklX59qgj|vp`t0sq&jsf z8!%JbkF(*cG4DMGIfkGS*y1H(G{W{3+ATxuSEQn78_?4)7snt#6Lt9|T$?|PvFrh` z_%Jf6xE_8rn(`5xXg>^5Rmk!j?QV|UTjlaNfZl5PCKdewvW*p1>N8&F<`m`J&b8+9 z_ZtA;wTF>>NtxkX4K67qS!t)1bq%I1!M@7AT+ayjdx}H-mpV1(BXZtCfPa+E9~S0zcA6)v=?;u;(S$@f9mL``r)G9a3~i$=LypY@B0w zF9#X|m4=T@`3OClOi;7(EDIPiuY$?yOK`UOZJ767WQ^eyuNanFH?M8bqCt<+f8_uv zW*8W)e1+{WkmwcI$E=o9(GOx<_iwNx{afr3S^TduG7jPkCsF5^vWacpX{<>io=4 zsJVq7XH@}4g|{^VzX6L#@L*tquFmTjI^*Q|Z4p+l&l-lBk5Ua27itdyem(^!(WH2e zNB-xov-ABeE z2r^w(h3|)!(@#{NgJX>!K-0V3zzFT<&?K>M$z5gzM+uk4F9^v`at~kr-kPHb`@haQH=}dh;TgCr?JSZJa?yZiD(I>m*%N0z0M7QX zh`?_^w1+$=&K6!jshzKJKuOAl@XIlbvr92GLp$zaF{$G1H?)(k- zY!O-9McQd!0{+V#3sN<#oVkTrMTcZe3T%CNFe3rHdIZL)Wv~K|3nbAPjyB$asp$2l zgK-^X(4@BN9EyNXSI}4xn*K*#pS}wjfcp?u?JxKbrvpIVp43q8Q7^g;>giUn06g`8 znwh~ht@mSN_Iaxcr945%JIHDHW{_F~z}AewKX=#1Zj>$mO6AM{TEPfgf)5A$g?-d_mb-|0+B- z@ROJdUS))~&Q~g$dXPgK0>7kEVB0)GgO3^4FoI$jDkCm1Z-Ga&hbk=#-cR{In-1{Z zm5jg(An2Nhv^pl((fzNuy8BUNT3XrImkHFS^X#=OrLWZa;orKYy?FCKF=0lCMq&QZ ze-5WV`+WoVe|Tm^18~4u>Lk}1AG2&{#?|)QUA`i$1o$54>4%l1OnQ7R;6E$C-s&u=ME2tm~fhEgWnU|ae>u&ec_Hh>7iQ)qQI z<>%P9%10jJX-B;-tM7S*X9q`@ z|1(^6!-@VEt_A)TyuLlo&j9Oj%0k&ttxVN|KU5(ST$ep|>K;0yjOw{a-mEg3PinL7 z@C_Ix-HG#;ijUJnTw;s3F#$iLQ5p{XBzKb6cgl|e>EkR*E_gTZdb`*(^f0=K0@4;_ zrvrH^#pGm;@KKHXi)7U$2c*c}(&J^;Hrwu_I_M+vDp0%vhz5M&VYYE24iEk!GVD=E zX!bm`$)Iuqe`>)`(-E|mFf=DqXoy`A^g<4Kt^?39D8iZ^_aSwZtU-|XcbuP7VwP@+ z`dIoyiE$r-2i6w3^npE{U&5}=M=+Oe?S7{FKh1pYdNU9r_o%n$0!$o3bUQYemV5c1 zkN?Rl-c)||B}&jrTaqpT-m=};>A6dW3#?ueUK+!ir6Vip_x+z^wQ1U`0RNc-e;M%7 zGy$SL9?g#QBgkxL_UOq!0QgoGatHnj2PeKC(e@t3@_tKuNCtF;uJ$XFGH4Az8i49~ zV(0Zy6dMxXx5aMl9AeYpCxh#+eurBok`Cgyg}l{;I+0<1Uak)QKH$6JG+}vub(Au- z5xk%V-)mTozgWKpj}9F$9ky4~IC~RA$rM^=&?<#iWB`S_LxCuI8a_iou2$@ zHQW9nR`metDJ7N1%AE|X1i#h$i(^Mxe<^Vi_=(e##7TTVmN0DvMyd~~KRLkSG!L%X z`VM~m=Kl}vHqg#uG~*P*$7yRFj`UHEFkRjAmxXHN^>^(O5Mv(lS_RCn!qgh5Dghad z;GvQCq3OR!u@p+jkSejDC(2{NZ`B>*{1UpDi&Gi^4b7xOM73xI)i0=zm3j)*hXP&~ z^inwx1-^{v5Az^=mpJAW{QBhmLkLp=A7Yx3*DuKvKiS0b>=5(84<92D>?aHh_OV&_a4jpnQi&_@O z_A|WffLf{Ky0_9$iTnBUz3q#ZV4FPtW#^)ME&KE`=R>i|g#q(V01>UpS$EmMy2B+}9y3UJBm zv#tcIhaGn7u1~=CPnsm3WI8*e^6nX$MMbB@&zcqqF@gdqHDDzFAFKG~YeY(0Bfbjr`HL1rKV#CT%?PloRo1oh%R7NGw5;|2gD#1CH#3xPn$+Ji%p3u@9V$wXi=~v$BwhQdLn7i*5 zsO%2Gg3!{P3VD66fl&B3HT-HkS$`kRJCm{lWfCZrILbrdCrw{vPU)eUXvFs|_={{V z73VPrc-xC;Ie$U?iSHM*$5`N#5fJbT@DuO1;CI!@oKvq4Rfba{EP!BDh(OI~e&R#z z3*MdR)NckIucS)@7ofNg;h+7~hOL9I#><~OjCK~K)$d5 z43)Xt3Bt;iF%$T$0VtZg2N2h%Da18DV=ub)f&%I$SE0&Ps8h{#s-TG~#dJ&ELJTTN zmFnhanY=K`_2h#()}P}d{jzskI59r4H)99xl(t0U_OnAUe2jL3MXR<0PYl1yB<3cm zI*>AUz$efb;CGzg^@PwoWKAQ#ZNO4!`jk!TfxkGjMS{!ij>~PL&&i%H@Fm@UxdBka zxovwO&riW`5eINH1b;*4BYI@v_p_4=FUqFOZ8{b=%UF-=&Vm@Y7VoWo%Pqf)Ol`I$ z7>caSjTDDZgFMMBi&B455XcaWM}t0<-LBL&yJQm8RAMnw7;H;x1hf*+W&eI)-#*Fg zIEd9R#)5y1ZKRg}`U(yG>jnNZ27a3@q<-D;*9+_&6`1aNs0>FCIa`%Rmb>RE2==b3{jtA)_lKp* zGAQk3M%PuIZ%|3L195wo>YCj$AKj>8vqi;u)ub6r(uRr+G*Kv-cY*Fvru3IYJ^a#! z=U#Q357yh&TG+s~Zm?tZJxCTd->`Ah`$414!nnlAfM2LTG`xbef13bvZ30AvdMg2ycPk&!R{yuf zsQ6oG?SruxoOL01j7$ood=!drLG0~<5)EYDMx<;2hPG)$7oKb((lNN6ho{cK(`V3- z=it%GK!tpQcC||Zo`Q+g8bX@}2av41plm+?8NfaFNLwBH#(Su-e|^|n=ceCl0ez+C zSNs5LZWQrU{!;m6sZ6$hiw9K`h+-dI7Ezl&6z2&2alLQkPngzw^oa%NqjS(RDU9y` z;Ii#*(*(P50(pJgyGzrAX_kCJi;@h%)f;}@yJqVj!{k*M;v{(+B8$f*iUKxEb;i|hbtDVtnv9a<&Tg^y4?42Cu zd^=SKXU^+(w%I5{d0)2*5E9AT6R_+p(H*D!c=h0m!FS*A0bDewK`L^D zQwiqs9N81f24wimCC702v^CPc(?2`7E1k*rwjY~$K|IsGQ+1Qg+xNe6D5{N(CEYo$ z@~-vzM0;$IOXr`q?;*NFl(-oCU2^^2_J@|uke7FT3$~xj-Y3u#n91Qgu1~M)8G)rd z4*bqg=!GbnPj9MCiQy!sZ^VXsEccS4DZ%_G>XIRhPgw<#C5 zZ4@N2(Hws}(b+ymKT|=S4M=i?`WQB(e}}E{KcONgpd?4mQwSErBni4+1{tIn>qtB? zs|s0EgT}9v=qqc8`p(9caQCNb2>qpE>syAN>R&2<&km^C$LtIqn%p3|9#oYKLF&EL zx0-?A{lwetNuZ!NHAnbk&7aqE-K*6?`W?E}-LDh5(K=B&Pj>qpH&xgURZSCw*Np#r z{+fNKu+9IsI5Pi-I63nmWLKhfA;ipVVEUNZ}!AGb>dd;`yZVki_XSx;Cp@2DvoQl=Fv*{NCkq0becbR-`>&Q*Xc8CoTJ*&|(t7>je{#x03I3H-hVgNM;Tt_*Q-B&T`VWGd6+Vs)yj4BH|L+`& zkmTi62P#V-lMFIVU^4Rl8B_^=;tw-}Cei^aOaP=FoiyZ~{M3A4fT8 zbtph@pQF`*jKz6>L%}b-&<4C@2+o0&Sz*`yS*#ZJppiFsk6GoFC=OwqZf%#G-K)rg z-@T5Wz3q>7f z{bN?X768B8d#=v;uW+BJEB@f60nntj=f{G*_O+=zGWTyVT>CI+M-Y1w8PH5WB_3(L z5jD0Q!UR_L40wuE1(@$#rxkX{xz=_1?Cc$^5*!QnZ+#brE3=4c0xPa<4 zWzmm%G1b1DZWf2)3I;8*2BywA#;X$+ZAVk-fLa-bn0 zD$>^N*nV@VkjFW6SK4tm*}R0JK4afeI~&ZBk$bM4*Lr*_Y0@n%0=%c_SjER0gX90i z`>nxPgDAECf(8-&A+VF-SVJfR3cH+GImsD{+a~VfM$|L{hVmoyu&tdcDUofcu)jkz zh#N|~(`P2n@9K(da;-~!J@O!~Uw9X)>cqtrfP!m3hEH+8CW$trZJqo&8o;Vl=jo82 zRy2r`-_h+ocX68oKRm`rM^CaBqbM@G*28;6JYZLeVl}XNfTH+~rdsq2 z$WbO|NCh>r4xhVhdD$dUl!g~P(t3HSh9%|Im5moGMDcnCqC8{_uDqI&oJwuS%#~K~ z)Tb`9W7xa!E)1lP(0FXn!IC6<1u43%#7>!@G~{6zcHr_kfGc*a>->e)!B57&UO8%| zKepDsvisMQ?o<3b5x;Qa+m-zVRzsK{BZE-VZtef-f zyqiHj2#6eAa~>@7kmMdDY0pG;0*UHkj`MR0SwmrhX2RGS6c=#yU;5{UTCYFq!{pBE z+Y)R(h=BY0aqru+huP2TtzGcjB)pv@t5U*~as*UHErB$Lp}YgBQIrIwV7!oOZT6PD zt2D^l8QLeh=$wp^%`1q|qY2_Jt6c!L2YxaD>%|=nvXrP;AsqL2^vCr)yA{DILOsKw z7EniBTukfKBv)5K*>HE?wow)nFOo{H;6&hN^V?OMTqjLD(;6P3O)5Lpj53ZiaEYWgntNHB z*1bY3`n`VHt$%JPO_Cd~1z>q(H*lt1O_&;lWI~AT|2tGc-&GQ`W{q%!N6$? zQ~IQ~zm#YXfu9y;qCT#7pBmaYjaSXmMa>ot@j#qqqvjwY_6REa%j}ICC#~5PL$$sh z2JrNG{<(buKw8y^Lnso4XGL=2h?c2i@x2;lyvd%Sv0HnR;b#+tx2x1K3a%c8G1I zOU3A}2E~s0qgj{aW@$my2ENpg%Ai}*sB2>jv1kxeHfB&yHDXDRxfOus)R6i_!<=ZO zpC3gqvI@^M!16&mTc;7+q<4G&fsLwdm`Y*d)Oq>D&2mLX8#dFeE4#4024(Wif``yl zNVSFIB_j|tz9gwPxOA=Ol`z7=Am%XTe&P!Rlz0QwG z29W&I-@YPv-s}ERFSLu+Mcc{s58~m^eg_4{=5Ow++99vyBxjQdJKUBGz^)d>N6LV$k09Y#7t$Q4?;81>mNYW6?8YJqF%EMLu9p>ubKY-;M zFh>+8bHFEWpVGV_qB=x*$N-Aun@zw`H(3dMSCMMHEh#^C1t>AZ;8g?UZHc*u<`JJy z;Z;2F;3CB-gWuBYTS`-|3WXX((=IFpDo4DO3Q>9A(w-vlDsC=vd-niUoLVWFJbv+c zX>)43b%jkt7t&`5e%okW^cN8Kr;=(4erbA(s8OOU*YUz4l6=%QE7O`y3%f#W>Ntox zeox%c{4jg%HMZ6AnYvtAz-s|t%#|mVhAuQy|Hpnz;;~bk(GV%V_{9Y~cD&c@Krbo= zAFbnCl{=cKIrBl}>IY5IErK}#)@lE|*gN)L%pZR`LT#f5L;_V>|0x*u-6(UK>P&z) zR_<_=h%P!b5VZLe@eZmiPz39T3qR2Y5|fKavT7szrzvCKK>FE{l)1Dd(yb{=y#rz{P=$=Wf zK@c^v&spV%sErGbZQ{#<-ASRPA-I;$vMj=}dpG>6zjv<~>R+xzc2~xN?pSwU+^0G! z`jD2j74KEbq-AfZ_5MC6p=PT}S!kPTIB1}Dm3A8fgFLFk<|j>y-Od)-ei+y(ePm?z zy(_pEx%p4t`^Wxf9WZ%XUP4sP#z5t}^+t%}0Fm~Kf20I{xrxNKZ5&e-X2)&U$22zj zBUIqRZog*H-2E?=-h9WgF>MJ~hwK<75aF=o0O*r56PJ z;!2Yl3NGzFPpR`4cWl*W5etM=q~>A%;50hta`-hWRx7-`SJI&}xMdJFKz4<2mj9RC zUqykOJq)CrStBSE9Qu1jJGA3ArTRlZ7cU~-UvU54XSN^F1-?D{W7{i9P9@$?<<(S! z9#UgA1Q`LZf|~%?)_o_2cNDKw_;5GxxI>>ntBPn}P8Lxruvj^#^2H*T9in0F<%4s6Dz#tu9>c`p`Hjp5wb z%03D-osF-16(9qMzx4Q>!Bu-dX7bK}qnVb=&WSUNuf>^7_n~%TD}?VuQVlOfS5$GR z1eDL9N%ANTt2J*jbGvA};!rXGU(gDm;RWt2+t=mfRwG*gCNO{-qF*yrb0gYW0dDg8 z?&|oyE2nngFMg&WT4k?+_4=;2z;b>%(Y7h7C~GL~v-HXqum-FWT0l1+m_WYBofJy8 z?q3Xm>3O=^HLk1&vJSqKH!s!LF|)!z9}BNlYfkkeC@5%0N=tF7*{K z&l*kObDL<}&VSf!08l`$zjzc=MgRaH07*naR2FY0k8jJSZ7@r~r!s1H>-atexY9P! z+p_A+Kojk;#dox#SOQ(}eHTeOFqX8ZDBHFMQP%rVTYLnWW>|Re0+jM0tPDzZJ5CKE zeoxAeo$gR_{eG`+$DTO)PrEAi{$zhGO(}I20j|S%u_P3?ZiOhwK{+qUt*XVBaIKZL zu&x}bVw>xU{zTxWVjF9?3=GEG@59#kW605AuiALj{L#z{^fB{c2)3(tJgA$Gv0o7H z82OE_7T}k~*s94a8cRX+{_uXcF&xpH_7F!nvUH|Ced~&^PzflJA)r-=`Hln^nbq1U z$wUnf>YPN`;nVXut9-O#1+waoQ9ouB|BvcSduPu(k^Gmdhxn=F7m%7s42HL2TXZ`% zhA&0L_PB{Zt6i+zsFCVh6fOz zoki=&Ja|~Kb8dU;4`I!gLy**21iGaXWV^r|Hp?!tep$c7ZaI|G4Jf}j7N$ppE%hl% z%8M!H?xoJKj4etkl4-Wo+DV?&Tu+{#CN|PeQcn7;feodf!`027K<0%oa*n-b{G|Dv z>9^=p>~|1B*uP6OF2F3;azA^=rb{~Oo-Tt}N_+a>)lnY@{2&kzTLc;#eRx!0j}R;h z?et+!2oE!WmxIkwF-FM53oewq|P^oGDsATM-%+dxnE$pDmw zrm-n@(~QFVlUh=gTrZ&*CGob(P3cIB6@Zuo$)ME$twZOLHWfsL`gUEXTPcOQqPUXt zUo2yAl??82TUS(EY_jX(-HV_vtg)0ltufd$)klG7)w1!h8x(A_#l2=5=lLmKp*Bj= z{7LcQ#QjP3}ywGoN9z><+tT(|IH66Y#f+w-5i1rxo#iZ+0p8OOIayf0q)7$9)TY3f~F%CZs{E zXn)~}?`_>X_cmitA--qNYtn_cfqiAe78D zvuKHN4dkUOEVTEUN6j;_noDADEUX(Uo}>4p;FYcgrEytY>JA-wUrr+}yuELf(^kkwUaCiKQ)a7!p7K%1XMtVPi9|ibT z9c*y%&#^UrzY`_ACK5fb5Ax4J;^t!i7z=*G@%`S1E|JeK;nR-J^P;HBA)uU=FO0I^x8~=ObYp?!g+uEkn1Wa|U z_xF!yxcA;d-R=8Yw#L87ZEPW~@<2spo{0cav$Zve(HIH0RC9Ayk(YjcX^mmSOQG<`d-lqT2J8<4Gew2!yI1DeoK z^zzyOxXj+VmB1Cp70!W_BikNU-tP;v%b2y_4Ow6p&@XlW(g+Hb%2GKyV4}zcSQ*vz zA=r*G>L0L4ufWa{CF)~2KY4!I5{760jNOaxg)j@)ppN1p|4x0H|2YEGEzP3O9`T$D zb{%`$(DAQ5_{+JA1pbi`!G7jvQuF!88_*)cWTsGyHh_Tdp^DL=B>v>RKQR9w-l~HT zOvbixgZ6D@)VSdVP`+u8fBQ8*8f+PP05Z`~vWb1_hg)~=quwH=KSIAXreZ^Sh z9?!MQJW&=m4A=f#OoXtYx8QbOpTKT=d#w^g2I0o3kO46JTH^nO$ZI>zE@pVGer_A^ z4QN_jkD`$Gr$!X|P8R&`$|Dcdc-}sG7D|N>eo^sRW_WE6uLGp5`6;PXK}&jGpcH5d z+SSi|mal|mDMl%CTCU%dJB!uQCW(qZfTESs?yW~!zok7C{F2sB^oIi9I+a78#rB1_ zqmkZ+u39ih!Ve;5uOaGcPZd!ffe(qF8~MSn74VmG{(i4dz_p1bd`7^Bm#OX=i zbkA9@UzRh|0kW!(a;s6XA`z8h4IjMXL0{-PDp8avTN%@iZ6UAE!7cx#5$-M%8vjl#zGFTO;r~{>>n5Apv z`6(KpTav1r;!}d(dVka)D676_;U`e}?w!d&a@f z-tv~*oS**@j1T^%Rd!~x|Aq&qK9C+s?#fSOKO|dfw}z!6k;miPCApZwJGpD!%kq0N!gMub2#>_&AoBI9`@Z^wA_ zX3M?1RHpB0YZz(lRAE@DTZzrq1=!jY1{Qa~n=^KU5}ORVL|3%7-&6OTmn)08%BgTJ z_##hkgI+r*%K^N1ExbQ@ebV;r3AC>z{@>^Ii8k5E(qtS8d^ke&d#;8UuOa!n6Ue@B z9yF<%=#+QU21Kvij^yu8LSN{B(_Yn7<3qZCyMy?|ELcQ(gX{is{klaLm~DkDOB;$f zw@_ossszjN%TTCj+3op39HTix#uYvFay zO%*%mnVvkOFv=005E2+;&;t|Xk-;`L*nlwx6CQ@&FEM&J0e)aiFkoy9Mqo6UV1fY) zBN-t;LRk}~iQUsVSG?(*|J(bVTV36nkwmaxeHwLlb#=wP_t{~swMT9SP{i@Z{|*1; zWEkC_elktHUU-T$6cFnO5s5M-Wc&#P8Cn>z@uyyZ+=%|Cp&KrKKOAQns!>G}RnZ{I z)Bea9KX;UfA1iPIE(SOHXp)+PTZES{gPdu&cnz-X{s>27iukoAG^t{Qq>MpBr-&nr z?&$&Yc{7Nj4~;%>a*+91h?NzS#!@=Lhky-<*@w$1u3VUHwZ?BA&E(z9P7i}az=ok6aPkEln3}HrX!*nGeCP8BB11A9 zq<#@mgeUP;Dt2kfLL5TS!tOLd;(Evr;cG)LxZu5T{e_nCD;*+yC|qOwbl7#C<8hHo zc|LV_6p2}hPF&yrZWNs>bt3{Q4c6KReQ%+}MyM)co~j-m0J^)_5!ndsl4{J(LCnk; zwFj4qF-zaeCahV1oAZ6s`e>;@^Y>)f(tM?Lr$p`JG{>9-*;l%brFpnerdFtp{EU)Z z1-Q`(MaG)Degw`)3E{tvAwIEW@_IU@xUeLMgUf?1;Y(;rgGvQviZxG+Ax(0e4pG!+ z!V8i8t)X+KXFEJb1IQMqS$qjr`;Q1e%l{@`KSo553^h_rmuV zSsJ`O@^gZ~XitI7*SY8!_TW*7aEp-n5<;EFw$k&kyYzpU5w+5Qt{P?{IRZNafy*d` zpw=ci9eoHJ*lA5hLj@&&I1*T{K#WfU)f%4wW~<}sf*OnZu_u7ZXS2wikvbTtmYCrV zVeMMEzI6sRdMaQU$4|9TTZhLQKe4(PMr1XIxGO`P*__RnvqOpUdCTpke4i+@qL}As zAC8?u+$21oV+iW5;NHK}nS<;Ipcfiuu8<);vmun#0Bxl`HuGzxJa!gfgTf~F^MlXd{eHO4G8*+7R7^W!+j4$_L|c^v>hQ3Br&C0l>q4q?cy{lHQIr>P zszXsfGk$UaS}_%y6NmfgJVA}kfNQ89V&^8Hm}dv!P7YZTVeltsfazItJ8sEk0~}*@ z9PxRGY_aPU?Nb58gDO*2n6yW5fty8pHgww!Vnsz;B=hgd*lp3vZCP%6uGRoqcZXxG zBxw^PQ^?pI*M*{uEo4JEpF2a*%nZ^>%z#$DHlqw~t`EJGlntXwDN+@7>j4OmgZz7=z zY1cL>Nl+$R;@GyPwxAd4K#7w6-{LpA{)8RpR_**}Il!5XpSmuEQjQggONAVXm99Kk z|6k2h&MQ4ZT??`TGJFHxqO?b;5ISl?kwJ3gcTn8wd~D!37ydOQh@V%7)OCo35GUdY zlV3BfPSWq(;`v|kI5PA z$v|ySo9nMBjI%U{P6CQ@>_kRYj*QHk7$?sK5c@BJqvX1B!uZ;YR<@j8j~0}rKs56wF5ku9KD@{%Pny8OfG52V%N1>8EL zx|P+3jaV-WvXU|}eNSl-Bs#X^&-$Nt(ckfOmfD=u=Wi(~97xQDZyKV(hZ_`-FBSmV zfhelulD@ZNQ|>hsttsl8e7_0QA}B&xQrbgXO&D-yU=8%Sn8;=sNYozOz7g2Dk=t-g zKCw(BG@8Kp4D{5z>E(N_>C|weN1C>zRV*VGlZp1ybbC0ZksRGA#o?ZRN)D4Tx6BE_ zQ(ZE6e)&{q7>Pyhm$Ti`^+vscjgn3TTEam?BWu)T_?l86%KK@u8#st(XOUJzWBe>v zXt6%5)J9?25M%f(Yd3zIzVpZ2@_{Ve8|P<&41J`-5k2`5L(Ys#keY1yS_!w&I~(%VEi`ePK-A$~rQ+W;0q z+`S|If0y$gcs=Xrpt_lm)jk5+n=6V40wfFbTdNPvzPh>KJzFJiFB3Mnup^@(|ZT^{Wg;QKye*TZ;viGEhk z`^1i56B|7lKSljo!$=r5LMSSHsoTSdN&`1GkZ^lklTmO~RltTmh~3*DI!h)EqLw5_ zc?rF+1e~HYfmYWV*)+p7r~bT|U~*fNa^6<-7c39ThR^AcHGF$Au;DZL+dw1egXgq| zNo3iymk992hzJ>JcAnFK%M6V;?V-reAU4LiK<9i;apLJ|q>Y#zfzzJ$P7mXOEUCp3 zWU^_mL3ggg`YndR&c96I%7)Jy-_5MSIe!e!@Fdq&l;@lKuvM~4fk#3`(x$$&fu;f^ z9{j1_g%fRJ#JEx7pw~htpbt@v4q{XIIu!Ld5_&MT0$V!6xGvR=}NdUT8f6!Q01i%S_s{6%l@p>om-HO zSQMTZ_j<~U2-6fvvk4_axbqR5nRFH2U{4v!_uU|Za!1r->P>1{{-X0c-Th*d(}TsT z$@Mwkr#5E@)MF@OQ_(+8eXL>v85n;!HhNk5A8Yk@9fePY49aZsdQNkw=g*{YYxoSmFh!qn zP-e%nahW9)hMd9Z1!qNLM2nKaMmtr+^W@B0|fmm@Q9u4adYvoV2AnM)1L0 zGE7lh(r?ltGA9?JoWQ&MG00%W=n-)zv(5A}1T@z{lmSo>Y_bEm%^Tp&Ue9fBEh$x| zjhPa%S%wG}KZBv#dr>UXo@`ndQ)Pj%;o%sU(`08Y=Cr-IJ(I%V&)4{~zI(=#B_Ubl zY1d^AZccJuL%I|M{2~aSc_ULeP7H^3zos#wG^J%8aH0rWhNxF#ma8^P3rwenitAm^ zb;Pr_HuYyGck7exyVa!nuVSaWAYap6N04sBd>y*l0CQ(E<8MZ+fX2(*XwYSipH~s_ z2V&C*Hh#l^Vs&Twexw)joDD!{*%Ho8amL2DTt_-K3pG>affYqn#R_J2lRKw2*5Enn zXVY8T8nsd%rYl7Geb(Z%QQsOrI}6L1m^!6J=FJ?}E~8KcZ=f`WhFG+qqeQ6f80pEw zP+plQylm+1TH`mGJ_g@ozS`5UweiJ{{MvH?oYVBIo*RqQ13A zJ{f5c$i^SBNHZx@yW%|fGdD7&I&C(Q)~OE8!zF6;X!Tv_uKpv^fY^2`5N-{PY6GR= z2-hP$oAE!9wB}Fa08fnSto2Kb^f*{9xyUCT6m5)%UAUg546<0Gi6b&194@V@pB3-T468gbmKm+Al+ zKczldi<7=mgl2&#OCjVp-?kRn88aNaiJF;uF&D%oAI`3g5Ss?fyo>H9JDRD0pISzI zVjk%{ePYZQF-0wRdrXw)g17aLz-wlp#VQ9D0&VmzS2?^HwuesvtL0;&sr~3I0FB$~ zj({S=&m_oc{9h;-5!}g>fR|rQcQOaD25;mHt^Oz7S0-7KA)9SG-afJ&_hxlK29l$g z=EFJXG`w9$AriANZ_S|G9t8YSxb6#~V%j&X;5M&x z#>hXCGjhCYVf#(hVRC&dPr?e(5{LrGz6SiOAAt;-R;+dvDPoFtdM{|P3%y=i$E2aC z5I^!9U}6Nq)rQ9lyMirWy&VH9{{uO<#v-;ps;J32!akBMN!NFJ*zngW2WAx4CrXE& ziX)h};7qcFnFA1$i%9F_1bt<>MlXkm>#h{2R|N_sjg=LkKq66*LeNyan<=-fFjZ0r zvL$6^OCP;}AJt|2B}DrLCJaN3sjf z1ru<$KL|m>804UB;8+^i(S9^S_0s$&r9iW|88~ni1Wlo7VIJWW6&Zgn#bE6{=xzKH zv~0o=6;655dK0~a5svLs*mIM?q0@VlNl3O^`QE(@vS`05`@TiYdWyTcRu8iE4$u;% zGD5N#rgcKc1WF~r^g?n3x-5DExdnk{kLIuWvSP&sx>On(L$s@PQJZBDrpH2tU;p#( zJ|m~D`$I@8Gpjv9^S*thHsfwTzs|} zKRE)Y6Nd0%x+sPS!n*i2-J$63?&^ax)M1KE8lq8@rtf2oWVVjxqf3a#YAh~G116qq z(hPwIV&r%h=F7&gZjfbje69sDB8`;>G1A|*|1AU*JvY0Hi{}tj@CGhakcS#O1kJiQ zM%mfO7}}iQ=Jy8YV~Hyk-_s(-+ip#!Th$__WLx0{DMb_@ibc2`-Ehl2yo6E>eFLI& z5JDF+oVZnARA%!G8@>ls8Gtx+2~g=VT0`_)Euc*nzy8XU=XQ#=oCYi0n&)m@&Pk@$;3E_S;I|5xu ztcnOP?H4k1c8JAQ&s^QfDoDA31ZgXOdTW2l-}8gCvap?t!o<;XFn${@j6a1H^kQe} z)wrPZ4+*@cSLy)$quxG8e%s%tZVmPLiA+MI5=t@X6tMkyUWUS&Ge&$h!=9KZXtZuQ z4d7x>vcpiwaYwu0p3@7bzrc~6b$BdUoAUYiR0Yk$D~QJGM#G-KST=$)w1GQ3_9U={ zt;z9Mi(EruH#$D%9BIQBJH}bb0nE}loBNY`BKhjc!w^BCrQMmSH<*+zBeBz03u?>e z9=6SCI>Gkiq32**)I^SV%4Ikmop3sP;Fdd#L$cFSt91p*;5R`OT+-&}WQjLRYBLuh z!>{!Mhb{mX`#Ieaq}xwK7D{>C9MDnyJ8WqD9j7}9Do9a-x6(k~jervgYp33HliAm` z-sqo-@zX{}x~$)~aJD6OXDue4OriNqa)s@(CrpQ2w^!AAZTgpukD?L&E^0J&r4Kp% zuGrbQ5rgQ)f}g{#!i~7NgAk=cFI0e~8u$1a%1rv0yl6U;1~iPS3|e59o7-+S9u(`m+u1A-VfA82*{^BkK%js^8b%oSfh%QCmKn z$I@H5Z(mw@?-ws9xi5N9EzT3|pQ1hyn&0faar6WFYo{(iQ%GzrKMj|4z8fm-!eY(z z`Dw^iwYFerng9SG07*naRFhqXG^eIl&jT(?A~DMjEhx=kb4*)Na2JNZZ*B7>2QYLe zqjDypGCE#pAj?iq4*oek@VA!DT2v;ilLkK(mGtq&XdbJg{>Tc_*^t3%%)X*WVd9E` ze{jK@txcj|S~J1$AOOFg0vW1edBQk}Wq{2L{FIhN8Fn9&C=j!t#%iUO`%`A=FKt_)pv$ zKW=GAW`*sB-@2~f99^vlf4edK_662YVW;nt8~=LGIopZw1V+zykwyKFO#dNj`S)PS za&Qy3skbh@)Y%yS8&Y>G5-*1ye*{7~>}#zv=aJF3#%6Wc+sdG^afVcm~4V za9|Uhe(>5)?#O8402a4zGLDRUYEA+^5iwBtLss<)#@a%S`^^A zc{P7*f32CE`a=H=7yhN+Q(VI0B9WhJk6RU$We#Vur7ZHFDUz=@{PnjvizEDG#{WdA z(32QHMSXqi9w(js$Y({xyNM$uU*hQl??ZoZEh=>j zZ=iH1%lpXzNH~fjKean8iQMAp8MZ*VJ`YjN0LwUl3A*G2)R}0ZH!Tm9i5VF#-89Nu zBo=z3ye%c<&+C9UO2Vt!klb4Ybj>G0c&LKLp(>)u(D1nlGspNIGuVD*qjX#ex4Q_ps|=^B1h=~kzn2WY zWXyq`-*SoVDS-m9WPr3CeyL0BauT35N+kZN#@vgpL1Wul2P4lYM&Ldl8BnC`jP6 zhAuQd>b_(6_w=_O8$~30(C`H=>;4^VFT8;nTPqgPnV~srl>3`*51jzi?iDn|NT5(c zdg=&NWd%-GnI3Ad{Nx1$76${PeFL%I#GfhWDxIU{ z`OP7jTtGUvjAU^IDe)tyreNWzY?BL3$ypT0oEWUpLmXX0StN}fhY1H}EfN1qi;&%J zwT@G_Ox*T^U(}JSd2}gfkiclX+>|gOc&nkLf3t-i>AXcJ9|xe#~TV8OpxK%f%Z;zNEi)avNgV zhr!}@T;26C2wmpXhcG>q`%|~a8b3$=OemHV(nvkQwmG>&!CM5g=x;!3>;PE`#CRRe zQY%K1&!$N&DL!M2{3cO)LWW7Wo_YeO>>=1%MDfBB+#Xubqxd9ZC^0RgqXyDKgz!`Y z%>#ABGX(i2w563N;a>LYyPSd96w85R#koRS=m4S>sL7KMUI4Enk6@$+!G>-G16^=B z3UCSmWFco*YE*ZSLsI&a89F%?VQgrd{BjNP#2liD1td#V!;_!@!!1=JoKxYS8U5-S zRP)3Q{F@b-DX*s!fyAkVSxCncC1m*2(AV+b(fl+ z(81gfw@@k7N;TYqgWS#n3g;Ez^^#F2sA|lHCRvI@LDf=3C!1&&)FJJ^`W5NkauUC;oQ(Ki>Fi{^+w7 zCH?SJqW#F?+Mqqry&Cy{f>Yp$^Q*NOzO^p$RE+;D1B&<)G%INp@I;GCmfB z)@Ai6Ihgz-g5&^p7Jd=ucl|BzwxUU|C9^Pro&GVhlL}u0b714Qof<}8k^}IRm6XfP zhsqg%ozQab&jqn5nA!OFdm`#&L{~#Q?@Xus(p@J+(7|FJ&Ygc?<*PDC zM$-nZR>1qWf999pY9_O`W3xUGuTOC}$A1Fj&uV}(1@v{Nz!Mt(8Eb%_#^~3jKl**| z%cJitpF<;h5o32K^|33SI7&mz>8|89nM?1&b31RqkpDc;a%XONMyp*Pb^t|BA#4AJY7LNvw~!Lg*!APYbc2QMXgHgA)RP2O-Mby@&`LUed7li-F@@*W=QoU2LIT6wPm+EdP}QO zzx@QrZ0-q8f~TJI)1Cc{hMzqjE`Im!b(4+1`A*l{`iH1B0^Mv{LbK_`bGjmQ9VN_T zr#~z3UZo}H zN2x}^vj$8~YIXg22xd=0GVZ+L7;|TgPLf!0RBxV`LwIrl(Zn*;ib-u01qMP$GjBz2@ZgjZ{b7hX}P_h|AR|8P^dH2Qf0bEa_-(wTqhmXF@} zrPc}XxPo?Fq_>7dPO!%KGXq=i1nV8Zo&ZnX_>fl9kinWSdbk!B|pJ2q%`%JUNf>^s>P@Wg0*_r;LT+48F$xCY$^TWd|m;$ONNlYVi@)Bj3FMYf`(x10A%AlP`uzqa3V!1>>#Ay=wTGv2*0#3E)w4qo39RetyRPR60NFikS@7 z%uev>M}A4l(ch4|c&&;Wn_1f?>)epx*)^N3f{Y;vc9Q8To-Ar7rS3Zqc}yRF6`Nv& zYYohSid)VD>_CaTPShslpY8S+CXpMxOjblDdBB`8e9n!tG%dpi*&!K!8f{E1!|X~R z3mydN^3d%9D#DHMEiuyAsi-)n(%b{_=6gz;eaV{|747t@#7yp>VVDX-1pOL52^|pUr)j!PS<8`9 zm!z7Yc4`IHM`loc@HC>O21j{^@cY!(v}=hNyTdYp#@G#w(Qa#G&2o#+x3?iD;J&>Q za0g0oM@mRe)`2E*h$)As_mRHRZe5D@Wb_{E@Hi>SsOI2wxYHP@--40aw^2;z5ketB z15Vh00%^^JSgNP!bQ2t(Ng3TsmjfSBG?1dyclzdAekl<`f!@dg)&s z-}}m3GCysNywS2zGJJ9Xx|?A5dKpfhP{0Xf4$*#KJe6AD$&LSKnChOfZ8f}0VDbz@ z3BG=W+Mx_E(cgNoh(>8!>gBdMap_{6>Pv-?yR_$=%jQUv-Haq|MV1(#MsFDzH;@0V z;WJLA&G-$%*<$wTFffM7?>0M+)zqXbNF$R@1~PJb%nk?6mOS)C3|*nrD+7xGsuCli zg&g%5=~Bpsu2w?6o+y{97DLf2phk*!3QpNYFybM9ZV~_y(h7Bnq=d)OJ%lr!JP;KoOmsf=&)b!wNX1 z97~_KTA0FxV>R}vuyr*RxH)p{R1D!e7_NQ+g~o&Mbb{DP5sNzfxQSXLgs4P_Nvt~7L@=FeeC4X{n{OUFvG;oF474up za=%DAXIsT>$Bvi!u{xDDj{SIz+IPDnJT4tt*Aji4@jvCL|I6sni z<%T%JTUkgSx?iChdC28@Al-hzE1=uI6c_jWDe9`I=R=69(ZwgK9MKESq>6zkEsc63 z&1oEfk&X5wXbF>L>pA&BtueRDaa$R3nk%G4NT*rSR0C=;LP}A4IYhGDG+SDT#6pC5 zZkbxp9kntTg-OH|VtY!aC@QKwC|Cy)-hhw7_8fvuMfm-BAnw zEn?-~(`X)@Lo(AqLQJ#3gV@j-^fBjNJGN{;;8!7HJggBs zVg^uIz-tw=_dBNI6`^G}MDyW48G6UB{7=1ikADJ1Ns)cM;kzCE zqO|pfAXzw=HXk{jv^xboRMKNoqwKO{;mjSOCpP|{CF(z?4TC{1oGNU(?inu+aOda3 zHOAjM4X!uOck^bKcYx6lPjVrs}1)=*i0p6(JUpN0iPy>=K zXZ?KUdmD7FRb4O=gf_>g7AW`jVYT&*(gH!G$>R+WLfL3YJSMo+XU6$M?MhY-E8esBi$Lo;X|UqN)b%KTxc6qt?=cWPg?;#Ti)?V(-3a?vMY+1~vRUx9NE4Tz)@A=P{|ic+J4?zkO=#eS7j4GbTX> zPENo-i~?O(zr36-PQ{BqzO|8EpE&_JN3v4X*bLw#um!cX6JUD+oE_Wq(;9x3prQJa7=p_a8&hS4Q!iev~dALdR8`klWm8oz$wmk!}#3CPf0K2}GwW%r|bH zsG@mjiBANI_|l^S)^>v!phm`SqCS5QngguD6u6bCeK>9a+3nTEaQb}=HNK8g?LIiV z%G!x((twgpj`oQc!>dPV=3~qqRv2t(RI9Xb+#1~N#(LKoK3zq|PhaOg{peSe52rEUku?u*6`eNS%u z^}iU#H$FLmA`~uqPJpyqWBFFL`KHwNhjSk z>KvrZ5f&3*CBxZQFE(R%+EGydK;Nsbc(cCsE%`-S zN=T7^_Ef6s6&+7Jrh*-pI-NJXZeud`;PS$kKCC&sltEsou%OWg#8XGp zaPkN{;hAcIpFHxPE!RI=SLeB}_ptTS5*kfetxV|B<_kCBvHg#tGw{)|QDSU=1z)>2 z0&IlH-mGDp|F=$nz(=vuM%v-#4#?Z3mhr!1X zX2*6|SeVK#Z{xl^p)VX0^?&>z!kLO$KWbAYu3yMesll4};rA9$x^fuB%Ld?&l;QRT z-0LSO1*dwH5(RXa+C|uuvQ0%ujx~{FUahBzfx*L7X z@1U>#V|bbbrBYU&)uc};Lx?a$?8nGa1z${%RuYUYE9|Oh+;PXM(Nmh6*~A$PpYr*w zd;h*U|5tD9aJK!=J5{)NA-$greigx&ma6~oYg>)2?^pyY4gDMW4C`) zcD>}S=cFeeo}at*v(v$je#h<8_LZ?NR4y|{9mhnHOLidS^ z-1WxKFMglqwL_N==Wx|8mf_}m;TJAK+PnvG*ucrdHGJ()YQXIZ`}eF;)#w#)^rs7* z0KS8sogPBkb<^p?lO&#%gOEie(uMC8v7_`N>@5DaPSX;&_%xB92`^MQQtCs-U)N9# zwdx3*0%bLVH5mGtXAEYln!yb?)nRUc&F`%U6%)iby{B*JcQjEoEmE$%nKx|nZ!1E} z`962266n4mq~oVizxN0f6`7opaFxEQooQhQ?0m}T^5?d9B7b2&a_4r!-&%w-5Ewo) zO}mW*Xj_}tyq#(~g+8UArv>DK3z-iRCvuLUJGl!(&F`b!IEtK;AXW)&j)S0SEg5|j za*Cs(#0Zdeq$o8N8$J=wS$B0G|JS;l#rVyzs*%#1XW^5d`88+g7j98W#iW}&it)dt zPrmP_o;QB5vi#XU>v9J-`@#>T&gFEx|DLAuwCZ@?YpzHS-aS5h&*#QEFM2^iI(bi& zJA|5GM&a_j&_BwhoX za{mPvcK#j$aXz(~S<#K7KFJ%}bf~77gG>9o2o9~d7BJvAmK?WR7LBqqDNx(hrtAb} z#VJR8VR--+25nkNR`Mh>T2^AnRFbJLZ@0q`N0);>O{>dXOgH}RJ|s0-PDdRUJDjrp zSenQ(+#s78+rpJGQ4KIQ$lu}Y!13vpvQxZWtzUTy65)d_+ zh)5iQ48N&^WWQ6@N3fWTA?H)BM6IiY`?F3t#d56J;H#156o;Zck~%`>H5*%zml?n#o?=q{`QM=PS0RY zlyk0{U1%z)lH#tbpB0}ve7HWo|3t83cbAA=Nlz@9n{OmX9*mol2Mqm;!qIY$@44Lx zwxFNd9_I3-`TkRl`dPmIv@JdcwiS>o6#=IkjyDR=y&A%~21xFKO7B9ob{t8xh}u#e z_1QX3A5OS9Zl42WCqQ_C#Ly6Jjgct(9^y_9`J#_R=HN?OSyDt@gy_y~#JQcnis9g8 zTBQyx!ZwC)P65UNRS0pp8vW__R1}jVFgA$P-!dn#G(@vw%NP@Nces^lL2t&cEP|AW zZ+3`~>FhI4-r@EpC3_09KhM(!QJEn9d@crj>yN9Y5g)!mz;nKappguDk43LSdVL^ z?$=5^j7UG^Ew7wJTB+g(7d4(tM7AyNpY_|7kNrg-w*JCvMSk?{I<9vz*@m4|0fk}5PgQgdUG4Q>^NJpH z^lXRgUxOt29@1!R>HcplEZuQOa|?~BgVD7{|G2mAdWoJM(Q<&Cbdm4&&~O80b5JXk zn$ave;N-BW_zdhUzCstA^I7$Q22Hfeh}CCMK$ z88{&=jYxGopRXBrM@UhFW2Lo`>Wf8*YgX)FTPNCq5rvup_8Fi1b!K{$v z=b%L%i6>C@IC_-{ zN@A#r)J-CNa$3T{#?LYhTqCeZE{kMY0u1Zy8%Qwe|7(&srDz{`K+cEG=Mdg`3eD4s zp#!`O0%XKyK*wg!@+8tsWNqGWdi4f@Nwh*{RFUCRH%Af3j)*WmL|Ko^P0@WAmiNJL zJc#aeHtqCx2v?jh3Ua3|I-51MiXqC`1{sqE*pDJhL-<9R>&;enOL7rzLugDXEf%5m zl1^0EOft`&IEwbp(rg#3^9wj3K+5i9` z07*naRD6Bx7XSKBPJpK#`ROm7EcLM!e)X!C zc1Mr>DC`-EYS{Lh0fu(uF@8Lr+yAicd&w)e;`?8IjNjx-pP9$_a*Vrg39<0-`lZyX z_D|h{43=tO5P}^b>XUGlgIte`lIJ7IdkFGAv`4g}Jhxa95n-TwE_RiE6+O-`Y1%GX zPoQQh(DN1O#X9s%4SInzL7U($Fm~Y`Z+hg-FT9Py7(2-X5F>hZa z(9?ZdFPQNa>71I+sDG za|-$Zl5|pPH4exbB=v=;R$0+23w2dlYNk;&jHix8X=OpB3zJIKmUM`UI(y`&*Y-0M zz3pgCew%*$F%S3NixZPaoGpKF%K*OeH#7Lg{ur;n!9%rA!a1I{hFoXM6x$sDb`neq za&)1Bi!S^2N#wT$h`kb&>Wo#cLp0)UF|p9C8`WLNJI~g>xD2&s7pp##+8S{KNC}Q$ z3xvAt2p~H1kezv;BgeaML4zcUq|{r_mPWJ9 z96(?52=eKp5cL&!Zo-PUkxC$)h&M=hUd&%g*Mf=IV^Id|$c9T1hPt`< zFsid3Tzudk_l>^w{f)}o-*ujTc<9@O*Il%cYLfabhar0X&-yo({#b4q>=AzNh~wu* zQ7AuOCGk<+tlf*aF|U{BrqtBbimolym8?c8RBKVh6e(E5(A5NbDTSy9S{Az_ zIokE0yQTD9F`>wg z(dv%0zt4}p@%h2PwKo>?mppSP>ftU8y#)%}wUC>=jk~*qi?UM4LxC2U&_9n#BF^84 z0A~;()HkaOp=;^#_;R}V*ki)U{V1NFx~=;~zjA-}c=NA*<3?w4`yWX!|GMJuUMS^| zi|}8@5dPcbvbfNBRr#f(w}&Ge`lMg%ak~3ouIrTt(v`&@)3K3EpIi(l4%TYp_eRc& znfS_TD5&7gzP6`6)cN`O_4!-IZw$Zj8=rVJ>iXS+O8I>J$GOkG;jh@Fj(<0YPu-DV z?_LrmHEMA5^+^nzOtA9Wy}f}f4r!%FWWyWLvA<0x>99=HHWj5?MZp_ES3VHk1&-bv z#e4D)eIw(89m|YiB`(y=fYEE3G=DlNLz4Qwg1;35uiBI90NuYyNcPc~ku_dQm02kEP%H zy>8L$+oi(dIkH~93@i90(c_;Rym%+PEjfts)4cz<@gq(}zv}(oIq%S&Iu=^`{@{)m zr^_=BBvTWIWM@Z*Zq}M6!JhVg_>_dP1m4KSCF1qK(c=ldZtnp`Cz~7EFBb` zg&&D>aDTqkc^L1!e)%Uc?6aM;Kk4=K*{)#YRvmkrh3q_EI(@rz}ms;3&sfx}U}eA;L)QkM1~Zv1-yV(84ges8I3cJ!NiL|o%Ps}DpyR0k_a z50loWUeRHA3XXSL5`oj8zI+Yjg>*W#ke$L&CG8+jTfz7r(FMDGpqC6iZw$RN0P==a z#neVBKAF&MmsgN+Q?W`wH%d>kRK+yuje(P`5sH$2M{7#S@LLf&Q*Ou%dcEP>w1z=B z_8rbr9Da=UQ=l#SXAh7){_1hCdOumsur@T<-?up&J>Ps_b`5t@K}-!t1yxC*XX;3f z%ppBE1wFY;)9zWs$uty>35A2gQO8j#oc8*ACsn<^l+4c5R8WXh9j9HMZ&^J9;l z$f4nNy!4IFNDu$;#PV&QKbgPi*#)Pw*F(_}sv5@X^ob;1-XEt6k!tVv|Ll?fY|-E9 z@-$!dp%;jT_f_W^U2sNyE+z@TP78|_<*G|GP@-;#Rm+ZN?9mH zVd|e**2b*|27ge$-E3fF!?kTlgHFq;ueLyI0R7gu+rDR{nw2ZhB78Qm;;3uygTHBy z%$YM}&XGxs+n*mNhqR`VzPb_aY*oyfQ^7h@RzSCxKH1;15*w}eq>~{B{_|C^$C;t*$Tay;F<|~t&hMqw6_dAi{P!0Z;U+qeU|#P zB6OPrarCxJC0dcb?WEwlTxayzGjF9*ZI9b>v@^WC*6DKQm!1*hvo4I0H*r}-0=b+y zA@cNE?4_ys zh29OLxzbC1XG?PG&|>xbpImTsUW$B4h@dD$FvM@V&gV4s{Nq!HxrP4o$@#PQe_ifR z#!r*D;^C+L&^@>NJb7UrSfq7~mN{j0;xjxuw+u6bZHdnr%t69 zzHZC#+YGHuR>XRSO?B2q^DLm-VU7v#St`?>>a?F4wzy>>D=Rf(Ro_~Q6U?7Ay-=ft z)9z3$4_LM2)=6PsU)DKVlUA+1E&PYAQ=@Gl#oyZZFY83H4cTrJsWPyZk8e%~Iw{CO z_@5D`YH5jDT~ij=r3)A2_F!c{upDMOd1-z@DJG|ymRCV~OpS)AugKV225#u5=4V2o z8oqIc>*3#7eF1*kJc;P2Ks;6dcDnuRFI&vj8eN@Ra`~tKT7P=_c(wkcuUBQBr2ouC z6^6CUhwKPCtZ7PpvLP4!KAZIZ#RFN-?upc8UM=Om-huHp7EG_eov>^AWc-E zr)5`RW-Y|l211)=n^}Ha^v?b!yDoca+5H&YtG#dY;SlFF+ZM=uXZjnSL>g^+tKVUl zvKh%iwk;C4B2M(06vY0#{)EV)ePB|yy21R`~>;)2T;*J(TfPQ)gjf(#H7(W?) z>%#+Z>mHdwSb6cpAMNQ6W}kJ!+1*nRUD_;;V+jrW#!0qACLMF%NpeDlcSC z*!~(@F~v9p)BQ$LCda2o3J`;xkQa2fqB}3fdt?D>as}S?5!?}aegr|tBnR74u}r3% z210}-nh{V-H2noco?z{OD1dc6Szg7ye+-dk$F}#CDL=OY|EgCQj82=E*lDZrAIo=c z!56aWRd$-#->>=5$;#+@8@ajOq8vVJF0?%!OIozoP4@d{4DsA+fGaM5zUzMI+kRj= zS=mWvp9a%C8xrA38u%^0t+?~cADFKCfmd{#+(j=gs^t?&^U(gLw`GH?!-h^K7dXYy zg)_G~f4ay|Mt|$A65AFfHeZ*+Ba;o_4*JhL&HejDoADoacJ~xT2Td}GYiEr-Gj_T? zM|`WfLn|_QsX}%;bLJ70i zK$?~)dn|=0N(%m^703}HpV0BHkTx`u`wK{?bC4U09HCo?NAvW|rTr@zAiSoQ5 zVIVyyp%-Ga zEP~SWqNH^`kR<_8B*88~mNa2@AaZSnl`Ws6uk-}?Q)xTB7?Wc!Y>cZbkxch1BmHL> zp6rF&D8P|EHcbYalTnl>oDS6pM*MX3T|b!vL^z6L9zh^!SVc z`(=(|4=bwKlVu=0DrQ7^?$?T=jqlFo?<>lBEd0&a25ECFNvBVw{_bl7wKAKAuLkoI5LPCjC{4y4(w-mskZH4thjf}2!r2d)mQBzSWEx!N1oWa& zUKYJM$bmf6EI|Y6Y{1S%{ctYqfyg@yOVHDGgtt5f* zZ=JKMk=btWYfRe82-0fdTaO_5&KN{r0ROiyfOGje6t4L&uAoL;-2QYkG!PUyMKBy*I(3)s&)pq zIC`d`m7Z4lD}K40#?`p-(A_MD*t+!hLsXk0OMTjroll(ew;MmPbawA{uye~r@N)kZ ziTXC~yz?I1aYqZ1K*qnkcTZ1n?7G9=uI@fD;uulcHTk?{>X7j*c}P!}pq6dNhe*{t z_D{?@lOPW{Q~hubO(>D~jEdSKaAs?!3g=;X`KyuT6bS@f9PfI7m(oambRJix2}Q zf>Wz3{@x_i(M9CmbP1e`drf4p&x(vc`uIce-*5?>^Lo}8N%Q~wkf)rvKe`%n2g#tV zUcyfuMDmSC;a*jR>@!DvI<1i&>V>nTAO5fJG_}c@E)=zh8c0S!^9o9NrfYC68-VC7 zm~?6VpVI3jPC$FEO}AN!5PoPs^xQJsrzMcxlC^n~BY--dL-6_w;au7Oq>dQ>!yzPh zoQD6VOCU!}P^W3aTZ5jgK}}H$)9x-KNH#&Vsh^%#K#`=>i7=AFDKsI9P2QZySx{X< z*L)-EPA3Hs-bqHWP=%B!(nb+FraZ)?`|JR`>dB<1W&^$bnQ8)F3_?N=W?8o)^l2av z3^kGOnuU`iHk{oHwx$?2rv^8kngY#}0?J=`Rmb1IBf1JU}Fhu+|)Zv33{?~&-=Eigbu z?!E*s7+oN55xg6=KdF(P=?2j! z4kG#f7~Csj$bN_Elj%_jH5R~s={C48So_@1bRXe|9)jFdg7?d3Ke5;uCde6T&~puQ zax6p)htTs4h(JROH{kY9LN!WIQ~gNiC^nhh#T;~e0ok8Gx(U+R0BS`+u?z}L){TCt zw!*zUVdsBzy%|pN41g5xECf8AY$AMM5&7N;qGm?@!Lu^<-O@7+1%d&GO;vmf7mu7GX=Z7I|43M zBDhx%!+ZJp5M_VuaP7(5L2Iz_|6mMqcO9~qc*3Nv5Ch{qkhHdQdkOB1+ab5Db^O*{ zYmLUyTUeO2lvOZRvlWf#3>yWk^IQb1ayTQAF1r7mY`Fioy1E{y&ec2e=qa$<9zD9!IC)2Srl_BBdCz#(KdA$p)FD6JBm%Qf^2**&5>c0D5sFyz4f@f7N+w?oFMpqVd+-Z3N%6_L0IA zjhnv@v7wCI?_av+cgbC+5qC3B?{lJt@O}3|S7ss4S>p6X%@&|%I!zCr zrj=P6mi{v9+uPdA+?kyj(CrdR2S`uLhxg)LkUQ4p{6CsPa`z;k5Ipg0GtlU74kEtm zDCFjG$nKcyg0$K|JnKO&Z-kf+5WM+fxWBmeWFs18a>p3bV@uE{tH}M~6%bSt*^4^5 zgz)|MF+V_1%|nADGOnH+-0Mf-?rw7w`Zy{v8t?o8^lXLG9`Bk>oOZ1>))=)n-ww4H zqV)dj*r|S&OYIBCQ2X*Y0)Gto@(g62w8)5zlhq5WZxroRh)%gkyoEP*e)_E+ntI!F zi?S36f)J5(N#UGJi|+95GI9kO^bEfsjpMN-TzLRtL&rxRT&~>x!&-x?h-36$J2R(|xdPka#Fc!PUR!9o*ECx94DDeZV&0QAacI2Ua|?#&mk zfdSBw+}QgAxYurkf77nDPeCb!e{~<%62V)pgea~`x$}qrm-j$)=Ggc}2WuUfORUg% z&ySHF8i(AyXmoCl_cJjhc*QQr5#rdlKU6kwI0H=Cm(a5fM1T7r^i&Q08!v}*In^(# zm*g8q5q(I@wFKJQ*J0ROF5n0h07iQhhf_=}Ii|Bdq@I|C#~m!QWhNcPV|4iu1k$CX@D zwO<-H{{ZQcIiuEm{buBTcb)MshN%9pyFdY{c=OZXUS#VLW_MXh7b5aEQ~oU0IC}d7 zr5d$Q9zyN5DG0fYoPP{n8F2Enzl+*Y?M1KYOQj75@t8Lk4IO<+&qr>)bK%cl+bM!b zNbN|W9O-V_6ga#7OPB25I4rvc_CTeRs#>{2EuNl@AGm!sIk`VlqNI|t%VJk_0+6B` z-FLDwtJg5O)*Jd+jX%5LS)70zp!v!V+#urIm)#3Wo*<1-QYN9|pCW&~fq0PyOrvl& z3?aAoN|RsO3&{>P-+edahBAWJUbOycA-ZKh()*?m{I{!!;)tJ}bU}(}L{TJwiej&^L}N=ct%E7BR^yi6*hdLJ=!cq)CxpmWA!N-#hiZpYNHO-8;LB*vR|-@taTf zL%etH+_`6-^F7~op69W3u-@7P4B85%)&^4|a19f7dlBx=flvpHgnsSeA^}i&PxJh-%k|ds9DYxm0ThNu;4Tnkht=2D2Il}fi6SYs@%h? zV7$``$Z06p3@r&Lv4p2LKn1|S*7ylo`cI>U8rs|!*_h1t%?Wy0?=vDMCu<{8O?^^J z^{s}a)Wfj`0Bjf-rf^7E&fO&vcQ-+cY=>EHMIo0db?hkGxi-UU-eNji+TB9SRy&|S z-=pR49DqHo0KI`?>Qp8I-^-@PtlZ#t*-&+?JV5pH{T`R4Ym{Mi5OwzeNVNkHy>&v^ zO1m882bYRHu+g7S2tP2IwXbZ3@yu#Ou0IO$f#IdRJbfXYk2*Y;Y0{uDI9}Kc>-mp> zzU|=AJb1$ZNQqj+rcLlg-##hqy;Pj>z(TlN($Ic30rKeZeONDSg8kZ7MD95@v^t5; zJ+cP20RJ{9wbZh!3ThRnMFZd22g)JC5c%c!9@!`3H%rB2qg71%_Q6oju1JYe_TquX zf<+>F)%ftFd3`I~%^B!F92~v;kBAq98Pl)`G;1*TG*AOJ~3K~(k{ zuu?tbesO>{O6{M5PC;}aAtd@jY*>H$P-IC&?@3VCAs(k4X&@p&|DSP?MpmRWvu4xqj z*MD+2l%u+SJH21J`&}qs>I?0{a3a8XYPE2^w6BI;Nb8LqC_TDLba6($e+aY_hkR`C zZY^&?@wZFiWOn=X@70h8BoMjyKxmV~G$8~BYh?@av)01i*a5KJkcwNO#8fDWq>ykT zT>-&7L90x>X2Z&qU}x(fB?ck#qp^?=>;|5Hu7^EmE24K!0jut2O+IQx>5ey{ ze{(F zRR)k90H?X1Nb5>9D%9hLKpq>;^}E}%DBZOXZfgN-KpfF4#zP+6HD>hN$}`@FcHU?x zM^yxOmW%S^D@D~?J+hmjcxEk(XVw7`6|q~7g3|37bT@|fhBONIFM_kXLlEVulZPOB z-T{y+T~Gf*#w%M;cxD}(vs`BILymW`-jLN%~}aFw-rul zm*|lvW@c{Wq1B9mHf$91%a4FWt4GB_af!8XSFhkNKk^~01slQoYzB*%;H~?CX#)|x zYZ9cou%F*~?`UIq0l zqaY6tXQYZVmcX359V{jze)A+KW5ds&JNTV#8RTwyOYDn|o__%J6MNPpXgg);Z>v$7 zw_Q}9MZ7~aE5ui%X`&)8Vua=*^k_RGkq%E{$xnq-SF7X5D7TP+VDXl!e_V0r#s^Q= zlG`0cY($S&Gri9URXN~LP10ksvwfqP%(NElQ!W|rZr{+REq--#?vNvsQnX&?rs`D|(6L9N+K+R4KFfRjvWL}D4vUpR(Xr|v6})J8YUHL3Ctrk>O#s>u=$9M} zb#mA$+3z)=^x$H|?mVu?L*p$4lpa_JX>bDiWk(1eo#1e{cEFsyR_q+o&O1>2TX`7I zZGipZPB5hbu+wmJ1-LmKNDoHjg0Y^@TM6Rl*1`G@X)#cHDD|O`WKaoKek)|9AJpNa z5xsVjm+!AQ%8xCFySy3Edyenn^OyhlA*}fuz-u>wDMT1M1nS|V5WT*qpI>=R%BUDm ztpJ*fh}<+eH0jM(H^KbZI>e`+9J&_*tnq(VBl@!mUMooFtag$A)thiuwTV^|{c9r; z`TCc7b$i_1d6RQC_wQ9^0P`$7{-|G~H(0kQegW*9H82aE229M6dqotv!&-(833^%Hvp$)(@C z59h;XCU5iV5M#_SAB?8#@rYbxJ5fU@h7SYr!_et~)Ap zzSERP{?2#cZrUl_9w}A>dA};euAKmh7%nP~(qC7jG;5WJg`!_S7}1NqwAcIG+X>m< zuR!UAwMg`7g&N_Ibg$A&;4kMS7|qHu^^gUpChvZtWyjSQ2n!~sYM9bjkys?bcsbAQ z7Ta|)tGJyS&HJBoX@57@U^LHrtb@)aWfscq%kdN&P?O;scdv6vprX4--980>{*pgk zCnuEY1b$+;CcEWff5@HS*k+f{^KBbE7%qP@*&EzSBp*N`pF{@`|e?T!*=+6^5rYHm;%T?v;w7n zu12h;4SI}PzI6e7Y7s9L6qrqT17lu3xAxw@XSPf|E<&3MZT6f%*A z5obP?^9x0oSrslH4E^-c(7zUTHz?CXZjW~Ce$X!rSAgkT%d=L%oWB+ETc%f;Y^S5+GZ4fvk)$C059)^6dM64ITXoX9tGu)aIjte_eUr`z6`7?3T3|} zBIg|hsec0Upm2uHTHP$3t#(+~N^LA^6r87#6T${8_vlI#|F#mbx^`$0M~LkN@~New z2D6#J?0osL^4n8694hw`NfM^%5ut)gt=C zu+^dyjeo6!@!UGZu9^g8Tt#)2`d*%13H$9GkVe%ZcKMe>zAjH2$lv$|xX}zLu?w&i zSX*kKpL7sn*G>xEgT1mzfLxh4B;+1U)inaD;b{jHXtV!*h<)oY=;wujN|Pvm<6PKV+JzgJxM>RHp5018*XJ-La7O4|lreXS@ULq!G}@g;SBGKd(gLiN%nrngOc=PzH(QL;TvKpiKz7 zna1mzk)QdtP`#IwxF?ZXrz1)CF`#P#+bB#p)g~yuv&>5kL>Z4#+=P4Kei0f{}~7E#IRKDqbC+vFU@YAE z2HciBBIk{PesTD7v|{9MnJ0RN64Or#7tmae;><-b=d6R&uLY7$oSb9~QgDraNZx!* zj~K^VvJ1HzUWZhrK;FLw$@@+Vxe?}qEhx{~fU2n{g(~GlbD012yGZ=>NMWffkKBFl z!gzT#g@phQF;xXM5zuABsYO4wC2-`s}W-EYEmc7U7I1v(r|OCovuiBKvsNV(hR zLGBYr?8jXd^ZXwdi(OxdE5e4QID0K}e_R4Rl}03Lcm*%=`E?D&k_NMhzvN6*;i(6$h}cI3aq>(FLq9Jg1@^0JG~hY9{1MO`Dwttw{!Vr566l{{b{AI`c-WZ zbwnCM9>^&dVP<4l76@ABq(<`pt2n*UiNZC_ldj zRntxmO&01(%}#p*=87%Q;!R+Z4acs5!}=ldqX~$d9xe`=3mcG|wgBJ_aMBHs>kou7 zbQlsh9Sga?Z}~Zpz2!BrBE^5u6^!Q|Tqvsh$!jNv?ydCi^~gQ62%6S`NX&p7_1qq+ zb{CBZjNO>S$GmY~-|3I%NRO9fj6M!)N?kuj8V?&ccxR0?hIH}11|O^deelvgb$f{1 zqwt+sGnABk6dPILb9{Mri&d}2AH6UQi)w|&qh*W79lE0b)WmLFDA$R+H zl>fOJ`YEGOb@!>AsYS{%+6^O@L}` z##@^ZIcE&y!Qnz%Y1RjDnhQu=6YlkKwxyA|X)e&V8)~!zkX<-d9JW)B_;-uvWN(`b_0R!`eYM9Yv!Uy#7Bt067m1(27c-$ymt}E zg-G0TB$T0HYe<=t{LJ?SAYxl|oxkfox)ma56ouN{PFx6Fw7)^=oXejQRx z25tv~a>xOwo_U&2%H%yA((=mQ@G6XVwn003KcwzG-6Lr7kNo{_!FYZxQjebxWn_5L zn2Q>az2XHCC|6BC4N^rama;{;d)|Wa>Kf>SvXJAXTsExLU&9GNR$f)vj| z)w6;e4MplMV7=p;DBayf) zY;8m*;9ZMgZ_6NY?RaR1)rWqX+fqb+<|0t=Nm&SLN2bjwykLq#3QH((cISmvPIk+2 zTWed9{>k%TQA5xtMo#$>s-~V0y1u=x8JQbj6B!oe(0Wuqa3-WaU4@;(?-!!<_m!yq z$2TGM30I)Y|5}agjjuzSJOrs3UkTMA2>jW*7Qpz=YG?y;BGpQJ8|+pK@gGe>@@HWX zyX_^hia5cKoPVKN({`cfz&67su^E_+&^p_=*JWuUySk#YoHuD5X$g6D8s5D z)hAGXWdlktu7Q?FL)FWo)?k%2809)d&mW8AW!)O%*0mrzZ5~*A1DKtLqYXyn%tMj5 zqAM1&mNz2*n>P`==y2$#btNxoH6Wpn)E%dVY9YpZJCMEaEy$%-L}Mk$q(DhE#3~(S zIe|j6`jK?tdneUR|7`=m>@pPtJ9@`y;L`{1cmDVKN=75^*;au5zXtx&<~mw+#kuGhV$0cP?o)WF|4(1NM3#z^y9*t5s2L&H+>PzWm~~Z z4S3q!p^0{nN( zL-{|e1RaTM>5!@uVvlX|7gL}g8xGzn!_#{HEXdU|Vfi(`ozM@|Uij zb&O=k<|#FnB1t~@OC=Z?86^V$@%y9ds&3%7IWl)Gg0;8_@$Vmu*ttFT%jWJ|4C9TD z;Fi}ziq-=0VMu&`EF!0P04hAO9K{zmpzg`DL#~ILD##o9=>?_NAA`sV-LCJr zFy7e;ry&D%bU&y^gj0pZzpsG#_BN#MKhtZ;?RJ<;8pNs;IqRU1yF}p6+%^a0mp&Ak z8TG&csQT4O!ab3QV!hizu3Y|+h2p!YpGZ+!z@;SYObq(*Bayo4#84M%_s`Qx*nZiw zqPp&qG;6^DNU1%>p+yT&bxRN`nnVnhuR-L*15tHTxM=6>$RIOyF5JxXol4K)w-uIf0q;)(Tj+6=WpFhMyEH6zt1dx(Ec1WxLMcDI)>Yc z*X5+CQ(BFBJDgG(MwX$NAo6Fp}809y1B7X5mB)%V>9Q1zfH%m}@ej`{7 z=~h9=3sv2GG<3hKG5_b~DE?y|YG<6>BbZH3n~&0SA42LILF$*s3t#oq9K~l>34w^@ z&yEg#Or$Nhr=g4p#{rcmWv0G{(!W;<@W;O~9?7eZ-RoE99()VMN8g1qI0Cz!Lme{+ z)iciS5gd2FkiDT5?N>c7_5kP;hd@1~KkV&kn9G{LTeFBH(okd*RuL%Ys-aFCj+*JG zg)ZYX<&eGUH8|_Hiq>zYr;xn)WN4GRQlf>2-a+|at5E&$g^-8&wFcKk`ig&g0q6>2%-`ap^e<1qvuRxkO3jCGju%2CpB2pQd<-S?<#P?q0voDY_r>0^T zPQ~p}AX_;x0;|6VOW*m)gNZlh3$*;*d;Yt?|JNxTu{mpB^7&NL*`u+IDXI3Ns_;OU= zHU-+mu-laV-9qFZdS6suqbCeU^|X_H3tmCI)MHKbULZE(%r!4SIj}F1S9Z&!>`bHm z$In4Ms2}2&j)yX;kH^&JGk1}@)^WoNFy?I(u1NB#W01Hs+^5sqOvpX_F7m&A6H+_^ zdH-ru-*+~Y0Av*(u-5E`dSJiK)Mk0!24wGDAY6~y-=7O@tY?+;e_DjX!|x(8(1ofN zVV60Kavwx5o`A#;!o?srQ$}{$Yp|D5ACMwqpQ>BQp!k(w$3^b;S79yQj+&>w)zxm| zxaj!K-vqT`)!k=89@>?1b{ext|MC^MTN)9I6rmq97}Ds0z?ud)B^M>B+H}q04{HAW zt*7|ZsS+9+doHiNWpIMA*c14D(0}2Ue~;k*#WTk<7MaWRGGlgGfQO1)MwX+{u^;qf zhN0%haE3ux{`;1p`0ve#oHz(I)51lPy_!mTz)vhk{!hygyJQUF=N}|?hEe+iacJgd zt$?+v0U#X)M~8Y)J(R&!9${0!3mUMD1+0HQd$Ya01J=4`$bI9`4j%+WHIK%g_O)+r zhq-i{*qJ0%C!vn0h14(MlQ1#xObN#F20;)-{5aYXLy`FYL`cN{6H&c3;HV0TgzqX^ ztJ|;qCrbZW2kqc~NKHEpTHsoQfZqh;y=_Q*Z$hU@D?GUv`6reLt6Tfqb49=_R?V4j zqxAG5LFZvCv!M~uco~`^iM_m}G3?e=p`=z5 zMt)xN#5ZPgqL`j`oE&z2dI@Mh4*1qfPQp;)ZG_$FM^vFOl3I>E~%`i4Kd(O)&ylqjJaE3ZO;HIgA|wH zX36g*eni@W#~{nikeoDJ)WRw29=}k)k}RI8c!Zt1w>;@g+R8<8q%>({aKmGJ7F$qh zA*IgTs0rqpBA68%qXFq^K#Ht8khBuG6NO!lg7z#^fG*d@Al1ahM38IaqF-Mbl!DV% z6u~u3ikb(`hB_wPejx7Bu+eeN3y2&&46#eP#xi~Fi=g-<_VvS2eaGn{<3gPL>FfUk zd*v4B$qZa62GgvCGPDMPs1*j;mgP^WkH~KbUqe@NA;*as zzs+M5bIBUnf_aQkEweHtnRaG*blr~Q(_;t12mzXfP=@aucB-YgkeEeR0f_WA;F=M8 z962P}fymoA9z|cLOsCJNEXl-FM(XXv4k*L1J&saAl}>;38R8)&(HNoED?_S|K^{_z zx<@Y-!EyH^d+&S{pIwQ%$1j39rmNSfJa+@iudPS)^n;)u=Vf86HBD&0^52lGG&DI2 zTd9SWj-d9TbD)h2@2jZ%9%>C~{pw@TCyzkYFS}|7=Av!L{PZ7)oP7wAH*~dF(1bKz z{|MFx4TxTJIF!*9>1qzN|MZ`*mTo~TWkVy5RZSCgNxUiwGf@Y}GJlzf0B9fxxxQ&dwV;lv>as2IR>!(E{E}x(18DWi?O+)QI*6k+&b&2Xb`;vpz zMdJ|rdY7>(zd&`37m)b*@rZrzlQUtYul_fTcQ+uKa-l~g$eQk@9^*R9R9`r-9!=D( z{h=U4xZr}GK7Zv6evEbRbs`W0;pYu__Xd8xWmz@)jd{dfxa9&YSPoXm3+v_>l=3X0 zT#TZO{QxyaYEL4EO^O}7ScW9!Ar&_Wf7;didHCYwwwPcp&fF>(Qb$_ zln2xx{;hFPNB0$(Ad+LP+?Gk-OTljb(f6RoGmv=+wp;@v8$s>Nv!Ne7%)2-0zRi>c zvxB{@1I~^PSSxqIUe$=``G+EUq1V$-F;wx9_h8Ij5AEbph<}&BPjvDQ%(phfUb`FG zlu=L*8|abh(j=$9)&erq=fl~u3z3)!J)#NA?}1;1RZ|ZK{IBtv-(5_bc0UOa6VQq49^xE&T`+%9kBAR)kL1?ptfx!RXT$^{0)ntwiU&S_ zSbVT{ssmN{|K7|9PN<~f_Fne})N_G|vDgF6cvAoX453LxK~&qA?O#~jqxT(x#I_UQ z{t6)m$LG=)?|JOY)W#qT2DwG#B9UuEZWpaGw9;95a5V|8^#zDdBqBo@TmxxP3i6;T zC__?^2UH2>hulL8;cnaojkQ6R9XLD+(@8-)ayaw}gJJJT!`apWds`Y#a}G?zI`ltF zXaY-G1X7(x??`EDo&hcl(eouGd*VtYCTP{We`4n*4rek-rVCaZ7gcCMy-qP-x+sDq z8F}c64TahpNT-c{e@ul_*AK4jJ{_(4@KRyQqoyMD-O z3oGy6L;(IyfJ>ehf}f@F6mFO&{1BY$q0qBdm1aH=NEfdK>LdY&XN81O1>a17>dvPV z%%vbE2=3h;>GWC%q&SU@41KDnnLF&{zSIB8%%&0og~++ zs9x4A5rfmOKLtd$L}z~W4)F^E@CT@^{C5w)?(J0HEPZjkJ$nmy`IWOqyRq6g8Ozth zEP3D;LeL)IX=|hF(4Qw%CfpW9_F7y!wV`}S`Ct|}^0&r$nDQli0!2`taycZ1C@g>2 zvUe#qR18(%(a=jowH@HA^OSC{b$XA1m|TTj31-5c`Um~*>QqM&B6t3T^CzR20IuW3 z1q5)h8u%)S!4IIhLhhpFO$;xFpouPnGYwp#HU?sjlOQV=6jp>v6Mkr#?H}Wr>%V zkv$M)QWzncJIk|bzOPMWR$aPLp8ga8-@`Ro`3mL605Fw6_C$`luHjpIaetiv3|x;+ zW9i*~AifZ&4hpv;(7&qC+pU~Qq3c)BYX>r_;yZn$h(I=wSFLy|-Q$DKNme0}?XN5} zR>2r~mnlKUu&eYKr?aOpCJA?RDg?UERV9uv>XTdjhntZUpvyhYzZ*Y%&1U}jc5(kim} zVj~Mpl?@mBr*^Kb6~{4U$oX}v!o{(C*`GyDAAuePTNz-P>k@?6zFVHZzD zF72tc2n{YT5Ea63V!8JNK^h?8%2deS2;&hr%iV^g(oe6Ljb8G-YqUD0cSMltTTTL? zkisM@NN$psjq#KbJ;fLiU(mx9?{%{w0f6bjiQDomp$M2=phzwQ)di^S)Xydf*&kot zCy?V5lg)S0DkoOO?-AhgSA`&f6AZrK99Yde^xdB4B1k+{?72&b&mws}M5 ztpviw4LsADYPfysAh~^>X-&TRy@6Aw7Wd{=d>-Ie+QrX%9nTVUiva?tI8$GH0L=I~ zOSb`(stiCGEc2D$-swgJ`Sr>-1J>k9J*f(Shkivxx<)wC!lwc>PkWXN!25(rqzNTS z4ws}XB#EN20&~?2T%{l}H^;ft0Z4fw?IBKLiHo!oq02LYLS+H6%eV$cs#tQ&H46!8 zc?B>CnJ#v*zxcilK#9%rr-rz{UA-C7d1BQ-->5lOI_GC=-B@?3@rrs!ZoS5E4H z>MtnJ5tv2tz?N4hJa+1`qqNi^a10Mzo_oEAF}(uUHCX} z;tK)m=S_9?b`zC1-Rb&Fn|F?j(!W?S3v^_?d^!c66+Ua1ds2}>=^U>LGcK%Evl|J9cds-Mzq4O?z9w@iS>#r23eOtHBbm3`45c1OpIS-#R>GZoa+R3%~Sc4nFS^_ zF^1)wv(+5f#JRggfwL9y$S!u>sfEuofP4BZU-GbuBQATKG?TIP#Y@@vv%*S&B8%~G z%s^})U=5R)JVM6c(H!ZeB%(mCTHn zeeH5$k20szC*FcR=o!JQ)SAtpJV#mU?l9crkK5kH575{oU0kQ6iAkZ&H1^&4QeiyRT z1}3$0jwZ(4M!0+>>(fBK_j5nXLI`hT_!2!^MQ-kDkr>H&VrIEWd9+3V%eSL6{w*)so!uu=(b zeScWvjs-Y%t(L)@5?D(kq}E-KI@-Hd<3t3AMZqcFqE%T{R|0$vv-r#EU8m2j9GmW5 z!oGf%!S(;^;1B)i*|TM=iISdp6(pA=0Tnndhs+$fG9|0a(3KKYxwx-<^G`F-pLqg& zPT+UHM}E)iDZ5-gT#?m-T^UC+mmdkot>-R}k^Czsb@QU(WssSbegQbC@5AU z-TMZ=*xhqTM8NE?##D0{H~_r99;~$q%rL+xYo%*oF#^2q?G;2}Os#}yeAfL&C#E9Rd$T^DKB`FV{`{yhRC7J=(% zFsa9Yi8eOK7K2Q!q8hnH9J0&dFxo6(!%{8iwgpKwQC18#_4xAV7`Fd!KKg$F;h8<~ Ty7E?s00000NkvXXu0mjfuxqgQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/selector_dating_step.xml b/app/src/main/res/drawable/selector_dating_step.xml deleted file mode 100644 index bfda8ff84..000000000 --- a/app/src/main/res/drawable/selector_dating_step.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/include_mic_charm_layout.xml b/app/src/main/res/layout/include_mic_charm_layout.xml index 8c19d51b0..070f63fcc 100644 --- a/app/src/main/res/layout/include_mic_charm_layout.xml +++ b/app/src/main/res/layout/include_mic_charm_layout.xml @@ -38,7 +38,7 @@ @@ -61,7 +61,7 @@ android:gravity="center" tools:text="9999万+" android:textColor="@color/white" - android:textSize="9dp" /> + android:textSize="10dp" /> diff --git a/app/src/main/res/layout/item_micro_dating.xml b/app/src/main/res/layout/item_micro_dating.xml index fd6a1a4be..5304290e5 100644 --- a/app/src/main/res/layout/item_micro_dating.xml +++ b/app/src/main/res/layout/item_micro_dating.xml @@ -4,12 +4,15 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - tools:background="@color/color_activity_blue_bg"> + tools:background="@color/color_activity_blue_bg" + tools:layout_width="70dp"> @@ -22,16 +25,16 @@ - + android:textSize="9sp" /> @@ -153,10 +156,72 @@ app:layout_constraintTop_toBottomOf="@id/ll_nick" app:solid="#33ffffff" /> - + android:layout_height="@dimen/dp_50" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_micro_dating_boss.xml b/app/src/main/res/layout/item_micro_dating_boss.xml index 7fc37e800..cc797a1ec 100644 --- a/app/src/main/res/layout/item_micro_dating_boss.xml +++ b/app/src/main/res/layout/item_micro_dating_boss.xml @@ -9,8 +9,8 @@ @@ -23,8 +23,8 @@ @@ -198,76 +198,10 @@ android:id="@+id/iv_room_can_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:layout_marginBottom="4.5dp" + android:layout_marginStart="3dp" android:src="@drawable/icon_room_desc_edit" /> - - - - - - - - - - - - - - @@ -306,7 +240,7 @@ @@ -328,7 +262,7 @@ android:layout_marginEnd="5dp" android:gravity="center" android:textColor="@color/white" - android:textSize="9dp" + android:textSize="10dp" tools:text="9999万+" /> @@ -336,17 +270,4 @@ - - \ No newline at end of file diff --git a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml index b212e67ee..510b5bef0 100644 --- a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml +++ b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml @@ -98,6 +98,34 @@ android:layout_height="wrap_content" android:layout_below="@id/game_view" /> + + + + + + +

- * - * @author jiahui - * @date 2017/12/11 - */ -public class CommonApplication extends Application { - @Override - public void onCreate() { - super.onCreate(); - Logger.addLogAdapter(new AndroidLogAdapter() { - @Override - public boolean isLoggable(int priority, String tag) { - return BuildConfig.DEBUG; - } - }); - } -} From dddd0e651c71ad71b8d81c18c223e1e0543aaff1 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 25 Feb 2021 15:49:52 +0800 Subject: [PATCH 43/49] add RoomEffectView.java --- .../avroom/fragment/HomePartyFragment.java | 687 ----------------- .../erban/avroom/widget/RoomEffectView.java | 690 ++++++++++++++++++ .../layout/fragment_chatroom_game_main.xml | 117 +-- .../main/res/layout/layout_room_effect.xml | 127 ++++ 4 files changed, 819 insertions(+), 802 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java create mode 100644 app/src/main/res/layout/layout_room_effect.xml diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java index 4d1067e0e..8fab339e1 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java @@ -5,24 +5,11 @@ import android.content.Context; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.graphics.Color; -import android.graphics.Point; import android.media.MediaPlayer; import android.os.Bundle; -import android.os.SystemClock; -import android.text.Layout; -import android.text.StaticLayout; -import android.text.TextPaint; -import android.text.TextUtils; -import android.text.style.ForegroundColorSpan; -import android.util.SparseArray; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewConfiguration; -import android.view.ViewGroup; import android.view.ViewStub; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; @@ -30,30 +17,18 @@ import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatImageView; import androidx.databinding.DataBindingUtil; -import com.coorchice.library.SuperTextView; import com.netease.nim.uikit.common.util.string.StringUtil; -import com.netease.nim.uikit.common.util.sys.ScreenUtil; import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; -import com.netease.nimlib.sdk.chatroom.model.ChatRoomNotificationAttachment; import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; -import com.opensource.svgaplayer.SVGACallback; -import com.opensource.svgaplayer.SVGADrawable; -import com.opensource.svgaplayer.SVGADynamicEntity; -import com.opensource.svgaplayer.SVGAImageView; -import com.opensource.svgaplayer.SVGAParser; -import com.opensource.svgaplayer.SVGAVideoEntity; import com.trello.rxlifecycle3.android.FragmentEvent; import com.yizhuan.erban.R; import com.yizhuan.erban.UIHelper; import com.yizhuan.erban.avroom.activity.AVRoomActivity; import com.yizhuan.erban.avroom.activity.RoomOnlineUserActivity; -import com.yizhuan.erban.avroom.helper.AnimHelper; import com.yizhuan.erban.avroom.presenter.HomePartyPresenter; import com.yizhuan.erban.avroom.widget.GiftV2View; -import com.yizhuan.erban.avroom.widget.MessageView; import com.yizhuan.erban.base.BaseMvpActivity; -import com.yizhuan.erban.common.svga.SimpleSvgaCallback; import com.yizhuan.erban.common.widget.dialog.DialogManager; import com.yizhuan.erban.databinding.FragmentChatroomGameMainBinding; import com.yizhuan.erban.friend.view.SelectFriendActivity; @@ -61,33 +36,24 @@ import com.yizhuan.erban.treasure_box.widget.GoldBoxHelper; import com.yizhuan.erban.ui.widget.ButtonItem; import com.yizhuan.erban.ui.widget.ShareDialog; import com.yizhuan.erban.utils.RegexUtil; -import com.yizhuan.erban.utils.SpannableBuilder; import com.yizhuan.xchat_android_constants.XChatConstants; import com.yizhuan.xchat_android_core.Constants; import com.yizhuan.xchat_android_core.auth.AuthModel; -import com.yizhuan.xchat_android_core.decoration.car.bean.CarInfo; import com.yizhuan.xchat_android_core.gift.bean.GiftMultiReceiverInfo; import com.yizhuan.xchat_android_core.gift.bean.GiftReceiveInfo; import com.yizhuan.xchat_android_core.gift.bean.LuckyBagGifts; -import com.yizhuan.xchat_android_core.gift.bean.LuckyBagNoticeInfo; import com.yizhuan.xchat_android_core.gift.bean.MultiGiftReceiveInfo; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; import com.yizhuan.xchat_android_core.home.event.FollowRoomEvent; import com.yizhuan.xchat_android_core.home.model.CollectionRoomModel; import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.DatingAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.LevelUpNoticeAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.RoomBoxPrizeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomInfoAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.RoomReceivedLuckyGiftAttachment; import com.yizhuan.xchat_android_core.magic.bean.MagicReceivedInfo; import com.yizhuan.xchat_android_core.magic.bean.MultiMagicReceivedInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.manager.RoomEvent; -import com.yizhuan.xchat_android_core.monsterhunting.SimpleAnimationListener; import com.yizhuan.xchat_android_core.praise.PraiseModel; -import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; import com.yizhuan.xchat_android_core.room.game.GameEvent; import com.yizhuan.xchat_android_core.room.game.GameResultInfo; @@ -98,31 +64,19 @@ import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; -import com.yizhuan.xchat_android_core.utils.StringExtensionKt; import com.yizhuan.xchat_android_library.rxbus.RxBus; -import com.yizhuan.xchat_android_library.utils.ListUtils; -import com.yizhuan.xchat_android_library.utils.LogUtil; import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.lang.reflect.Field; -import java.net.MalformedURLException; -import java.net.URL; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.TimeUnit; import cn.sharesdk.framework.Platform; -import io.reactivex.Observable; -import io.reactivex.ObservableOnSubscribe; -import io.reactivex.Single; import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -130,8 +84,6 @@ import io.reactivex.functions.Action; import nl.dionsegijn.konfetti.models.Shape; import nl.dionsegijn.konfetti.models.Size; -import static com.yizhuan.xchat_android_constants.XChatConstants.SELECT_ANIM_DURATION; - /** * 轰趴房 * Created by 2016/9/22. @@ -157,20 +109,11 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi private GiftV2View giftView; private ViewStub mVsGift2View; - private SVGAImageView mSvgaCar; - private SVGAImageView mSvgaMemberIn; - private SVGAImageView mSvgaLevelUp; - private SVGAParser mSVGAParser; - private boolean isSvgaPlaying; - private List mCarEffectList = new ArrayList<>(); - private UserInfo mUserInfo; private FragmentChatroomGameMainBinding gameMainBinding; private ShareDialog shareDialog; - private Disposable datingDisposable; - //收藏房间 private String FOLLOW_ROOM_TYPE = ""; //取消收藏房间 @@ -236,45 +179,9 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi } roomId = mView.findViewById(R.id.room_id); roomBack = mView.findViewById(R.id.room_back); - mSvgaCar = mView.findViewById(R.id.room_car_svga); - mSvgaMemberIn = mView.findViewById(R.id.room_menber_in_svga); - mSvgaLevelUp = mView.findViewById(R.id.room_level_up_svga); mVsGift2View = mView.findViewById(R.id.vs_gift_view); mIvGoodNumber = mView.findViewById(R.id.iv_good_number); tvFollowRoom = mView.findViewById(R.id.tv_follow_room); - - mSVGAParser = new SVGAParser(mContext); - - mSvgaCar.setVisibility(View.GONE); - mSvgaCar.setCallback(new SVGACallback() { - @Override - public void onPause() { - - } - - @Override - public void onFinished() { - isSvgaPlaying = false; - if (ListUtils.isListEmpty(mCarEffectList)) { - mSvgaCar.setVisibility(View.GONE); - return; - } - mCarEffectList.remove(0); - if (!ListUtils.isListEmpty(mCarEffectList)) { - playCarSvagEnterRoom(mCarEffectList.get(0)); - } - } - - @Override - public void onRepeat() { - - } - - @Override - public void onStep(int i, double v) { - - } - }); } /** @@ -299,88 +206,6 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi roomTitle.setSelected(true); } - @SuppressLint("CheckResult") - private void playCarSvga(String account, String effect, boolean isSendMsg) { - if (isSendMsg) { - UserModel.get().getUserInfoFromServer(Long.valueOf(account)) - .subscribe(userInfo -> { - //播放座驾动效 - if (userInfo != null - && userInfo.getCarInfo() != null - && userInfo.getCarInfo().isUsing() - && userInfo.getCarInfo().getStatus() == CarInfo.STATUS_USER_CAN_USE) { - if (AvRoomDataManager.get().mIsNeedGiftEffect) { - mCarEffectList.add(userInfo.getCarInfo().getEffect()); - } - // 非贵族人员,进来后要播放座驾动画 - if (userInfo.getNobleInfo() == null) { - if (!mSvgaCar.isAnimating() && !isSvgaPlaying) { - // 播放座驾动画 - playCarSvagEnterRoom(userInfo.getCarInfo().getEffect()); - } - // 公屏进入房间的提示语 - IMNetEaseManager.get() - .sendCarPlayRoomMsgBySdk(userInfo.getCarInfo(), userInfo.getUid(), userInfo.getNick()) - .subscribe(); - } - // 贵族人员,要先判断是否隐身 - if (userInfo.getNobleInfo() != null && !userInfo.getNobleInfo().isNobleEnterHide()) { - if (!mSvgaCar.isAnimating() && !isSvgaPlaying) { - // 播放座驾动画 - playCarSvagEnterRoom(userInfo.getCarInfo().getEffect()); - } - // 公屏进入房间的提示语 - IMNetEaseManager.get() - .sendCarPlayRoomMsgBySdk(userInfo.getCarInfo(), userInfo.getUid(), userInfo.getNick()) - .subscribe(); - } - } - }); - } else { - if (TextUtils.isEmpty(effect)) return; - if (AvRoomDataManager.get().mIsNeedGiftEffect) { - mCarEffectList.add(effect); - } - if (!mSvgaCar.isAnimating() && !isSvgaPlaying) { - playCarSvagEnterRoom(effect); - } - - } - } - - /** - * 真实播放svga - * - * @param effect - */ - private void playCarSvagEnterRoom(String effect) { - if (TextUtils.isEmpty(effect)) return; - if (!AvRoomDataManager.get().mIsNeedGiftEffect) return; - isSvgaPlaying = true; - try { - mSVGAParser.parse(new URL(effect), - new SVGAParser.ParseCompletion() { - @Override - public void onComplete(SVGAVideoEntity svgaVideoEntity) { - mSvgaCar.setVisibility(View.VISIBLE); - mSvgaCar.setLoops(1); - mSvgaCar.setClearsAfterStop(true); - mSvgaCar.setImageDrawable(new SVGADrawable(svgaVideoEntity)); - mSvgaCar.startAnimation(); - } - - @Override - public void onError() { - isSvgaPlaying = false; - mSvgaCar.setVisibility(View.GONE); - } - }); - } catch (MalformedURLException e) { - e.printStackTrace(); - isSvgaPlaying = false; - } - } - @Override public void onSetListener() { roomMore.setOnClickListener(this); @@ -401,34 +226,6 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi if (!AvRoomDataManager.get().haveSelfChange && AvRoomDataManager.get().mCurrentRoomInfo != null) { AvRoomDataManager.get().mIsNeedGiftEffect = AvRoomDataManager.get().mCurrentRoomInfo.isHasAnimationEffect(); } - //砸金蛋横幅通知这个订阅不能在onPause里面取消,单独写个... - IMNetEaseManager.get().getChatRoomEventObservable() - .compose(bindToLifecycle()) - .subscribe(roomEvent -> { - if (roomEvent == null) return; - int event = roomEvent.getEvent(); - switch (event) { - case RoomEvent.BOX_NOTIFY: - addBoxNotify(roomEvent.getChatRoomMessage()); - break; - case RoomEvent.BOX_NOTIFY_SVGA: - addBoxNotifyBySVGA(roomEvent.getChatRoomMessage()); - break; - case RoomEvent.RECEIVE_ROOM_LUCKY_BAG_NOTICE: - case RoomEvent.RECEIVE_SERVICE_LUCKY_BAG_NOTICE: - //全服福袋 - //厅内福袋 - addLuckyBagNotify(roomEvent.getChatRoomMessage()); - break; - case RoomEvent.DATING_PUBLISH_RESULT: - showHandAnim(((DatingAttachment) roomEvent.getChatRoomMessage().getAttachment()).getDatingNotifyInfo()); - break; - default: - break; - } - } - ); - subscribeGameEvent(); } @@ -484,9 +281,7 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi @Override public void onResume() { super.onResume(); - updateView(); - IMNetEaseManager.get().getChatRoomEventObservable() .compose(bindToLifecycle()) .subscribe(roomEvent -> { @@ -499,19 +294,7 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi } addTipMsg(); case RoomEvent.ROOM_INFO_UPDATE: - if (!isResumed()) return; updateView(); - if (event == RoomEvent.ENTER_ROOM) { - if (!SuperAdminUtil.isSuperAdmin()) { - playCarSvga(String.valueOf(AuthModel.get().getCurrentUid()), null, true); - } - } - break; - case RoomEvent.CAR_MEMBER_IN: - if (!isResumed()) return; - if (roomEvent.mRoomCarMsgAttachment != null) { - playCarSvga(null, roomEvent.mRoomCarMsgAttachment.effect, false); - } break; case RoomEvent.RECEIVE_NORMALE_GIFT: onReceiveGiftMsg(roomEvent.getGiftReceiveInfo()); @@ -534,14 +317,6 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi case RoomEvent.RECEIVED_ALL_MIC_MAGIC: onReceiveMultiMagicMsg(roomEvent.getMultiMagicReceivedInfo()); break; - case RoomEvent.RECEIVE_MEMBER_IN_NOTICE: - //进入房间 - if (!isResumed()) return; - addMemberInNotify(roomEvent.getChatRoomMessage()); - break; - case RoomEvent.RECEIVE_EXPER_LEVEL_UP_NOTICE: - addLevelUpNotify(roomEvent.getChatRoomMessage()); - break; default: break; } @@ -652,8 +427,6 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi break; case R.id.room_nums: case R.id.room_id: -// selectContent = SELECT_ONLINE_LIST; -// showListFragment(); RoomOnlineUserActivity.start(getActivity()); break; @@ -845,22 +618,11 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi @Override public void onDestroy() { - if (mSvgaCar.isAnimating()) { - mSvgaCar.clearAnimation(); - } if (giftView != null) { giftView.release(); } - EventBus.getDefault().unregister(this); - super.onDestroy(); - if (boxDisposable != null) boxDisposable.dispose(); - if (disposableLuckyGift != null) disposableLuckyGift.dispose(); - if (disposableMemberIn != null) disposableMemberIn.dispose(); - if (disposableLevelUp != null) disposableLevelUp.dispose(); - if (datingDisposable != null) datingDisposable.dispose(); - } @Override @@ -927,385 +689,6 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi giftView.onReceiveMultiMagicMsg(multiMagicReceivedInfo); } - private Animation animation; - private List messages; - private Disposable boxDisposable; - private boolean isCreate; - - private List messagesBoxSVGA; - private Disposable boxSVGADisposable; - private boolean isBoxSVGACreate; - - private Animation animationLuckyGift; - private List messagesLuckyGift; - private boolean isCreateLuckyGift; - private Disposable disposableLuckyGift; - - private List messagesMemberIn; - private boolean isCreateMemberIn; - private Disposable disposableMemberIn; - - private List messagesLevelUp; - private boolean isCreateLevelUp; - private Disposable disposableLevelUp; - - //顶部飘屏总展示时间 - private final int SHOW_TIME = 3500; - //顶部飘屏周期 - private final int PERIOD = 1000; - - /** - * 开福袋飘屏 - * - * @param chatRoomMessage - */ - private void addLuckyBagNotify(ChatRoomMessage chatRoomMessage) { - if (messagesLuckyGift == null) messagesLuckyGift = new ArrayList<>(); - if (gameMainBinding.clNotify.getVisibility() == View.GONE) { - gameMainBinding.clNotify.setVisibility(View.VISIBLE); - } - messagesLuckyGift.add(chatRoomMessage); - if (disposableLuckyGift == null || messagesLuckyGift.size() == 1) { - isCreateLuckyGift = true; - disposableLuckyGift = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext(aLong -> { - if (messagesLuckyGift.size() > 0 && !isCreateLuckyGift) - messagesLuckyGift.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 - isCreateLuckyGift = false; - }) - .takeWhile(aLong -> messagesLuckyGift.size() > 0 && messagesLuckyGift.get(0) != null) - .subscribe(aLong -> showLuckyBagNotify(messagesLuckyGift.get(0))); - } - } - - private void showLuckyBagNotify(ChatRoomMessage message) { - RoomReceivedLuckyGiftAttachment attachment = (RoomReceivedLuckyGiftAttachment) message.getAttachment(); - TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.layout_room_lucky_gift_notify, null); - LuckyBagNoticeInfo noticeInfo = attachment.getLuckyBagNoticeInfo(); - if (noticeInfo == null) return; - SpannableBuilder text = new SpannableBuilder() - .append("哇偶! ", new ForegroundColorSpan(Color.WHITE)) - .append(noticeInfo.getNick() + " ", new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) - .append("通过", new ForegroundColorSpan(Color.WHITE)) - .append(noticeInfo.getLuckyBagName() + " ", new ForegroundColorSpan(Color.WHITE)) - .append("开出了", new ForegroundColorSpan(Color.WHITE)) - .append(noticeInfo.getGiftName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))); - textView.setText(text.build()); - animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify); - textView.startAnimation(animationLuckyGift); - gameMainBinding.flLuckyGiftNotify.postDelayed(() -> gameMainBinding.flLuckyGiftNotify.removeView(textView), SHOW_TIME); - - } - - /** - * 幸运池飘屏 - * - * @param chatRoomMessage - */ - private void addBoxNotify(ChatRoomMessage chatRoomMessage) { - if (messages == null) messages = new ArrayList<>(); - if (gameMainBinding.clNotify.getVisibility() == View.GONE) { - gameMainBinding.clNotify.setVisibility(View.VISIBLE); - } - messages.add(chatRoomMessage); - if (boxDisposable == null || messages.size() == 1) { - isCreate = true; - boxDisposable = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext(aLong -> { - if (messages.size() > 0 && !isCreate) - messages.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 - isCreate = false; - }) - .takeWhile(aLong -> messages.size() > 0 && messages.get(0) != null) - .subscribe(aLong -> showBoxNotify(messages.get(0))); - } - } - - private void showBoxNotify(ChatRoomMessage chatRoomMessage) { - RoomBoxPrizeAttachment attachment = (RoomBoxPrizeAttachment) chatRoomMessage.getAttachment(); - TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.layout_room_box_notify, null); - SpannableBuilder text = new SpannableBuilder() - .append("厉害了! ", new ForegroundColorSpan(Color.WHITE)) - .append(attachment.getNick() + " ", new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) - .append(attachment.getBoxTypeStr() + " ", new ForegroundColorSpan(Color.WHITE)) - .append(attachment.getPrizeName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))) - .append("x" + attachment.getPrizeNum(), new ForegroundColorSpan(Color.WHITE)); - textView.setText(text.build()); - animation = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify); - gameMainBinding.flBoxNotify.addView(textView); - textView.startAnimation(animation); - gameMainBinding.flBoxNotify.postDelayed(() -> gameMainBinding.flBoxNotify.removeView(textView), SHOW_TIME); - } - - /** - * 幸运池飘屏 五级 SVGA背景的 - * - * @param chatRoomMessage - */ - private void addBoxNotifyBySVGA(ChatRoomMessage chatRoomMessage) { - if (messagesBoxSVGA == null) messagesBoxSVGA = new ArrayList<>(); - if (gameMainBinding.clNotify.getVisibility() == View.GONE) { - gameMainBinding.clNotify.setVisibility(View.VISIBLE); - } - messagesBoxSVGA.add(chatRoomMessage); - if (boxSVGADisposable == null || messagesBoxSVGA.size() == 1) { - isBoxSVGACreate = true; - boxSVGADisposable = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext(aLong -> { - if (messagesBoxSVGA.size() > 0 && !isBoxSVGACreate) - messagesBoxSVGA.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 - isBoxSVGACreate = false; - }) - .takeWhile(aLong -> messagesBoxSVGA.size() > 0 && messagesBoxSVGA.get(0) != null) - .subscribe(aLong -> showBoxNotifyBySVGA(messagesBoxSVGA.get(0))); - } - } - - - private void showBoxNotifyBySVGA(ChatRoomMessage chatRoomMessage) { - RoomBoxPrizeAttachment attachment = (RoomBoxPrizeAttachment) chatRoomMessage.getAttachment(); - SpannableBuilder text = new SpannableBuilder() - .append("厉害了! ", new ForegroundColorSpan(Color.WHITE)) - .append(attachment.getNick() + " ", new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) - .append(attachment.getBoxTypeStr() + " ", new ForegroundColorSpan(Color.WHITE)) - .append(attachment.getPrizeName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))) - .append("x" + attachment.getPrizeNum(), new ForegroundColorSpan(Color.WHITE)); - - SVGAImageView svgaImageView = new SVGAImageView(mContext); - svgaImageView.setLoops(1); - svgaImageView.setClearsAfterStop(true); - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); - svgaImageView.setLayoutParams(params); - svgaImageView.setCallback(new SimpleSvgaCallback() { - @Override - public void onFinished() { - gameMainBinding.flSvgaBoxNotify.post(() -> gameMainBinding.flSvgaBoxNotify.removeView(svgaImageView)); - } - }); - gameMainBinding.flSvgaBoxNotify.addView(svgaImageView); - mSVGAParser.decodeFromAssets("svga/box_notify.svga", new SVGAParser.ParseCompletion() { - @Override - public void onComplete(@Nullable SVGAVideoEntity svgaVideoEntity) { - SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); - TextPaint textPaint = new TextPaint(); - textPaint.setColor(Color.WHITE);//字体颜色 - textPaint.setTextSize(24);//字体大小 - dynamicEntity.setDynamicText(new StaticLayout( - text.build(), - 0, - text.build().length(), - textPaint, - 0, - Layout.Alignment.ALIGN_CENTER, - 1.0f, - 0.0f, - false - ), "xtc_copywriting"); - SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); - svgaImageView.setImageDrawable(drawable); - svgaImageView.stepToFrame(0, true); - } - - @Override - public void onError() { - - } - }); - } - - /** - * 成员进入飘屏 - * - * @param chatRoomMessage - */ - private void addMemberInNotify(ChatRoomMessage chatRoomMessage) { - if (messagesMemberIn == null) messagesMemberIn = new ArrayList<>(); - messagesMemberIn.add(chatRoomMessage); - if (disposableMemberIn == null || messagesMemberIn.size() == 1) { - isCreateMemberIn = true; - disposableMemberIn = Observable.interval(0, 6, TimeUnit.SECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext(aLong -> { - if (messagesMemberIn.size() > 0 && !isCreateMemberIn) - messagesMemberIn.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 - isCreateMemberIn = false; - }) - .takeWhile(aLong -> messagesMemberIn.size() > 0 && messagesMemberIn.get(0) != null) - .subscribe(aLong -> showMemberInNotify(messagesMemberIn.get(0))); - } - } - - private void showMemberInNotify(ChatRoomMessage chatRoomMessage) { - ChatRoomNotificationAttachment attachment = (ChatRoomNotificationAttachment) chatRoomMessage.getAttachment(); - Map remoteExtension = chatRoomMessage.getRemoteExtension(); - int experLevelSeq = (int) remoteExtension.get("experLevelSeq"); - List targetNicks = attachment.getTargetNicks(); - if (ListUtils.isListEmpty(targetNicks)) { - return; - } - int fromType = (int) remoteExtension.get("fromType"); - String fromNick = (String) remoteExtension.get("fromNick"); - - SuperTextView textView = (SuperTextView) LayoutInflater.from(mContext).inflate(R.layout.layout_member_in_notify, null); - // 内容 - MessageView.SpannableBuilder text = new MessageView.SpannableBuilder(textView) - .append(targetNicks.get(0), new ForegroundColorSpan(Color.WHITE)); - String enterText = " 进入了房间 "; - if (fromType == AVRoomActivity.FROM_TYPE_RECOMMEND) { - enterText = " 根据首页推荐进入了房间"; - } - if (fromType == AVRoomActivity.FROM_TYPE_USER) { - enterText = " 跟随 " + fromNick + "进入了房间"; - } - text.append(enterText, new ForegroundColorSpan(Color.WHITE)); - textView.setText(text.build()); - playMemberInAnim("【" + targetNicks.get(0) + "】" + enterText, memberInSvgaPath(experLevelSeq)); - } - - private String memberInSvgaPath(int level) { - String path = ""; - if (level >= 30 && level <= 39) { - path = "svga/svga_member_in_lv30.svga"; - } else if (level >= 40 && level <= 49) { - path = "svga/svga_member_in_lv40.svga"; - } else if (level >= 50 && level <= 59) { - path = "svga/svga_member_in_lv50.svga"; - } else if (level >= 60 && level <= 69) { - path = "svga/svga_member_in_lv60.svga"; - } else if (level >= 70 && level <= 79) { - path = "svga/svga_member_in_lv70.svga"; - } else if (level >= 80 && level <= 89) { - path = "svga/svga_member_in_lv80.svga"; - } else if (level >= 90) { - path = "svga/svga_member_in_lv90.svga"; - } - return path; - } - - private void playMemberInAnim(String text, String path) { - mSVGAParser.decodeFromAssets(path, new SVGAParser.ParseCompletion() { - @Override - public void onComplete(@Nullable SVGAVideoEntity svgaVideoEntity) { - mSvgaMemberIn.setVisibility(View.VISIBLE); - mSvgaMemberIn.setLoops(1); - mSvgaMemberIn.setClearsAfterStop(true); - SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); - TextPaint textPaint = new TextPaint(); - textPaint.setColor(Color.WHITE);//字体颜色 - textPaint.setTextSize(22);//字体大小 - dynamicEntity.setDynamicText(new StaticLayout( - text, - 0, - text.length(), - textPaint, - 0, - Layout.Alignment.ALIGN_NORMAL, - 1.0f, - 0.0f, - false - ), "room_text"); - SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); - mSvgaMemberIn.setImageDrawable(drawable); - mSvgaMemberIn.stepToFrame(0, true); - } - - @Override - public void onError() { - - } - }); - } - - - /** - * 升级飘屏 - * - * @param chatRoomMessage - */ - private void addLevelUpNotify(ChatRoomMessage chatRoomMessage) { - if (messagesLevelUp == null) messagesLevelUp = new ArrayList<>(); - messagesLevelUp.add(chatRoomMessage); - if (disposableLevelUp == null || messagesLevelUp.size() == 1) { - isCreateLevelUp = true; - disposableLevelUp = Observable.interval(0, 6, TimeUnit.SECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext(aLong -> { - if (messagesLevelUp.size() > 0 && !isCreateLevelUp) - messagesLevelUp.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 - isCreateLevelUp = false; - }) - .takeWhile(aLong -> messagesLevelUp.size() > 0 && messagesLevelUp.get(0) != null) - .subscribe(aLong -> showLevelUpNotify(messagesLevelUp.get(0))); - } - } - - private void showLevelUpNotify(ChatRoomMessage chatRoomMessage) { - LevelUpNoticeAttachment attachment = (LevelUpNoticeAttachment) chatRoomMessage.getAttachment(); - String message = attachment.getMessage(); - String picUrl = attachment.getPicUrl(); - long roomUid = attachment.getRoomUid(); - if (picUrl == null || message == null) { - return; - } - playLevelUpAnim(message, picUrl, roomUid); - } - - private void playLevelUpAnim(String message, String picUrl, long roomUid) { - try { - mSVGAParser.decodeFromURL(new URL(picUrl), new SVGAParser.ParseCompletion() { - @Override - public void onComplete(@javax.annotation.Nullable SVGAVideoEntity svgaVideoEntity) { - if (svgaVideoEntity == null) return; - mSvgaLevelUp.setVisibility(View.VISIBLE); - mSvgaLevelUp.setLoops(1); - mSvgaLevelUp.setClearsAfterStop(true); - SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); - TextPaint textPaint = new TextPaint(); - textPaint.setColor(Color.WHITE);//字体颜色 - textPaint.setTextSize(22);//字体大小 Util.dip2px(mContext,11) -// textPaint.setShadowLayer(3, 2, 2, 0xff000000);//字体阴影,不需要可以不用设置 - dynamicEntity.setDynamicText(message, textPaint, "y_yhname"); - SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); - mSvgaLevelUp.setImageDrawable(drawable); - mSvgaLevelUp.stepToFrame(0, true); - mSvgaLevelUp.setCallback(new SVGACallback() { - @Override - public void onPause() { - - } - - @Override - public void onFinished() { - mSvgaLevelUp.setVisibility(View.GONE); - } - - @Override - public void onRepeat() { - - } - - @Override - public void onStep(int i, double v) { - - } - }); - } - - @Override - public void onError() { - - } - }); - mSvgaLevelUp.setOnClickListener(v -> - AVRoomActivity.start(mContext, roomUid)); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - @SuppressLint("CheckResult") public void showKtvBox() { GoldBoxHelper.isHideBox().subscribe(hide -> { @@ -1370,74 +753,4 @@ public class HomePartyFragment extends AbsRoomFragment implements View.OnClickLi gameMainBinding.roomNums.setText("在线" + onlineNumber); } - @SuppressLint({"SetTextI18n"}) - private void showHandAnim(final DatingNotifyInfo datingNotifyInfo) { - if (datingDisposable != null) datingDisposable.dispose(); - gameMainBinding.flSvgaDating.setOnClickListener(v -> { - //do noting - }); - gameMainBinding.ivDatingSvgaClose.setOnClickListener(v -> { - gameMainBinding.flSvgaDating.setVisibility(View.GONE); - if (datingDisposable != null) datingDisposable.dispose(); - }); - gameMainBinding.flSvgaDating.post(() -> gameMainBinding.flSvgaDating.setVisibility(View.GONE)); - datingDisposable = Single.just(datingNotifyInfo) - .compose(bindToLifecycle()) - .observeOn(AndroidSchedulers.mainThread()) - .flatMap(info -> { - if (datingNotifyInfo.getHasSelectUser() && !datingNotifyInfo.getHasHeart()) { - showHeartAnim(datingNotifyInfo.getPosition(), datingNotifyInfo.getTargetPosition()); - return Single.timer(SELECT_ANIM_DURATION, TimeUnit.MILLISECONDS).map(aLong -> info); - } - return Single.just(info); - }) - .observeOn(AndroidSchedulers.mainThread()) - .filter(info -> datingNotifyInfo.getHasHeart()) - .toObservable() - .flatMap(info -> Observable.create((ObservableOnSubscribe) emitter -> - SVGAParser.Companion.shareParser().decodeFromURL(new URL(datingNotifyInfo.getSvgaUrl()), new SVGAParser.ParseCompletion() { - - @Override - public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) { - gameMainBinding.flSvgaDating.setVisibility(View.VISIBLE); - gameMainBinding.llDatingSvgaTime.setVisibility(View.GONE); - SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); - TextPaint textPaint = new TextPaint(); - textPaint.setColor(Color.WHITE); - textPaint.setTextSize(ScreenUtil.sp2px(10)); - AnimHelper.addDynamicImage(gameMainBinding.svgaDating, dynamicEntity, datingNotifyInfo.getAvatar(), "z_tx"); - AnimHelper.addDynamicImage(gameMainBinding.svgaDating, dynamicEntity, datingNotifyInfo.getTargetAvatar(), "y_tx"); - dynamicEntity.setDynamicText(StringExtensionKt.subAndReplaceDot(datingNotifyInfo.getNickname(), 5), textPaint, "z_yhname"); - dynamicEntity.setDynamicText(StringExtensionKt.subAndReplaceDot(datingNotifyInfo.getTargetNickname(), 5), textPaint, "y_yhname"); - SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); - gameMainBinding.svgaDating.setImageDrawable(drawable); - gameMainBinding.svgaDating.startAnimation(); - emitter.onNext(info); - emitter.onComplete(); - } - - @Override - public void onError() { - emitter.onError(new Throwable("svga解析失败")); - } - }))) - .flatMap(info -> Observable.intervalRange(1, info.getSvgaSecond(), 1, 1, TimeUnit.SECONDS)) - .observeOn(AndroidSchedulers.mainThread()) - .doAfterTerminate(() -> gameMainBinding.flSvgaDating.setVisibility(View.GONE)) - .subscribe(aLong -> { - long residueTime = datingNotifyInfo.getSvgaSecond() - aLong; - gameMainBinding.tvDatingSecond.setText(residueTime + "S"); - if (residueTime == 5) {//剩余5秒开始显示倒计时 - gameMainBinding.llDatingSvgaTime.setVisibility(View.VISIBLE); - } - }); - } - - public void showHeartAnim(int position, int targetPosition) { - SparseArray micViewPoint = AvRoomDataManager.get().mMicPointMap; - AnimHelper.showDatingSelectUserAnim(getContext(), - (ViewGroup) gameMainBinding.getRoot(), - micViewPoint.get(position), - micViewPoint.get(targetPosition)); - } } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java new file mode 100644 index 000000000..67286363e --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java @@ -0,0 +1,690 @@ +package com.yizhuan.erban.avroom.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.graphics.Point; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; + +import com.coorchice.library.SuperTextView; +import com.netease.nim.uikit.common.util.sys.ScreenUtil; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomNotificationAttachment; +import com.opensource.svgaplayer.SVGACallback; +import com.opensource.svgaplayer.SVGADrawable; +import com.opensource.svgaplayer.SVGADynamicEntity; +import com.opensource.svgaplayer.SVGAImageView; +import com.opensource.svgaplayer.SVGAParser; +import com.opensource.svgaplayer.SVGAVideoEntity; +import com.yizhuan.erban.R; +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.utils.SpannableBuilder; +import com.yizhuan.xchat_android_core.auth.AuthModel; +import com.yizhuan.xchat_android_core.decoration.car.bean.CarInfo; +import com.yizhuan.xchat_android_core.gift.bean.LuckyBagNoticeInfo; +import com.yizhuan.xchat_android_core.im.custom.bean.DatingAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.LevelUpNoticeAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.RoomBoxPrizeAttachment; +import com.yizhuan.xchat_android_core.im.custom.bean.RoomReceivedLuckyGiftAttachment; +import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; +import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; +import com.yizhuan.xchat_android_core.manager.RoomEvent; +import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; +import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; +import com.yizhuan.xchat_android_core.user.UserModel; +import com.yizhuan.xchat_android_core.utils.StringExtensionKt; +import com.yizhuan.xchat_android_library.utils.ListUtils; + +import org.jetbrains.annotations.NotNull; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; + +import static com.yizhuan.xchat_android_constants.XChatConstants.SELECT_ANIM_DURATION; + +/** + * 房间特效View(座驾,心动场景,飘屏等) + */ +public class RoomEffectView extends FrameLayout { + + private boolean isSvgaPlaying; + private final List mCarEffectList = new ArrayList<>(); + + private Animation animation; + private List messages; + private Disposable boxDisposable; + private boolean isCreate; + + private List messagesBoxSVGA; + private Disposable boxSVGADisposable; + private boolean isBoxSVGACreate; + + private Animation animationLuckyGift; + private List messagesLuckyGift; + private boolean isCreateLuckyGift; + private Disposable disposableLuckyGift; + + private List messagesMemberIn; + private boolean isCreateMemberIn; + private Disposable disposableMemberIn; + + private List messagesLevelUp; + private boolean isCreateLevelUp; + private Disposable disposableLevelUp; + + //顶部飘屏总展示时间 + private final int SHOW_TIME = 3500; + //顶部飘屏周期 + private final int PERIOD = 1000; + + private final LayoutRoomEffectBinding binding; + private final Context mContext; + private final Disposable imDisposable; + private Disposable datingDisposable; + + public RoomEffectView(@NonNull Context context) { + this(context, null); + } + + public RoomEffectView(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public RoomEffectView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + binding = LayoutRoomEffectBinding.inflate(LayoutInflater.from(context), this, true); + imDisposable = IMNetEaseManager.get().getChatRoomEventObservable() + .subscribe(roomEvent -> { + if (roomEvent == null) return; + int event = roomEvent.getEvent(); + switch (event) { + case RoomEvent.BOX_NOTIFY: + addBoxNotify(roomEvent.getChatRoomMessage()); + break; + case RoomEvent.BOX_NOTIFY_SVGA: + addBoxNotifyBySVGA(roomEvent.getChatRoomMessage()); + break; + case RoomEvent.RECEIVE_ROOM_LUCKY_BAG_NOTICE: + case RoomEvent.RECEIVE_SERVICE_LUCKY_BAG_NOTICE: + //全服福袋 + //厅内福袋 + addLuckyBagNotify(roomEvent.getChatRoomMessage()); + break; + case RoomEvent.DATING_PUBLISH_RESULT: + showHandAnim(((DatingAttachment) roomEvent.getChatRoomMessage().getAttachment()).getDatingNotifyInfo()); + break; + case RoomEvent.RECEIVE_MEMBER_IN_NOTICE: + //进入房间 + addMemberInNotify(roomEvent.getChatRoomMessage()); + break; + case RoomEvent.RECEIVE_EXPER_LEVEL_UP_NOTICE: + addLevelUpNotify(roomEvent.getChatRoomMessage()); + break; + case RoomEvent.ENTER_ROOM: + if (!SuperAdminUtil.isSuperAdmin()) { + playCarSvga(String.valueOf(AuthModel.get().getCurrentUid()), null, true); + } + break; + case RoomEvent.CAR_MEMBER_IN: + if (roomEvent.mRoomCarMsgAttachment != null) { + playCarSvga(null, roomEvent.mRoomCarMsgAttachment.effect, false); + } + break; + default: + break; + } + } + ); + + binding.roomCarSvga.setCallback(new SimpleSvgaCallback() { + + @Override + public void onFinished() { + isSvgaPlaying = false; + if (ListUtils.isListEmpty(mCarEffectList)) { + binding.roomCarSvga.setVisibility(View.GONE); + return; + } + mCarEffectList.remove(0); + if (!ListUtils.isListEmpty(mCarEffectList)) { + playCarSvagEnterRoom(mCarEffectList.get(0)); + } + } + + }); + } + + + /** + * 开福袋飘屏 + * + * @param chatRoomMessage + */ + private void addLuckyBagNotify(ChatRoomMessage chatRoomMessage) { + if (messagesLuckyGift == null) messagesLuckyGift = new ArrayList<>(); + if (binding.clNotify.getVisibility() == View.GONE) { + binding.clNotify.setVisibility(View.VISIBLE); + } + messagesLuckyGift.add(chatRoomMessage); + if (disposableLuckyGift == null || messagesLuckyGift.size() == 1) { + isCreateLuckyGift = true; + disposableLuckyGift = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(aLong -> { + if (messagesLuckyGift.size() > 0 && !isCreateLuckyGift) + messagesLuckyGift.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 + isCreateLuckyGift = false; + }) + .takeWhile(aLong -> messagesLuckyGift.size() > 0 && messagesLuckyGift.get(0) != null) + .subscribe(aLong -> showLuckyBagNotify(messagesLuckyGift.get(0))); + } + } + + private void showLuckyBagNotify(ChatRoomMessage message) { + RoomReceivedLuckyGiftAttachment attachment = (RoomReceivedLuckyGiftAttachment) message.getAttachment(); + TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.layout_room_lucky_gift_notify, null); + LuckyBagNoticeInfo noticeInfo = attachment.getLuckyBagNoticeInfo(); + if (noticeInfo == null) return; + SpannableBuilder text = new SpannableBuilder() + .append("哇偶! ", new ForegroundColorSpan(Color.WHITE)) + .append(noticeInfo.getNick() + " ", new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) + .append("通过", new ForegroundColorSpan(Color.WHITE)) + .append(noticeInfo.getLuckyBagName() + " ", new ForegroundColorSpan(Color.WHITE)) + .append("开出了", new ForegroundColorSpan(Color.WHITE)) + .append(noticeInfo.getGiftName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))); + textView.setText(text.build()); + animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify); + textView.startAnimation(animationLuckyGift); + binding.flLuckyGiftNotify.postDelayed(() -> binding.flLuckyGiftNotify.removeView(textView), SHOW_TIME); + + } + + /** + * 幸运池飘屏 + * + * @param chatRoomMessage + */ + private void addBoxNotify(ChatRoomMessage chatRoomMessage) { + if (messages == null) messages = new ArrayList<>(); + if (binding.clNotify.getVisibility() == View.GONE) { + binding.clNotify.setVisibility(View.VISIBLE); + } + messages.add(chatRoomMessage); + if (boxDisposable == null || messages.size() == 1) { + isCreate = true; + boxDisposable = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(aLong -> { + if (messages.size() > 0 && !isCreate) + messages.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 + isCreate = false; + }) + .takeWhile(aLong -> messages.size() > 0 && messages.get(0) != null) + .subscribe(aLong -> showBoxNotify(messages.get(0))); + } + } + + private void showBoxNotify(ChatRoomMessage chatRoomMessage) { + RoomBoxPrizeAttachment attachment = (RoomBoxPrizeAttachment) chatRoomMessage.getAttachment(); + TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.layout_room_box_notify, null); + SpannableBuilder text = new SpannableBuilder() + .append("厉害了! ", new ForegroundColorSpan(Color.WHITE)) + .append(attachment.getNick() + " ", new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) + .append(attachment.getBoxTypeStr() + " ", new ForegroundColorSpan(Color.WHITE)) + .append(attachment.getPrizeName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))) + .append("x" + attachment.getPrizeNum(), new ForegroundColorSpan(Color.WHITE)); + textView.setText(text.build()); + animation = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify); + binding.flBoxNotify.addView(textView); + textView.startAnimation(animation); + binding.flBoxNotify.postDelayed(() -> binding.flBoxNotify.removeView(textView), SHOW_TIME); + } + + /** + * 幸运池飘屏 五级 SVGA背景的 + * + * @param chatRoomMessage + */ + private void addBoxNotifyBySVGA(ChatRoomMessage chatRoomMessage) { + if (messagesBoxSVGA == null) messagesBoxSVGA = new ArrayList<>(); + if (binding.clNotify.getVisibility() == View.GONE) { + binding.clNotify.setVisibility(View.VISIBLE); + } + messagesBoxSVGA.add(chatRoomMessage); + if (boxSVGADisposable == null || messagesBoxSVGA.size() == 1) { + isBoxSVGACreate = true; + boxSVGADisposable = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(aLong -> { + if (messagesBoxSVGA.size() > 0 && !isBoxSVGACreate) + messagesBoxSVGA.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 + isBoxSVGACreate = false; + }) + .takeWhile(aLong -> messagesBoxSVGA.size() > 0 && messagesBoxSVGA.get(0) != null) + .subscribe(aLong -> showBoxNotifyBySVGA(messagesBoxSVGA.get(0))); + } + } + + + private void showBoxNotifyBySVGA(ChatRoomMessage chatRoomMessage) { + RoomBoxPrizeAttachment attachment = (RoomBoxPrizeAttachment) chatRoomMessage.getAttachment(); + SpannableBuilder text = new SpannableBuilder() + .append("厉害了! ", new ForegroundColorSpan(Color.WHITE)) + .append(attachment.getNick() + " ", new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) + .append(attachment.getBoxTypeStr() + " ", new ForegroundColorSpan(Color.WHITE)) + .append(attachment.getPrizeName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))) + .append("x" + attachment.getPrizeNum(), new ForegroundColorSpan(Color.WHITE)); + + SVGAImageView svgaImageView = new SVGAImageView(mContext); + svgaImageView.setLoops(1); + svgaImageView.setClearsAfterStop(true); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); + svgaImageView.setLayoutParams(params); + svgaImageView.setCallback(new SimpleSvgaCallback() { + @Override + public void onFinished() { + binding.flSvgaBoxNotify.post(() -> binding.flSvgaBoxNotify.removeView(svgaImageView)); + } + }); + binding.flSvgaBoxNotify.addView(svgaImageView); + SVGAParser.Companion.shareParser().decodeFromAssets("svga/box_notify.svga", new SVGAParser.ParseCompletion() { + @Override + public void onComplete(@Nullable SVGAVideoEntity svgaVideoEntity) { + SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); + TextPaint textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE);//字体颜色 + textPaint.setTextSize(24);//字体大小 + dynamicEntity.setDynamicText(new StaticLayout( + text.build(), + 0, + text.build().length(), + textPaint, + 0, + Layout.Alignment.ALIGN_CENTER, + 1.0f, + 0.0f, + false + ), "xtc_copywriting"); + SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); + svgaImageView.setImageDrawable(drawable); + svgaImageView.stepToFrame(0, true); + } + + @Override + public void onError() { + + } + }); + } + + /** + * 成员进入飘屏 + * + * @param chatRoomMessage + */ + private void addMemberInNotify(ChatRoomMessage chatRoomMessage) { + if (messagesMemberIn == null) messagesMemberIn = new ArrayList<>(); + messagesMemberIn.add(chatRoomMessage); + if (disposableMemberIn == null || messagesMemberIn.size() == 1) { + isCreateMemberIn = true; + disposableMemberIn = Observable.interval(0, 6, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(aLong -> { + if (messagesMemberIn.size() > 0 && !isCreateMemberIn) + messagesMemberIn.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 + isCreateMemberIn = false; + }) + .takeWhile(aLong -> messagesMemberIn.size() > 0 && messagesMemberIn.get(0) != null) + .subscribe(aLong -> showMemberInNotify(messagesMemberIn.get(0))); + } + } + + private void showMemberInNotify(ChatRoomMessage chatRoomMessage) { + ChatRoomNotificationAttachment attachment = (ChatRoomNotificationAttachment) chatRoomMessage.getAttachment(); + Map remoteExtension = chatRoomMessage.getRemoteExtension(); + int experLevelSeq = (int) remoteExtension.get("experLevelSeq"); + List targetNicks = attachment.getTargetNicks(); + if (ListUtils.isListEmpty(targetNicks)) { + return; + } + int fromType = (int) remoteExtension.get("fromType"); + String fromNick = (String) remoteExtension.get("fromNick"); + + SuperTextView textView = (SuperTextView) LayoutInflater.from(mContext).inflate(R.layout.layout_member_in_notify, null); + // 内容 + MessageView.SpannableBuilder text = new MessageView.SpannableBuilder(textView) + .append(targetNicks.get(0), new ForegroundColorSpan(Color.WHITE)); + String enterText = " 进入了房间 "; + if (fromType == AVRoomActivity.FROM_TYPE_RECOMMEND) { + enterText = " 根据首页推荐进入了房间"; + } + if (fromType == AVRoomActivity.FROM_TYPE_USER) { + enterText = " 跟随 " + fromNick + "进入了房间"; + } + text.append(enterText, new ForegroundColorSpan(Color.WHITE)); + textView.setText(text.build()); + playMemberInAnim("【" + targetNicks.get(0) + "】" + enterText, memberInSvgaPath(experLevelSeq)); + } + + private String memberInSvgaPath(int level) { + String path = ""; + if (level >= 30 && level <= 39) { + path = "svga/svga_member_in_lv30.svga"; + } else if (level >= 40 && level <= 49) { + path = "svga/svga_member_in_lv40.svga"; + } else if (level >= 50 && level <= 59) { + path = "svga/svga_member_in_lv50.svga"; + } else if (level >= 60 && level <= 69) { + path = "svga/svga_member_in_lv60.svga"; + } else if (level >= 70 && level <= 79) { + path = "svga/svga_member_in_lv70.svga"; + } else if (level >= 80 && level <= 89) { + path = "svga/svga_member_in_lv80.svga"; + } else if (level >= 90) { + path = "svga/svga_member_in_lv90.svga"; + } + return path; + } + + private void playMemberInAnim(String text, String path) { + SVGAParser.Companion.shareParser().decodeFromAssets(path, new SVGAParser.ParseCompletion() { + @Override + public void onComplete(@Nullable SVGAVideoEntity svgaVideoEntity) { + binding.roomMenberInSvga.setVisibility(View.VISIBLE); + binding.roomMenberInSvga.setLoops(1); + binding.roomMenberInSvga.setClearsAfterStop(true); + SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); + TextPaint textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE);//字体颜色 + textPaint.setTextSize(22);//字体大小 + dynamicEntity.setDynamicText(new StaticLayout( + text, + 0, + text.length(), + textPaint, + 0, + Layout.Alignment.ALIGN_NORMAL, + 1.0f, + 0.0f, + false + ), "room_text"); + SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); + binding.roomMenberInSvga.setImageDrawable(drawable); + binding.roomMenberInSvga.stepToFrame(0, true); + } + + @Override + public void onError() { + + } + }); + } + + + /** + * 升级飘屏 + * + * @param chatRoomMessage + */ + private void addLevelUpNotify(ChatRoomMessage chatRoomMessage) { + if (messagesLevelUp == null) messagesLevelUp = new ArrayList<>(); + messagesLevelUp.add(chatRoomMessage); + if (disposableLevelUp == null || messagesLevelUp.size() == 1) { + isCreateLevelUp = true; + disposableLevelUp = Observable.interval(0, 6, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(aLong -> { + if (messagesLevelUp.size() > 0 && !isCreateLevelUp) + messagesLevelUp.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 + isCreateLevelUp = false; + }) + .takeWhile(aLong -> messagesLevelUp.size() > 0 && messagesLevelUp.get(0) != null) + .subscribe(aLong -> showLevelUpNotify(messagesLevelUp.get(0))); + } + } + + private void showLevelUpNotify(ChatRoomMessage chatRoomMessage) { + LevelUpNoticeAttachment attachment = (LevelUpNoticeAttachment) chatRoomMessage.getAttachment(); + String message = attachment.getMessage(); + String picUrl = attachment.getPicUrl(); + long roomUid = attachment.getRoomUid(); + if (picUrl == null || message == null) { + return; + } + playLevelUpAnim(message, picUrl, roomUid); + } + + private void playLevelUpAnim(String message, String picUrl, long roomUid) { + try { + SVGAParser.Companion.shareParser().decodeFromURL(new URL(picUrl), new SVGAParser.ParseCompletion() { + @Override + public void onComplete(@javax.annotation.Nullable SVGAVideoEntity svgaVideoEntity) { + if (svgaVideoEntity == null) return; + binding.roomLevelUpSvga.setVisibility(View.VISIBLE); + binding.roomLevelUpSvga.setLoops(1); + binding.roomLevelUpSvga.setClearsAfterStop(true); + SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); + TextPaint textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE);//字体颜色 + textPaint.setTextSize(22);//字体大小 Util.dip2px(mContext,11) +// textPaint.setShadowLayer(3, 2, 2, 0xff000000);//字体阴影,不需要可以不用设置 + dynamicEntity.setDynamicText(message, textPaint, "y_yhname"); + SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); + binding.roomLevelUpSvga.setImageDrawable(drawable); + binding.roomLevelUpSvga.stepToFrame(0, true); + binding.roomLevelUpSvga.setCallback(new SimpleSvgaCallback() { + @Override + public void onFinished() { + binding.roomLevelUpSvga.setVisibility(View.GONE); + } + }); + } + + @Override + public void onError() { + + } + }); + binding.roomLevelUpSvga.setOnClickListener(v -> + AVRoomActivity.start(mContext, roomUid)); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + + @SuppressLint({"SetTextI18n"}) + private void showHandAnim(final DatingNotifyInfo datingNotifyInfo) { + if (datingDisposable != null) datingDisposable.dispose(); + binding.flSvgaDating.setOnClickListener(v -> { + //do noting + }); + binding.ivDatingSvgaClose.setOnClickListener(v -> { + binding.flSvgaDating.setVisibility(View.GONE); + if (datingDisposable != null) datingDisposable.dispose(); + }); + binding.flSvgaDating.post(() -> binding.flSvgaDating.setVisibility(View.GONE)); + datingDisposable = Single.just(datingNotifyInfo) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(info -> { + if (datingNotifyInfo.getHasSelectUser() && !datingNotifyInfo.getHasHeart()) { + showHeartAnim(datingNotifyInfo.getPosition(), datingNotifyInfo.getTargetPosition()); + return Single.timer(SELECT_ANIM_DURATION, TimeUnit.MILLISECONDS).map(aLong -> info); + } + return Single.just(info); + }) + .observeOn(AndroidSchedulers.mainThread()) + .filter(info -> datingNotifyInfo.getHasHeart()) + .toObservable() + .flatMap(info -> Observable.create((ObservableOnSubscribe) emitter -> + SVGAParser.Companion.shareParser().decodeFromURL(new URL(datingNotifyInfo.getSvgaUrl()), new SVGAParser.ParseCompletion() { + + @Override + public void onComplete(@NotNull SVGAVideoEntity svgaVideoEntity) { + binding.flSvgaDating.setVisibility(View.VISIBLE); + binding.llDatingSvgaTime.setVisibility(View.GONE); + SVGADynamicEntity dynamicEntity = new SVGADynamicEntity(); + TextPaint textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE); + textPaint.setTextSize(ScreenUtil.sp2px(10)); + AnimHelper.addDynamicImage(binding.svgaDating, dynamicEntity, datingNotifyInfo.getAvatar(), "z_tx"); + AnimHelper.addDynamicImage(binding.svgaDating, dynamicEntity, datingNotifyInfo.getTargetAvatar(), "y_tx"); + dynamicEntity.setDynamicText(StringExtensionKt.subAndReplaceDot(datingNotifyInfo.getNickname(), 5), textPaint, "z_yhname"); + dynamicEntity.setDynamicText(StringExtensionKt.subAndReplaceDot(datingNotifyInfo.getTargetNickname(), 5), textPaint, "y_yhname"); + SVGADrawable drawable = new SVGADrawable(svgaVideoEntity, dynamicEntity); + binding.svgaDating.setImageDrawable(drawable); + binding.svgaDating.startAnimation(); + emitter.onNext(info); + emitter.onComplete(); + } + + @Override + public void onError() { + emitter.onError(new Throwable("svga解析失败")); + } + }))) + .flatMap(info -> Observable.intervalRange(1, info.getSvgaSecond(), 1, 1, TimeUnit.SECONDS)) + .observeOn(AndroidSchedulers.mainThread()) + .doAfterTerminate(() -> binding.flSvgaDating.setVisibility(View.GONE)) + .subscribe(aLong -> { + long residueTime = datingNotifyInfo.getSvgaSecond() - aLong; + binding.tvDatingSecond.setText(residueTime + "S"); + if (residueTime == 5) {//剩余5秒开始显示倒计时 + binding.llDatingSvgaTime.setVisibility(View.VISIBLE); + } + }); + } + + public void showHeartAnim(int position, int targetPosition) { + SparseArray micViewPoint = AvRoomDataManager.get().mMicPointMap; + AnimHelper.showDatingSelectUserAnim(getContext(), + (ViewGroup) binding.getRoot(), + micViewPoint.get(position), + micViewPoint.get(targetPosition)); + } + + @SuppressLint("CheckResult") + private void playCarSvga(String account, String effect, boolean isSendMsg) { + if (isSendMsg) { + UserModel.get().getUserInfoFromServer(Long.valueOf(account)) + .subscribe(userInfo -> { + //播放座驾动效 + if (userInfo != null + && userInfo.getCarInfo() != null + && userInfo.getCarInfo().isUsing() + && userInfo.getCarInfo().getStatus() == CarInfo.STATUS_USER_CAN_USE) { + if (AvRoomDataManager.get().mIsNeedGiftEffect) { + mCarEffectList.add(userInfo.getCarInfo().getEffect()); + } + // 非贵族人员,进来后要播放座驾动画 + if (userInfo.getNobleInfo() == null) { + if (!binding.roomCarSvga.isAnimating() && !isSvgaPlaying) { + // 播放座驾动画 + playCarSvagEnterRoom(userInfo.getCarInfo().getEffect()); + } + // 公屏进入房间的提示语 + IMNetEaseManager.get() + .sendCarPlayRoomMsgBySdk(userInfo.getCarInfo(), userInfo.getUid(), userInfo.getNick()) + .subscribe(); + } + // 贵族人员,要先判断是否隐身 + if (userInfo.getNobleInfo() != null && !userInfo.getNobleInfo().isNobleEnterHide()) { + if (!binding.roomCarSvga.isAnimating() && !isSvgaPlaying) { + // 播放座驾动画 + playCarSvagEnterRoom(userInfo.getCarInfo().getEffect()); + } + // 公屏进入房间的提示语 + IMNetEaseManager.get() + .sendCarPlayRoomMsgBySdk(userInfo.getCarInfo(), userInfo.getUid(), userInfo.getNick()) + .subscribe(); + } + } + }); + } else { + if (TextUtils.isEmpty(effect)) return; + if (AvRoomDataManager.get().mIsNeedGiftEffect) { + mCarEffectList.add(effect); + } + if (!binding.roomCarSvga.isAnimating() && !isSvgaPlaying) { + playCarSvagEnterRoom(effect); + } + + } + } + + /** + * 真实播放svga + * + * @param effect + */ + private void playCarSvagEnterRoom(String effect) { + if (TextUtils.isEmpty(effect)) return; + if (!AvRoomDataManager.get().mIsNeedGiftEffect) return; + isSvgaPlaying = true; + try { + SVGAParser.Companion.shareParser().decodeFromURL(new URL(effect), + new SVGAParser.ParseCompletion() { + @Override + public void onComplete(SVGAVideoEntity svgaVideoEntity) { + binding.roomCarSvga.setVisibility(View.VISIBLE); + binding.roomCarSvga.setLoops(1); + binding.roomCarSvga.setClearsAfterStop(true); + binding.roomCarSvga.setImageDrawable(new SVGADrawable(svgaVideoEntity)); + binding.roomCarSvga.startAnimation(); + } + + @Override + public void onError() { + isSvgaPlaying = false; + binding.roomCarSvga.setVisibility(View.GONE); + } + }); + } catch (MalformedURLException e) { + e.printStackTrace(); + isSvgaPlaying = false; + } + } + + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (boxDisposable != null) boxDisposable.dispose(); + if (disposableLuckyGift != null) disposableLuckyGift.dispose(); + if (disposableMemberIn != null) disposableMemberIn.dispose(); + if (disposableLevelUp != null) disposableLevelUp.dispose(); + if (datingDisposable != null) datingDisposable.dispose(); + if (imDisposable != null) imDisposable.dispose(); + } +} diff --git a/app/src/main/res/layout/fragment_chatroom_game_main.xml b/app/src/main/res/layout/fragment_chatroom_game_main.xml index 82783417c..81654eb72 100644 --- a/app/src/main/res/layout/fragment_chatroom_game_main.xml +++ b/app/src/main/res/layout/fragment_chatroom_game_main.xml @@ -185,21 +185,6 @@ android:src="@drawable/icon_room_treasure_box" tools:contentDescription="ktv开宝箱" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_room_effect.xml b/app/src/main/res/layout/layout_room_effect.xml new file mode 100644 index 000000000..35a575fea --- /dev/null +++ b/app/src/main/res/layout/layout_room_effect.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 4567a62a548cf59126fe95b1520c14acce645c35 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 25 Feb 2021 18:14:51 +0800 Subject: [PATCH 44/49] =?UTF-8?q?1.=E7=9B=B8=E4=BA=B2=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E6=88=BF=E9=97=B4=E6=A8=AA=E5=B9=85=202.=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E5=BC=B9=E7=AA=97=E6=96=87=E6=A1=88=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomePartyRoomFragment.java | 2 +- .../erban/avroom/widget/RoomEffectView.java | 77 +++++++++++++++++- .../erban/ui/widget/DatingSelectDialog.kt | 22 +++++ .../erban/ui/widget/UserInfoDialog.java | 8 +- .../res/drawable-xhdpi/bg_dating_hand_1.png | Bin 0 -> 77893 bytes .../res/drawable-xhdpi/bg_dating_hand_2.png | Bin 0 -> 92494 bytes .../res/drawable-xhdpi/bg_dating_hand_3.png | Bin 0 -> 109812 bytes .../layout/layout_room_dating_all_notify.xml | 15 ++++ .../main/res/layout/layout_room_effect.xml | 11 ++- .../res/layout/dialog_dating_select.xml | 73 +++++++++++++++++ .../manager/IMNetEaseManager.java | 7 ++ .../im/custom/bean/CustomAttachParser.java | 40 +++++---- .../im/custom/bean/CustomAttachment.java | 4 + .../bean/DatingAllNotifyAttachment.java | 39 +++++++++ .../xchat_android_core/manager/RoomEvent.java | 1 + .../room/bean/DatingAllNotifyInfo.kt | 43 ++++++++++ 16 files changed, 312 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/ui/widget/DatingSelectDialog.kt create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_hand_1.png create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_hand_2.png create mode 100644 app/src/main/res/drawable-xhdpi/bg_dating_hand_3.png create mode 100644 app/src/main/res/layout/layout_room_dating_all_notify.xml create mode 100644 app/src/module_community/res/layout/dialog_dating_select.xml create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAllNotifyAttachment.java create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingAllNotifyInfo.kt diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 4feda15ef..35efc52b0 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -1314,7 +1314,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment"); gameBinding.tvDatingStep.setText("公布心动"); - hintText = "结束本轮,同时清空魅力值?"; + hintText = "结束本轮,同时邀请新一轮嘉宾?"; break; } } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java index 67286363e..7746164b6 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.java @@ -21,13 +21,11 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.databinding.DataBindingUtil; import com.coorchice.library.SuperTextView; import com.netease.nim.uikit.common.util.sys.ScreenUtil; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.netease.nimlib.sdk.chatroom.model.ChatRoomNotificationAttachment; -import com.opensource.svgaplayer.SVGACallback; import com.opensource.svgaplayer.SVGADrawable; import com.opensource.svgaplayer.SVGADynamicEntity; import com.opensource.svgaplayer.SVGAImageView; @@ -38,10 +36,12 @@ 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.ui.utils.ImageLoadUtils; import com.yizhuan.erban.utils.SpannableBuilder; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.decoration.car.bean.CarInfo; import com.yizhuan.xchat_android_core.gift.bean.LuckyBagNoticeInfo; +import com.yizhuan.xchat_android_core.im.custom.bean.DatingAllNotifyAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.DatingAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.LevelUpNoticeAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.RoomBoxPrizeAttachment; @@ -49,6 +49,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.RoomReceivedLuckyGiftAttach import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.manager.RoomEvent; +import com.yizhuan.xchat_android_core.room.bean.DatingAllNotifyInfo; import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; import com.yizhuan.xchat_android_core.user.UserModel; @@ -102,6 +103,11 @@ public class RoomEffectView extends FrameLayout { private boolean isCreateLevelUp; private Disposable disposableLevelUp; + private Animation animationDatingAll; + private List messagesDatingAll; + private boolean isCreateDatingAll; + private Disposable disposableDatingAll; + //顶部飘屏总展示时间 private final int SHOW_TIME = 3500; //顶部飘屏周期 @@ -132,6 +138,9 @@ public class RoomEffectView extends FrameLayout { case RoomEvent.BOX_NOTIFY: addBoxNotify(roomEvent.getChatRoomMessage()); break; + case RoomEvent.DATING_ALL_NOTIFY: + addDatingAllNotify(roomEvent.getChatRoomMessage()); + break; case RoomEvent.BOX_NOTIFY_SVGA: addBoxNotifyBySVGA(roomEvent.getChatRoomMessage()); break; @@ -185,6 +194,69 @@ public class RoomEffectView extends FrameLayout { }); } + /** + * 幸运池飘屏 + * + * @param chatRoomMessage + */ + private void addDatingAllNotify(ChatRoomMessage chatRoomMessage) { + if (disposableDatingAll == null) messagesDatingAll = new ArrayList<>(); + if (binding.clNotify.getVisibility() == View.GONE) { + binding.clNotify.setVisibility(View.VISIBLE); + } + messagesDatingAll.add(chatRoomMessage); + if (disposableDatingAll == null || messagesDatingAll.size() == 1) { + isCreateDatingAll = true; + disposableDatingAll = Observable.interval(0, PERIOD, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(aLong -> { + if (messagesDatingAll.size() > 0 && !isCreateDatingAll) + messagesDatingAll.remove(0);//如果不是新创建的Observable发送的数据,需要移除第一个 + isCreateDatingAll = false; + }) + .takeWhile(aLong -> messagesDatingAll.size() > 0 && messagesDatingAll.get(0) != null) + .subscribe(aLong -> showDatingAllNotify(messagesDatingAll.get(0))); + } + } + + private void showDatingAllNotify(ChatRoomMessage chatRoomMessage) { + DatingAllNotifyAttachment attachment = (DatingAllNotifyAttachment) chatRoomMessage.getAttachment(); + if (attachment == null) return; + DatingAllNotifyInfo notifyInfo = attachment.getDatingAllNotifyInfo(); + if (notifyInfo == null) return; + TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.layout_room_dating_all_notify, null); + textView.setOnClickListener(v -> AVRoomActivity.start(mContext, notifyInfo.getRoomUid())); + int defaultBg = R.drawable.bg_dating_hand_1; + switch (notifyInfo.getJoinHandLevel()) { + case 1: + defaultBg = R.drawable.bg_dating_hand_1; + break; + case 2: + defaultBg = R.drawable.bg_dating_hand_2; + break; + case 3: + defaultBg = R.drawable.bg_dating_hand_3; + break; + } + textView.setBackgroundResource(defaultBg); + ImageLoadUtils.loadBackground(mContext, notifyInfo.getBackgroundUrl(), defaultBg, textView); + SpannableBuilder text = new SpannableBuilder() + .append("恭喜", new ForegroundColorSpan(Color.WHITE)) + .append(getShortString(notifyInfo.getOneUserNick(), 8), new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) + .append("与", new ForegroundColorSpan(Color.WHITE)) + .append(getShortString(notifyInfo.getAnotherUserNick(), 8), new ForegroundColorSpan(getResources().getColor(R.color.notice_nick))) + .append("在(" + getShortString(notifyInfo.getRoomTitle(), 10) + ")" + "牵手成功,快来见证吧!", new ForegroundColorSpan(Color.WHITE)); + textView.setText(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), SHOW_TIME); + } + + private String getShortString(String text, int max) { + if (TextUtils.isEmpty(text) || text.length() <= max) return text; + return text.substring(0, max) + "…"; + } /** * 开福袋飘屏 @@ -686,5 +758,6 @@ public class RoomEffectView extends FrameLayout { if (disposableLevelUp != null) disposableLevelUp.dispose(); if (datingDisposable != null) datingDisposable.dispose(); if (imDisposable != null) imDisposable.dispose(); + if (disposableDatingAll != null) disposableDatingAll.dispose(); } } diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/DatingSelectDialog.kt b/app/src/main/java/com/yizhuan/erban/ui/widget/DatingSelectDialog.kt new file mode 100644 index 000000000..b0b7c5535 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/DatingSelectDialog.kt @@ -0,0 +1,22 @@ +package com.yizhuan.erban.ui.widget + +import com.netease.nim.uikit.common.util.sys.ScreenUtil +import com.yizhuan.erban.base.BaseDialog +import com.yizhuan.erban.databinding.DialogDatingSelectBinding +import com.yizhuan.xchat_android_core.room.event.DatingSelectUserEvent +import org.greenrobot.eventbus.EventBus + +class DatingSelectDialog(val position: Int, val uid: Long, private val myUid: Long, val roomUid: Long) : BaseDialog() { + + override fun init() { + width = ScreenUtil.dip2px(200f) + binding.tvMessage.text = "确认选择" + (position + 1) + "号嘉宾?" + binding.btnCancel.setOnClickListener { + dismissAllowingStateLoss() + } + binding.btnOk.setOnClickListener { + EventBus.getDefault().post(DatingSelectUserEvent(uid, myUid, roomUid)) + dismissAllowingStateLoss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java index 21b81d00f..bbf99da8f 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java +++ b/app/src/main/java/com/yizhuan/erban/ui/widget/UserInfoDialog.java @@ -280,11 +280,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe if (micPosition == Integer.MIN_VALUE) { SingleToastUtil.showToast("该用户已不在麦位上,请重新选择"); } else { - new DialogManager(context).showOkCancelDialog("确认选择" + (micPosition + 1) + "号嘉宾?", - true, () -> { - EventBus.getDefault().post(new DatingSelectUserEvent(uid, myUid, roomInfo.getUid())); - dismiss(); - }); + new DatingSelectDialog(micPosition, uid, myUid, roomInfo.getUid()).show(context); } } ); @@ -1205,7 +1201,7 @@ public class UserInfoDialog extends AppCompatDialog implements View.OnClickListe setMicViewVisiable(true); RecyclerView recyclerView = findViewById(R.id.recycler_view_mic); - UpMicAdapter adapter = new UpMicAdapter(context,uid, + UpMicAdapter adapter = new UpMicAdapter(context, uid, position -> { if (AvRoomDataManager.get().isLeaveMode() && uid == AvRoomDataManager.get().getRoomUid()) { SingleToastUtil.showToast(context.getString(R.string.tips_close_leave_mode_first)); diff --git a/app/src/main/res/drawable-xhdpi/bg_dating_hand_1.png b/app/src/main/res/drawable-xhdpi/bg_dating_hand_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cfc4e67919f6f5d2ffb7ff84df9dbdb780ad099e GIT binary patch literal 77893 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

&(qB~Fc$X^ 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/bg_dating_hand_3.png b/app/src/main/res/drawable-xhdpi/bg_dating_hand_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9ba64fa0b3565490a8b6685f8ed9e38f732f73 GIT binary patch literal 109812 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 BC$azl literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/layout_room_dating_all_notify.xml b/app/src/main/res/layout/layout_room_dating_all_notify.xml new file mode 100644 index 000000000..7f912ee49 --- /dev/null +++ b/app/src/main/res/layout/layout_room_dating_all_notify.xml @@ -0,0 +1,15 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_room_effect.xml b/app/src/main/res/layout/layout_room_effect.xml index 35a575fea..cd86b9cd7 100644 --- a/app/src/main/res/layout/layout_room_effect.xml +++ b/app/src/main/res/layout/layout_room_effect.xml @@ -43,7 +43,6 @@ android:id="@+id/fl_lucky_gift_notify" android:layout_width="match_parent" android:layout_height="0dp" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="75:11" app:layout_constraintTop_toTopOf="parent" /> @@ -51,7 +50,6 @@ android:id="@+id/fl_box_notify" android:layout_width="match_parent" android:layout_height="0dp" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="75:11" app:layout_constraintTop_toTopOf="parent" /> @@ -59,10 +57,17 @@ android:id="@+id/fl_svga_box_notify" android:layout_width="match_parent" android:layout_height="0dp" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="75:11" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 025dab1f9..fc3689b54 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -217,6 +217,7 @@ import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUS import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ASSISTANT_MSG; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_BOX; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DATING; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DATING_All; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DRAGON_BAR; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DRAGON_BAR_CANCEL; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DRAGON_BAR_END; @@ -243,6 +244,7 @@ import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUS import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_BOX_ALL_ROOM_NOTIFY_BY_SVGA; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_BOX_IN_ROOM; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_BOX_ME; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DATING_Al_NOTIFY; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_HEART; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT; @@ -1323,6 +1325,11 @@ public final class IMNetEaseManager { break; } break; + case CUSTOM_MSG_DATING_All: + if (second == CUSTOM_MSG_SUB_DATING_Al_NOTIFY) { + noticeRoomEvent(msg, RoomEvent.DATING_ALL_NOTIFY); + } + break; default: break; } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java index f077d823b..15c0caa8d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java @@ -132,9 +132,9 @@ public class CustomAttachParser implements MsgAttachmentParser { attachment = new AuctionAttachment(first, second); break; case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT: - if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_GIFT){ + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_GIFT) { attachment = new GiftAttachment(first, second); - }else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT){ + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT) { attachment = new MultiLuckyGiftAttachment(first, second); } break; @@ -143,9 +143,9 @@ public class CustomAttachParser implements MsgAttachmentParser { attachment = new MultiGiftAttachment(first, second); } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT) { attachment = new GiftBatchAttachment(first, second); - } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT){ + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT) { attachment = new MultiLuckyGiftAttachment(first, second); - } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT){ + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT) { attachment = new MultiLuckyGiftAttachment(first, second); } break; @@ -284,7 +284,7 @@ public class CustomAttachParser implements MsgAttachmentParser { } break; case CUSTOM_MSG_LEVEL_UP: - switch (second){ + switch (second) { case CUSTOM_MSG_EXPER_LEVEL_UP: case CUSTOM_MSG_CHARM_LEVEL_UP: attachment = new LevelUpAttachment(CUSTOM_MSG_LEVEL_UP, second); @@ -513,7 +513,7 @@ public class CustomAttachParser implements MsgAttachmentParser { } break; case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT: - switch (second){ + switch (second) { case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT_ROOM_NOTIFY: case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY: attachment = new RoomReceivedLuckyGiftAttachment(second); @@ -529,18 +529,22 @@ public class CustomAttachParser implements MsgAttachmentParser { } break; case CustomAttachment.CUSTOM_MSG_DATING: - switch (second) { - case CustomAttachment.CUSTOM_MSG_SUB_DATING_SELECT: - case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE: - case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_HEART: - attachment = new DatingAttachment(second); - break; - case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT: - attachment = new DatingPublishAttachment(first, second); - break; - } - break; - + switch (second) { + case CustomAttachment.CUSTOM_MSG_SUB_DATING_SELECT: + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE: + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_HEART: + attachment = new DatingAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_SUB_DATING_PUBLISH_RESULT: + attachment = new DatingPublishAttachment(first, second); + break; + } + break; + case CustomAttachment.CUSTOM_MSG_DATING_All: + if (second == CustomAttachment.CUSTOM_MSG_SUB_DATING_Al_NOTIFY) { + attachment = new DatingAllNotifyAttachment(second); + } + break; case CustomAttachment.CUSTOM_MESS_TAROT: attachment = new TarotAttachment(CustomAttachment.CUSTOM_MESS_TAROT, CustomAttachment.CUSTOM_MESS_TAROT_SUCCESS); break; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java index 8274b485b..9aaa49fde 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java @@ -378,6 +378,10 @@ public class CustomAttachment implements MsgAttachment { public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_LIKE = 723; public static final int CUSTOM_MSG_SUB_DATING_PUBLISH_HEART = 724; + //相亲模式全服飘屏 + public static final int CUSTOM_MSG_DATING_All = 73; + public static final int CUSTOM_MSG_SUB_DATING_Al_NOTIFY = 731; + public CustomAttachment() { } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAllNotifyAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAllNotifyAttachment.java new file mode 100644 index 000000000..49eb4f4a3 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/DatingAllNotifyAttachment.java @@ -0,0 +1,39 @@ +package com.yizhuan.xchat_android_core.im.custom.bean; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.yizhuan.xchat_android_core.room.bean.DatingAllNotifyInfo; +import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo; + +/** + * @author xiaoyu + */ + +public class DatingAllNotifyAttachment extends CustomAttachment { + + private DatingAllNotifyInfo datingAllNotifyInfo; + + + public DatingAllNotifyAttachment(int second) { + super(CUSTOM_MSG_DATING_All, second); + } + + public DatingAllNotifyInfo getDatingAllNotifyInfo() { + return datingAllNotifyInfo; + } + + public void setDatingAllNotifyInfo(DatingAllNotifyInfo datingAllNotifyInfo) { + this.datingAllNotifyInfo = datingAllNotifyInfo; + } + + @Override + protected void parseData(JSONObject data) { + datingAllNotifyInfo = new Gson().fromJson(data.toJSONString(), DatingAllNotifyInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(datingAllNotifyInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java index c9abc643f..e40053338 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java @@ -207,6 +207,7 @@ public class RoomEvent { public static final int BOX_NOTIFY_SVGA = 69; public static final int DATING_PUBLISH_RESULT = 70; + public static final int DATING_ALL_NOTIFY = 71; private int event = NONE; private int micPosition = Integer.MIN_VALUE; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingAllNotifyInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingAllNotifyInfo.kt new file mode 100644 index 000000000..e16a2c62e --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/DatingAllNotifyInfo.kt @@ -0,0 +1,43 @@ +package com.yizhuan.xchat_android_core.room.bean + +import java.io.Serializable + +data class DatingAllNotifyInfo( + + /** + * 消息唯一标识 + */ + val messId: String, + /** + * 消息创建时间 + */ + val messTime: Long, + /** + * 用户昵称 + */ + val oneUserNick: String, + /** + * 另一个用户昵称 + */ + val anotherUserNick: String, + /** + * 房间uid + */ + val roomUid: Long, + /** + * 房间title + */ + val roomTitle: String, + /** + * 飘屏图片地址 + */ + val backgroundUrl: String, + /** + * 心动场景等级 + */ + val joinHandLevel: Int, + /** + * 心动场景等级 + */ + val joinHandName: String, +) : Serializable \ No newline at end of file From c1798532a4c90a9fad9e4b8935a517eb736d28ea Mon Sep 17 00:00:00 2001 From: huangjian Date: Fri, 26 Feb 2021 11:00:44 +0800 Subject: [PATCH 45/49] =?UTF-8?q?=E5=BC=80=E5=90=AF=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=9A=84=E6=88=BF=E9=97=B4=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E6=A6=9C=E5=A2=9E=E5=8A=A0=E6=9C=88=E6=A6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomePartyRoomFragment.java | 7 +- .../fragment/RoomCharmListFragment.java | 14 +- .../fragment/RoomContributeListFragment.java | 16 +- .../fragment/RoomRankDialogFragment.java | 19 +- .../fragment/RoomRankHalfHourFragment.java | 359 ---------------- .../avroom/widget/RankNavigatorAdapter.java | 7 +- .../res/layout/fragment_room_charm_list.xml | 2 +- .../res/layout/fragment_room_contribute.xml | 2 +- .../layout/fragment_room_rank_half_hour.xml | 405 ------------------ .../room/bean/RoomContributeDataInfo.java | 1 + 10 files changed, 24 insertions(+), 808 deletions(-) delete mode 100644 app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankHalfHourFragment.java delete mode 100644 app/src/main/res/layout/fragment_room_rank_half_hour.xml diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 35efc52b0..796743a1a 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -1468,11 +1468,8 @@ public class HomePartyRoomFragment extends BaseMvpFragment fragments = new ArrayList<>(2); fragments.add(RoomCharmRankingListFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_DAY_RANKING)); fragments.add(RoomCharmRankingListFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_WEEK_RANKING)); -// fragments.add(RoomCharmRankingListFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_TOTAL_RANKING)); + if (AvRoomDataManager.get().isDatingMode()) { + fragments.add(RoomCharmRankingListFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_MONTH_RANKING)); + } mBinding.vpCharmRankings.setAdapter(new RoomContributeListAdapter(getChildFragmentManager(), fragments)); CommonNavigator commonNavigator = new CommonNavigator(getActivity()); - commonNavigator.setAdjustMode(true); + commonNavigator.setAdjustMode(false); RankNavigatorAdapter indicator = new RankNavigatorAdapter(); - indicator.setOnItemSelectListener(new RankNavigatorAdapter.OnItemSelectListener() { - @Override - public void onItemSelect(int position) { - mBinding.vpCharmRankings.setCurrentItem(position); - } - }); + indicator.setOnItemSelectListener(position -> mBinding.vpCharmRankings.setCurrentItem(position)); commonNavigator.setAdapter(indicator); mBinding.viewIndicator.setNavigator(commonNavigator); ViewPagerHelper.bind(mBinding.viewIndicator, mBinding.vpCharmRankings); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomContributeListFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomContributeListFragment.java index 830f58073..0e5d65c28 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomContributeListFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomContributeListFragment.java @@ -10,6 +10,7 @@ import com.yizhuan.erban.base.BaseMvpFragment; import com.yizhuan.erban.ui.widget.magicindicator.MagicIndicator; import com.yizhuan.erban.ui.widget.magicindicator.ViewPagerHelper; import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator; +import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.room.bean.RoomContributeDataInfo; import com.yizhuan.xchat_android_library.base.IMvpBaseView; @@ -39,19 +40,14 @@ public class RoomContributeListFragment extends BaseMvpFragment implements IMvpB ArrayList fragments = new ArrayList<>(2); fragments.add(RoomContributeFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_DAY_RANKING)); fragments.add(RoomContributeFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_WEEK_RANKING)); -// fragments.add(RoomContributeFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_TOTAL_RANKING)); + if (AvRoomDataManager.get().isDatingMode()) { + fragments.add(RoomContributeFragment.newInstance(RoomContributeDataInfo.TYPE_ROOM_MONTH_RANKING)); + } viewPager.setAdapter(new RoomContributeListAdapter(getChildFragmentManager(), fragments)); - CommonNavigator commonNavigator = new CommonNavigator(getActivity()); - commonNavigator.setAdjustMode(true); - + commonNavigator.setAdjustMode(false); RankNavigatorAdapter indicator = new RankNavigatorAdapter(); - indicator.setOnItemSelectListener(new RankNavigatorAdapter.OnItemSelectListener() { - @Override - public void onItemSelect(int position) { - viewPager.setCurrentItem(position); - } - }); + indicator.setOnItemSelectListener(position -> viewPager.setCurrentItem(position)); commonNavigator.setAdapter(indicator); viewIndicator.setNavigator(commonNavigator); ViewPagerHelper.bind(viewIndicator, viewPager); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankDialogFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankDialogFragment.java index 9dae10c0a..cdd9e25de 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankDialogFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankDialogFragment.java @@ -25,24 +25,14 @@ public class RoomRankDialogFragment extends AppCompatDialogFragment implements I private ViewPager mViewPager; - private long roomOwnerUid;// 房主Uid - public static RoomRankDialogFragment newInstance(long roomOwnerUid) { + public static RoomRankDialogFragment newInstance() { Bundle args = new Bundle(); - args.putLong("room_owner_uid", roomOwnerUid); RoomRankDialogFragment fragment = new RoomRankDialogFragment(); fragment.setArguments(args); return fragment; } - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (getArguments() != null) { - roomOwnerUid = getArguments().getLong("room_owner_uid"); - } - } - @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -80,17 +70,10 @@ public class RoomRankDialogFragment extends AppCompatDialogFragment implements I if (getChildFragmentManager().getFragments() != null && getChildFragmentManager().getFragments().size() != 0) { fragmentList = getChildFragmentManager().getFragments(); } else { - //隐藏半小时榜 -// RoomRankHalfHourFragment halfHourFragment = RoomRankHalfHourFragment.newInstance(roomOwnerUid); -// halfHourFragment.setDismissListener(this); -// halfHourFragment.setChangePageListener(this); -// fragmentList.add(halfHourFragment); - RoomRankListFragment roomInsideFragment = RoomRankListFragment.newInstance(); roomInsideFragment.setDismissListener(this); roomInsideFragment.setChangePageListener(this); fragmentList.add(roomInsideFragment); - } mViewPager.setAdapter(new RoomRankFragmentPageAdapter(getChildFragmentManager(), fragmentList)); mViewPager.setOffscreenPageLimit(fragmentList.size()); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankHalfHourFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankHalfHourFragment.java deleted file mode 100644 index f10aba3bb..000000000 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/RoomRankHalfHourFragment.java +++ /dev/null @@ -1,359 +0,0 @@ -package com.yizhuan.erban.avroom.fragment; - -import android.content.Context; -import android.os.Bundle; -import androidx.core.widget.NestedScrollView; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.netease.nim.uikit.common.util.sys.NetworkUtil; -import com.scwang.smartrefresh.layout.SmartRefreshLayout; -import com.yizhuan.erban.R; -import com.yizhuan.erban.UIHelper; -import com.yizhuan.erban.avroom.adapter.RoomRankHalfHourListAdapter; -import com.yizhuan.erban.avroom.presenter.RoomRankHalfHourPresenter; -import com.yizhuan.erban.base.BaseMvpFragment; -import com.yizhuan.erban.common.widget.CircleImageView; -import com.yizhuan.erban.ui.utils.ImageLoadUtils; -import com.yizhuan.xchat_android_core.room.bean.RoomRankHalfHourMeInfo; -import com.yizhuan.xchat_android_core.room.bean.RoomRankHalfHourRankInfo; -import com.yizhuan.xchat_android_core.room.bean.RoomRankMultiItem; -import com.yizhuan.xchat_android_library.base.factory.CreatePresenter; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -@CreatePresenter(RoomRankHalfHourPresenter.class) -public class RoomRankHalfHourFragment extends BaseMvpFragment - implements IRoomRankHalfHourView, View.OnClickListener { - - @BindView(R.id.tv_room_rank_half_hour_tab) - TextView mHalfHourTab; - @BindView(R.id.tv_room_rank_in_room_tab) - TextView mInsideRoomTab; - - @BindView(R.id.layout_room_rank_mine_info) - LinearLayout mMineInfoLayout; - @BindView(R.id.tv_room_rank_mine_ranking) - TextView mMineRanking; - @BindView(R.id.iv_number) - ImageView ivNumber; - @BindView(R.id.iv_room_rank_mine_avatar) - CircleImageView mMineAvatar; - - @BindView(R.id.tv_room_rank_mine_title) - TextView mMineTitle; - @BindView(R.id.tv_room_id) - TextView tvRoomId; - - @BindView(R.id.ll_number_one) - LinearLayout llNumberOne; - - @BindView(R.id.ll_to_last) - LinearLayout llToLast; - @BindView(R.id.tv_to_last) - TextView tvToLast; - @BindView(R.id.tv_label_to) - TextView tvLabelTo; - - @BindView(R.id.layout_room_rank_top_2) - RelativeLayout mTop2Layout; - @BindView(R.id.iv_room_rank_top_2_avatar_default) - ImageView mTop2AvatarDF;// 无数据时才显示 - @BindView(R.id.iv_room_rank_top_2_avatar) - CircleImageView mTop2Avatar;// 有数据时才显示 - @BindView(R.id.tv_number_two_id) - TextView mTop2Id; - @BindView(R.id.tv_two_to_last) - TextView mTop2Value; - @BindView(R.id.tv_label_number_two) - TextView mTop2Name; - - @BindView(R.id.layout_room_rank_top_1) - RelativeLayout mTop1Layout; - @BindView(R.id.iv_room_rank_top_1_avatar_default) - ImageView mTop1AvatarDF;// 无数据时才显示 - @BindView(R.id.iv_room_rank_top_1_avatar) - CircleImageView mTop1Avatar;// 有数据时才显示 - @BindView(R.id.tv_rank_half_one) - TextView tvRankHalfOne; - @BindView(R.id.tv_label_number_one) - TextView mTop1Name; - @BindView(R.id.tv_number_one_id) - TextView mTop1Id; - - @BindView(R.id.layout_room_rank_top_3) - RelativeLayout mTop3Layout; - @BindView(R.id.iv_room_rank_top_3_avatar_default) - ImageView mTop3AvatarDF;// 无数据时才显示 - @BindView(R.id.iv_room_rank_top_3_avatar) - CircleImageView mTop3Avatar;// 有数据时才显示 - @BindView(R.id.tv_number_three_id) - TextView mTop3Id; - @BindView(R.id.tv_three_to_last) - TextView mTop3Value; - @BindView(R.id.tv_label_number_three) - TextView mTop3Name; - - @BindView(R.id.recycler_room_rank_list) - RecyclerView mRoomRankRecycler; - @BindView(R.id.refresh_layout) - SmartRefreshLayout mRefreshLayout; - @BindView(R.id.nsv_rank_half) - NestedScrollView nestedScrollView; - - private RoomRankHalfHourListAdapter mAdapter; - - private IRoomRankDialogDismissListener dismissListener; - private IRoomRankDialogChangePageListener changePageListener; - - private long roomOwnerUid;// 房主Uid - - public static RoomRankHalfHourFragment newInstance(long roomOwnerUid) { - - Bundle args = new Bundle(); - args.putLong("room_owner_uid", roomOwnerUid); - RoomRankHalfHourFragment fragment = new RoomRankHalfHourFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (getArguments() != null) { - roomOwnerUid = getArguments().getLong("room_owner_uid"); - } - } - - @Override - public int getRootLayoutId() { - return R.layout.fragment_room_rank_half_hour; - } - - @Override - public void onFindViews() { - ButterKnife.bind(this, mView); - } - - @Override - public void onSetListener() { - mHalfHourTab.setOnClickListener(this); - mInsideRoomTab.setOnClickListener(this); - } - - @Override - public void initiate() { - // 列表 - mAdapter = new RoomRankHalfHourListAdapter(mContext); - mRoomRankRecycler.setAdapter(mAdapter); - LinearLayoutManager layoutManager = new LinearLayoutManager(mContext); - layoutManager.setSmoothScrollbarEnabled(true); - mRoomRankRecycler.setLayoutManager(layoutManager); - mRoomRankRecycler.setHasFixedSize(true); - mRoomRankRecycler.setNestedScrollingEnabled(false); - mAdapter.setOnItemClickListener((adapter, view, position) -> { - RoomRankMultiItem roomRankMultiItem = mAdapter.getItem(position); - if (roomRankMultiItem == null) - return; - - if (roomRankMultiItem.getItemType() == RoomRankMultiItem.TYPE_LINEAR) { - RoomRankHalfHourRankInfo item = (RoomRankHalfHourRankInfo) roomRankMultiItem.getData(); - if (item != null && item.getUid() != 0) { - goToUserInfoPage(item.getUid()); - } - - } - }); - // 加载数据 - mRefreshLayout.setEnableRefresh(true); - mRefreshLayout.setOnRefreshListener(refreshlayout -> loadData()); - - mRefreshLayout.autoRefresh(100); - mRefreshLayout.setEnableLoadmore(false); - } - - private void loadData() { - if (!NetworkUtil.isNetAvailable(mContext)) { - showNetworkErr(); - mRefreshLayout.finishRefresh(); - return; - } - showLoading(); - getMvpPresenter().getRankListInfo(); - } - - private void goToUserInfoPage(long userId) { - if (dismissListener != null) { - dismissListener.onDismiss(); - } - UIHelper.showUserInfoAct(mContext, userId);// 个人中心 - } - - @Override - public void showMeInfo(RoomRankHalfHourMeInfo info) { - mRefreshLayout.finishRefresh(); - if (info == null) { - mMineRanking.setVisibility(View.GONE); - ivNumber.setVisibility(View.GONE); - llNumberOne.setVisibility(View.GONE); - llToLast.setVisibility(View.GONE); - mMineTitle.setText(""); - tvRoomId.setText(""); - return; - } - mMineInfoLayout.setOnClickListener(view -> goToUserInfoPage(roomOwnerUid)); - // 头像 - ImageLoadUtils.loadAvatar(mContext, info.getAvatar(), mMineAvatar, true); - // title - mMineTitle.setText(info.getRoomTitle()); - tvRoomId.setText("ID:" + info.getErbanNo()); - tvToLast.setText(RoomRankDialogUtils.getRoomRankValueText(info.getTotalNum())); - // value - // 展示方式不同:排名 + 值 - if (info.getSeqNo() == 0) {// 未上榜 - llNumberOne.setVisibility(View.GONE); - mMineRanking.setVisibility(View.VISIBLE); - llToLast.setVisibility(View.VISIBLE); - tvLabelTo.setText(""); - ivNumber.setVisibility(View.GONE); - } else { - int seqNo = info.getSeqNo(); - boolean isOne = seqNo == 1; - llNumberOne.setVisibility(isOne ? View.VISIBLE : View.GONE); - - if (seqNo >= 2 && seqNo <= 10) - tvLabelTo.setText("距离上一名"); - else if (seqNo > 10 && seqNo <= 20) - tvLabelTo.setText("距离上榜"); - else if (seqNo > 20) - tvLabelTo.setText(""); - - llToLast.setVisibility(isOne ? View.GONE : View.VISIBLE); - - int drawable = RoomRankDialogUtils.getNumberImage(seqNo); - if (drawable != 0) { - ivNumber.setVisibility(View.VISIBLE); - mMineRanking.setVisibility(View.GONE); - ivNumber.setImageResource(drawable); - } else { - ivNumber.setVisibility(View.GONE); - mMineRanking.setVisibility(View.VISIBLE); - } - } - } - - @Override - public void showTop3Info(List dataInfoList) { - if (dataInfoList == null) { - dataInfoList = new ArrayList<>(); - } - for (int i = 0; i < dataInfoList.size(); i++) { - RoomRankHalfHourRankInfo rankInfo = dataInfoList.get(i); - if (rankInfo == null) { - return; - } - if (i == 0) { - ImageLoadUtils.loadAvatar(mContext, rankInfo.getAvatar(), mTop1Avatar, true);// 头像 - mTop1Id.setText("ID:" + rankInfo.getErbanNo()); - mTop1Name.setText(rankInfo.getRoomTitle()); - mTop1AvatarDF.setImageResource(R.drawable.icon_consume_first); - tvRankHalfOne.setVisibility(View.VISIBLE); - mTop1Layout.setOnClickListener(view -> goToUserInfoPage(rankInfo.getUid())); - } - if (i == 1) { - ImageLoadUtils.loadAvatar(mContext, rankInfo.getAvatar(), mTop2Avatar, true);// 头像 - mTop2Id.setText("ID:" + rankInfo.getErbanNo()); - mTop2Value.setText("距前一名 " + RoomRankDialogUtils.getRoomRankValueText(rankInfo.getTotalNum()));// 经验值 - mTop2Name.setText(rankInfo.getRoomTitle()); - mTop2AvatarDF.setImageResource(R.drawable.icon_consume_second); - mTop2Layout.setOnClickListener(view -> goToUserInfoPage(rankInfo.getUid())); - } - if (i == 2) { - ImageLoadUtils.loadAvatar(mContext, rankInfo.getAvatar(), mTop3Avatar, true);// 头像 - mTop3Id.setText("ID:" + rankInfo.getErbanNo()); - mTop3Value.setText("距前一名 " + RoomRankDialogUtils.getRoomRankValueText(rankInfo.getTotalNum()));// 经验值 - mTop3Name.setText(rankInfo.getRoomTitle()); - mTop3AvatarDF.setImageResource(R.drawable.icon_consume_third); - mTop3Layout.setOnClickListener(view -> goToUserInfoPage(rankInfo.getUid())); - } - } - switch (dataInfoList.size()) { - case 0: - mTop1AvatarDF.setImageResource(R.drawable.icon_consume_first_empty); - mTop1Avatar.setVisibility(View.GONE); - tvRankHalfOne.setVisibility(View.GONE); - mTop1Id.setText(""); - - case 1: - mTop2AvatarDF.setImageResource(R.drawable.icon_consume_second_empty); - mTop2Avatar.setVisibility(View.GONE); - mTop2Id.setText(""); - mTop2Value.setText(""); - - case 2: - mTop3AvatarDF.setImageResource(R.drawable.icon_consume_third_empty); - mTop3Avatar.setVisibility(View.GONE); - mTop3Id.setText(""); - mTop3Value.setText(""); - break; - } - } - - @Override - public void showRankListInfo(List dataList) { - if (dataList == null) { - dataList = new ArrayList<>(); - } - mAdapter.replaceData(dataList); - if (dataList.size() > 0) { - mRoomRankRecycler.setVisibility(View.VISIBLE); - nestedScrollView.scrollTo(0, 0); - } else { - mRoomRankRecycler.setVisibility(View.GONE); - } - } - - @Override - public void loadDataFailure() { - mRefreshLayout.finishRefresh(); - showMeInfo(null/*, 0, ""*/); - showTop3Info(null); - showRankListInfo(null); - } - - @Override - public void onClick(View view) { - int id = view.getId(); - if (id == R.id.tv_room_rank_half_hour_tab) {// 半小时榜 - goToChangePage(0); - } else if (id == R.id.tv_room_rank_in_room_tab) {// 房内榜 - goToChangePage(1); - } - } - - /** - * 修改最外层Dialog的显示页面 - */ - private void goToChangePage(int pos) { - if (changePageListener != null) { - changePageListener.onChangePage(pos); - } - } - - public void setDismissListener(IRoomRankDialogDismissListener dismissListener) { - this.dismissListener = dismissListener; - } - - public void setChangePageListener(IRoomRankDialogChangePageListener changePageListener) { - this.changePageListener = changePageListener; - } -} diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/RankNavigatorAdapter.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/RankNavigatorAdapter.java index d668be31d..4bd84a472 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/RankNavigatorAdapter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/RankNavigatorAdapter.java @@ -2,7 +2,9 @@ package com.yizhuan.erban.avroom.widget; import android.content.Context; import android.graphics.Color; + import androidx.core.content.ContextCompat; + import android.view.ViewGroup; import android.widget.FrameLayout; @@ -13,6 +15,7 @@ import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.C import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView; import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator; +import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import java.util.ArrayList; import java.util.List; @@ -29,7 +32,9 @@ public class RankNavigatorAdapter extends CommonNavigatorAdapter { public RankNavigatorAdapter() { mTitleList.add("日榜"); mTitleList.add("周榜"); -// mTitleList.add("总榜"); + if (AvRoomDataManager.get().isDatingMode()) { + mTitleList.add("月榜"); + } } @Override diff --git a/app/src/main/res/layout/fragment_room_charm_list.xml b/app/src/main/res/layout/fragment_room_charm_list.xml index 30358eb9b..e990286a2 100644 --- a/app/src/main/res/layout/fragment_room_charm_list.xml +++ b/app/src/main/res/layout/fragment_room_charm_list.xml @@ -16,7 +16,7 @@ diff --git a/app/src/main/res/layout/fragment_room_contribute.xml b/app/src/main/res/layout/fragment_room_contribute.xml index 119ae1ba9..b0355ac1e 100644 --- a/app/src/main/res/layout/fragment_room_contribute.xml +++ b/app/src/main/res/layout/fragment_room_contribute.xml @@ -12,7 +12,7 @@ diff --git a/app/src/main/res/layout/fragment_room_rank_half_hour.xml b/app/src/main/res/layout/fragment_room_rank_half_hour.xml deleted file mode 100644 index 0b32c2e2d..000000000 --- a/app/src/main/res/layout/fragment_room_rank_half_hour.xml +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomContributeDataInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomContributeDataInfo.java index 7727c6436..537fdd85a 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomContributeDataInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/bean/RoomContributeDataInfo.java @@ -13,6 +13,7 @@ public class RoomContributeDataInfo implements Parcelable { public static final String TYPE_ROOM_TOTAL_RANKING = "total"; public static final String TYPE_ROOM_WEEK_RANKING = "week"; + public static final String TYPE_ROOM_MONTH_RANKING = "month"; public static final String TYPE_ROOM_DAY_RANKING = "day"; private RoomContributeRoomInfo room; From 86d39df0c9feecf151b2a5638a18ef754cf3e820 Mon Sep 17 00:00:00 2001 From: huangjian Date: Fri, 26 Feb 2021 16:23:30 +0800 Subject: [PATCH 46/49] =?UTF-8?q?1.=E6=8E=92=E9=BA=A6=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E4=BC=98=E5=8C=96=202.=E7=BA=A2=E5=8C=85=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=BE=E5=85=A5=E6=88=BF=E9=97=B4=E6=9B=B4=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/dialog/RoomOperationDialog.java | 35 ++++++++++++++---- .../fragment/HomePartyRoomFragment.java | 24 +++++++++++- .../erban/avroom/widget/BottomView.java | 16 ++++++-- .../ic_dating_queuing_micro.png | Bin 0 -> 10716 bytes .../drawable-xhdpi/ic_pk_queuing_micro.png | Bin 0 -> 12986 bytes .../ic_room_opt_red_package.png | Bin 0 -> 6438 bytes .../main/res/layout/item_room_opt_dialog.xml | 4 +- .../res/layout/fragment_av_room_game.xml | 23 ++++++++++-- 8 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_dating_queuing_micro.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_pk_queuing_micro.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_room_opt_red_package.png diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java index ede797abf..d9991fffc 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/RoomOperationDialog.java @@ -20,8 +20,6 @@ import android.view.WindowManager; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; -import com.netease.nim.uikit.common.util.log.LogUtil; -import com.yizhuan.xchat_android_core.redpackage.RedPackageModel; import com.yizhuan.erban.R; import com.yizhuan.erban.module_hall.HallDataManager; import com.yizhuan.erban.ui.widget.marqueeview.Utils; @@ -85,10 +83,11 @@ public class RoomOperationDialog extends BottomSheetDialog { Utils.dip2px(getContext(), 10), Utils.dip2px(getContext(), 20), true)); - rvOPtList.setLayoutManager(new FullyGridLayoutManager(getContext(), 4)); + rvOPtList.setLayoutManager(new FullyGridLayoutManager(getContext(), 5)); optAdapter = new OptAdapter(context, null); addPKAction(optAdapter); addDatingAction(optAdapter); + addRedPacketAction(optAdapter); addKTVAction(optAdapter); //addGameAction(optAdapter); addRoomLimit(optAdapter); @@ -143,10 +142,10 @@ public class RoomOperationDialog extends BottomSheetDialog { R.drawable.ic_room_opt_op_pk : R.drawable.ic_room_opt_in_pk; optAdapter.addData(new OptAction(icon, str, () -> { - if (onActionListener != null) { - onActionListener.onPKAction(); - } - })); + if (onActionListener != null) { + onActionListener.onPKAction(); + } + })); } } @@ -181,6 +180,26 @@ public class RoomOperationDialog extends BottomSheetDialog { } + /** + * 相亲 模式 + * + * @param optAdapter + */ + private void addRedPacketAction(OptAdapter optAdapter) { + if (AvRoomDataManager.get().isRedEnvelopeOpen()) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return; + } + optAdapter.addData(new OptAction(R.drawable.ic_room_opt_red_package, "红包", () -> { + if (onActionListener != null) { + onActionListener.onRedPackageAction(); + } + })); + } + + } + /** * 添加KTV 操作 * @@ -480,6 +499,8 @@ public class RoomOperationDialog extends BottomSheetDialog { void onDatingAction(); + void onRedPackageAction(); + void onGameAction(); void onRoomHall(); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index 796743a1a..04b91ca24 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -286,6 +286,8 @@ public class HomePartyRoomFragment extends BaseMvpFragment getMvpPresenter().datingOpen()); } + @Override + public void onRedPackageAction() { + redPackageSendDialog = new RedPackageSendDialog(); + redPackageSendDialog.show(getActivity()); + StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_SENDHONGBAO_CLICK, + "进入发红包页面"); + } + @Override public void onRoomHall() { StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_MY_HALL_CLICK, "厅管理入口"); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/BottomView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/BottomView.java index 14bd1576f..cef488d81 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/BottomView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/BottomView.java @@ -15,6 +15,7 @@ import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMMessageManager; import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; +import com.yizhuan.xchat_android_core.room.bean.RoomModeType; import com.yizhuan.xchat_android_core.room.pk.model.PkModel; import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil; import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; @@ -208,14 +209,22 @@ public class BottomView extends RelativeLayout implements View.OnClickListener { micLayout.setVisibility(GONE); } + /** + * PK模式、相亲模式的管理员,排麦模式的所有人,展示排麦按钮 + * PK模式、相亲模式的普通用户入口展示在BottomView右上方 + */ + public void updateQueuingMicButton() { if (SuperAdminUtil.isSuperAdmin()) { iconMicQueue.setVisibility(GONE); return; } - //排麦模式或PK模式展示排麦麦按钮 - iconMicQueue.setVisibility((AvRoomDataManager.get().isQueuingMicro() || AvRoomDataManager.get().isOpenPKMode()) && - !AvRoomDataManager.get().isCpRoom()? VISIBLE : GONE); + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + boolean show = (AvRoomDataManager.get().isQueuingMicro() || AvRoomDataManager.get().isOpenPKMode()) && + !AvRoomDataManager.get().isCpRoom() && + (AvRoomDataManager.get().isManager() || roomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE); + iconMicQueue.setVisibility(show ? VISIBLE : GONE); } public void setQueuingMicButtonBackground(boolean isEmpty) { @@ -299,6 +308,7 @@ public class BottomView extends RelativeLayout implements View.OnClickListener { // } // break; case R.id.icon_mic_queue: + case R.id.iv_queuing_micro://注意这里是在HomePartyRoomFragment调用的 if (wrapper != null) { wrapper.onMicQueueClick(); } diff --git a/app/src/main/res/drawable-xhdpi/ic_dating_queuing_micro.png b/app/src/main/res/drawable-xhdpi/ic_dating_queuing_micro.png new file mode 100644 index 0000000000000000000000000000000000000000..07bb7d7305cf90608e10a68570e36d56dcbd3100 GIT binary patch literal 10716 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 O0000VNf$DE5Ympn?UYNfV^^Kp>Hp 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_room_opt_red_package.png b/app/src/main/res/drawable-xhdpi/ic_room_opt_red_package.png new file mode 100644 index 0000000000000000000000000000000000000000..223ebbdd67128396e3ff6a787ba9e7600e4d5c4e GIT binary patch literal 6438 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 A5C8xG literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/item_room_opt_dialog.xml b/app/src/main/res/layout/item_room_opt_dialog.xml index 84e21900d..05d5c5d51 100644 --- a/app/src/main/res/layout/item_room_opt_dialog.xml +++ b/app/src/main/res/layout/item_room_opt_dialog.xml @@ -8,8 +8,8 @@ diff --git a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml index 510b5bef0..dc13b263f 100644 --- a/app/src/module_mini_world/res/layout/fragment_av_room_game.xml +++ b/app/src/module_mini_world/res/layout/fragment_av_room_game.xml @@ -291,15 +291,30 @@ + + + android:src="@drawable/ic_dating_queuing_micro" + android:visibility="gone" + tools:contentDescription="我要参加" /> + Date: Sat, 27 Feb 2021 15:24:13 +0800 Subject: [PATCH 47/49] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0H5=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yizhuan/erban/MainActivity.java | 7 +++- .../ui/webview/CommonWebViewActivity.java | 1 + .../yizhuan/xchat_android_core/Constants.java | 2 +- .../pay/PaymentActivity.java | 37 ++++++++++++++++- .../pay/bean/ShowCommonWebEvent.java | 17 ++++++++ .../pay/bean/alipay/AlipayInfo.java | 10 +++++ .../pay/model/alipay/AliPayModel.java | 41 ++++--------------- .../pay/model/alipay/IAliPayModel.java | 6 ++- 8 files changed, 84 insertions(+), 37 deletions(-) create mode 100644 core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/ShowCommonWebEvent.java create mode 100644 core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/alipay/AlipayInfo.java diff --git a/app/src/main/java/com/yizhuan/erban/MainActivity.java b/app/src/main/java/com/yizhuan/erban/MainActivity.java index 17bb28262..07c508a64 100644 --- a/app/src/main/java/com/yizhuan/erban/MainActivity.java +++ b/app/src/main/java/com/yizhuan/erban/MainActivity.java @@ -155,6 +155,7 @@ import com.yizhuan.xchat_android_core.miniworld.bean.OpenAudioPartyAttachment; import com.yizhuan.xchat_android_core.patriarch.event.CloseMinRoomEvent; import com.yizhuan.xchat_android_core.patriarch.event.ImPushMsgPmLimitTimeEvent; import com.yizhuan.xchat_android_core.patriarch.event.PmDismissAllLimitDialogEvent; +import com.yizhuan.xchat_android_core.pay.bean.ShowCommonWebEvent; import com.yizhuan.xchat_android_core.public_chat_hall.attachment.AitMeAttachment; import com.yizhuan.xchat_android_core.recall.bean.CheckLostUserInfo; import com.yizhuan.xchat_android_core.recall.event.CheckLostUserEvent; @@ -276,7 +277,7 @@ public class MainActivity extends BaseMvpActivity @Override public void onError(Throwable e) { onNeedLogin(); - toast(e.getMessage()); + //toast(e.getMessage()); } }); @@ -1146,6 +1147,10 @@ public class MainActivity extends BaseMvpActivity checkBindPhone(); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onShowCommonWebEvent(ShowCommonWebEvent event) { + CommonWebViewActivity.start(event.getContext(), event.getUrl()); + } @Override public void onClick(View v) { diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java index 5c0b0d218..e12bd05aa 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java +++ b/app/src/main/java/com/yizhuan/erban/ui/webview/CommonWebViewActivity.java @@ -207,6 +207,7 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O mHandler.post(mProgressRunnable); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setUseWideViewPort(true); + webView.getSettings().setLoadWithOverviewMode(true); // 设置 WebView 可以在 HTTPS 通道上加载 HTTP 资源,Android 4.4 后的暗坑 // 因为 Android 4.4 后默认不允许在 HTTPS 通道上加载 HTTP 资源 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java b/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java index 1891b4cd0..1f9babd33 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/Constants.java @@ -59,7 +59,7 @@ public class Constants { public static final String CHARGE_WX = "wx"; - public static final String CHARGE_ALIPAY = "alipay"; + public static final String CHARGE_ALIPAY = "alipay_v2"; public static final String CHARGE_UNION_PAY = "fastpay"; public static final String CHARGE_WX_MP = "wx_mp"; diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/PaymentActivity.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/PaymentActivity.java index a9431e560..8e68ceb35 100644 --- a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/PaymentActivity.java +++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/PaymentActivity.java @@ -4,9 +4,10 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.os.Bundle; + import androidx.annotation.Nullable; -import com.alipay.sdk.app.EnvUtils; +import com.alipay.sdk.app.PayTask; import com.tencent.mm.opensdk.constants.Build; import com.tencent.mm.opensdk.constants.ConstantsAPI; import com.tencent.mm.opensdk.modelbase.BaseReq; @@ -25,9 +26,11 @@ import com.yizhuan.xchat_android_core.exception.NullDataException; import com.yizhuan.xchat_android_core.pay.bean.NotRealNameYetException; import com.yizhuan.xchat_android_core.pay.bean.PaymentResult; import com.yizhuan.xchat_android_core.pay.bean.PmChargeLimitException; +import com.yizhuan.xchat_android_core.pay.bean.ShowCommonWebEvent; import com.yizhuan.xchat_android_core.pay.bean.WxPayType; import com.yizhuan.xchat_android_core.pay.bean.alipay.AliPayResponseResult; import com.yizhuan.xchat_android_core.pay.bean.alipay.AliPayResult; +import com.yizhuan.xchat_android_core.pay.bean.alipay.AlipayInfo; import com.yizhuan.xchat_android_core.pay.bean.unionpay.UnionPayOrder; import com.yizhuan.xchat_android_core.pay.bean.wechatpay.WeChatAppParam; import com.yizhuan.xchat_android_core.pay.model.alipay.AliPayModel; @@ -38,7 +41,10 @@ import com.yizhuan.xchat_android_core.utils.net.RxHelper; import com.yizhuan.xchat_android_library.utils.ListUtils; import com.yizhuan.xchat_android_library.utils.SingleToastUtil; +import org.greenrobot.eventbus.EventBus; + import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.TimeZone; @@ -331,6 +337,35 @@ public class PaymentActivity extends Activity public void requestAliPay(Activity context, String chargeProdId) { AliPayModel.get() .requestAliPay(context, chargeProdId) + .flatMap(jsonObjectServiceResult -> { + if (jsonObjectServiceResult == null) return Single.error(new Throwable()); + if (jsonObjectServiceResult.isSuccess()) { + AlipayInfo alipayInfo = jsonObjectServiceResult.getData(); + if ("native".equals(alipayInfo.getPayType())) { + // 收到订单号之后,发起支付 + PayTask alipay = new PayTask(context); + Map result = alipay.payV2(alipayInfo.getOrderData(), true); + return Single.just(result); + } else if ("h5".equals(alipayInfo.getPayType())) { + EventBus.getDefault().post(new ShowCommonWebEvent(this,alipayInfo.getOrderData())); + return Single.error(new Throwable()); + } else { + return Single.error(new Throwable()); + } + } else { + if (jsonObjectServiceResult.getCode() == PayModel.NOT_REAL_NAME_BEFORE_CHARGING) { + return Single.error(new NotRealNameYetException( + jsonObjectServiceResult.getMessage(), + jsonObjectServiceResult.getCode())); + } else if (jsonObjectServiceResult.getCode() == PmChargeLimitException.ERROR_CODE) { + return Single.error(new PmChargeLimitException( + RxHelper.getValidMessage(jsonObjectServiceResult), + jsonObjectServiceResult.getCode())); + } else { + return Single.error(new Throwable(jsonObjectServiceResult.getMessage())); + } + } + }) .subscribe((stringStringMap, throwable) -> { if (throwable == null) { AliPayResult aliPayResult = new AliPayResult(stringStringMap); diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/ShowCommonWebEvent.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/ShowCommonWebEvent.java new file mode 100644 index 000000000..b08ba61ca --- /dev/null +++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/ShowCommonWebEvent.java @@ -0,0 +1,17 @@ +package com.yizhuan.xchat_android_core.pay.bean; + +import android.content.Context; + +import lombok.Data; + +@Data +public class ShowCommonWebEvent { + + public ShowCommonWebEvent(Context context, String url) { + this.context = context; + this.url = url; + } + + private Context context; + private String url; +} diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/alipay/AlipayInfo.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/alipay/AlipayInfo.java new file mode 100644 index 000000000..b890f80a5 --- /dev/null +++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/bean/alipay/AlipayInfo.java @@ -0,0 +1,10 @@ +package com.yizhuan.xchat_android_core.pay.bean.alipay; + +import lombok.Data; + +@Data +public class AlipayInfo { + + private String payType; + private String orderData; +} diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java index 92d2d8d48..438c647f6 100644 --- a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java +++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/AliPayModel.java @@ -12,6 +12,7 @@ import com.yizhuan.xchat_android_core.exception.NullDataException; import com.yizhuan.xchat_android_core.pay.PayModel; import com.yizhuan.xchat_android_core.pay.bean.NotRealNameYetException; import com.yizhuan.xchat_android_core.pay.bean.PmChargeLimitException; +import com.yizhuan.xchat_android_core.pay.bean.alipay.AlipayInfo; import com.yizhuan.xchat_android_core.utils.net.RxHelper; import com.yizhuan.xchat_android_library.net.rxnet.RxNet; import com.yizhuan.xchat_android_library.utils.LogUtil; @@ -48,39 +49,15 @@ public class AliPayModel extends BaseModel implements IAliPayModel { * @return */ @Override - public Single> requestAliPay(Activity context, String chargeProdId) { + public Single> requestAliPay(Activity context, String chargeProdId) { return api.requestAilPayOrder( String.valueOf(AuthModel.get().getCurrentUid()), chargeProdId, Constants.CHARGE_ALIPAY, NetworkUtils.getIPAddress(context), - AuthModel.get().getTicket() - ) - .flatMap(jsonObjectServiceResult -> { - if (jsonObjectServiceResult == null) return Single.error(new Throwable()); - if (jsonObjectServiceResult.isSuccess()) { - String data = jsonObjectServiceResult.getData(); - if (TextUtils.isEmpty(data)) return Single.error(new NullDataException()); - // 收到订单号之后,发起支付 - PayTask alipay = new PayTask(context); - Map result = alipay.payV2(data, true); - // LogUtil.print(Arrays.toString(result.entrySet().toArray())); - return Single.just(result); - } else { - if (jsonObjectServiceResult.getCode() == PayModel.NOT_REAL_NAME_BEFORE_CHARGING) { - return Single.error(new NotRealNameYetException( - jsonObjectServiceResult.getMessage(), - jsonObjectServiceResult.getCode())); - } else if (jsonObjectServiceResult.getCode() == PmChargeLimitException.ERROR_CODE) { - return Single.error(new PmChargeLimitException( - RxHelper.getValidMessage(jsonObjectServiceResult), - jsonObjectServiceResult.getCode())); - } else { - return Single.error(new Throwable(jsonObjectServiceResult.getMessage())); - } - } - }) + AuthModel.get().getTicket()) .compose(RxHelper.handleSchedulers()); + } interface Api { @@ -95,11 +72,11 @@ public class AliPayModel extends BaseModel implements IAliPayModel { * @return */ @POST("/charge/pay/apply") - Single> requestAilPayOrder(@Query("uid") String uid, - @Query("chargeProdId") String chargeProdId, - @Query("payChannel") String payChannel, - @Query("clientIp") String clientIp, - @Query("ticket") String ticket); + Single> requestAilPayOrder(@Query("uid") String uid, + @Query("chargeProdId") String chargeProdId, + @Query("payChannel") String payChannel, + @Query("clientIp") String clientIp, + @Query("ticket") String ticket); } } diff --git a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/IAliPayModel.java b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/IAliPayModel.java index f25dbbd72..b1ab6faef 100644 --- a/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/IAliPayModel.java +++ b/core/src/model_pay/java/com/yizhuan/xchat_android_core/pay/model/alipay/IAliPayModel.java @@ -3,6 +3,8 @@ package com.yizhuan.xchat_android_core.pay.model.alipay; import android.app.Activity; import com.yizhuan.xchat_android_core.base.IModel; +import com.yizhuan.xchat_android_core.bean.response.ServiceResult; +import com.yizhuan.xchat_android_core.pay.bean.alipay.AlipayInfo; import java.util.Map; @@ -11,11 +13,11 @@ import io.reactivex.Single; public interface IAliPayModel extends IModel { /** - * 支付宝充值,通过此接口获取订单号并发起支付 + * 支付宝充值,通过此接口获取订单号 * * @param context * @param chargeProdId * @return */ - public Single> requestAliPay(Activity context, String chargeProdId); + public Single> requestAliPay(Activity context, String chargeProdId); } From 05251bf7844251c39ee8849ffb946ac96d60b224 Mon Sep 17 00:00:00 2001 From: huangjian Date: Sat, 27 Feb 2021 18:37:51 +0800 Subject: [PATCH 48/49] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A6=8F=E8=A2=8B?= =?UTF-8?q?=E6=88=BF=E9=97=B4=E9=A3=98=E5=B1=8F=E4=B8=8D=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/activity/AVRoomActivity.java | 15 +++++++++++++++ .../erban/avroom/widget/RoomEffectView.java | 3 ++- .../manager/IMNetEaseManager.java | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java index 9d7c6b946..36320b2d6 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java @@ -31,7 +31,9 @@ import com.netease.nim.uikit.StatusBarUtil; import com.netease.nim.uikit.common.util.log.LogUtil; import com.netease.nimlib.sdk.NIMSDK; import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; import com.netease.nimlib.sdk.msg.model.BroadcastMessage; import com.opensource.svgaplayer.SVGADrawable; import com.opensource.svgaplayer.SVGAImageView; @@ -71,7 +73,9 @@ import com.yizhuan.xchat_android_core.DemoCache; import com.yizhuan.xchat_android_core.auth.AuthModel; import com.yizhuan.xchat_android_core.auth.event.LogoutEvent; import com.yizhuan.xchat_android_core.bean.BaseProtocol; +import com.yizhuan.xchat_android_core.gift.bean.LuckyBagNoticeInfo; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; +import com.yizhuan.xchat_android_core.im.custom.bean.RoomReceivedLuckyGiftAttachment; import com.yizhuan.xchat_android_core.im.game.ImGameMode; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; @@ -129,6 +133,8 @@ import io.reactivex.disposables.Disposable; import static android.view.View.VISIBLE; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ALL_SERVICE_GIFT; import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_LUCKY_GIFT; +import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY; /** @@ -1303,7 +1309,16 @@ public class AVRoomActivity extends BaseMvpActivity binding.flDatingAllNotify.removeView(textView), SHOW_TIME); + binding.flDatingAllNotify.postDelayed(() -> binding.flDatingAllNotify.removeView(textView), 4500); } private String getShortString(String text, int max) { @@ -296,6 +296,7 @@ public class RoomEffectView extends FrameLayout { .append("开出了", new ForegroundColorSpan(Color.WHITE)) .append(noticeInfo.getGiftName(), new ForegroundColorSpan(getResources().getColor(R.color.notice_gift))); textView.setText(text.build()); + binding.flLuckyGiftNotify.addView(textView); animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify); textView.startAnimation(animationLuckyGift); binding.flLuckyGiftNotify.postDelayed(() -> binding.flLuckyGiftNotify.removeView(textView), SHOW_TIME); diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index fc3689b54..332289322 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -3292,7 +3292,7 @@ public final class IMNetEaseManager { .setChatRoomMessage(msg)); } - private void noticeServiceLuckyBagNotice(ChatRoomMessage msg) { + public void noticeServiceLuckyBagNotice(ChatRoomMessage msg) { getChatRoomEventObservable() .onNext(new RoomEvent() .setEvent(RoomEvent.RECEIVE_SERVICE_LUCKY_BAG_NOTICE) From ff06564224d0e76d20c61c0bfcff4d876d160b89 Mon Sep 17 00:00:00 2001 From: huangjian Date: Mon, 1 Mar 2021 14:59:07 +0800 Subject: [PATCH 49/49] =?UTF-8?q?1.=E5=9D=91=E4=BD=8D=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96(=E5=A4=B4=E9=A5=B0?= =?UTF-8?q?=E9=97=AA=E7=83=81=E9=97=AE=E9=A2=98)=202.=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=9C=8B=E4=B8=8D=E5=88=B0=E6=97=A7=E7=89=88=E6=9C=AC=E5=A4=B4?= =?UTF-8?q?=E9=A5=B0=E7=9A=84=E9=97=AE=E9=A2=98(=E7=9B=B8=E4=BA=B2?= =?UTF-8?q?=E4=B9=8B=E5=89=8D=E7=9A=84=E7=89=88=E6=9C=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../avroom/adapter/BaseMicroViewAdapter.java | 37 +++++++++++-------- .../avroom/presenter/AvRoomPresenter.java | 1 + .../room/queue/bean/MicMemberInfo.java | 3 +- 3 files changed, 25 insertions(+), 16 deletions(-) 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 3fe52d8ee..4b08fa241 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 @@ -40,6 +40,7 @@ import com.yizhuan.xchat_android_core.room.queue.bean.MicMemberInfo; import com.yizhuan.xchat_android_core.user.UserModel; import com.yizhuan.xchat_android_core.user.bean.UserInfo; import com.yizhuan.xchat_android_core.utils.ActivityUtil; +import com.yizhuan.xchat_android_core.utils.LogUtils; import com.yizhuan.xchat_android_library.utils.CommonUtils; import com.yizhuan.xchat_android_library.utils.config.BasicConfig; @@ -58,11 +59,10 @@ public abstract class BaseMicroViewAdapter extends RecyclerView.Adapter { JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); if (valueJsonObj != null) { chatRoomMember = mGson.fromJson(valueJsonObj,MicMemberInfo.class); + accounts.add(chatRoomMember.getAccount()); roomQueueInfo.mChatRoomMember = chatRoomMember; } AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.valueOf(entry.key), roomQueueInfo); diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java index ecbdac1de..75623d38f 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/queue/bean/MicMemberInfo.java @@ -6,12 +6,13 @@ import java.util.Map; import java.util.Objects; import lombok.Data; +import lombok.ToString; /** * Created by * on 2017/10/25. */ - +@ToString @Data public class MicMemberInfo { @SerializedName("uid")