From 8bd00eae6ae475b31bb07c8e6576032148cd1ba6 Mon Sep 17 00:00:00 2001 From: eggmanQQQ2 <3671373519@qq.com> Date: Mon, 7 Jul 2025 10:46:13 +0800 Subject: [PATCH] feat : core --- core/.gitignore | 3 + core/build.gradle | 107 + core/proguard-rules.pro | 21 + core/src/main/AndroidManifest.xml | 3 + .../main/java/com/chwl/core/Constants.java | 120 + .../main/java/com/chwl/core/DemoCache.java | 346 ++ .../java/com/chwl/core/OldHttpObserver.java | 49 + .../java/com/chwl/core/PreferencesUtils.java | 113 + .../main/java/com/chwl/core/RegionHelper.kt | 118 + core/src/main/java/com/chwl/core/SdkConfig.kt | 28 + .../main/java/com/chwl/core/UriHelper.java | 74 + .../main/java/com/chwl/core/UriProvider.java | 386 ++ .../main/java/com/chwl/core/XConstants.java | 86 + .../chwl/core/activity/bean/LotteryInfo.java | 46 + .../core/activity/event/ActivityEvent.java | 13 + .../core/activity/model/ActivityModel.java | 6 + .../core/activity/model/IActivityModel.java | 6 + .../core/association/bean/ClanListInfo.kt | 12 + .../core/association/bean/HallListInfo.java | 20 + .../association/bean/MemberExchangeInfo.kt | 20 + .../core/association/bean/UserLevelInfo.kt | 17 + .../association/model/AssociationModel.kt | 68 + .../java/com/chwl/core/audio/AudioModel.java | 159 + .../core/audio/AudioPlayAndRecordManager.java | 118 + .../java/com/chwl/core/audio/IAudioModel.java | 87 + .../core/audio/bean/HistoryVoiceInfo.java | 137 + .../bean/SaveVoiceSuccessResultInfo.java | 110 + .../chwl/core/audio/bean/SysMsgVoiceInfo.java | 13 + .../chwl/core/audio/bean/UserVoiceInfo.java | 109 + .../core/audio/bean/VoiceBottleSayHiInfo.java | 11 + .../chwl/core/audio/bean/VoiceCardInfo.java | 54 + .../chwl/core/audio/bean/VoiceMatchInfo.java | 41 + .../audio/event/VoiceShakeHeartEvent.java | 9 + .../java/com/chwl/core/auth/AuthModel.java | 1334 ++++++ .../java/com/chwl/core/auth/IAuthModel.java | 154 + .../chwl/core/auth/entity/AccountInfo.java | 82 + .../chwl/core/auth/entity/ThirdUserInfo.java | 68 + .../com/chwl/core/auth/entity/TicketInfo.java | 50 + .../chwl/core/auth/event/BindPhoneEvent.java | 11 + .../core/auth/event/GetCurrentUidEvent.java | 14 + .../chwl/core/auth/event/KickOutEvent.java | 7 + .../com/chwl/core/auth/event/LoginEvent.java | 11 + .../core/auth/event/LoginReportEvent.java | 15 + .../com/chwl/core/auth/event/LogoutEvent.java | 8 + .../exception/AccountCancelException.java | 21 + .../auth/exception/BanAccountException.java | 15 + .../auth/exception/BigHeadPhoneException.java | 8 + .../auth/exception/IsSuperAdminException.java | 9 + .../java/com/chwl/core/base/BaseBusEvent.java | 16 + .../com/chwl/core/base/BaseDataEvent.java | 27 + .../com/chwl/core/base/BaseErrorEvent.java | 20 + .../chwl/core/base/BaseErrorException.java | 12 + .../java/com/chwl/core/base/BaseModel.java | 131 + .../core/base/CancelNoToastException.java | 13 + .../main/java/com/chwl/core/base/IModel.java | 4 + .../java/com/chwl/core/bean/BaseProtocol.java | 74 + .../com/chwl/core/bean/CarButtonInfo.java | 10 + .../java/com/chwl/core/bean/EventMyBean.java | 4 + .../com/chwl/core/bean/EventOfficialBean.java | 54 + .../com/chwl/core/bean/EventRoomBean.java | 8 + .../com/chwl/core/bean/EventRoomEntity.java | 8 + .../com/chwl/core/bean/EventSquareBean.java | 4 + .../com/chwl/core/bean/GiftTitleInfo.java | 11 + core/src/main/java/com/chwl/core/bean/I18N.kt | 50 + .../java/com/chwl/core/bean/IRouterData.kt | 20 + .../com/chwl/core/bean/LoginTipsInfo.java | 11 + .../chwl/core/bean/PrivateChatLimitInfo.java | 17 + .../java/com/chwl/core/bean/ProgressInfo.java | 40 + .../java/com/chwl/core/bean/RegionBean.kt | 47 + .../com/chwl/core/bean/RoomHistoryInfo.java | 16 + .../java/com/chwl/core/bean/RoomMicInfo.java | 105 + .../com/chwl/core/bean/RoomNewbieInfo.java | 21 + .../chwl/core/bean/RoomNewbieMessageInfo.java | 69 + .../com/chwl/core/bean/RoomQueueInfo.java | 32 + .../java/com/chwl/core/bean/UserInfoItem.java | 97 + .../java/com/chwl/core/bean/VersionInfo.java | 50 + .../attachmsg/RoomQueueMsgAttachment.java | 71 + .../com/chwl/core/bean/game/GameConfigBean.kt | 12 + .../com/chwl/core/bean/game/GameModeBean.kt | 14 + .../com/chwl/core/bean/game/GameResultBean.kt | 30 + .../com/chwl/core/bean/game/GameRoomData.kt | 26 + .../com/chwl/core/bean/game/GameRoomInfo.kt | 9 + .../chwl/core/bean/game/SudGameConfigBean.kt | 26 + .../com/chwl/core/bean/response/BeanResult.kt | 35 + .../core/bean/response/JsonServiceResult.java | 12 + .../com/chwl/core/bean/response/ListResult.kt | 40 + .../chwl/core/bean/response/RequestError.java | 40 + .../chwl/core/bean/response/ResponseData.java | 156 + .../core/bean/response/ServiceResult.java | 197 + .../response/result/ActionDialogResult.java | 14 + .../response/result/AttentionListResult.java | 13 + .../response/result/AuctionInfoResult.java | 11 + .../result/AuctionListUserInfoResult.java | 13 + .../result/AuctionUserListResult.java | 13 + .../response/result/AuctionUserResult.java | 11 + .../bean/response/result/BoolApiResult.java | 11 + .../bean/response/result/BooleanResult.java | 10 + .../response/result/ChargeListResult.java | 17 + .../response/result/CheckLostUserResult.java | 7 + .../response/result/ExchangeInfoResult.java | 10 + .../bean/response/result/ExchangerInfo.java | 14 + .../core/bean/response/result/FaceResult.java | 11 + .../bean/response/result/FansListResult.java | 11 + .../bean/response/result/GiftInfosResult.java | 11 + .../result/GiftRecieveInfoResult.java | 11 + .../core/bean/response/result/GiftResult.java | 11 + .../response/result/GiftWallListResult.java | 13 + .../bean/response/result/GoBackResult.java | 7 + .../result/IdQueryUserInfoResult.java | 12 + .../core/bean/response/result/InitResult.java | 12 + .../bean/response/result/IntegerResult.java | 10 + .../bean/response/result/LoginResult.java | 46 + .../result/MultiGiftRecieveInfoResult.java | 11 + .../result/RedDrawListInfoResult.java | 13 + .../bean/response/result/RedPacketResult.java | 12 + .../bean/response/result/RegisterResult.java | 12 + .../response/result/RequestChargeResult.java | 12 + .../result/RoomConsumeInfoListResult.java | 13 + .../response/result/RoomRewardResult.java | 12 + .../response/result/ShareRedPacketResult.java | 12 + .../core/bean/response/result/TabResult.java | 16 + .../bean/response/result/TicketResult.java | 12 + .../bean/response/result/UserListResult.java | 14 + .../core/bean/response/result/UserResult.java | 12 + .../bean/response/result/VersionsResult.java | 10 + .../response/result/WalletInfoResult.java | 12 + .../com/chwl/core/bean/room/BaseRoomInfo.kt | 27 + .../com/chwl/core/bean/room/RoomMicBean.kt | 16 + .../chwl/core/bean/room/RoomMicUserInfo.kt | 13 + .../java/com/chwl/core/bills/BillModel.java | 189 + .../java/com/chwl/core/bills/IBillModel.java | 60 + .../com/chwl/core/bills/IRadishGiftModel.java | 14 + .../com/chwl/core/bills/RadishGiftModel.java | 79 + .../chwl/core/bills/bean/BillItemEntity.java | 49 + .../com/chwl/core/bills/bean/BillType.java | 29 + .../com/chwl/core/bills/bean/ExpendInfo.java | 160 + .../chwl/core/bills/bean/ExpendListInfo.java | 30 + .../com/chwl/core/bills/bean/IncomeInfo.java | 169 + .../chwl/core/bills/bean/IncomeListInfo.java | 31 + .../core/bills/bean/NobleBillListInfo.java | 61 + .../chwl/core/bills/bean/RadishGiftInfo.java | 31 + .../core/bills/bean/RadishGiftListInfo.java | 27 + .../core/bills/bean/RadishRecordInfo.java | 20 + .../core/bills/bean/RadishRecordListInfo.java | 27 + .../com/chwl/core/bills/bean/RedBagInfo.java | 75 + .../chwl/core/bills/bean/RedBagListInfo.java | 30 + .../com/chwl/core/bills/bean/TextInfos.java | 34 + .../com/chwl/core/bills/bean/TimeInfo.java | 23 + .../chwl/core/bills/result/ChargeResult.java | 11 + .../chwl/core/bills/result/ExpendResult.java | 11 + .../chwl/core/bills/result/IncomedResult.java | 11 + .../core/bills/result/RadishGiftResult.java | 7 + .../chwl/core/bills/result/RedBagResult.java | 11 + .../certification/CertificationModel.java | 77 + .../certification/ICertificationModel.java | 10 + .../event/CertificationResultEvent.java | 18 + .../com/chwl/core/channel/ChannelModel.java | 86 + .../com/chwl/core/channel/IChannelModel.java | 6 + .../java/com/chwl/core/community/UserVo.kt | 28 + .../com/chwl/core/contacts/ContactModel.java | 55 + .../com/chwl/core/contacts/IContactModel.java | 14 + .../com/chwl/core/contacts/MyConstant.java | 33 + .../core/decoration/DecorationInfoEvent.java | 17 + .../chwl/core/decoration/DecorationModel.kt | 74 + .../decoration/backgroud/BackgroundModel.java | 261 ++ .../backgroud/IBackgroundModel.java | 48 + .../decoration/backgroud/bean/BgInfo.java | 195 + .../core/decoration/bean/BaseDecoration.java | 70 + .../core/decoration/bean/CurrencyType.java | 10 + .../core/decoration/bean/DecorationInfo.kt | 21 + .../bean/DecorationStoreRouterType.java | 21 + .../core/decoration/bean/DressUpInfo.java | 46 + .../chwl/core/decoration/bean/ShopMine.java | 25 + .../chwl/core/decoration/car/CarModel.java | 335 ++ .../chwl/core/decoration/car/ICarModel.java | 91 + .../core/decoration/car/bean/CarInfo.java | 153 + .../decoration/headwear/HeadwearModel.java | 500 +++ .../decoration/headwear/IHeadwearModel.java | 105 + .../headwear/bean/ChatBubbleInfo.java | 26 + .../headwear/bean/HeadWearInfo.java | 129 + .../headwear/bean/UserCardWearInfo.java | 27 + .../HeadwearPulledOffShelvesException.java | 9 + .../decoration/nameplate/INamePlateModel.java | 18 + .../decoration/nameplate/NamePlateModel.java | 101 + .../nameplate/bean/NamePlateInfo.java | 228 + .../bean/ClanHallMemberIncomeTotalInfo.kt | 15 + .../com/chwl/core/earn/bean/EarnRecordInfo.kt | 15 + .../com/chwl/core/earn/bean/GoldRecordInfo.kt | 10 + .../chwl/core/earn/bean/GoldToDiamondInfo.kt | 18 + .../core/earn/bean/HallMemberGoldFlowInfo.kt | 16 + .../earn/bean/HallMemberGoldFlowTotalInfo.kt | 10 + .../java/com/chwl/core/earn/bean/HallVo.kt | 11 + .../com/chwl/core/earn/bean/RoomTypeInfo.kt | 16 + .../com/chwl/core/earn/model/EarnModel.kt | 111 + .../chwl/core/exception/ErrorThrowable.java | 33 + .../core/exception/FailReasonException.java | 25 + .../core/exception/NullDataException.java | 11 + .../chwl/core/exception/UnKnowException.java | 10 + .../core/family/bean/BillDateDivInfo.java | 16 + .../core/family/bean/CustomServiceInfo.java | 19 + .../family/bean/FamilyCustomServiceInfo.java | 16 + .../chwl/core/family/bean/FamilyGameInfo.java | 18 + .../core/family/bean/FamilyGroupInfo.java | 44 + .../com/chwl/core/family/bean/FamilyInfo.java | 59 + .../family/bean/FamilyManageItemInfo.java | 24 + .../core/family/bean/FamilyMemberInfo.java | 46 + .../core/family/bean/FamilyPlazaInfo.java | 18 + .../chwl/core/family/bean/FindBannerInfo.java | 80 + .../chwl/core/family/bean/HomeBannerInfo.java | 22 + .../chwl/core/family/bean/HomeTitleInfo.java | 81 + .../family/bean/TransactionRecordInfo.java | 21 + .../chwl/core/family/bean/VMBillItemInfo.java | 37 + .../bean/response/RankingFamilyInfo.java | 42 + .../bean/response/RespFamilyGameList.java | 17 + .../bean/response/RespFamilyRankList.java | 19 + .../bean/response/familyPlaza/RespFamily.java | 18 + .../response/memberList/RespFamilymember.java | 18 + .../FamilyMoneyManagementInfo.java | 26 + .../moneyManagement/MonthlyRecord.java | 51 + .../moneyManagement/TradeMoneyRecord.java | 16 + .../event/FamilyCurrencyUpdateEvent.java | 13 + .../family/event/FamilyMemberUpdateEvent.java | 10 + .../core/family/event/FamilyMineEvent.java | 75 + .../core/family/event/FamilyUpdateEvent.java | 23 + .../chwl/core/family/model/FamilyModel.java | 1222 +++++ .../chwl/core/family/model/IFamilyModel.java | 245 + .../com/chwl/core/fansteam/FansTeamModel.kt | 90 + .../chwl/core/fansteam/bean/FansTeamInfo.kt | 11 + .../core/fansteam/bean/FansTeamInitInfo.kt | 13 + .../core/fansteam/bean/FansTeamJoinInfo.kt | 16 + .../core/fansteam/bean/FansTeamJoinedInfo.kt | 18 + .../core/fansteam/bean/FansTeamMsgInfo.kt | 10 + .../core/fansteam/bean/FansTeamTaskInfo.kt | 15 + .../core/fansteam/bean/PrivilegeConfigVo.kt | 18 + .../java/com/chwl/core/file/FileModel.java | 78 + .../java/com/chwl/core/file/IFileModel.java | 25 + .../java/com/chwl/core/file/cos/CosClient.kt | 129 + .../core/file/cos/CosCredentialProvider.kt | 16 + .../com/chwl/core/file/cos/CosException.kt | 18 + .../java/com/chwl/core/file/cos/CosToken.kt | 44 + .../chwl/core/game_team/GameTeamRecordBean.kt | 29 + .../chwl/core/game_team/UserGameTeamInfo.kt | 17 + .../com/chwl/core/gift/ChargeListener.java | 5 + .../java/com/chwl/core/gift/GiftModel.java | 929 ++++ .../java/com/chwl/core/gift/IGiftCore.java | 36 + .../com/chwl/core/gift/IGiftCoreClient.java | 36 + .../java/com/chwl/core/gift/IGiftModel.java | 214 + .../core/gift/bean/BonsellaJoinAttack.java | 15 + .../com/chwl/core/gift/bean/BoomInfo.java | 15 + .../chwl/core/gift/bean/BoomInfoAward.java | 9 + .../com/chwl/core/gift/bean/BoomInfoRank.java | 8 + .../chwl/core/gift/bean/BoomMsgAnimBean.java | 24 + .../chwl/core/gift/bean/BoomMsgAwardBean.kt | 22 + .../chwl/core/gift/bean/BoomMsgAwardList.kt | 3 + .../core/gift/bean/BoomMsgDialogBean.java | 80 + .../chwl/core/gift/bean/BoomMsgExpPushBean.kt | 31 + .../core/gift/bean/BravoGiftMsgNotifyBean.kt | 15 + .../core/gift/bean/BravoGiftRewardBean.java | 16 + .../gift/bean/BravoGiftRewardTipsBean.java | 10 + .../chwl/core/gift/bean/BravoNoticeInfo.java | 15 + .../java/com/chwl/core/gift/bean/CpMsgBean.kt | 26 + .../chwl/core/gift/bean/EventUserConfig.java | 25 + .../chwl/core/gift/bean/GiftEffectInfo.java | 32 + .../com/chwl/core/gift/bean/GiftFileInfo.java | 14 + .../com/chwl/core/gift/bean/GiftFreeInfo.java | 23 + .../com/chwl/core/gift/bean/GiftInfo.java | 144 + .../com/chwl/core/gift/bean/GiftKnapInfo.java | 63 + .../com/chwl/core/gift/bean/GiftList.java | 14 + .../com/chwl/core/gift/bean/GiftListInfo.java | 28 + .../com/chwl/core/gift/bean/GiftLuckyBag.java | 5 + .../core/gift/bean/GiftMultiReceiverInfo.java | 33 + .../chwl/core/gift/bean/GiftPanelInfo.java | 12 + .../chwl/core/gift/bean/GiftReceiveInfo.java | 33 + .../com/chwl/core/gift/bean/GiftReceiver.java | 17 + .../com/chwl/core/gift/bean/GiftSendType.java | 32 + .../com/chwl/core/gift/bean/GiftSource.java | 22 + .../java/com/chwl/core/gift/bean/GiftTab.java | 28 + .../com/chwl/core/gift/bean/GiftType.java | 73 + .../com/chwl/core/gift/bean/LuckyBagGift.java | 14 + .../chwl/core/gift/bean/LuckyBagGifts.java | 39 + .../com/chwl/core/gift/bean/LuckyBagGold.java | 9 + .../core/gift/bean/LuckyBagNoticeInfo.java | 20 + .../chwl/core/gift/bean/LuckyBagNumber.java | 16 + .../core/gift/bean/LuckyBagViewOthers.java | 12 + .../chwl/core/gift/bean/LuckyGiftList.java | 12 + .../core/gift/bean/LuckyGiftMsgAllBean.kt | 14 + .../core/gift/bean/LuckyGiftMsgSelfBean.kt | 10 + .../chwl/core/gift/bean/MsgConfirmEntity.java | 43 + .../core/gift/bean/MsgConfirmStyleBean.java | 11 + .../bean/MsgCpRelationalChangeEntity.java | 11 + .../bean/MsgCpRelationalNotifyEntity.java | 14 + .../gift/bean/MsgEventStartNotifyEntity.java | 32 + .../core/gift/bean/MsgSuperLuckyGift.java | 6 + .../core/gift/bean/MultiGiftReceiveInfo.java | 30 + .../chwl/core/gift/bean/RoomBgChangeBean.java | 8 + .../com/chwl/core/gift/bean/RoomBgInfo.java | 29 + .../chwl/core/gift/bean/RoomBgInfoItem.java | 14 + .../core/gift/bean/RoomLevelChangeBean.java | 9 + .../chwl/core/gift/bean/RoomLevelInfo.java | 29 + .../com/chwl/core/gift/bean/RoomMicDress.java | 24 + .../core/gift/bean/RoomNotifyDialogBean.java | 13 + .../core/gift/bean/RoomPicScreenBean.java | 34 + .../core/gift/bean/RoomUserEnterRoomBean.java | 74 + .../gift/bean/RoomUserEnterRoomCpBean.java | 15 + .../chwl/core/gift/bean/SendGiftScenes.java | 22 + .../java/com/chwl/core/gift/bean/Sender.java | 9 + .../chwl/core/gift/bean/ShowAvatarType.java | 8 + .../com/chwl/core/gift/bean/SimpleUserInfo.kt | 11 + .../chwl/core/gift/bean/SimpleVipInfo.java | 10 + .../com/chwl/core/gift/bean/TagsInfo.java | 47 + .../chwl/core/gift/event/GiftComboEvent.java | 58 + .../core/gift/event/HideCarEffectEvent.java | 10 + .../com/chwl/core/gift/event/NotifyEvent.java | 33 + .../core/gift/event/RoomFreeGiftEvent.java | 18 + .../chwl/core/gift/event/UpdateKnapEvent.java | 18 + .../event/UpdateKnapFreeGiftDataEvent.java | 18 + .../gift/event/UpdateKnapFreeGiftEvent.java | 18 + .../event/UpdateKnapFreeGiftNumEvent.java | 18 + .../exception/GiftOutOfDateException.java | 15 + .../chwl/core/gift/toolbox/GiftToolbox.java | 689 +++ .../java/com/chwl/core/helper/AtProxy.java | 65 + .../com/chwl/core/helper/ImHelperUtils.java | 225 + .../com/chwl/core/helper/NetViewModel.java | 42 + .../com/chwl/core/home/IHomeTabMapView.java | 16 + .../com/chwl/core/home/bean/BannerInfo.java | 145 + .../chwl/core/home/bean/ClientResource.java | 16 + .../core/home/bean/CollectionRoomInfo.java | 33 + .../com/chwl/core/home/bean/ConfigAppUI.java | 35 + .../com/chwl/core/home/bean/ConfigInfo.java | 27 + .../core/home/bean/CurrentResourceInfo.kt | 13 + .../chwl/core/home/bean/FeedbackConfigBean.kt | 9 + .../chwl/core/home/bean/FeedbackTypeBean.kt | 9 + .../java/com/chwl/core/home/bean/FillVo.java | 77 + .../chwl/core/home/bean/HomeConcernsInfo.java | 14 + .../com/chwl/core/home/bean/HomeRankBean.kt | 11 + .../chwl/core/home/bean/HomeRoomCardInfo.kt | 17 + .../com/chwl/core/home/bean/HomeRoomInfo.java | 81 + .../chwl/core/home/bean/HomeTabMapInfo.java | 114 + .../com/chwl/core/home/bean/HomeTagInfo.java | 75 + .../com/chwl/core/home/bean/MainTabInfo.kt | 14 + .../com/chwl/core/home/bean/MainTabType.java | 11 + .../com/chwl/core/home/bean/MicUsersBean.java | 19 + .../com/chwl/core/home/bean/ResourceInfo.kt | 13 + .../java/com/chwl/core/home/bean/StarUser.kt | 14 + .../java/com/chwl/core/home/bean/TabInfo.java | 117 + .../com/chwl/core/home/bean/TagListInfo.java | 13 + .../com/chwl/core/home/bean/VisitorInfo.kt | 18 + .../chwl/core/home/event/FollowRoomEvent.java | 4 + .../home/event/OpenRoomMessageInputEvent.kt | 7 + .../chwl/core/home/event/ShareRoomEvent.java | 4 + .../home/event/VisitorUnreadCountEvent.java | 10 + .../core/home/model/CollectionRoomModel.java | 94 + .../core/home/model/CommunityNoticeModel.java | 80 + .../chwl/core/home/model/GameHomeModel.java | 120 + .../com/chwl/core/home/model/HomeModel.kt | 436 ++ .../home/model/ICommunityNoticeModel.java | 14 + .../com/chwl/core/im/CustomNotifyType.java | 6 + .../java/com/chwl/core/im/GreetModel.java | 35 + .../chwl/core/im/RefreshInRoomListEvent.java | 10 + .../core/im/avroom/IAVRoomCoreClient.java | 49 + .../core/im/chatterbox/ChatterBoxHelper.java | 158 + .../core/im/chatterbox/ChatterBoxModel.java | 96 + .../core/im/chatterbox/HideInputEvent.java | 4 + .../core/im/chatterbox/IChatterBoxModel.java | 15 + .../core/im/chatterbox/bean/CanSendInfo.java | 9 + .../im/chatterbox/bean/TopicBoxItemInfo.java | 9 + .../chwl/core/im/custom/AttachManager.java | 35 + .../custom/bean/ActivityTimerAttachment.java | 40 + .../im/custom/bean/AssistantAttachment.java | 49 + .../im/custom/bean/AuctionAttachment.java | 76 + .../core/im/custom/bean/BoomMsgAttachment.kt | 82 + .../custom/bean/BravoGiftNotifyAttachment.kt | 35 + .../custom/bean/BravoGiftRewardAttachment.kt | 37 + .../core/im/custom/bean/CarAttachment.java | 63 + .../im/custom/bean/CarveUpGoldAttachment.java | 42 + .../CarveUpGoldSecondLevelAttachment.java | 13 + .../bean/CarveUpGoldThirdLevelAttachment.java | 12 + .../im/custom/bean/ChatHintAttachment.java | 30 + .../im/custom/bean/ChatterBoxAttachment.java | 39 + .../custom/bean/ChatterBoxInitAttachment.java | 21 + .../im/custom/bean/CleanScreenAttachment.java | 51 + .../im/custom/bean/CpInviteAttachment.java | 50 + .../core/im/custom/bean/CpMsgAttachment.kt | 34 + .../im/custom/bean/CustomAttachParser.java | 731 +++ .../core/im/custom/bean/CustomAttachment.java | 683 +++ .../bean/DatingAllNotifyAttachment.java | 38 + .../core/im/custom/bean/DatingAttachment.java | 38 + .../custom/bean/DatingPublishAttachment.java | 43 + .../im/custom/bean/DiceThrowAttachment.java | 28 + .../im/custom/bean/DrawGiftAttachment.java | 52 + .../core/im/custom/bean/FaceAttachment.java | 70 + .../im/custom/bean/FairyMsgAttachment.java | 36 + .../im/custom/bean/FairySendAttachment.java | 104 + .../im/custom/bean/FansTeamMsgAttachment.java | 32 + .../im/custom/bean/GameForcedEndAttachment.kt | 20 + .../im/custom/bean/GameForcedEndMsgBean.kt | 10 + .../custom/bean/GameMatchFailedAttachment.kt | 16 + .../custom/bean/GameQueueChangedAttachment.kt | 19 + .../custom/bean/GameTeamInviteAttachment.kt | 31 + .../im/custom/bean/GameTeamInviteMsgBean.kt | 31 + .../custom/bean/GiftAllServiceAttachment.java | 90 + .../bean/GiftAllServiceNotifyAttachment.kt | 32 + .../core/im/custom/bean/GiftAttachment.java | 107 + .../im/custom/bean/GiftBatchAttachment.java | 94 + .../custom/bean/GiftCompoundAttachment.java | 31 + .../im/custom/bean/GiftCompoundMsgBean.java | 14 + .../custom/bean/HeadlineChangedAttachment.kt | 21 + .../core/im/custom/bean/ImTipAttachment.java | 32 + .../bean/InAppSharingFamilyAttachment.java | 41 + .../bean/InAppSharingMiniWorldAttachment.java | 38 + .../bean/InAppSharingRoomAttachment.java | 42 + .../bean/InAppSharingTeamAttachment.java | 34 + .../custom/bean/JoinMiniWorldAttachment.java | 37 + .../bean/JoinMiniWorldNoticeAttachment.java | 85 + .../im/custom/bean/LevelUpAttachment.java | 31 + .../custom/bean/LevelUpNoticeAttachment.java | 58 + .../im/custom/bean/LotteryAttachment.java | 45 + .../custom/bean/LuckyGiftNotifyAttachment.kt | 42 + .../im/custom/bean/LuckyMoneyAttachment.java | 46 + .../custom/bean/LuckyMoneyTipsAttachment.java | 47 + .../im/custom/bean/MagicAllMicAttachment.java | 64 + .../core/im/custom/bean/MagicAttachment.java | 66 + .../im/custom/bean/MagicBatchAttachment.java | 55 + .../core/im/custom/bean/MatchAttachment.java | 55 + .../im/custom/bean/MatchTicketAttachment.java | 32 + .../custom/bean/MonsterAttackAttachment.java | 62 + .../bean/MonsterHuntingResultAttachment.java | 46 + .../custom/bean/MonsterStatusAttachment.java | 70 + .../custom/bean/MsgConfirmMsgAttachment.java | 33 + ...sgCpRelationalChangeConfirmAttachment.java | 33 + ...MsgCpRelationalChangeNotifyAttachment.java | 33 + .../bean/MsgEventStartNotifyAttachment.java | 33 + .../im/custom/bean/MultiGiftAttachment.java | 95 + .../custom/bean/MultiLuckyGiftAttachment.java | 80 + .../im/custom/bean/NewbieHelloAttachment.java | 32 + .../core/im/custom/bean/NobleAttachment.java | 126 + .../core/im/custom/bean/NoticeAttachment.java | 69 + .../core/im/custom/bean/NotifyH5Attachment.kt | 11 + .../core/im/custom/bean/NotifyH5Info.java | 16 + .../custom/bean/OpenRoomNotiAttachment.java | 58 + .../im/custom/bean/OpenSignInAttachment.java | 39 + .../bean/P2PContactRechargeAttachment.java | 26 + .../core/im/custom/bean/PlayEffectInfo.java | 20 + .../im/custom/bean/RedPackageAttachment.java | 33 + .../bean/RedPackageLuckyBagAttachment.java | 33 + .../bean/RedPackageRoomMsgAttachment.java | 33 + .../im/custom/bean/RedPacketAttachment.java | 46 + .../custom/bean/RequestUpmicAttachment.java | 35 + .../chwl/core/im/custom/bean/RewardBean.java | 50 + .../im/custom/bean/RoomAlbumAttachment.java | 22 + .../core/im/custom/bean/RoomAlbumMsgInfo.kt | 9 + .../custom/bean/RoomBgChangeMsgAttachment.kt | 31 + .../custom/bean/RoomBoxPrizeAttachment.java | 117 + .../core/im/custom/bean/RoomBoxPrizeInfo.java | 15 + .../bean/RoomFollowOwnerAttachment.java | 42 + .../bean/RoomFollowOwnerAttachment2.java | 42 + .../custom/bean/RoomFreeGiftAttachment.java | 33 + .../im/custom/bean/RoomFreeGiftMsgBean.java | 11 + .../custom/bean/RoomGiftValueAttachment.java | 46 + .../im/custom/bean/RoomInfoAttachment.java | 22 + .../custom/bean/RoomInviteFansAttachment.java | 32 + .../im/custom/bean/RoomInviteFansInfo.java | 27 + .../bean/RoomLevelChangeMsgAttachment.kt | 31 + .../custom/bean/RoomLuckySeaAttachment.java | 37 + .../im/custom/bean/RoomLuckySeaMsgBean.java | 15 + .../im/custom/bean/RoomNoticeAttachment.java | 34 + .../core/im/custom/bean/RoomPKAttachment.java | 31 + .../com/chwl/core/im/custom/bean/RoomPhoto.kt | 16 + .../bean/RoomPicScreenMsgAttachment.java | 34 + .../chwl/core/im/custom/bean/RoomPkBean.java | 142 + .../im/custom/bean/RoomRankAttachment.java | 31 + .../core/im/custom/bean/RoomRankMsgBean.java | 11 + .../bean/RoomReceivedLuckyGiftAttachment.java | 33 + .../bean/RoomSerialValueChangedAttachment.kt | 22 + .../bean/RoomTemplateNotifyAttachment.kt | 32 + .../custom/bean/RoomTemplateNotifyMsgBean.kt | 37 + .../im/custom/bean/RoomTipAttachment.java | 78 + .../bean/RoomUserEnterRoomMsgAttachment.java | 33 + .../chwl/core/im/custom/bean/RouterType.java | 244 + .../custom/bean/SingleRoomRankAttachment.java | 31 + .../im/custom/bean/SingleRoomRankMsgBean.java | 11 + .../im/custom/bean/SkillMsgAttachment.java | 42 + .../core/im/custom/bean/SysMsgAttachment.java | 36 + .../im/custom/bean/SysMsgV2Attachment.java | 43 + .../im/custom/bean/SysMsgVoiceAttachment.java | 34 + .../core/im/custom/bean/TarotAttachment.java | 38 + .../core/im/custom/bean/TarotMsgBean.java | 34 + .../core/im/custom/bean/TemplateMessage.kt | 130 + .../custom/bean/TemplateMessageAttachment.kt | 28 + .../java/com/chwl/core/im/custom/bean/User.kt | 33 + .../im/custom/bean/VipMessageAttachment.java | 32 + .../bean/VoiceBottleSayHiAttachment.java | 39 + .../bean/VoiceBottleShakeHeartAttachment.java | 40 + .../im/custom/bean/WelcomeAttachment.java | 56 + .../chwl/core/im/friend/IIMFriendCore.java | 112 + .../chwl/core/im/friend/IMFriendModel.java | 190 + .../chwl/core/im/login/IIMLoginClient.java | 33 + .../com/chwl/core/im/login/IIMLoginCore.java | 34 + .../im/notification/INotificationCore.java | 16 + .../notification/INotificationCoreClient.java | 14 + .../chwl/core/im/room/IIMRoomCoreClient.java | 125 + .../core/im/state/IPhoneCallStateModel.java | 23 + .../core/im/state/PhoneCallStateModel.java | 92 + .../com/chwl/core/im/sysmsg/ISysMsgCore.java | 80 + .../core/im/sysmsg/ISysMsgCoreClient.java | 20 + .../com/chwl/core/initial/IInitialModel.java | 61 + .../com/chwl/core/initial/InitialModel.java | 566 +++ .../com/chwl/core/initial/bean/BoxInfo.java | 14 + .../chwl/core/initial/bean/FaceComponent.java | 68 + .../chwl/core/initial/bean/FairyOpenInfo.java | 22 + .../com/chwl/core/initial/bean/InitInfo.java | 176 + .../initial/bean/NobleResourceComponent.java | 53 + .../core/initial/bean/RedEnvelopeConfig.java | 62 + .../core/initial/bean/SplashComponent.java | 71 + .../com/chwl/core/initial/bean/TaxInfo.java | 16 + .../interceptor/MyOkHttpRetryInterceptor.java | 59 + .../core/interceptor/NoParamsInterceptor.java | 43 + .../core/interceptor/ParamsInterceptor.java | 169 + .../com/chwl/core/interceptor/PathFilter.java | 36 + .../core/interceptor/TimeSyncInterceptor.kt | 57 + .../java/com/chwl/core/kick/IKickModel.java | 15 + .../java/com/chwl/core/kick/KickModel.java | 118 + .../core/level/UserLevelResourceType.java | 14 + .../java/com/chwl/core/level/UserLevelVo.java | 139 + .../core/level/event/CharmLevelUpEvent.java | 15 + .../chwl/core/level/event/LevelUpEvent.java | 15 + .../com/chwl/core/linked/ILinkedModel.java | 13 + .../com/chwl/core/linked/LinkedModel.java | 37 + .../com/chwl/core/linked/bean/LinkedInfo.java | 25 + .../linked/event/LinkMeInfoUpdateEvent.java | 20 + .../core/luckymoney/bean/LuckyMoneyInfo.java | 113 + .../bean/LuckyMoneyRecordsInfo.java | 15 + .../luckymoney/bean/LuckyMoneyUserInfo.java | 18 + .../java/com/chwl/core/magic/IMagicModel.java | 71 + .../java/com/chwl/core/magic/MagicModel.java | 524 +++ .../java/com/chwl/core/magic/ObjectPool.java | 108 + .../com/chwl/core/magic/bean/MagicInfo.java | 94 + .../magic/bean/MagicMultiReceiverInfo.java | 45 + .../core/magic/bean/MagicReceivedInfo.java | 51 + .../chwl/core/magic/bean/MagicReceiver.java | 17 + .../magic/bean/MultiMagicReceivedInfo.java | 44 + .../exception/MagicOutOfDateException.java | 15 + .../chwl/core/magic/toolbox/MagicToolbox.java | 36 + .../chwl/core/manager/AudioEngineManager.java | 371 ++ .../chwl/core/manager/AvRoomDataManager.java | 1440 ++++++ .../com/chwl/core/manager/BaseEngine.java | 73 + .../com/chwl/core/manager/BaseMvpModel.java | 172 + .../com/chwl/core/manager/EngineType.java | 8 + .../com/chwl/core/manager/IAudioEngine.java | 78 + .../chwl/core/manager/IMBroadcastManager.java | 90 + .../chwl/core/manager/IMMessageManager.java | 452 ++ .../chwl/core/manager/IMNetEaseManager.java | 3947 +++++++++++++++++ .../chwl/core/manager/IMSystemMsgManager.java | 324 ++ .../chwl/core/manager/RelationShipEvent.java | 37 + .../java/com/chwl/core/manager/RoomEvent.java | 639 +++ .../chwl/core/manager/RoomMicQueueModel.kt | 129 + .../com/chwl/core/manager/VolumeSetting.java | 42 + .../manager/agora/EngineEventHandler.java | 196 + .../core/manager/agora/RtcEngineHandler.java | 89 + .../core/manager/agora/RtcEngineManager.java | 311 ++ .../manager/event/HallInfoChangeEvent.java | 9 + .../manager/event/HistoryMessageEvent.java | 22 + .../core/manager/trtc/BaseAdapterImpl.java | 868 ++++ .../trtc/BaseAgoraHandlerInterface.java | 155 + .../core/manager/trtc/BaseAgoraInterface.java | 340 ++ .../chwl/core/manager/trtc/IRTCEngine.java | 66 + .../core/manager/trtc/IRTCEngineHandler.java | 21 + .../chwl/core/manager/trtc/RoomIdHelper.java | 16 + .../com/chwl/core/manager/trtc/SDKConfig.java | 34 + .../core/manager/trtc/TRTCEffectManager.java | 178 + .../core/manager/trtc/TRTCEngineAdapter.java | 2479 +++++++++++ .../com/chwl/core/manager/trtc/TRTCUtils.java | 58 + .../manager/trtc/TRtcEngineEventHandler.java | 441 ++ .../core/manager/trtc/TRtcEngineHandler.java | 89 + .../core/manager/trtc/TRtcEngineManager.java | 298 ++ .../com/chwl/core/manager/trtc/Unsupport.java | 8 + .../com/chwl/core/manager/trtc/Version.java | 10 + .../market_verify/IMarketVerifyModel.java | 31 + .../core/market_verify/MarketVerifyModel.java | 131 + .../market_verify/bean/VersionConfig.java | 24 + .../event/MarketVerifyUpdateEvent.java | 4 + .../SimpleAnimationListener.java | 24 + .../bean/MonsterAttackInfo.java | 292 ++ .../bean/MonsterAttackReceiveInfo.java | 34 + .../monsterhunting/bean/MonsterDataBean.java | 345 ++ .../monsterhunting/bean/MonsterEvent.java | 104 + .../monsterhunting/bean/MonsterHunter.java | 111 + .../bean/MonsterHuntingResult.java | 91 + .../bean/MonsterHuntingReward.java | 158 + .../core/monsterhunting/bean/MonsterInfo.java | 39 + .../monsterhunting/bean/MonsterInitInfo.java | 56 + .../monsterhunting/bean/MonsterListInfo.java | 171 + .../monsterhunting/bean/MonsterProtocol.java | 12 + .../manager/MonsterDataManager.java | 57 + .../model/IMonsterHuntingModel.java | 38 + .../model/MonsterHuntingModel.java | 478 ++ .../rxevent/MonsterUpdateEvent.java | 23 + .../java/com/chwl/core/msg/ImsgClient.java | 13 + .../chwl/core/msg/sys/ErbanSysMsgLayout.java | 20 + .../chwl/core/msg/sys/ErbanSysMsgModel.java | 38 + .../core/msg/sys/ErbanSysMsgParamKey.java | 13 + .../core/msg/sys/bean/ApproveMsgInfo.java | 19 + .../msg/sys/bean/ErbanSysMsgComponent.java | 19 + .../core/msg/sys/bean/ErbanSysMsgInfo.java | 86 + .../core/msg/sysv2/ErbanSysMsgV2Layout.java | 18 + .../sysv2/bean/ErbanSysMsgV2Component.java | 16 + .../msg/sysv2/bean/ErbanSysMsgV2Info.java | 88 + .../core/newbie/bean/NewbieHelloInfo.java | 15 + .../newbie/event/NewbieHelloDialogEvent.java | 15 + .../java/com/chwl/core/noble/NobleConfig.txt | 71 + .../com/chwl/core/noble/NobleDataManager.java | 434 ++ .../chwl/core/noble/NobleResourceType.java | 33 + .../java/com/chwl/core/noble/NobleUtil.java | 876 ++++ .../noble/bean/AllServiceGiftProtocol.java | 255 ++ .../com/chwl/core/noble/bean/NobleConfig.java | 117 + .../com/chwl/core/noble/bean/NobleInfo.java | 239 + .../chwl/core/noble/bean/NobleProtocol.java | 100 + .../com/chwl/core/noble/bean/NobleRight.java | 313 ++ .../chwl/core/patriarch/bean/LimitNotice.java | 17 + .../patriarch/event/CloseMinRoomEvent.java | 8 + .../event/ImPushMsgPmLimitTimeEvent.java | 15 + .../event/PmDismissAllLimitDialogEvent.java | 9 + .../exception/PmRoomLimitException.java | 17 + .../java/com/chwl/core/pay/GoldGiveModel.java | 62 + .../com/chwl/core/pay/IGoldGiveModel.java | 18 + .../java/com/chwl/core/pay/IPayModel.java | 84 + .../main/java/com/chwl/core/pay/PayModel.java | 455 ++ .../java/com/chwl/core/pay/bean/Banner.kt | 6 + .../chwl/core/pay/bean/ChargeBannerInfo.kt | 6 + .../com/chwl/core/pay/bean/ChargeBean.java | 123 + .../chwl/core/pay/bean/ChargeChannelInfo.kt | 5 + .../chwl/core/pay/bean/FirstChargeGoods.java | 22 + .../chwl/core/pay/bean/FirstChargeReward.java | 67 + .../chwl/core/pay/bean/GiveGoldResult.java | 13 + .../java/com/chwl/core/pay/bean/GiveInfo.java | 18 + .../chwl/core/pay/bean/NewUserChargeInfo.java | 13 + .../com/chwl/core/pay/bean/PayRecordId.java | 14 + .../com/chwl/core/pay/bean/WalletInfo.java | 181 + .../event/ChargeCustomNotificationEvent.java | 21 + .../chwl/core/pay/event/FirstChargeEvent.java | 14 + .../core/pay/event/FirstRechargeEvent.java | 7 + .../core/pay/event/GetWalletInfoEvent.java | 7 + .../core/pay/event/NewUserChargeEvent.java | 14 + .../core/pay/event/SendGoldSuccessEvent.java | 14 + .../core/pay/event/UpdateWalletInfoEvent.java | 7 + .../com/chwl/core/praise/IPraiseModel.java | 35 + .../com/chwl/core/praise/PraiseModel.java | 306 ++ .../chwl/core/praise/event/IsLikedEvent.java | 17 + .../chwl/core/praise/event/PraiseEvent.java | 31 + .../com/chwl/core/radish/IRadishModel.java | 15 + .../com/chwl/core/radish/RadishModel.java | 115 + .../chwl/core/radish/RadishRecordResult.java | 7 + .../chwl/core/radish/RadishWalletInfo.java | 11 + .../event/RadishWalletInfoUpdateEvent.java | 8 + .../core/radish/event/ReceivePrizeEvent.java | 8 + .../core/radish/event/SignInSuccessEvent.java | 8 + .../chwl/core/radish/signin/ISignInModel.java | 52 + .../chwl/core/radish/signin/SignInModel.java | 233 + .../radish/signin/bean/DrawNoticeInfo.java | 9 + .../core/radish/signin/bean/ImNotice.java | 18 + .../signin/bean/ReceiveTotalRewardInfo.java | 19 + .../radish/signin/bean/ReplenishSignInfo.java | 22 + .../chwl/core/radish/signin/bean/Reward.java | 13 + .../radish/signin/bean/RewardNoticeInfo.java | 45 + .../radish/signin/bean/SignDetailInfo.java | 62 + .../core/radish/signin/bean/SignDrawInfo.java | 26 + .../core/radish/signin/bean/SignInfo.java | 14 + .../com/chwl/core/radish/task/ITaskModel.java | 38 + .../com/chwl/core/radish/task/TaskModel.java | 112 + .../task/bean/CheckNewUserTaskInfo.java | 9 + .../chwl/core/radish/task/bean/PrizeAnim.java | 65 + .../chwl/core/radish/task/bean/PrizeType.java | 12 + .../chwl/core/radish/task/bean/TaskInfo.java | 104 + .../java/com/chwl/core/realm/IRealmCore.java | 13 + .../com/chwl/core/recall/IRecallModel.java | 14 + .../com/chwl/core/recall/RecallModel.java | 96 + .../core/recall/bean/CheckLostUserInfo.java | 27 + .../com/chwl/core/recall/bean/GoBackInfo.java | 24 + .../core/recall/event/CheckLostUserEvent.java | 10 + .../chwl/core/recall/event/GoBackEvent.java | 15 + .../core/redPacket/bean/ActionDialogInfo.java | 48 + .../core/redPacket/bean/RedDrawListInfo.java | 66 + .../core/redPacket/bean/RedPacketInfo.java | 71 + .../core/redPacket/bean/RedPacketInfoV2.java | 59 + .../core/redPacket/bean/ShareRedBagInfo.java | 28 + .../core/redPacket/event/GetRedInfoEvent.java | 17 + .../chwl/core/redpackage/RedPackageModel.kt | 150 + .../chwl/core/redpackage/RedPackageType.kt | 6 + .../redpackage/bean/RedEnvelopeGiftItemVO.kt | 9 + .../core/redpackage/bean/RedEnvelopeItemVO.kt | 11 + .../redpackage/bean/RedEnvelopeRoomMsg.kt | 40 + .../core/redpackage/bean/RedEnvelopeState.kt | 23 + .../core/redpackage/bean/RedEnvelopeVO.kt | 35 + .../core/redpackage/bean/RedPackageData.kt | 36 + .../core/redpackage/bean/RedPackageInfo.kt | 20 + .../redpackage/bean/RedPackageLuckyBag.java | 16 + .../redpackage/bean/RedPackageNotifyInfo.kt | 65 + .../core/relation/cp/CpBindUnbindEvent.java | 4 + .../relation/cp/bean/CpInviteDetailEntity.kt | 20 + .../core/relation/cp/bean/CpInviteInfo.kt | 27 + .../relation/cp/bean/CpInvitePageEntity.kt | 23 + .../relation/cp/bean/CpMpApplyListEntity.kt | 16 + .../chwl/core/relation/cp/bean/CpRelation.kt | 26 + .../core/relation/cp/bean/CpTaskEntity.kt | 33 + .../relation/cp/bean/UserCpLevelMpEntity.kt | 13 + .../core/relation/cp/bean/UserCpListEntity.kt | 25 + .../com/chwl/core/retry/ImRetryManager.java | 70 + .../chwl/core/retry/ReconnectListener.java | 15 + .../chwl/core/retry/RetryChatRoomMessage.java | 20 + .../com/chwl/core/room/IRoomCoreClient.java | 93 + .../activitytimer/ActivityTimerEvent.java | 12 + .../core/room/activitytimer/TimerBean.java | 22 + .../core/room/anotherroompk/RoomPKModel.kt | 153 + .../anotherroompk/ShowGiftDialogEvent.java | 14 + .../ShowUserInfoDialogEvent.java | 10 + .../core/room/anotherroompk/SimpleRoomInfo.kt | 16 + .../room/anotherroompk/SingleRoomPKModel.kt | 202 + .../chwl/core/room/auction/IAuctionCore.java | 59 + .../core/room/auction/IAuctionCoreClient.java | 36 + .../core/room/auction/bean/AuctionInfo.java | 143 + .../auction/bean/AuctionListUserInfo.java | 73 + .../core/room/auction/bean/AuctionUser.java | 54 + .../com/chwl/core/room/bean/AnchorInfo.kt | 15 + .../com/chwl/core/room/bean/BoxSwitchVo.java | 92 + .../com/chwl/core/room/bean/BroadcastInfo.kt | 11 + .../com/chwl/core/room/bean/CpListItem.java | 17 + .../core/room/bean/DatingAllNotifyInfo.kt | 45 + .../chwl/core/room/bean/DatingNotifyInfo.kt | 52 + .../chwl/core/room/bean/DragonBarInfo.java | 32 + .../com/chwl/core/room/bean/FaceBean.java | 8 + .../com/chwl/core/room/bean/FaceEntity.java | 11 + .../com/chwl/core/room/bean/FaceTabBean.java | 22 + .../chwl/core/room/bean/FindLoveSwitchVo.java | 87 + .../chwl/core/room/bean/HomeLiveTopInfo.kt | 14 + .../core/room/bean/LeaveModeAttachment.java | 44 + .../com/chwl/core/room/bean/MeCenterInfo.kt | 15 + .../chwl/core/room/bean/OnlineChatMember.java | 121 + .../core/room/bean/RightBottomIconConfig.java | 102 + .../chwl/core/room/bean/RoomAudioSdkType.java | 10 + .../com/chwl/core/room/bean/RoomBoomInfo.java | 15 + .../chwl/core/room/bean/RoomBoomInfoSign.java | 10 + .../room/bean/RoomContributeDataInfo.java | 149 + .../room/bean/RoomContributeRoomInfo.java | 130 + .../room/bean/RoomContributeUserInfo.java | 352 ++ .../java/com/chwl/core/room/bean/RoomIcon.kt | 67 + .../com/chwl/core/room/bean/RoomInfo.java | 640 +++ .../chwl/core/room/bean/RoomInviteFansInfo.kt | 8 + .../chwl/core/room/bean/RoomListResult.java | 12 + .../room/bean/RoomMessageViewNoticeInfo.java | 11 + .../com/chwl/core/room/bean/RoomModeType.java | 12 + .../chwl/core/room/bean/RoomOnlineUserBean.kt | 25 + .../room/bean/RoomRankHalfHourDataInfo.java | 29 + .../room/bean/RoomRankHalfHourMeInfo.java | 129 + .../room/bean/RoomRankHalfHourRankInfo.java | 116 + .../core/room/bean/RoomRankMultiItem.java | 28 + .../com/chwl/core/room/bean/RoomResult.java | 11 + .../core/room/bean/RoomSettingTabInfo.java | 121 + .../core/room/bean/RoomWelcomeConfig.java | 20 + .../chwl/core/room/bean/SearchRoomInfo.java | 168 + .../core/room/bean/SeizeTreasureSwitchVo.kt | 10 + .../core/room/bean/ShowUserInfoDialog.java | 20 + .../core/room/bean/SimplePartyRoomInfo.java | 10 + .../chwl/core/room/bean/SingleRoomSortInfo.kt | 6 + .../java/com/chwl/core/room/bean/UpMic.java | 13 + .../com/chwl/core/room/bean/WelcomeInfo.java | 80 + .../chwl/core/room/core/RoomDataService.kt | 55 + .../core/room/dragonball/DragonBallModel.java | 84 + .../room/dragonball/IDragonBallModel.java | 21 + .../room/event/DatingSelectUserEvent.java | 26 + .../core/room/event/EixtCountDownEvent.java | 4 + .../core/room/event/FaceIsReadyEvent.java | 4 + .../core/room/event/FinishAvRoomEvent.java | 4 + .../core/room/event/MessageSizeEvent.java | 19 + .../core/room/event/ReceiveFaceEvent.java | 16 + .../com/chwl/core/room/event/RoomAtEvent.java | 11 + .../core/room/event/RoomClearScreenEvent.java | 4 + .../chwl/core/room/event/RoomExitEvent.java | 8 + .../chwl/core/room/event/RoomInfoEvent.java | 19 + .../chwl/core/room/event/RoomShieldEvent.java | 7 + .../core/room/event/RoomTaskTipsEvent.java | 9 + .../chwl/core/room/event/SwitchRoomEvent.java | 12 + .../room/exception/AntiSpamHitException.java | 8 + .../chwl/core/room/face/DynamicFaceModel.java | 749 ++++ .../com/chwl/core/room/face/FaceInfo.java | 361 ++ .../com/chwl/core/room/face/FaceListInfo.java | 72 + .../chwl/core/room/face/FaceReceiveInfo.java | 72 + .../core/room/face/IDynamicFaceModel.java | 92 + .../com/chwl/core/room/face/IFaceCore.java | 91 + .../chwl/core/room/face/IFaceCoreClient.java | 23 + .../chwl/core/room/face/SvgaFaceManager.kt | 53 + .../com/chwl/core/room/face/ZipDownloader.kt | 77 + .../java/com/chwl/core/room/game/GameModel.kt | 105 + .../com/chwl/core/room/game/GameStatus.java | 8 + .../core/room/game/bean/BaiShunGameConfig.kt | 53 + .../com/chwl/core/room/game/bean/GameCfg.kt | 115 + .../chwl/core/room/game/bean/GameCodeInfo.kt | 6 + .../chwl/core/room/game/bean/GameInfo.java | 56 + .../core/room/giftvalue/GiftValueModel.java | 147 + .../core/room/giftvalue/IGiftValueModel.java | 41 + .../giftvalue/bean/GiftValueCommonUpdate.java | 112 + .../room/giftvalue/bean/GiftValueData.java | 88 + .../room/giftvalue/bean/GiftValueNetData.java | 11 + .../room/giftvalue/bean/IndexGiftValue.java | 18 + .../room/giftvalue/bean/RoomGiftValue.java | 22 + .../giftvalue/helper/GiftValueFormat.java | 21 + .../room/giftvalue/helper/GiftValueMrg.java | 525 +++ .../com/chwl/core/room/model/AvRoomModel.java | 748 ++++ .../chwl/core/room/model/HomePartyModel.java | 316 ++ .../room/model/HomePartyUserListModel.java | 228 + .../chwl/core/room/model/MicQueueModel.java | 215 + .../chwl/core/room/model/RoomBaseModel.java | 1359 ++++++ .../chwl/core/room/model/RoomCharmModel.java | 69 + .../room/model/RoomContributeListModel.java | 92 + .../core/room/model/RoomInviteFansModel.kt | 54 + .../chwl/core/room/model/RoomInviteModel.java | 53 + .../chwl/core/room/model/RoomRankModel.java | 62 + .../core/room/model/RoomSettingModel.java | 462 ++ .../room/model/inteface/IAvRoomModel.java | 192 + .../room/model/inteface/IHomePartyModel.java | 72 + .../inteface/IHomePartyUserListModel.java | 30 + .../room/model/inteface/IMicQueueModel.java | 55 + .../room/model/inteface/IRoomBaseModel.java | 182 + .../room/model/inteface/IRoomCharmModel.java | 21 + .../inteface/IRoomContributeListModel.java | 25 + .../room/model/inteface/IRoomInviteModel.java | 21 + .../room/model/inteface/IRoomRankModel.java | 23 + .../model/inteface/IRoomSettingModel.java | 41 + .../room/pk/attachment/RoomPkAttachment.java | 55 + .../chwl/core/room/pk/bean/PKMemberInfo.java | 16 + .../room/pk/bean/PKQueuingMicMemberInfo.java | 24 + .../chwl/core/room/pk/bean/PKRecordInfo.java | 27 + .../core/room/pk/bean/PKRecordListInfo.java | 16 + .../pk/bean/PKRespQueuingMicListInfo.java | 16 + .../chwl/core/room/pk/bean/PKTeamInfo.java | 38 + .../chwl/core/room/pk/bean/PKTeamMember.java | 18 + .../pk/bean/RoomPKInvitedUpMicMember.java | 13 + .../chwl/core/room/pk/bean/RoomPkData.java | 126 + .../room/pk/bean/request/CreatePKMember.java | 14 + .../room/pk/bean/response/RespPKData.java | 16 + .../core/room/pk/event/PKDataUpdateEvent.java | 22 + .../chwl/core/room/pk/event/PKStateEvent.java | 9 + .../core/room/pk/event/PKTimeFinishEvent.java | 9 + .../core/room/pk/event/PKTimeTickEvent.java | 17 + .../com/chwl/core/room/pk/model/IPkModel.java | 186 + .../com/chwl/core/room/pk/model/PkModel.java | 1343 ++++++ .../core/room/queue/bean/ConsumeInfo.java | 205 + .../core/room/queue/bean/MicMemberInfo.java | 93 + .../core/room/queue/bean/RoomConsumeInfo.java | 79 + .../attachment/QueuingMicAttachment.java | 30 + .../core/room/queuing_mic/bean/GroupType.java | 7 + .../room/queuing_mic/bean/QueuingMicInfo.java | 42 + .../bean/QueuingMicMemeberInfo.java | 26 + .../bean/RespQueuingMicListInfo.java | 16 + .../queuing_mic/event/HasAnimationEffect.java | 7 + .../event/QueuingMicEmptyEvent.java | 4 + .../event/QueuingMicNotEmptyEvent.java | 4 + .../recommendpos/IRecommendCardModel.java | 23 + .../room/recommendpos/RecommendCardModel.java | 57 + .../room/recommendpos/bean/RcmdCardType.java | 26 + .../room/recommendpos/bean/RecommendCard.java | 36 + .../treasure_box/bean/BoxRankingInfo.java | 39 + .../treasure_box/bean/TreasureRankingInfo.kt | 12 + .../event/RefreshBoxRankingEvent.java | 4 + .../java/com/chwl/core/set/bean/ShieldInfo.kt | 14 + .../java/com/chwl/core/set/model/SetModel.kt | 52 + .../chwl/core/settings/ISettingsModel.java | 40 + .../com/chwl/core/settings/SettingsModel.java | 186 + .../chwl/core/settings/bean/SysAccount.java | 67 + .../share/bean/InAppSharingFamilyInfo.java | 14 + .../core/share/bean/InAppSharingInfo.java | 19 + .../share/bean/InAppSharingMiniWorldInfo.java | 11 + .../core/share/bean/InAppSharingRoomInfo.java | 16 + .../core/share/bean/InAppSharingTeamInfo.java | 14 + .../com/chwl/core/share/bean/SessionType.java | 36 + .../chwl/core/share/bean/ShareCommonInfo.java | 53 + .../core/skill/entity/SkillNotifyEntity.kt | 16 + .../skill/entity/SkillPostServerEntity.kt | 13 + .../core/skill/entity/SkillPropertyEntity.kt | 56 + .../core/skill/entity/SkillRecordEntity.kt | 38 + .../chwl/core/skill/entity/SkillTypeEntity.kt | 3 + .../com/chwl/core/skill/event/SkillEvent.java | 18 + .../com/chwl/core/sound/model/SoundModel.kt | 45 + .../com/chwl/core/statistic/StatLogKey.java | 28 + .../protocol/StatisticsProtocol.java | 607 +++ .../com/chwl/core/support/config/Constants.kt | 9 + .../core/support/listener/ListenerOwner.kt | 10 + .../core/support/listener/ListenerStore.kt | 14 + .../support/listener/SafeListenerOwner.kt | 53 + .../support/listener/SimpleListenerOwner.kt | 51 + .../core/support/room/AudioRoomContext.kt | 51 + .../support/room/FrameLayoutRoomWidget.kt | 139 + .../com/chwl/core/support/room/RoomAbility.kt | 154 + .../com/chwl/core/support/room/RoomContext.kt | 88 + .../com/chwl/core/support/room/RoomService.kt | 10 + .../com/chwl/core/support/room/RoomView.kt | 29 + .../com/chwl/core/support/room/RoomWidget.kt | 20 + .../lifecycle/RoomFullLifecycleObserver.kt | 34 + .../support/room/lifecycle/RoomLifecycle.kt | 35 + .../room/lifecycle/RoomLifecycleObserver.kt | 18 + .../room/lifecycle/RoomLifecycleOwner.kt | 9 + .../room/lifecycle/RoomLifecycleRegistry.kt | 62 + .../lifecycle/rx/RoomRxLifecycleEvent.java | 11 + .../core/team/bean/RespTeamMemberInfo.java | 15 + .../com/chwl/core/team/bean/TeamEvent.java | 31 + .../com/chwl/core/team/bean/TeamInfo.java | 36 + .../chwl/core/team/bean/TeamMemberInfo.java | 72 + .../core/team/bean/TeamTransactionInfo.java | 17 + .../team/bean/TeamTransactionRecordInfo.java | 17 + .../com/chwl/core/team/model/ITeamModel.java | 246 + .../com/chwl/core/team/model/TeamModel.java | 950 ++++ .../core/treasurefairy/TreasureFairyModel.kt | 328 ++ .../chwl/core/treasurefairy/bean/Compound.kt | 6 + .../chwl/core/treasurefairy/bean/DrawInfo.kt | 7 + .../treasurefairy/bean/ExchangeGiftInfo.kt | 35 + .../chwl/core/treasurefairy/bean/FairyInfo.kt | 25 + .../treasurefairy/bean/FairyMsgInfoBean.java | 16 + .../treasurefairy/bean/FairyResolveParam.kt | 5 + .../core/treasurefairy/bean/FairyTestParam.kt | 6 + .../core/treasurefairy/bean/ForestInfo.kt | 11 + .../core/treasurefairy/bean/MyFairyInfo.kt | 10 + .../chwl/core/treasurefairy/bean/PrizeInfo.kt | 16 + .../core/treasurefairy/bean/PropItemInfo.kt | 8 + .../core/treasurefairy/bean/ResolveInfo.kt | 8 + .../core/treasurefairy/bean/SendFairyInfo.kt | 13 + .../treasurefairy/bean/TestFairyRecordInfo.kt | 11 + .../com/chwl/core/user/AttentionModel.java | 95 + .../com/chwl/core/user/IAttentionModel.java | 33 + .../com/chwl/core/user/IUserDynamicModel.java | 14 + .../java/com/chwl/core/user/IUserModel.java | 282 ++ .../com/chwl/core/user/UserDynamicModel.java | 48 + .../com/chwl/core/user/UserInfoUiMgr.java | 67 + .../java/com/chwl/core/user/UserModel.java | 1268 ++++++ .../chwl/core/user/bean/AttentionInfo.java | 71 + .../chwl/core/user/bean/AttentionItem.java | 70 + .../com/chwl/core/user/bean/BaseInfo.java | 65 + .../com/chwl/core/user/bean/BaseUserInfo.java | 73 + .../user/bean/DiamondGiveHistoryInfo.java | 30 + .../com/chwl/core/user/bean/EffectType.java | 8 + .../com/chwl/core/user/bean/FansInfo.java | 46 + .../com/chwl/core/user/bean/FansListInfo.java | 29 + .../chwl/core/user/bean/FirstChargeInfo.kt | 10 + .../core/user/bean/GiftAchievementInfo.java | 17 + .../user/bean/GiftAchievementInfoSub.java | 18 + .../core/user/bean/GiftAchievementItem.java | 63 + .../com/chwl/core/user/bean/GiftWallInfo.java | 64 + .../chwl/core/user/bean/InviteUserInfo.java | 12 + .../chwl/core/user/bean/JoinWorldInfo.java | 19 + .../core/user/bean/LiveSkillVoListBean.java | 88 + .../com/chwl/core/user/bean/LiveTagInfo.java | 52 + .../java/com/chwl/core/user/bean/MedalBean.kt | 11 + .../chwl/core/user/bean/NameplateInfo.java | 11 + .../com/chwl/core/user/bean/NewUserInfo.java | 98 + .../com/chwl/core/user/bean/ProtocolInfo.kt | 9 + .../chwl/core/user/bean/RadishWallInfo.java | 12 + .../chwl/core/user/bean/RegionInfoBean.java | 12 + .../chwl/core/user/bean/SearchUserInfo.java | 36 + .../chwl/core/user/bean/SimpleUserInfo.java | 21 + .../com/chwl/core/user/bean/UserBgVO.java | 12 + .../chwl/core/user/bean/UserCPListBean.java | 20 + .../chwl/core/user/bean/UserDetailInfo.java | 518 +++ .../core/user/bean/UserDetailMedalInfo.kt | 10 + .../com/chwl/core/user/bean/UserGameInfo.java | 70 + .../com/chwl/core/user/bean/UserInfo.java | 946 ++++ .../core/user/bean/UserInfoSkillEntity.kt | 26 + .../com/chwl/core/user/bean/UserLabelInfo.kt | 13 + .../chwl/core/user/bean/UserLabelItemInfo.kt | 13 + .../com/chwl/core/user/bean/UserMineInfo.java | 43 + .../com/chwl/core/user/bean/UserPhoto.java | 42 + .../chwl/core/user/bean/UserRandomConfig.java | 15 + .../com/chwl/core/user/bean/UserRankInfo.java | 122 + .../core/user/bean/UserRecommendRoomInfo.java | 13 + .../core/user/event/BravoCoinAnimEvent.java | 12 + .../event/CurrentUserInfoCompleteEvent.java | 9 + .../CurrentUserInfoCompleteFailEvent.java | 10 + .../user/event/LoadLoginUserInfoEvent.java | 9 + .../user/event/LoginUserInfoUpdateEvent.java | 9 + .../core/user/event/NeedBindPhoneEvent.java | 8 + .../user/event/NeedCompleteInfoEvent.java | 8 + .../com/chwl/core/user/event/ShowMeEvent.kt | 3 + .../com/chwl/core/utils/APIEncryptUtil.java | 123 + .../com/chwl/core/utils/ActivityUtil.java | 48 + .../core/utils/AsyncTaskScanMusicFile.java | 351 ++ .../java/com/chwl/core/utils/BitmapUtils.java | 128 + .../java/com/chwl/core/utils/CheckUtils.java | 15 + .../java/com/chwl/core/utils/ComboUtil.kt | 31 + .../java/com/chwl/core/utils/CoreLogger.java | 719 +++ .../com/chwl/core/utils/CoreTextUtils.java | 96 + .../com/chwl/core/utils/CurrentTimeUtils.java | 15 + .../java/com/chwl/core/utils/DialogUtil.kt | 32 + .../com/chwl/core/utils/DirectoryHelper.java | 75 + .../com/chwl/core/utils/ExtensionUtil.java | 172 + .../com/chwl/core/utils/ExtensionUtils.java | 47 + .../chwl/core/utils/IConnectivityClient.java | 16 + .../chwl/core/utils/IConnectivityCore.java | 23 + .../com/chwl/core/utils/IHandlerCore.java | 37 + .../com/chwl/core/utils/ImageSplitter.java | 101 + .../chwl/core/utils/ImgServiceUrlUtil.java | 196 + .../java/com/chwl/core/utils/IntentUtils.java | 49 + .../java/com/chwl/core/utils/LogUtils.java | 130 + .../java/com/chwl/core/utils/OaidUtil.java | 19 + .../core/utils/OldHttpErrorHandleUtil.java | 45 + .../core/utils/SharedPreferenceUtils.java | 87 + .../java/com/chwl/core/utils/SongUtils.java | 24 + .../java/com/chwl/core/utils/StarUtils.java | 104 + .../chwl/core/utils/StringFormatUtils.java | 405 ++ .../com/chwl/core/utils/SystemUidUtil.java | 14 + .../java/com/chwl/core/utils/TestLog.java | 25 + .../java/com/chwl/core/utils/Transformer.java | 26 + .../java/com/chwl/core/utils/UploadUtils.java | 10 + .../src/main/java/com/chwl/core/utils/WLog.kt | 95 + .../core/utils/extension/StringExtension.kt | 48 + .../chwl/core/utils/myutil/MyJsonUtils.java | 256 ++ .../chwl/core/utils/myutil/MySpanUtils.java | 1461 ++++++ .../chwl/core/utils/myutil/MyTimeUtils.java | 1635 +++++++ .../com/chwl/core/utils/myutil/MyUriUtils.kt | 212 + .../java/com/chwl/core/utils/myutil/MyUtil.kt | 46 + .../chwl/core/utils/myutil/TimeConstants.java | 28 + .../utils/net/BalanceNotEnoughExeption.java | 12 + .../com/chwl/core/utils/net/BeanObserver.java | 46 + .../chwl/core/utils/net/DontWarnObserver.java | 54 + .../chwl/core/utils/net/ErrorConsumer.java | 59 + .../chwl/core/utils/net/FreezeException.java | 9 + .../chwl/core/utils/net/IgnoreException.java | 11 + .../utils/net/RadishNotEnoughException.java | 12 + .../com/chwl/core/utils/net/RxExtension.kt | 99 + .../com/chwl/core/utils/net/RxHelper.java | 356 ++ .../chwl/core/utils/net/ServerException.java | 14 + .../utils/net/VipLevelNotEnoughException.java | 12 + .../com/chwl/core/vip/VipBroadcastMsgEvent.kt | 7 + .../main/java/com/chwl/core/vip/VipModel.kt | 120 + .../java/com/chwl/core/vip/VipOpenEvent.kt | 3 + .../java/com/chwl/core/vip/VipUpgradeEvent.kt | 5 + .../com/chwl/core/vip/bean/UserVipInfo.kt | 22 + .../com/chwl/core/vip/bean/VipAuthInfo.kt | 15 + .../chwl/core/vip/bean/VipBroadcastInfo.kt | 9 + .../java/com/chwl/core/vip/bean/VipInfo.kt | 37 + .../chwl/core/vip/bean/VipMessageInfo.java | 17 + .../com/chwl/core/vip/bean/VipPageInfo.kt | 10 + .../com/chwl/core/vip/bean/VipRebateInfo.kt | 18 + .../com/chwl/core/web/bean/H5NotifyData.java | 34 + .../com/chwl/core/web/bean/WebJsBeanInfo.java | 147 + .../core/web/event/WebViewRefreshEvent.java | 4 + .../chwl/core/widget/img/MyCircleImageView.kt | 53 + .../PagerGridItemTouchListener.java | 89 + .../PagerGridLayoutManager.java | 2012 +++++++++ .../PagerGridSmoothScroller.java | 142 + .../PagerGridSnapHelper.java | 479 ++ .../ic_constellation_aquarius.webp | Bin 0 -> 2114 bytes .../ic_constellation_aries.webp | Bin 0 -> 1706 bytes .../ic_constellation_cancer.webp | Bin 0 -> 1956 bytes .../ic_constellation_capricorn.webp | Bin 0 -> 2096 bytes .../ic_constellation_gemini.webp | Bin 0 -> 1824 bytes .../drawable-xhdpi/ic_constellation_leo.webp | Bin 0 -> 1572 bytes .../ic_constellation_libra.webp | Bin 0 -> 1560 bytes .../ic_constellation_pisces.webp | Bin 0 -> 1876 bytes .../ic_constellation_sagittarius.webp | Bin 0 -> 2202 bytes .../ic_constellation_scorpio.webp | Bin 0 -> 1860 bytes .../ic_constellation_taurus.webp | Bin 0 -> 1836 bytes .../ic_constellation_virgo.webp | Bin 0 -> 1650 bytes core/src/main/res/values-ar/strings.xml | 689 +++ core/src/main/res/values-tr/strings.xml | 669 +++ core/src/main/res/values-zh-rTW/strings.xml | 671 +++ core/src/main/res/values/attr.xml | 10 + core/src/main/res/values/strings.xml | 678 +++ .../core/bank_card/bean/BankCardBean.java | 41 + .../core/bank_card/bean/BankCardListResp.java | 19 + .../exception/NeedBindBankCardException.java | 13 + .../core/bank_card/model/BankCardModel.java | 148 + .../core/bank_card/model/IBankCardModel.java | 55 + .../view/IAddBankCardAgreementView.java | 47 + .../core/bank_card/view/IBankCardView.java | 48 + .../channel_page/bean/ChannelPageInfo.java | 16 + .../channel_page/bean/HelloMessageInfo.kt | 9 + .../channel_page/bean/NewUserHelloInfo.kt | 13 + .../channel_page/model/ChannelPageModel.java | 183 + .../channel_page/model/IChannelPageModel.java | 29 + .../core/community/CommunityConstant.java | 19 + .../chwl/core/community/IPublishModel.java | 19 + .../core/community/ImageUploadConfig.java | 22 + .../com/chwl/core/community/PublishModel.java | 75 + .../attachment/DynamicSysAttachment.java | 42 + .../attachment/UnReadCountAttachment.java | 60 + .../com/chwl/core/community/bean/Comment.java | 92 + .../core/community/bean/CommentResult.java | 17 + .../community/bean/CommunityNoticeInfo.java | 37 + .../core/community/bean/DyChangeData.java | 15 + .../core/community/bean/DynamicMedia.java | 71 + .../community/bean/MiniWorldChooseInfo.java | 15 + .../chwl/core/community/bean/PublishBody.java | 37 + .../chwl/core/community/bean/PublishItem.java | 81 + .../core/community/bean/UnReadCountInfo.java | 61 + .../core/community/bean/UserDynamicItem.java | 70 + .../core/community/bean/WorldDynamicBean.java | 109 + .../bean/WorldDynamicListResult.java | 19 + .../community/bean/comment/PopupParams.java | 29 + .../core/community/bean/comment/Reply.java | 38 + .../community/bean/comment/ReplyResult.java | 29 + .../community/dynamic/DynamicDetailModel.java | 115 + .../core/community/dynamic/DynamicModel.java | 135 + .../dynamic/IDynamicDetailModel.java | 27 + .../core/community/dynamic/IDynamicModel.java | 22 + .../event/DynamicDetailFinishEvent.java | 22 + .../community/event/DynamicPublishEvent.java | 7 + .../community/event/DynamicRefreshEvent.java | 7 + .../core/community/event/SquareTaskEvent.java | 7 + .../community/event/UnReadCountEvent.java | 10 + .../chwl/core/community/im/DynamicImMsg.java | 64 + .../community/im/WorldDynamicAttachment.java | 73 + .../core/community/square/ISquareModel.java | 30 + .../core/community/square/SquareModel.java | 105 + .../java/com/chwl/core/db/AppDataBase.java | 34 + .../chwl/core/module_hall/hall/HallModel.java | 597 +++ .../core/module_hall/hall/HallNameModel.java | 53 + .../core/module_hall/hall/IHallModel.java | 106 + .../core/module_hall/hall/IHallNameModel.java | 9 + .../module_hall/hall/bean/ApplyResult.java | 20 + .../core/module_hall/hall/bean/AuthInfo.java | 53 + .../module_hall/hall/bean/AuthListResult.java | 8 + .../hall/bean/ClanAndHallInfo.java | 10 + .../core/module_hall/hall/bean/ClanInfo.java | 19 + .../module_hall/hall/bean/GroupListInfo.java | 16 + .../module_hall/hall/bean/H5FamilyInfo.kt | 21 + .../core/module_hall/hall/bean/HTeamInfo.java | 43 + .../module_hall/hall/bean/HTeamMember.java | 41 + .../core/module_hall/hall/bean/HallInfo.java | 45 + .../hall/bean/HallMenuByUidResult.java | 8 + .../module_hall/hall/bean/JoinRoomInfo.kt | 7 + .../hall/bean/ListHTeamMember.java | 22 + .../module_hall/hall/bean/ListMemberInfo.java | 17 + .../module_hall/hall/bean/MemberInfo.java | 39 + .../module_hall/hall/bean/OptionInfo.java | 70 + .../module_hall/hall/bean/OwnerHallInfo.java | 57 + .../core/module_hall/hall/bean/RoleType.java | 34 + .../module_hall/hall/bean/SuperAdminHall.kt | 9 + .../module_hall/hall/bean/SuperAdminInfo.kt | 11 + .../module_hall/hall/bean/UserClanInfo.java | 29 + .../hall/event/UserHallUpdateEvent.java | 9 + .../core/module_hall/im/ClanAttachment.java | 38 + .../core/module_hall/im/ClanImMsgInfo.java | 69 + .../core/module_hall/im/FamilyAttachment.java | 49 + .../core/module_hall/im/FamilyImMsgInfo.java | 72 + .../core/module_hall/im/HallAttachment.java | 38 + .../core/module_hall/im/HallImMsgInfo.java | 69 + .../module_hall/im/bean/HallMsgComponent.java | 19 + .../module_hall/im/bean/HallMsgLayout.java | 15 + .../core/module_hall/income/IIncomeModel.java | 28 + .../core/module_hall/income/IncomeModel.java | 175 + .../income/bean/ClanIncomeInfo.java | 16 + .../income/bean/ClanTotalIncomeInfo.java | 13 + .../income/bean/HallIncomeInfo.java | 147 + .../income/bean/HallTotalIncomeInfo.java | 71 + .../income/bean/IncomeGiftInfo.java | 16 + .../module_hall/income/bean/IncomeInfo.java | 21 + .../income/bean/IncomeTotalInfo.java | 13 + .../income/bean/LiveIncomeInfo.java | 18 + .../income/bean/LiveTotalIncomeInfo.java | 13 + .../income/bean/SingleRoomIncomeInfo.java | 15 + .../bean/SingleRoomTotalIncomeInfo.java | 13 + .../income/event/UpdateMemberListEvent.java | 4 + .../secretcode/ISecretCodeModel.java | 26 + .../secretcode/SecretCodeModel.java | 98 + .../secretcode/bean/CheckCodeResult.java | 68 + .../secretcode/bean/SecretCodeInfo.java | 36 + .../core/module_hall/team/HTeamModel.java | 411 ++ .../core/module_hall/team/IHTeamModel.java | 124 + .../module_hall/team/bean/HTeamChatLimit.java | 18 + .../core/module_hall/team/bean/HTeamType.java | 14 + .../team/event/HteamInfoUpdateInfoEvent.java | 14 + .../team/event/HteamListChangeEvent.java | 9 + .../team/event/HteamMemberNumChangeEvent.java | 14 + ...toringApprenticeMissionFourAttachment.java | 13 + ...ntoringApprenticeMissionOneAttachment.java | 13 + ...oringApprenticeMissionThreeAttachment.java | 34 + ...ntoringApprenticeMissionTwoAttachment.java | 11 + .../MentoringGrabApprenticesAttachment.java | 31 + .../MentoringMasterMissionFourAttachment.java | 34 + .../MentoringMasterMissionOneAttachment.java | 38 + ...MentoringMasterMissionThreeAttachment.java | 34 + .../MentoringMasterMissionTwoAttachment.java | 38 + .../MentoringMissionTipsAttachment.java | 34 + .../MentoringSharingRoomAttachment.java | 35 + .../bean/GrabApprenticesInfo.kt | 28 + .../bean/GrabApprenticesMissionInfo.kt | 9 + .../bean/MentoringRankingDataInfo.kt | 174 + .../bean/MentoringResultMarqueeInfo.java | 25 + .../bean/MentoringSharingRoomInfo.java | 39 + .../bean/MentoringTipsInfo.kt | 15 + .../bean/MentoringUserInfo.kt | 53 + .../mentoring_relationship/bean/MissionVo.kt | 48 + .../bean/PickUpApprenticeInfo.kt | 23 + .../bean/SimpleGiftVo.java | 25 + .../bean/SimpleUserVo.kt | 33 + .../event/GrabApprenticesDataEvent.java | 16 + .../event/GrabApprenticesEvent.java | 7 + .../event/MentoringCountingEvent.java | 18 + .../event/MentoringCountingFinishEvent.java | 4 + .../MentoringRelationshipMissionEvent.java | 20 + .../event/MentoringStartCountingEvent.java | 4 + .../event/MentoringStopCountingEvent.java | 4 + .../event/MentoringSuccessEvent.java | 4 + .../MentoringAlreadyHasMasterException.java | 19 + ...toringCanNotPickUpApprenticeException.java | 4 + ...MentoringLessThanFiveMinutesException.java | 15 + .../MentoringMissionExpiredException.java | 15 + .../model/IMentoringRelationshipModel.java | 55 + .../model/MentoringRelationshipModel.java | 997 +++++ .../view/IMentoringRelationshipView.java | 73 + .../core/miniworld/bean/AudioPartyInfo.java | 22 + .../core/miniworld/bean/AudioPartyItem.java | 83 + .../miniworld/bean/AudioPartyListInfo.java | 11 + .../chwl/core/miniworld/bean/MWChatInfo.java | 17 + .../bean/MWChatMemberCountAttachment.java | 59 + .../miniworld/bean/MWChatTopicAttachment.java | 43 + .../miniworld/bean/MiniWorldCategoryInfo.java | 32 + .../miniworld/bean/MiniWorldDetailInfo.java | 38 + .../MiniWorldDetailInfoWithCurrentMember.java | 21 + .../MiniWorldDetailInfoWithMemberInfo.java | 20 + .../bean/MiniWorldEditClassifyInfo.java | 16 + .../miniworld/bean/MiniWorldInWorldInfo.java | 16 + .../core/miniworld/bean/MiniWorldInfo.java | 107 + .../miniworld/bean/MiniWorldListInfo.java | 11 + .../miniworld/bean/MiniWorldMainInfo.java | 21 + .../miniworld/bean/MiniWorldMainItemInfo.java | 35 + .../bean/MiniWorldMemberListInfo.java | 15 + .../bean/MiniWorldMemberListMemberInfo.java | 24 + .../bean/OpenAudioPartyAttachment.java | 57 + .../core/miniworld/bean/OpenSuccessInfo.java | 8 + .../chwl/core/miniworld/bean/TopicInfo.java | 8 + .../miniworld/event/AudioPartyOpenEvent.java | 4 + .../miniworld/event/MWChatTopicEvent.java | 9 + .../event/MWGroupChatMemberEvent.java | 12 + .../event/MWOpenAudioPartyEvent.java | 10 + .../event/MiniWorldJoinVerifiedEvent.java | 12 + .../event/MiniWorldStateChangedEvent.java | 31 + .../event/MiniWorldTeamExitEvent.java | 10 + .../event/OpenedMyMiniWorldEvent.java | 12 + .../core/miniworld/model/IMiniWorldModel.java | 145 + .../core/miniworld/model/MiniWorldHelper.java | 62 + .../core/miniworld/model/MiniWorldModel.java | 633 +++ .../chwl/core/music/bean/BaseMusicInfo.java | 218 + .../chwl/core/music/bean/LocalMusicInfo.java | 281 ++ .../chwl/core/music/bean/ShareMusicInfo.java | 64 + .../core/music/db/bean/LocalMusicBean.java | 56 + .../com/chwl/core/music/db/bean/SongBean.java | 63 + .../db/converter/LocalMusicBeanConverter.java | 28 + .../db/converter/ShareMusicConverter.java | 20 + .../chwl/core/music/db/dao/LocalMusicDao.java | 61 + .../com/chwl/core/music/db/dao/SongDao.java | 30 + .../music/db/model/ILocalMusicDbModel.java | 51 + .../core/music/db/model/IPlayerDbModel.java | 55 + .../music/db/model/LocalMusicDbModel.java | 365 ++ .../core/music/db/model/PlayerDbModel.java | 101 + .../music/event/CurrentMusicUpdateEvent.java | 7 + .../JumpToShareMusicListFragmentEvent.java | 4 + .../chwl/core/music/event/MusicAddEvent.java | 11 + .../core/music/event/MusicDeleteEvent.java | 11 + .../core/music/event/MusicPauseEvent.java | 7 + .../core/music/event/MusicPlayingEvent.java | 7 + .../chwl/core/music/event/MusicStopEvent.java | 7 + .../music/event/RefreshLocalMusicEvent.java | 7 + .../music/event/RefreshPlayerListEvent.java | 7 + .../music/model/ILocalMusicListModel.java | 6 + .../core/music/model/IMusicListModel.java | 6 + .../chwl/core/music/model/IPlayerModel.java | 73 + .../music/model/IShareMusicListModel.java | 16 + .../core/music/model/LocalMusicListModel.java | 7 + .../chwl/core/music/model/MusicListModel.java | 17 + .../chwl/core/music/model/PlayerModel.java | 372 ++ .../core/music/model/ShareMusicListModel.java | 162 + .../music/view/IAddLocalMusicListView.java | 49 + .../core/music/view/ILocalMusicListView.java | 46 + .../chwl/core/music/view/IMusicListView.java | 6 + .../core/music/view/IShareMusicListView.java | 47 + .../attachment/AitFriendsAttachment.java | 35 + .../attachment/AitMeAttachment.java | 35 + .../public_chat_hall/bean/AitFriendsInfo.java | 38 + .../core/public_chat_hall/bean/AitMeInfo.java | 39 + .../public_chat_hall/bean/HeadlineBean.kt | 21 + .../bean/PublicChatMessageBean.kt | 10 + .../event/PublicChatHallAitMeEvent.java | 14 + .../event/PublicChatHallHistoryEvent.java | 18 + .../PublicChatHallMsgCountingDownEvent.java | 21 + .../event/PublicChatHallMsgIncomingEvent.java | 15 + .../PublicChatHallPlayGiftAnimationEvent.java | 16 + .../public_chat_hall/model/PublicChatModel.kt | 66 + .../java/com/chwl/core/code/CodeModel.java | 78 + .../java/com/chwl/core/code/CodeType.java | 22 + .../java/com/chwl/core/code/ICodeModel.java | 18 + .../core/sud/decorator/SudFSMMGCache.java | 231 + .../core/sud/decorator/SudFSMMGDecorator.java | 1126 +++++ .../core/sud/decorator/SudFSMMGListener.java | 1154 +++++ .../sud/decorator/SudFSTAPPDecorator.java | 415 ++ .../chwl/core/sud/model/GameConfigModel.java | 351 ++ .../core/sud/model/GameViewInfoModel.java | 49 + .../chwl/core/sud/state/MGStateResponse.java | 35 + .../chwl/core/sud/state/SudMGPAPPState.java | 1321 ++++++ .../chwl/core/sud/state/SudMGPMGState.java | 1870 ++++++++ .../core/sud/utils/GameCommonStateUtils.java | 138 + .../sud/utils/ISudFSMStateHandleUtils.java | 25 + .../com/chwl/core/sud/utils/SudJsonUtils.java | 43 + .../com.chwl.core.super_admin/SaConstant.java | 11 + .../SuperAdminDataMrg.java | 162 + .../attachment/SuperAdminOpAttachment.java | 53 + .../bean/KickOutExtBean.java | 26 + .../bean/SaOpInfo.java | 26 + .../model/ISuperAdminModel.java | 21 + .../model/SuperAdminModel.java | 99 + .../exception/SAdminCannotGameException.java | 15 + .../util/SAdminOptUtil.java | 118 + .../util/SaAttachmentFactory.java | 89 + .../util/SaMsgUtil.java | 31 + .../util/SuperAdminUtil.java | 69 + .../treasure_box/bean/BoxOpenStatusInfo.java | 46 + .../core/treasure_box/bean/ConfigImgUrl.java | 33 + .../bean/HonourBuyKeyResultInfo.java | 36 + .../core/treasure_box/bean/HonourKeyInfo.java | 36 + .../chwl/core/treasure_box/bean/KeyInfo.java | 51 + .../bean/OpenBoxHonourResult.java | 36 + .../core/treasure_box/bean/OpenBoxResult.java | 37 + .../core/treasure_box/bean/PrizeInfo.java | 97 + .../core/treasure_box/bean/PrizeNewInfo.java | 71 + .../core/treasure_box/bean/UserTicketInfo.kt | 11 + .../treasure_box/event/AutoOpenBoxEvent.java | 22 + .../event/AutoOpenHonourBoxEvent.java | 22 + .../treasure_box/event/BoxBuyKeyEvent.java | 40 + .../event/HonourBoxBuyKeyEvent.java | 40 + .../core/treasure_box/model/BoxModel.java | 339 ++ .../core/treasure_box/model/IBoxModel.java | 130 + .../core/upgrade/bean/NewestVersionInfo.java | 42 + .../chwl/core/upgrade/bean/UpgradeCache.java | 19 + .../upgrade/event/ImPushUpdateAppEvent.java | 24 + .../core/upgrade/model/IUpgradeModel.java | 24 + .../chwl/core/upgrade/model/UpgradeModel.java | 89 + 1333 files changed, 109534 insertions(+) create mode 100644 core/.gitignore create mode 100644 core/build.gradle create mode 100644 core/proguard-rules.pro create mode 100644 core/src/main/AndroidManifest.xml create mode 100644 core/src/main/java/com/chwl/core/Constants.java create mode 100644 core/src/main/java/com/chwl/core/DemoCache.java create mode 100644 core/src/main/java/com/chwl/core/OldHttpObserver.java create mode 100644 core/src/main/java/com/chwl/core/PreferencesUtils.java create mode 100644 core/src/main/java/com/chwl/core/RegionHelper.kt create mode 100644 core/src/main/java/com/chwl/core/SdkConfig.kt create mode 100644 core/src/main/java/com/chwl/core/UriHelper.java create mode 100644 core/src/main/java/com/chwl/core/UriProvider.java create mode 100644 core/src/main/java/com/chwl/core/XConstants.java create mode 100644 core/src/main/java/com/chwl/core/activity/bean/LotteryInfo.java create mode 100644 core/src/main/java/com/chwl/core/activity/event/ActivityEvent.java create mode 100644 core/src/main/java/com/chwl/core/activity/model/ActivityModel.java create mode 100644 core/src/main/java/com/chwl/core/activity/model/IActivityModel.java create mode 100644 core/src/main/java/com/chwl/core/association/bean/ClanListInfo.kt create mode 100644 core/src/main/java/com/chwl/core/association/bean/HallListInfo.java create mode 100644 core/src/main/java/com/chwl/core/association/bean/MemberExchangeInfo.kt create mode 100644 core/src/main/java/com/chwl/core/association/bean/UserLevelInfo.kt create mode 100644 core/src/main/java/com/chwl/core/association/model/AssociationModel.kt create mode 100644 core/src/main/java/com/chwl/core/audio/AudioModel.java create mode 100644 core/src/main/java/com/chwl/core/audio/AudioPlayAndRecordManager.java create mode 100644 core/src/main/java/com/chwl/core/audio/IAudioModel.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/HistoryVoiceInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/SaveVoiceSuccessResultInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/SysMsgVoiceInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/UserVoiceInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/VoiceBottleSayHiInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/VoiceCardInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/bean/VoiceMatchInfo.java create mode 100644 core/src/main/java/com/chwl/core/audio/event/VoiceShakeHeartEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/AuthModel.java create mode 100644 core/src/main/java/com/chwl/core/auth/IAuthModel.java create mode 100644 core/src/main/java/com/chwl/core/auth/entity/AccountInfo.java create mode 100644 core/src/main/java/com/chwl/core/auth/entity/ThirdUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/auth/entity/TicketInfo.java create mode 100644 core/src/main/java/com/chwl/core/auth/event/BindPhoneEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/event/GetCurrentUidEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/event/KickOutEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/event/LoginEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/event/LoginReportEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/event/LogoutEvent.java create mode 100644 core/src/main/java/com/chwl/core/auth/exception/AccountCancelException.java create mode 100644 core/src/main/java/com/chwl/core/auth/exception/BanAccountException.java create mode 100644 core/src/main/java/com/chwl/core/auth/exception/BigHeadPhoneException.java create mode 100644 core/src/main/java/com/chwl/core/auth/exception/IsSuperAdminException.java create mode 100644 core/src/main/java/com/chwl/core/base/BaseBusEvent.java create mode 100644 core/src/main/java/com/chwl/core/base/BaseDataEvent.java create mode 100644 core/src/main/java/com/chwl/core/base/BaseErrorEvent.java create mode 100644 core/src/main/java/com/chwl/core/base/BaseErrorException.java create mode 100644 core/src/main/java/com/chwl/core/base/BaseModel.java create mode 100644 core/src/main/java/com/chwl/core/base/CancelNoToastException.java create mode 100644 core/src/main/java/com/chwl/core/base/IModel.java create mode 100644 core/src/main/java/com/chwl/core/bean/BaseProtocol.java create mode 100644 core/src/main/java/com/chwl/core/bean/CarButtonInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/EventMyBean.java create mode 100644 core/src/main/java/com/chwl/core/bean/EventOfficialBean.java create mode 100644 core/src/main/java/com/chwl/core/bean/EventRoomBean.java create mode 100644 core/src/main/java/com/chwl/core/bean/EventRoomEntity.java create mode 100644 core/src/main/java/com/chwl/core/bean/EventSquareBean.java create mode 100644 core/src/main/java/com/chwl/core/bean/GiftTitleInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/I18N.kt create mode 100644 core/src/main/java/com/chwl/core/bean/IRouterData.kt create mode 100644 core/src/main/java/com/chwl/core/bean/LoginTipsInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/PrivateChatLimitInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/ProgressInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/RegionBean.kt create mode 100644 core/src/main/java/com/chwl/core/bean/RoomHistoryInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/RoomMicInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/RoomNewbieInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/RoomNewbieMessageInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/RoomQueueInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/UserInfoItem.java create mode 100644 core/src/main/java/com/chwl/core/bean/VersionInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/attachmsg/RoomQueueMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/bean/game/GameConfigBean.kt create mode 100644 core/src/main/java/com/chwl/core/bean/game/GameModeBean.kt create mode 100644 core/src/main/java/com/chwl/core/bean/game/GameResultBean.kt create mode 100644 core/src/main/java/com/chwl/core/bean/game/GameRoomData.kt create mode 100644 core/src/main/java/com/chwl/core/bean/game/GameRoomInfo.kt create mode 100644 core/src/main/java/com/chwl/core/bean/game/SudGameConfigBean.kt create mode 100644 core/src/main/java/com/chwl/core/bean/response/BeanResult.kt create mode 100644 core/src/main/java/com/chwl/core/bean/response/JsonServiceResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/ListResult.kt create mode 100644 core/src/main/java/com/chwl/core/bean/response/RequestError.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/ResponseData.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/ServiceResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/ActionDialogResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/AttentionListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/AuctionInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/AuctionListUserInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/AuctionUserListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/AuctionUserResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/BoolApiResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/BooleanResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/ChargeListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/CheckLostUserResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/ExchangeInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/ExchangerInfo.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/FaceResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/FansListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/GiftInfosResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/GiftRecieveInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/GiftResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/GiftWallListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/GoBackResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/IdQueryUserInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/InitResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/IntegerResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/LoginResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/MultiGiftRecieveInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/RedDrawListInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/RedPacketResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/RegisterResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/RequestChargeResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/RoomConsumeInfoListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/RoomRewardResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/ShareRedPacketResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/TabResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/TicketResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/UserListResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/UserResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/VersionsResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/response/result/WalletInfoResult.java create mode 100644 core/src/main/java/com/chwl/core/bean/room/BaseRoomInfo.kt create mode 100644 core/src/main/java/com/chwl/core/bean/room/RoomMicBean.kt create mode 100644 core/src/main/java/com/chwl/core/bean/room/RoomMicUserInfo.kt create mode 100644 core/src/main/java/com/chwl/core/bills/BillModel.java create mode 100644 core/src/main/java/com/chwl/core/bills/IBillModel.java create mode 100644 core/src/main/java/com/chwl/core/bills/IRadishGiftModel.java create mode 100644 core/src/main/java/com/chwl/core/bills/RadishGiftModel.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/BillItemEntity.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/BillType.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/ExpendInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/ExpendListInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/IncomeInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/IncomeListInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/NobleBillListInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/RadishGiftInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/RadishGiftListInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/RadishRecordInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/RadishRecordListInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/RedBagInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/RedBagListInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/TextInfos.java create mode 100644 core/src/main/java/com/chwl/core/bills/bean/TimeInfo.java create mode 100644 core/src/main/java/com/chwl/core/bills/result/ChargeResult.java create mode 100644 core/src/main/java/com/chwl/core/bills/result/ExpendResult.java create mode 100644 core/src/main/java/com/chwl/core/bills/result/IncomedResult.java create mode 100644 core/src/main/java/com/chwl/core/bills/result/RadishGiftResult.java create mode 100644 core/src/main/java/com/chwl/core/bills/result/RedBagResult.java create mode 100644 core/src/main/java/com/chwl/core/certification/CertificationModel.java create mode 100644 core/src/main/java/com/chwl/core/certification/ICertificationModel.java create mode 100644 core/src/main/java/com/chwl/core/certification/event/CertificationResultEvent.java create mode 100644 core/src/main/java/com/chwl/core/channel/ChannelModel.java create mode 100644 core/src/main/java/com/chwl/core/channel/IChannelModel.java create mode 100644 core/src/main/java/com/chwl/core/community/UserVo.kt create mode 100644 core/src/main/java/com/chwl/core/contacts/ContactModel.java create mode 100644 core/src/main/java/com/chwl/core/contacts/IContactModel.java create mode 100644 core/src/main/java/com/chwl/core/contacts/MyConstant.java create mode 100644 core/src/main/java/com/chwl/core/decoration/DecorationInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/decoration/DecorationModel.kt create mode 100644 core/src/main/java/com/chwl/core/decoration/backgroud/BackgroundModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/backgroud/IBackgroundModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/backgroud/bean/BgInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/BaseDecoration.java create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/CurrencyType.java create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/DecorationStoreRouterType.java create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java create mode 100644 core/src/main/java/com/chwl/core/decoration/car/CarModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/car/ICarModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/car/bean/CarInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/headwear/IHeadwearModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/headwear/bean/ChatBubbleInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/headwear/bean/HeadWearInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/headwear/bean/UserCardWearInfo.java create mode 100644 core/src/main/java/com/chwl/core/decoration/headwear/throwable/HeadwearPulledOffShelvesException.java create mode 100644 core/src/main/java/com/chwl/core/decoration/nameplate/INamePlateModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/nameplate/NamePlateModel.java create mode 100644 core/src/main/java/com/chwl/core/decoration/nameplate/bean/NamePlateInfo.java create mode 100644 core/src/main/java/com/chwl/core/earn/bean/ClanHallMemberIncomeTotalInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/EarnRecordInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/GoldRecordInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/GoldToDiamondInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowTotalInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/HallVo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/bean/RoomTypeInfo.kt create mode 100644 core/src/main/java/com/chwl/core/earn/model/EarnModel.kt create mode 100644 core/src/main/java/com/chwl/core/exception/ErrorThrowable.java create mode 100644 core/src/main/java/com/chwl/core/exception/FailReasonException.java create mode 100644 core/src/main/java/com/chwl/core/exception/NullDataException.java create mode 100644 core/src/main/java/com/chwl/core/exception/UnKnowException.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/BillDateDivInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/CustomServiceInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyCustomServiceInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyGameInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyGroupInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyManageItemInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyMemberInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FamilyPlazaInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/FindBannerInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/HomeBannerInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/HomeTitleInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/TransactionRecordInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/VMBillItemInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/RankingFamilyInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/RespFamilyGameList.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/RespFamilyRankList.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/familyPlaza/RespFamily.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/memberList/RespFamilymember.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/FamilyMoneyManagementInfo.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/MonthlyRecord.java create mode 100644 core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/TradeMoneyRecord.java create mode 100644 core/src/main/java/com/chwl/core/family/event/FamilyCurrencyUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/family/event/FamilyMemberUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/family/event/FamilyMineEvent.java create mode 100644 core/src/main/java/com/chwl/core/family/event/FamilyUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/family/model/FamilyModel.java create mode 100644 core/src/main/java/com/chwl/core/family/model/IFamilyModel.java create mode 100644 core/src/main/java/com/chwl/core/fansteam/FansTeamModel.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInfo.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInitInfo.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinInfo.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinedInfo.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/FansTeamMsgInfo.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/FansTeamTaskInfo.kt create mode 100644 core/src/main/java/com/chwl/core/fansteam/bean/PrivilegeConfigVo.kt create mode 100644 core/src/main/java/com/chwl/core/file/FileModel.java create mode 100644 core/src/main/java/com/chwl/core/file/IFileModel.java create mode 100644 core/src/main/java/com/chwl/core/file/cos/CosClient.kt create mode 100644 core/src/main/java/com/chwl/core/file/cos/CosCredentialProvider.kt create mode 100644 core/src/main/java/com/chwl/core/file/cos/CosException.kt create mode 100644 core/src/main/java/com/chwl/core/file/cos/CosToken.kt create mode 100644 core/src/main/java/com/chwl/core/game_team/GameTeamRecordBean.kt create mode 100644 core/src/main/java/com/chwl/core/game_team/UserGameTeamInfo.kt create mode 100644 core/src/main/java/com/chwl/core/gift/ChargeListener.java create mode 100644 core/src/main/java/com/chwl/core/gift/GiftModel.java create mode 100644 core/src/main/java/com/chwl/core/gift/IGiftCore.java create mode 100644 core/src/main/java/com/chwl/core/gift/IGiftCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/gift/IGiftModel.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BonsellaJoinAttack.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomInfoAward.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomInfoRank.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomMsgAnimBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardBean.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardList.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomMsgDialogBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BoomMsgExpPushBean.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BravoGiftMsgNotifyBean.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardTipsBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/BravoNoticeInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/EventUserConfig.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftEffectInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftFileInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftFreeInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftKnapInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftList.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftLuckyBag.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftMultiReceiverInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftPanelInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftReceiveInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftReceiver.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftSendType.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftSource.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftTab.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/GiftType.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyBagGift.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyBagGifts.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyBagGold.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyBagNoticeInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyBagNumber.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyBagViewOthers.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyGiftList.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgAllBean.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgSelfBean.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MsgConfirmEntity.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MsgConfirmStyleBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalChangeEntity.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalNotifyEntity.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MsgEventStartNotifyEntity.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MsgSuperLuckyGift.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/MultiGiftReceiveInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomBgChangeBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomBgInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomBgInfoItem.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomLevelChangeBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomLevelInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomMicDress.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomPicScreenBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomCpBean.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/SendGiftScenes.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/Sender.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/ShowAvatarType.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/SimpleUserInfo.kt create mode 100644 core/src/main/java/com/chwl/core/gift/bean/SimpleVipInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/GiftComboEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/HideCarEffectEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/NotifyEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/RoomFreeGiftEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/UpdateKnapEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftDataEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftNumEvent.java create mode 100644 core/src/main/java/com/chwl/core/gift/exception/GiftOutOfDateException.java create mode 100644 core/src/main/java/com/chwl/core/gift/toolbox/GiftToolbox.java create mode 100644 core/src/main/java/com/chwl/core/helper/AtProxy.java create mode 100644 core/src/main/java/com/chwl/core/helper/ImHelperUtils.java create mode 100644 core/src/main/java/com/chwl/core/helper/NetViewModel.java create mode 100644 core/src/main/java/com/chwl/core/home/IHomeTabMapView.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/BannerInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/ClientResource.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/CollectionRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/ConfigAppUI.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/ConfigInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/CurrentResourceInfo.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/FeedbackConfigBean.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/FeedbackTypeBean.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/FillVo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/HomeConcernsInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/HomeRankBean.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/HomeRoomCardInfo.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/HomeRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/HomeTabMapInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/HomeTagInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/MainTabInfo.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/MainTabType.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/MicUsersBean.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/ResourceInfo.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/StarUser.kt create mode 100644 core/src/main/java/com/chwl/core/home/bean/TabInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/TagListInfo.java create mode 100644 core/src/main/java/com/chwl/core/home/bean/VisitorInfo.kt create mode 100644 core/src/main/java/com/chwl/core/home/event/FollowRoomEvent.java create mode 100644 core/src/main/java/com/chwl/core/home/event/OpenRoomMessageInputEvent.kt create mode 100644 core/src/main/java/com/chwl/core/home/event/ShareRoomEvent.java create mode 100644 core/src/main/java/com/chwl/core/home/event/VisitorUnreadCountEvent.java create mode 100644 core/src/main/java/com/chwl/core/home/model/CollectionRoomModel.java create mode 100644 core/src/main/java/com/chwl/core/home/model/CommunityNoticeModel.java create mode 100644 core/src/main/java/com/chwl/core/home/model/GameHomeModel.java create mode 100644 core/src/main/java/com/chwl/core/home/model/HomeModel.kt create mode 100644 core/src/main/java/com/chwl/core/home/model/ICommunityNoticeModel.java create mode 100644 core/src/main/java/com/chwl/core/im/CustomNotifyType.java create mode 100644 core/src/main/java/com/chwl/core/im/GreetModel.java create mode 100644 core/src/main/java/com/chwl/core/im/RefreshInRoomListEvent.java create mode 100644 core/src/main/java/com/chwl/core/im/avroom/IAVRoomCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxHelper.java create mode 100644 core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxModel.java create mode 100644 core/src/main/java/com/chwl/core/im/chatterbox/HideInputEvent.java create mode 100644 core/src/main/java/com/chwl/core/im/chatterbox/IChatterBoxModel.java create mode 100644 core/src/main/java/com/chwl/core/im/chatterbox/bean/CanSendInfo.java create mode 100644 core/src/main/java/com/chwl/core/im/chatterbox/bean/TopicBoxItemInfo.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/AttachManager.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/ActivityTimerAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/AssistantAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/AuctionAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/BoomMsgAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftNotifyAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftRewardAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CarAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldSecondLevelAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldThirdLevelAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/ChatHintAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxInitAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CleanScreenAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CpInviteAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/DatingAllNotifyAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/DatingAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/DatingPublishAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/DiceThrowAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/DrawGiftAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/FaceAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/FairyMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/FairySendAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/FansTeamMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndMsgBean.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GameMatchFailedAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GameQueueChangedAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteMsgBean.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceNotifyAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GiftAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GiftBatchAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundMsgBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/HeadlineChangedAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/ImTipAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingFamilyAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingMiniWorldAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingRoomAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingTeamAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldNoticeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/LevelUpAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/LevelUpNoticeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/LotteryAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/LuckyGiftNotifyAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyTipsAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MagicAllMicAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MagicAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MagicBatchAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MatchAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MatchTicketAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MonsterAttackAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MonsterHuntingResultAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MonsterStatusAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MsgConfirmMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeConfirmAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeNotifyAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MsgEventStartNotifyAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MultiGiftAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/MultiLuckyGiftAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/NewbieHelloAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/NobleAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/NoticeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Attachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Info.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/OpenRoomNotiAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/OpenSignInAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/P2PContactRechargeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/PlayEffectInfo.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RedPackageAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RedPackageLuckyBagAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RedPackageRoomMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RedPacketAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RequestUpmicAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RewardBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumMsgInfo.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomBgChangeMsgAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeInfo.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment2.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftMsgBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomGiftValueAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomInfoAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansInfo.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomLevelChangeMsgAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaMsgBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomNoticeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomPKAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomPhoto.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomPicScreenMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomPkBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomRankAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomRankMsgBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomReceivedLuckyGiftAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomSerialValueChangedAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyMsgBean.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomTipAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RoomUserEnterRoomMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankMsgBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/SkillMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/SysMsgAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/SysMsgV2Attachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/SysMsgVoiceAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/TarotAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/TarotMsgBean.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessage.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessageAttachment.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/User.kt create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/VipMessageAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleSayHiAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleShakeHeartAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/custom/bean/WelcomeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/im/friend/IIMFriendCore.java create mode 100644 core/src/main/java/com/chwl/core/im/friend/IMFriendModel.java create mode 100644 core/src/main/java/com/chwl/core/im/login/IIMLoginClient.java create mode 100644 core/src/main/java/com/chwl/core/im/login/IIMLoginCore.java create mode 100644 core/src/main/java/com/chwl/core/im/notification/INotificationCore.java create mode 100644 core/src/main/java/com/chwl/core/im/notification/INotificationCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/im/room/IIMRoomCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/im/state/IPhoneCallStateModel.java create mode 100644 core/src/main/java/com/chwl/core/im/state/PhoneCallStateModel.java create mode 100644 core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCore.java create mode 100644 core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/initial/IInitialModel.java create mode 100644 core/src/main/java/com/chwl/core/initial/InitialModel.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/BoxInfo.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/FaceComponent.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/FairyOpenInfo.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/InitInfo.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/NobleResourceComponent.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/RedEnvelopeConfig.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/SplashComponent.java create mode 100644 core/src/main/java/com/chwl/core/initial/bean/TaxInfo.java create mode 100644 core/src/main/java/com/chwl/core/interceptor/MyOkHttpRetryInterceptor.java create mode 100644 core/src/main/java/com/chwl/core/interceptor/NoParamsInterceptor.java create mode 100644 core/src/main/java/com/chwl/core/interceptor/ParamsInterceptor.java create mode 100644 core/src/main/java/com/chwl/core/interceptor/PathFilter.java create mode 100644 core/src/main/java/com/chwl/core/interceptor/TimeSyncInterceptor.kt create mode 100644 core/src/main/java/com/chwl/core/kick/IKickModel.java create mode 100644 core/src/main/java/com/chwl/core/kick/KickModel.java create mode 100644 core/src/main/java/com/chwl/core/level/UserLevelResourceType.java create mode 100644 core/src/main/java/com/chwl/core/level/UserLevelVo.java create mode 100644 core/src/main/java/com/chwl/core/level/event/CharmLevelUpEvent.java create mode 100644 core/src/main/java/com/chwl/core/level/event/LevelUpEvent.java create mode 100644 core/src/main/java/com/chwl/core/linked/ILinkedModel.java create mode 100644 core/src/main/java/com/chwl/core/linked/LinkedModel.java create mode 100644 core/src/main/java/com/chwl/core/linked/bean/LinkedInfo.java create mode 100644 core/src/main/java/com/chwl/core/linked/event/LinkMeInfoUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyInfo.java create mode 100644 core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyRecordsInfo.java create mode 100644 core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/magic/IMagicModel.java create mode 100644 core/src/main/java/com/chwl/core/magic/MagicModel.java create mode 100644 core/src/main/java/com/chwl/core/magic/ObjectPool.java create mode 100644 core/src/main/java/com/chwl/core/magic/bean/MagicInfo.java create mode 100644 core/src/main/java/com/chwl/core/magic/bean/MagicMultiReceiverInfo.java create mode 100644 core/src/main/java/com/chwl/core/magic/bean/MagicReceivedInfo.java create mode 100644 core/src/main/java/com/chwl/core/magic/bean/MagicReceiver.java create mode 100644 core/src/main/java/com/chwl/core/magic/bean/MultiMagicReceivedInfo.java create mode 100644 core/src/main/java/com/chwl/core/magic/exception/MagicOutOfDateException.java create mode 100644 core/src/main/java/com/chwl/core/magic/toolbox/MagicToolbox.java create mode 100644 core/src/main/java/com/chwl/core/manager/AudioEngineManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/BaseEngine.java create mode 100644 core/src/main/java/com/chwl/core/manager/BaseMvpModel.java create mode 100644 core/src/main/java/com/chwl/core/manager/EngineType.java create mode 100644 core/src/main/java/com/chwl/core/manager/IAudioEngine.java create mode 100644 core/src/main/java/com/chwl/core/manager/IMBroadcastManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/IMMessageManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/IMSystemMsgManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/RelationShipEvent.java create mode 100644 core/src/main/java/com/chwl/core/manager/RoomEvent.java create mode 100644 core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt create mode 100644 core/src/main/java/com/chwl/core/manager/VolumeSetting.java create mode 100644 core/src/main/java/com/chwl/core/manager/agora/EngineEventHandler.java create mode 100644 core/src/main/java/com/chwl/core/manager/agora/RtcEngineHandler.java create mode 100644 core/src/main/java/com/chwl/core/manager/agora/RtcEngineManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/event/HallInfoChangeEvent.java create mode 100644 core/src/main/java/com/chwl/core/manager/event/HistoryMessageEvent.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/BaseAdapterImpl.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraHandlerInterface.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraInterface.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/IRTCEngine.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/IRTCEngineHandler.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/RoomIdHelper.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/SDKConfig.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/TRTCEffectManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/TRTCEngineAdapter.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/TRTCUtils.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineEventHandler.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineHandler.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineManager.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/Unsupport.java create mode 100644 core/src/main/java/com/chwl/core/manager/trtc/Version.java create mode 100644 core/src/main/java/com/chwl/core/market_verify/IMarketVerifyModel.java create mode 100644 core/src/main/java/com/chwl/core/market_verify/MarketVerifyModel.java create mode 100644 core/src/main/java/com/chwl/core/market_verify/bean/VersionConfig.java create mode 100644 core/src/main/java/com/chwl/core/market_verify/event/MarketVerifyUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/SimpleAnimationListener.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackInfo.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackReceiveInfo.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterDataBean.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterEvent.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHunter.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingResult.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingReward.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInfo.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInitInfo.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterListInfo.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterProtocol.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/manager/MonsterDataManager.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/model/IMonsterHuntingModel.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/model/MonsterHuntingModel.java create mode 100644 core/src/main/java/com/chwl/core/monsterhunting/rxevent/MonsterUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/msg/ImsgClient.java create mode 100644 core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgLayout.java create mode 100644 core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgModel.java create mode 100644 core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgParamKey.java create mode 100644 core/src/main/java/com/chwl/core/msg/sys/bean/ApproveMsgInfo.java create mode 100644 core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgComponent.java create mode 100644 core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgInfo.java create mode 100644 core/src/main/java/com/chwl/core/msg/sysv2/ErbanSysMsgV2Layout.java create mode 100644 core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Component.java create mode 100644 core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Info.java create mode 100644 core/src/main/java/com/chwl/core/newbie/bean/NewbieHelloInfo.java create mode 100644 core/src/main/java/com/chwl/core/newbie/event/NewbieHelloDialogEvent.java create mode 100644 core/src/main/java/com/chwl/core/noble/NobleConfig.txt create mode 100644 core/src/main/java/com/chwl/core/noble/NobleDataManager.java create mode 100644 core/src/main/java/com/chwl/core/noble/NobleResourceType.java create mode 100644 core/src/main/java/com/chwl/core/noble/NobleUtil.java create mode 100644 core/src/main/java/com/chwl/core/noble/bean/AllServiceGiftProtocol.java create mode 100644 core/src/main/java/com/chwl/core/noble/bean/NobleConfig.java create mode 100644 core/src/main/java/com/chwl/core/noble/bean/NobleInfo.java create mode 100644 core/src/main/java/com/chwl/core/noble/bean/NobleProtocol.java create mode 100644 core/src/main/java/com/chwl/core/noble/bean/NobleRight.java create mode 100644 core/src/main/java/com/chwl/core/patriarch/bean/LimitNotice.java create mode 100644 core/src/main/java/com/chwl/core/patriarch/event/CloseMinRoomEvent.java create mode 100644 core/src/main/java/com/chwl/core/patriarch/event/ImPushMsgPmLimitTimeEvent.java create mode 100644 core/src/main/java/com/chwl/core/patriarch/event/PmDismissAllLimitDialogEvent.java create mode 100644 core/src/main/java/com/chwl/core/patriarch/exception/PmRoomLimitException.java create mode 100644 core/src/main/java/com/chwl/core/pay/GoldGiveModel.java create mode 100644 core/src/main/java/com/chwl/core/pay/IGoldGiveModel.java create mode 100644 core/src/main/java/com/chwl/core/pay/IPayModel.java create mode 100644 core/src/main/java/com/chwl/core/pay/PayModel.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/Banner.kt create mode 100644 core/src/main/java/com/chwl/core/pay/bean/ChargeBannerInfo.kt create mode 100644 core/src/main/java/com/chwl/core/pay/bean/ChargeBean.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/ChargeChannelInfo.kt create mode 100644 core/src/main/java/com/chwl/core/pay/bean/FirstChargeGoods.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/FirstChargeReward.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/GiveGoldResult.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/GiveInfo.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/NewUserChargeInfo.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/PayRecordId.java create mode 100644 core/src/main/java/com/chwl/core/pay/bean/WalletInfo.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/ChargeCustomNotificationEvent.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/FirstChargeEvent.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/FirstRechargeEvent.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/GetWalletInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/NewUserChargeEvent.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/SendGoldSuccessEvent.java create mode 100644 core/src/main/java/com/chwl/core/pay/event/UpdateWalletInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/praise/IPraiseModel.java create mode 100644 core/src/main/java/com/chwl/core/praise/PraiseModel.java create mode 100644 core/src/main/java/com/chwl/core/praise/event/IsLikedEvent.java create mode 100644 core/src/main/java/com/chwl/core/praise/event/PraiseEvent.java create mode 100644 core/src/main/java/com/chwl/core/radish/IRadishModel.java create mode 100644 core/src/main/java/com/chwl/core/radish/RadishModel.java create mode 100644 core/src/main/java/com/chwl/core/radish/RadishRecordResult.java create mode 100644 core/src/main/java/com/chwl/core/radish/RadishWalletInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/event/RadishWalletInfoUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/radish/event/ReceivePrizeEvent.java create mode 100644 core/src/main/java/com/chwl/core/radish/event/SignInSuccessEvent.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/ISignInModel.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/SignInModel.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/DrawNoticeInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/ImNotice.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/ReceiveTotalRewardInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/ReplenishSignInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/Reward.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/RewardNoticeInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/SignDetailInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/SignDrawInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/signin/bean/SignInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/task/ITaskModel.java create mode 100644 core/src/main/java/com/chwl/core/radish/task/TaskModel.java create mode 100644 core/src/main/java/com/chwl/core/radish/task/bean/CheckNewUserTaskInfo.java create mode 100644 core/src/main/java/com/chwl/core/radish/task/bean/PrizeAnim.java create mode 100644 core/src/main/java/com/chwl/core/radish/task/bean/PrizeType.java create mode 100644 core/src/main/java/com/chwl/core/radish/task/bean/TaskInfo.java create mode 100644 core/src/main/java/com/chwl/core/realm/IRealmCore.java create mode 100644 core/src/main/java/com/chwl/core/recall/IRecallModel.java create mode 100644 core/src/main/java/com/chwl/core/recall/RecallModel.java create mode 100644 core/src/main/java/com/chwl/core/recall/bean/CheckLostUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/recall/bean/GoBackInfo.java create mode 100644 core/src/main/java/com/chwl/core/recall/event/CheckLostUserEvent.java create mode 100644 core/src/main/java/com/chwl/core/recall/event/GoBackEvent.java create mode 100644 core/src/main/java/com/chwl/core/redPacket/bean/ActionDialogInfo.java create mode 100644 core/src/main/java/com/chwl/core/redPacket/bean/RedDrawListInfo.java create mode 100644 core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfo.java create mode 100644 core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfoV2.java create mode 100644 core/src/main/java/com/chwl/core/redPacket/bean/ShareRedBagInfo.java create mode 100644 core/src/main/java/com/chwl/core/redPacket/event/GetRedInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/redpackage/RedPackageModel.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/RedPackageType.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeGiftItemVO.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeItemVO.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeRoomMsg.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeState.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeVO.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedPackageData.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedPackageInfo.kt create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedPackageLuckyBag.java create mode 100644 core/src/main/java/com/chwl/core/redpackage/bean/RedPackageNotifyInfo.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/CpBindUnbindEvent.java create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteDetailEntity.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteInfo.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/CpInvitePageEntity.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/CpMpApplyListEntity.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/CpRelation.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/CpTaskEntity.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/UserCpLevelMpEntity.kt create mode 100644 core/src/main/java/com/chwl/core/relation/cp/bean/UserCpListEntity.kt create mode 100644 core/src/main/java/com/chwl/core/retry/ImRetryManager.java create mode 100644 core/src/main/java/com/chwl/core/retry/ReconnectListener.java create mode 100644 core/src/main/java/com/chwl/core/retry/RetryChatRoomMessage.java create mode 100644 core/src/main/java/com/chwl/core/room/IRoomCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/room/activitytimer/ActivityTimerEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/activitytimer/TimerBean.java create mode 100644 core/src/main/java/com/chwl/core/room/anotherroompk/RoomPKModel.kt create mode 100644 core/src/main/java/com/chwl/core/room/anotherroompk/ShowGiftDialogEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/anotherroompk/ShowUserInfoDialogEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/anotherroompk/SimpleRoomInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/anotherroompk/SingleRoomPKModel.kt create mode 100644 core/src/main/java/com/chwl/core/room/auction/IAuctionCore.java create mode 100644 core/src/main/java/com/chwl/core/room/auction/IAuctionCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/room/auction/bean/AuctionInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/auction/bean/AuctionListUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/auction/bean/AuctionUser.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/AnchorInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/BoxSwitchVo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/BroadcastInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/CpListItem.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/DatingAllNotifyInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/DatingNotifyInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/DragonBarInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/FaceBean.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/FaceEntity.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/FaceTabBean.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/FindLoveSwitchVo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/HomeLiveTopInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/LeaveModeAttachment.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/MeCenterInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/OnlineChatMember.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RightBottomIconConfig.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomAudioSdkType.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomBoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomBoomInfoSign.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomContributeDataInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomContributeRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomContributeUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomIcon.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomInviteFansInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomListResult.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomMessageViewNoticeInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomModeType.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomOnlineUserBean.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourDataInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourMeInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourRankInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomRankMultiItem.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomResult.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomSettingTabInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/RoomWelcomeConfig.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/SearchRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/SeizeTreasureSwitchVo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/ShowUserInfoDialog.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/SimplePartyRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/SingleRoomSortInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/bean/UpMic.java create mode 100644 core/src/main/java/com/chwl/core/room/bean/WelcomeInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/core/RoomDataService.kt create mode 100644 core/src/main/java/com/chwl/core/room/dragonball/DragonBallModel.java create mode 100644 core/src/main/java/com/chwl/core/room/dragonball/IDragonBallModel.java create mode 100644 core/src/main/java/com/chwl/core/room/event/DatingSelectUserEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/EixtCountDownEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/FaceIsReadyEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/FinishAvRoomEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/MessageSizeEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/ReceiveFaceEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/RoomAtEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/RoomClearScreenEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/RoomExitEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/RoomInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/RoomShieldEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/RoomTaskTipsEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/event/SwitchRoomEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/exception/AntiSpamHitException.java create mode 100644 core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java create mode 100644 core/src/main/java/com/chwl/core/room/face/FaceInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/face/FaceListInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/face/FaceReceiveInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/face/IDynamicFaceModel.java create mode 100644 core/src/main/java/com/chwl/core/room/face/IFaceCore.java create mode 100644 core/src/main/java/com/chwl/core/room/face/IFaceCoreClient.java create mode 100644 core/src/main/java/com/chwl/core/room/face/SvgaFaceManager.kt create mode 100644 core/src/main/java/com/chwl/core/room/face/ZipDownloader.kt create mode 100644 core/src/main/java/com/chwl/core/room/game/GameModel.kt create mode 100644 core/src/main/java/com/chwl/core/room/game/GameStatus.java create mode 100644 core/src/main/java/com/chwl/core/room/game/bean/BaiShunGameConfig.kt create mode 100644 core/src/main/java/com/chwl/core/room/game/bean/GameCfg.kt create mode 100644 core/src/main/java/com/chwl/core/room/game/bean/GameCodeInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/game/bean/GameInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/GiftValueModel.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/IGiftValueModel.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueCommonUpdate.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueData.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueNetData.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/bean/IndexGiftValue.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/bean/RoomGiftValue.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueFormat.java create mode 100644 core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueMrg.java create mode 100644 core/src/main/java/com/chwl/core/room/model/AvRoomModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/HomePartyModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/HomePartyUserListModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/MicQueueModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomCharmModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomContributeListModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomInviteFansModel.kt create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomInviteModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomRankModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/RoomSettingModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IAvRoomModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyUserListModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IMicQueueModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IRoomBaseModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IRoomCharmModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IRoomContributeListModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IRoomInviteModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IRoomRankModel.java create mode 100644 core/src/main/java/com/chwl/core/room/model/inteface/IRoomSettingModel.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/attachment/RoomPkAttachment.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKMemberInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKQueuingMicMemberInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKRecordInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKRecordListInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKRespQueuingMicListInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKTeamInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/PKTeamMember.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/RoomPKInvitedUpMicMember.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/RoomPkData.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/request/CreatePKMember.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/bean/response/RespPKData.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/event/PKDataUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/event/PKStateEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/event/PKTimeFinishEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/event/PKTimeTickEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/model/IPkModel.java create mode 100644 core/src/main/java/com/chwl/core/room/pk/model/PkModel.java create mode 100644 core/src/main/java/com/chwl/core/room/queue/bean/ConsumeInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/queue/bean/RoomConsumeInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/attachment/QueuingMicAttachment.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/bean/GroupType.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicMemeberInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/bean/RespQueuingMicListInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/event/HasAnimationEffect.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicEmptyEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicNotEmptyEvent.java create mode 100644 core/src/main/java/com/chwl/core/room/recommendpos/IRecommendCardModel.java create mode 100644 core/src/main/java/com/chwl/core/room/recommendpos/RecommendCardModel.java create mode 100644 core/src/main/java/com/chwl/core/room/recommendpos/bean/RcmdCardType.java create mode 100644 core/src/main/java/com/chwl/core/room/recommendpos/bean/RecommendCard.java create mode 100644 core/src/main/java/com/chwl/core/room/treasure_box/bean/BoxRankingInfo.java create mode 100644 core/src/main/java/com/chwl/core/room/treasure_box/bean/TreasureRankingInfo.kt create mode 100644 core/src/main/java/com/chwl/core/room/treasure_box/event/RefreshBoxRankingEvent.java create mode 100644 core/src/main/java/com/chwl/core/set/bean/ShieldInfo.kt create mode 100644 core/src/main/java/com/chwl/core/set/model/SetModel.kt create mode 100644 core/src/main/java/com/chwl/core/settings/ISettingsModel.java create mode 100644 core/src/main/java/com/chwl/core/settings/SettingsModel.java create mode 100644 core/src/main/java/com/chwl/core/settings/bean/SysAccount.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/InAppSharingFamilyInfo.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/InAppSharingInfo.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/InAppSharingMiniWorldInfo.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/InAppSharingRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/InAppSharingTeamInfo.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/SessionType.java create mode 100644 core/src/main/java/com/chwl/core/share/bean/ShareCommonInfo.java create mode 100644 core/src/main/java/com/chwl/core/skill/entity/SkillNotifyEntity.kt create mode 100644 core/src/main/java/com/chwl/core/skill/entity/SkillPostServerEntity.kt create mode 100644 core/src/main/java/com/chwl/core/skill/entity/SkillPropertyEntity.kt create mode 100644 core/src/main/java/com/chwl/core/skill/entity/SkillRecordEntity.kt create mode 100644 core/src/main/java/com/chwl/core/skill/entity/SkillTypeEntity.kt create mode 100644 core/src/main/java/com/chwl/core/skill/event/SkillEvent.java create mode 100644 core/src/main/java/com/chwl/core/sound/model/SoundModel.kt create mode 100644 core/src/main/java/com/chwl/core/statistic/StatLogKey.java create mode 100644 core/src/main/java/com/chwl/core/statistic/protocol/StatisticsProtocol.java create mode 100644 core/src/main/java/com/chwl/core/support/config/Constants.kt create mode 100644 core/src/main/java/com/chwl/core/support/listener/ListenerOwner.kt create mode 100644 core/src/main/java/com/chwl/core/support/listener/ListenerStore.kt create mode 100644 core/src/main/java/com/chwl/core/support/listener/SafeListenerOwner.kt create mode 100644 core/src/main/java/com/chwl/core/support/listener/SimpleListenerOwner.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/AudioRoomContext.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/FrameLayoutRoomWidget.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/RoomAbility.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/RoomContext.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/RoomService.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/RoomView.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/RoomWidget.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/lifecycle/RoomFullLifecycleObserver.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycle.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleObserver.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleOwner.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleRegistry.kt create mode 100644 core/src/main/java/com/chwl/core/support/room/lifecycle/rx/RoomRxLifecycleEvent.java create mode 100644 core/src/main/java/com/chwl/core/team/bean/RespTeamMemberInfo.java create mode 100644 core/src/main/java/com/chwl/core/team/bean/TeamEvent.java create mode 100644 core/src/main/java/com/chwl/core/team/bean/TeamInfo.java create mode 100644 core/src/main/java/com/chwl/core/team/bean/TeamMemberInfo.java create mode 100644 core/src/main/java/com/chwl/core/team/bean/TeamTransactionInfo.java create mode 100644 core/src/main/java/com/chwl/core/team/bean/TeamTransactionRecordInfo.java create mode 100644 core/src/main/java/com/chwl/core/team/model/ITeamModel.java create mode 100644 core/src/main/java/com/chwl/core/team/model/TeamModel.java create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/TreasureFairyModel.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/Compound.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/DrawInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/ExchangeGiftInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/FairyInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/FairyMsgInfoBean.java create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/FairyResolveParam.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/FairyTestParam.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/ForestInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/MyFairyInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/PrizeInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/PropItemInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/ResolveInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/SendFairyInfo.kt create mode 100644 core/src/main/java/com/chwl/core/treasurefairy/bean/TestFairyRecordInfo.kt create mode 100644 core/src/main/java/com/chwl/core/user/AttentionModel.java create mode 100644 core/src/main/java/com/chwl/core/user/IAttentionModel.java create mode 100644 core/src/main/java/com/chwl/core/user/IUserDynamicModel.java create mode 100644 core/src/main/java/com/chwl/core/user/IUserModel.java create mode 100644 core/src/main/java/com/chwl/core/user/UserDynamicModel.java create mode 100644 core/src/main/java/com/chwl/core/user/UserInfoUiMgr.java create mode 100644 core/src/main/java/com/chwl/core/user/UserModel.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/AttentionInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/AttentionItem.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/BaseInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/DiamondGiveHistoryInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/EffectType.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/FansInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/FansListInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/FirstChargeInfo.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfoSub.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/GiftAchievementItem.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/GiftWallInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/InviteUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/JoinWorldInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/LiveSkillVoListBean.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/LiveTagInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/MedalBean.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/NameplateInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/NewUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/ProtocolInfo.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/RadishWallInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/RegionInfoBean.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/SearchUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/SimpleUserInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserBgVO.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserDetailMedalInfo.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserGameInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserInfoSkillEntity.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserLabelInfo.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserLabelItemInfo.kt create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserMineInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserPhoto.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserRandomConfig.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserRankInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/bean/UserRecommendRoomInfo.java create mode 100644 core/src/main/java/com/chwl/core/user/event/BravoCoinAnimEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteFailEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/LoadLoginUserInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/LoginUserInfoUpdateEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/NeedBindPhoneEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/NeedCompleteInfoEvent.java create mode 100644 core/src/main/java/com/chwl/core/user/event/ShowMeEvent.kt create mode 100644 core/src/main/java/com/chwl/core/utils/APIEncryptUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/ActivityUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/AsyncTaskScanMusicFile.java create mode 100644 core/src/main/java/com/chwl/core/utils/BitmapUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/CheckUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/ComboUtil.kt create mode 100644 core/src/main/java/com/chwl/core/utils/CoreLogger.java create mode 100644 core/src/main/java/com/chwl/core/utils/CoreTextUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/CurrentTimeUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/DialogUtil.kt create mode 100644 core/src/main/java/com/chwl/core/utils/DirectoryHelper.java create mode 100644 core/src/main/java/com/chwl/core/utils/ExtensionUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/ExtensionUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/IConnectivityClient.java create mode 100644 core/src/main/java/com/chwl/core/utils/IConnectivityCore.java create mode 100644 core/src/main/java/com/chwl/core/utils/IHandlerCore.java create mode 100644 core/src/main/java/com/chwl/core/utils/ImageSplitter.java create mode 100644 core/src/main/java/com/chwl/core/utils/ImgServiceUrlUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/IntentUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/LogUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/OaidUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/OldHttpErrorHandleUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/SharedPreferenceUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/SongUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/StarUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/StringFormatUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/SystemUidUtil.java create mode 100644 core/src/main/java/com/chwl/core/utils/TestLog.java create mode 100644 core/src/main/java/com/chwl/core/utils/Transformer.java create mode 100644 core/src/main/java/com/chwl/core/utils/UploadUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/WLog.kt create mode 100644 core/src/main/java/com/chwl/core/utils/extension/StringExtension.kt create mode 100644 core/src/main/java/com/chwl/core/utils/myutil/MyJsonUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/myutil/MySpanUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/myutil/MyTimeUtils.java create mode 100644 core/src/main/java/com/chwl/core/utils/myutil/MyUriUtils.kt create mode 100644 core/src/main/java/com/chwl/core/utils/myutil/MyUtil.kt create mode 100644 core/src/main/java/com/chwl/core/utils/myutil/TimeConstants.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/BalanceNotEnoughExeption.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/BeanObserver.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/DontWarnObserver.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/ErrorConsumer.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/FreezeException.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/IgnoreException.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/RadishNotEnoughException.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/RxExtension.kt create mode 100644 core/src/main/java/com/chwl/core/utils/net/RxHelper.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/ServerException.java create mode 100644 core/src/main/java/com/chwl/core/utils/net/VipLevelNotEnoughException.java create mode 100644 core/src/main/java/com/chwl/core/vip/VipBroadcastMsgEvent.kt create mode 100644 core/src/main/java/com/chwl/core/vip/VipModel.kt create mode 100644 core/src/main/java/com/chwl/core/vip/VipOpenEvent.kt create mode 100644 core/src/main/java/com/chwl/core/vip/VipUpgradeEvent.kt create mode 100644 core/src/main/java/com/chwl/core/vip/bean/UserVipInfo.kt create mode 100644 core/src/main/java/com/chwl/core/vip/bean/VipAuthInfo.kt create mode 100644 core/src/main/java/com/chwl/core/vip/bean/VipBroadcastInfo.kt create mode 100644 core/src/main/java/com/chwl/core/vip/bean/VipInfo.kt create mode 100644 core/src/main/java/com/chwl/core/vip/bean/VipMessageInfo.java create mode 100644 core/src/main/java/com/chwl/core/vip/bean/VipPageInfo.kt create mode 100644 core/src/main/java/com/chwl/core/vip/bean/VipRebateInfo.kt create mode 100644 core/src/main/java/com/chwl/core/web/bean/H5NotifyData.java create mode 100644 core/src/main/java/com/chwl/core/web/bean/WebJsBeanInfo.java create mode 100644 core/src/main/java/com/chwl/core/web/event/WebViewRefreshEvent.java create mode 100644 core/src/main/java/com/chwl/core/widget/img/MyCircleImageView.kt create mode 100644 core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridItemTouchListener.java create mode 100644 core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridLayoutManager.java create mode 100644 core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSmoothScroller.java create mode 100644 core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSnapHelper.java create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_aquarius.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_aries.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_cancer.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_capricorn.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_gemini.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_leo.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_libra.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_pisces.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_sagittarius.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_scorpio.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_taurus.webp create mode 100644 core/src/main/res/drawable-xhdpi/ic_constellation_virgo.webp create mode 100644 core/src/main/res/values-ar/strings.xml create mode 100644 core/src/main/res/values-tr/strings.xml create mode 100644 core/src/main/res/values-zh-rTW/strings.xml create mode 100644 core/src/main/res/values/attr.xml create mode 100644 core/src/main/res/values/strings.xml create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardBean.java create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardListResp.java create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/exception/NeedBindBankCardException.java create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/model/BankCardModel.java create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/model/IBankCardModel.java create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/view/IAddBankCardAgreementView.java create mode 100644 core/src/model_bank_card/java/com/chwl/core/bank_card/view/IBankCardView.java create mode 100644 core/src/model_channel_page/java/com/chwl/core/channel_page/bean/ChannelPageInfo.java create mode 100644 core/src/model_channel_page/java/com/chwl/core/channel_page/bean/HelloMessageInfo.kt create mode 100644 core/src/model_channel_page/java/com/chwl/core/channel_page/bean/NewUserHelloInfo.kt create mode 100644 core/src/model_channel_page/java/com/chwl/core/channel_page/model/ChannelPageModel.java create mode 100644 core/src/model_channel_page/java/com/chwl/core/channel_page/model/IChannelPageModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/CommunityConstant.java create mode 100644 core/src/model_community/java/com/chwl/core/community/IPublishModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/ImageUploadConfig.java create mode 100644 core/src/model_community/java/com/chwl/core/community/PublishModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java create mode 100644 core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/Comment.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/CommentResult.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/CommunityNoticeInfo.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/DyChangeData.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/DynamicMedia.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/MiniWorldChooseInfo.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/PublishBody.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/PublishItem.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/UnReadCountInfo.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/UserDynamicItem.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicBean.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicListResult.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/comment/PopupParams.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/comment/Reply.java create mode 100644 core/src/model_community/java/com/chwl/core/community/bean/comment/ReplyResult.java create mode 100644 core/src/model_community/java/com/chwl/core/community/dynamic/DynamicDetailModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/dynamic/DynamicModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicDetailModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/event/DynamicDetailFinishEvent.java create mode 100644 core/src/model_community/java/com/chwl/core/community/event/DynamicPublishEvent.java create mode 100644 core/src/model_community/java/com/chwl/core/community/event/DynamicRefreshEvent.java create mode 100644 core/src/model_community/java/com/chwl/core/community/event/SquareTaskEvent.java create mode 100644 core/src/model_community/java/com/chwl/core/community/event/UnReadCountEvent.java create mode 100644 core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java create mode 100644 core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java create mode 100644 core/src/model_community/java/com/chwl/core/community/square/ISquareModel.java create mode 100644 core/src/model_community/java/com/chwl/core/community/square/SquareModel.java create mode 100644 core/src/model_database_room/java/com/chwl/core/db/AppDataBase.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallNameModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallNameModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ApplyResult.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthListResult.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanAndHallInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/GroupListInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/H5FamilyInfo.kt create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamMember.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallMenuByUidResult.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/JoinRoomInfo.kt create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListHTeamMember.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListMemberInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/MemberInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OptionInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OwnerHallInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/RoleType.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminHall.kt create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminInfo.kt create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/UserClanInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/hall/event/UserHallUpdateEvent.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanAttachment.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanImMsgInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyAttachment.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyImMsgInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallAttachment.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallImMsgInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgComponent.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgLayout.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/IIncomeModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/IncomeModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanTotalIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallTotalIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeGiftInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeTotalInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveTotalIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomTotalIncomeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/income/event/UpdateMemberListEvent.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/ISecretCodeModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/SecretCodeModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/CheckCodeResult.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/SecretCodeInfo.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/HTeamModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/IHTeamModel.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamChatLimit.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamType.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamInfoUpdateInfoEvent.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamListChangeEvent.java create mode 100644 core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamMemberNumChangeEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionFourAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionOneAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionThreeAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionTwoAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringGrabApprenticesAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionFourAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionOneAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionThreeAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionTwoAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMissionTipsAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringSharingRoomAttachment.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesInfo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesMissionInfo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringRankingDataInfo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringResultMarqueeInfo.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringSharingRoomInfo.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringTipsInfo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringUserInfo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MissionVo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/PickUpApprenticeInfo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleGiftVo.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleUserVo.kt create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesDataEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingFinishEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringRelationshipMissionEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStartCountingEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStopCountingEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringSuccessEvent.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringAlreadyHasMasterException.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringCanNotPickUpApprenticeException.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringLessThanFiveMinutesException.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringMissionExpiredException.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/IMentoringRelationshipModel.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/MentoringRelationshipModel.java create mode 100644 core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/view/IMentoringRelationshipView.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyItem.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyListInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatMemberCountAttachment.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatTopicAttachment.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldCategoryInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithCurrentMember.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithMemberInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldEditClassifyInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInWorldInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldListInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainItemInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListMemberInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenAudioPartyAttachment.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenSuccessInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/bean/TopicInfo.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/AudioPartyOpenEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWChatTopicEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWGroupChatMemberEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWOpenAudioPartyEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldJoinVerifiedEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldStateChangedEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldTeamExitEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/event/OpenedMyMiniWorldEvent.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/model/IMiniWorldModel.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldHelper.java create mode 100644 core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/bean/BaseMusicInfo.java create mode 100644 core/src/model_music/java/com/chwl/core/music/bean/LocalMusicInfo.java create mode 100644 core/src/model_music/java/com/chwl/core/music/bean/ShareMusicInfo.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/bean/LocalMusicBean.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/bean/SongBean.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/converter/LocalMusicBeanConverter.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/converter/ShareMusicConverter.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/dao/LocalMusicDao.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/dao/SongDao.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/model/ILocalMusicDbModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/model/IPlayerDbModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/model/LocalMusicDbModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/db/model/PlayerDbModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/CurrentMusicUpdateEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/JumpToShareMusicListFragmentEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/MusicAddEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/MusicDeleteEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/MusicPauseEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/MusicPlayingEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/MusicStopEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/RefreshLocalMusicEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/event/RefreshPlayerListEvent.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/ILocalMusicListModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/IMusicListModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/IShareMusicListModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/LocalMusicListModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/MusicListModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/model/ShareMusicListModel.java create mode 100644 core/src/model_music/java/com/chwl/core/music/view/IAddLocalMusicListView.java create mode 100644 core/src/model_music/java/com/chwl/core/music/view/ILocalMusicListView.java create mode 100644 core/src/model_music/java/com/chwl/core/music/view/IMusicListView.java create mode 100644 core/src/model_music/java/com/chwl/core/music/view/IShareMusicListView.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitFriendsAttachment.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitMeAttachment.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitFriendsInfo.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitMeInfo.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallAitMeEvent.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallHistoryEvent.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgCountingDownEvent.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgIncomingEvent.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallPlayGiftAnimationEvent.java create mode 100644 core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt create mode 100644 core/src/model_smscode/java/com/chwl/core/code/CodeModel.java create mode 100644 core/src/model_smscode/java/com/chwl/core/code/CodeType.java create mode 100644 core/src/model_smscode/java/com/chwl/core/code/ICodeModel.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGCache.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGDecorator.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGListener.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSTAPPDecorator.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameConfigModel.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameViewInfoModel.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/state/MGStateResponse.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPAPPState.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPMGState.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/GameCommonStateUtils.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/ISudFSMStateHandleUtils.java create mode 100644 core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/SudJsonUtils.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/SaConstant.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/SuperAdminDataMrg.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/attachment/SuperAdminOpAttachment.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/bean/KickOutExtBean.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/bean/SaOpInfo.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/model/ISuperAdminModel.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/model/SuperAdminModel.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/model/exception/SAdminCannotGameException.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaAttachmentFactory.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaMsgUtil.java create mode 100644 core/src/model_super_admin/java/com.chwl.core.super_admin/util/SuperAdminUtil.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/BoxOpenStatusInfo.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/ConfigImgUrl.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourBuyKeyResultInfo.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourKeyInfo.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/KeyInfo.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxHonourResult.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxResult.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeInfo.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeNewInfo.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/UserTicketInfo.kt create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenBoxEvent.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenHonourBoxEvent.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/BoxBuyKeyEvent.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/HonourBoxBuyKeyEvent.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/BoxModel.java create mode 100644 core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/IBoxModel.java create mode 100644 core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/NewestVersionInfo.java create mode 100644 core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/UpgradeCache.java create mode 100644 core/src/model_upgrade_app/java/com/chwl/core/upgrade/event/ImPushUpdateAppEvent.java create mode 100644 core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/IUpgradeModel.java create mode 100644 core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/UpgradeModel.java diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..36af493 --- /dev/null +++ b/core/.gitignore @@ -0,0 +1,3 @@ +/build +*.iml +*.DS_Store \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..4dccc86 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,107 @@ +apply plugin: 'com.android.library' +apply plugin: 'realm-android' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-parcelize' + +android { + compileSdkVersion COMPILE_SDK_VERSION.toInteger() + defaultConfig { + minSdkVersion MIN_SDK_VERSION.toInteger() + targetSdkVersion TARGET_SDK_VERSION.toInteger() + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = '11' + } + + sourceSets { + main { + java.srcDirs = [ + 'src/main/java', + 'src/model_smscode/java', + 'src/model_public_chat_hall/java', + 'src/model_pay/java', + 'src/model_upgrade_app/java', + 'src/model_labour_union/java', + 'src/model_mentoring_relationship/java', + 'src/model_music/java', + 'src/model_database_room/java', + 'src/model_mini_world/java', + 'src/model_bank_card/java', + 'src/model_super_admin/java', + 'src/model_treasure_box/java', + 'src/model_community/java', + 'src/model_channel_page/java', + 'src/model_treasure_box/java', + 'src/model_sud_wrapper/java' + ] +// jniLibs.srcDirs = ['libs', 'umeng-app-libs/jniLibs'] + } + } + + buildToolsVersion = '30.0.3' + +} + +def Lombok = "1.18.24" + +dependencies { + api fileTree(dir: 'libs', include: ['*.jar']) + + api "com.orhanobut:logger:2.2.0" + + compileOnly "org.projectlombok:lombok:${Lombok}" + annotationProcessor "org.projectlombok:lombok:${Lombok}" + + api fileTree(dir: 'share-sdk-libs', include: ['*.jar']) + + // 声网 + api 'io.agora.rtc:voice-sdk:4.2.2' + + // core +// implementation 'com.liulishuo.okdownload:okdownload:1.0.4' + // provide sqlite to store breakpoints +// implementation 'com.liulishuo.okdownload:sqlite:1.0.4' + // provide okhttp to connect to backend +// implementation 'com.liulishuo.okdownload:okhttp:1.0.4' + // Room + api 'androidx.room:room-runtime:2.5.1' + annotationProcessor 'androidx.room:room-compiler:2.5.1' + // RxJava support for Room + api 'androidx.room:room-rxjava2:2.5.1' + + //firebase推送、统计 +// implementation 'com.google.firebase:firebase-messaging:23.1.1' +// implementation 'com.google.android.gms:play-services-base:18.1.0' +// implementation 'com.google.firebase:firebase-core:19.0.0' +// implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' + + api 'org.jetbrains.kotlin:kotlin-reflect:1.7.10' + + api project(':nim_uikit') + api project(':library') + +// implementation 'com.liulishuo.okdownload:okdownload:1.0.7' +// implementation 'com.liulishuo.okdownload:okhttp:1.0.7' + + implementation 'com.tencent.liteav:LiteAVSDK_TRTC:11.7.0.13946' + + api project(':modules:module_base') + + api 'tech.sud.mgp:SudMGP-static:1.5.2.1238' +} +repositories { + mavenCentral() +} diff --git a/core/proguard-rules.pro b/core/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/core/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml new file mode 100644 index 0000000..331e38e --- /dev/null +++ b/core/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/core/src/main/java/com/chwl/core/Constants.java b/core/src/main/java/com/chwl/core/Constants.java new file mode 100644 index 0000000..20d8a89 --- /dev/null +++ b/core/src/main/java/com/chwl/core/Constants.java @@ -0,0 +1,120 @@ +package com.chwl.core; + +import com.chwl.library.common.application.Env; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.pref.CommonPref; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +/** + *

常量集合

+ * Created by Administrator on 2017/11/9. + */ +public class Constants { + public static final String ERBAN_DIR_NAME = XConstants.XCHAT_DIR_NAME; + public static final String nimAppKey = Env.isDebug() ? + SdkConfig.INSTANCE.getNimKeyDebug() : SdkConfig.INSTANCE.getNimKeyRelease(); +// public static final String nimAppSecret = "da03b83af84a"; + /** + * 百度统计 + */ + + public static final String LOG_DIR = ERBAN_DIR_NAME + File.separator + "logs"; + public static final String CONFIG_DIR = ERBAN_DIR_NAME + File.separator + "config"; + public static final String VOICE_DIR = ERBAN_DIR_NAME + File.separator + "voice"; + public static final String CACHE_DIR = ERBAN_DIR_NAME + File.separator + "cache"; + public static final String HTTP_CACHE_DIR = ERBAN_DIR_NAME + File.separator + "http"; + public static final String IMAGE_CACHE_DIR = ERBAN_DIR_NAME + File.separator + "image"; + 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_HOME_HOT_SIZE = 12; + public static final int BILL_PAGE_SIZE = 50; + + public static final int DEBUG_MAX_UID = 100000; + + + public static final String HOME_TAB_INFO = "home_tab_info"; + public static final String KEY_USER_INFO = "key_user_info"; + + public static final String KEY_HOME_LIST = "key_home_list"; + public static final String KEY_HOME_HOT_LIST = "key_home_hot_list"; + public static final String KEY_HOME_NO_HOT_LIST = "key_home_no_hot_list"; + + public static final int FAN_MAIN_PAGE_TYPE = 100; + public static final int FAN_NO_MAIN_PAGE_TYPE = 101; + public static final String KEY_PAGE_TYPE = "page_type"; + public static final String KEY_MAIN_TAB_LIST = "main_tab_list"; + + public static final String KEY_POSITION = "position"; + + + public static final String CHARGE_UNION_PAY = "fastpay"; + + public static final int PAGE_TYPE_MAIN_FRAGMENT = 102; + + /** + * 房间相关Key设置 + */ + public static final String ROOM_UPDATE_KEY_POSTION = "micPosition"; + public static final String ROOM_UPDATE_KEY_UID = "micUid"; + public static final String ROOM_UPDATE_KEY_GENDER = "gender"; + + public static final String KEY_CHAT_ROOM_INFO_ROOM = "roomInfo"; + public static final String KEY_CHAT_ROOM_INFO_MIC = "micQueue"; + + public static final String ROOM_UID = "ROOM_UID"; + public static final String ROOM_TYPE = "ROOM_TYPE"; + public static final String ROOM_INFO = "ROOM_INFO"; + public static final String IS_ROOM_MIN = "is_room_min"; + public static final String IS_PARTY = "is_party"; + + /** + * 座驾版本第一次显示控制key + */ + public static final String SHOW_CAR_GUIDE = "show_car_guide"; + + public static final String NEW_USER_ICON = "https://image.zhongjialx.com/newUserIcon.png"; + + public static final String IS_SEND = "isSend"; + public static final String TOP_TITLE = "top_title"; + + public static final int CLIENT_ROLE_BROADCASTER = 1; + public static final int CLIENT_ROLE_AUDIENCE = 2; + + public static final int DRAGON_BAR_ID = XConstants.DRAGON_BALL_ID; + + 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(Env.KEY_ENVIRONMENT) == Env.EnvType.Debug.code) ? + XConstants.KEY_REFERER_DEBUG : XConstants.KEY_REFERER_RELEASE; + + //相亲模式男神坑位下标 + public static final List maleIndex = Arrays.asList(0, 1, 4, 5); + + public static final String GOOGLE = com.chwl.library.common.Constants.GOOGLE; + + public static final String ANDROID = "android"; + + //上传的图片 默认大小不能超过大小 640KB + public static final int UPLOAD_IMAGE_MAX_FILE_LENGTH = 640; + //上传的图片 默认宽高最大值 2340 + public static final int UPLOAD_IMAGE_MAX_SIZE = 2340; + //上传的gif 默认大小不能超过 1MB + public static final int UPLOAD_GIF_MAX_SIZE = 1 << 20; + + public static final String PHONE_LOGIN = "phone_login"; + + public static final String IS_SHOW_FREE_GIFT = "is_show_free_gift"; + +} diff --git a/core/src/main/java/com/chwl/core/DemoCache.java b/core/src/main/java/com/chwl/core/DemoCache.java new file mode 100644 index 0000000..6983050 --- /dev/null +++ b/core/src/main/java/com/chwl/core/DemoCache.java @@ -0,0 +1,346 @@ +package com.chwl.core; + +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.StatusBarNotificationConfig; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.auth.entity.AccountInfo; +import com.chwl.core.auth.entity.TicketInfo; +import com.chwl.core.home.bean.MainTabInfo; +import com.chwl.core.initial.bean.SplashComponent; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.core.noble.bean.NobleConfig; +import com.chwl.core.noble.bean.NobleRight; +import com.chwl.core.utils.CurrentTimeUtils; +import com.chwl.core.utils.SharedPreferenceUtils; +import com.chwl.library.utils.pref.ObjectPref; +import com.chwl.library.utils.pref.SettingsPref; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + + +/** + * Created by zhouxiangfeng on 2017/5/6. + */ + +public class DemoCache { + public static final String KEY_IS_FIRST_HOME_HIGH_PARTY_DIALOG = "IsFirstHomeHighPartyDialog"; + private static final String KEY_BOX_MESSAGE = "key_box_message"; + private static final String KEY_TICKET_INFO = "TicketInfo"; + private static final String KEY_ACCOUNT_INFO = "AccountInfo"; + private static final String KEY_FACE_LIST_INFO = "FaceListInfo"; + private static final String KEY_INIT_DATA = "InitInfo"; + private static final String KEY_INIT_DATA_SAVE_TIME = "InitInfoSavingTime"; + private static final String KEY_INIT_DATA_SPLASH_PICTURE = "InitInfoSplashPicture"; + private static final String KEY_INIT_DATA_SPLASH_DATA = "InitInfoSplashData"; + private static final String KEY_INIT_DATA_NOBLE_VERSION = "InitInfoNobleVersion"; + private static final String KEY_INIT_DATA_NOBLE_RIGHTS = "InitInfoNobleRights"; + private static final String KEY_INIT_DATA_NOBLE_CONFIGS = "InitInfoNobleConfigs"; + private static final String KEY_RED_PACKAGE = "RedPackage"; + private static final String KEY_AT_MSG_UUID = "AtMsgUuid"; + private static final String KEY_BGM_SINGLE_CYCLE = "key_bgm_single_cycle"; + private static final String KEY_SINGLE_ROOM_TIP = "key_single_room_tip"; + private static final String KEY_NEW_USER_GIFT = "key_new_user_gift"; + private static final String KEY_NEW_USER_CHARGE_GIFT = "key_new_user_charge_gift"; + private static final String KEY_MAIN_TAB_DATA = "key_main_tab_data"; + private static final String KEY_SPEEDY_MESSAGE_GONE_TIME = "SpeedyMessageGoneTime"; + private static final String KEY_ANCHOR_CARD_VIEW = "key_anchor_card_view"; + private static final String KEY_ANCHOR_CARD_VIEW_TIME = "key_anchor_card_view_time"; + private static final String KEY_LAUNCH_COUNT = "key_launch_count"; + private static final String KEY_RADISH_TIPS = "key_radish_tips"; + private static final String KEY_KICK_OUT_ROOM = "kick_out_room"; + private static final String KEY_BOUND_AUTH_CODE = "key_bound_auth_code"; + private static final String KEY_MY_FAIRY_INDEX = "key_my_fairy_index"; + + private static StatusBarNotificationConfig notificationConfig; + + public static Long readSpeedyMessageGoneTime() { + return (Long) ObjectPref.instance().get(KEY_SPEEDY_MESSAGE_GONE_TIME, 0L); + } + + public static void saveSpeedyMessageGoneTime(Long savingTime) { + ObjectPref.instance().put(KEY_SPEEDY_MESSAGE_GONE_TIME, savingTime); + } + + public static Map readNobleRights() { + String string = SettingsPref.instance().getString(KEY_INIT_DATA_NOBLE_RIGHTS, null); + if (TextUtils.isEmpty(string)) return null; + return new Gson().fromJson(string, + new TypeToken>() { + }.getType()); + } + + public static void saveNobleRights(String json) { + SettingsPref.instance().putString(KEY_INIT_DATA_NOBLE_RIGHTS, json); + } + + public static void saveNobleConfigs(String json) { + SettingsPref.instance().putString(KEY_INIT_DATA_NOBLE_CONFIGS, json); + } + + public static Map readNobleConfigs() { + String string = SettingsPref.instance().getString(KEY_INIT_DATA_NOBLE_CONFIGS, null); + if (TextUtils.isEmpty(string)) return null; + return new Gson().fromJson(string, + new TypeToken>() { + }.getType()); + } + + public static Map readRedPackage() { + String string = SettingsPref.instance().getString(KEY_RED_PACKAGE, null); + if (TextUtils.isEmpty(string)) return null; + return new Gson().fromJson(string, + new TypeToken>() { + }.getType()); + } + + public static void saveRedPackage(String id) { + Map map = readRedPackage(); + if (map == null) map = new HashMap<>(); + for (Iterator> it = map.entrySet().iterator(); it.hasNext(); ) { + if (CurrentTimeUtils.getCurrentTime() - it.next().getValue() > 60 * 60 * 24 * 7 * 1000) { + it.remove(); + } + } + map.put(id, CurrentTimeUtils.getCurrentTime()); + SettingsPref.instance().putString(KEY_RED_PACKAGE, new Gson().toJson(map)); + } + + public static Map readAtMsgUuid() { + String string = SettingsPref.instance().getString(KEY_AT_MSG_UUID, null); + if (TextUtils.isEmpty(string)) return null; + return new Gson().fromJson(string, + new TypeToken>() { + }.getType()); + } + + //云信聊天室云端历史消息最长保存10天,这里保存30天的应该够用了 + public static void saveAtMsgUuid(String id) { + Map map = readAtMsgUuid(); + if (map == null) map = new HashMap<>(); + for (Iterator> it = map.entrySet().iterator(); it.hasNext(); ) { + if (CurrentTimeUtils.getCurrentTime() - it.next().getValue() > 60 * 60 * 24 * 30 * 1000L) { + it.remove(); + } + } + map.put(id, CurrentTimeUtils.getCurrentTime()); + SettingsPref.instance().putString(KEY_AT_MSG_UUID, new Gson().toJson(map)); + } + + + public static void saveBoolean(String key, boolean value) { + SettingsPref.instance().putBoolean(key, value); + } + + public static Boolean readBoolean(String key, boolean defult) { + return SettingsPref.instance().getBoolean(key, defult); + } + + public static String readNobleVersion() { + return SettingsPref.instance().getString(KEY_INIT_DATA_NOBLE_VERSION); + } + + public static void saveNobleVersion(String version) { + SettingsPref.instance().putString(KEY_INIT_DATA_NOBLE_VERSION, version); + } + + public static String readSplashPicture() { + return SettingsPref.instance().getString(KEY_INIT_DATA_SPLASH_PICTURE); + } + + public static void saveSplashPicture(String path) { + SettingsPref.instance().putString(KEY_INIT_DATA_SPLASH_PICTURE, path); + } + + public static Long readInitInfoSavingTime() { + return (Long) ObjectPref.instance().get(KEY_INIT_DATA_SAVE_TIME, System.currentTimeMillis()); + } + + public static void saveInitInfoSavingTime(Long savingTime) { + ObjectPref.instance().put(KEY_INIT_DATA_SAVE_TIME, savingTime); + } + + public static SplashComponent readSplashInfo() { + return (SplashComponent) ObjectPref.instance().readObject(KEY_INIT_DATA_SPLASH_DATA); + } + + public static void saveSplashInfo(SplashComponent splashComponent) { + ObjectPref.instance().saveObject(KEY_INIT_DATA_SPLASH_DATA, splashComponent); + } + + public static InitInfo readInitInfo() { + return (InitInfo) ObjectPref.instance().readObject(KEY_INIT_DATA); + } + + public static void saveInitInfo(InitInfo initInfo) { + ObjectPref.instance().saveObject(KEY_INIT_DATA, initInfo); + } + + @Nullable + public static List readMainTabInfoList() { + String jsonString = String.valueOf(SharedPreferenceUtils.get(KEY_MAIN_TAB_DATA, "")); + if (TextUtils.isEmpty(jsonString)) return null; + return new Gson().fromJson(jsonString, + new TypeToken>() { + }.getType()); + } + + public static void saveMainTabInfoList(List tabInfoList) { + SharedPreferenceUtils.put(KEY_MAIN_TAB_DATA, new Gson().toJson(tabInfoList)); + } + + @Nullable + public static String readFaceList() { + return (String) ObjectPref.instance().get(KEY_FACE_LIST_INFO, null); + } + + public static void saveFaceList(String encrypt) { + ObjectPref.instance().put(KEY_FACE_LIST_INFO, encrypt); + } + + public static void saveCurrentAccountInfo(AccountInfo accountInfo) { + ObjectPref.instance().saveObject(KEY_ACCOUNT_INFO, accountInfo); + } + + public static AccountInfo readCurrentAccountInfo() { + return (AccountInfo) ObjectPref.instance().readObject(KEY_ACCOUNT_INFO); + } + + public static void saveTicketInfo(TicketInfo ticketInfo) { + ObjectPref.instance().saveObject(KEY_TICKET_INFO, ticketInfo); + } + + public static TicketInfo readTicketInfo() { + return (TicketInfo) ObjectPref.instance().readObject(KEY_TICKET_INFO); + } + + public static StatusBarNotificationConfig getNotificationConfig() { + return notificationConfig; + } + + public static void setNotificationConfig(StatusBarNotificationConfig notificationConfig) { + DemoCache.notificationConfig = notificationConfig; + } + + public static void saveNeedBoxMsg(boolean value) { + SettingsPref.instance().putBoolean(KEY_BOX_MESSAGE + AuthModel.get().getCurrentUid(), value); + } + + public static Boolean readNeedBoxMsg() { + return SettingsPref.instance().getBoolean(KEY_BOX_MESSAGE + AuthModel.get().getCurrentUid(), true); + } + + public static void saveBgmSingleCycle(boolean value) { + SettingsPref.instance().putBoolean(KEY_BGM_SINGLE_CYCLE, value); + } + + public static Boolean readBgmSingleCycle() { + return SettingsPref.instance().getBoolean(KEY_BGM_SINGLE_CYCLE, false); + } + + public static void saveSingleRoomTip(boolean value) { + SettingsPref.instance().putBoolean(KEY_SINGLE_ROOM_TIP, value); + } + + public static Boolean readSingleRoomTip() { + return SettingsPref.instance().getBoolean(KEY_SINGLE_ROOM_TIP, true); + } + + public static void saveNewUserGift(boolean value) { + SettingsPref.instance().putBoolean(KEY_NEW_USER_GIFT, value); + } + + public static boolean readNewUserGift() { + return SettingsPref.instance().getBoolean(KEY_NEW_USER_GIFT, true); + } + + /** + * @param value 0初始值 1 需要弹窗 2 不需要弹窗 + */ + public static void saveNewUserChargeGift(int value) { + SettingsPref.instance().putInt(KEY_NEW_USER_CHARGE_GIFT, value); + } + + public static int readNewUserChargeGift() { + return SettingsPref.instance().getInt(KEY_NEW_USER_CHARGE_GIFT, 0); + } + + /** + * @param value 0初始值 1 显示首次弹窗 2 非首次弹窗,需要判断时间再显示 + */ + public static void saveAnchorCardView(int value) { + SettingsPref.instance().putInt(KEY_ANCHOR_CARD_VIEW, value); + if (value == 2) { + SettingsPref.instance().putLong(KEY_ANCHOR_CARD_VIEW_TIME, CurrentTimeUtils.getCurrentTime()); + } + } + + public static int readAnchorCardView() { + return SettingsPref.instance().getInt(KEY_ANCHOR_CARD_VIEW, 0); + } + + public static long readAnchorCardViewTime() { + return SettingsPref.instance().getLong(KEY_ANCHOR_CARD_VIEW_TIME, 0); + } + + public static void saveLaunchCount() { + SettingsPref.instance().putInt(KEY_LAUNCH_COUNT, readLaunchCount() + 1); + } + + public static int readLaunchCount() { + return SettingsPref.instance().getInt(KEY_LAUNCH_COUNT, -1); + } + + public static void saveRadishTips(boolean value) { + SettingsPref.instance().putBoolean(KEY_RADISH_TIPS, value); + } + + public static boolean readRadishTips() { + return SettingsPref.instance().getBoolean(KEY_RADISH_TIPS, true); + } + + @Nullable + public static Map readKickOutRoom() { + String string = SettingsPref.instance().getString(KEY_KICK_OUT_ROOM + AuthModel.get().getCurrentUid(), null); + if (TextUtils.isEmpty(string)) return null; + return new Gson().fromJson(string, + new TypeToken>() { + }.getType()); + } + + public static void saveKickOutRoom(String roomUid) { + Map map = readKickOutRoom(); + if (map == null) map = new HashMap<>(); + for (Iterator> it = map.entrySet().iterator(); it.hasNext(); ) { + if (CurrentTimeUtils.getCurrentTime() - it.next().getValue() > XConstants.KICK_OUT_ROOM_LIMIT_ENTER_TIME) { + it.remove(); + } + } + map.put(roomUid, CurrentTimeUtils.getCurrentTime()); + SettingsPref.instance().putString(KEY_KICK_OUT_ROOM + AuthModel.get().getCurrentUid(), new Gson().toJson(map)); + } + + public static void saveBoundAuthCode(boolean value) { + SettingsPref.instance().putBoolean(KEY_BOUND_AUTH_CODE, value); + } + + public static boolean readBoundAuthCode() { + return SettingsPref.instance().getBoolean(KEY_BOUND_AUTH_CODE, false); + } + + public static void saveMyFairyIndex(int index) { + SettingsPref.instance().putInt(KEY_MY_FAIRY_INDEX, index); + } + + public static int readMyFairyIndex() { + return SettingsPref.instance().getInt(KEY_MY_FAIRY_INDEX, 0); + } + +} diff --git a/core/src/main/java/com/chwl/core/OldHttpObserver.java b/core/src/main/java/com/chwl/core/OldHttpObserver.java new file mode 100644 index 0000000..bd05839 --- /dev/null +++ b/core/src/main/java/com/chwl/core/OldHttpObserver.java @@ -0,0 +1,49 @@ +package com.chwl.core; + +import com.chwl.core.bean.response.RequestError; +import com.chwl.core.bean.response.ResponseData; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; +import retrofit2.HttpException; + +/** + * @author jack + * @Description + * @Date 2018/5/7 + */ + +public abstract class OldHttpObserver implements SingleObserver { + + @Override + public void onSubscribe(Disposable d) { + + } + + + @Override + public void onError(Throwable throwable) { + try { + if (throwable instanceof HttpException){ + retrofit2.Response response = ((HttpException) throwable).response(); + if (response.errorBody() == null){ + onFail(new RequestError(throwable.getMessage())); + return; + } + byte[] bodyByte = response.errorBody().bytes(); + if (bodyByte.length <= 0){ + onFail(new RequestError(throwable.getMessage())); + return; + } + ResponseData error = new ResponseData(bodyByte); + onFail(new RequestError(error)); + }else { + onFail(new RequestError(throwable.getMessage())); + } + } catch (Exception e) { + onFail(new RequestError(e.getMessage())); + } + } + + public abstract void onFail(RequestError error); +} diff --git a/core/src/main/java/com/chwl/core/PreferencesUtils.java b/core/src/main/java/com/chwl/core/PreferencesUtils.java new file mode 100644 index 0000000..d45f181 --- /dev/null +++ b/core/src/main/java/com/chwl/core/PreferencesUtils.java @@ -0,0 +1,113 @@ +package com.chwl.core; + +import android.content.Context; + +import com.netease.nimlib.sdk.StatusBarNotificationConfig; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.chwl.core.auth.entity.AccountInfo; +import com.chwl.core.auth.entity.TicketInfo; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.pref.ObjectPref; +import com.chwl.library.utils.pref.SettingsPref; + +/** + * Created by zhouxiangfeng on 2017/5/19. + */ + +public class PreferencesUtils { + + private static AccountInfo accountInfo; + private static TicketInfo ticketInfo; + + private static final String KEY_TICKET_INFO = "TicketInfo"; + private static final String KEY_FRIST_SEED_GOLD = "FristSendGold"; + private static final String KEY_FRIST_USER = "FristUser"; + private static final String KEY_LOGIN_INFO = "LoginInfo"; + private static final String KEY_ACCOUNT_INFO = "AccountInfo"; + private static final String KEY_NOTI_TOGGLE = "NotiToggle"; + private static final String KEY_NOTI_CONFIG = "StatusBarNotificationConfig"; + private static final String KEY_AGREE_PRIVACY = "key_agree_privacy"; + + + public static void saveTicketInfo(TicketInfo ticketInfo) { + ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_TICKET_INFO, ticketInfo); + } + + + public static void saveCurrentAccountInfo(AccountInfo accountInfo) { + ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_ACCOUNT_INFO, accountInfo); + } + + + public static void saveLoginInfo(LoginInfo loginInfo) { + ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_LOGIN_INFO, loginInfo); + } + + public static AccountInfo readCurrentAccountInfo() { + if (null == accountInfo) { + accountInfo = (AccountInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_ACCOUNT_INFO); + } + return accountInfo; + } + + public static TicketInfo readTicketInfo() { + if (null == ticketInfo) { + return (TicketInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_TICKET_INFO); + } + return ticketInfo; + } + + public static LoginInfo readLoginInfo(Context context) { + return (LoginInfo) ObjectPref.instance(context).readObject(KEY_LOGIN_INFO); + } + + + public static boolean readNotificationToggle() { + return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(KEY_NOTI_TOGGLE, true); + } + + public static void setNotificationToggle(boolean isOpen) { + SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(KEY_NOTI_TOGGLE, isOpen); + } + + public static boolean readFristSendGold() { + return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(KEY_FRIST_SEED_GOLD, true); + } + + public static void setFristSendGold(boolean isOpen) { + SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(KEY_FRIST_SEED_GOLD, isOpen); + } + + public static boolean readFristUser() { + return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(KEY_FRIST_USER, true); + } + + public static void setFristUser(boolean isOpen) { + SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(KEY_FRIST_USER, isOpen); + } + + + public static void saveStatusBarNotificationConfig(StatusBarNotificationConfig notificationConfig) { + ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).put(KEY_NOTI_CONFIG, notificationConfig); + } + + public static StatusBarNotificationConfig readStatusBarNotificationConfig() { + return (StatusBarNotificationConfig) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_NOTI_CONFIG); + } + + public static void clear() { + accountInfo = null; + ticketInfo = null; + saveCurrentAccountInfo(new AccountInfo()); + saveTicketInfo(new TicketInfo()); + saveLoginInfo(new LoginInfo("", "")); + } + + public static void savePrivacyState(boolean privacy) { + ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).put(KEY_AGREE_PRIVACY, privacy); + } + + public static boolean readPrivacyState() { + return (boolean) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).get(KEY_AGREE_PRIVACY, false); + } +} diff --git a/core/src/main/java/com/chwl/core/RegionHelper.kt b/core/src/main/java/com/chwl/core/RegionHelper.kt new file mode 100644 index 0000000..b9247e8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/RegionHelper.kt @@ -0,0 +1,118 @@ +package com.chwl.core + +import android.widget.TextView +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.coroutineScope +import com.example.lib_utils.AppUtils +import com.example.lib_utils.TelephonyUtils +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.chwl.core.bean.RegionBean +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.InputStream + +/** + * Created by Max on 2023/12/7 18:23 + * Desc:地区 + **/ +class RegionHelper { + + fun loadRecommendRegion(lifecycle: Lifecycle, textView: TextView){ + lifecycle.coroutineScope.launch { + RegionHelper().getCurrentOrDefRegion().let { + textView.text = it.fullCode + } + } + } + + private fun getDefaultRegion(): RegionBean { + return RegionBean(name = "Taiwan", abbr = "TW", mcc = "466", code = "886") + } + + /** + * 获取当前地区或默认 + */ + private suspend fun getCurrentOrDefRegion(): RegionBean { + return withContext(Dispatchers.IO) { + var operator = TelephonyUtils.getNetWorkOperator() + if (operator.isNullOrEmpty()) { + operator = TelephonyUtils.getSimOperator() + } + val mcc = operator?.take(3) + val region = getAllRegionList().firstOrNull { + it.mcc == mcc + } + region ?: getDefaultRegion() + } + } + + /** + * 获取地区选择器列表 + */ + suspend fun getRegionSelectorList(groupItemType: Int): List { + return withContext(Dispatchers.IO) { + val list = ArrayList() + list.addAll(getHotRegionList()) + var lastGroup: Char? = null + list.addAll(getAllRegionList() + .map { + val firstName = it.name?.firstOrNull()?.uppercaseChar() ?: '#' + if (firstName in 'A'..'Z') { + it.groupName = firstName + it.sortedBy = "$firstName${it.name?.uppercase()}" + } else { + it.groupName = '#' + it.sortedBy = "${'Z' + 1}${it.name?.uppercase()}" + } + it + } + .sortedBy { + it.sortedBy + }.map { + val groupName = it.groupName ?: '#' + if (groupName != lastGroup) { + it.itemType = groupItemType + } + lastGroup = groupName + it + } + ) + list + } + } + + /** + * 获取热门地区 + */ + suspend fun getHotRegionList(): List { + return getRegionListFromAssets("hot_region.json") + } + + /** + * 获取全部地区 + */ + suspend fun getAllRegionList(): List { + return getRegionListFromAssets("region.json") + } + + /** + * 从资源文件中获取地区列表 + */ + private fun getRegionListFromAssets(fileName: String): MutableList { + //获取IO流 + try { + val inputStream: InputStream = + AppUtils.getApp().applicationContext.assets.open(fileName) + val json: String + inputStream.use { + json = it.bufferedReader().readText() + } + return Gson().fromJson(json, object : TypeToken>() {}.type) + } catch (e: Exception) { + e.printStackTrace() + } + return mutableListOf() + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/SdkConfig.kt b/core/src/main/java/com/chwl/core/SdkConfig.kt new file mode 100644 index 0000000..c4c5c41 --- /dev/null +++ b/core/src/main/java/com/chwl/core/SdkConfig.kt @@ -0,0 +1,28 @@ +package com.chwl.core + +import com.chwl.library.utils.codec.DESUtils + +object SdkConfig { + // 1400823228 + fun getTXAppId() = decrypt("cTkOfnb3r7vaFs4wfq3Aog==") + + // 3da88e33bc4f45019cc867ec51d7b465 + fun getAgoraKey() = decrypt("k9xONsWAgzCkXtzm5Wu+4U8sxtf9XKwlXXAl3l9BE6ppYKlmIfzkBA==") + + // 3da88e33bc4f45019cc867ec51d7b465 + fun getAgoraKeyDebug() = decrypt("k9xONsWAgzCkXtzm5Wu+4U8sxtf9XKwlXXAl3l9BE6ppYKlmIfzkBA==") + + // 79bc37000f4018a2a24ea9dc6ca08d32 + fun getNimKeyDebug() = decrypt("/1KxSXOF+PIET/9E3Aq3uBF7eesBfAABUy05XDWBl+JpYKlmIfzkBA==") + + // 7371d729710cd6ce3a50163b956b5eb6 + fun getNimKeyRelease() = decrypt("g3J0oqC++xZPMO7VrKdr+eXlAnxFhWFvdpD0Bm9sR01pYKlmIfzkBA==") + + private fun decrypt(value: String): String { + return try { + DESUtils.decryptDef2(value) + } catch (e: Exception) { + "" + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/UriHelper.java b/core/src/main/java/com/chwl/core/UriHelper.java new file mode 100644 index 0000000..5dda9b1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/UriHelper.java @@ -0,0 +1,74 @@ +package com.chwl.core; + +import android.net.Uri; +import android.text.TextUtils; + +public class UriHelper { + + /** + * @param url 访问链接 + * @return 返回增加时间戳,避免重复链接访问缓存内容 + */ + public static String applyTimestampForUrl(String url) { + if (TextUtils.isEmpty(url)) { + return ""; + } + url = appendUri(url, "t", String.valueOf(System.currentTimeMillis())); + return url; + } + + /** + * URL增加参数 + * + * @param uri 原始链接 + * @param appendQueryKey 增加参数,key + * @param appendQueryValue 增加参数,value + * @return 拼接后的完整链接 + */ + public static String appendUri(String uri, String appendQueryKey, String appendQueryValue) { + if (TextUtils.isEmpty(uri)) { + return ""; + } + if (TextUtils.isEmpty(appendQueryKey) || TextUtils.isEmpty(appendQueryValue)) { + return uri; + } + Uri oldUri = Uri.parse(uri); + + String value = oldUri.getQueryParameter(appendQueryKey); + if (!TextUtils.isEmpty(value)) { + return uri; + } + Uri.Builder builder = Uri.parse(uri).buildUpon(); + builder.appendQueryParameter(appendQueryKey, appendQueryValue); + return builder.toString(); + } + /** + * URL增加参数 值允许为空字符串 + * + * @param uri 原始链接 + * @param appendQueryKey 增加参数,key + * @param appendQueryValue 增加参数,value + * @return 拼接后的完整链接 + */ + public static String appendUriAllowEmpty(String uri, String appendQueryKey, String appendQueryValue) { + if (TextUtils.isEmpty(uri)) { + return ""; + } + if (TextUtils.isEmpty(appendQueryKey)) { + return uri; + } + Uri oldUri = Uri.parse(uri); + + String value = oldUri.getQueryParameter(appendQueryKey); + if (!TextUtils.isEmpty(value)) { + return uri; + } + Uri.Builder builder = Uri.parse(uri).buildUpon(); + if (TextUtils.isEmpty(appendQueryValue)) { + builder.appendQueryParameter(appendQueryKey, ""); + } else { + builder.appendQueryParameter(appendQueryKey, appendQueryValue); + } + return builder.toString(); + } +} diff --git a/core/src/main/java/com/chwl/core/UriProvider.java b/core/src/main/java/com/chwl/core/UriProvider.java new file mode 100644 index 0000000..cfb371c --- /dev/null +++ b/core/src/main/java/com/chwl/core/UriProvider.java @@ -0,0 +1,386 @@ +package com.chwl.core; + +import android.text.TextUtils; + +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.library.common.application.Env; +/** + * 请求接口接口地址 + */ +public class UriProvider { + + /** + * 默认以下生产环境地址 + */ + public static String JAVA_WEB_URL = "https://"; + public static String IM_SERVER_URL = "https://"; + public static String AAPP = "/molistar"; + + /** + * 初始化URL + * + * @param serverDebug + * @param serverStaging + * @param serverRelease + */ + public static void initUri(String serverDebug, String serverStaging, String serverRelease) { + Env.EnvType envType = Env.getCurrentEnv(); + if (envType == Env.EnvType.Debug) { + initUrl(serverDebug); + } else if (envType == Env.EnvType.Staging) { + initUrl(serverStaging); + } else if (envType == Env.EnvType.Release) { + initUrl(serverRelease); + } else { + initUrl(serverDebug); + } + + } + + private static void initUrl(String url) { + JAVA_WEB_URL = url; + IM_SERVER_URL = url; + } + + /** + * 获取房间背景(有动效) + * + * @return - + */ + public static String getRoomBg() { + return IM_SERVER_URL.concat(AAPP+"/modules/noble/roomBgList.html"); + } + + /** + * 贵族介绍页 + */ + public static String getNobleIntro() { + return IM_SERVER_URL.concat(AAPP+"/modules/nobles/intro.html"); + } + + /** + * 帮助页 + */ + public static String getHelp() { + return IM_SERVER_URL.concat(AAPP+"/modules/rule/guide.html"); + } + + /** + * 等级界面 + */ + public static String getUserLevelUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/level/index.html"); + } + + /** + * 用户协议H5 + * + * @return + */ + public static String getUserProtocolUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/protocol.html"); + } + + /** + * 举报H5 + * + * @return + */ + public static String getUserReportUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/inform/index.html"); + } + + /** + * MoliParty专属,实名认证页面 + * + * @return + */ + public static String getTutuRealNamePage() { + return JAVA_WEB_URL.concat(AAPP+"/modules/identity/new.html"); + } + + public static String getCommnunityNorms() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/community-norms.html"); + } + + /** + * 隐私协议 + * + * @return + */ + public static String getPrivacyAgreement() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/privacy-wap.html"); + } + + public static String getLinkUrl(String linkUrl) { + if (TextUtils.isEmpty(linkUrl)) { + return JAVA_WEB_URL; + } + return JAVA_WEB_URL.concat(linkUrl); + } + + /** + * 个人魅力榜 + */ + public static String getPersonalCharismaRank() { + return JAVA_WEB_URL.concat(AAPP+"/modules/charm/index.html"); + } + + /** + * 相亲规则 + * + * @return + */ + public static String getDatingRule() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/dating.html"); + } + + /** + * 第三方SDK协议 + * + * @return + */ + public static String getSDKPermissionUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/sdk.html"); + } + + /** + * 隐私指引 + */ + public static String getPrivacyUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/privacy-wap.html"); + } + + /** + * 用户充值协议 + */ + public static String getChargeAgreementUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/rechargeAgreement.html"); + } + + /** + * 用户注册服务协议 + */ + public static String getRegistrationAgreementUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/protocol.html"); + } + + /** + * 账号注销协议 + */ + public static String getCancellationAgreementUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/logout-agreement.html"); + } + + /** + * 直播乱象 + * + * @return + */ + public static String getLiveAgreement() { + return JAVA_WEB_URL.concat(AAPP+"/activity/activemodel/index.html?code=ZBGG"); + } + + /** + * 贵族中心帮助页 + */ + public static String getVipHelpUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/introduction-patrician.html"); + } + + /** + * 贵族榜 + */ + public static String getRankListUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/noble/index.html"); + } + + /** + * 获取宝箱钥匙 + */ + public static String getBoxKey() { + return JAVA_WEB_URL.concat(AAPP+"/activity/explore/index.html"); + } + + + /** + * 宝箱记录 + */ + public static String getBoxHistory() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rank/index.html#/newWishingWellRecord"); + } + + /** + * 宝箱帮助 + */ + public static String getBoxHelp() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/newWishingWellRule.html"); + } + + public static String getRanking() { + return IM_SERVER_URL.concat(AAPP+"/modules/rank/index.html#/rank"); + } + + /** + * 钻石明细 + */ + public static String getDiamondDetail() { + return JAVA_WEB_URL.concat(AAPP+"/modules/myincome/index.html#/DiamondLog"); + } + + /** + * 金币明细 + */ + public static String getGoldDetail() { + return JAVA_WEB_URL.concat(AAPP+"/modules/myincome/index.html#/GoldLog"); + } + + /** + * 邀请好友 + */ + public static String getInviteFan() { + return JAVA_WEB_URL.concat(AAPP+"/activity/2024-invitationFission/index.html"); + } + + /** + * 房间排行榜 + */ + public static String getRoomRanking() { + return IM_SERVER_URL.concat(AAPP+"/modules/room_rank/index.html?roomUid=" + AvRoomDataManager.get().getRoomUid()); + } + + /** + * 个播小时榜 + */ + public static String getSingleRoomHourRankUrl(long roomUid) { + return JAVA_WEB_URL.concat(AAPP+"/modules/room_rank/hourRank.html?roomUid=" + roomUid); + } + + /** + * 牌照房小时榜 + */ + public static String getRoomHourRankUrl(long roomUid) { + return JAVA_WEB_URL.concat(AAPP+"/modules/room_rank/hourRankLicense.html?roomUid=" + roomUid); + } + /** + * 粉丝团规则 + */ + public static String getFansTeamRuleUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/fans_club/rule.html"); + } + + /** + * 粉丝团排行 + */ + public static String getFansTeamRankUrl(long roomUid) { + return JAVA_WEB_URL.concat(AAPP+"/modules/fans_club/fans_rank.html?roomUid=" + roomUid); + } + + /** + * 我的粉丝团 + */ + public static String getFansTeamMyFansUrl(long roomUid) { + return JAVA_WEB_URL.concat(AAPP+"/modules/fans_club/myfans.html?roomUid=" + roomUid); + } + + /** + * 开通粉丝团 + */ + public static String getFansTeamOpenUrl(long roomUid) { + return JAVA_WEB_URL.concat(AAPP+"/modules/fans_club/nameplate.html?roomUid=" + roomUid); + } + /** + * 周星榜 + */ + public static String getWeekStarUrl() { + return JAVA_WEB_URL.concat(AAPP+"/modules/weekStar/newWeekStar.html"); + } + + /** + * 幸运礼物说明 + */ + public static String getLuckyGiftRule(int giftID) { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/luckyGiftRule.html?giftID=" + giftID); + } + + + /** + * 游戏排行榜 + */ + public static String getGameRank() { + return JAVA_WEB_URL.concat(AAPP+"/modules/gameRank/index.html"); + } + + /** + * cp规则 + */ + public static String getCpRule() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/cpRule.html"); + } + /** + * boom规则 + */ + public static String getBoomRule(long partitionId) { + return JAVA_WEB_URL.concat(AAPP+"/modules/rule/boom.html?partitionId="+partitionId); + } + + /** + * 房间等级 规则 + */ + public static String getRoomLevelRule() { + return JAVA_WEB_URL.concat(AAPP+"/modules/roomLevel/index.html"); + } + + /** + * 幸运红包 规则 + */ + public static String getLuckyBagRule() { + return JAVA_WEB_URL.concat(AAPP+"/modules/luckyBagRules/index.html"); + } + + /** + * 人机验证h5 + */ + public static String getHumanMachineVerification() { + return JAVA_WEB_URL.concat(AAPP+"/modules/humanMachineVerification/index.html"); + } + + /** + * 活动详情-h5 + * http://api.moliparty.com/eparty/modules/eventDetails/index.html?eventId=21 + */ + public static String getEventDetail(long id) { + return JAVA_WEB_URL.concat(AAPP+"/modules/eventDetails/index.html?eventId="+id); + } + //vip中心 + public static String getVipCenter() { + return JAVA_WEB_URL.concat(AAPP+"/modules/vip_Center/index.html"); + } + + //金币转赠,我的转赠 + public static String getMyTransfer() { + return JAVA_WEB_URL.concat(AAPP+"/modules/rechargeAgent/index.html#/myTransfer"); + } + + //首充- 首页弹窗 + public static String getFirstRechargeIndex() { + return JAVA_WEB_URL.concat(AAPP+"/modules/firstRechargeBonus/index.html "); + } + + //首充- 钱币banner跳转 + public static String getFirstRechargeBonus() { + return JAVA_WEB_URL.concat(AAPP+"/modules/firstRechargeBonus/First_Bonus.html "); + } + + + public static String toFullUrl(String shortUrl) { + if (shortUrl == null) { + return null; + } + if (shortUrl.startsWith("http")) { + return shortUrl; + } else { + return JAVA_WEB_URL.concat(shortUrl); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/XConstants.java b/core/src/main/java/com/chwl/core/XConstants.java new file mode 100644 index 0000000..85c1c6c --- /dev/null +++ b/core/src/main/java/com/chwl/core/XConstants.java @@ -0,0 +1,86 @@ +package com.chwl.core; + + +/** + * Created by MadisonRong on 09/08/2018. + */ + +public class XConstants { + + /** + * 包名(各種緩存目錄的根目錄) + */ + public static final String XCHAT_DIR_NAME = "com.hhchu.molistar"; + + /** + * sp名字 + */ + public static final String XCHAT_SHARE_PREFERENCE_NAME = "accompany_share_data"; + + /** + * 加密接口參數 + */ + public static final String DES_ENCRYPT_KEY_SMS_PARAMS = "rpbs6us1m8r2j9g6u06ff2bo18orwaya"; + + /** + * 加密接口簽名 + */ + public static final String DES_ENCRYPT_KEY_SMS_SIGN = "c8d514b3cdc44e898e027940e84f036c"; + + /** + * 本地數據庫的名字(目前是用 realm 數據庫) + */ + public static final String XCHAT_DATABASE_NAME = "accompany.db"; + + /** + * 龍珠表情 ID + */ + public static final int DRAGON_BALL_ID = 40; + + /** + * 系統消息那個用戶的UID + */ + public static final String SYSTEM_MESSAGE_UID = BuildConfig.DEBUG ? "935008" : "904770"; + + + /** + * 小秘書那個用戶的UID + */ + public static final String SECRETARY_UID = BuildConfig.DEBUG ? "935001" : "904769"; + + /** + * 賽事消息UID + */ + public static final String MATCH_UID = BuildConfig.DEBUG ? "1296314" : "904772"; + public static final String SHOW = "show"; + public static final String HIDE = "hide"; + + // 舉報入口標識 + public static final String REPORT_TYPE_CHAT = "chat"; // 私聊 + public static final String REPORT_TYPE_PERSONAL = "personal"; // 個人中心 + public static final String REPORT_TYPE_ROOM = "room"; // 房間 + public static final String REPORT_TYPE_VOICE = "voice"; // 聲音瓶子 + public static final String REPORT_TYPE_USERCARD = "USERCARD"; // 資料卡片 + public static final String REPORT_TYPE_WORLDDYNAMIC = "WORLDDYNAMIC"; // 世界動態 + public static final String REPORT_TYPE_DYNAMICCOMMENT = "DYNAMICCOMMENT"; // 世界動態 + public static final String REPORT_TYPE_PERSONAL_DYNAMIC = "PERSONAL_DYNAMIC"; // 個人頁動態 + public static final String REPORT_TYPE_DYNAMIC_SQUARE = "DYNAMIC_SQUARE";//廣場動態 + /** + * Referer (DEBUG) + */ + public static final String KEY_REFERER_DEBUG = "http://api.molistar.xyz/"; + + /** + * Referer (RELEASE) + */ + public static final String KEY_REFERER_RELEASE = "https://api.molistar.xyz/"; + public static final String APP_MARK = "molistar"; + /** + * 聊天室文本消息易盾反垃圾業務id + */ + public static final String CHAT_ROOM_ANTI_SPAM_CONFIG_ID = BuildConfig.DEBUG ? "3611b99d0457202a7f69151288183236" : "bddbbb617e9da4fcd08c6baf6686ad01"; + + public static final int KICK_OUT_ROOM_LIMIT_ENTER_TIME = 5 * 60 * 1000; + public static final int CODE_IGNORE_TOAST = 5263; + public static int SELECT_ANIM_DURATION = 2500; +} diff --git a/core/src/main/java/com/chwl/core/activity/bean/LotteryInfo.java b/core/src/main/java/com/chwl/core/activity/bean/LotteryInfo.java new file mode 100644 index 0000000..3882111 --- /dev/null +++ b/core/src/main/java/com/chwl/core/activity/bean/LotteryInfo.java @@ -0,0 +1,46 @@ +package com.chwl.core.activity.bean; + +import java.io.Serializable; + +/** + * Created by chenran on 2017/12/26. + */ + +public class LotteryInfo implements Serializable{ + private long uid; + private int leftDrawNum; + private int totalDrawNum; + private int totalWinDrawNum; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public int getLeftDrawNum() { + return leftDrawNum; + } + + public void setLeftDrawNum(int leftDrawNum) { + this.leftDrawNum = leftDrawNum; + } + + public int getTotalDrawNum() { + return totalDrawNum; + } + + public void setTotalDrawNum(int totalDrawNum) { + this.totalDrawNum = totalDrawNum; + } + + public int getTotalWinDrawNum() { + return totalWinDrawNum; + } + + public void setTotalWinDrawNum(int totalWinDrawNum) { + this.totalWinDrawNum = totalWinDrawNum; + } +} diff --git a/core/src/main/java/com/chwl/core/activity/event/ActivityEvent.java b/core/src/main/java/com/chwl/core/activity/event/ActivityEvent.java new file mode 100644 index 0000000..46c3a1e --- /dev/null +++ b/core/src/main/java/com/chwl/core/activity/event/ActivityEvent.java @@ -0,0 +1,13 @@ +package com.chwl.core.activity.event; + +import com.chwl.core.activity.bean.LotteryInfo; + +public class ActivityEvent { + + private LotteryInfo lotteryInfo; + + public LotteryInfo setLotteryInfo(LotteryInfo lotteryInfo) { + this.lotteryInfo = lotteryInfo; + return this.lotteryInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/activity/model/ActivityModel.java b/core/src/main/java/com/chwl/core/activity/model/ActivityModel.java new file mode 100644 index 0000000..9dbd915 --- /dev/null +++ b/core/src/main/java/com/chwl/core/activity/model/ActivityModel.java @@ -0,0 +1,6 @@ +package com.chwl.core.activity.model; + +import com.chwl.core.base.BaseModel; + +public class ActivityModel extends BaseModel implements IActivityModel { +} diff --git a/core/src/main/java/com/chwl/core/activity/model/IActivityModel.java b/core/src/main/java/com/chwl/core/activity/model/IActivityModel.java new file mode 100644 index 0000000..090b30b --- /dev/null +++ b/core/src/main/java/com/chwl/core/activity/model/IActivityModel.java @@ -0,0 +1,6 @@ +package com.chwl.core.activity.model; + +import com.chwl.core.base.IModel; + +public interface IActivityModel extends IModel { +} diff --git a/core/src/main/java/com/chwl/core/association/bean/ClanListInfo.kt b/core/src/main/java/com/chwl/core/association/bean/ClanListInfo.kt new file mode 100644 index 0000000..c1480da --- /dev/null +++ b/core/src/main/java/com/chwl/core/association/bean/ClanListInfo.kt @@ -0,0 +1,12 @@ +package com.chwl.core.association.bean + +data class ClanListInfo( + val clanId: Int = 0, + val clanElderUid: Long = 0, + val avatar: String = "", + val name: String = "", + val levelIcon: String = "", + val income: Double = 0.0, + val level: Int = 0, + var applyBtnStatus: Int = 0//0=不显示 1=可申请 2=已申请 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/association/bean/HallListInfo.java b/core/src/main/java/com/chwl/core/association/bean/HallListInfo.java new file mode 100644 index 0000000..3dcb19d --- /dev/null +++ b/core/src/main/java/com/chwl/core/association/bean/HallListInfo.java @@ -0,0 +1,20 @@ +package com.chwl.core.association.bean; + +import lombok.Data; + +@Data +public class HallListInfo { + private long hallId; + private String hallName; + private long clanId; + private int roleType; + private long ownerUid; + private String ownerNick; + private String ownerAvatar; + private Integer memberCount; + private long ownerErbanNo; + private Double roomIncome; + private int hallBtnStatus;//0=不显示 1=可申请 2=待审核 3通过邀请 + private int hallRecordId;//通过邀请时的邀请记录id + private long hallMessageUid;//联系人id +} diff --git a/core/src/main/java/com/chwl/core/association/bean/MemberExchangeInfo.kt b/core/src/main/java/com/chwl/core/association/bean/MemberExchangeInfo.kt new file mode 100644 index 0000000..48a87fb --- /dev/null +++ b/core/src/main/java/com/chwl/core/association/bean/MemberExchangeInfo.kt @@ -0,0 +1,20 @@ +package com.chwl.core.association.bean + +import lombok.Data + +@Data +data class MemberExchangeInfo( + val avatar: String = "", + val erbanNo: Int = 0, + val exchangeAuthStatus: Int = 0, + val gender: Int = 0, + val golds: Int = 0, + val hallName: String = "", + val hallRoleType: Int = 0, + val isClanElder: Boolean = false, + val manageHall: Boolean = false, + val nick: String = "", + val roleType: Int = 0, + val uid: Long = 0L, + val userLevelVo: UserLevelInfo? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/association/bean/UserLevelInfo.kt b/core/src/main/java/com/chwl/core/association/bean/UserLevelInfo.kt new file mode 100644 index 0000000..73fe41c --- /dev/null +++ b/core/src/main/java/com/chwl/core/association/bean/UserLevelInfo.kt @@ -0,0 +1,17 @@ +package com.chwl.core.association.bean + +import lombok.Data + +@Data +data class UserLevelInfo( + val charmAmount: Int = 0, + val charmLevelGrp: String = "", + val charmLevelName: String = "", + val charmLevelSeq: Int = 0, + val charmUrl: String = "", + val experAmount: Int = 0, + val experLevelGrp: String = "", + val experLevelName: String = "", + val experLevelSeq: Int = 0, + val experUrl: String = "" +) diff --git a/core/src/main/java/com/chwl/core/association/model/AssociationModel.kt b/core/src/main/java/com/chwl/core/association/model/AssociationModel.kt new file mode 100644 index 0000000..8d8b53b --- /dev/null +++ b/core/src/main/java/com/chwl/core/association/model/AssociationModel.kt @@ -0,0 +1,68 @@ +package com.chwl.core.association.model + +import com.chwl.core.association.bean.ClanListInfo +import com.chwl.core.association.bean.HallListInfo +import com.chwl.core.association.bean.MemberExchangeInfo +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.* + +object AssociationModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + suspend fun getClanList(): List? = + launchRequest { + api.getClanList() + } + + suspend fun getHallList(): List? = + launchRequest { + api.getHallList() + } + + suspend fun getMemberExchangeList(): List? = + launchRequest { + api.getMemberExchangeList() + } + + suspend fun operateMemberExchange(status: Int, targetUid: Long): String? = + launchRequest { + api.operateMemberExchange(status, targetUid) + } + + private interface Api { + + /** + * 获取公會周榜 + */ + @GET("/clan/list") + suspend fun getClanList(): ServiceResult> + + /** + * 获取牌照房 + */ + @GET("/hall/list") + suspend fun getHallList(): ServiceResult> + + /** + * 获取家族下的兑换权限管理的成员列表 + */ + @GET("/clan/memberExchangeAuth/list") + suspend fun getMemberExchangeList(): ServiceResult> + + /** + * 修改兑换权限管理 + */ + @FormUrlEncoded + @POST("/clan/memberExchangeAuth/operate") + suspend fun operateMemberExchange( + @Field("status") status: Int, + @Field("targetUid") targetUid: Long + ): ServiceResult + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/audio/AudioModel.java b/core/src/main/java/com/chwl/core/audio/AudioModel.java new file mode 100644 index 0000000..54003d8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/AudioModel.java @@ -0,0 +1,159 @@ +package com.chwl.core.audio; + +import com.google.gson.JsonElement; +import com.chwl.core.audio.bean.HistoryVoiceInfo; +import com.chwl.core.audio.bean.SaveVoiceSuccessResultInfo; +import com.chwl.core.audio.bean.UserVoiceInfo; +import com.chwl.core.audio.bean.VoiceCardInfo; +import com.chwl.core.audio.bean.VoiceMatchInfo; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class AudioModel extends BaseModel implements IAudioModel { + + private volatile static IAudioModel instance; + + private Api api; + + public static IAudioModel get() { + if (instance == null) { + synchronized (AudioModel.class) { + if (instance == null) { + instance = new AudioModel(); + } + } + } + return instance; + } + + private AudioModel() { + api = RxNet.create(Api.class); + } + + @Override + public Single> getMyVoiceInfoList(long uid) { + return api.getMyVoiceInfoList(uid) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single> getVoiceCardInfoList(long uid, Integer type, int pageSize) { + return api.getVoiceCardInfoList(uid, type, pageSize) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single saveVoice(long uid, String voiceUrl, int voiceLength, + Long voiceId, Long piaId, int type) { + return api.saveVoice(uid, voiceUrl, voiceLength, voiceId, piaId, type) + .compose(RxHelper.handleCommon(SaveVoiceSuccessResultInfo::new)); + } + + @Override + public Single> getVoiceMatchList(int gender, int pageSize) { + return api.apiVoiceMatchList(AuthModel.get().getCurrentUid(), gender, pageSize) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single likeOrUnlikeVoice(long uid, long voiceId, int type) { + return api.likeOrUnlikeVoice(uid, voiceId, type) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single syncHistoryVoice(long uid, long voiceId) { + return api.syncHistoryVoice(uid, voiceId) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single queryHistoryVoice(long uid) { + return api.queryHistoryVoice(uid) + .compose(RxHelper.handleCommon(HistoryVoiceInfo::new)); + } + + @Override + public Single addPlayCount(long uid, Long voiceId, long voiceUid) { + return api.addPlayCount(uid, voiceId, voiceUid) + .compose(RxHelper.handleIgnoreData()); + } + + + private interface Api { + + /** + * 我的声音列表 + */ + @POST("/voice/my") + Single>> getMyVoiceInfoList(@Query("uid") long uid); + + /** + * 随机获取pia剧本 + */ + @GET("/voice/pia/get") + Single>> getVoiceCardInfoList(@Query("uid") long uid, + @Query("type") Integer type, + @Query("pageSize") int pageSize); + + /** + * 保存声音 + */ + @POST("/voice/save") + Single> saveVoice(@Query("uid") long uid, + @Query("voiceUrl") String voiceUrl, + @Query("voiceLength") long voiceLength, + @Query("voiceId") Long voiceId, + @Query("piaId") Long piaId, + @Query("type") int type); + + /** + * 声音匹配列表 + */ + @POST("/voice/list") + Single>> apiVoiceMatchList(@Query("uid") long uid, + @Query("gender") int gender, + @Query("pageSize") int pageSize); + + /** + * 喜欢/不喜欢 声音 + */ + @POST("/voice/like") + Single> likeOrUnlikeVoice(@Query("uid") long uid, + @Query("voiceId") long voiceId, + @Query("type") int type); + + /** + * 同步旧版本个人介绍声音到声音瓶子 + */ + @POST("/voice/history/sync") + Single> syncHistoryVoice(@Query("uid") long uid, + @Query("voiceId") long voiceId); + + /** + * 查询旧版本个人介绍声音 + */ + @POST("/voice/history/query") + Single> queryHistoryVoice(@Query("uid") long uid); + + /** + * 增加播放次数 + */ + @POST("/voice/add/play/count") + Single> addPlayCount(@Query("uid") long uid, + @Query("voiceId") Long voiceId, + @Query("voiceUid") long voiceUid); + } + +} diff --git a/core/src/main/java/com/chwl/core/audio/AudioPlayAndRecordManager.java b/core/src/main/java/com/chwl/core/audio/AudioPlayAndRecordManager.java new file mode 100644 index 0000000..70675be --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/AudioPlayAndRecordManager.java @@ -0,0 +1,118 @@ +package com.chwl.core.audio; + +import android.content.Context; +import android.media.AudioManager; + +import com.netease.nimlib.sdk.media.player.AudioPlayer; +import com.netease.nimlib.sdk.media.player.OnPlayListener; +import com.netease.nimlib.sdk.media.record.AudioRecorder; +import com.netease.nimlib.sdk.media.record.IAudioRecordCallback; +import com.netease.nimlib.sdk.media.record.RecordType; +import com.chwl.library.utils.config.BasicConfig; + +/** + * @author zhouxiangfeng + * @date 2017/5/20 + */ + +public class AudioPlayAndRecordManager { + + private static AudioPlayAndRecordManager audioPlayManager; + private AudioPlayer player; + private AudioRecorder recorder; + private IAudioRecordCallback mCallback; + + private AudioPlayAndRecordManager() { + + } + + + public static AudioPlayAndRecordManager getInstance() { + if (audioPlayManager == null) + audioPlayManager = new AudioPlayAndRecordManager(); + return audioPlayManager; + } + + public AudioPlayer getAudioPlayer(String filePath, OnPlayListener listener) { + // 构造播放器对象 + player = new AudioPlayer(BasicConfig.INSTANCE.getAppContext(), filePath, listener); + return player; + } + + public void play() { + // 开始播放。需要传入一个 Stream Type 参数,表示是用听筒播放还是扬声器。取值可参见 + // android.media.AudioManager#STREAM_*** + // AudioManager.STREAM_VOICE_CALL 表示使用听筒模式 + // AudioManager.STREAM_MUSIC 表示使用扬声器模式 + player.start(AudioManager.STREAM_MUSIC); + } + + + public void seekTo(int pausedPostion) { + // 如果中途切换播放设备,重新调用 start,传入指定的 streamType 即可。player 会自动停止播放,然后再以新的 streamType 重新开始播放。 + // 如果需要从中断的地方继续播放,需要外面自己记住已经播放过的位置,然后在 onPrepared 回调中调用 seekTo + player.seekTo(pausedPostion); + } + + public void stopPlay() { + // 主动停止播放 + player.stop(); + } + + + public AudioRecorder getAudioRecorder(Context context, IAudioRecordCallback callback) { + // 初始化recorder + recorder = new AudioRecorder( + BasicConfig.INSTANCE.getAppContext(), + // 录制音频类型(aac/amr) + RecordType.AAC, + // 最长录音时长,到该长度后,会自动停止录音, 默认120s + 0, + callback); + mCallback = callback; + return recorder; + } + + public boolean isPlaying() { + return player != null && player.isPlaying(); + } + + public void startRecord() { + + if (null != recorder) { + if (recorder.isRecording()) { + recorder.completeRecord(true); + recorder.destroyAudioRecorder(); + } + recorder.startRecord(); + } + } + + public void stopRecord(boolean cancel) { + if (null != recorder && recorder.isRecording()) { + recorder.completeRecord(cancel); + } + } + + /** 释放资源 */ + public void release() { + if (isPlaying()) + stopPlay(); + stopRecord(true); + mCallback = null; + recorder = null; + if(player != null) { + player.setOnPlayListener(null); + } + } + + // play每个页面都会新建对象,此方法可用于设置当前页面的player对象 + public void setPlayer(AudioPlayer player) { + this.player = player; + } + + // play每个页面都会新建对象,此方法可用于判断对象是被覆盖 + public AudioPlayer getPlayer() { + return player; + } +} diff --git a/core/src/main/java/com/chwl/core/audio/IAudioModel.java b/core/src/main/java/com/chwl/core/audio/IAudioModel.java new file mode 100644 index 0000000..8586294 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/IAudioModel.java @@ -0,0 +1,87 @@ +package com.chwl.core.audio; + +import com.chwl.core.audio.bean.HistoryVoiceInfo; +import com.chwl.core.audio.bean.SaveVoiceSuccessResultInfo; +import com.chwl.core.audio.bean.UserVoiceInfo; +import com.chwl.core.audio.bean.VoiceCardInfo; +import com.chwl.core.audio.bean.VoiceMatchInfo; +import com.chwl.core.base.IModel; + +import java.util.List; + +import io.reactivex.Single; + +public interface IAudioModel extends IModel { + + /** + * 我的声音列表 + * + * @param uid 用户Uid + */ + Single> getMyVoiceInfoList(long uid); + + /** + * 随机获取pia剧本(声音卡片) + * + * @param uid 用户Uid + * @param type 1.歌词 2.情话 (不传则全部) + * @param pageSize 一页大小(默认10) + */ + Single> getVoiceCardInfoList(long uid, Integer type, int pageSize); + + + /** + * 保存声音 + * + * @param uid 用户Uid + * @param voiceUrl 声音链接 + * @param voiceLength 声音时长 + * @param voiceId [声音id] + * @param piaId [pia剧本id] + * @param type 声音类型: 0=pia戏 + */ + Single saveVoice(long uid, String voiceUrl, int voiceLength, + Long voiceId, Long piaId, int type); + + /** + * 声音匹配列表 + * + * @param gender 性别 + */ + Single> getVoiceMatchList(int gender, int pageSize); + + /** + * 喜欢/不喜欢 声音 + * + * @param uid 听者Uid + * @param voiceId 声音id + * @param type 0.不喜欢 1.喜欢 + */ + Single likeOrUnlikeVoice(long uid, long voiceId, int type); + + + /** + * 同步旧版本个人介绍声音到声音瓶子 + * + * @param uid 用户Uid + * @param voiceId 声音id + */ + Single syncHistoryVoice(long uid, long voiceId); + + /** + * 查询旧版本个人介绍声音 + * + * @param uid 用户Uid + */ + Single queryHistoryVoice(long uid); + + /** + * 增加播放次数 + * + * @param uid 听者Uid + * @param voiceId 声音id(不传时为voiceUid对应的默认声音) + * @param voiceUid 声音所属用户Uid + */ + Single addPlayCount(long uid, Long voiceId, long voiceUid); + +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/HistoryVoiceInfo.java b/core/src/main/java/com/chwl/core/audio/bean/HistoryVoiceInfo.java new file mode 100644 index 0000000..651b967 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/HistoryVoiceInfo.java @@ -0,0 +1,137 @@ +package com.chwl.core.audio.bean; + +/** + * 查询旧版本个人介绍声音 + */ +public class HistoryVoiceInfo { + + /** + * historyVoice : {"id":14,"uid":900005,"defFlag":true,"status":2,"playCount":0,"likeCount":0,"gender":1,"voiceUrl":"https://image.zhongjialx.com/40531ccb-70f8-4981-9b47-281626c4d0621.aac?imageslim","voiceLength":3,"piaId":1} + * hasVoice : true + */ + + private HistoryVoiceBean historyVoice;// 如存在旧版本个人介绍声音则historyVoice不为空,不存在则为空 + private boolean hasVoice;// 是否已录制声音,包括待审核、审核通过(true.有,false 没有) + + public HistoryVoiceBean getHistoryVoice() { + return historyVoice; + } + + public void setHistoryVoice(HistoryVoiceBean historyVoice) { + this.historyVoice = historyVoice; + } + + public boolean isHasVoice() { + return hasVoice; + } + + public void setHasVoice(boolean hasVoice) { + this.hasVoice = hasVoice; + } + + public static class HistoryVoiceBean { + /** + * id : 14 + * uid : 900005 + * defFlag : true + * status : 2 + * playCount : 0 + * likeCount : 0 + * gender : 1 + * voiceUrl : https://image.zhongjialx.com/40531ccb-70f8-4981-9b47-281626c4d0621.aac?imageslim + * voiceLength : 3 + * piaId : 1 + */ + + private long id;// 声音id + private long uid;// 声音所属用户uid + private boolean defFlag;// 是否默认声音 + private int status;// 0,待审核 1 审核通过 2.无提交审核 + private int playCount;// 播放次数 + private int likeCount;// 喜欢次数 + private int gender;// 性别(1.男,2.女) + private String voiceUrl;// 声音链接 + private int voiceLength;// 声音时长 + private long piaId;// pia剧本id + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public boolean isDefFlag() { + return defFlag; + } + + public void setDefFlag(boolean defFlag) { + this.defFlag = defFlag; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getPlayCount() { + return playCount; + } + + public void setPlayCount(int playCount) { + this.playCount = playCount; + } + + public int getLikeCount() { + return likeCount; + } + + public void setLikeCount(int likeCount) { + this.likeCount = likeCount; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public String getVoiceUrl() { + return voiceUrl; + } + + public void setVoiceUrl(String voiceUrl) { + this.voiceUrl = voiceUrl; + } + + public int getVoiceLength() { + return voiceLength; + } + + public void setVoiceLength(int voiceLength) { + this.voiceLength = voiceLength; + } + + public long getPiaId() { + return piaId; + } + + public void setPiaId(long piaId) { + this.piaId = piaId; + } + } +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/SaveVoiceSuccessResultInfo.java b/core/src/main/java/com/chwl/core/audio/bean/SaveVoiceSuccessResultInfo.java new file mode 100644 index 0000000..d7bceb7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/SaveVoiceSuccessResultInfo.java @@ -0,0 +1,110 @@ +package com.chwl.core.audio.bean; + +/** + * 保存声音成功时 接口返回的声音信息 + */ +public class SaveVoiceSuccessResultInfo { + + /** + * id : 42 + * uid : 902385 + * defFlag : true + * status : 1 + * likeCount : 0 + * gender : 2 + * voiceUrl : https://nim.nosdn.127.net/NTMwMjgzNA==/bmltYV81ODcxNTc1MjI2XzE1NTUzOTY0MzU0NzlfODdiNjhjMjItNWU4ZS00NTI3LWIxMzItNzhmNjU4ODZjMWRi + * voiceLength : 4 + * piaId : 1 + */ + + private long id; // 声音id + private long uid; // 声音所属用户uid + private boolean defFlag; // 是否默认声音 + private int status; // 0,待审核 1 审核通过 2.无提交审核 + private int likeCount; // 喜欢次数 + private int gender; // 性别(1.男,2.女) + private String voiceUrl; // 声音地址 + private int voiceLength; // 声音时长 + private long piaId; // Pia剧本Id + private int playCount; // 播放次数 + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public boolean isDefFlag() { + return defFlag; + } + + public void setDefFlag(boolean defFlag) { + this.defFlag = defFlag; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getLikeCount() { + return likeCount; + } + + public void setLikeCount(int likeCount) { + this.likeCount = likeCount; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public String getVoiceUrl() { + return voiceUrl; + } + + public void setVoiceUrl(String voiceUrl) { + this.voiceUrl = voiceUrl; + } + + public int getVoiceLength() { + return voiceLength; + } + + public void setVoiceLength(int voiceLength) { + this.voiceLength = voiceLength; + } + + public long getPiaId() { + return piaId; + } + + public void setPiaId(long piaId) { + this.piaId = piaId; + } + + public int getPlayCount() { + return playCount; + } + + public void setPlayCount(int playCount) { + this.playCount = playCount; + } +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/SysMsgVoiceInfo.java b/core/src/main/java/com/chwl/core/audio/bean/SysMsgVoiceInfo.java new file mode 100644 index 0000000..c7a8ced --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/SysMsgVoiceInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.audio.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class SysMsgVoiceInfo implements Serializable { + public int status;// 状态:1 审核通过 4 审核不通过 + public String reason;// 原因 + public int routerType; + public String routerValue; +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/UserVoiceInfo.java b/core/src/main/java/com/chwl/core/audio/bean/UserVoiceInfo.java new file mode 100644 index 0000000..be2d3b0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/UserVoiceInfo.java @@ -0,0 +1,109 @@ +package com.chwl.core.audio.bean; + +/** + * 我的声音列表 + */ +public class UserVoiceInfo { + /** + * id : 42 + * uid : 902385 + * defFlag : true + * status : 1 + * likeCount : 0 + * gender : 2 + * voiceUrl : https://nim.nosdn.127.net/NTMwMjgzNA==/bmltYV81ODcxNTc1MjI2XzE1NTUzOTY0MzU0NzlfODdiNjhjMjItNWU4ZS00NTI3LWIxMzItNzhmNjU4ODZjMWRi + * voiceLength : 4 + * piaId : 1 + */ + + private long id;// 声音id + private long uid;// 声音所属用户uid + private boolean defFlag;// 是否默认声音 + private int status;// 0,待审核 1 审核通过 2.无提交审核 + private int likeCount;// 喜欢次数 + private int gender;// 性别(1.男,2.女) + private String voiceUrl;// 声音地址 + private int voiceLength;// 声音时长 + private long piaId;// Pia剧本Id + private int playCount;// 播放次数 + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public boolean isDefFlag() { + return defFlag; + } + + public void setDefFlag(boolean defFlag) { + this.defFlag = defFlag; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getLikeCount() { + return likeCount; + } + + public void setLikeCount(int likeCount) { + this.likeCount = likeCount; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public String getVoiceUrl() { + return voiceUrl; + } + + public void setVoiceUrl(String voiceUrl) { + this.voiceUrl = voiceUrl; + } + + public int getVoiceLength() { + return voiceLength; + } + + public void setVoiceLength(int voiceLength) { + this.voiceLength = voiceLength; + } + + public long getPiaId() { + return piaId; + } + + public void setPiaId(long piaId) { + this.piaId = piaId; + } + + public int getPlayCount() { + return playCount; + } + + public void setPlayCount(int playCount) { + this.playCount = playCount; + } +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/VoiceBottleSayHiInfo.java b/core/src/main/java/com/chwl/core/audio/bean/VoiceBottleSayHiInfo.java new file mode 100644 index 0000000..a0bd90d --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/VoiceBottleSayHiInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.audio.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class VoiceBottleSayHiInfo implements Serializable { + private String voiceUid; + private String message; +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/VoiceCardInfo.java b/core/src/main/java/com/chwl/core/audio/bean/VoiceCardInfo.java new file mode 100644 index 0000000..a0b8400 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/VoiceCardInfo.java @@ -0,0 +1,54 @@ +package com.chwl.core.audio.bean; + +/** + * 声音卡片的信息 + */ +public class VoiceCardInfo { + + private long id;// pia剧本id + private int type;// 类型 :1.歌词 2.情话 + private int gender;// 0.不限 1.男 2.女 + private String playBook;// 剧本内部 + private String title;// 剧本标题 + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public String getPlayBook() { + return playBook.replace("\\n", "\n") + .replace("\\r","\r"); + } + + public void setPlayBook(String playBook) { + this.playBook = playBook; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/core/src/main/java/com/chwl/core/audio/bean/VoiceMatchInfo.java b/core/src/main/java/com/chwl/core/audio/bean/VoiceMatchInfo.java new file mode 100644 index 0000000..2b2e968 --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/bean/VoiceMatchInfo.java @@ -0,0 +1,41 @@ +package com.chwl.core.audio.bean; + +import lombok.Data; + +/** + * create by lvzebiao @2019/6/10 + */ +@Data +public class VoiceMatchInfo { + + /** + * id : 42 + * uid : 902385 + * defFlag : true + * status : 1 + * likeCount : 0 + * gender : 2 + * voiceUrl : https://nim.nosdn.127.net/NTMwMjgzNA==/bmltYV81ODcxNTc1MjI2XzE1NTUzOTY0MzU0NzlfODdiNjhjMjItNWU4ZS00NTI3LWIxMzItNzhmNjU4ODZjMWRi + * voiceLength : 4 + * piaId : 1 + * nick : 二娃 + * birth : 631123200000 + * avatar : https://image.zhongjialx.com/picture_1557127983672.jpg?imageslim + * location : 广州市 + */ + + private int id; + private int uid; + private boolean defFlag; + private int status; + private int likeCount; + private int gender; + private String voiceUrl; + private int voiceLength; + private int piaId; + private String nick; + private long birth; + private String avatar; + private String location; + +} diff --git a/core/src/main/java/com/chwl/core/audio/event/VoiceShakeHeartEvent.java b/core/src/main/java/com/chwl/core/audio/event/VoiceShakeHeartEvent.java new file mode 100644 index 0000000..6b0438c --- /dev/null +++ b/core/src/main/java/com/chwl/core/audio/event/VoiceShakeHeartEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.audio.event; + +public class VoiceShakeHeartEvent { + public String showTextHint; + + public VoiceShakeHeartEvent(String showTextHint) { + this.showTextHint = showTextHint; + } +} diff --git a/core/src/main/java/com/chwl/core/auth/AuthModel.java b/core/src/main/java/com/chwl/core/auth/AuthModel.java new file mode 100644 index 0000000..47054eb --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/AuthModel.java @@ -0,0 +1,1334 @@ +package com.chwl.core.auth; + +import android.app.Activity; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.chwl.core.DemoCache; +import com.chwl.core.R; +import com.chwl.core.auth.entity.AccountInfo; +import com.chwl.core.auth.entity.ThirdUserInfo; +import com.chwl.core.auth.entity.TicketInfo; +import com.chwl.core.auth.event.GetCurrentUidEvent; +import com.chwl.core.auth.event.KickOutEvent; +import com.chwl.core.auth.event.LoginEvent; +import com.chwl.core.auth.event.LoginReportEvent; +import com.chwl.core.auth.event.LogoutEvent; +import com.chwl.core.auth.exception.AccountCancelException; +import com.chwl.core.auth.exception.BanAccountException; +import com.chwl.core.auth.exception.IsSuperAdminException; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bean.response.result.LoginResult; +import com.chwl.core.bean.response.result.RegisterResult; +import com.chwl.core.bean.response.result.TicketResult; +import com.chwl.core.exception.FailReasonException; +import com.chwl.core.im.custom.bean.CustomAttachParser; +import com.chwl.core.linked.LinkedModel; +import com.chwl.core.linked.bean.LinkedInfo; +import com.chwl.core.utils.CheckUtils; +import com.chwl.core.utils.LogUtils; +import com.chwl.core.utils.OldHttpErrorHandleUtil; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.DeviceUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.chwl.library.utils.VersionUtil; +import com.chwl.library.utils.codec.DESUtils; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.constant.PackageNameConstants; +import com.chwl.library.utils.json.JsonUtils; +import com.example.module_base.support.google.IGoogleService; +import com.example.module_base.support.login.ILoginService; +import com.example.module_base.support.login.LoginSDKException; +import com.example.module_base.support.login.PlatformInfo; +import com.netease.nim.uikit.api.NimUIKit; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nim.uikit.common.util.string.StringUtil; +import com.netease.nim.uikit.impl.cache.DataCacheManager; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.RequestCallbackWrapper; +import com.netease.nimlib.sdk.StatusCode; +import com.netease.nimlib.sdk.auth.AuthService; +import com.netease.nimlib.sdk.auth.AuthServiceObserver; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.nimlib.sdk.mixpush.MixPushService; +import com.netease.nimlib.sdk.msg.MsgService; +import com.orhanobut.logger.Logger; + +import org.greenrobot.eventbus.EventBus; + +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import lombok.Getter; +import okhttp3.ResponseBody; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class AuthModel extends BaseModel implements IAuthModel { + + /** + * 封禁账号 + */ + public static final int CODE_BAN_ACCOUNT = 407; + /** + * 封禁设备 + */ + public static final int CODE_BAN_DEVICE = 408; + /** + * 验证码结果不正确 + */ + public static final int VERIFY_CODE_ERROR = 3002; // 图片验证码? + /** + * 账号已注销 + */ + public static final int CODE_ACCOUNT_CANCEL = 3009; + /** + * 注册异常,请稍后再试 + */ + public static final int CODE_HIT_YI_DUN = 24000; + /** + * 一个手机绑定多个账号(大头账号) + */ + public static final int CODE_BIG_HEAD_NUM = 25002; + private static final String TAG = "AuthModel"; + /** + * 类型(1、手机号/耳伴号登陆,2、手机号/耳伴号登陆并绑定QQ) + */ + public static final int TYPE_GOOGLE_LOGIN = 8; + public static final int TYPE_LINE_LOGIN = 9; + public static final int TYPE_FACEBOOK_LOGIN = 10; + /** + * 校验验证码 + */ + private static final int CODE_SHOW_CODE = 107; + /** + * 超管登录校验验证码 + */ + private static final int SUPER_CODE_SHOW_CODE = 136; + private volatile static AuthModel instance = null; + + boolean isInit = false; + private Api api; + @Getter + private AccountInfo currentAccountInfo; + private TicketInfo ticketInfo; + private ThirdUserInfo thirdUserInfo; + private ILoginService googleLoginService; + + public static String PASSWORD = "password"; + public static final String EMAIL = "email"; + /****************************************************** IM *************************************************************/ + + private StatusCode statusCode; + + private AuthModel() { + api = RxNet.create(Api.class); + currentAccountInfo = DemoCache.readCurrentAccountInfo(); + ticketInfo = DemoCache.readTicketInfo(); + if (currentAccountInfo == null) { + currentAccountInfo = new AccountInfo(); + } + if (ticketInfo == null) { + ticketInfo = new TicketInfo(); + } + + isInit = true; + NIMClient.getService(MsgService.class).registerCustomAttachmentParser(new CustomAttachParser()); //注册自定义Im消息解析器 + registerAuthServiceObserver(); + + } + + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static AuthModel get() { + if (instance == null) { + synchronized (AuthModel.class) { + if (instance == null) { + instance = new AuthModel(); + } + } + } + return instance; + } + + @Override + public ILoginService getGoogleLoginService() { + if (googleLoginService == null) { + googleLoginService = IGoogleService.Companion.newLoginService(); + } + return googleLoginService; + } + + @Override + public ThirdUserInfo getThirdUserInfo() { + return thirdUserInfo; + } + + @Override + public void setThirdUserInfo(ThirdUserInfo thirdUserInfo) { + this.thirdUserInfo = thirdUserInfo; + } + + /** + * 获取当前登录的uid,登录成功后就有值了 + * + * @return + */ + @Override + public long getCurrentUid() { + return currentAccountInfo == null ? 0 : currentAccountInfo.getUid(); + } + + @Override + public boolean isMy(long uid) { + return getCurrentUid() == uid; + } + + /** + * 获取ticket,登录成功后就有真实值 + * + * @return + */ + @Override + public String getTicket() { + if (ticketInfo != null && ticketInfo.getTickets() != null && ticketInfo.getTickets().size() > 0) { + return ticketInfo.getTickets().get(0).getTicket(); + } + return ""; + } + + /** + * 判断是否已登录 + * + * @return + */ + @Override + public boolean isLogin() { + return currentAccountInfo != null && !TextUtils.isEmpty(currentAccountInfo.getAccess_token()); + } + + /** + * 自动登录 + * + * @return + */ + @Override + public Single autoLogin() { + if (currentAccountInfo == null || TextUtils.isEmpty(currentAccountInfo.getAccess_token())) { + return Single.error(new Throwable(""));//没有账号信息 + } + return imLogin(currentAccountInfo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(s -> { + EventBus.getDefault().post(new LoginEvent()); + }); + } + + /** + * 账号密码登录 + * + * @param account + * @param password + * @return + */ + @Override + public Single login(String account,String email, String password, String yiDunToken, String shuMeiDeviceId,String type) { + return login(null, account,email, password, null, yiDunToken, shuMeiDeviceId,type); + } + + @Override + public Single login(String phoneAreaCode, String account,String email, String password, String code, String yiDunToken, String shuMeiDeviceId,String type) { + return Single.create((SingleOnSubscribe) emitter -> { + //获取登录信息 + try { + LoginResult loginResult = api.login( + phoneAreaCode, + DESUtils.DESAndBase64(account), + DESUtils.DESAndBase64(email), + VersionUtil.getLocalName(BasicConfig.INSTANCE.getAppContext()), + "erban-client", + DESUtils.DESAndBase64(account), + DESAndBase64(password), + type, + "uyzjdhds", + code, + yiDunToken, + shuMeiDeviceId + ).blockingGet(); + if (!loginResult.isSuccess()) { + if (loginResult.getCode() == CODE_BAN_ACCOUNT || loginResult.getCode() == CODE_BAN_DEVICE) { + emitter.onError(new BanAccountException(loginResult.getReason(), loginResult.getDate())); + } else if (loginResult.getCode() == CODE_ACCOUNT_CANCEL) { + emitter.onError(new AccountCancelException(loginResult.getMessage(), loginResult.getErbanNo(), loginResult.getCancelDate())); + } else if (loginResult.getCode() == SUPER_CODE_SHOW_CODE) { + //是否是超管 + if (loginResult.getSuperCodeVerify() == 1) { + emitter.onError(new IsSuperAdminException(loginResult.getMessage())); + } else { + emitter.onError(new Throwable(loginResult.getMessage())); + } + } else { + emitter.onError(new Throwable(loginResult.getMessage())); + } + return; + } + currentAccountInfo = loginResult.getData(); + DemoCache.saveCurrentAccountInfo(currentAccountInfo); + //成功获取到uid后,就通知首页刷新审核中状态的数据 + EventBus.getDefault().post(new GetCurrentUidEvent(true)); + } catch (Exception e) { + emitter.onError(new Throwable(OldHttpErrorHandleUtil.handle(e))); + return; + } + //获取tick + try { + TicketResult ticketResult = requestTicket().blockingGet(); + if (!ticketResult.isSuccess()) { + emitter.onError(new Throwable(ticketResult.getMessage())); + return; + } + ticketInfo = ticketResult.getData(); + DemoCache.saveTicketInfo(ticketInfo); + + } catch (Exception e) { + emitter.onError(new Throwable(OldHttpErrorHandleUtil.handle(e))); + return; + } + emitter.onSuccess(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_02)); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(new Function>() { + @Override + public SingleSource apply(String s) throws Exception { + return imLogin(currentAccountInfo); + } + }) + .doOnSuccess(new Consumer() { + @Override + public void accept(String s) throws Exception { + //登录成功后发出登录事件 + EventBus.getDefault().post(new LoginEvent()); + } + }); + } + + + @Override + public Single googleLogin(Activity activity) { + return Single.create((SingleOnSubscribe) e -> { + ILoginService loginService = getGoogleLoginService(); + if (loginService == null) { + e.onError(new Throwable(ResUtil.getString(R.string.bean_response_serviceresult_015))); + return; + } + //是否安装客户端 + if (!DeviceUtils.isAppInstalled(getContext(), PackageNameConstants.GOOGLE_NAME)) { + e.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_09))); + return; + } + loginService.login(activity, new ILoginService.Listener() { + @Override + public void onSuccess(@NonNull PlatformInfo platformInfo) { + thirdUserInfo = new ThirdUserInfo(); + thirdUserInfo.setType(ThirdUserInfo.TYPE_GOOGLE); + thirdUserInfo.setPlatform("Google"); + thirdUserInfo.setUserName(platformInfo.getName()); + thirdUserInfo.setUserIcon(platformInfo.getAvatar()); + e.onSuccess(platformInfo); + } + + @Override + public void onFailure(@NonNull LoginSDKException exception) { + exception.printStackTrace(); + LogUtils.d("googleLogin" + exception); + e.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_010) + exception.getCode())); + } + }); + }) + .flatMap(platform -> { + String openid = platform.getId(); + String unionid = platform.getId(); + String avatar = thirdUserInfo.getUserIcon(); + if (avatar != null && avatar.equals("null")) { + avatar = null; + } + thirdUserInfo.setUserIcon(avatar); + String gender = thirdUserInfo.getUserGender(); + if (gender != null && !gender.trim().isEmpty()) { + gender = gender.replace("m", "1").replace("f", "2"); + } + thirdUserInfo.setUserGender(gender); + EventBus.getDefault().post(new LoginReportEvent(3)); + return thirdLogin(openid, unionid, TYPE_GOOGLE_LOGIN, "", ""); + }) + .flatMap(s -> imLogin(currentAccountInfo)) + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxHelper.handleException()) + .doOnSuccess(s -> EventBus.getDefault().post(new LoginEvent())); + } + + /** + * 第三方信息登录 + * + * @param openid + * @param unionid + * @param type + * @return + */ + private Single thirdLogin(String openid, String unionid, int type, String yiDunToken, String shuMeiDeviceId) { + LinkedInfo linkedInfo = LinkedModel.get().getLinkedInfo(); + String linkedmeChannel = null; + if (linkedInfo != null && !StringUtil.isEmpty(linkedInfo.getChannel())) { + linkedmeChannel = linkedInfo.getChannel(); + } + + String finalLinkedmeChannel = linkedmeChannel; + return Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + try { + LoginResult loginResult = api.thirdLogin( + openid, + unionid, + String.valueOf(type), + finalLinkedmeChannel, + yiDunToken, + shuMeiDeviceId + ).blockingGet(); + if (!loginResult.isSuccess()) { + if (loginResult.getCode() == CODE_BAN_ACCOUNT || loginResult.getCode() == CODE_BAN_DEVICE) { + e.onError(new BanAccountException(loginResult.getReason(), loginResult.getDate())); + } else if (loginResult.getCode() == CODE_ACCOUNT_CANCEL) { + e.onError(new AccountCancelException(loginResult.getMessage(), loginResult.getErbanNo(), loginResult.getCancelDate())); + } else { + e.onError(new Throwable(loginResult.getMessage())); + } + return; + } + currentAccountInfo = loginResult.getData(); + DemoCache.saveCurrentAccountInfo(currentAccountInfo); + //成功获取到uid后,就通知首页刷新审核中状态的数据 + EventBus.getDefault().post(new GetCurrentUidEvent(true)); + } catch (Exception e1) { + e.onError(new Throwable(OldHttpErrorHandleUtil.handle(e1))); + return; + } + //获取tick + try { + TicketResult ticketResult = requestTicket().blockingGet(); + if (!ticketResult.isSuccess()) { + e.onError(new Throwable(ticketResult.getMessage())); + return; + } + ticketInfo = ticketResult.getData(); + DemoCache.saveTicketInfo(ticketInfo); + + } catch (Exception e1) { + e.onError(new Throwable(OldHttpErrorHandleUtil.handle(e1))); + return; + } + e.onSuccess(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_012)); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + public Single refreshTicket() { + return requestTicket() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map(ticketResult -> { + if (ticketResult.isSuccess()) { + ticketInfo = ticketResult.getData(); + DemoCache.saveTicketInfo(ticketInfo); + } + return ticketResult; + }); + } + + /** + * 获取tick + * + * @return + */ + private Single requestTicket() { + return api.requestTicket( + "multi", + currentAccountInfo.getAccess_token() + ); + } + + /** + * 重置 + */ + @Override + public void reset() { + currentAccountInfo = new AccountInfo(); + ticketInfo = new TicketInfo(); + thirdUserInfo = null; + DemoCache.saveCurrentAccountInfo(new AccountInfo()); + DemoCache.saveTicketInfo(new TicketInfo()); + DemoCache.saveBoundAuthCode(false); + } + + private String DESAndBase64(String psw) { + String pwd = ""; + try { + pwd = DESUtils.DESAndBase64Encrypt(psw); + } catch (Exception e) { + e.printStackTrace(); + } + return pwd; + } + + /** + * 重置密码 + * + * @param phone + * @param sms_code + * @param newPsw + * @return + */ + @Override + public Single requestResetPsw(String phoneAreaCode, String phone, String sms_code, String newPsw) { + return Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + try { + ServiceResult serviceResult = api.requestResetPsw( + phoneAreaCode, + DESUtils.DESAndBase64(phone), + sms_code, + DESAndBase64(newPsw) + ).blockingGet(); + if (!serviceResult.isSuccess()) { + e.onError(new Throwable(serviceResult.getMessage())); + return; + } + e.onSuccess(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_013)); + } catch (Exception e1) { + e1.printStackTrace(); + e.onError(new Throwable(OldHttpErrorHandleUtil.handle(e1))); + } + + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + + } + /** + * 重置密码-邮箱 + */ + @Override + public Single requestResetPswByEmail(String email, String code, String newPsw) { + return Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + try { + ServiceResult serviceResult = api.requestResetPswByEmail( + DESUtils.DESAndBase64(email), + code, + DESAndBase64(newPsw) + ).blockingGet(); + if (!serviceResult.isSuccess()) { + e.onError(new Throwable(serviceResult.getMessage())); + return; + } + e.onSuccess(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_013)); + } catch (Exception e1) { + e1.printStackTrace(); + e.onError(new Throwable(OldHttpErrorHandleUtil.handle(e1))); + } + + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + /** + * 当前用户是否绑定手机 + * + * @return + */ + @Override + public Single isBindPhone() { + if (currentAccountInfo == null || currentAccountInfo.getUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_014))); + } + + return api.isBindPhone( + String.valueOf(currentAccountInfo.getUid()) + ) + .flatMap(new Function>() { + @Override + public SingleSource apply(ServiceResult serviceResult) throws Exception { + if (!serviceResult.isSuccess()) { + return Single.error(new Throwable(serviceResult.getMessage())); + } + return Single.just(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_015)); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 绑定手机 + * + * @param phone + * @param code + * @return + */ + @Override + public Single bindPhone(String phoneAreaCode, String phone, String code) { + if (currentAccountInfo == null || currentAccountInfo.getUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_016))); + } + return api.bindPhone( + phoneAreaCode, + DESUtils.DESAndBase64(phone), + code + ) + .flatMap(serviceResult -> { + if (!serviceResult.isSuccess()) { + return Single.error(new Throwable(serviceResult.getMessage())); + } + return Single.just(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_017)); + }) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 绑定邮箱 + */ + @Override + public Single bindEmail(String email, String code) { + if (currentAccountInfo == null || currentAccountInfo.getUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_016))); + } + return api.bindEmail( + DESUtils.DESAndBase64(email), + code + ) + .flatMap(serviceResult -> { + if (!serviceResult.isSuccess()) { + return Single.error(new Throwable(serviceResult.getMessage())); + } + return Single.just(ResUtil.getString(R.string._ver_24_text_bind_email_ok)); + }) + .compose(RxHelper.handleSchedulers()); + } + + + + /** + * 注册 + * + * @param phone + * @param sms_code + * @param password + * @return + */ + @Override + public Single register(String phone, String sms_code, String verifyCode, String password, + String yiDunToken, String shuMeiDeviceId) { + LinkedInfo linkedInfo = LinkedModel.get().getLinkedInfo(); + String linkedmeChannel = null; + if (linkedInfo != null && !StringUtil.isEmpty(linkedInfo.getChannel())) { + linkedmeChannel = linkedInfo.getChannel(); + } + return api.register( + DESUtils.DESAndBase64(phone), + sms_code, + verifyCode, + DESAndBase64(password), + linkedmeChannel, + yiDunToken, + shuMeiDeviceId + ) + .flatMap(new Function>() { + @Override + public SingleSource apply(RegisterResult registerResult) throws Exception { + if (!registerResult.isSuccess()) { + switch (registerResult.getCode()) { + case CODE_HIT_YI_DUN: + case VERIFY_CODE_ERROR: + return Single.error(new FailReasonException( + registerResult.getMessage(), registerResult.getCode())); + } + return Single.error(new Throwable(registerResult.getMessage())); + } + return Single.just(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_018)); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + /** + * 退出登录 + * + * @return + */ + @Override + public Single logout() { + Logger.i("logout ~~ "); + ILoginService loginService = getGoogleLoginService(); + if (loginService != null) { + loginService.logout(); + } + return api.logout(currentAccountInfo.getAccess_token()) + .compose(RxHelper.handleSchedulers()) + .flatMap(stringServiceResult -> { + if (stringServiceResult != null && stringServiceResult.isSuccess()) { + LogUtil.e(TAG, ResUtil.getString(R.string.xchat_android_core_auth_authmodel_019)); + cleanLogInfo(); + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else { + return Single.error(new Throwable(stringServiceResult != null ? stringServiceResult.getMessage() : + ResUtil.getString(R.string.xchat_android_core_auth_authmodel_020))); + } + }); + } + + public void cleanLogInfo() { + reset();//这里先重置状态,后调用IM登出,因为这里观察了IM的在线状态 + NIMClient.getService(AuthService.class).logout(); + EventBus.getDefault().post(new LogoutEvent()); + } + + /** + * 修改登录密码 + * + * @param phone + * @param oldPwd + * @param newPwd + * @return + */ + @Override + public Single modifyLoginPwd(String phone, + String oldPwd, + String newPwd) { + + if (TextUtils.isEmpty(getTicket())) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_021))); + } + return api.changeLoginPwd( + DESUtils.DESAndBase64(phone), + oldPwd, + newPwd, + getTicket() + + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_022)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(new Transformer<>()); + } + + /** + * 设置登录密码,在第三方登录的情况下是没有登录密码的,这里接口可以设置登录密码,账号为耳伴号 + * + * @param phone + * @param newPwd + * @return + */ + @Override + public Single setLoginPwd(String phone, + String newPwd) { + if (getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_023))); + } + + if (TextUtils.isEmpty(getTicket())) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_024))); + } + + return api.setLoginPwd( + DESUtils.DESAndBase64(phone), + newPwd, + String.valueOf(getCurrentUid()), + getTicket() + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_025)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(new Transformer<>()); + } + + /** + * 判断IM 登录状态 + * + * @return + */ + @Override + public boolean isImLogin() { + return statusCode == StatusCode.LOGINED; + } + + /** + * 观察Im连接状态 + */ + private void registerAuthServiceObserver() { + NIMClient.getService(AuthServiceObserver.class).observeOnlineStatus( + new Observer() { + public void onEvent(StatusCode status) { + statusCode = status; + Logger.i("User status changed to: " + status); + if (status.wontAutoLogin()) { + switch (status) { + case KICKOUT: + case KICK_BY_OTHER_CLIENT: + EventBus.getDefault().post(new KickOutEvent()); + break; + case FORBIDDEN: + SingleToastUtil.showToast(status.getDesc()); + AuthModel.get().logout().subscribe(); + Logger.e(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_026)); + break; + case PWD_ERROR: + Logger.e(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_027)); + break; + } + LogUtil.e(TAG, ResUtil.getString(R.string.xchat_android_core_auth_authmodel_028)); + cleanLogInfo(); + } else if (status.shouldReLogin()) { + if (currentAccountInfo.getUid() != 0 && !isInit) { + //IM掉线,但是用户并没有做退出登录,这里只进行IM的重新登录 + Log.i("IMLogin", "shouldReLogin"); + imLogin(currentAccountInfo).subscribe(); + } + } + + isInit = false; + } + }, true); + } + + public Single textIMLogin() { + return imLogin(currentAccountInfo); + } + + /** + * IM登录, 订阅与观察都在Main线程 + * + * @param account + * @return + */ + private Single imLogin(AccountInfo account) { + if (account == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_029))); + } + Logger.i("account:" + account.getUid() + " token:" + account.getNetEaseToken()); + final LoginInfo info = new LoginInfo(String.valueOf(account.getUid()), account.getNetEaseToken()); + Log.i("IMLogin", "account:" + account.getUid() + " token:" + account.getNetEaseToken() + " appkey:" + info.getAppKey()); + LogUtil.e(TAG, ResUtil.getString(R.string.xchat_android_core_auth_authmodel_030)); + return Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter emitter) throws Exception { + NIMClient.getService(AuthService.class).login(info).setCallback(new RequestCallback() { + @Override + public void onSuccess(LoginInfo loginInfo) { + if (loginInfo == null) { + OtherExtKt.doLog("网易云信 登录 -> 失败 code = 登录信息为空"); + onException(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_031))); + return; + } + + NimUIKit.setAccount(loginInfo.getAccount()); + DataCacheManager.buildDataCacheAsync(); + NimUIKit.getImageLoaderKit().buildImageCache(); + + //更新消息提醒配置 + initNotificationConfig(); + + NIMClient.getService(MixPushService.class).enable(true).setCallback(new RequestCallbackWrapper() { + @Override + public void onResult(int code, Void result, Throwable exception) { + Log.e(TAG, "onResult() called with: code = [" + code + "], result = [" + result + "], exception = [" + exception + "]"); + } + }); + + + Log.i("IMLogin", ResUtil.getString(R.string.xchat_android_core_auth_authmodel_032)); + emitter.onSuccess(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_033)); + OtherExtKt.doLog("网易云信 登录 -> 成功"); + } + + @Override + public void onFailed(int code) { + OtherExtKt.doLog("网易云信 登录 -> 失败 code = "+code); + LogUtil.e(TAG, ResUtil.getString(R.string.xchat_android_core_auth_authmodel_034) + code); + emitter.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_auth_authmodel_035) + code)); + } + + @Override + public void onException(Throwable exception) { + OtherExtKt.doLog("网易云信 登录 -> 错误 msg = "+exception.getMessage()); + //如果云信登录出现异常,将info打印到埋点 + String infoJson = JsonUtils.toJson(info); + String error = ResUtil.getString(R.string.xchat_android_core_auth_authmodel_036) + exception.toString() + + ", LoginInfo:" + infoJson; + LogUtil.e(TAG, error); + emitter.onError(new Throwable(error)); + } + }); + } + }) + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + + private void initNotificationConfig() { + // 初始化消息提醒,如果是审核账号,不开启推送 + NIMClient.toggleNotification(!CheckUtils.isCheckUser()); +// // 加载状态栏配置 +// StatusBarNotificationConfig statusBarNotificationConfig = new StatusBarNotificationConfig(); +//// 更新配置 +// NIMClient.updateStatusBarNotificationConfig(statusBarNotificationConfig); + } + + /** + * 用户绑定的手机号是否输入过授权码 + * + * @return + */ + public Single isBoundPhoneAuthCode() { + return api.isBoundPhoneAuthCode() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 绑定授权码 + * + * @return + */ + public Single boundAuthCode(String authCode) { + return api.boundAuthCode(authCode) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 发送验证码 + * + * @param areaCode 地区码 + * @param phone 手机 + * @param type + * @return + */ + public Single getSmsCode(String areaCode, String phone, int type) { + return api.getCode(areaCode, DESUtils.DESAndBase64(phone), String.valueOf(type)) + .subscribeOn(Schedulers.io()) + .map(objectServiceResult -> { + if (!objectServiceResult.isSuccess()) { + throw new RuntimeException(objectServiceResult.getMessage()); + } + return objectServiceResult.getMessage(); + }).observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 邮箱验证码 + */ + public Single getEmailCode(String emailAddress, int type) { + OtherExtKt.doLog("邮箱 = "+emailAddress); + return api.getEmailCode(DESUtils.DESAndBase64(emailAddress), String.valueOf(type)) + .subscribeOn(Schedulers.io()) + .map(objectServiceResult -> { + if (!objectServiceResult.isSuccess()) { + throw new RuntimeException(objectServiceResult.getMessage()); + } + return objectServiceResult.getMessage(); + }).observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 在账号被禁止的情况下发送验证码 + * + * @param phone + * @return + */ + public Single sendLoginCode(String phone, int type) { + return api.sendCode(DESUtils.DESAndBase64(phone), String.valueOf(type)) + .subscribeOn(Schedulers.io()) + .map(objectServiceResult -> { + if (!objectServiceResult.isSuccess()) { + throw new RuntimeException(objectServiceResult.getMessage()); + } + return objectServiceResult.getMessage(); + }).observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 校验登录验证码 + * + * @param account + * @param code + * @return + */ + public Single checkLoginCode(String phoneAreaCode, String account, String code) { + return api.check(phoneAreaCode, account, code) + .map(new Function, String>() { + + @Override + public String apply(ServiceResult objectServiceResult) throws Exception { + if (!objectServiceResult.isSuccess()) { + throw new RuntimeException(objectServiceResult.getMessage()); + } + String message = objectServiceResult.getMessage(); + message = null == message ? "" : message; + return message; + } + }) + .compose(RxHelper.handleSchAndExce()); + } + + /** + * 校验邮箱验证码 + */ + public Single emailVerify(String emailAddress, String code) { + return api.emailVerify(emailAddress, code) + .map(new Function, String>() { + + @Override + public String apply(ServiceResult objectServiceResult) throws Exception { + if (!objectServiceResult.isSuccess()) { + throw new RuntimeException(objectServiceResult.getMessage()); + } + String message = objectServiceResult.getMessage(); + message = null == message ? "" : message; + return message; + } + }) + .compose(RxHelper.handleSchAndExce()); + } + + /******************************************************* API ***********************************************************/ + + private interface Api { + + + /** + * 登录接口 + * + * @param phone + * @param version + * @param client_id + * @param username + * @param password + * @param grant_type + * @param client_secret + * @param code 验证码 + * @return + */ + @FormUrlEncoded + @POST("/oauth/token") + Single login(@Field("phoneAreaCode") String phoneAreaCode, + @Field("phone") String phone, + @Field("email") String email, + @Field("version") String version, + @Field("client_id") String client_id, + @Field("username") String username, + @Field("password") String password, + @Field("grant_type") String grant_type, + @Field("client_secret") String client_secret, + @Field("code") String code, + @Field("yiDunToken") String yiDunToken, + @Field("shuMeiDeviceId") String shuMeiDeviceId + ); + + /** + * 登出接口 + * + * @return + */ + @FormUrlEncoded + @POST("/acc/logout") + Single> logout(@Field("access_token") String token); + + + /** + * 获取ticket + * + * @param issue_type + * @param access_token + * @return + */ + @FormUrlEncoded + @POST("/oauth/ticket") + Single requestTicket(@Field("issue_type") String issue_type, + @Field("access_token") String access_token); + + + /** + * 获取短信验证码 + * + * @param phone + * @param type + * @return + */ + @FormUrlEncoded + @POST("/acc/verification/code") + Single requestSMSCode(@Field("phone") String phone, + @Field("type") String type); + + @FormUrlEncoded + @POST("/acc/pwd/reset") + Single requestResetPsw(@Field("phoneAreaCode") String phoneAreaCode, + @Field("phone") String phone, + @Field("smsCode") String smsCode, + @Field("newPwd") String newPwd); + @FormUrlEncoded + @POST("/acc/pwd/resetByEmail") + Single requestResetPswByEmail(@Field("email") String email, + @Field("code") String code, + @Field("newPwd") String newPwd); + + + /** + * 第三方登录 + * + * @param openid + * @param unionid + * @param type + * @param linkedmeChannel + * @return + */ + @FormUrlEncoded + @POST("/acc/third/login") + Single thirdLogin(@Field("openid") String openid, + @Field("unionid") String unionid, + @Field("type") String type, + @Field("linkedmeChannel") String linkedmeChannel, + @Field("yiDunToken") String yiDunToken, + @Field("shuMeiDeviceId") String shuMeiDeviceId); + + + /** + * 是否绑定手机 + * + * @param uid + * @return + */ + @GET("/user/isBindPhone") + Single isBindPhone(@Query("uid") String uid); + + + /** + * 绑定手机 + * + * @param phone + * @param code + * @param phoneAreaCode + * @return + */ + @FormUrlEncoded + @POST("/user/boundPhone") + Single bindPhone(@Field("phoneAreaCode") String phoneAreaCode, + @Field("phone") String phone, + @Field("code") String code); + /** + * 绑定邮箱 + */ + @FormUrlEncoded + @POST("/user/boundEmail") + Single bindEmail(@Field("email") String email, + @Field("code") String code); + + + /** + * 注册接口 + * + * @param phone + * @param smsCode + * @param password + * @return + */ + @FormUrlEncoded + @POST("/acc/register") + Single register(@Field("phone") String phone, + @Field("smsCode") String smsCode, + @Field("verifyCode") String verifyCode, + @Field("password") String password, + @Field("linkedmeChannel") String linkedmeChannel, + @Field("token") String yiDunToken, + @Field("shuMeiDeviceId") String shuMeiDeviceId); + + /** + * 注册获取验证码 + * + * @param phone + * @return + */ + @FormUrlEncoded + @POST("/acc/captcha/image") + Single getVerificationCode(@Field("phone") String phone, + @Field("timestamp") long timestamp, + @Field("nonce") String nonce, + @Field("sign") String sign); + + + /** + * 修改登录密码 + * + * @param phone + * @param oldPasswd + * @param newPasswd + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("acc/pwd/modify") + Single> changeLoginPwd(@Field("phone") String phone, + @Field("pwd") String oldPasswd, + @Field("newPwd") String newPasswd, + @Field("ticket") String ticket); + + /** + * 设置登录密码, 第三方登录 没有登录密码,通过这个接口设置密码,账号就是耳伴号 + * + * @param phone + * @param newPasswd + * @param uid + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("acc/pwd/set") + Single> setLoginPwd(@Field("phone") String phone, + @Field("newPwd") String newPasswd, + @Field("uid") String uid, + @Field("ticket") String ticket); + + /** + * 用户绑定的手机号是否输入过授权码 + * + * @return + */ + @GET("phone/auth/isBoundPhoneAuthCode") + Single> isBoundPhoneAuthCode(); + + /** + * 绑定授权码 + * + * @return + */ + @FormUrlEncoded + @POST("phone/auth/bound") + Single> boundAuthCode(@Field("authCode") String authCode); + + /** + * 发送验证码 + * + * @param phone + * @param type + * @return + */ + @FormUrlEncoded + @POST("sms/getCode") + Single> getCode(@Field("phoneAreaCode") String phoneAreaCode, @Field("mobile") String phone, @Field("type") String type); + + /** + * 发送邮箱验证码 + */ + @FormUrlEncoded + @POST("email/getCode") + Single> getEmailCode(@Field("emailAddress") String emailAddress, @Field("type") String type); + + /** + * 发送验证码 + * + * @param phone + * @param type + * @return + */ + @FormUrlEncoded + @POST("sms/getCode") + Single> sendCode(@Field("mobile") String phone, @Field("type") String type); + + /** + * 验证验证码 + * + * @param phone + * @param code + * @return + */ + @FormUrlEncoded + @POST("sms/login/verify") + Single> check(@Field("phoneAreaCode") String phoneAreaCode, @Field("phone") String phone, @Field("code") String code); + + /** + * 校验邮箱验证码 + */ + @FormUrlEncoded + @POST("email/verify") + Single> emailVerify(@Field("emailAddress") String emailAddress, @Field("code") String code); + + /** + * @param token 易盾一键登录token + * @param accessToken 易盾一键登录accessToken + * @param shuMeiDeviceId 数美设备id + * @param yiDunToken 易盾登录保护token + * @return + */ + @FormUrlEncoded + @POST("acc/oneclick/login") + Single quickPassLogin(@Field("token") String token, + @Field("accessToken") String accessToken, + @Field("shuMeiDeviceId") String shuMeiDeviceId, + @Field("yiDunToken") String yiDunToken + ); + + @FormUrlEncoded + @POST("user/recover/user") + Single> recoverAccount(@Field("erbanNo") String erbanNo); + + + } +} diff --git a/core/src/main/java/com/chwl/core/auth/IAuthModel.java b/core/src/main/java/com/chwl/core/auth/IAuthModel.java new file mode 100644 index 0000000..d19a9a8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/IAuthModel.java @@ -0,0 +1,154 @@ +package com.chwl.core.auth; + +import android.app.Activity; + +import com.chwl.core.auth.entity.ThirdUserInfo; +import com.chwl.core.base.IModel; +import com.example.module_base.support.login.ILoginService; + +import io.reactivex.Single; + +public interface IAuthModel extends IModel { + + ILoginService getGoogleLoginService(); + + ThirdUserInfo getThirdUserInfo(); + + void setThirdUserInfo(ThirdUserInfo thirdUserInfo); + + + /** + * 获取当前登录的uid,登录成功后就有值了 + * + * @return + */ + long getCurrentUid(); + + /** + * 获取ticket,登录成功后就有真实值 + * + * @return + */ + String getTicket(); + + /** + * 判断是否已登录 + */ + boolean isLogin(); + boolean isMy(long uid); + + /** + * 自动登录 + * + * @return + */ + Single autoLogin(); + + /** + * 账号密码登录 + * + * @param account + * @param password + * @return + */ + Single login(String account,String email, String password, String yiDunToken, String shuMeiDeviceId,String type); + + /** + * 带验证码的账号密码登录 + * + * @param account + * @param password + * @param code 验证码 + * @return + */ + Single login(String phoneAreaCode, String account,String email, String password, String code, String yiDunToken, String shuMeiDeviceId,String type); + + Single googleLogin(Activity activity); + + /** + * 重置用户信息 + */ + void reset(); + + /** + * 重置密码 + * + * @param phone + * @param sms_code + * @param newPsw + * @return + */ + Single requestResetPsw(String phoneAreaCode, String phone, String sms_code, String newPsw); + + /** + * 重置密码 - 邮箱 + * @param email + * @param code + * @param newPsw + * @return + */ + Single requestResetPswByEmail(String email, String code, String newPsw); + + /** + * 当前用户是否绑定手机 + * + * @return + */ + Single isBindPhone(); + + /** + * 绑定手机 + * + * @param phone + * @param code + * @return + */ + Single bindPhone(String phoneAreaCode, String phone, String code); + Single bindEmail(java.lang.String email, java.lang.String code); + + /** + * 注册 + * + * @param phone + * @param sms_code + * @param password + * @param yiDunToken 易盾的 token + * @param shuMeiDeviceId 数美天网的 deviceId + * @return + */ + Single register(String phone, String sms_code, String verifyCode, String password, + String yiDunToken, String shuMeiDeviceId); + + Single logout(); + + /** + * 修改登录密码 + * + * @param phone + * @param oldPwd + * @param newPwd + * @return + */ + Single modifyLoginPwd(String phone, + String oldPwd, + String newPwd); + + /** + * 设置登录密码,在第三方登录的情况下是没有登录密码的,这里接口可以设置登录密码,账号为耳伴号 + * + * @param phone + * @param newPwd + * @return + */ + Single setLoginPwd(String phone, + String newPwd); + + /** + * 判断IM 登录状态 + * + * @return + */ + boolean isImLogin(); + + +} diff --git a/core/src/main/java/com/chwl/core/auth/entity/AccountInfo.java b/core/src/main/java/com/chwl/core/auth/entity/AccountInfo.java new file mode 100644 index 0000000..ac84f4c --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/entity/AccountInfo.java @@ -0,0 +1,82 @@ +package com.chwl.core.auth.entity; + +import java.io.Serializable; + +/** + * Created by zhouxiangfeng on 17/3/5. + */ + +public class AccountInfo implements Serializable{ + private long uid; + private String access_token; + private String netEaseToken; + private String token_type; + private String refresh_token; + private String expires_in; + private String scope; + private String jti; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getNetEaseToken() { + return netEaseToken; + } + + public void setNetEaseToken(String netEaseToken) { + this.netEaseToken = netEaseToken; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getToken_type() { + return token_type; + } + + public void setToken_type(String token_type) { + this.token_type = token_type; + } + + public String getRefresh_token() { + return refresh_token; + } + + public void setRefresh_token(String refresh_token) { + this.refresh_token = refresh_token; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getJti() { + return jti; + } + + public void setJti(String jti) { + this.jti = jti; + } +} diff --git a/core/src/main/java/com/chwl/core/auth/entity/ThirdUserInfo.java b/core/src/main/java/com/chwl/core/auth/entity/ThirdUserInfo.java new file mode 100644 index 0000000..81c8486 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/entity/ThirdUserInfo.java @@ -0,0 +1,68 @@ +package com.chwl.core.auth.entity; + +import java.io.Serializable; + +/** + * Created by Administrator on 2017/8/4. + */ + +public class ThirdUserInfo implements Serializable { + private String userName; + private String userIcon; + private String userGender; + private String platform; + private long birth; + private int type; + + public static final int TYPE_FACEBOOK = 1; + public static final int TYPE_LINE = 2; + public static final int TYPE_GOOGLE = 3; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserIcon() { + return userIcon; + } + + public void setUserIcon(String userIcon) { + this.userIcon = userIcon; + } + + public String getUserGender() { + return userGender; + } + + public void setUserGender(String userGender) { + this.userGender = userGender; + } + + public long getBirth() { + return birth; + } + + public void setBirth(long birth) { + this.birth = birth; + } +} diff --git a/core/src/main/java/com/chwl/core/auth/entity/TicketInfo.java b/core/src/main/java/com/chwl/core/auth/entity/TicketInfo.java new file mode 100644 index 0000000..4acb7e3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/entity/TicketInfo.java @@ -0,0 +1,50 @@ +package com.chwl.core.auth.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class TicketInfo implements Serializable{ + private String issue_type; + private List tickets; + + public String getIssue_type() { + return issue_type; + } + + public void setIssue_type(String issue_type) { + this.issue_type = issue_type; + } + + public List getTickets() { + return tickets; + } + + public void setTickets(List tickets) { + this.tickets = tickets; + } + + public class Ticket implements Serializable{ + private String ticket; + private String expires_in; + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + } +} diff --git a/core/src/main/java/com/chwl/core/auth/event/BindPhoneEvent.java b/core/src/main/java/com/chwl/core/auth/event/BindPhoneEvent.java new file mode 100644 index 0000000..db47301 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/event/BindPhoneEvent.java @@ -0,0 +1,11 @@ +package com.chwl.core.auth.event; + +import lombok.Data; + +/** + * 登录成功事件 + */ +@Data +public class BindPhoneEvent { + +} diff --git a/core/src/main/java/com/chwl/core/auth/event/GetCurrentUidEvent.java b/core/src/main/java/com/chwl/core/auth/event/GetCurrentUidEvent.java new file mode 100644 index 0000000..edb80ba --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/event/GetCurrentUidEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.auth.event; + +import com.chwl.core.base.BaseDataEvent; + +/** + * + * Created by lvzebiao on 2018/10/15. + */ + +public class GetCurrentUidEvent extends BaseDataEvent { + public GetCurrentUidEvent(Boolean data) { + super(data); + } +} diff --git a/core/src/main/java/com/chwl/core/auth/event/KickOutEvent.java b/core/src/main/java/com/chwl/core/auth/event/KickOutEvent.java new file mode 100644 index 0000000..65a15aa --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/event/KickOutEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.auth.event; + +/** + * 踢出事件 + */ +public class KickOutEvent { +} diff --git a/core/src/main/java/com/chwl/core/auth/event/LoginEvent.java b/core/src/main/java/com/chwl/core/auth/event/LoginEvent.java new file mode 100644 index 0000000..6ce34d4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/event/LoginEvent.java @@ -0,0 +1,11 @@ +package com.chwl.core.auth.event; + +import lombok.Data; + +/** + * 登录成功事件 + */ +@Data +public class LoginEvent { + private long uid; +} diff --git a/core/src/main/java/com/chwl/core/auth/event/LoginReportEvent.java b/core/src/main/java/com/chwl/core/auth/event/LoginReportEvent.java new file mode 100644 index 0000000..2179673 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/event/LoginReportEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.auth.event; + +import lombok.Data; + +/** + * 三方登录上报事件 + */ +@Data +public class LoginReportEvent { + private int loginType; + + public LoginReportEvent(int loginType) { + this.loginType = loginType; + } +} diff --git a/core/src/main/java/com/chwl/core/auth/event/LogoutEvent.java b/core/src/main/java/com/chwl/core/auth/event/LogoutEvent.java new file mode 100644 index 0000000..fd66ec6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/event/LogoutEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.auth.event; + +/** + * 退出登录事件 + */ +public class LogoutEvent { + +} diff --git a/core/src/main/java/com/chwl/core/auth/exception/AccountCancelException.java b/core/src/main/java/com/chwl/core/auth/exception/AccountCancelException.java new file mode 100644 index 0000000..c0806f7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/exception/AccountCancelException.java @@ -0,0 +1,21 @@ +package com.chwl.core.auth.exception; + +public class AccountCancelException extends Exception { + + private long cancelDate; + private long erbanNo; + + public AccountCancelException(String message, long erbanNo, long cancelDate) { + super(message); + this.erbanNo = erbanNo; + this.cancelDate = cancelDate; + } + + public long getCancelDate() { + return cancelDate; + } + + public long getErbanNo() { + return erbanNo; + } +} diff --git a/core/src/main/java/com/chwl/core/auth/exception/BanAccountException.java b/core/src/main/java/com/chwl/core/auth/exception/BanAccountException.java new file mode 100644 index 0000000..ccaca92 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/exception/BanAccountException.java @@ -0,0 +1,15 @@ +package com.chwl.core.auth.exception; + +public class BanAccountException extends Exception { + + private long date; + + public BanAccountException(String message, long date) { + super(message); + this.date = date; + } + + public long getDate() { + return date; + } +} diff --git a/core/src/main/java/com/chwl/core/auth/exception/BigHeadPhoneException.java b/core/src/main/java/com/chwl/core/auth/exception/BigHeadPhoneException.java new file mode 100644 index 0000000..447ca99 --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/exception/BigHeadPhoneException.java @@ -0,0 +1,8 @@ +package com.chwl.core.auth.exception; + +public class BigHeadPhoneException extends Exception { + + public BigHeadPhoneException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/auth/exception/IsSuperAdminException.java b/core/src/main/java/com/chwl/core/auth/exception/IsSuperAdminException.java new file mode 100644 index 0000000..5ff0aba --- /dev/null +++ b/core/src/main/java/com/chwl/core/auth/exception/IsSuperAdminException.java @@ -0,0 +1,9 @@ +package com.chwl.core.auth.exception; + +public class IsSuperAdminException extends Exception { + + public IsSuperAdminException(String message) { + super(message); + } + +} diff --git a/core/src/main/java/com/chwl/core/base/BaseBusEvent.java b/core/src/main/java/com/chwl/core/base/BaseBusEvent.java new file mode 100644 index 0000000..8160213 --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/BaseBusEvent.java @@ -0,0 +1,16 @@ +package com.chwl.core.base; + +import lombok.Data; + +/** + * create by lvzebiao on 2018/8/29 + */ +@Data +public class BaseBusEvent { + private T data; + + public BaseBusEvent(T data) { + this.data = data; + } + +} diff --git a/core/src/main/java/com/chwl/core/base/BaseDataEvent.java b/core/src/main/java/com/chwl/core/base/BaseDataEvent.java new file mode 100644 index 0000000..3493656 --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/BaseDataEvent.java @@ -0,0 +1,27 @@ +package com.chwl.core.base; + +import lombok.Data; + +/** + * create by lvzebiao on 2018/9/5 + */ +@Data +public class BaseDataEvent { + + private boolean failed; + + private String error; + + private T data; + + public BaseDataEvent(T data) { + this.data = data; + failed = false; + } + + public BaseDataEvent(String error) { + this.error = error; + failed = true; + } + +} diff --git a/core/src/main/java/com/chwl/core/base/BaseErrorEvent.java b/core/src/main/java/com/chwl/core/base/BaseErrorEvent.java new file mode 100644 index 0000000..eee88c1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/BaseErrorEvent.java @@ -0,0 +1,20 @@ +package com.chwl.core.base; + +import lombok.Data; + +@Data +public class BaseErrorEvent { + + private int code; + private String error; + + public BaseErrorEvent setCode(int code) { + this.code = code; + return this; + } + + public BaseErrorEvent setError(String error) { + this.error = error; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/base/BaseErrorException.java b/core/src/main/java/com/chwl/core/base/BaseErrorException.java new file mode 100644 index 0000000..0b15cfa --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/BaseErrorException.java @@ -0,0 +1,12 @@ +package com.chwl.core.base; + +/** + * create by lvzebiao @2019/8/7 + */ +public class BaseErrorException extends Exception { + + public BaseErrorException(String msg) { + super(msg); + } + +} diff --git a/core/src/main/java/com/chwl/core/base/BaseModel.java b/core/src/main/java/com/chwl/core/base/BaseModel.java new file mode 100644 index 0000000..135336e --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/BaseModel.java @@ -0,0 +1,131 @@ +package com.chwl.core.base; + +import android.content.Context; + +import com.chwl.core.R; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.net.rxnet.exception.ExceptionHandle; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.config.BasicConfig; + +import java.net.UnknownHostException; + +import io.reactivex.Observable; +import io.reactivex.ObservableSource; +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.SingleTransformer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; + +public abstract class BaseModel implements IModel { + + public BaseModel() { + // 确保有默认构造函数 + } + + protected Context getContext() { + return BasicConfig.INSTANCE.getAppContext(); + } + + + public void execute(Observable> observable, final CallBack callBack) { + observable.subscribe(new DisposableObserver>() { + @Override + public void onNext(ServiceResult tServiceResult) { + if (tServiceResult != null) { + if (tServiceResult.isSuccess()) { + if (callBack != null) { + callBack.onSuccess(tServiceResult.getData()); + } + } else { + if (callBack != null) { + callBack.onFail(-1, tServiceResult.getError()); + } + } + } else { + if (callBack != null) { + callBack.onFail(-1, ResUtil.getString(R.string.xchat_android_core_base_basemodel_01)); + } + } + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + if (callBack != null) { + String error = ExceptionHandle.Companion.handleException(e); + callBack.onFail(-1, error); + } + } + + @Override + public void onComplete() { + + } + }); + } + + public void execute(Single> single, final CallBack callBack) { + execute(single.toObservable(), callBack); + } + + protected Function, ObservableSource> getFunction() { + return roomInfoServiceResult -> { + if (roomInfoServiceResult == null) + return Observable.error(new Throwable("roomInfoServiceResult == null")); + if (roomInfoServiceResult.isSuccess()) + Observable.just(roomInfoServiceResult.getData()); + return Observable.error(new Throwable( + roomInfoServiceResult.getCode() + "-" + roomInfoServiceResult.getErrorMessage())); + }; + } + + protected Function>> getCommonExceptionFunction() { + return throwable -> { + ServiceResult errorResult = new ServiceResult<>(); + if (throwable instanceof UnknownHostException) { + errorResult.setCode(ServiceResult.NOT_NET); + } else { + errorResult.setCode(ServiceResult.OTHER); + } + return Observable.error(new Throwable(errorResult.getErrorMessage())); + }; + } + + + protected Function, SingleSource> getSingleFunction() { + return roomInfoServiceResult -> { + if (roomInfoServiceResult == null) + return Single.error(new Throwable("roomInfoServiceResult == null")); + if (roomInfoServiceResult.isSuccess()) + return Single.just(roomInfoServiceResult.getData()); + return Single.error(new Throwable(roomInfoServiceResult.getErrorMessage())); + }; + } + + + protected Function>> getSingleCommonExceptionFunction() { + return throwable -> { + ServiceResult errorResult = new ServiceResult<>(); + if (throwable instanceof UnknownHostException) { + errorResult.setCode(ServiceResult.NOT_NET); + } else { + errorResult.setCode(ServiceResult.OTHER); + } + return Single.error(new Throwable(errorResult.getErrorMessage())); + }; + } + + public class Transformer implements SingleTransformer { + @Override + public SingleSource apply(Single upstream) { + return upstream.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/base/CancelNoToastException.java b/core/src/main/java/com/chwl/core/base/CancelNoToastException.java new file mode 100644 index 0000000..47bd8e8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/CancelNoToastException.java @@ -0,0 +1,13 @@ +package com.chwl.core.base; + +/** + * 点击取消按钮,但是不需要toast error的情况 + * create by lvzebiao @2019/9/3 + */ +public class CancelNoToastException extends Throwable { + + public CancelNoToastException() { + super("cancel"); + } + +} diff --git a/core/src/main/java/com/chwl/core/base/IModel.java b/core/src/main/java/com/chwl/core/base/IModel.java new file mode 100644 index 0000000..94beb52 --- /dev/null +++ b/core/src/main/java/com/chwl/core/base/IModel.java @@ -0,0 +1,4 @@ +package com.chwl.core.base; + +public interface IModel { +} diff --git a/core/src/main/java/com/chwl/core/bean/BaseProtocol.java b/core/src/main/java/com/chwl/core/bean/BaseProtocol.java new file mode 100644 index 0000000..795c4cb --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/BaseProtocol.java @@ -0,0 +1,74 @@ +package com.chwl.core.bean; + +/** + * 广播通用协议 + * Created by MadisonRong on 09/04/2018. + */ +public class BaseProtocol { + + protected int first; + protected int second; + protected T data; + + public BaseProtocol() { + } + + public BaseProtocol(int first, int second, T data) { + this.first = first; + this.second = second; + this.data = data; + } + + public int getFirst() { + return first; + } + + public void setFirst(int first) { + this.first = first; + } + + public int getSecond() { + return second; + } + + public void setSecond(int second) { + this.second = second; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof BaseProtocol)) return false; + + BaseProtocol that = (BaseProtocol) o; + + if (getFirst() != that.getFirst()) return false; + if (getSecond() != that.getSecond()) return false; + return getData() != null ? getData().equals(that.getData()) : that.getData() == null; + } + + @Override + public int hashCode() { + int result = getFirst(); + result = 31 * result + getSecond(); + result = 31 * result + (getData() != null ? getData().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "BaseProtocol{" + + "first=" + first + + ", second=" + second + + ", data='" + data + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/bean/CarButtonInfo.java b/core/src/main/java/com/chwl/core/bean/CarButtonInfo.java new file mode 100644 index 0000000..212fa02 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/CarButtonInfo.java @@ -0,0 +1,10 @@ +package com.chwl.core.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class CarButtonInfo implements Serializable { + private String context; +} diff --git a/core/src/main/java/com/chwl/core/bean/EventMyBean.java b/core/src/main/java/com/chwl/core/bean/EventMyBean.java new file mode 100644 index 0000000..1e7630e --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/EventMyBean.java @@ -0,0 +1,4 @@ +package com.chwl.core.bean; + +public class EventMyBean { +} diff --git a/core/src/main/java/com/chwl/core/bean/EventOfficialBean.java b/core/src/main/java/com/chwl/core/bean/EventOfficialBean.java new file mode 100644 index 0000000..aa47881 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/EventOfficialBean.java @@ -0,0 +1,54 @@ +package com.chwl.core.bean; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class EventOfficialBean { + + public long id; //活动id + public long uid; + public long roomUid; + public String avatar; + public String roomAvatar; + public String nick; + public int erbanNo; + public int gender; //性别 + public int subNum; //订阅数 + public boolean subStatus; //订阅原状态 + public int eventStatus; // 0-待审核,1-审核通过,2-拒绝,3-删除,4-过期 + public int liveStatus; // 1未开始,2进行中,3-已结束 + public String eventTopic; //标题 + public String eventBanner; //底图 + public String eventStartTimeStr; //大于24小时 显示这个 + public long offectTimes; //当前时间距离活动开始时间还剩多少 毫秒 , 小于24小时 显示这个 为负数时不处理 + + + + public int btnStatus = -1; // 按钮状态,点击事件用 + + public boolean isEventReady() { + return eventStatus == 1 && liveStatus == 1; + } + public boolean isEventStart() { + return eventStatus == 1 && liveStatus == 2; + } + public boolean isEventEnd() { + return eventStatus == 1 && liveStatus == 3; + } + + + public boolean isReview() { + return eventStatus == 1; + } + + public boolean isUnderReview() { + return eventStatus == 0; + } + + + + + +} diff --git a/core/src/main/java/com/chwl/core/bean/EventRoomBean.java b/core/src/main/java/com/chwl/core/bean/EventRoomBean.java new file mode 100644 index 0000000..637d1cf --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/EventRoomBean.java @@ -0,0 +1,8 @@ +package com.chwl.core.bean; + +public class EventRoomBean { + public long roomUid; + public long erbanNo; + public String avatar; + public String roomName; +} diff --git a/core/src/main/java/com/chwl/core/bean/EventRoomEntity.java b/core/src/main/java/com/chwl/core/bean/EventRoomEntity.java new file mode 100644 index 0000000..ada8b3b --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/EventRoomEntity.java @@ -0,0 +1,8 @@ +package com.chwl.core.bean; + +import java.util.List; + +public class EventRoomEntity { + public EventRoomBean selfRoom; + public List manageRooms; +} diff --git a/core/src/main/java/com/chwl/core/bean/EventSquareBean.java b/core/src/main/java/com/chwl/core/bean/EventSquareBean.java new file mode 100644 index 0000000..ab7e3b9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/EventSquareBean.java @@ -0,0 +1,4 @@ +package com.chwl.core.bean; + +public class EventSquareBean { +} diff --git a/core/src/main/java/com/chwl/core/bean/GiftTitleInfo.java b/core/src/main/java/com/chwl/core/bean/GiftTitleInfo.java new file mode 100644 index 0000000..cac4817 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/GiftTitleInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class GiftTitleInfo implements Serializable { + private String title; + private String num; +} diff --git a/core/src/main/java/com/chwl/core/bean/I18N.kt b/core/src/main/java/com/chwl/core/bean/I18N.kt new file mode 100644 index 0000000..ddd4e49 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/I18N.kt @@ -0,0 +1,50 @@ +package com.chwl.core.bean + +import androidx.annotation.Keep +import com.chwl.library.language.LanguageHelper +import java.io.Serializable + + +/** + * Created by Max on 2024/2/22 18:36 + * Desc: + **/ +@Keep +class I18N : HashMap(), Serializable { + + companion object { + @JvmStatic + fun getFirstOrDefault(i18N: I18N?, default: String?): String? { + val text = i18N?.getFirstText() + if (text.isNullOrEmpty()) { + return default + } + return text + } + } + + /** + * 获取优先显示文本 + */ + fun getFirstText(): String? { + // 目前应用只支持繁体,后续支持其他语言,这里需要调整 + val content = get(LanguageHelper.getCurrentLanguageType()) + return if (content.isNullOrEmpty()) { + this.values.firstOrNull() + } else { + content + } + } + + fun setZH(value: String) { + put(LanguageHelper.ZH, value) + } + + fun setEN(value: String) { + put(LanguageHelper.EN, value) + } + + fun setAR(value: String) { + put(LanguageHelper.AR, value) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/IRouterData.kt b/core/src/main/java/com/chwl/core/bean/IRouterData.kt new file mode 100644 index 0000000..07bf6ec --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/IRouterData.kt @@ -0,0 +1,20 @@ +package com.chwl.core.bean + +import java.io.Serializable + +/** + * Created by Max on 2024/2/20 16:43 + * Desc:路由跳转参数 + **/ +interface IRouterData : Serializable { + + fun getSkipUri(): String? + + fun getSkipType(): Int + + @Deprecated("SkipType==5时用到该值,后台讲这种已经没用到了") + fun getRouterType(): String? + + @Deprecated("SkipType==5时用到该值,后台讲这种已经没用到了") + fun getRouterValue(): String? +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/LoginTipsInfo.java b/core/src/main/java/com/chwl/core/bean/LoginTipsInfo.java new file mode 100644 index 0000000..9c5f02b --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/LoginTipsInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean; + +import lombok.Data; + +@Data +public class LoginTipsInfo { + private String tips; + private boolean showWechat; + private boolean showQq; + private boolean showOneClick; +} diff --git a/core/src/main/java/com/chwl/core/bean/PrivateChatLimitInfo.java b/core/src/main/java/com/chwl/core/bean/PrivateChatLimitInfo.java new file mode 100644 index 0000000..fde9ca6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/PrivateChatLimitInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class PrivateChatLimitInfo implements Serializable { + private boolean chat; + private String message; + private int wealthLevel; + private int charmLevel; + + private int nextVipLevel = -1; //下一级Vip等级 只返 nextVipLevel 表示未達到 第一個彈窗的級別(目前是vip3) + private int nextUserCountLimit = -1; //聊天人数 兩個都沒返,表示達到最大等級 + +} diff --git a/core/src/main/java/com/chwl/core/bean/ProgressInfo.java b/core/src/main/java/com/chwl/core/bean/ProgressInfo.java new file mode 100644 index 0000000..af6d985 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/ProgressInfo.java @@ -0,0 +1,40 @@ +package com.chwl.core.bean; + +/** + * 进度信息 + * + * @author zhongyongsheng on 14-9-25. + */ +public class ProgressInfo { + private long progress; + private long total; + + public ProgressInfo(long progress, long total) { + this.progress = progress; + this.total = total; + } + + public long getProgress() { + return progress; + } + + public void setProgress(long progress) { + this.progress = progress; + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + @Override + public String toString() { + return "ProgressInfo{" + + "progress=" + progress + + ", total=" + total + + '}'; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/RegionBean.kt b/core/src/main/java/com/chwl/core/bean/RegionBean.kt new file mode 100644 index 0000000..d5167eb --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/RegionBean.kt @@ -0,0 +1,47 @@ +package com.chwl.core.bean + +import com.chad.library.adapter.base.entity.MultiItemEntity + +/** + * Created by Max on 2023/12/7 18:48 + * Desc:地区 + **/ +data class RegionBean( + // 名称(英文) + val name: String?, + // 简称 + val abbr: String?, + // 区号 + val code: String?, + // MCC + val mcc: String? +) : MultiItemEntity { + + val fullCode: String? + get() { + if (code == null) { + return null + } + return if (code.startsWith("+")) { + code + } else { + "+$code" + } + } + + // 本地分组用到 + var groupName: Char? = null + + // 本地排序用到 + var sortedBy: String? = null + + private var itemType: Int = 0 + + fun setItemType(itemType: Int) { + this.itemType = itemType + } + + override fun getItemType(): Int { + return itemType + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/RoomHistoryInfo.java b/core/src/main/java/com/chwl/core/bean/RoomHistoryInfo.java new file mode 100644 index 0000000..cc5a298 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/RoomHistoryInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class RoomHistoryInfo implements Serializable { + private long roomUid; + private long roomId; + private long erbanNo; + private long updateTime; + private String title; + private String avatar; + private boolean valid; +} diff --git a/core/src/main/java/com/chwl/core/bean/RoomMicInfo.java b/core/src/main/java/com/chwl/core/bean/RoomMicInfo.java new file mode 100644 index 0000000..f0059c0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/RoomMicInfo.java @@ -0,0 +1,105 @@ +package com.chwl.core.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + *

房间麦序(坑位)信息实体

+ * + * @author jiahui + * @date 2017/12/13 + */ +public class RoomMicInfo implements Parcelable { + + + /** 当前坑位位置 */ + private int position; + /** 当前坑位是否锁住,0:开锁,1:闭锁 */ + private int posState; + /** 当前坑位是否开麦,0:开麦,1:闭麦 */ + private int micState; + + protected RoomMicInfo(Parcel in) { + position = in.readInt(); + posState = in.readInt(); + micState = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(position); + dest.writeInt(posState); + dest.writeInt(micState); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public RoomMicInfo createFromParcel(Parcel in) { + return new RoomMicInfo(in); + } + + @Override + public RoomMicInfo[] newArray(int size) { + return new RoomMicInfo[size]; + } + }; + + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public int getPosState() { + return posState; + } + + public void setPosState(int posState) { + this.posState = posState; + } + + public int getMicState() { + return micState; + } + + public void setMicState(int micState) { + this.micState = micState; + } + + /** + * 坑位是否锁了 + * + * @return true:锁了,false:没锁 + */ + public boolean isMicLock() { + return 1 == posState; + } + + + /** + * 坑位是否闭麦了 + * + * @return true:闭麦,false:开麦 + */ + public boolean isMicMute() { + return 1 == micState; + } + + @Override + public String toString() { + return "RoomMicInfo{" + + ", position=" + position + + ", posState=" + posState + + ", micState=" + micState + + '}'; + } + +} diff --git a/core/src/main/java/com/chwl/core/bean/RoomNewbieInfo.java b/core/src/main/java/com/chwl/core/bean/RoomNewbieInfo.java new file mode 100644 index 0000000..315209e --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/RoomNewbieInfo.java @@ -0,0 +1,21 @@ +package com.chwl.core.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class RoomNewbieInfo implements Serializable { + private int uid; + private int erbanNo; + private String avatar; + private String nick; + private int gender; + private int experLevelSeq; + private String experUrl; + private int charmLevelSeq; + private String charmUrl; + private boolean hello; + private long birth; + +} diff --git a/core/src/main/java/com/chwl/core/bean/RoomNewbieMessageInfo.java b/core/src/main/java/com/chwl/core/bean/RoomNewbieMessageInfo.java new file mode 100644 index 0000000..2a0bd4a --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/RoomNewbieMessageInfo.java @@ -0,0 +1,69 @@ +package com.chwl.core.bean; + +import java.io.Serializable; +import java.util.List; + +public class RoomNewbieMessageInfo implements Serializable { + + + + /** + * start : 20 + * list : [{"id":16,"message":ResUtil.getString(R.string.xchat_android_core_bean_roomnewbiemessageinfo_01)},{"id":17,"message":ResUtil.getString(R.string.xchat_android_core_bean_roomnewbiemessageinfo_02)},{"id":18,"message":ResUtil.getString(R.string.xchat_android_core_bean_roomnewbiemessageinfo_03)},{"id":19,"message":ResUtil.getString(R.string.xchat_android_core_bean_roomnewbiemessageinfo_04)},{"id":20,"message":ResUtil.getString(R.string.xchat_android_core_bean_roomnewbiemessageinfo_05)}] + */ + + private int start; + private List list; + + public int getStart() { + return start; + } + + public void setStart(int start) { + this.start = start; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class ListBean { + /** + * id : 16 + * message : 谈恋爱太麻烦了,以后就麻烦你了 + */ + + private int id; + private String message; + private boolean check; + + public boolean isCheck() { + return check; + } + + public void setCheck(boolean check) { + this.check = check; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } + +} diff --git a/core/src/main/java/com/chwl/core/bean/RoomQueueInfo.java b/core/src/main/java/com/chwl/core/bean/RoomQueueInfo.java new file mode 100644 index 0000000..b19549f --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/RoomQueueInfo.java @@ -0,0 +1,32 @@ +package com.chwl.core.bean; + +import com.chwl.core.room.giftvalue.bean.GiftValueData; +import com.chwl.core.room.queue.bean.MicMemberInfo; + +/** + *

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

+ * + * @author jiahui + * @date 2017/12/13 + */ +public class RoomQueueInfo { + /** 坑位信息(是否所坑,开麦等) */ + public RoomMicInfo mRoomMicInfo; + /** 坑上人员信息 */ + public MicMemberInfo mChatRoomMember; + + public GiftValueData giftValueData = new GiftValueData(); + + public RoomQueueInfo(RoomMicInfo roomMicInfo, MicMemberInfo chatRoomMember) { + mRoomMicInfo = roomMicInfo; + mChatRoomMember = chatRoomMember; + } + + @Override + public String toString() { + return "RoomQueueInfo{" + + "mRoomMicInfo=" + mRoomMicInfo + + ", mChatRoomMember=" + mChatRoomMember + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/bean/UserInfoItem.java b/core/src/main/java/com/chwl/core/bean/UserInfoItem.java new file mode 100644 index 0000000..4545586 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/UserInfoItem.java @@ -0,0 +1,97 @@ +package com.chwl.core.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class UserInfoItem implements MultiItemEntity, Parcelable, Serializable { + + public static final transient int TYPE_NONE = 0; // 空对象 + public static final transient int TYPE_DIV = 1;// 分割线 + public static final transient int TYPE_TITLE = 2;// 标题 + + public static final transient int TYPE_MAGIC_ITEMS = 3;// 礼物_魔法礼物列表 + public static final transient int TYPE_RADISH_ITEMS = 4;// 礼物_萝卜礼物列表 + public static final transient int TYPE_GIFT_ITEM = 5;// 礼物_礼物列表 + public static final transient int TYPE_GIFT_EMPTY = 6;// 礼物_礼物列表为空 + + public static final transient int TYPE_CAR_ITEM = 7;// 座驾_我的座驾 + public static final transient int TYPE_CAR_BUTTON = 8;// 座驾_赠送/购买 + public static final transient int TYPE_CAR_EMPTY = 9;// 座驾_我的座驾列表为空 + + public static final transient int TYPE_DES_PHOTO = 10;// 资料_相册 + public static final transient int TYPE_DES_PERSONAL = 11;// 资料_个人介绍 + public static final transient int TYPE_DES_VOICE = 12;// 资料_我的声音 + public static final transient int TYPE_DES_FAMILY = 13;// 资料_家族 + public static final transient int TYPE_DES_HALL = 14;// 资料_模厅 + public static final transient int TYPE_DES_GAME = 15;// 资料_本周战绩 + public static final transient int TYPE_DES_JOIN_WORLDS = 17;// 资料_话题列表 + public static final transient int TYPE_GIFT_ITEM_TOP = 18;// 礼物_礼物列表置顶 + + //类型 + private int itemType; + private int tag; + + //正常数据 + private T data; + + public UserInfoItem(int itemType) { + this(itemType, null); + } + + + public UserInfoItem(int itemType, T data) { + this.itemType = itemType; + this.data = data; + } + + protected UserInfoItem(Parcel in) { + itemType = in.readInt(); + data = (T) in.readSerializable(); + tag = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public UserInfoItem createFromParcel(Parcel in) { + return new UserInfoItem(in); + } + + @Override + public UserInfoItem[] newArray(int size) { + return new UserInfoItem[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(itemType); + dest.writeSerializable(data); + dest.writeInt(tag); + } + + @Override + public int getItemType() { + return itemType; + } + + public void setData(T data) { + this.data = data; + } + + public T getData() { + return data; + } + +} diff --git a/core/src/main/java/com/chwl/core/bean/VersionInfo.java b/core/src/main/java/com/chwl/core/bean/VersionInfo.java new file mode 100644 index 0000000..b848e25 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/VersionInfo.java @@ -0,0 +1,50 @@ +package com.chwl.core.bean; + +/** + * Created by huangmeng1 on 2018/7/18. + */ + +public class VersionInfo { + /** + * os : iOS + * version : 2.0.0 + * status : 1 + */ + + private String os; + private String version; + private int status; + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @Override + public String toString() { + return "VersionInfo{" + + "os='" + os + '\'' + + ", version='" + version + '\'' + + ", status=" + status + + '}'; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} diff --git a/core/src/main/java/com/chwl/core/bean/attachmsg/RoomQueueMsgAttachment.java b/core/src/main/java/com/chwl/core/bean/attachmsg/RoomQueueMsgAttachment.java new file mode 100644 index 0000000..57beea0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/attachmsg/RoomQueueMsgAttachment.java @@ -0,0 +1,71 @@ +package com.chwl.core.bean.attachmsg; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.im.custom.bean.CustomAttachment; + +/** + *

队列自定义消息

+ * + * @author jiahui + * @date 2017/12/18 + */ +public class RoomQueueMsgAttachment extends CustomAttachment { + public RoomQueueInfo roomQueueInfo; + public String uid; + public int micPosition; + public long handleUid; + public String handleNick; + public String targetNick; + public int groupType; + + public RoomQueueMsgAttachment(int first, int second) { + super(first, second); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + if (uid != null) { + jsonObject.put("uid", uid); + } + jsonObject.put("handleUid", handleUid); + if (handleNick != null) { + jsonObject.put("handleNick", handleNick); + } + if (targetNick != null) { + jsonObject.put("targetNick", targetNick); + } + jsonObject.put("micPosition", micPosition); + + if (groupType != 0) { + jsonObject.put("groupType", groupType); + } + return jsonObject; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("uid")) { + uid = data.getString("uid"); + } + if (data.containsKey("micPosition")) { + micPosition = data.getIntValue("micPosition"); + } + if (data.containsKey("handleUid")) { + handleUid = data.getLongValue("handleUid"); + } + if (data.containsKey("handleNick")) { + handleNick = data.getString("handleNick"); + } + if (data.containsKey("targetNick")) { + targetNick = data.getString("targetNick"); + } + if (data.containsKey("groupType")) { + groupType = data.getInteger("groupType"); + } + } + } +} diff --git a/core/src/main/java/com/chwl/core/bean/game/GameConfigBean.kt b/core/src/main/java/com/chwl/core/bean/game/GameConfigBean.kt new file mode 100644 index 0000000..0b69238 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/game/GameConfigBean.kt @@ -0,0 +1,12 @@ +package com.chwl.core.bean.game + +import androidx.annotation.Keep + +@Keep +class GameConfigBean { + val mgId: Long? = null + val mgIdStr: String? = null + val name: String? = null + val pic: String? = null + val gameModes: List? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/game/GameModeBean.kt b/core/src/main/java/com/chwl/core/bean/game/GameModeBean.kt new file mode 100644 index 0000000..121d252 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/game/GameModeBean.kt @@ -0,0 +1,14 @@ +package com.chwl.core.bean.game + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class GameModeBean : Serializable { + val ticket: Long? = null + val modeIcon: String? = null + val gameMode: Int? = null + val scores: List? = null + val ruleUrl: String? = null + val modeName: String? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/game/GameResultBean.kt b/core/src/main/java/com/chwl/core/bean/game/GameResultBean.kt new file mode 100644 index 0000000..9e77f0b --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/game/GameResultBean.kt @@ -0,0 +1,30 @@ +package com.chwl.core.bean.game + +import androidx.annotation.Keep +import java.io.Serializable +import java.math.BigDecimal + +@Keep +class GameResultBean : Serializable { + var rank: Int? = null + var uid: Long? = null + var avatar: String? = null + var nick: String? = null + var winNum: Double? = null + var isWin: Boolean? = null + var isEscaped: Boolean? = null + + fun getScoreStr(): String { + val number = winNum ?: return "0" + try { + val bigDecimal = BigDecimal.valueOf(number) + val coinsStr = bigDecimal.stripTrailingZeros().toPlainString() + if (number > 0) { + return "+$coinsStr" + } + return coinsStr + } catch (e: Exception) { + return number.toString() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/game/GameRoomData.kt b/core/src/main/java/com/chwl/core/bean/game/GameRoomData.kt new file mode 100644 index 0000000..cb9b397 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/game/GameRoomData.kt @@ -0,0 +1,26 @@ +package com.chwl.core.bean.game + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class GameRoomData : Serializable { + val mgId: String? = null + val gameRoomIcon: String? = null + val configJson: String? = null + val scores: MutableList? = null + + // 匹配状态(0:匹配中、1:匹配成功、2:游戏结束、3:匹配失败) + var matchStatus: Int? = null + + // 轮次ID + val matchRoundId: Long? = null + + // 轮次状态(0:进行中、1:结束) + val roundStatus: Int? = null + override fun toString(): String { + return "GameRoomData(mgId=$mgId, gameRoomIcon=$gameRoomIcon, configJson=$configJson, scores=$scores, matchStatus=$matchStatus, matchRoundId=$matchRoundId, roundStatus=$roundStatus)" + } + + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/game/GameRoomInfo.kt b/core/src/main/java/com/chwl/core/bean/game/GameRoomInfo.kt new file mode 100644 index 0000000..3a35fba --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/game/GameRoomInfo.kt @@ -0,0 +1,9 @@ +package com.chwl.core.bean.game + +import androidx.annotation.Keep +import com.chwl.core.bean.room.BaseRoomInfo + +@Keep +class GameRoomInfo : BaseRoomInfo() { + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/game/SudGameConfigBean.kt b/core/src/main/java/com/chwl/core/bean/game/SudGameConfigBean.kt new file mode 100644 index 0000000..dd99632 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/game/SudGameConfigBean.kt @@ -0,0 +1,26 @@ +package com.chwl.core.bean.game + +import androidx.annotation.Keep +import com.chwl.library.utils.json.JsonUtils + +@Keep +class SudGameConfigBean { + private val app_common_game_setting_select_info: HashMap? = null + + private val ui: HashMap? = null + + fun getGameSettingSelectConfigStr(): String? { + return JsonUtils.toJson(app_common_game_setting_select_info) + } + + fun getGameConfigStr(): String? { + val uiMap = ui + if (uiMap.isNullOrEmpty()) { + return null + } + return JsonUtils.toJson(ConfigModel(uiMap)) + } + + @Keep + private data class ConfigModel(var ui: HashMap) +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/response/BeanResult.kt b/core/src/main/java/com/chwl/core/bean/response/BeanResult.kt new file mode 100644 index 0000000..74a7861 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/BeanResult.kt @@ -0,0 +1,35 @@ +package com.chwl.core.bean.response + +import com.chwl.core.R +import com.chwl.core.utils.net.ServerException +import com.chwl.library.utils.ResUtil + +data class BeanResult( + val isSuccess: Boolean, + val code: Int = 0, + val message: String? = null, + val data: T? = null +) { + companion object { + + fun success(data: T?): BeanResult { + return BeanResult(true, 0, "", data) + } + + fun failed(code: Int, message: String?): BeanResult { + return BeanResult(false, code, message, null) + } + + fun failed(throwable: Throwable): BeanResult { + return if (throwable is ServerException) { + failed(throwable.code, throwable.message) + } else { + failed(-1, ResUtil.getString(R.string.bean_response_beanresult_01)) + } + } + } + +} + + + diff --git a/core/src/main/java/com/chwl/core/bean/response/JsonServiceResult.java b/core/src/main/java/com/chwl/core/bean/response/JsonServiceResult.java new file mode 100644 index 0000000..9b33974 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/JsonServiceResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response; + +import com.google.gson.JsonElement; + +/** + * @author jack + * @Description + * @Date 2018/5/8 + */ + +public class JsonServiceResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/ListResult.kt b/core/src/main/java/com/chwl/core/bean/response/ListResult.kt new file mode 100644 index 0000000..1178be2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/ListResult.kt @@ -0,0 +1,40 @@ +package com.chwl.core.bean.response + +import com.chwl.core.R +import com.chwl.core.utils.net.ServerException +import com.chwl.library.utils.ResUtil + +data class ListResult( + val isSuccess: Boolean, + val isRefresh: Boolean, + val data: List? = null, + val code: Int = 0, + val message: String? = null +) { + companion object { + + fun success(data: List?, pageNum: Int): ListResult { + return ListResult(true, pageNum == 1, data) + } + + fun failed(pageNum: Int): ListResult { + return ListResult(false, pageNum == 1, null) + } + + fun failed(pageNum: Int, code: Int, message: String?): ListResult { + return ListResult(false, pageNum == 1, null, code, message) + } + + fun failed(pageNum: Int, throwable: Throwable): ListResult { + return if (throwable is ServerException) { + failed(pageNum, throwable.code, throwable.message) + } else { + failed(pageNum, -1, ResUtil.getString(R.string.bean_response_beanresult_01)) + } + } + } + +} + + + diff --git a/core/src/main/java/com/chwl/core/bean/response/RequestError.java b/core/src/main/java/com/chwl/core/bean/response/RequestError.java new file mode 100644 index 0000000..ea8333d --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/RequestError.java @@ -0,0 +1,40 @@ +package com.chwl.core.bean.response; + +/** + * Created by zhongyongsheng on 14-6-6. + */ +public class RequestError extends Exception { + + public final ResponseData responseData; + + public RequestError() { + responseData = null; + } + + public RequestError(ResponseData response) { + responseData = response; + } + + public RequestError(String exceptionMessage) { + super(exceptionMessage); + responseData = null; + } + + public RequestError(String exceptionMessage, Throwable reason) { + super(exceptionMessage, reason); + responseData = null; + } + + public RequestError(Throwable cause) { + super(cause); + responseData = null; + } + + public String getErrorStr(){ + if(null == responseData){ + return getMessage(); + }else{ + return responseData.getErrorStr(); + } + } +} diff --git a/core/src/main/java/com/chwl/core/bean/response/ResponseData.java b/core/src/main/java/com/chwl/core/bean/response/ResponseData.java new file mode 100644 index 0000000..dc5cd7d --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/ResponseData.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.chwl.core.bean.response; + +import com.google.gson.Gson; +import com.chwl.core.R; +import com.chwl.library.coremanager.CoreError; +import com.chwl.library.utils.ResUtil; + +import java.nio.charset.Charset; +import java.util.Collections; +import java.util.Map; + +/** + * 网络或者cache的数据封装 + * + * @author zhongyongsheng + */ +public class ResponseData { + + public final int statusCode; + public final Map headers; + public final boolean notModified; + private final Gson gson; + public byte[] data; + + public ResponseData(int statusCode, byte[] data, Map headers, + boolean notModified) { + this.statusCode = statusCode; + this.data = data; + this.headers = headers; + this.notModified = notModified; + gson = new Gson(); + } + + public ResponseData(byte[] data) { + this(200, data, Collections.emptyMap(), false); + } + + public ResponseData(byte[] data, Map headers) { + this(200, data, headers, false); + } + + public ServiceResult getResult() { + + ServiceResult result = gson.fromJson(new String(data, Charset.forName("UTF-8")), ServiceResult.class); + return result; + } + + public static final int RELOGIN = 0; + public static final int RECHECK_TICKET = 1; + + + /** + * accessToken失效的时候需要重新登录 + * + * @return + */ + public boolean isNeedReLogin() { + ServiceResult result = getResult(); + if (result.getCode() == CoreError.ACCESS_TOKEN_HAS_EXPIRED || result.getCode() == CoreError.ACCESS_TOKEN_HAS_EXPIRED_SINCE_PASSWORD_CHANGED || result.getCode() == CoreError.ACCESS_TOKEN_IS_MISSING || result.getCode() == CoreError.INVALID_AUTHORIZATION_CODE) { + return true; + } else { + return false; + } + } + + + /** + * Ticket失效的时候需要重新检查tickets + * + * @return + */ + public boolean isNeedReCheckTickets() { + ServiceResult result = getResult(); + if (result.getCode() == CoreError.INVALID_TICKET || result.getCode() == CoreError.TICKET_IS_MISSING || result.getCode() == CoreError.TICKET_HAS_EXPIRED || result.getCode() == CoreError.TICKET_HAS_EXPIRED_SINCE_PASSWORD_CHANGED) { + return true; + } else { + return false; + } + } + + public String getErrorStr() { + String error = ""; + if (null != data) { + ServiceResult result = getResult(); + if (null != result) { + switch (result.getCode()) { + case CoreError.USERNAME_PASSWORD_MISMATCH: + error = ResUtil.getString(R.string.bean_response_responsedata_01); + break; + case CoreError.INVALID_USER: + error = ResUtil.getString(R.string.bean_response_responsedata_02); + break; + case CoreError.INVALID_TOKEN: + error = ResUtil.getString(R.string.bean_response_responsedata_03); + break; + case CoreError.USER_HAS_BLOCKED: + error = ResUtil.getString(R.string.bean_response_responsedata_04); + break; + case CoreError.INVALID_IDENTIFYING_CODE: + error = ResUtil.getString(R.string.bean_response_responsedata_05); + break; + case CoreError.INVALID_USERNAME: + error = ResUtil.getString(R.string.bean_response_responsedata_06); + break; + case CoreError.INVALID_RESET_CODE: + error = ResUtil.getString(R.string.bean_response_responsedata_07); + break; + case CoreError.INVALID_NICK: + error = ResUtil.getString(R.string.bean_response_responsedata_08); + break; + case CoreError.USER_HAS_SIGNED_UP: + error = ResUtil.getString(R.string.bean_response_responsedata_09); + break; + + //------------------->accessToken + case CoreError.ACCESS_TOKEN_HAS_EXPIRED: + error = ResUtil.getString(R.string.bean_response_responsedata_010); + break; + case CoreError.ACCESS_TOKEN_HAS_EXPIRED_SINCE_PASSWORD_CHANGED: + error = ResUtil.getString(R.string.bean_response_responsedata_011); + break; + case CoreError.ACCESS_TOKEN_IS_MISSING: + error = ResUtil.getString(R.string.bean_response_responsedata_012); + break; + case CoreError.INVALID_AUTHORIZATION_CODE: + error = ResUtil.getString(R.string.bean_response_responsedata_013); + break; + //------------------->accessToken + + default: + error =result.getErrorMessage(); + break; + } + } else { + error = ResUtil.getString(R.string.bean_response_responsedata_014); + } + } + return error; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/response/ServiceResult.java b/core/src/main/java/com/chwl/core/bean/response/ServiceResult.java new file mode 100644 index 0000000..fa9d412 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/ServiceResult.java @@ -0,0 +1,197 @@ +package com.chwl.core.bean.response; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import java.io.Serializable; + +/** + * @author houzhenjing + */ +public class ServiceResult implements Serializable { + + private static final long serialVersionUID = -1954065564856833013L; + + public static final int SC_SUCCESS = 200; + + private int code = -1; + + private String message = ""; + + private T data; + + private long timestamp; + + public ServiceResult() { + } + + public boolean isSuccess() { + return this.code == SC_SUCCESS; + } + + public static ServiceResult success(T data) { + return success(data, ""); + } + + public static ServiceResult success(T data, String message) { + ServiceResult result = new ServiceResult(); + result.setCodeSuccess().setMessage(message).setData(data); + return result; + } + + public int getCode() { + return code; + } + + public ServiceResult setCode(int code) { + this.code = code; + return this; + } + + public ServiceResult setCodeSuccess() { + this.code = SC_SUCCESS; + return this; + } + + + public String getMessage() { + return message; + } + + public ServiceResult setMessage(String message) { + this.message = message; + return this; + } + + public T getData() { + return data; + } + + public ServiceResult setData(T data) { + this.data = data; + return this; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public static final int SUCCESS = 200;//成功 + public static final int INVALID_SERVICE = 199;//服务不可用 + public static final int SERVEXCEPTION = 5000;//服务端异常 + public static final int UNKNOWN = 999;//未知错误 + public static final int BUSIERROR = 4000;//服务繁忙 + public static final int PARAMETERILLEGAL = 1444;//该用户不存在 + public static final int ROOMRUNNING = 1500;//房间正在运行中... + public static final int AUCTCURDOING = 2100;//当前被竞拍者正在被竞拍中,还未结束 + public static final int AUCTCURLESSTHANMAXMONEY = 2101;//竞拍价格小于当前最高价 + public static final int ORDERNOTEXISTS = 3404;//订单不存在 + public static final int SMSSENDERROR = 4001;//发送短信出错 + public static final int PHONEINVALID = 4002;//手机格式不正确 + public static final int DIAMONDNUMNOTENOUGH = 2104;//钻石数量不够 + public static final int SMSCODEERROR = 4003;//短信验证码错误 + public static final int WEEKNOTWITHCASHTOWNUMS = 1600;//每周提现俩次 + public static final int CODE_NEED_COMPLETE_USER_INFO = 1415;//每周提现俩次 + + public static final int CODE_ROOM_MANAGER_LIMIT = 20504;//管理员超越上限 + + /** 没有网络 */ + public static final int NOT_NET = 50010; + public static final int OTHER = 50011; + + + public String getErrorMessage() { + String errorStr = ResUtil.getString(R.string.bean_response_serviceresult_01); + switch (code) { + case DIAMONDNUMNOTENOUGH: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_02); + break; + case SMSCODEERROR: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_03); + break; + case PARAMETERILLEGAL: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_04); + break; + case ROOMRUNNING: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_05); + break; + case AUCTCURDOING: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_06); + break; + case AUCTCURLESSTHANMAXMONEY: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_07); + break; + case ORDERNOTEXISTS: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_08); + break; + case PHONEINVALID: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_09); + break; + case NOT_NET: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_010); + break; + case UNKNOWN: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_011); + break; + default: + errorStr = message; + } + return errorStr; + } + + public String getError() { + String errorStr = ResUtil.getString(R.string.bean_response_serviceresult_012); + switch (code) { + case DIAMONDNUMNOTENOUGH: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_013); + break; + case SMSCODEERROR: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_014); + break; + case INVALID_SERVICE: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_015); + break; + case SERVEXCEPTION: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_016); + break; + case UNKNOWN: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_017); + break; + case BUSIERROR: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_018); + break; + case PARAMETERILLEGAL: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_019); + break; + case ROOMRUNNING: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_020); + break; + case AUCTCURDOING: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_021); + break; + case AUCTCURLESSTHANMAXMONEY: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_022); + break; + case ORDERNOTEXISTS: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_023); + break; + case SMSSENDERROR: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_024); + break; + case PHONEINVALID: + errorStr = ResUtil.getString(R.string.bean_response_serviceresult_025); + break; + case WEEKNOTWITHCASHTOWNUMS: + errorStr = ResUtil.getString(R.string.network_abnormality_check_again); + break; + default: + errorStr = message; + + } + return errorStr; + } + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/ActionDialogResult.java b/core/src/main/java/com/chwl/core/bean/response/result/ActionDialogResult.java new file mode 100644 index 0000000..eddfb85 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/ActionDialogResult.java @@ -0,0 +1,14 @@ +package com.chwl.core.bean.response.result; + + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.redPacket.bean.ActionDialogInfo; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class ActionDialogResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/AttentionListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/AttentionListResult.java new file mode 100644 index 0000000..dd6557c --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/AttentionListResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.user.bean.AttentionInfo; + +import java.util.List; + +/** + * Created by Administrator on 2017/7/5 0005. + */ + +public class AttentionListResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/AuctionInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/AuctionInfoResult.java new file mode 100644 index 0000000..7516451 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/AuctionInfoResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.auction.bean.AuctionInfo; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class AuctionInfoResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/AuctionListUserInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/AuctionListUserInfoResult.java new file mode 100644 index 0000000..342fb2f --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/AuctionListUserInfoResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.auction.bean.AuctionListUserInfo; + +import java.util.List; + +/** + * Created by chenran on 2017/8/9. + */ + +public class AuctionListUserInfoResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/AuctionUserListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/AuctionUserListResult.java new file mode 100644 index 0000000..d2dd889 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/AuctionUserListResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.auction.bean.AuctionUser; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class AuctionUserListResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/AuctionUserResult.java b/core/src/main/java/com/chwl/core/bean/response/result/AuctionUserResult.java new file mode 100644 index 0000000..916feed --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/AuctionUserResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.auction.bean.AuctionUser; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class AuctionUserResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/BoolApiResult.java b/core/src/main/java/com/chwl/core/bean/response/result/BoolApiResult.java new file mode 100644 index 0000000..f32ea00 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/BoolApiResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by chenran on 2017/2/16. + */ + +public class BoolApiResult extends ServiceResult{ + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/BooleanResult.java b/core/src/main/java/com/chwl/core/bean/response/result/BooleanResult.java new file mode 100644 index 0000000..760c91e --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/BooleanResult.java @@ -0,0 +1,10 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by zhouxiangfeng on 2017/5/27. + */ + +public class BooleanResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/ChargeListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/ChargeListResult.java new file mode 100644 index 0000000..e6e8710 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/ChargeListResult.java @@ -0,0 +1,17 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.pay.bean.ChargeBean; + +import java.util.List; + +import lombok.Data; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ +@Data +public class ChargeListResult { + List list; + List bigList; + private int defaultPay; +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/CheckLostUserResult.java b/core/src/main/java/com/chwl/core/bean/response/result/CheckLostUserResult.java new file mode 100644 index 0000000..a754ee9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/CheckLostUserResult.java @@ -0,0 +1,7 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.recall.bean.CheckLostUserInfo; + +public class CheckLostUserResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/ExchangeInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/ExchangeInfoResult.java new file mode 100644 index 0000000..c34b2a5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/ExchangeInfoResult.java @@ -0,0 +1,10 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by Administrator on 2017/7/5 0005. + */ + +public class ExchangeInfoResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/ExchangerInfo.java b/core/src/main/java/com/chwl/core/bean/response/result/ExchangerInfo.java new file mode 100644 index 0000000..4dd8a5a --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/ExchangerInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.bean.response.result; + +/** + * Created by Administrator on 2017/7/27. + */ + +public class ExchangerInfo { + /* + uid:90000 + diamondNum:钻石余额 + */ + public long uid; + public double diamondNum ; +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/FaceResult.java b/core/src/main/java/com/chwl/core/bean/response/result/FaceResult.java new file mode 100644 index 0000000..87d5e04 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/FaceResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.face.FaceListInfo; + +/** + * Created by chenran on 2017/7/27. + */ + +public class FaceResult extends ServiceResult{ +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/FansListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/FansListResult.java new file mode 100644 index 0000000..572fb3e --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/FansListResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.user.bean.FansListInfo; + +/** + * Created by Administrator on 2017/7/5 0005. + */ + +public class FansListResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/GiftInfosResult.java b/core/src/main/java/com/chwl/core/bean/response/result/GiftInfosResult.java new file mode 100644 index 0000000..d93642c --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/GiftInfosResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.TextInfos; + +/** + * Created by Seven on 2017/9/9. + */ + +public class GiftInfosResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/GiftRecieveInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/GiftRecieveInfoResult.java new file mode 100644 index 0000000..fadafb0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/GiftRecieveInfoResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.GiftReceiveInfo; + +/** + * Created by chenran on 2017/11/25. + */ + +public class GiftRecieveInfoResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/GiftResult.java b/core/src/main/java/com/chwl/core/bean/response/result/GiftResult.java new file mode 100644 index 0000000..3cf9a1f --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/GiftResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.GiftListInfo; + +/** + * Created by chenran on 2017/7/27. + */ + +public class GiftResult extends ServiceResult{ +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/GiftWallListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/GiftWallListResult.java new file mode 100644 index 0000000..214de9a --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/GiftWallListResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.user.bean.GiftWallInfo; + +import java.util.List; + +/** + * Created by chenran on 2017/10/17. + */ + +public class GiftWallListResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/GoBackResult.java b/core/src/main/java/com/chwl/core/bean/response/result/GoBackResult.java new file mode 100644 index 0000000..a1a6892 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/GoBackResult.java @@ -0,0 +1,7 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.recall.bean.GoBackInfo; + +public class GoBackResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/IdQueryUserInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/IdQueryUserInfoResult.java new file mode 100644 index 0000000..5d88862 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/IdQueryUserInfoResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.auth.entity.AccountInfo; +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by chenran on 2017/2/16. + */ + +public class IdQueryUserInfoResult extends ServiceResult{ + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/InitResult.java b/core/src/main/java/com/chwl/core/bean/response/result/InitResult.java new file mode 100644 index 0000000..b7c776c --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/InitResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.initial.bean.InitInfo; + +/** + * @author xiaoyu + * @date 2017/12/8 + */ + +public class InitResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/IntegerResult.java b/core/src/main/java/com/chwl/core/bean/response/result/IntegerResult.java new file mode 100644 index 0000000..75a75ba --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/IntegerResult.java @@ -0,0 +1,10 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by chenran on 2017/11/15. + */ + +public class IntegerResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/LoginResult.java b/core/src/main/java/com/chwl/core/bean/response/result/LoginResult.java new file mode 100644 index 0000000..98c1452 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/LoginResult.java @@ -0,0 +1,46 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.auth.entity.AccountInfo; +import com.chwl.core.bean.response.ServiceResult; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by chenran on 2017/2/16. + */ +@Getter +@Setter +public class LoginResult extends ServiceResult { + + public static final int CODE_VERIFY_CODE = 1; + + /** + * 封禁时间 + */ + private long date; + + /** + * 封禁原因 + */ + private String reason; + + /** + * 是否需要校验验证码 + */ + private int codeVerify; + + /** + * 是否是超级管理员 + */ + private int superCodeVerify; + + private long cancelDate; + private long erbanNo; + + + public boolean isVerifyCode() { + return codeVerify == CODE_VERIFY_CODE; + } + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/MultiGiftRecieveInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/MultiGiftRecieveInfoResult.java new file mode 100644 index 0000000..1733ef7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/MultiGiftRecieveInfoResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; + +/** + * Created by chenran on 2017/11/25. + */ + +public class MultiGiftRecieveInfoResult extends ServiceResult{ +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/RedDrawListInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/RedDrawListInfoResult.java new file mode 100644 index 0000000..c89721d --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/RedDrawListInfoResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.redPacket.bean.RedDrawListInfo; + +import java.util.List; + +/** + * Created by chenran on 2017/12/4. + */ + +public class RedDrawListInfoResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/RedPacketResult.java b/core/src/main/java/com/chwl/core/bean/response/result/RedPacketResult.java new file mode 100644 index 0000000..c787816 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/RedPacketResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.redPacket.bean.RedPacketInfo; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class RedPacketResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/RegisterResult.java b/core/src/main/java/com/chwl/core/bean/response/result/RegisterResult.java new file mode 100644 index 0000000..29d642b --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/RegisterResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.auth.entity.TicketInfo; +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by chenran on 2017/2/16. + */ + +public class RegisterResult extends ServiceResult{ + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/RequestChargeResult.java b/core/src/main/java/com/chwl/core/bean/response/result/RequestChargeResult.java new file mode 100644 index 0000000..78b8c21 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/RequestChargeResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.google.gson.JsonObject; +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class RequestChargeResult extends ServiceResult { + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/RoomConsumeInfoListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/RoomConsumeInfoListResult.java new file mode 100644 index 0000000..f439859 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/RoomConsumeInfoListResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.queue.bean.RoomConsumeInfo; + +import java.util.List; + +/** + * Created by chenran on 2017/10/2. + */ + +public class RoomConsumeInfoListResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/RoomRewardResult.java b/core/src/main/java/com/chwl/core/bean/response/result/RoomRewardResult.java new file mode 100644 index 0000000..3d4a687 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/RoomRewardResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.im.custom.bean.RewardBean; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class RoomRewardResult extends ServiceResult { + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/ShareRedPacketResult.java b/core/src/main/java/com/chwl/core/bean/response/result/ShareRedPacketResult.java new file mode 100644 index 0000000..83bd01f --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/ShareRedPacketResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.redPacket.bean.ShareRedBagInfo; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class ShareRedPacketResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/TabResult.java b/core/src/main/java/com/chwl/core/bean/response/result/TabResult.java new file mode 100644 index 0000000..26cd0d4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/TabResult.java @@ -0,0 +1,16 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.RoomSettingTabInfo; + +import java.util.List; + +/** + *

+ * + * @author Administrator + * @date 2017/11/21 + */ +public class TabResult extends ServiceResult> { + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/TicketResult.java b/core/src/main/java/com/chwl/core/bean/response/result/TicketResult.java new file mode 100644 index 0000000..80e944d --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/TicketResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.auth.entity.TicketInfo; +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class TicketResult extends ServiceResult { + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/UserListResult.java b/core/src/main/java/com/chwl/core/bean/response/result/UserListResult.java new file mode 100644 index 0000000..9c2c826 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/UserListResult.java @@ -0,0 +1,14 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.user.bean.UserInfo; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class UserListResult extends ServiceResult> { + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/UserResult.java b/core/src/main/java/com/chwl/core/bean/response/result/UserResult.java new file mode 100644 index 0000000..1f2cfab --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/UserResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.user.bean.UserInfo; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class UserResult extends ServiceResult { + +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/VersionsResult.java b/core/src/main/java/com/chwl/core/bean/response/result/VersionsResult.java new file mode 100644 index 0000000..4400efe --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/VersionsResult.java @@ -0,0 +1,10 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by Administrator on 2017/7/12 0012. + */ + +public class VersionsResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bean/response/result/WalletInfoResult.java b/core/src/main/java/com/chwl/core/bean/response/result/WalletInfoResult.java new file mode 100644 index 0000000..247c5ca --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/response/result/WalletInfoResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.bean.response.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.pay.bean.WalletInfo; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class WalletInfoResult extends ServiceResult { + +} diff --git a/core/src/main/java/com/chwl/core/bean/room/BaseRoomInfo.kt b/core/src/main/java/com/chwl/core/bean/room/BaseRoomInfo.kt new file mode 100644 index 0000000..024a3e1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/room/BaseRoomInfo.kt @@ -0,0 +1,27 @@ +package com.chwl.core.bean.room + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +abstract class BaseRoomInfo : Serializable { + companion object { + const val ROOM_TYPE_GAME = 0 + } + + val chatRoomId: Long? = null + + val roomId: Long? = null + + val roomMics: MutableList? = null + + val data: T? = null + + // 房间类型(0:小游戏) + val roomType: Int? = null + override fun toString(): String { + return "BaseRoomInfo(chatRoomId=$chatRoomId, roomId=$roomId, roomMics=$roomMics, data=$data, roomType=$roomType)" + } + + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/room/RoomMicBean.kt b/core/src/main/java/com/chwl/core/bean/room/RoomMicBean.kt new file mode 100644 index 0000000..63c3c89 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/room/RoomMicBean.kt @@ -0,0 +1,16 @@ +package com.chwl.core.bean.room + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class RoomMicBean : Serializable { + val position: Int? = null + val micUser: RoomMicUserInfo? = null + + // 是否被锁 + val micState: Int? = null + + // 是否被禁 + val posState: Int? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bean/room/RoomMicUserInfo.kt b/core/src/main/java/com/chwl/core/bean/room/RoomMicUserInfo.kt new file mode 100644 index 0000000..5de8baa --- /dev/null +++ b/core/src/main/java/com/chwl/core/bean/room/RoomMicUserInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.bean.room + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class RoomMicUserInfo : Serializable { + val avatar: String? = null + val erbanNo: Long? = null + val nick: String? = null + val uid: Long? = null + val aiLevel : Int? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/bills/BillModel.java b/core/src/main/java/com/chwl/core/bills/BillModel.java new file mode 100644 index 0000000..c58c521 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/BillModel.java @@ -0,0 +1,189 @@ +package com.chwl.core.bills; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.BillType; +import com.chwl.core.bills.bean.NobleBillListInfo; +import com.chwl.core.bills.result.ChargeResult; +import com.chwl.core.bills.result.ExpendResult; +import com.chwl.core.bills.result.IncomedResult; +import com.chwl.core.bills.result.RedBagResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + *

+ * + * @author jiahui + * @date 2018/1/10 + */ +public class BillModel extends BaseModel implements IBillModel { + + private final BillModel.Api api = RxNet.create(BillModel.Api.class); + + private static final class Helper { + public static final BillModel INSTANCE = new BillModel(); + } + + + public Single loadNobleBillRecords(long uid, long date, int pageNo) { + return loadNobleBillRecords(uid, date, pageNo); + } + + public static BillModel get() { + return Helper.INSTANCE; + } + + @Override + public Single loadNobleBillRecords(long date, int pageNo) { + return api.loadNobleBillRecords(AuthModel.get().getCurrentUid(), date, pageNo) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .compose(RxHelper.handleBeanData()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + @Override + public Single getGiftIncomeBills(int pageNo, int pageSize, long time) { + return api.getBillRecord( + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(pageNo), + String.valueOf(pageSize), + String.valueOf(time), + String.valueOf(BillType.GIFT_INCOME_RECORDS)) + .flatMap((Function, Single>) jsonElementServiceResult -> { + String json = new Gson().toJson(jsonElementServiceResult); + IncomedResult incomedResult = new Gson().fromJson(json, IncomedResult.class); + return Single.just(incomedResult); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single getGiftExpendBills(int pageNo, int pageSize, long time) { + return api.getBillRecord( + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(pageNo), + String.valueOf(pageSize), + String.valueOf(time), + String.valueOf(BillType.GIFT_EXPEND_RECORDS)) + .flatMap((Function, Single>) jsonElementServiceResult -> { + String json = new Gson().toJson(jsonElementServiceResult); + ExpendResult expendResult = new Gson().fromJson(json, ExpendResult.class); + return Single.just(expendResult); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + + + @Override + public Single getChatBills(int pageNo, int pageSize, long time) { + return api.getBillRecord( + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(pageNo), + String.valueOf(pageSize), + String.valueOf(time), + String.valueOf(BillType.CHAT_RECORDS)) + .flatMap((Function, Single>) jsonElementServiceResult -> { + String json = new Gson().toJson(jsonElementServiceResult); + IncomedResult incomedResult = new Gson().fromJson(json, IncomedResult.class); + return Single.just(incomedResult); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single getChargeBills(int pageNo, int pageSize, long time) { + return api.getBillRecord( + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(pageNo), + String.valueOf(pageSize), + String.valueOf(time), + String.valueOf(BillType.CHARGE_RECORDS)) + .flatMap((Function, Single>) jsonElementServiceResult -> { + String json = new Gson().toJson(jsonElementServiceResult); + ChargeResult chargeResult = new Gson().fromJson(json, ChargeResult.class); + return Single.just(chargeResult); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single getRedBagBills(int pageNo, int pageSize, long time) { + return api.getPacketRecord( + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(pageNo), + String.valueOf(pageSize), + String.valueOf(time)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + interface Api { + /** + * 获取贵族开通记录账单 + * + * @param uid 用户id + * @param time 开通时间 + * @param pageNo 分页页数 + * @return 返回结果 + */ + @GET("noble/record/get") + Single> loadNobleBillRecords(@Query("uid") long uid, + @Query("date") long time, + @Query("pageNo") int pageNo); + + + /** + * 礼物,密聊,充值,提现账单查询(不包括红包) + * + * @param uid + * @param pageNo + * @param pageSize + * @param date + * @param type + * @return + */ + @GET("/billrecord/get") + Single> getBillRecord(@Query("uid") String uid, + @Query("pageNo") String pageNo, + @Query("pageSize") String pageSize, + @Query("date") String date, + @Query("type") String type); + + + + + /** + * 红包账单查询 + * + * @param uid + * @param pageNo + * @param pageSize + * @param date + * @return + */ + @GET("/packetrecord/get") + Single getPacketRecord(@Query("uid") String uid, + @Query("pageNo") String pageNo, + @Query("pageSize") String pageSize, + @Query("date") String date); + } +} diff --git a/core/src/main/java/com/chwl/core/bills/IBillModel.java b/core/src/main/java/com/chwl/core/bills/IBillModel.java new file mode 100644 index 0000000..9f9b241 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/IBillModel.java @@ -0,0 +1,60 @@ +package com.chwl.core.bills; + +import com.chwl.core.base.IModel; +import com.chwl.core.bills.bean.NobleBillListInfo; +import com.chwl.core.bills.result.ChargeResult; +import com.chwl.core.bills.result.ExpendResult; +import com.chwl.core.bills.result.IncomedResult; +import com.chwl.core.bills.result.RedBagResult; + +import io.reactivex.Single; + +public interface IBillModel extends IModel { + + /** + * 礼物的收入记录 + * @param pageNo + * @param pageSize + * @param time + */ + Single getGiftIncomeBills(int pageNo, int pageSize, long time); + + /** + * 礼物的支出记录 + * @param pageNo + * @param pageSize + * @param time + */ + Single getGiftExpendBills(int pageNo, int pageSize, long time); + + + + /** + * + * @param pageNo + * @param pageSize + * @param time + */ + Single getChatBills(int pageNo, int pageSize, long time); + + /** + * 充值记录 + * @param pageNo + * @param pageSize + * @param time + */ + Single getChargeBills(int pageNo, int pageSize, long time); + + /** + * 获取红包记录列表 + */ + Single getRedBagBills(int pageNo, int pageSize, long time); + + /** + * 贵族开通记录 + * @param date + * @param pageNo + * @return + */ + Single loadNobleBillRecords(long date, int pageNo); +} diff --git a/core/src/main/java/com/chwl/core/bills/IRadishGiftModel.java b/core/src/main/java/com/chwl/core/bills/IRadishGiftModel.java new file mode 100644 index 0000000..3c6a9c0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/IRadishGiftModel.java @@ -0,0 +1,14 @@ +package com.chwl.core.bills; + +import com.chwl.core.base.IModel; +import com.chwl.core.bills.result.RadishGiftResult; +import com.chwl.core.user.bean.RadishWallInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IRadishGiftModel extends IModel { + Single getRadishRecord(int page, int pageSize, long date, byte type); + Single> getRadishWall(long uid); +} diff --git a/core/src/main/java/com/chwl/core/bills/RadishGiftModel.java b/core/src/main/java/com/chwl/core/bills/RadishGiftModel.java new file mode 100644 index 0000000..c5c978d --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/RadishGiftModel.java @@ -0,0 +1,79 @@ +package com.chwl.core.bills; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.result.RadishGiftResult; +import com.chwl.core.user.bean.RadishWallInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public class RadishGiftModel extends BaseModel implements IRadishGiftModel { + private final RadishGiftModel.Api api = RxNet.create(RadishGiftModel.Api.class); + + private static final class Helper { + public static final RadishGiftModel INSTANCE = new RadishGiftModel(); + } + + public static RadishGiftModel get() { + return Helper.INSTANCE; + } + + @Override + public Single getRadishRecord(int page, int pageSize, long date, byte type) { + return api.getRadishRecord(AuthModel.get().getCurrentUid(), page, pageSize, date, type) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + String json = new Gson().toJson(stringServiceResult); + RadishGiftResult incomedResult = new Gson().fromJson(json, RadishGiftResult.class); + return Single.just(incomedResult); + } + }) + .compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single> getRadishWall(long uid) { + // 获取萝卜墙 + return api.getRadishWall(uid) + .flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> stringServiceResult) throws Exception { + if (stringServiceResult != null && stringServiceResult.getCode() == ServiceResult.SC_SUCCESS) + return Single.just(stringServiceResult.getData()); + else + return Single.just(null); + } + }) + .compose(RxHelper.handleSchAndExce()); + } + + interface Api { + /** + * @param type 1:赠送 2:收入 + */ + @GET("gift/radish/record/get") + Single> getRadishRecord(@Query("uid") long uid, + @Query("page") int page, + @Query("pageSize") int pageSize, + @Query("date") long date, + @Query("type") byte type); + + /** + * 萝卜墙 + */ + @GET("radish/gift/wall/get") + Single>> getRadishWall(@Query("uid") long uid); + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/BillItemEntity.java b/core/src/main/java/com/chwl/core/bills/bean/BillItemEntity.java new file mode 100644 index 0000000..8088473 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/BillItemEntity.java @@ -0,0 +1,49 @@ +package com.chwl.core.bills.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +/** + *

+ * + * @author jiahui + * @date 2017/11/17 + */ +public class BillItemEntity implements MultiItemEntity { + + public static final int ITEM_DATE = 1; + public static final int ITEM_NORMAL = 2; + + private int itemType; + + /** 一天时间日期 */ + public String time; + + /** 礼物收入 */ + public IncomeInfo mGiftInComeInfo; + /** 密聊实体 */ + public IncomeInfo mChatInComeInfo; + /** 充值记录信息 */ + public ExpendInfo mChargeExpendInfo; + /** 礼物支出 */ + public ExpendInfo mGiftExpendInfo; + /** 红包记录 +账单红包记录 */ + public RedBagInfo mRedBagInfo; + /** 贵族开通记录 */ + public NobleBillListInfo.NobleBillInfo nobleBillInfo; + public RadishGiftInfo mRadishGiftInfo; + public RadishRecordInfo mRadishRecordInfo; + + public BillItemEntity(int itemType) { + this.itemType = itemType; + } + + public BillItemEntity(int itemType, String time) { + this.itemType = itemType; + this.time = time; + } + + @Override + public int getItemType() { + return itemType; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/BillType.java b/core/src/main/java/com/chwl/core/bills/bean/BillType.java new file mode 100644 index 0000000..6b8af28 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/BillType.java @@ -0,0 +1,29 @@ +package com.chwl.core.bills.bean; + +public class BillType { + + /** + * 礼物支出记录 + */ + public static final int GIFT_EXPEND_RECORDS = 1; + + /** + * 礼物收入记录 + */ + public static final int GIFT_INCOME_RECORDS = 2; + + /** + * 密聊记录 + */ + public static final int CHAT_RECORDS = 3; + + /** + * 充值记录 + */ + public static final int CHARGE_RECORDS = 4; + + /** + * 提现记录 + */ + public static final int DRAW_RECORDS = 5; +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/ExpendInfo.java b/core/src/main/java/com/chwl/core/bills/bean/ExpendInfo.java new file mode 100644 index 0000000..40f82a7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/ExpendInfo.java @@ -0,0 +1,160 @@ +package com.chwl.core.bills.bean; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +/** + * Created by Seven on 2017/9/9. + */ + +public class ExpendInfo implements Serializable { + public static final int TITLE = 0; + public static final int CONTENT = 1; + @SerializedName("srcAvatar") + private String userAvatar; + @SerializedName("srcNick") + private String userNick; + private String targetAvatar; + private String targetNick; + private double goldNum; + private long recordTime; + private int expendType; + private int pageCount; + private int itemType; + private int giftNum; + private String time; + private long money; + @SerializedName("giftPict") + private String giftPic; + @SerializedName("giftName") + private String GiftName; + private double diamondNum; + private String showStr; + + public double getDiamondNum() { + return diamondNum; + } + + public void setDiamondNum(double diamondNum) { + this.diamondNum = diamondNum; + } + + + public String getGiftName() { + return GiftName; + } + + public void setGiftName(String giftName) { + GiftName = giftName; + } + + + public int getGiftNum() { + return giftNum; + } + + public void setGiftNum(int giftNum) { + this.giftNum = giftNum; + } + + public long getMoney() { + return money; + } + + public void setMoney(long money) { + this.money = money; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getGiftPic() { + return giftPic; + } + + public void setGiftPic(String giftPic) { + this.giftPic = giftPic; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public String getUserNick() { + return userNick; + } + + public void setUserNick(String userNick) { + this.userNick = userNick; + } + + public String getTargetAvatar() { + return targetAvatar; + } + + public void setTargetAvatar(String targetAvatar) { + this.targetAvatar = targetAvatar; + } + + public String getTargetNick() { + return targetNick; + } + + public void setTargetNick(String targetNick) { + this.targetNick = targetNick; + } + + public double getGoldNum() { + return goldNum; + } + + public void setGoldNum(double goldNum) { + this.goldNum = goldNum; + } + + public long getRecordTime() { + return recordTime; + } + + public void setRecordTime(long recordTime) { + this.recordTime = recordTime; + } + + public int getExpendType() { + return expendType; + } + + public void setExpendType(int expendType) { + this.expendType = expendType; + } + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public int getItemType() { + return time == null ? CONTENT : TITLE; + } + + public String getShowStr() { + return showStr; + } + + public void setShowStr(String showStr) { + this.showStr = showStr; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/ExpendListInfo.java b/core/src/main/java/com/chwl/core/bills/bean/ExpendListInfo.java new file mode 100644 index 0000000..a7af287 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/ExpendListInfo.java @@ -0,0 +1,30 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * Created by Seven on 2017/9/9. + */ + +public class ExpendListInfo implements Serializable { + private int pageCount; + private List>> billList; + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List>> getBillList() { + return billList; + } + + public void setBillList(List>> billList) { + this.billList = billList; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/IncomeInfo.java b/core/src/main/java/com/chwl/core/bills/bean/IncomeInfo.java new file mode 100644 index 0000000..960443b --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/IncomeInfo.java @@ -0,0 +1,169 @@ +package com.chwl.core.bills.bean; + +import com.google.gson.annotations.SerializedName; +import com.netease.nim.uikit.common.ui.recyclerview.entity.MultiItemEntity; + +import java.io.Serializable; + +/** + * 礼物收入支出实体 + * Created by Seven on 2017/9/11. + */ +public class IncomeInfo implements Serializable, MultiItemEntity { + public static final int INCOME_TITLE = 0; + public static final int INCOME_CONTENT = 1; + @SerializedName(value = "srcAvatar", alternate = "userAvatar") + private String userAvatar; + @SerializedName(value = "srcNick", alternate = "userNick") + private String userNick; + private String targetAvatar; + private String targetNick; + private double diamondNum; + private long recordTime; + private int gainType; + private int pageCount; + private int itemType; + private String time; + @SerializedName("giftPict") + private String giftPic; + private int giftNum; + private String giftName; + private int money; + + public int getExpendType() { + return expendType; + } + + public void setExpendType(int expendType) { + this.expendType = expendType; + } + + private int expendType; + + public int getGoldNum() { + return goldNum; + } + + public void setGoldNum(int goldNum) { + this.goldNum = goldNum; + } + + private int goldNum; + + public int getMoney() { + return money; + } + + public void setMoney(int money) { + this.money = money; + } + + + public String getGiftName() { + return giftName; + } + + public void setGiftName(String giftName) { + this.giftName = giftName; + } + + public int getGiftNum() { + return giftNum; + } + + public void setGiftNum(int giftNum) { + this.giftNum = giftNum; + } + + public String getGiftPic() { + return giftPic; + } + + public void setGiftPic(String giftPic) { + this.giftPic = giftPic; + } + + + public void setItemType(int itemType) { + this.itemType = itemType; + } + + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public String getUserNick() { + return userNick; + } + + public void setUserNick(String userNick) { + this.userNick = userNick; + } + + public String getTargetAvatar() { + return targetAvatar; + } + + public void setTargetAvatar(String targetAvatar) { + this.targetAvatar = targetAvatar; + } + + public String getTargetNick() { + return targetNick; + } + + public void setTargetNick(String targetNick) { + this.targetNick = targetNick; + } + + public double getDiamondNum() { + return diamondNum; + } + + public void setDiamondNum(double diamondNum) { + this.diamondNum = diamondNum; + } + + public long getRecordTime() { + return recordTime; + } + + public void setRecordTime(long recordTime) { + this.recordTime = recordTime; + } + + public int getGainType() { + return gainType; + } + + public void setGainType(int gainType) { + this.gainType = gainType; + } + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + @Override + public int getItemType() { +// Log.i(ResUtil.getString(R.string.bills_bean_incomeinfo_01), "" + diamondNum); + return time == null ? BillItemEntity.ITEM_NORMAL : BillItemEntity.ITEM_DATE; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/IncomeListInfo.java b/core/src/main/java/com/chwl/core/bills/bean/IncomeListInfo.java new file mode 100644 index 0000000..5c7761b --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/IncomeListInfo.java @@ -0,0 +1,31 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * Created by Seven on 2017/9/11. + */ + +public class IncomeListInfo implements Serializable { + private int pageCount; + private List>> billList; + + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List>> getBillList() { + return billList; + } + + public void setBillList(List>> billList) { + this.billList = billList; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/NobleBillListInfo.java b/core/src/main/java/com/chwl/core/bills/bean/NobleBillListInfo.java new file mode 100644 index 0000000..50ec593 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/NobleBillListInfo.java @@ -0,0 +1,61 @@ +package com.chwl.core.bills.bean; + +import java.util.List; +import java.util.Map; + +/** + *

贵族开通记录信息

+ * + * @author jiahui + * @date 2018/1/18 + */ +public class NobleBillListInfo { + public List>> billList; + + + public static class NobleBillInfo { + /** + * uid : 91222 + * optStr : 开通皇帝贵族 + * payStr : -1200000钻石 + * recordTime : 1516072923000 + */ + + private int uid; + private String optStr; + private String payStr; + private long recordTime; + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public String getOptStr() { + return optStr; + } + + public void setOptStr(String optStr) { + this.optStr = optStr; + } + + public String getPayStr() { + return payStr; + } + + public void setPayStr(String payStr) { + this.payStr = payStr; + } + + public long getRecordTime() { + return recordTime; + } + + public void setRecordTime(long recordTime) { + this.recordTime = recordTime; + } + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/RadishGiftInfo.java b/core/src/main/java/com/chwl/core/bills/bean/RadishGiftInfo.java new file mode 100644 index 0000000..3e9c526 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/RadishGiftInfo.java @@ -0,0 +1,31 @@ +package com.chwl.core.bills.bean; + +import lombok.Data; + +@Data +public class RadishGiftInfo { + + /** + * recordId : 1001 + * describeStr : 收礼人:某某 + * currencyStr : 萝卜币 + * date : 1552924800000 + * recordTime : 1552964064000 + * giftPicUrl : https://image.zhongjialx.com/FgJtvryp7XRCxCDBp3vUkskc8But?imageslim + * giftName : 花教授 + * giftNum : 1 + * giftId : 2 + * amountStr : -100 + */ + + private long recordId; + private String describeStr; + private String currencyStr; + private long date; + private long createTime; + private String giftPicUrl; + private String giftName; + private int giftNum; + private int giftId; + private String amountStr; +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/RadishGiftListInfo.java b/core/src/main/java/com/chwl/core/bills/bean/RadishGiftListInfo.java new file mode 100644 index 0000000..6ba96ef --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/RadishGiftListInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public class RadishGiftListInfo implements Serializable { + private int pageCount; + private List>> billList; + + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List>> getBillList() { + return billList; + } + + public void setBillList(List>> billList) { + this.billList = billList; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/RadishRecordInfo.java b/core/src/main/java/com/chwl/core/bills/bean/RadishRecordInfo.java new file mode 100644 index 0000000..72ecf2d --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/RadishRecordInfo.java @@ -0,0 +1,20 @@ +package com.chwl.core.bills.bean; + +import lombok.Data; + +@Data +public class RadishRecordInfo { + /** + * describeStr : 赠送座驾 + * currencyStr : 萝卜 + * date : 1552924800000 + * recordTime : 1552964064000 + * amountStr : -100 + */ + + private String describeStr; + private String currencyStr; + private long date; + private long createTime; + private String amountStr; +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/RadishRecordListInfo.java b/core/src/main/java/com/chwl/core/bills/bean/RadishRecordListInfo.java new file mode 100644 index 0000000..e0878d3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/RadishRecordListInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public class RadishRecordListInfo implements Serializable { + private int pageCount; + private List>> billList; + + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List>> getBillList() { + return billList; + } + + public void setBillList(List>> billList) { + this.billList = billList; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/RedBagInfo.java b/core/src/main/java/com/chwl/core/bills/bean/RedBagInfo.java new file mode 100644 index 0000000..d4996e8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/RedBagInfo.java @@ -0,0 +1,75 @@ +package com.chwl.core.bills.bean; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +/** + * Created by ${Seven} on 2017/9/25. + */ + +public class RedBagInfo implements Serializable { + public static final int INCOME_TITLE = 0; + public static final int INCOME_CONTENT = 1; + private int type; + private long uid; + private double packetNum; + @SerializedName("recordTime") + private long createTime; + private String time; + /** 红包类型 */ + private String typeStr; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public double getPacketNum() { + return packetNum; + } + + public void setPacketNum(double packetNum) { + this.packetNum = packetNum; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public int getItemType() { + return time == null ? INCOME_CONTENT : INCOME_TITLE; + } + + + public String getTypeStr() { + return typeStr; + } + + public void setTypeStr(String typeStr) { + this.typeStr = typeStr; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/RedBagListInfo.java b/core/src/main/java/com/chwl/core/bills/bean/RedBagListInfo.java new file mode 100644 index 0000000..94f980c --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/RedBagListInfo.java @@ -0,0 +1,30 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * Created by ${Seven} on 2017/9/25. + */ + +public class RedBagListInfo implements Serializable { + private int pageCount; + private List>> billList; + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List>> getBillList() { + return billList; + } + + public void setBillList(List>> billList) { + this.billList = billList; + } +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/TextInfos.java b/core/src/main/java/com/chwl/core/bills/bean/TextInfos.java new file mode 100644 index 0000000..924115f --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/TextInfos.java @@ -0,0 +1,34 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * Created by Seven on 2017/9/24. + */ + +public class TextInfos implements Serializable { + private int pageCount; + private List>> billList; + + public List>> getBillList() { + return billList; + } + + public void setBillList(List>> billList) { + this.billList = billList; + } + + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + + +} diff --git a/core/src/main/java/com/chwl/core/bills/bean/TimeInfo.java b/core/src/main/java/com/chwl/core/bills/bean/TimeInfo.java new file mode 100644 index 0000000..f13fb01 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/bean/TimeInfo.java @@ -0,0 +1,23 @@ +package com.chwl.core.bills.bean; + +import java.io.Serializable; + +/** + * Created by ${Seven} on 2017/9/13. + */ + +public class TimeInfo implements Serializable { + /*public TimeInfo(long time) { + this.time = time; + }*/ + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + private long time; +} diff --git a/core/src/main/java/com/chwl/core/bills/result/ChargeResult.java b/core/src/main/java/com/chwl/core/bills/result/ChargeResult.java new file mode 100644 index 0000000..3025e85 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/result/ChargeResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bills.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.ExpendListInfo; + +/** + * Created by Seven on 2017/9/9. + */ + +public class ChargeResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bills/result/ExpendResult.java b/core/src/main/java/com/chwl/core/bills/result/ExpendResult.java new file mode 100644 index 0000000..550e6ca --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/result/ExpendResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bills.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.ExpendListInfo; + +/** + * Created by Seven on 2017/9/9. + */ + +public class ExpendResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bills/result/IncomedResult.java b/core/src/main/java/com/chwl/core/bills/result/IncomedResult.java new file mode 100644 index 0000000..bebf911 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/result/IncomedResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bills.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.IncomeListInfo; + +/** + * Created by Seven on 2017/9/9. + */ + +public class IncomedResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bills/result/RadishGiftResult.java b/core/src/main/java/com/chwl/core/bills/result/RadishGiftResult.java new file mode 100644 index 0000000..36afc6c --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/result/RadishGiftResult.java @@ -0,0 +1,7 @@ +package com.chwl.core.bills.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.RadishGiftListInfo; + +public class RadishGiftResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/bills/result/RedBagResult.java b/core/src/main/java/com/chwl/core/bills/result/RedBagResult.java new file mode 100644 index 0000000..1848240 --- /dev/null +++ b/core/src/main/java/com/chwl/core/bills/result/RedBagResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.bills.result; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.RedBagListInfo; + +/** + * Created by Seven on 2017/9/9. + */ + +public class RedBagResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/certification/CertificationModel.java b/core/src/main/java/com/chwl/core/certification/CertificationModel.java new file mode 100644 index 0000000..6a2d3e3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/certification/CertificationModel.java @@ -0,0 +1,77 @@ +package com.chwl.core.certification; + +import com.chwl.core.base.BaseModel; + +public class CertificationModel extends BaseModel implements ICertificationModel { + + /** + * 实名认证引导类型, 不提示 + */ + public static final int CER_TYPE_NONE = 0; + + /** + * 实名认证引导类型,强制 + */ + public static final int CER_TYPE_FORCE = 1; + + /** + * 实名认证引导类型, 强引导 + */ + public static final int CER_TYPE_GUIDE = 2; + + /** + * 认证异常,网络不通或者环境问题 + */ + public static final int AUDIT_EXCEPTION = -2; + + /** + * 未认证,用户主动取消 + */ + public static final int AUDIT_NOT = -1; + + /** + * 认证中 + */ + public static final int AUDIT_IN_AUDIT = 0; + + /** + * 审核失败 + */ + public static final int AUDIT_FAIL = 1; + + /** + * 审核通过 + */ + public static final int AUDIT_PASS = 2; + + /** + * 实名认证引导类型: + * {@link #CER_TYPE_NONE} 不提示 + * {@link #CER_TYPE_FORCE} 强制 + * {@link #CER_TYPE_GUIDE} 强引导 + */ + private int certificationType; + + private CertificationModel() { + super(); + } + + private static final class Helper { + public static final CertificationModel INSTANCE = new CertificationModel(); + } + + public static CertificationModel get() { + return CertificationModel.Helper.INSTANCE; + } + + @Override + public void setCertificationType(int certificationType) { + this.certificationType = certificationType; + } + + @Override + public int getCertificationType() { + return certificationType; + } + +} diff --git a/core/src/main/java/com/chwl/core/certification/ICertificationModel.java b/core/src/main/java/com/chwl/core/certification/ICertificationModel.java new file mode 100644 index 0000000..9e462eb --- /dev/null +++ b/core/src/main/java/com/chwl/core/certification/ICertificationModel.java @@ -0,0 +1,10 @@ +package com.chwl.core.certification; + +import com.chwl.core.base.IModel; + +public interface ICertificationModel extends IModel { + + void setCertificationType(int certificationType); + + int getCertificationType(); +} diff --git a/core/src/main/java/com/chwl/core/certification/event/CertificationResultEvent.java b/core/src/main/java/com/chwl/core/certification/event/CertificationResultEvent.java new file mode 100644 index 0000000..c54fe41 --- /dev/null +++ b/core/src/main/java/com/chwl/core/certification/event/CertificationResultEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.certification.event; + +import lombok.Data; + +@Data +public class CertificationResultEvent { + + private int status; + + public int getStatus() { + return status; + } + + public CertificationResultEvent setStatus(int status) { + this.status = status; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/channel/ChannelModel.java b/core/src/main/java/com/chwl/core/channel/ChannelModel.java new file mode 100644 index 0000000..9259525 --- /dev/null +++ b/core/src/main/java/com/chwl/core/channel/ChannelModel.java @@ -0,0 +1,86 @@ +package com.chwl.core.channel; + +import com.orhanobut.logger.Logger; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.user.event.CurrentUserInfoCompleteEvent; +import com.chwl.library.utils.AppMetaDataUtil; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.net.HttpURLConnection; +import java.net.URL; + +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.schedulers.Schedulers; + +public class ChannelModel extends BaseModel implements IChannelModel{ + + private final static class InstanceHolder{ + public final static IChannelModel instance = new ChannelModel(); + } + + private ChannelModel() { + EventBus.getDefault().register(this); + } + + public static IChannelModel get(){ + return InstanceHolder.instance; + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onCurrentUserInfoCompleteEvent(CurrentUserInfoCompleteEvent event){ + notifyChannelStatistic(AuthModel.get().getCurrentUid()); + } + + /** + * 第一次注册->登录->填写完资料, 调用一下渠道接口,告知渠道统计 + */ + private void notifyChannelStatistic(long uid) { +// String channel = AppMetaDataUtil.getChannelID(); +// if ("WM_cpa".equals(channel)) { +// Single.create(new SingleOnSubscribe() { +// @Override +// public void subscribe(SingleEmitter e) throws Exception { +// //这里判断新设备,新用户 +// UserInfo userInfo = UserModel.get().getUserInfo(uid).blockingGet(); +// if (!userInfo.isNewUser()) { +// e.onSuccess(ResUtil.getString(R.string.xchat_android_core_channel_channelmodel_01)); +// return; +// } +// URL url = new URL(getWMCPAChannelStatisticUrl()); +// HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); +// httpURLConnection.setReadTimeout(30 * 1000); +// httpURLConnection.setRequestMethod("GET"); +// httpURLConnection.connect(); +// int respCode = -1; +// if ((respCode = httpURLConnection.getResponseCode()) == 200){ +// Logger.i(ResUtil.getString(R.string.xchat_android_core_channel_channelmodel_02)+respCode ); +// e.onSuccess(ResUtil.getString(R.string.xchat_android_core_channel_channelmodel_03)); +// }else { +// Logger.i(ResUtil.getString(R.string.xchat_android_core_channel_channelmodel_04) + respCode); +// e.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_channel_channelmodel_05)+respCode)); +// } +// httpURLConnection.disconnect(); +// } +// }).subscribeOn(Schedulers.io()) +// .subscribe(); +// } + } + + /** + * 获取WM_cpa渠道的统计连接 + * @return + */ + private String getWMCPAChannelStatisticUrl() { + return "http://veim.lrswl.com/effect.php?type=ef&pid=2735"; + } +} diff --git a/core/src/main/java/com/chwl/core/channel/IChannelModel.java b/core/src/main/java/com/chwl/core/channel/IChannelModel.java new file mode 100644 index 0000000..0d8d268 --- /dev/null +++ b/core/src/main/java/com/chwl/core/channel/IChannelModel.java @@ -0,0 +1,6 @@ +package com.chwl.core.channel; + +import com.chwl.core.base.IModel; + +public interface IChannelModel extends IModel { +} diff --git a/core/src/main/java/com/chwl/core/community/UserVo.kt b/core/src/main/java/com/chwl/core/community/UserVo.kt new file mode 100644 index 0000000..70e061a --- /dev/null +++ b/core/src/main/java/com/chwl/core/community/UserVo.kt @@ -0,0 +1,28 @@ +package com.chwl.core.community + +import androidx.annotation.Keep +import com.chwl.core.decoration.headwear.bean.HeadWearInfo +import com.chwl.core.utils.CurrentTimeUtils +import java.io.Serializable + + +@Keep +data class UserVo( + var erbanNo: Long = 0, + var uid: Long = 0, + var birth: Long = 0, + var nick: String? = null, + var gender: Int = 0, + var avatar: String? = null, + var isHasRegPacket: Boolean = false, + var userHeadwear: HeadWearInfo? = null +) : Serializable { + var age : Int = 0 + get() { + if (field != 0) return field + val current = CurrentTimeUtils.getCurrentTime() + var age = current - birth + age = age / 1000 / 60 / 60 / 24 / 365 + return if (age >= 0) age.toInt() else 0 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/contacts/ContactModel.java b/core/src/main/java/com/chwl/core/contacts/ContactModel.java new file mode 100644 index 0000000..d9961d3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/contacts/ContactModel.java @@ -0,0 +1,55 @@ +package com.chwl.core.contacts; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.SearchRoomInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public class ContactModel implements IContactModel { + + private Api api; + + private ContactModel() { + api = RxNet.create(Api.class); + } + + private static volatile ContactModel instance = new ContactModel(); + + public static ContactModel get() { + if (instance == null) { + synchronized (ContactModel.class) { + if (instance == null) { + instance = new ContactModel(); + } + } + } + return instance; + } + + @Override + public Single>> searchContacts(String keyword) { + return api.searchContact(String.valueOf(AuthModel.get().getCurrentUid()), keyword) + .compose(RxHelper.handleSchedulers()); + } + + interface Api { + + /** + * 搜索联系人(好友,关注,粉丝) + * + * @param uid current user id + * @param keyword 关键字 + * @return + */ + @GET("/fans/search/fans") + Single>> searchContact(@Query("uid") String uid, + @Query("searchKey") String keyword); + } +} diff --git a/core/src/main/java/com/chwl/core/contacts/IContactModel.java b/core/src/main/java/com/chwl/core/contacts/IContactModel.java new file mode 100644 index 0000000..12bc7b1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/contacts/IContactModel.java @@ -0,0 +1,14 @@ +package com.chwl.core.contacts; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.SearchRoomInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IContactModel extends IModel { + + Single>> searchContacts(String keyword); +} diff --git a/core/src/main/java/com/chwl/core/contacts/MyConstant.java b/core/src/main/java/com/chwl/core/contacts/MyConstant.java new file mode 100644 index 0000000..7e160f9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/contacts/MyConstant.java @@ -0,0 +1,33 @@ +package com.chwl.core.contacts; + +public @interface MyConstant { + + public String type = "type"; + + public @interface MicType{ + int open = 1; + int music =2; + int close = 3; + } + + + public @interface CP{ + + public @interface relationType{ + int CP = 1; + int brother = 2; + int sister = 3; + int friend = 4; + } + + public @interface clickFlag { + //默认状态0,申请发送后1,申请通过2 + int def = 0; + int applying =1; + int success = 3; + } + + } + + +} diff --git a/core/src/main/java/com/chwl/core/decoration/DecorationInfoEvent.java b/core/src/main/java/com/chwl/core/decoration/DecorationInfoEvent.java new file mode 100644 index 0000000..5aa3900 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/DecorationInfoEvent.java @@ -0,0 +1,17 @@ +package com.chwl.core.decoration; + +import com.chwl.core.decoration.bean.DecorationInfo; + +import lombok.Data; + +@Data +public class DecorationInfoEvent { + private DecorationInfo decorationInfo; + + public DecorationInfoEvent() { + } + + public DecorationInfoEvent(DecorationInfo decorationInfo) { + this.decorationInfo = decorationInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/decoration/DecorationModel.kt b/core/src/main/java/com/chwl/core/decoration/DecorationModel.kt new file mode 100644 index 0000000..8e4d6a7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/DecorationModel.kt @@ -0,0 +1,74 @@ +package com.chwl.core.decoration + +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.decoration.bean.DecorationInfo +import com.chwl.core.utils.net.RxHelper +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Single +import retrofit2.http.* + +object DecorationModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + suspend fun getDecorationInfoList(dressType: Int): List? = + launchRequest { + api.getDecorationInfoList(dressType) + } + + suspend fun buyDecoration(dressType: Int, dressId: Int): String? = + launchRequest { + api.buyDecoration(dressType, dressId) + } + + fun sendDecoration( + dressType: Int, + dressId: Int, + targetUid: Long, + ): Single { + return api.sendDecoration(dressType, dressId, targetUid) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + + private interface Api { + + /** + * 获取装扮商城列表 + * + * @return + */ + @GET("/dress/shop/list") + suspend fun getDecorationInfoList(@Query("dressType") dressType: Int): ServiceResult> + + /** + * 购买装扮 + * + * @return + */ + @FormUrlEncoded + @POST("/dress/shop/buy") + suspend fun buyDecoration( + @Field("dressType") dressType: Int, + @Field("id") id: Int + ): ServiceResult + + /** + * 赠送装扮 + * + * @return + */ + @FormUrlEncoded + @POST("/dress/shop/give") + fun sendDecoration( + @Field("dressType") dressType: Int, + @Field("id") id: Int, + @Field("targetUid") targetUid: Long, + ): Single> + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/decoration/backgroud/BackgroundModel.java b/core/src/main/java/com/chwl/core/decoration/backgroud/BackgroundModel.java new file mode 100644 index 0000000..b941cb9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/backgroud/BackgroundModel.java @@ -0,0 +1,261 @@ +package com.chwl.core.decoration.backgroud; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.backgroud.bean.BgInfo; +import com.chwl.core.decoration.headwear.throwable.HeadwearPulledOffShelvesException; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class BackgroundModel extends BaseModel implements IBackgroundModel { + private static final String TAG = "BackgroundModel"; + + private volatile static IBackgroundModel model; + private Api api; + + public static IBackgroundModel get() { + if (model == null) { + synchronized (BackgroundModel.class) { + if (model == null) { + model = new BackgroundModel(); + } + } + } + return model; + } + + private BackgroundModel() { + api = RxNet.create(Api.class); + } + + /** + * 获取背景列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + @Override + public Single>> getBgList(String uid, String page, String pageSize){ + return api.getBgList(uid, page, pageSize) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取可用背景列表 + * @param uid + * @return + */ + @Override + public Single>> getBgListCanUse(String uid){ + return api.getBgListCanUse(uid).compose(RxHelper.handleSchedulers()); + } + + /** + * 获取用户的背景列表 + * @param uid + * @return + */ + @Override + public Single>> getBgListByUser(String uid){ + return api.getBgListByUser(uid) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 购买/续费背景 + * @param backgroundId + * @return + */ + @Override + public Single buyBg(String backgroundId){ + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.buyBg( + String.valueOf(uid), + backgroundId, + ticket + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.decoration_backgroud_backgroundmodel_01)); + }else if (BalanceNotEnoughExeption.code == stringServiceResult.getCode()){ + return Single.error(new BalanceNotEnoughExeption(stringServiceResult.getMessage())); + }else if (HeadwearPulledOffShelvesException.code == stringServiceResult.getCode()){ + return Single.error(new HeadwearPulledOffShelvesException(stringServiceResult.getMessage())); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 赠送背景 + * @param backgroundId + * @param targetUid + * @return + */ + @Override + public Single sendBg(String backgroundId, String targetUid){ + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.sendBg(String.valueOf(uid), + backgroundId, + targetUid, + ticket + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.decoration_backgroud_backgroundmodel_02)); + }else if (BalanceNotEnoughExeption.code == stringServiceResult.getCode()){ + return Single.error(new BalanceNotEnoughExeption(stringServiceResult.getMessage())); + }else if (HeadwearPulledOffShelvesException.code == stringServiceResult.getCode()){ + return Single.error(new HeadwearPulledOffShelvesException(stringServiceResult.getMessage())); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 使用背景 + * @param roomUid + * @param backgroundId + * @return + */ + @Override + public Single> userBg(String roomUid, String backgroundId){ + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.userBg(roomUid, + String.valueOf(uid), + backgroundId, + ticket + ) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 取消背景 + * @param roomUid + * @param backgroundId + * @return + */ + @Override + public Single> cancelBg(String roomUid, String backgroundId){ + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.cancelBg(roomUid, + String.valueOf(uid), + backgroundId, + ticket + ) + .compose(RxHelper.handleSchedulers()); + } + + + public interface Api{ + /** + * 获取背景列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("background/list") + Single>> getBgList(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + /** + * 获取可用背景列表 + * @param uid + * @return + */ + @GET("background/listByAvailable") + Single>> getBgListCanUse(@Query("uid") String uid); + + /** + * 获取用户的背景列表 + * @param uid + * @return + */ + @GET("background/listByUser") + Single>> getBgListByUser(@Query("uid") String uid); + + /** + * 购买/续费背景 + * @param uid + * @param backgroundId + * @param ticket + * @return + */ + @POST("background/buy") + Single> buyBg(@Query("uid") String uid, + @Query("backgroundId") String backgroundId, + @Query("ticket") String ticket); + + /** + * 赠送背景 + * @param uid + * @param backgroundId + * @param targetUid + * @param ticket + * @return + */ + @POST("background/donate") + Single> sendBg(@Query("uid") String uid, + @Query("backgroundId") String backgroundId, + @Query("targetUid") String targetUid, + @Query("ticket") String ticket); + + /** + * 使用背景 + * @param roomUid + * @param uid + * @param backgroundId + * @param ticket + * @return + */ + @POST("background/doUse") + Single> userBg(@Query("roomUid") String roomUid, + @Query("uid") String uid, + @Query("backgroundId") String backgroundId, + @Query("ticket") String ticket); + + /** + * 取消背景 + * @param roomUid + * @param uid + * @param backgroundId + * @param ticket + * @return + */ + @POST("background/cancel") + Single> cancelBg(@Query("roomUid") String roomUid, + @Query("uid") String uid, + @Query("backgroundId") String backgroundId, + @Query("ticket") String ticket); + } +} diff --git a/core/src/main/java/com/chwl/core/decoration/backgroud/IBackgroundModel.java b/core/src/main/java/com/chwl/core/decoration/backgroud/IBackgroundModel.java new file mode 100644 index 0000000..b88a1c6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/backgroud/IBackgroundModel.java @@ -0,0 +1,48 @@ +package com.chwl.core.decoration.backgroud; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.backgroud.bean.BgInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IBackgroundModel extends IModel { + Single>> getBgList(String uid, String page, String pageSize); + + Single>> getBgListCanUse(String uid); + + Single>> getBgListByUser(String uid); + + /** + * 购买/续费背景 + * @param backgroundId + * @return + */ + Single buyBg(String backgroundId); + + /** + * 赠送背景 + * @param backgroundId + * @param targetUid + * @return + */ + Single sendBg(String backgroundId, String targetUid); + + /** + * 使用背景 + * @param roomUid + * @param backgroundId + * @return + */ + Single> userBg(String roomUid, String backgroundId); + + /** + * 取消背景 + * @param roomUid + * @param backgroundId + * @return + */ + Single> cancelBg(String roomUid, String backgroundId); +} diff --git a/core/src/main/java/com/chwl/core/decoration/backgroud/bean/BgInfo.java b/core/src/main/java/com/chwl/core/decoration/backgroud/bean/BgInfo.java new file mode 100644 index 0000000..ca2f8a1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/backgroud/bean/BgInfo.java @@ -0,0 +1,195 @@ +package com.chwl.core.decoration.backgroud.bean; + +import java.io.Serializable; + +/** + * Created by huangmeng1 on 2018/6/20. + */ + +public class BgInfo implements Serializable { + public int id; + public String name; + public String pic; + public String effect; + public String icon; + public int originalPrice; + public int costPrice; + public int price; + public int renewPrice; + public int expireDays; + public int days; + public int labelType; + public int limitType; + public String limitDesc; + public boolean isFree; + public int comeFrom; + public int enable; + public boolean used; + public String redirectLink; + public int status; + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getComeFrom() { + return comeFrom; + } + + public void setComeFrom(int comeFrom) { + this.comeFrom = comeFrom; + } + + public int isEnable() { + return enable; + } + + public void setEnable(int enable) { + this.enable = enable; + } + + public boolean isUsed() { + return used; + } + + public void setUsed(boolean used) { + this.used = used; + } + + public void setRemainingDay(int remainingDay) { + this.expireDays = remainingDay; + } + + public int getRemainingDay() { + return expireDays; + } + + public int getExpireDays() { + return expireDays; + } + + public void setExpireDays(int expireDays) { + this.expireDays = expireDays; + } + + public String getLimitDesc() { + return limitDesc; + } + + public void setLimitDesc(String limitDesc) { + this.limitDesc = limitDesc; + } + + public void setFree(boolean free) { + isFree = free; + } + + public String getRedirectLink() { + return redirectLink; + } + + public void setRedirectLink(String redirectLink) { + this.redirectLink = redirectLink; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getEffect() { + return effect; + } + + public void setEffect(String effect) { + this.effect = effect; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public int getOriginalPrice() { + return originalPrice; + } + + public void setOriginalPrice(int originalPrice) { + this.originalPrice = originalPrice; + } + + public int getCostPrice() { + return costPrice; + } + + public void setCostPrice(int costPrice) { + this.costPrice = costPrice; + } + + public int getRenewPrice() { + return renewPrice; + } + + public void setRenewPrice(int renewPrice) { + this.renewPrice = renewPrice; + } + + public int getDays() { + return days; + } + + public void setDays(int days) { + this.days = days; + } + + public int getLabelType() { + return labelType; + } + + public void setLabelType(int labelType) { + this.labelType = labelType; + } + + public int getLimitType() { + return limitType; + } + + public void setLimitType(int limitType) { + this.limitType = limitType; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + +} diff --git a/core/src/main/java/com/chwl/core/decoration/bean/BaseDecoration.java b/core/src/main/java/com/chwl/core/decoration/bean/BaseDecoration.java new file mode 100644 index 0000000..92275bd --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/BaseDecoration.java @@ -0,0 +1,70 @@ +package com.chwl.core.decoration.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 装饰品基类 + * create by lvzebiao @2019/3/21 + */ +@Data +public class BaseDecoration implements Serializable { + + private String name; + + private int price; + private int renewPrice;//续费价格 + private int originalPrice;//原价 + + private boolean goldSale;//是否支持钻石购买 + private boolean radishSale;//是否支持萝卜购买 + + private int radishPrice;//萝卜购买价格 + private int radishRenewPrice;//萝卜续费价格 + private int radishOriginalPrice;//萝卜原价 + private String priceStr; // 价格字符串 + private boolean enableStatus; // false下架 true上架 + + public boolean isOnlyGoldSale() { + return goldSale && !radishSale; + } + + public boolean isOnlyRadishSale() { + return radishSale && !goldSale; + } + + public boolean isGoldAndRadishSale() { + return goldSale && radishSale; + } + + /** + * 实际购买价格 + */ + public int getRealPrice() { + return price; + } + + /** + * 萝卜实际购买价格 + */ + public int getRealRadishPrice() { + return radishPrice; + } + + public int getDays() { + return 0; + } + + public long getDecorationId() { + return 0; + } + + /** + * 是否是续费 + */ + public boolean isRenew() { + return false; + } + +} diff --git a/core/src/main/java/com/chwl/core/decoration/bean/CurrencyType.java b/core/src/main/java/com/chwl/core/decoration/bean/CurrencyType.java new file mode 100644 index 0000000..ba58839 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/CurrencyType.java @@ -0,0 +1,10 @@ +package com.chwl.core.decoration.bean; + +/** + * 虚拟币类型 + * create by lvzebiao @2019/3/22 + */ +public interface CurrencyType { + int GOLD = 0; //钻石 + int RADISH = 1; //萝卜 +} diff --git a/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt b/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt new file mode 100644 index 0000000..2e7964f --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/DecorationInfo.kt @@ -0,0 +1,21 @@ +package com.chwl.core.decoration.bean + +data class DecorationInfo( + val dressDay: Int = 0, + val dressId: Int = 0, + val dressPrice: Double = 0.0, + val dressSeq: Int = 0, + val dressType: Int = 0, + val id: Int = 0, + val iosPic: String = "", + val name: String = "", + val pic: String = "", + val dressLimitStatus: Int = 0, + val effect: String = "", //装扮动效图片 + val effectType: Int = 0, //动效类型 + val discountPrice: Double = 0.0, //折扣价格 + val vipLevel: Int = 0, //VIP等级 + val discount: Int = 0, // 折扣百分比 + val vipLimit: Int = 0, //VIP等级限定 ,0=不限定 + val obtainWay: Int = 0 //1-普通 2-活动 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/decoration/bean/DecorationStoreRouterType.java b/core/src/main/java/com/chwl/core/decoration/bean/DecorationStoreRouterType.java new file mode 100644 index 0000000..57f5bc6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/DecorationStoreRouterType.java @@ -0,0 +1,21 @@ +package com.chwl.core.decoration.bean; + + +public class DecorationStoreRouterType { + + /** + * 头饰 + */ + public static final int TYPE_HEAD_WEAR = 1; + + /** + * 座驾 + */ + public static final int TYPE_CAR = 2; + + /** + * 背景 + */ + public static final int TYPE_BACKGROUND = 3; + +} diff --git a/core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java b/core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java new file mode 100644 index 0000000..6f3e5d4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/DressUpInfo.java @@ -0,0 +1,46 @@ +package com.chwl.core.decoration.bean; + +import lombok.Data; + +@Data +public class DressUpInfo { + public boolean isNull; + public boolean isMy; + public boolean isSelect; + public int dressLimitStatus; + + public String pic; + public String name; + public String word; + public String price=""; + public String originalPrice=""; + public int buyDay; + + public String effect; //装扮动效图片 + /** + * 特效类型 1-mp4 2-svga + */ + public int effectType; + public int dressType; // 商品类型 + /** + * 请求使用接口时 用 + */ + public int id; //商品类型id + /** + * 请求购买 赠送 续费接口时用 + */ + public int dressId; // 商品类型 +// public int discountPrice; //折扣价格 + public int vipLevel; //当前用户VIP等级 + public int discount; // 折扣百分比 + public int vipLimit; //VIP等级限定 ,0=不限定 + /** + * //1-普通 2-活动 + */ + public int obtainWay; + + public int expireDays = -1; //剩余天数 + public boolean hasExpired; //是否过期 + + +} diff --git a/core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java b/core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java new file mode 100644 index 0000000..180dac8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/bean/ShopMine.java @@ -0,0 +1,25 @@ +package com.chwl.core.decoration.bean; + +import lombok.Data; + +@Data +public class ShopMine { + public int id; //装扮id 使用 + public int dressId; //装扮id 购买 + public int dressType; //装扮类型 + public int obtainWay; //获取方式 1-普通 2-活动 + + public String pic; + public String name; + public String effect; + public boolean used; + public int expireDays = -1; //剩余天数 + public int effectType; + public int dressDay; + public boolean hasExpired; //是否过期 + + public double discountPrice; // + public double dressPrice; // + + +} diff --git a/core/src/main/java/com/chwl/core/decoration/car/CarModel.java b/core/src/main/java/com/chwl/core/decoration/car/CarModel.java new file mode 100644 index 0000000..34ef7ad --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/car/CarModel.java @@ -0,0 +1,335 @@ +package com.chwl.core.decoration.car; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.car.bean.CarInfo; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +/** + * @author xiaoyu + */ + +public class CarModel extends BaseModel implements ICarModel { + /** + * 请求一次接口数据的个数 + */ + public static final int ONE_TIME_COUNT = 30; + private static final String TAG = "CarModel"; + private final Api api; + + private volatile static CarModel model; + + public static CarModel get() { + if (model == null) { + synchronized (CarModel.class) { + if (model == null) { + model = new CarModel(); + } + } + } + return model; + } + + private CarModel() { + api = RxNet.create(Api.class); + } + + @Override + public Single>> getMyCars() { + long uid = AuthModel.get().getCurrentUid(); + if (uid == 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.decoration_car_carmodel_01))); + } + return getUserCarsV2(uid); + } + + /** + * 根据UID获取座驾列表 + * @param uid + * @return + */ + @Override + public Single>> getUserCars(long uid) { + String ticket = AuthModel.get().getTicket(); + return api.requestMyCars(ticket, uid) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 根据UID获取座驾列表V2 + * + * @param uid + * @return + */ + @Override + public Single>> getUserCarsV2(long uid) { + return api.requestMyCarsV2(uid) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 获取座驾商城列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + @Override + public Single>> getStoreCars(long uid, String page, String pageSize) { + return api.requestCarStore(page, pageSize, uid) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取座驾商城列表V2 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + @Override + public Single>> getStoreCarsV2(long uid, String page, String pageSize) { + return api.requestCarStoreV2(page, pageSize, uid) + .compose(RxHelper.handleSchAndExce()); + } + + /** + * 购买/续费该座驾 + * @param carId + * @return + */ + @Override + public Single> buyThisCar(int carId) { + String ticket = AuthModel.get().getTicket(); + long uid = AuthModel.get().getCurrentUid(); + return api.buyThisCar(ticket, uid, carId) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 购买此座驾V2 + * + * @param currencyType 支付货币类型:0钻石,1萝卜 + */ + @Override + public Single buyThisCarV2(long carId, int currencyType) { + long uid = AuthModel.get().getCurrentUid(); + return api.buyThisCarV2(uid, currencyType, carId) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleGoods()) + .flatMap((Function, SingleSource>) result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_car_carmodel_02)); + } else { + return Single.error(RxHelper.createThrowable(result)); + } + }); + } + + /** + * 使用座驾 + * @param carId + * @return + */ + @Override + public Single> driveThisCar(int carId) { + String ticket = AuthModel.get().getTicket(); + long uid = AuthModel.get().getCurrentUid(); + return api.driveThisCar(ticket, uid, carId) + .compose(RxHelper.handleSchedulers()); + + } + + /** + * 赠送座驾 + * @param targetUid + * @param carId + * @return + */ + @Override + public Single sendCar(String targetUid, String carId) { + String ticket = AuthModel.get().getTicket(); + long uid = AuthModel.get().getCurrentUid(); + return api.sendCar(String.valueOf(uid), carId,targetUid,ticket) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult result) throws Exception { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_car_carmodel_03)); + } else if (result.getCode() == BalanceNotEnoughExeption.code) { + return Single.error(new BalanceNotEnoughExeption(result.getMessage())); + } else { + return Single.error(new Throwable(result.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + + } + + /** + * 赠送座驾V2 + * + * @param targetUid 赠送人 + * @param currencyType {@link com.chwl.core.decoration.bean.CurrencyType} + * 支付货币类型:0钻石,1萝卜 + * @return + */ + @Override + public Single sendCarV2(String targetUid, String carId, int currencyType) { + long uid = AuthModel.get().getCurrentUid(); + return api.sendCarV2(String.valueOf(uid), carId, targetUid, currencyType) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleGoods()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_car_carmodel_04)); + } + return Single.error(RxHelper.createThrowable(result)); + }); + + } + + public interface Api { + /** + * 购买/续费该座驾 + * "uid":90670, + * "carId":1, + * "used":0, + * "status":1, + * "buyTime":"2018-02-28 00:00:00", + * "expireTime":"2018-02-28 00:00:00", + * "updateTime":"2018-02-28 00:00:00" + * + * @param ticket 用户的ticket + * @param uid 用户的uid + * @param carId 座驾的id,id!=0 表示购买这个carId的座驾 + * @return - carInfo只有carId是有用的, + */ + @POST("/car/pay/byGold") + @FormUrlEncoded + Single> buyThisCar(@Field("ticket") String ticket, @Field("uid") long uid, @Field("carId") int carId); + + /** + * 购买/续费该座驾V2 + * + * @param uid 用户的uid + * @param currencyType 支付货币类型:0钻石,1萝卜 + * @param carId 座驾的id,id!=0 表示购买这个carId的座驾 + * @return - carInfo只有carId是有用的, + */ + @POST("car/pay/v2/buy") + @FormUrlEncoded + Single> buyThisCarV2(@Field("uid") long uid, + @Field("currencyType") int currencyType, + @Field("carId") long carId); + + /** + * 使用座驾 + * + * @param ticket 用户的ticket + * @param uid 用户的uid + * @param carId 座驾的id,id=0 则表示不使用座驾,id!=0 表示使用该carId的座驾 + * @return - + */ + @POST("/car/carport/use") + @FormUrlEncoded + Single> driveThisCar(@Field("ticket") String ticket, @Field("uid") long uid, @Field("carId") int carId); + + /** + * 获取座驾详情 + * + * @param carId 座驾id + * @return - + */ + @GET("/car/car/goods/{id}") + Single> getCarDetail(@Path("id") String carId); + + /** + * 获取座驾商店 + * + * @param page 页码 + * @param pageSize 每页条数 + * @return - + */ + @GET("/car/goods") + Single>> requestCarStore(@Query("page") String page, + @Query("pageSize") String pageSize, + @Query("uid") long uid); + + /** + * 获取座驾商店V2 + * + * @param page 页码 + * @param pageSize 每页条数 + * @return - + */ + @GET("car/goods/v2/list") + Single>> requestCarStoreV2(@Query("page") String page, + @Query("pageSize") String pageSize, + @Query("uid") long uid); + + /** + * 获取自己的车库 + * + * @param ticket - + * @param uid - + * @return - + */ + @POST("/car/carport/list") + @FormUrlEncoded + Single>> requestMyCars(@Field("ticket") String ticket, @Field("uid") long uid); + + /** + * 获取自己的车库V2 + * + * @param uid - + * @return - + */ + @GET("car/carport/v2/list") + Single>> requestMyCarsV2(@Query("uid") long uid); + + + /** + * 赠送座驾 + * @param uid + * @param carId + * @param targetUid + * @param ticket + * @return + */ + @POST("car/pay/giveByGold") + Single> sendCar(@Query("uid") String uid,@Query("carId") String carId,@Query("targetUid") String targetUid,@Query("ticket") String ticket); + + /** + * 赠送座驾V2 + * + * @param targetUid 被赠送人 + * @param currencyType {@link com.chwl.core.decoration.bean.CurrencyType} + */ + @POST("car/pay/v2/giveCar") + Single> sendCarV2(@Query("uid") String uid, + @Query("carId") String carId, + @Query("targetUid") String targetUid, + @Query("currencyType") int currencyType); + } +} diff --git a/core/src/main/java/com/chwl/core/decoration/car/ICarModel.java b/core/src/main/java/com/chwl/core/decoration/car/ICarModel.java new file mode 100644 index 0000000..0dcd8d1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/car/ICarModel.java @@ -0,0 +1,91 @@ +package com.chwl.core.decoration.car; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.car.bean.CarInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface ICarModel extends IModel { + + /** + * 获取车库 + * @return + */ + Single>> getMyCars(); + + /** + * 根据UID获取座驾列表 + * @param uid + * @return + */ + Single>> getUserCars(long uid); + + /** + * 根据UID获取座驾列表V2 + * + * @param uid + * @return + */ + Single>> getUserCarsV2(long uid); + + + /** + * 获取座驾商城列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + Single>> getStoreCars(long uid, String page, String pageSize); + + /** + * 获取座驾商城列表V2 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + Single>> getStoreCarsV2(long uid, String page, String pageSize); + + /** + * 购买此座驾 + * @param carId + * @return + */ + Single> buyThisCar(int carId); + + /** + * 购买此座驾V2 + * + * @param currencyType 支付货币类型:0钻石,1萝卜 + */ + Single buyThisCarV2(long carId, int currencyType); + + /** + * 使用此座驾 + * @param carId + * @return + */ + Single> driveThisCar(int carId); + + /** + * 赠送座驾 + * @param targetUid + * @param carId + * @return + */ + Single sendCar(String targetUid, String carId); + + /** + * 赠送座驾V2 + * + * @param targetUid 被赠送人 + * @param currencyType {@link com.chwl.core.decoration.bean.CurrencyType} + * 虚拟币类型 + */ + Single sendCarV2(String targetUid, String carId, int currencyType); +} diff --git a/core/src/main/java/com/chwl/core/decoration/car/bean/CarInfo.java b/core/src/main/java/com/chwl/core/decoration/car/bean/CarInfo.java new file mode 100644 index 0000000..3b15e16 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/car/bean/CarInfo.java @@ -0,0 +1,153 @@ +package com.chwl.core.decoration.car.bean; + +import com.chwl.core.decoration.bean.BaseDecoration; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by yudi + * on 2018/2/27. + */ +@Setter +@Getter +public class CarInfo extends BaseDecoration implements Serializable { + + public final static int TAG_TYPE_NORMAL = 0;//没标签 + public final static int TAG_TYPE_NEW = 1;//新品 + public final static int TAG_TYPE_DISCOUNT = 2;//折扣 + public final static int TAG_TYPE_LIMIT = 3;//限定 + public final static int TAG_TYPE_EXCLUSIVE = 4;//专属 + /** + * 不合法状态 + */ + public static final int STATUS_INVALID = 0; + /** + * 下架状态 + */ + public static final int STATUS_OFF_SHELF = 1; + /** + * 过期状态 + */ + public static final int STATUS_OUT_OF_DATE = 2; + /** + * 有效状态 + */ + public static final int STATUS_USER_CAN_USE = 3; + //public static final String EFFECT = "effect"; + public static final String CAR_NAME = "carName"; + public int expireDays; + public int limitType; + /** + * 该状态状态 + */ + public int status = STATUS_INVALID; + @SerializedName("id") + private int carId; //使用 用 id + private int dressShopId; // 购买续费 用 dressShopId + /** + * 座驾的封面 + */ + private String pic; + /** + * 座驾特效的url + */ + @SerializedName(value = "effect") + private String effect; + private int otherViewType; + private String viewUrl; + private boolean isGive; + /** + * 是否使用中 + */ + private int using; + /** + * 还有多少天过期 + * 如果还剩下几个小时,显示的0天 + */ + @SerializedName("expireDate") + private int remainingDay = -1; + /** + * 购买一次最多的有效天数 + */ + private int days = -1; + private int nobleId; + + private double dressPrice; + private double discountPrice; + private int dressDay; + /** + * 标签类型(0、无 1、新品 2、折扣 3、限定 4、专属) + */ + private int labelType; + private String limitDesc;//限定描述 + private String redirectLink;//跳转链接 + + public CarInfo(String effect, String viewUrl, int otherViewType) { + this.effect = effect; + this.otherViewType = otherViewType; + this.viewUrl = viewUrl; + } + + public boolean isUsing() { + return using == 1; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CarInfo carInfo = (CarInfo) o; + + return carId == carInfo.carId; + } + + @Override + public int hashCode() { + return carId; + } + + public Map toMap(Map valueMap, CarInfo carInfo) { + if (valueMap == null) + valueMap = new HashMap<>(); + valueMap.put(CAR_NAME, carInfo.getName()); + return valueMap; + } + + @Override + public int getRealPrice() { + if (getRemainingDay() > 0 && getStatus() == CarInfo.STATUS_USER_CAN_USE) { + return getRenewPrice(); + } + return getPrice(); + } + + @Override + public int getRealRadishPrice() { + if (getRemainingDay() > 0 && getStatus() == CarInfo.STATUS_USER_CAN_USE) { + return getRadishRenewPrice(); + } + return getRadishPrice(); + } + + public int getDays() { + return days; + } + + @Override + public long getDecorationId() { + return carId; + } + + @Override + public boolean isRenew() { + return getRemainingDay() > 0 && getStatus() == CarInfo.STATUS_USER_CAN_USE; + } +} + diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java b/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java new file mode 100644 index 0000000..0396092 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/headwear/HeadwearModel.java @@ -0,0 +1,500 @@ +package com.chwl.core.decoration.headwear; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.headwear.bean.ChatBubbleInfo; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.decoration.headwear.bean.UserCardWearInfo; +import com.chwl.core.decoration.headwear.throwable.HeadwearPulledOffShelvesException; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class HeadwearModel extends BaseModel implements IHeadwearModel { + private static final String TAG = "HeadwearModel"; + + private volatile static IHeadwearModel model; + private Api api; + + private HeadwearModel() { + api = RxNet.create(Api.class); + } + + public static IHeadwearModel get() { + if (model == null) { + synchronized (HeadwearModel.class) { + if (model == null) { + model = new HeadwearModel(); + } + } + } + return model; + } + + /** + * 获取商城头饰列表 + * + * @param page + * @param pageSize + * @return + */ + @Override + public Single>> getStoreHeadWearList(long uid, String page, String pageSize) { + return api.getHeadWearList(String.valueOf(uid), page, pageSize) + .compose(RxHelper.handleSchedulers()); + } + + /** + * V2获取商城头饰列表,新增萝卜 + */ + @Override + public Single>> getStoreHeadWearListV2(long uid, String page, String pageSize) { + return api.getHeadWearListV2(String.valueOf(uid), page, pageSize) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取头饰详情 + * + * @param headwearId + * @return + */ + @Override + public Single> getHeadWearDetail(String headwearId) { + return api.getHeadWearDetai(headwearId) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取头饰列表 + * + * @return + */ + @Override + public Single>> getHeadWearList(long uid) { + return api.getMyHeadWear(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取头饰列表 + * + * @return + */ + @Override + public Single>> getHeadWearListV2(long uid) { + return api.getMyHeadWearV2(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 获取头饰账单 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + @Override + public Single>> getMyHeadWearBill(String uid, + String page, + String pageSize) { + return api.getMyHeadWearBill(uid, page, pageSize) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 使用已经购买的头饰 + * id == 0标识不使用头饰 + * + * @param headwearId + * @return + */ + @Override + public Single userMyHeadWear(String headwearId) { + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.userMyHeadWear(String.valueOf(uid), headwearId, ticket) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_01)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .doOnSuccess(s -> { + if (AvRoomDataManager.get().mCurrentRoomInfo != null) { + // 更新房间信息 + IMNetEaseManager.get().updateMyRoomRole(); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 购买/续费头饰 + * + * @param headwearId + * @return + */ + @Override + public Single buyHeadWear(long headwearId, String type) { + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.buyHeadWear( + String.valueOf(uid), + String.valueOf(headwearId), + type, + ticket + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_02)); + } else if (BalanceNotEnoughExeption.code == stringServiceResult.getCode()) { + return Single.error(new BalanceNotEnoughExeption(stringServiceResult.getMessage())); + } else if (HeadwearPulledOffShelvesException.code == stringServiceResult.getCode()) { + return Single.error(new HeadwearPulledOffShelvesException(stringServiceResult.getMessage())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 购买/续费头饰 + * + * @param currencyType {@link com.chwl.core.decoration.bean.CurrencyType} + * @return + */ + @Override + public Single buyHeadWearV2(long headwearId, int currencyType) { + long uid = AuthModel.get().getCurrentUid(); + return api.buyHeadWearV2( + String.valueOf(uid), + String.valueOf(headwearId), + currencyType + ) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleGoods()) + .flatMap((Function, SingleSource>) stringServiceResult -> { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_03)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }); + + } + + /** + * 赠送头饰给某人 + * + * @param headwearId + * @param targetUid + * @return + */ + @Override + public Single sendHeadWear(String headwearId, String targetUid) { + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.sendHeadWear(String.valueOf(uid), + headwearId, + targetUid, + ticket + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_04)); + } else if (BalanceNotEnoughExeption.code == stringServiceResult.getCode()) { + return Single.error(new BalanceNotEnoughExeption(stringServiceResult.getMessage())); + } else if (HeadwearPulledOffShelvesException.code == stringServiceResult.getCode()) { + return Single.error(new HeadwearPulledOffShelvesException(stringServiceResult.getMessage())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 赠送头饰 + * + * @param currencyType {@link com.chwl.core.decoration.bean.CurrencyType} + * 支付货币类型:0钻石,1萝卜 + */ + @Override + public Single sendHeadWearV2(int currencyType, String headwearId, String targetUid) { + long uid = AuthModel.get().getCurrentUid(); + return api.sendHeadWearV2(String.valueOf(uid), + currencyType, + headwearId, + targetUid + ) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleGoods()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_05)); + } + return Single.error(RxHelper.createThrowable(result)); + }); + + } + + + /** + * 获取头饰列表 + * + * @return + */ + @Override + public Single>> getUserCardWearList(int page, int pageSize) { + return api.getMyUserCardWearList(page,pageSize) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 使用已经购买的头饰 + * + * @param wearId + * @return + */ + @Override + public Single useUserCardWear(String wearId) { + return api.userMyUserCardWear(wearId) + .flatMap(serviceResult -> { + if (serviceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_06)); + } else { + return Single.error(new Throwable(serviceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取头饰列表 + * + * @return + */ + @Override + public Single>> getChatBubbleInfoList(int page, int pageSize) { + return api.getChatBubbleInfoList(page,pageSize) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 使用已经购买的头饰 + * + * @param wearId + * @return + */ + @Override + public Single userChatBubble(String wearId) { + return api.userChatBubble(wearId) + .flatMap(serviceResult -> { + if (serviceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_headwear_headwearmodel_07)); + } else { + return Single.error(new Throwable(serviceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + private interface Api { + + /** + * 获取商城头饰列表 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("v1/headwear") + Single>> getHeadWearList(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + /** + * V2获取商城头饰列表,新增萝卜 + */ + @GET("headwear/v2/list") + Single>> getHeadWearListV2(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + /** + * 获取头饰详情 + * + * @param headwearId + * @return + */ + @GET("v1/headwear") + Single> getHeadWearDetai(@Query("headwearId") String headwearId); + + /** + * 获取我的头饰 + * + * @param uid + * @return + */ + @GET("v1/user/headwear") + Single>> getMyHeadWear(@Query("uid") String uid); + + /** + * 获取用户头饰V2 + * + * @param uid + * @return + */ + @GET("headwear/v2/user/list") + Single>> getMyHeadWearV2(@Query("uid") String uid); + + /** + * 获取头饰账单 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("v1/headwear/bill") + Single>> getMyHeadWearBill(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + /** + * 使用头饰 + * + * @param uid + * @param headwear_id + * @param ticket + * @return + */ + @POST("v1/user/headwear/use") + Single> userMyHeadWear(@Query("uid") String uid, + @Query("headwearId") String headwear_id, + @Query("ticket") String ticket); + + /** + * 购买/续费头饰 + * + * @param uid + * @param headwearId + * @param ticket + * @return + */ + @POST("v1/headwear/buy") + Single> buyHeadWear(@Query("uid") String uid, + @Query("headwearId") String headwearId, + @Query("type") String type, + @Query("ticket") String ticket); + + /** + * 购买/续费头饰 + * + * @param uid + * @param headwearId + * @param currencyType 支付货币类型:0钻石,1萝卜 + * @return + */ + @POST("headwear/v2/buy") + Single> buyHeadWearV2(@Query("uid") String uid, + @Query("headwearId") String headwearId, + @Query("currencyType") int currencyType); + + /** + * 赠送头饰 + * + * @param uid + * @param headwearId + * @param target_uid + * @param ticket + * @return + */ + @POST("v1/headwear/donate") + Single> sendHeadWear(@Query("uid") String uid, + @Query("headwearId") String headwearId, + @Query("targetUid") String target_uid, + @Query("ticket") String ticket); + + /** + * 赠送头饰V2 + * + * @param currencyType 支付货币类型:0钻石,1萝卜 + */ + @POST("headwear/v2/headwear/donate") + Single> sendHeadWearV2(@Query("uid") String uid, + @Query("currencyType") int currencyType, + @Query("headwearId") String headwearId, + @Query("targetUid") String targetUid); + + /** + * 使用资料卡装扮 + * + * @param cardId + * @return + */ + @GET("userInfoCard/optUserInfoCard") + Single> userMyUserCardWear(@Query("cardId") String cardId); + + /** + * 分页获取用户资料卡装扮列表 + */ + @GET("userInfoCard/listByPage") + Single>> getMyUserCardWearList(@Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 使用聊天气泡 + * + * @param cardId + * @return + */ + @FormUrlEncoded + @POST("userChatBubble/optUserChatBubble") + Single> userChatBubble(@Field("bubbleId") String cardId); + + /** + * 分页获取用户聊天气泡列表 + */ + @GET("userChatBubble/listByPage") + Single>> getChatBubbleInfoList(@Query("page") int page, + @Query("pageSize") int pageSize); + + } + + +} diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/IHeadwearModel.java b/core/src/main/java/com/chwl/core/decoration/headwear/IHeadwearModel.java new file mode 100644 index 0000000..c24bdf9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/headwear/IHeadwearModel.java @@ -0,0 +1,105 @@ +package com.chwl.core.decoration.headwear; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.headwear.bean.ChatBubbleInfo; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.decoration.headwear.bean.UserCardWearInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IHeadwearModel extends IModel { + + /** + * 获取商城头饰列表 + * @param page + * @param pageSize + * @return + */ + Single>> getStoreHeadWearList(long uid, String page, String pageSize); + + /** + * V2获取商城头饰列表,新增萝卜 + */ + Single>> getStoreHeadWearListV2(long uid, String page, String pageSize); + + /** + * 获取头饰详情 + * @param headwearId + * @return + */ + Single> getHeadWearDetail(String headwearId); + + /** + * 获取我的头饰列表 + * + * @return + */ + Single>> getHeadWearList(long uid); + + /** + * 获取我的头饰列表 + * + * @return + */ + Single>> getHeadWearListV2(long uid); + + /** + * 获取头饰账单 + * @param uid + * @param page + * @param pageSize + * @return + */ + Single>> getMyHeadWearBill(String uid, + String page, + String pageSize); + /** + * 使用已经购买的头饰 + * @param headwearId + * @return + */ + Single userMyHeadWear(String headwearId); + + /** + * 购买/续费头饰 + * @param headwearId + * @return + */ + Single buyHeadWear(long headwearId, String type); + + /** + * 购买/续费头饰V2 + * + * @param headwearId + * @param currencyType 支付货币类型:0钻石,1萝卜 + * @return + */ + Single buyHeadWearV2(long headwearId, int currencyType); + + /** + * 赠送头饰 + * @param headwearId + * @param targetUid + * @return + */ + Single sendHeadWear(String headwearId, String targetUid); + + /** + * 赠送头饰 + * + * @param currencyType {@link com.chwl.core.decoration.bean.CurrencyType} + * 支付货币类型:0钻石,1萝卜 + */ + Single sendHeadWearV2(int currencyType, String headwearId, String targetUid); + + Single>> getUserCardWearList(int page, int pageSize); + + Single useUserCardWear(String wearId); + + Single>> getChatBubbleInfoList(int page, int pageSize); + + Single userChatBubble(String wearId); +} diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/bean/ChatBubbleInfo.java b/core/src/main/java/com/chwl/core/decoration/headwear/bean/ChatBubbleInfo.java new file mode 100644 index 0000000..6391030 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/headwear/bean/ChatBubbleInfo.java @@ -0,0 +1,26 @@ +package com.chwl.core.decoration.headwear.bean; + +import lombok.Data; + +@Data +public class ChatBubbleInfo { + private String bubbleId; + private int comeFrom; + private int expireDays; + private String expireTime; + private boolean hasExpired; + private String name; + private String bubbleUrl; + private boolean hasUsed; + private int labelType; + + private int dressShopId; + private double dressPrice; + private double discountPrice; + private String discount; + private int vipLevel; + private String effect; + private int effectType; + private int dressDay; + +} diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/bean/HeadWearInfo.java b/core/src/main/java/com/chwl/core/decoration/headwear/bean/HeadWearInfo.java new file mode 100644 index 0000000..383f65e --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/headwear/bean/HeadWearInfo.java @@ -0,0 +1,129 @@ +package com.chwl.core.decoration.headwear.bean; + +import com.chwl.core.decoration.bean.BaseDecoration; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by huangmeng1 on 2018/5/10. + */ +@Getter +@Setter +public class HeadWearInfo extends BaseDecoration implements Serializable { + public static final String PIC = "pic"; + public static final String EFFECT = "effect"; + public static final String TYPE = "headWearType"; + public static final String HEAD_WEAR = "headWearUrl"; + public static final int STATUS_IN_USED = 1; + public static final int STATUS_OUT_OF_DATE = 2; + + public final static int LABEL_TYPE_NORMAL = 0;//没标签 + public final static int LABEL_TYPE_NEW = 1;//新品 + public final static int LABEL_TYPE_DISCOUNT = 2;//折扣 + public final static int LABEL_TYPE_LIMIT = 3;//限定 + public final static int LABEL_TYPE_EXCLUSIVE = 4;//专属 + + /** + * headwearId : 1 + * name : 皇帝头饰 + * pic : + * effect : + * price : 1500 + * renewPrice : 1500 + * seq : 1 + * enable : true + * used : true + * nobleLimit : true + * monsterLimit : false + * weekStarLimit : false + * createTime : 1525972020984 + * updateTime : 1525972020984 + */ + + private int headwearId; + private String headwearName; + private String pic; + private String effect; + + private int seq; + private int days; + private int expireDays; + private int status; + private int comeFrom; + private boolean enable; + private boolean used; + private long createTime; + private long updateTime; + + private int labelType;//标签类型(0、无 1、新品 2、折扣 3、限定 4、专属) + private String limitDesc;//限定描述 + private String redirectLink;//H5连接,某些头饰是活动得到,这里跳转活动 + + private int type; + + public Map toMap(Map map) { + if (map == null) { + map = new HashMap<>(1); + } + map.put(PIC, pic); + map.put(EFFECT, effect); + map.put(TYPE, type); + if (effect != null && effect.length() > 0) { + map.put(HEAD_WEAR, effect); + } else { + map.put(HEAD_WEAR, pic); + } + return map; + } + + /** + * 实际购买价格 + */ + @Override + public int getRealPrice() { + if (status == HeadWearInfo.STATUS_IN_USED) { + return getRenewPrice(); + } + return getPrice(); + } + + /** + * 实际购买价格 + */ + @Override + public int getRealRadishPrice() { + if (status == HeadWearInfo.STATUS_IN_USED) { + return getRadishRenewPrice(); + } + return getRadishPrice(); + } + + public int getDays() { + return days; + } + + @Override + public long getDecorationId() { + return headwearId; + } + + @Override + public boolean isRenew() { + return status == HeadWearInfo.STATUS_IN_USED; + } + + public String getFirstUrl() { + if (effect != null && effect.length() > 0) { + return effect; + } + if (pic != null && pic.length() > 0) { + return pic; + } + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/bean/UserCardWearInfo.java b/core/src/main/java/com/chwl/core/decoration/headwear/bean/UserCardWearInfo.java new file mode 100644 index 0000000..a50dd31 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/headwear/bean/UserCardWearInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.decoration.headwear.bean; + +import lombok.Data; + +@Data +public class UserCardWearInfo { + private String cardId; + private int comeFrom; + private int expireDays; + private String expireTime; + private boolean hasExpired; + private String name; + private String pic; + private boolean used; + private int labelType; + + private int dressShopId; + private double dressPrice; + private double discountPrice; + private String discount; + private int vipLevel; + private String effect; + private int effectType; + private int dressDay; + + +} diff --git a/core/src/main/java/com/chwl/core/decoration/headwear/throwable/HeadwearPulledOffShelvesException.java b/core/src/main/java/com/chwl/core/decoration/headwear/throwable/HeadwearPulledOffShelvesException.java new file mode 100644 index 0000000..2a33d95 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/headwear/throwable/HeadwearPulledOffShelvesException.java @@ -0,0 +1,9 @@ +package com.chwl.core.decoration.headwear.throwable; + +public class HeadwearPulledOffShelvesException extends Exception{ + public final static int code = 6202;//头饰下架异常码 + + public HeadwearPulledOffShelvesException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/decoration/nameplate/INamePlateModel.java b/core/src/main/java/com/chwl/core/decoration/nameplate/INamePlateModel.java new file mode 100644 index 0000000..2a1c6c3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/nameplate/INamePlateModel.java @@ -0,0 +1,18 @@ +package com.chwl.core.decoration.nameplate; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.nameplate.bean.NamePlateInfo; + +import io.reactivex.Single; + +public interface INamePlateModel extends IModel { + + /** + * 获取我的铭牌列表 + * + * @return + */ + Single> getNamePlateList(long uid); + +} diff --git a/core/src/main/java/com/chwl/core/decoration/nameplate/NamePlateModel.java b/core/src/main/java/com/chwl/core/decoration/nameplate/NamePlateModel.java new file mode 100644 index 0000000..78c31fc --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/nameplate/NamePlateModel.java @@ -0,0 +1,101 @@ +package com.chwl.core.decoration.nameplate; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.nameplate.bean.NamePlateInfo; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class NamePlateModel extends BaseModel { + + private volatile static NamePlateModel model; + private Api api; + + public static NamePlateModel get() { + if (model == null) { + synchronized (NamePlateModel.class) { + if (model == null) { + model = new NamePlateModel(); + } + } + } + return model; + } + + private NamePlateModel() { + api = RxNet.create(Api.class); + } + + /** + * 获取铭牌列表 + * + * @return + */ + public Single getNamePlateList(long uid) { + return api.getNamePlateList(String.valueOf(uid), "1", "1000") + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 使用铭牌 + * + * @return + */ + public Single useMyNamePlate(String nameplateId,String word){ + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.useMyNamePlate(String.valueOf(uid),nameplateId,word,ticket) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.decoration_nameplate_nameplatemodel_01)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .doOnSuccess(s -> { + if (AvRoomDataManager.get().mCurrentRoomInfo != null) { + // 更新房间信息 + IMNetEaseManager.get().updateMyRoomRole(); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + + + private interface Api { + /** + * 获取铭牌列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + @POST("nameplate/userNameplateList") + Single> getNamePlateList(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + @POST("nameplate/useNameplate") + Single> useMyNamePlate(@Query("uid") String uid, + @Query("userNameplateId") String userNameplateId, + @Query("word") String word, + @Query("ticket") String ticket); + } + +} diff --git a/core/src/main/java/com/chwl/core/decoration/nameplate/bean/NamePlateInfo.java b/core/src/main/java/com/chwl/core/decoration/nameplate/bean/NamePlateInfo.java new file mode 100644 index 0000000..10b4147 --- /dev/null +++ b/core/src/main/java/com/chwl/core/decoration/nameplate/bean/NamePlateInfo.java @@ -0,0 +1,228 @@ +package com.chwl.core.decoration.nameplate.bean; + +import java.util.List; + +public class NamePlateInfo { + + + /** + * total : 4 + * nameplateList : [{"id":6,"uid":934999,"nameplateId":9,"isCustomWord":true,"remark":"5","expireTime":1587275848000,"createTime":1586930248000,"updateTime":1586930248000,"nameplateName":ResUtil.getString(R.string.nameplate_bean_nameplateinfo_01),"nameplateImage":"http://4567.jpg","isExpired":false,"expireDays":71}] + */ + + private int total; + private List nameplateList; + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public List getNameplateList() { + return nameplateList; + } + + public void setNameplateList(List nameplateList) { + this.nameplateList = nameplateList; + } + + public static class NameplateListBean { + /** + * id : 6 + * uid : 934999 + * nameplateId : 9 + * isCustomWord : true + * remark : 5 + * expireTime : 1587275848000 + * createTime : 1586930248000 + * updateTime : 1586930248000 + * nameplateName : 天龙八部 + * nameplateImage : http://4567.jpg + * isExpired : false + * expireDays : 71 + */ + + private int id; + private int uid; + private int nameplateId; + private boolean isCustomWord; + private String remark; + private long expireTime; + private long createTime; + private long updateTime; + private String nameplateName; + private String nameplateImage; + private boolean isExpired; + private int expireDays; + private boolean isUsing; + private String word; + private double discountPrice; + private double dressPrice; + private int dressShopId; + private int dressDay; + + public int getDressDay() { + return dressDay; + } + + public void setDressDay(int dressDay) { + this.dressDay = dressDay; + } + + public double getDiscountPrice() { + return discountPrice; + } + + public void setDiscountPrice(double discountPrice) { + this.discountPrice = discountPrice; + } + + public double getDressPrice() { + return dressPrice; + } + + public void setDressPrice(double dressPrice) { + this.dressPrice = dressPrice; + } + + public int getDressShopId() { + return dressShopId; + } + + public void setDressShopId(int dressShopId) { + this.dressShopId = dressShopId; + } + + public String getWord() { + return word; + } + + public void setWord(String word) { + this.word = word; + } + + public boolean isCustomWord() { + return isCustomWord; + } + + public void setCustomWord(boolean customWord) { + isCustomWord = customWord; + } + + public boolean isExpired() { + return isExpired; + } + + public void setExpired(boolean expired) { + isExpired = expired; + } + + public boolean isUsing() { + return isUsing; + } + + public void setUsing(boolean using) { + isUsing = using; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getNameplateId() { + return nameplateId; + } + + public void setNameplateId(int nameplateId) { + this.nameplateId = nameplateId; + } + + public boolean isIsCustomWord() { + return isCustomWord; + } + + public void setIsCustomWord(boolean isCustomWord) { + this.isCustomWord = isCustomWord; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(long updateTime) { + this.updateTime = updateTime; + } + + public String getNameplateName() { + return nameplateName; + } + + public void setNameplateName(String nameplateName) { + this.nameplateName = nameplateName; + } + + public String getNameplateImage() { + return nameplateImage; + } + + public void setNameplateImage(String nameplateImage) { + this.nameplateImage = nameplateImage; + } + + public boolean isIsExpired() { + return isExpired; + } + + public void setIsExpired(boolean isExpired) { + this.isExpired = isExpired; + } + + public int getExpireDays() { + return expireDays; + } + + public void setExpireDays(int expireDays) { + this.expireDays = expireDays; + } + } + +} diff --git a/core/src/main/java/com/chwl/core/earn/bean/ClanHallMemberIncomeTotalInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/ClanHallMemberIncomeTotalInfo.kt new file mode 100644 index 0000000..659b7d9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/ClanHallMemberIncomeTotalInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.earn.bean + +import lombok.Data +import java.math.BigDecimal + +@Data +data class ClanHallMemberIncomeTotalInfo( + val total: BigDecimal, + val totalRemainGolds: Double, + val totalEarnGolds: Double, + val totalGiftGolds: Double, + val totalExchangeGolds: Double, + val hallVoList: List, + val hallMemberMap:Map +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/EarnRecordInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/EarnRecordInfo.kt new file mode 100644 index 0000000..006fc10 --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/EarnRecordInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.earn.bean + +import lombok.Data +import java.math.BigDecimal + +@Data +data class EarnRecordInfo( + val uid: Long, + val diamonds: BigDecimal, + val crystals: Double, + val golds: BigDecimal, + val isClan: Boolean = false, + val isClanElder: Boolean = false, + val hasGoldExchangeAuth: Boolean = false +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/GoldRecordInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/GoldRecordInfo.kt new file mode 100644 index 0000000..75e18af --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/GoldRecordInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.earn.bean + +import lombok.Data +import java.math.BigDecimal + +@Data +data class GoldRecordInfo( + val total: Long, + val hallMember: List +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/GoldToDiamondInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/GoldToDiamondInfo.kt new file mode 100644 index 0000000..06a070d --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/GoldToDiamondInfo.kt @@ -0,0 +1,18 @@ +package com.chwl.core.earn.bean + +import lombok.Data +import java.io.Serializable +import java.math.BigDecimal + +@Data +data class GoldToDiamondInfo( + val diamonds: BigDecimal?, + val golds: BigDecimal?, + val rate: Double, + val maxDiamonds: Long, + val minDiamonds: Long, + val maxGolds: Long, + val minGolds: Long, + val hasPaymentPwd: Boolean, + val isClan: Boolean +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowInfo.kt new file mode 100644 index 0000000..82ff8a1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowInfo.kt @@ -0,0 +1,16 @@ +package com.chwl.core.earn.bean + +import lombok.Data + +@Data +data class HallMemberGoldFlowInfo( + val uid: Long, + val erbanNo: Long, + val nick: String? = null, + val avatar: String? = null, + val hallId: Long, + val giftDiamonds: Double,//钻石 + val giftGolds: Double,//金币收益 + val exchangeGolds: Double,//已兑换金币 + val remainGolds: Double//可结算金币 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowTotalInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowTotalInfo.kt new file mode 100644 index 0000000..7ad03ab --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/HallMemberGoldFlowTotalInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.earn.bean + +import lombok.Data +import java.math.BigDecimal + +@Data +data class HallMemberGoldFlowTotalInfo( + val total: Double, + val hallMember: List//昵称 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/HallVo.kt b/core/src/main/java/com/chwl/core/earn/bean/HallVo.kt new file mode 100644 index 0000000..f2660ed --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/HallVo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.earn.bean + +import lombok.Data + +@Data +data class HallVo( + val hallId: Long, + val hallName: String, + val ownerUid: Long, + val ownerAvatar: String +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/bean/RoomTypeInfo.kt b/core/src/main/java/com/chwl/core/earn/bean/RoomTypeInfo.kt new file mode 100644 index 0000000..afe55b1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/bean/RoomTypeInfo.kt @@ -0,0 +1,16 @@ +package com.chwl.core.earn.bean + +import java.math.BigDecimal + +data class RoomTypeInfo( + val uid: Long, + val diamonds: BigDecimal, + val crystals: Double, + val golds: BigDecimal, + val isClan: Boolean = false, + val isClanElder: Boolean = false, + val hasGoldExchangeAuth: Boolean = false, + val sendGold: Boolean = false, + val hasPaymentPwd: Boolean = false, + val roomType: Int, +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/earn/model/EarnModel.kt b/core/src/main/java/com/chwl/core/earn/model/EarnModel.kt new file mode 100644 index 0000000..79713a4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/earn/model/EarnModel.kt @@ -0,0 +1,111 @@ +package com.chwl.core.earn.model + +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.earn.bean.* +import com.chwl.core.home.bean.* +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +object EarnModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + suspend fun queryWithRoomType(): RoomTypeInfo? = + launchRequest { + api.queryWithRoomType() + } + + suspend fun getEarnRecord(): EarnRecordInfo? = + launchRequest { + api.getEarnRecordInfo() + } + + suspend fun getGoldToDiamond(): GoldToDiamondInfo? = + launchRequest { + api.getGoldToDiamondInfo() + } + + suspend fun exchangeConfirm( + goldNum: Long, + diamondNum: Long, + currency: Int + ): String? = + launchRequest { + api.exchangeConfirm(goldNum, diamondNum, currency) + } + + + + + + + + suspend fun getMemberSettlement(startTime: String, endTime: String): ClanHallMemberIncomeTotalInfo? = + launchRequest { + api.getMemberSettlement(startTime, endTime) + } + + suspend fun getHallMemberTotalList(startTime: String, endTime: String): GoldRecordInfo? = + launchRequest { + api.getHallMemberTotalList(startTime, endTime) + } + + private interface Api { + + /** + * @return + */ + @GET("/purse/queryWithRoomType") + suspend fun queryWithRoomType(): ServiceResult + + /** + * @return + */ + @GET("purse/query") + suspend fun getEarnRecordInfo(): ServiceResult + + /** + * @return + */ + @GET("/goldExchangeDiamond/getConfig") + suspend fun getGoldToDiamondInfo(): ServiceResult + + /** + * @return + */ + @POST("/goldExchangeDiamond/exchange") + suspend fun exchangeConfirm( + @Query("goldNum") goldNum: Long, + @Query("diamondNum") diamondNum: Long, + @Query("currency") currency: Int + ): ServiceResult + + + + + + /** + * @return + */ + @GET("/clanGoldFlow/clanTotalList") + suspend fun getMemberSettlement( + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): ServiceResult + + /** + * @return + */ + @GET("/clanGoldFlow/hallMemberTotalList") + suspend fun getHallMemberTotalList( + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): ServiceResult + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/exception/ErrorThrowable.java b/core/src/main/java/com/chwl/core/exception/ErrorThrowable.java new file mode 100644 index 0000000..9236acb --- /dev/null +++ b/core/src/main/java/com/chwl/core/exception/ErrorThrowable.java @@ -0,0 +1,33 @@ +package com.chwl.core.exception; + +import androidx.annotation.StringDef; + +/** + *

+ * + * @author jiahui + * @date 2018/1/6 + */ +public class ErrorThrowable extends Throwable { + /** 房间信息为空报错 */ + public static final String ROOM_INFO_NULL_ERROR = "50012"; + /** 用户帐号为空 */ + public static final String ACCOUNT_NULL_ERROR = "500100"; + + @StringDef(ROOM_INFO_NULL_ERROR) + public @interface ErrorStr { + } + + + public ErrorThrowable(@ErrorStr String message) { + super(message); + } + + public ErrorThrowable(@ErrorStr String message, Throwable cause) { + super(message, cause); + } + + public ErrorThrowable(Throwable cause) { + super(cause); + } +} diff --git a/core/src/main/java/com/chwl/core/exception/FailReasonException.java b/core/src/main/java/com/chwl/core/exception/FailReasonException.java new file mode 100644 index 0000000..07c5df5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/exception/FailReasonException.java @@ -0,0 +1,25 @@ +package com.chwl.core.exception; + +/** + * 接口上返回的 error code,用这个类封装起来 + * 然后以 Single.error 的方式往外抛 + */ +public class FailReasonException extends Exception { + + public static final int CODE_UNKNOW = -1; + + private int code; + + public FailReasonException(String message, int code) { + super(message); + this.code = code; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } +} diff --git a/core/src/main/java/com/chwl/core/exception/NullDataException.java b/core/src/main/java/com/chwl/core/exception/NullDataException.java new file mode 100644 index 0000000..b54a81c --- /dev/null +++ b/core/src/main/java/com/chwl/core/exception/NullDataException.java @@ -0,0 +1,11 @@ +package com.chwl.core.exception; + +/** + * Created by MadisonRong on 2019-08-16 + */ +public class NullDataException extends Exception { + + public NullDataException() { + super("data is null"); + } +} diff --git a/core/src/main/java/com/chwl/core/exception/UnKnowException.java b/core/src/main/java/com/chwl/core/exception/UnKnowException.java new file mode 100644 index 0000000..673f178 --- /dev/null +++ b/core/src/main/java/com/chwl/core/exception/UnKnowException.java @@ -0,0 +1,10 @@ +package com.chwl.core.exception; + +/** + * 未知错误 + * Created by yudi + * on 2018/3/15. + */ + +public class UnKnowException extends Throwable { +} diff --git a/core/src/main/java/com/chwl/core/family/bean/BillDateDivInfo.java b/core/src/main/java/com/chwl/core/family/bean/BillDateDivInfo.java new file mode 100644 index 0000000..b5370b9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/BillDateDivInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.family.bean; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/30 + */ +@Data +public class BillDateDivInfo { + private String moneyName; + private String date; + private double income; + private double expend; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/CustomServiceInfo.java b/core/src/main/java/com/chwl/core/family/bean/CustomServiceInfo.java new file mode 100644 index 0000000..fc6a80e --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/CustomServiceInfo.java @@ -0,0 +1,19 @@ +package com.chwl.core.family.bean; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/31 + */ +@Data +public class CustomServiceInfo { + public final static int TYPE_ONLINE = 1; + public final static int TYPE_PHONE = 2; + + private String id; + private int type;// 1是在线 2是电话 + private String content; + private String uid;//uid +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyCustomServiceInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyCustomServiceInfo.java new file mode 100644 index 0000000..c8f8112 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyCustomServiceInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.family.bean; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/31 + */ +@Data +public class FamilyCustomServiceInfo { + private List services; + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyGameInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyGameInfo.java new file mode 100644 index 0000000..b520685 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyGameInfo.java @@ -0,0 +1,18 @@ +package com.chwl.core.family.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/25 + */ +@Data +public class FamilyGameInfo implements Serializable{ + private long id; + private String name; + private String icon; + private String link; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyGroupInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyGroupInfo.java new file mode 100644 index 0000000..88b2be5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyGroupInfo.java @@ -0,0 +1,44 @@ +package com.chwl.core.family.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/25 + */ +@Data +public class FamilyGroupInfo implements Serializable { + /** + * "id":19, + "tid":"524823123", + "name":"groupInfor1112", + "uid":91318, + "familyId":1, + "icon":"https://image.zhongjialx.com/FtaYAz7vImwkP71E9oTP9qjhe6HO?imageslim", + "isVerify":false, + "managerCount":0, + "disabledCount":0, + "memberCount":1, + "createTime":1528366785000, + "updateTime":1528366785000, + "isExists":false + */ + + private long id; + private String tid;//云信群组id + private String name; + private long uid; + private String icon; + private boolean isVerify;//进群是否需要验证 + private int managerCount; + private int disabledCount; + private int memberCount; + private long createTime; + private long updateTime; + private boolean isExists;//是否在群里面 + + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyInfo.java new file mode 100644 index 0000000..0f3350c --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyInfo.java @@ -0,0 +1,59 @@ +package com.chwl.core.family.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/24 + */ +@Data +public class FamilyInfo implements Serializable { + + public final static String NO_FAMILY_ID = "0";//没加入家族userinfo 返回的家族id 是0 表示没有家族 + + public final static int STATUS_IN_FAMILY = 1;//是否在该家族 1是 + public final static int STATUS_NOT_IN_FAMILY = 0;//是否在该家族 0不是 + + public final static int VERIFY_ON = 1;//加入家族验证 1要 + public final static int VERIFY_OFF = 0;//加入家族验证 0不要 + + public final static int LEVEL_PATRIARCH = 10;//position-> 族长 + public final static int LEVEL_MEMBER = 0;//position-> 普通成员 + + + private String familyId; + private String familyName; + private String familyIcon; + private String background; + private int position; + + private int memberCount;//家族成员总数 + + private int enterStatus;// 是否在该家族 1是 0不是 + + private double familyMoney; + private String moneyName;//家族代币名称 + + private int verifyType;//加入家族验证 1要 0不要 + + private boolean openMoney;//是否打开家族币 + + private boolean openGame;//是否打开家族游戏 + + private double redPacketRate; // 红包费率 + + private double gameRate; // 家族游戏费率 + + private FamilyMemberInfo leader; + + private List games; + + private List members; + + private List groups; + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyManageItemInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyManageItemInfo.java new file mode 100644 index 0000000..08e55c1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyManageItemInfo.java @@ -0,0 +1,24 @@ +package com.chwl.core.family.bean; + +import androidx.annotation.DrawableRes; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/24 + */ +@Data +public class FamilyManageItemInfo { + public static transient final int ID_FAMILY_MANAGE_CURRENCY = 1; + public static transient final int ID_FAMILY_MANAGE_MEMBER = 2; + public static transient final int ID_FAMILY_MANAGE_INFO = 3; + + private int id; + private String name; + @DrawableRes + private int img; + + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyMemberInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyMemberInfo.java new file mode 100644 index 0000000..cf7b32d --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyMemberInfo.java @@ -0,0 +1,46 @@ +package com.chwl.core.family.bean; + +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.noble.bean.NobleInfo; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/25 + */ +@Data +public class FamilyMemberInfo implements Serializable { + + public final static int LEVEL_PATRIARCH = 10;//position-> 族长 + public final static int LEVEL_MEMBER = 0;//position-> 普通成员 + + + private long uid; + + private String name; + + private String icon; + + private int position; + + private long money; + + private long erbanNo;//耳伴号 + + private boolean isSelect = false;//控制字段,已选未选 + + private int gender; + + /** + * 贵族信息 + */ + private NobleInfo nobleUsers; + /** + * 等级信息 + */ + private UserLevelVo userLevelVo; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FamilyPlazaInfo.java b/core/src/main/java/com/chwl/core/family/bean/FamilyPlazaInfo.java new file mode 100644 index 0000000..f3e06db --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FamilyPlazaInfo.java @@ -0,0 +1,18 @@ +package com.chwl.core.family.bean; + +import com.chwl.core.family.bean.response.familyPlaza.RespFamily; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/31 + */ +@Data +public class FamilyPlazaInfo { + private List banners; + private RespFamily familys; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/FindBannerInfo.java b/core/src/main/java/com/chwl/core/family/bean/FindBannerInfo.java new file mode 100644 index 0000000..f4e61ac --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/FindBannerInfo.java @@ -0,0 +1,80 @@ +package com.chwl.core.family.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import lombok.Data; + +/** + * Created by Administrator on 2017/8/7. + */ +@Data +public class FindBannerInfo implements Parcelable { + + public final static transient int SKIP_TYP_APP = 1; + public final static transient int SKIP_TYP_CHAT_ROOM = 2; + public final static transient int SKIP_TYP_H5 = 3; + + /* + bannerId:1 //id + bannerName: xx//横幅广告名称 + bannerPic:xx //横幅图片 + skipType:xx // 1跳app页面,2跳聊天室,3跳h5页面 + displayType //1顶部banner 2底部banner + skipUri:xx //跳转uri + */ + private int bannerId; + private String bannerName; + private String bannerPic; + private int skipType; + private int displayType; + private String skipUri; + + @Override + public String toString() { + return "BannerInfo{" + + "bannerId=" + bannerId + + ", bannerName='" + bannerName + '\'' + + ", bannerPic='" + bannerPic + '\'' + + ", skipType=" + skipType + + ", skipUri='" + skipUri + '\'' + + '}'; + } + + protected FindBannerInfo(Parcel in) { + bannerId = in.readInt(); + bannerName = in.readString(); + bannerPic = in.readString(); + skipType = in.readInt(); + skipUri = in.readString(); + displayType = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(bannerId); + dest.writeString(bannerName); + dest.writeString(bannerPic); + dest.writeInt(skipType); + dest.writeString(skipUri); + dest.writeInt(displayType); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public FindBannerInfo createFromParcel(Parcel in) { + return new FindBannerInfo(in); + } + + @Override + public FindBannerInfo[] newArray(int size) { + return new FindBannerInfo[size]; + } + }; + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/HomeBannerInfo.java b/core/src/main/java/com/chwl/core/family/bean/HomeBannerInfo.java new file mode 100644 index 0000000..62f4de6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/HomeBannerInfo.java @@ -0,0 +1,22 @@ +package com.chwl.core.family.bean; + +import com.chwl.core.home.bean.BannerInfo; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +@Data +public class HomeBannerInfo { + + private List topBanners; + + private ArrayList firstPageBannerVos; + private List allVo; + + public boolean isEmpty() { + return ListUtils.isListEmpty(firstPageBannerVos) && ListUtils.isListEmpty(allVo); + } +} diff --git a/core/src/main/java/com/chwl/core/family/bean/HomeTitleInfo.java b/core/src/main/java/com/chwl/core/family/bean/HomeTitleInfo.java new file mode 100644 index 0000000..071430d --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/HomeTitleInfo.java @@ -0,0 +1,81 @@ +package com.chwl.core.family.bean; + +import com.chwl.core.utils.SharedPreferenceUtils; + +import java.util.List; + +import javax.annotation.Nullable; + +import lombok.Data; + +/** + * 首页的标题 + */ +@Data +public class HomeTitleInfo { + /** + * 下拉列表的id + */ + private int id; + private String name; + /** + * 存放同等级的tabid + */ + private int tabId; + /** + * 1 男神 2女神 3男神女神 + */ + private int type; + private List opts; + + /** + * 判断是否含有子标题 + * + * @return + */ + public boolean hasSubTitle() { + return opts != null && !opts.isEmpty(); + } + + + /** + * 获取默认值 + * + * @param gender + * @return + */ + public @Nullable + HomeTitleInfo getDefault(int gender) { + if (!hasSubTitle()) { + return null; + } + //获取偏好设置 + int id = (int) SharedPreferenceUtils.get("key_subtitle", -1); + if (id != -1) { + for (HomeTitleInfo opt : opts) { + if (opt.getId() == id) { + return opt; + } + } + } + + int targetGender = 3; + if (gender == 2) { + targetGender = 1; + } else if (gender == 1) { + targetGender = 2; + } + for (HomeTitleInfo opt : opts) { + if (opt.getType() == targetGender) { + return opt; + } + } + + return null; + } + + public void saveDefault() { + + SharedPreferenceUtils.put("key_subtitle", id); + } +} diff --git a/core/src/main/java/com/chwl/core/family/bean/TransactionRecordInfo.java b/core/src/main/java/com/chwl/core/family/bean/TransactionRecordInfo.java new file mode 100644 index 0000000..0c93d47 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/TransactionRecordInfo.java @@ -0,0 +1,21 @@ +package com.chwl.core.family.bean; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/5/30 + */ +@Data +public class TransactionRecordInfo { + private long uid; + private String title; + private String desc; + private String avatar; + private String date; + private double data; + private String moneyName; + private int type; + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/VMBillItemInfo.java b/core/src/main/java/com/chwl/core/family/bean/VMBillItemInfo.java new file mode 100644 index 0000000..54dfa8a --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/VMBillItemInfo.java @@ -0,0 +1,37 @@ +package com.chwl.core.family.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +/** + * @author jack + * @Description + * @Date 2018/5/30 + */ + +public class VMBillItemInfo implements MultiItemEntity { + + public final static int TYPE_DATE_DIV = 1; + public final static int TYPE_TRANSACTION_RECORD = 2; + public final static int TYPE_EMPTY_TIP = 3; + + private T data; + + private int viewType; + + public VMBillItemInfo(int viewType) { + this.viewType = viewType; + } + + @Override + public int getItemType() { + return viewType; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/RankingFamilyInfo.java b/core/src/main/java/com/chwl/core/family/bean/response/RankingFamilyInfo.java new file mode 100644 index 0000000..2b125a9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/RankingFamilyInfo.java @@ -0,0 +1,42 @@ +package com.chwl.core.family.bean.response; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/7/26 + */ +@Data +public class RankingFamilyInfo { + /** + * "id":213, + "name":ResUtil.getString(R.string.bean_response_rankingfamilyinfo_01), + "icon":"https://image.zhongjialx.com/FvwoNgn9m8nVvr7kVyHLJPxK7Xfn?imageslim", + "leader":"91775", + "money":100000, + "status":0, + "moneyName":ResUtil.getString(R.string.bean_response_rankingfamilyinfo_02), + "verifyType":1, + "openMoney":true, + "openGame":true, + "familyCharm":1000000, + "createTime":1531395738281 + */ + + + private String id; + private String name; + private String icon; + private long leader; + private String money; + private String status; + private String moneyName; + private int verifyType; + private boolean openMoney; + private boolean openGame; + private long familyCharm; + private long createTime; + private int memberCount;// 家族成员数量 + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/RespFamilyGameList.java b/core/src/main/java/com/chwl/core/family/bean/response/RespFamilyGameList.java new file mode 100644 index 0000000..c34cac4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/RespFamilyGameList.java @@ -0,0 +1,17 @@ +package com.chwl.core.family.bean.response; + +import com.chwl.core.family.bean.FamilyGameInfo; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/7/23 + */ +@Data +public class RespFamilyGameList { + private List games; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/RespFamilyRankList.java b/core/src/main/java/com/chwl/core/family/bean/response/RespFamilyRankList.java new file mode 100644 index 0000000..eb7e4e0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/RespFamilyRankList.java @@ -0,0 +1,19 @@ +package com.chwl.core.family.bean.response; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/5 + */ +@Data +public class RespFamilyRankList { + public static final int TYPE_LAST_WEEK = 1; //1:上周排行榜; + public static final int TYPE_THIS_WEEK = 2; // 2:本周排行榜 + + private int count; + private List familys; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/familyPlaza/RespFamily.java b/core/src/main/java/com/chwl/core/family/bean/response/familyPlaza/RespFamily.java new file mode 100644 index 0000000..e5249ae --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/familyPlaza/RespFamily.java @@ -0,0 +1,18 @@ +package com.chwl.core.family.bean.response.familyPlaza; + +import com.chwl.core.family.bean.FamilyInfo; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/5 + */ +@Data +public class RespFamily { + private int count; + private List familys; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/memberList/RespFamilymember.java b/core/src/main/java/com/chwl/core/family/bean/response/memberList/RespFamilymember.java new file mode 100644 index 0000000..45e1e86 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/memberList/RespFamilymember.java @@ -0,0 +1,18 @@ +package com.chwl.core.family.bean.response.memberList; + +import com.chwl.core.family.bean.FamilyMemberInfo; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/4 + */ +@Data +public class RespFamilymember { + private int count;//成员总数 + private List members; +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/FamilyMoneyManagementInfo.java b/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/FamilyMoneyManagementInfo.java new file mode 100644 index 0000000..4795ec3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/FamilyMoneyManagementInfo.java @@ -0,0 +1,26 @@ +package com.chwl.core.family.bean.response.moneyManagement; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/4 + */ +@Data +public class FamilyMoneyManagementInfo { + private IncomeAndCost incomeAndCost; + private double totalAmount;// 家族币的总的金额 + private String moneyName;// 家族币的名称 + private String count;// 家族币变化记录总数 + private int position; + + + + @Data + public static class IncomeAndCost { + private double income; + private double cost; + } + +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/MonthlyRecord.java b/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/MonthlyRecord.java new file mode 100644 index 0000000..b52c5f8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/MonthlyRecord.java @@ -0,0 +1,51 @@ +package com.chwl.core.family.bean.response.moneyManagement; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/4 + */ +@Data +public class MonthlyRecord { + private String moneyName;//代币名称 + private long month;//家族币记录所在的月份 毫秒 每月第一天的毫秒 + private double income;//家族币记录所在月份的总的收入 + private double cost;//家族币记录所在月份的总的消耗 + private List list;// 家族币变化记录 + + @Data + public static class RecordItem{ + + public static final int GROUP_RED_PACKET_INCOME = 1; //群红包收入 + + public static final int CREATE_FAMILY_REWARD = 2; //创建家族奖励 + + public static final int FAMILY_REWARD = 3; //家族奖励 + + public static final int CONTRIBUTE = 4; //贡献 + + public static final int TRANSFER = 5; //转让 + + public static final int GROUP_RED_PACKET_COST= 6; //红包支出 + + public static final int FAMILY_GAME_COST = 7; //家族游戏 + + public static final int FAMILY_DISCOUNT = 8; //系统扣除 + + public static final int RED_PACKET_REJECTION = 9; //红包退回 + + private long uid; + private String nick; + private String avatar; + private String title;//交易的标题内容 + private double amount;//交易金额 会有负数 + private long time;//交易时间 毫秒 + private int type;//类型 + private String source;//来源 + + } +} diff --git a/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/TradeMoneyRecord.java b/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/TradeMoneyRecord.java new file mode 100644 index 0000000..627d5ff --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/bean/response/moneyManagement/TradeMoneyRecord.java @@ -0,0 +1,16 @@ +package com.chwl.core.family.bean.response.moneyManagement; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/4 + */ +@Data +public class TradeMoneyRecord { + private long count; + private List recordMonVos; +} diff --git a/core/src/main/java/com/chwl/core/family/event/FamilyCurrencyUpdateEvent.java b/core/src/main/java/com/chwl/core/family/event/FamilyCurrencyUpdateEvent.java new file mode 100644 index 0000000..936d5e2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/event/FamilyCurrencyUpdateEvent.java @@ -0,0 +1,13 @@ +package com.chwl.core.family.event; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/19 + */ +@Data +public class FamilyCurrencyUpdateEvent { + private double currentMoney; +} diff --git a/core/src/main/java/com/chwl/core/family/event/FamilyMemberUpdateEvent.java b/core/src/main/java/com/chwl/core/family/event/FamilyMemberUpdateEvent.java new file mode 100644 index 0000000..f6e4d77 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/event/FamilyMemberUpdateEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.family.event; + +/** + * @author jack + * @Description + * @Date 2018/6/20 + */ + +public class FamilyMemberUpdateEvent { +} diff --git a/core/src/main/java/com/chwl/core/family/event/FamilyMineEvent.java b/core/src/main/java/com/chwl/core/family/event/FamilyMineEvent.java new file mode 100644 index 0000000..be87faa --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/event/FamilyMineEvent.java @@ -0,0 +1,75 @@ +package com.chwl.core.family.event; + +import lombok.Data; + +/** + * @author jack + * @Description 我的家族事件,加入 或 创建 + * @Date 2018/6/1 + */ +@Data +public class FamilyMineEvent { + + /** + * 创建家族成功 + */ + public static final int FAMILY_CREATED = 1; + + /** + * 加入家族成功 + */ + public static final int FAMILY_JOINED = 2; + + /** + * 退出家族成功 + */ + public static final int FAMILY_QUITED = 3; + + /** + * 被踢出家族成功 + */ + public static final int FAMILY_KICKED = 4; + + /** + * 解散家族成功 + */ + public static final int FAMILY_DISMISSED = 5; + + /** + * 加入群成功 + */ + public static final int FAMILY_GROUP_IN = 6; + + /** + * 退出群成功 + */ + public static final int FAMILY_GROUP_OUT = 7; + + /** + * 加入家族并且加入群成功 + */ + public static final int FAMILY_AND_GROUP_ALL_IN = 8; + + /**系统奖励家族币*/ + public static final int FAMILY_CURRENCY_SYSTEM_AWARD = 9; + /**系统扣除家族币*/ + public static final int FAMILY_CURRENCY_SYSTEM_DISCOUNT = 10; + /**交易家族币*/ + public static final int FAMILY_CURRENCY_TRADE = 11; + /**贡献家族币*/ + public static final int FAMILY_CURRENCY_DONATE = 12; + + + private String familyId; + private int type; + + public FamilyMineEvent setFamilyId(String familyId) { + this.familyId = familyId; + return this; + } + + public FamilyMineEvent setType(int type) { + this.type = type; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/family/event/FamilyUpdateEvent.java b/core/src/main/java/com/chwl/core/family/event/FamilyUpdateEvent.java new file mode 100644 index 0000000..9e5afaf --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/event/FamilyUpdateEvent.java @@ -0,0 +1,23 @@ +package com.chwl.core.family.event; + +import com.chwl.core.family.bean.FamilyInfo; + +import lombok.Data; + +/** + * @author jack + * @Description 家住更新事件 + * @Date 2018/6/1 + */ +@Data +public class FamilyUpdateEvent { + public final static int TYPE_UPDATE = 1;//数据更新 + public final static int TYPE_EXIT = 2;//退出家族 + public final static int TYPE_DISBAND = 3;//解散家族 + private int type = -1; + private FamilyInfo familyInfo; + + public FamilyUpdateEvent(FamilyInfo familyInfo) { + this.familyInfo = familyInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/family/model/FamilyModel.java b/core/src/main/java/com/chwl/core/family/model/FamilyModel.java new file mode 100644 index 0000000..c60cd3c --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/model/FamilyModel.java @@ -0,0 +1,1222 @@ +package com.chwl.core.family.model; + +import android.annotation.SuppressLint; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.chwl.core.Constants; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.auth.event.LoginEvent; +import com.chwl.core.auth.event.LogoutEvent; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.family.bean.FamilyCustomServiceInfo; +import com.chwl.core.family.bean.FamilyGameInfo; +import com.chwl.core.family.bean.FamilyInfo; +import com.chwl.core.family.bean.FamilyPlazaInfo; +import com.chwl.core.family.bean.FindBannerInfo; +import com.chwl.core.family.bean.response.RespFamilyGameList; +import com.chwl.core.family.bean.response.RespFamilyRankList; +import com.chwl.core.family.bean.response.familyPlaza.RespFamily; +import com.chwl.core.family.bean.response.memberList.RespFamilymember; +import com.chwl.core.family.bean.response.moneyManagement.FamilyMoneyManagementInfo; +import com.chwl.core.family.bean.response.moneyManagement.TradeMoneyRecord; +import com.chwl.core.family.event.FamilyCurrencyUpdateEvent; +import com.chwl.core.family.event.FamilyMineEvent; +import com.chwl.core.family.event.FamilyUpdateEvent; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.rxbus.RxBusHelper; +import com.chwl.library.utils.ResUtil; +import com.orhanobut.logger.Logger; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.functions.BiConsumer; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * @author jack + * @Description + * @Date 2018/5/24 + */ + +public class FamilyModel extends BaseModel implements IFamilyModel { + + + private FamilyInfo myFamily;//自己的家族信息 + private FamilyCustomServiceInfo customServiceInfo;//家族客服信息 + + + private CompositeDisposable mCompositeDisposable; + private Api api = RxNet.create(Api.class); + + private static class SingletonHolder { + private static FamilyModel instance = new FamilyModel(); + } + + @Override + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static IFamilyModel Instance() { + return SingletonHolder.instance; + } + + private FamilyModel(){ + EventBus.getDefault().register(this); +// registerFamilyEvent(); + } + + /** + * 获取我的家族 + * @return + */ + @Override + @Nullable + public FamilyInfo getMyFamily() { + return this.myFamily; + } + + + private void setMyFamily(FamilyInfo myFamily) { + this.myFamily = myFamily; + //这里发出我的家族更新事件 + RxBusHelper.post(new FamilyUpdateEvent(this.myFamily)); + } + + private void sameAsMyFamily(FamilyInfo otherFamily) { + if (otherFamily == null) return; + if ((myFamily != null && myFamily.getFamilyId().equals(otherFamily.getFamilyId())) + || (otherFamily.getEnterStatus() == FamilyInfo.STATUS_IN_FAMILY)){ + this.myFamily = otherFamily; + } + + } + + /** + * 获取家族客服信息 + * @return + */ + @Override + @Nullable + public FamilyCustomServiceInfo getCustomServiceInfo() { + return this.customServiceInfo; + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoginEvent(LoginEvent event) { + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogoutEvent(LogoutEvent event) { + Logger.i("FamilyModel", ResUtil.getString(R.string.family_model_familymodel_02)); + setMyFamily(null); + } + + + /** + * 注册家族所需要监听的事件 + */ + private void registerFamilyEvent() { + mCompositeDisposable = new CompositeDisposable(); + /** + * 家族加入,或者通过后台创建 + */ + RxBusHelper.doOnMainThread(FamilyMineEvent.class, mCompositeDisposable, new Consumer() { + @Override + public void accept(FamilyMineEvent familyMineEvent) throws Exception { +// syncMyFamilyFromServer().subscribe(); + //家族币交易 发送家族币更新事件,刷新家族币界面 + if (familyMineEvent.getType() == FamilyMineEvent.FAMILY_CURRENCY_TRADE + || familyMineEvent.getType() == FamilyMineEvent.FAMILY_CURRENCY_DONATE + || familyMineEvent.getType() == FamilyMineEvent.FAMILY_CURRENCY_SYSTEM_AWARD + || familyMineEvent.getType() == FamilyMineEvent.FAMILY_CURRENCY_SYSTEM_DISCOUNT){ + RxBusHelper.post(new FamilyCurrencyUpdateEvent()); + } + } + }); + } + + /** + * 从服务器更新我的家族信息 + * @return + */ + @Override + public Single syncMyFamilyFromServer(){ + final long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0) { + return Single.just(ResUtil.getString(R.string.family_model_familymodel_03)); + } + return api.loadFamilyIdByUid( + String.valueOf(uid) + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + FamilyInfo familyInfo = response.getData(); + if (familyInfo == null){ + return Single.just(new FamilyInfo()); + } + return loadFamilyHomeInfo(familyInfo.getFamilyId()); + }else { + return Single.error(new Throwable(response.getMessage())); + } + } + }) + .flatMap(new Function>() { + @Override + public SingleSource apply(FamilyInfo familyInfo) throws Exception { + if (familyInfo.getFamilyId() != null){ + setMyFamily(familyInfo); + }else { + setMyFamily(null); + } + return Single.just(ResUtil.getString(R.string.family_model_familymodel_04)); + } + }); + } + + + /** + * 获取家族客服信息 + * @return + */ + @Override + public Single loadFamilyCustomServiceInfo() { + if (null != customServiceInfo){ + return Single.just(customServiceInfo); + }else{ + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_05))); + } + + return api.loadFamilyCustomServiceInfo( + String.valueOf(uid) + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + FamilyModel.this.customServiceInfo = response.getData(); + return Single.just(customServiceInfo); + }else { + return Single.error(new Throwable(response.getMessage())); + } + } + }); + } + } + + + + /** + * 更新一下家族家族币的数量 + * @return + */ + @Override + public Single refreshFamilyCurrencyAmount(){ + return loadFamilyBillSummary() + .flatMap(new Function>() { + @Override + public SingleSource apply(FamilyMoneyManagementInfo response) throws Exception { + if (myFamily != null) { + return Single.just(myFamily); + }else { + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_06))); + } + } + }); + } + + + + /** + * 退出家族 + * @return + */ + @Override + public Single exitFamily() { + if (null == myFamily){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_07))); + } + final long uid = AuthModel.get().getCurrentUid(); + if (uid == 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_08))); + } + return api.exitFamily( + myFamily.getFamilyId(), + String.valueOf(uid) + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @SuppressLint("CheckResult") + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + setMyFamily(null); + //更新用户信息 + UserModel.get().getUserInfo(uid) + .subscribe(new BiConsumer() { + @Override + public void accept(UserInfo userInfo, Throwable throwable) throws Exception { + if (throwable != null){ + Logger.e(ResUtil.getString(R.string.family_model_familymodel_09)); + return; + } + userInfo.setFamilyId(FamilyInfo.NO_FAMILY_ID); + } + }); + + return Single.just(ResUtil.getString(R.string.family_model_familymodel_010)); + }else{ + return Single.error(new Throwable(response.getMessage())); + } + + } + }); + + } + + + /** + * 获取家族广场数据 + * @return + */ + @Override + public Single loadFamilyPlaza() { + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_011))); + } + return api.loadFamilyPlaza( + String.valueOf(uid) + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + + } + + + /** + * 获取家族Banner数据 + * + * @return + */ + @Override + public Single> loadFamilyBanner() { + return api.loadFamilyBanner() + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + + } + + + /** + * 搜索家族 + * @param key + * @param page + * @return + */ + @Override + public Single searchFamilyInfos(String key, int page) { + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_012))); + } + return api.searchFamilyInfos( + String.valueOf(uid), + key, + String.valueOf(page), + String.valueOf(Constants.PAGE_SIZE) + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult respFamilyServiceResult) throws Exception { + if (respFamilyServiceResult.isSuccess()){ + return Single.just(respFamilyServiceResult.getData()); + }else { + return Single.error(new Throwable(respFamilyServiceResult.getMessage())); + } + + } + }) + .compose(new Transformer<>()); + } + + /** + * 获取家族列表 + * @param page + * @return + */ + @Override + public Single loadFamilyInfoList(int page) { + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_013))); + } + + return api.loadFamilyInfoList( + String.valueOf(uid), + String.valueOf(page), + String.valueOf(Constants.PAGE_SIZE) + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + } + + /** + * 根据家族id 获取家族 + * @param familyId + * @return + */ + @Override + public Single loadFamilyHomeInfo(String familyId) { + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Exception(ResUtil.getString(R.string.family_model_familymodel_014))); + } + return api.loadFamilyHomeInfo( + familyId, + String.valueOf(uid) + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + sameAsMyFamily(response.getData()); + return Single.just(response.getData()); + }else { + return Single.error(new Exception(response.getMessage())); + } + } + }); + + } + + /** + * 加入家族 + * @param familyId + * @param content + * @return + */ + @Override + public Single applyJoinFamily(String familyId, String content){ + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Exception(ResUtil.getString(R.string.family_model_familymodel_015))); + } + return api.applyJoinFamily( + familyId, + String.valueOf(uid), + content + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + return Single.just(response.getMessage()); + }else { + return Single.error(new Exception(response.getMessage())); + } + } + }); + } + + /** + * 踢出家族 + * @param targetUid + * @return + */ + @Override + public Single kickOutFamily(String targetUid) { + Long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_016))); + } + return api.kickOutFamily( + String.valueOf(uid), + targetUid + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.family_model_familymodel_017)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(new Transformer<>()); + } + + /** + * 修改家族信息 + * + * @param familyId + * @param familyName + * @param inputfile + * @param verifyType '1验证 0不需要 + * @return + */ + @Override + public Single modifyFamilyInfo( + String familyId, + String familyName, + String inputfile, + String verifyType){ + + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_018))); + } + return api.modifyFamilyInfo( + String.valueOf(uid), + familyId, + familyName, + inputfile, + verifyType + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + if (!TextUtils.isEmpty(verifyType)){ + myFamily.setVerifyType(response.getData().getVerifyType()); + } + if (!TextUtils.isEmpty(familyName)){ + myFamily.setFamilyName(response.getData().getFamilyName()); + } + if (!TextUtils.isEmpty(inputfile)){ + myFamily.setFamilyIcon(response.getData().getFamilyIcon()); + } + setMyFamily(myFamily); + return Single.just(ResUtil.getString(R.string.family_model_familymodel_019)); + }else{ + return Single.error(new Throwable(response.getMessage())); + } + } + }); + } + + /** + * 家族币管理页面 上面的卡片信息 + * + * @return + */ + @Override + public Single loadFamilyBillSummary() { + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_020))); + } + return api.loadFamilyBillSummary( + String.valueOf(uid) + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + FamilyMoneyManagementInfo familyMoneyManagementInfo = response.getData(); + if (myFamily != null) { + myFamily.setFamilyMoney(familyMoneyManagementInfo.getTotalAmount()); + setMyFamily(myFamily); + } + return Single.just(familyMoneyManagementInfo); + }else { + return Single.error(new Throwable(response.getMessage())); + } + } + }); + } + + + /** + * 获取家族成员列表 + * @param familyId + * @param page + * @param pageSize + * @return + */ + @Override + public Single loadFamilyMemberList(String familyId, + String page, + String pageSize){ + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_021))); + } + + return api.loadFamilyMemberList( + String.valueOf(uid), + familyId, + page, + pageSize + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + + } + + /** + * 搜索家族成员列表 + * @param familyId + * @param page + * @param pageSize + * @param searchKey + * @return + */ + @Override + public Single searchFamilyMemberList(String familyId, + String page, + String pageSize, + String searchKey){ + + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_022))); + } + + return api.searchFamilyMemberList( + String.valueOf(uid), + familyId, + page, + pageSize, + searchKey + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + } + + + + /** + * 用户主动加入群聊接口 + * @param chatId + * @param message + * @return + */ + @Override + public Single joinFamilyGroup(String chatId, + String message) { + + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Exception(ResUtil.getString(R.string.family_model_familymodel_023))); + } + return api.joinFamilyGroup( + chatId, + String.valueOf(uid), + message + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.family_model_familymodel_024)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(new Transformer<>()); + } + + + /** + * 转让家族币 + * @param targetId + * @param amount + * @return + */ + @Override + public Single transferCurrency(String targetId, + double amount) { + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Exception(ResUtil.getString(R.string.family_model_familymodel_025))); + } + return api.transferCurrency( + String.valueOf(uid), + targetId, + amount + ) + + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + RxBusHelper.post(new FamilyCurrencyUpdateEvent()); + return Single.just(stringServiceResult.getMessage()); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }); + } + + /** + * 贡献家族币 + * @param amount + * @return + */ + @Override + public Single contributeCurrency(double amount) { + + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_026))); + } + return api.contributeCurrency( + String.valueOf(uid), + amount + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + RxBusHelper.post(new FamilyCurrencyUpdateEvent()); + return Single.just(ResUtil.getString(R.string.family_model_familymodel_027)); + }else { + return Single.error(new Throwable(response.getMessage())); + } + + } + }); + } + + + /** + * 获取没有加入某个群组的成员列表 + * + * @param tid 云信群组 ID + * @param key 查询关键字 + * @param page 页码 + * @param pageSize 页大小 + * @return + */ + @Override + public Single getNotInTeamMember(String tid, + String key, + int page, + int pageSize){ + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_028))); + } + return api.getNotInTeamMember( + String.valueOf(uid), + tid, + key, + page, + pageSize + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + + } + + + /** + * 邀请他人加入家族 + * + * @param targetId 邀请加入家族的目标的uid + * @return + */ + @Override + public Single inviteIntoFamily(String targetId){ + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Exception(ResUtil.getString(R.string.family_model_familymodel_029))); + } + return api.inviteIntoFamily( + String.valueOf(uid), + targetId + ) + .compose(new Transformer<>()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + return Single.just(response.getMessage()); + }else { + return Single.error(new Throwable(response.getMessage())); + } + } + }); + + } + + + /** + * 同意或拒绝家族邀请 + * @param uid 用户uid + * @param inviteId 邀请人的id + * @param type 1:同意,2:拒绝 + * @return + */ + public Single> inviteIntoFamilyAccept(String uid, + String inviteId, + int type){ + + return api.inviteIntoFamilyAccept( + uid, + inviteId, + type + ) + .compose(new Transformer<>()); + + } + + + /** + * 获取简单家族信息接口 + * + * @param familyId 家族id + * @return + */ + @Override + public Single loadFamilySimpleInfo(String familyId){ + return api.loadFamilySimpleInfo( + familyId + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 根据用户的uid 获取家族id + * @param uid + * @return + */ + private Single loadFamilyIdByUid(String uid){ + return api.loadFamilyIdByUid( + uid + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + } + + /** + * 获取家族游戏列表 + * @param familyId + * @param page + * @param pageSize + * @return + */ + @Override + public Single> loadFamilyGameList(String familyId, + int page, + int pageSize){ + long uid = AuthModel.get().getCurrentUid(); + if (uid <= 0){ + return Single.error(new Throwable(ResUtil.getString(R.string.family_model_familymodel_030))); + } + + return api.loadFamilyGameList( + String.valueOf(uid), + familyId, + page, + pageSize + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()) + .flatMap(new Function>>() { + @Override + public SingleSource> apply(RespFamilyGameList response) throws Exception { + return Single.just(response.getGames()); + } + }); + } + + + /** + * 某个家族成员家族币交易记录 + * @param uid + * @param page + * @param pageSize + * @param time + * @return + */ + @Override + public Single loadFamilyMemberBillRecordList(String uid, + String page, + String pageSize, + String time){ //如果是选取月后下拉的要加选取的月的任意时间 毫秒 + return api.loadFamilyMemberBillRecordList( + uid, + page, + pageSize, + time + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + } + + /** + * 家族排行榜 + * @param type 1:上周排行榜;2:本周排行榜 + * @param page + * @param pageSize + * @return + */ + @Override + public Single loadFamilyRankingList(int type, + String page, + String pageSize){ + return api.loadFamilyRankingList( + type, + page, + pageSize + ) + .compose(RxHelper.handleBeanData()) + .compose(new Transformer<>()); + } + + + + /*********************************************************************************************************************************************************/ + + private interface Api { + + /** + * 获取家族广场数据 + * + * @param uid + * @return + */ + @GET("/family/square") + Single> loadFamilyPlaza(@Query("uid") String uid); + + + /** + * 获取家族Banner数据 + * + * @return + */ + @GET("/family/v3/banner") + Single>> loadFamilyBanner(); + + + /** + * 获取家族客服信息 + * + * @param uid + * @return + */ + @GET("/family/customservice") + Single> loadFamilyCustomServiceInfo(@Query("uid") String uid); + + + /** + * 搜索家族 + * + * @param uid + * @param key + * @param page + * @param pageSize + * @return + */ + @GET("/family/family/search") + Single> searchFamilyInfos(@Query("uid") String uid, + @Query("key") String key, + @Query("page") String page, + @Query("pageSize") String pageSize); + + /** + * 家族列表 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("/family/list") + Single> loadFamilyInfoList(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + + /** + * 根据用户的uid 获取家族id + * @param uid + * @return + */ + @GET("/family/userFamily") + Single> loadFamilyIdByUid(@Query("uid") String uid); + + /** + * 家族主页 + * + * @param familyId + * @param uid + * @return + */ + @GET("/family/detail") + Single> loadFamilyHomeInfo(@Query("familyId") String familyId, + @Query("uid") String uid); + + + /** + * 简单家族信息接口 + * @param familyId + * @return + */ + @GET("/family/familyInfo") + Single> loadFamilySimpleInfo(@Query("familyId") String familyId); + + /** + * 申请加入家族 + * + * @param familyId + * @param uid + * @return + */ + @FormUrlEncoded + @POST("/family/apply") + Single> applyJoinFamily(@Field("familyId") String familyId, + @Field("uid") String uid, + @Field("content") String content); + + + /** + * 退出家族 + * + * @param familyId + * @param uid + * @return + */ + @POST("family/quit") + Single> exitFamily(@Query("familyId") String familyId, + @Query("uid") String uid); + + /** + * 踢出家族 + * + * @param uid + * @param targetId + * @return + */ + @POST("/family/kick") + Single> kickOutFamily(@Query("uid") String uid, + @Query("targetId") String targetId); + + + /** + * 修改家族信息 + * + * @param familyId + * @param uid + * @param familyName + * @param inputfile + * @param verifyType '1验证 0不需要 + * @return + */ + @POST("/family/modify") + Single> modifyFamilyInfo(@Query("uid") String uid, + @Query("familyId") String familyId, + @Query("familyName") String familyName, + @Query("inputfile") String inputfile, + @Query("verifyType") String verifyType); + + + /** + * 家族币管理页面 + * + * @param uid + * @return + */ + @GET("/family/money/summary") + Single> loadFamilyBillSummary(@Query("targetUid") String uid); + + +// /** +// * 家族币交易记录 +// * +// * @param uid +// * @return +// */ +// @GET("/family/money/record") +// Single> loadFamilyBillRecordList(@Query("uid") String uid, +// @Query("page") String page, +// @Query("pageSize") String pageSize, +// @Query("time") String time);//如果是选取月后下拉的要加选取的月的任意时间 毫秒 + + /** + * 某个家族成员家族币交易记录 + * + * @param uid + * @return + */ + @GET("/family/member/money/record") + Single> loadFamilyMemberBillRecordList(@Query("targetUid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize, + @Query("time") String time);//如果是选取月后下拉的要加选取的月的任意时间 毫秒 + /** + * 家族成员列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("/family/allFamilymembers") + Single> loadFamilyMemberList(@Query("uid") String uid, + @Query("familyId") String familyId, + @Query("page") String page, + @Query("pageSize") String pageSize); + + + /** + * 搜索家族成员列表 + * @param uid + * @param page + * @param pageSize + * @param key + * @return + */ + @GET("/family/familymember") + Single> searchFamilyMemberList(@Query("uid") String uid, + @Query("familyId") String familyId, + @Query("page") String page, + @Query("pageSize") String pageSize, + @Query("key") String key);////搜索key + + /** + * 用户主动加入群聊接口 + * @param chatId + * @param uid + * @param message + * @return + */ + @POST("/family/group/member/join") + Single> joinFamilyGroup(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("message") String message); + + + /** + * 转让家族币 + * + * @param uid + * @param targetId + * @param amount + * @return + */ + @POST("/family/money/trade") + Single> transferCurrency(@Query("uid") String uid, + @Query("targetUid") String targetId, + @Query("amount") double amount + ); + + + /** + * 贡献家族币 + * + * @param uid + * @param amount + * @return + */ + @POST("/family/money/donate") + Single> contributeCurrency(@Query("uid") String uid, + @Query("amount") double amount + ); + + /** + * 获取没有加入某个群组的成员列表 + * + * @param uid 用户 UID + * @param tid 云信群组 ID + * @param key 查询关键字 + * @param page 页码 + * @param pageSize 页大小 + * @return + */ + @GET("/family/disJoin") + Single> getNotInTeamMember(@Query("uid") String uid, + @Query("tid") String tid, + @Query("key") String key, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 邀请他人加入家族 + * @param uid 用户uid + * @param targetId 邀请加入家族的目标的uid + * @return + */ + @POST("/family/invite") + Single> inviteIntoFamily(@Query("uid") String uid, + @Query("targetId") String targetId); + + /** + * + * @param uid 用户uid + * @param inviteId 邀请人的id + * @param type 1:同意,2:拒绝 + * @return + */ + @POST("/family/invitation/accept") + Single> inviteIntoFamilyAccept(@Query("uid") String uid, + @Query("inviteId") String inviteId, + @Query("type") int type); + + + /** + * 获取家族游戏列表 + * @param uid + * @param familyId + * @return + */ + @GET("/family/game/list") + Single> loadFamilyGameList(@Query("uid") String uid, + @Query("familyId") String familyId, + @Query("page") int page, + @Query("pageSize") int pageSize); + + + + /** + * 家族排行榜 + * + * @param type + * @param page + * @param pageSize + * @return + */ + @GET("/family/charm/rank") + Single> loadFamilyRankingList(@Query("type") int type, + @Query("page") String page, + @Query("pageSize") String pageSize); + } +} diff --git a/core/src/main/java/com/chwl/core/family/model/IFamilyModel.java b/core/src/main/java/com/chwl/core/family/model/IFamilyModel.java new file mode 100644 index 0000000..4946a35 --- /dev/null +++ b/core/src/main/java/com/chwl/core/family/model/IFamilyModel.java @@ -0,0 +1,245 @@ +package com.chwl.core.family.model; + +import androidx.annotation.Nullable; + +import com.chwl.core.base.IModel; +import com.chwl.core.family.bean.FamilyCustomServiceInfo; +import com.chwl.core.family.bean.FamilyGameInfo; +import com.chwl.core.family.bean.FamilyInfo; +import com.chwl.core.family.bean.FamilyPlazaInfo; +import com.chwl.core.family.bean.FindBannerInfo; +import com.chwl.core.family.bean.response.RespFamilyRankList; +import com.chwl.core.family.bean.response.familyPlaza.RespFamily; +import com.chwl.core.family.bean.response.memberList.RespFamilymember; +import com.chwl.core.family.bean.response.moneyManagement.FamilyMoneyManagementInfo; +import com.chwl.core.family.bean.response.moneyManagement.TradeMoneyRecord; + +import java.util.List; + +import io.reactivex.Single; + +public interface IFamilyModel extends IModel { + /** + * 获取我的家族 + * @return + */ + @Nullable + FamilyInfo getMyFamily(); + + /** + * 获取家族客服信息 + * @return + */ + @Nullable + FamilyCustomServiceInfo getCustomServiceInfo(); + + /** + * 从服务器同步家族信息 + */ + Single syncMyFamilyFromServer(); + + /** + * 获取家族客服信息 + * @return + */ + Single loadFamilyCustomServiceInfo(); + + /** + * 更新一下家族家族币的数量 + * @return + */ + Single refreshFamilyCurrencyAmount(); + + /** + * 退出家族 + * @return + */ + Single exitFamily(); + + /** + * 获取家族广场数据 + * @return + */ + Single loadFamilyPlaza(); + + /** + * 获取家族Banner数据 + * + * @return + */ + Single> loadFamilyBanner(); + + /** + * 搜索家族 + * @param key + * @param page + * @return + */ + Single searchFamilyInfos(String key, int page); + + /** + * 获取家族列表 + * @param page + * @return + */ + Single loadFamilyInfoList(int page); + + /** + * 根据家族id 获取家族 + * @param familyId + * @return + */ + Single loadFamilyHomeInfo(String familyId); + + /** + * 加入家族 + * @param familyId + * @param content + * @return + */ + Single applyJoinFamily(String familyId, String content); + + /** + * 踢出家族 + * @param targetUid + * @return + */ + Single kickOutFamily(String targetUid); + + /** + * 修改家族信息 + * + * @param familyId + * @param familyName + * @param inputfile 家族头像 + * @param verifyType '1验证 0不需要 + * @return + */ + Single modifyFamilyInfo(String familyId, + String familyName, + String inputfile, + String verifyType); + + /** + * 家族币管理页面 上面的卡片信息 + * + * @return + */ + Single loadFamilyBillSummary(); + + /** + * 获取家族成员列表 + * @param familyId + * @param page + * @param pageSize + * @return + */ + Single loadFamilyMemberList(String familyId, + String page, + String pageSize); + + /** + * 搜索家族成员列表 + * @param familyId + * @param page + * @param pageSize + * @param searchKey + * @return + */ + Single searchFamilyMemberList(String familyId, + String page, + String pageSize, + String searchKey); + + /** + * 用户主动加入群聊接口 + * @param chatId + * @param message + * @return + */ + Single joinFamilyGroup(String chatId, + String message); + + /** + * 转让家族币 + * @param targetId + * @param amount + * @return + */ + Single transferCurrency(String targetId, + double amount); + + /** + * 贡献家族币 + * @param amount + * @return + */ + Single contributeCurrency(double amount); + + /** + * 获取没有加入某个群组的成员列表 + * + * @param tid 云信群组 ID + * @param key 查询关键字 + * @param page 页码 + * @param pageSize 页大小 + * @return + */ + Single getNotInTeamMember(String tid, + String key, + int page, + int pageSize); + + /** + * 邀请他人加入家族 + * + * @param targetId 邀请加入家族的目标的uid + * @return + */ + Single inviteIntoFamily(String targetId); + + /** + * 获取简单家族信息接口 + * + * @param familyId 家族id + * @return + */ + Single loadFamilySimpleInfo(String familyId); + + /** + * 获取家族游戏列表 + * @param familyId + * @param page + * @param pageSize + * @return + */ + Single> loadFamilyGameList(String familyId, + int page, + int pageSize); + + /** + * 某个家族成员家族币交易记录 + * @param uid + * @param page + * @param pageSize + * @param time + * @return + */ + Single loadFamilyMemberBillRecordList(String uid, + String page, + String pageSize, + String time); + + /** + * 家族排行榜 + * @param type 1:上周排行榜;2:本周排行榜 + * @param page + * @param pageSize + * @return + */ + Single loadFamilyRankingList(int type, + String page, + String pageSize); + + void refreshApi(); +} diff --git a/core/src/main/java/com/chwl/core/fansteam/FansTeamModel.kt b/core/src/main/java/com/chwl/core/fansteam/FansTeamModel.kt new file mode 100644 index 0000000..80fb6a2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/FansTeamModel.kt @@ -0,0 +1,90 @@ +package com.chwl.core.fansteam + +import com.chwl.core.fansteam.bean.FansTeamInfo +import com.chwl.core.fansteam.bean.FansTeamInitInfo +import com.chwl.core.fansteam.bean.FansTeamJoinInfo +import com.chwl.core.fansteam.bean.FansTeamJoinedInfo +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.GET +import retrofit2.http.Query + +object FansTeamModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + suspend fun getFansTeamJoinInfo(): FansTeamJoinInfo? = + launchRequest { + api.getFansTeamJoinInfo(AvRoomDataManager.get().roomUid) + } + + suspend fun getFansTeamTaskInfo(): FansTeamJoinedInfo? = + launchRequest { + api.getFansTeamTaskInfo(AvRoomDataManager.get().roomUid) + } + + suspend fun getFansTeamInitInfo(): FansTeamInitInfo? = + launchRequest { + api.getFansTeamInitInfo(AvRoomDataManager.get().roomUid) + } + + suspend fun outFansTeam(): String? = + launchRequest { + api.outFansTeam(AvRoomDataManager.get().roomUid) + } + + suspend fun getJoinFansTeamList(pageNum: Int, pageSize: Int): List? = + launchRequest { + api.getJoinFansTeamList(pageNum, pageSize) + } + + private interface Api { + + /** + * 加入粉丝团 --弹窗内容 + * + * @return + */ + @GET("anchorFansTeam/applyFansTeamPopInfoVo") + suspend fun getFansTeamJoinInfo(@Query("teamUid") roomUid: Long): ServiceResult + + /** + * 粉丝团任务列表 + * + * @return + */ + @GET("anchorFansTeam/getFansTaskInfo") + suspend fun getFansTeamTaskInfo(@Query("teamUid") roomUid: Long): ServiceResult + + /** + * 进房初始化当前用户与房间粉丝团关系 + * + * @return + */ + @GET("/anchorFansTeam/initInRoomFansTeam") + suspend fun getFansTeamInitInfo(@Query("teamUid") roomUid: Long): ServiceResult + + /** + * 退出粉丝团 + * + * @return + */ + @GET("/anchorFansTeam/outAnchorFansTeam") + suspend fun outFansTeam(@Query("teamUid") roomUid: Long): ServiceResult + + /** + * 我的粉丝团列表 + * + * @return + */ + @GET("/anchorFansTeam/getJoinFansTeamList") + suspend fun getJoinFansTeamList( + @Query("page") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInfo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInfo.kt new file mode 100644 index 0000000..2a1ac3d --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.fansteam.bean + +import androidx.annotation.Keep + +@Keep +data class FansTeamInfo( + val anchorAvatar: String = "", + val anchorNick: String = "", + val icon: String = "", + val teamUid: Long = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInitInfo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInitInfo.kt new file mode 100644 index 0000000..531aaf9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamInitInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.fansteam.bean + +import androidx.annotation.Keep + +@Keep +data class FansTeamInitInfo( + val anchorFansNum: Int = 0, + val fansLevelSeq: Int = 0, + val hasFansTeamCurrentRoom: Boolean = false, + val isAnchorFans: Boolean = false, + val isCurrentRoomAnchor: Boolean = false, + val isRedPop: Boolean = false +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinInfo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinInfo.kt new file mode 100644 index 0000000..651f36c --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinInfo.kt @@ -0,0 +1,16 @@ +package com.chwl.core.fansteam.bean + +import androidx.annotation.Keep + +@Keep +data class FansTeamJoinInfo( + val anchorAvatar: String = "", + val anchorNick: String = "", + val avatarList: List = listOf(), + val isJoinLimit: Boolean = false, + val privilegeConfigVos: List = listOf(), + val teamId: Int = 0, + val teamNum: Int = 0, + val teamUid: Int = 0, + val taskVos: List? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinedInfo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinedInfo.kt new file mode 100644 index 0000000..99e7b35 --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamJoinedInfo.kt @@ -0,0 +1,18 @@ +package com.chwl.core.fansteam.bean + +import androidx.annotation.Keep + +@Keep +data class FansTeamJoinedInfo( + val anchorAvatar: String = "", + val anchorNick: String = "", + val avatarList: List = listOf(), + val levelExper: Int = 0, + val levelSeq: Int = 0, + val memberAvatar: String = "", + val memberUid: Int = 0, + val nextLevelExper: Int = 0, + val taskVos: List = listOf(), + val teamNum: Int = 0, + val teamUid: Int = 0 +) diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamMsgInfo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamMsgInfo.kt new file mode 100644 index 0000000..73d76df --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamMsgInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.fansteam.bean + +import com.chwl.core.gift.bean.GiftInfo + +data class FansTeamMsgInfo( + val uid: Long = 0, + val nickname: String = "", + val count: Int = 0, + val giftVo: GiftInfo? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamTaskInfo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamTaskInfo.kt new file mode 100644 index 0000000..8c95a36 --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/FansTeamTaskInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.fansteam.bean + +import androidx.annotation.Keep + +@Keep +data class FansTeamTaskInfo( + val awardVal: Int = 0, + val icon: String = "", + val taskId: String = "", + val isFinished: Boolean = false, + val taskCode: String = "", + val taskDesc: String = "", + val taskName: String = "", + val totalNum: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/fansteam/bean/PrivilegeConfigVo.kt b/core/src/main/java/com/chwl/core/fansteam/bean/PrivilegeConfigVo.kt new file mode 100644 index 0000000..c2ed67d --- /dev/null +++ b/core/src/main/java/com/chwl/core/fansteam/bean/PrivilegeConfigVo.kt @@ -0,0 +1,18 @@ +package com.chwl.core.fansteam.bean + +import androidx.annotation.Keep +import com.chwl.core.gift.bean.GiftInfo +@Keep +data class PrivilegeConfigVo( + val createTime: String = "", + val description: String = "", + val icon: String = "", + val isShow: Int = 0, + val name: String = "", + val normalId: Int = 0, + val privilegeId: Int = 0, + val seq: Int = 0, + val status: Int = 0, + val type: Int = 0,//特权类型 1铭牌 2专属礼物 3入团礼物 + val giftVo: GiftInfo? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/file/FileModel.java b/core/src/main/java/com/chwl/core/file/FileModel.java new file mode 100644 index 0000000..aebebe8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/file/FileModel.java @@ -0,0 +1,78 @@ +package com.chwl.core.file; + +import android.text.TextUtils; + +import com.chwl.core.file.cos.CosClient; +import com.chwl.core.file.cos.CosToken; +import com.chwl.core.utils.net.RxHelper; +import com.example.lib_utils.AppUtils; +import com.example.lib_utils.PathUtils; +import com.chwl.core.R; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.exception.ErrorThrowable; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.io.File; +import java.util.UUID; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import retrofit2.http.GET; + +public class FileModel extends BaseModel implements IFileModel { + + private static final class Helper { + public static FileModel INSTANCE = new FileModel(); + } + + private FileModel() { + } + + public static FileModel get() { + return Helper.INSTANCE; + } + + private final Api api = RxNet.create(Api.class); + private CosToken cosToken; + + private Single getCosToken() { + if (cosToken != null && cosToken.isValid()) { + return Single.just(cosToken); + } else { + return api.getCosToken().compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()).map(cosToken -> { + FileModel.get().cosToken = cosToken; + return cosToken; + }); + } + } + + + @Override + public Single uploadFile(String path) { + File file; + if (TextUtils.isEmpty(path) || !((file = new File(path)).exists())) { + return Single.error(new ErrorThrowable(path + ResUtil.getString(R.string.xchat_android_core_file_filemodel_01))); + } + File finalFile = file; + String outName = UUID.randomUUID().toString() + PathUtils.INSTANCE.getSuffixType(finalFile.getName()); + return getCosToken().flatMap(token -> CosClient.INSTANCE.upload(AppUtils.getApp(), finalFile, outName, token).map(cosXmlResult -> cosXmlResult.accessUrl)) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single downloadFile(String url) { + return null; + } + + interface Api { + + /** + * @return + */ + @GET("/tencent/cos/getToken") + Single> getCosToken(); + } +} diff --git a/core/src/main/java/com/chwl/core/file/IFileModel.java b/core/src/main/java/com/chwl/core/file/IFileModel.java new file mode 100644 index 0000000..b663431 --- /dev/null +++ b/core/src/main/java/com/chwl/core/file/IFileModel.java @@ -0,0 +1,25 @@ +package com.chwl.core.file; + +import com.chwl.core.base.IModel; +import com.chwl.core.community.bean.DynamicMedia; + +import io.reactivex.Single; + +public interface IFileModel extends IModel { + + /** + * 上传文件 + * + * @param path 文件路径 + * @return + */ + Single uploadFile(String path); + + /** + * 下载文件 + * + * @param url 文件地址 + * @return + */ + Single downloadFile(String url); +} diff --git a/core/src/main/java/com/chwl/core/file/cos/CosClient.kt b/core/src/main/java/com/chwl/core/file/cos/CosClient.kt new file mode 100644 index 0000000..d577372 --- /dev/null +++ b/core/src/main/java/com/chwl/core/file/cos/CosClient.kt @@ -0,0 +1,129 @@ +package com.chwl.core.file.cos + +import android.content.Context +import android.net.Uri +import android.util.Log +import com.chwl.library.common.application.Env +import com.tencent.cos.xml.CosXmlService +import com.tencent.cos.xml.CosXmlServiceConfig +import com.tencent.cos.xml.exception.CosXmlClientException +import com.tencent.cos.xml.exception.CosXmlServiceException +import com.tencent.cos.xml.listener.CosXmlResultListener +import com.tencent.cos.xml.model.CosXmlRequest +import com.tencent.cos.xml.model.CosXmlResult +import com.tencent.cos.xml.transfer.COSXMLUploadTask +import com.tencent.cos.xml.transfer.TransferConfig +import com.tencent.cos.xml.transfer.TransferManager +import io.reactivex.Single +import java.io.File + + + +object CosClient { + private var cosXmlClient: CosXmlService? = null + private var credentialProvider: CosCredentialProvider? = null + + private fun getCosXmlClient(context: Context, token: CosToken): CosXmlService { + var client = this.cosXmlClient + if (client != null && credentialProvider != null) { + credentialProvider?.updateCredentials(token.toCredential()) + return client + } + // 创建 CosXmlServiceConfig 对象,根据需要修改默认的配置参数 + val serviceConfig: CosXmlServiceConfig = CosXmlServiceConfig.Builder() + .setRegion(token.region) + .isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求 + .setAccelerate(token.accelerate ?: false) + .builder() + + val credentials = token.toCredential() + credentialProvider = CosCredentialProvider(credentials) + // 初始化 COS Service,获取实例 + client = CosXmlService( + context, + serviceConfig, credentialProvider + ) + cosXmlClient = client + return client + } + + /** + * 上传文件 + * @param outName 远端文件名 + */ + fun upload( + context: Context, + file: File, + outName: String, + token: CosToken + ): Single { + if (Env.isDebug()) { + Log.e("CosClient", "upload file:${file.absolutePath} outName:${outName}") + } + return Single.create { + uploadFile(context, file, outName, token).apply { + setCosXmlResultListener(object : CosXmlResultListener { + override fun onSuccess(request: CosXmlRequest?, result: CosXmlResult) { + transformDomain(result, token) + if (Env.isDebug()) { + Log.e("CosClient", "upload onSuccess result:${result.accessUrl}") + } + it.onSuccess(result) + } + + override fun onFail( + request: CosXmlRequest?, + clientException: CosXmlClientException?, + serviceException: CosXmlServiceException? + ) { + if (Env.isDebug()) { + Log.e("CosClient", "upload onFail clientException:$clientException") + Log.e("CosClient", "upload onFail serviceException:$serviceException") + } + it.onError(CosException(clientException, serviceException)) + } + }) + } + } + } + + private fun transformDomain(result: CosXmlResult, token: CosToken) { + try { + if (result.accessUrl.isNullOrEmpty()) { + return + } + if (token.customDomain.isNullOrEmpty()) { + return + } + val newUri = Uri.parse(token.customDomain) + result.accessUrl = Uri.parse(result.accessUrl).buildUpon().scheme(newUri.scheme) + .authority(newUri.authority).build().toString() + } catch (e: Exception) { + e.printStackTrace() + } + } + + /** + * 上传文件 + * @param outName 远端文件名 + */ + private fun uploadFile( + context: Context, + file: File, + outName: String, + token: CosToken + ): COSXMLUploadTask { + val cosXmlService = getCosXmlClient(context, token) + // 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档 + val transferConfig = TransferConfig.Builder().build() + // 初始化 TransferManager + val transferManager = TransferManager( + cosXmlService, + transferConfig + ) + return transferManager.upload( + token.bucket, outName, + file.absolutePath, null + ) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/file/cos/CosCredentialProvider.kt b/core/src/main/java/com/chwl/core/file/cos/CosCredentialProvider.kt new file mode 100644 index 0000000..b44abb5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/file/cos/CosCredentialProvider.kt @@ -0,0 +1,16 @@ +package com.chwl.core.file.cos + +import com.tencent.qcloud.core.auth.BasicLifecycleCredentialProvider +import com.tencent.qcloud.core.auth.QCloudLifecycleCredentials + +class CosCredentialProvider(private var credentials: QCloudLifecycleCredentials) : + BasicLifecycleCredentialProvider() { + + fun updateCredentials(credentials: QCloudLifecycleCredentials) { + this.credentials = credentials + } + + override fun fetchNewCredentials(): QCloudLifecycleCredentials { + return credentials + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/file/cos/CosException.kt b/core/src/main/java/com/chwl/core/file/cos/CosException.kt new file mode 100644 index 0000000..d88a673 --- /dev/null +++ b/core/src/main/java/com/chwl/core/file/cos/CosException.kt @@ -0,0 +1,18 @@ +package com.chwl.core.file.cos + +import com.tencent.cos.xml.exception.CosXmlClientException +import com.tencent.cos.xml.exception.CosXmlServiceException + + +class CosException : Exception { + var clientException: CosXmlClientException? = null + var serviceException: CosXmlServiceException? = null + + constructor( + clientException: CosXmlClientException?, + serviceException: CosXmlServiceException? + ) : super((clientException ?: serviceException)?.message, clientException ?: serviceException) { + this.clientException = clientException + this.serviceException = serviceException + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/file/cos/CosToken.kt b/core/src/main/java/com/chwl/core/file/cos/CosToken.kt new file mode 100644 index 0000000..a201a97 --- /dev/null +++ b/core/src/main/java/com/chwl/core/file/cos/CosToken.kt @@ -0,0 +1,44 @@ +package com.chwl.core.file.cos + +import androidx.annotation.Keep +import com.chwl.core.utils.CurrentTimeUtils +import com.tencent.qcloud.core.auth.QCloudLifecycleCredentials +import com.tencent.qcloud.core.auth.SessionQCloudCredentials + + +@Keep +data class CosToken( + val secretId: String?, + val secretKey: String?, + val sessionToken: String?, + val bucket: String?, + val region: String?, + val startTime: Long?, + val expireTime: Long?, + val customDomain: String?, + val accelerate: Boolean? +) { + + /** + * 是否有效 + */ + fun isValid(): Boolean { + if (expireTime == null) { + return false + } + val currentTime = CurrentTimeUtils.getCurrentTime() / 1000 + // 预留一点安全时长 + var safeTime = 30 + if (safeTime >= (expireTime - (startTime ?: 0))) { + safeTime = 0 + } + return currentTime <= (expireTime - safeTime) + } + + fun toCredential(): QCloudLifecycleCredentials { + return SessionQCloudCredentials( + secretId ?: "", secretKey ?: "", + sessionToken ?: "", startTime ?: 0, expireTime ?: 0 + ) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/game_team/GameTeamRecordBean.kt b/core/src/main/java/com/chwl/core/game_team/GameTeamRecordBean.kt new file mode 100644 index 0000000..5376cee --- /dev/null +++ b/core/src/main/java/com/chwl/core/game_team/GameTeamRecordBean.kt @@ -0,0 +1,29 @@ +package com.chwl.core.game_team + +import androidx.annotation.Keep + +@Keep +data class GameTeamRecordBean( + val amount: Long? = null, + val createTime: String? = null, + val fromAvatar: String? = null, + val fromErBanNo: Long? = null, + val fromNick: String? = null, + val fromUid: Long? = null, + val gameId: Long? = null, + val gameLogo: String? = null, + val gameName: String? = null, + val id: Long? = null, + val income: Long? = null, + val inning: Long? = null, + val orderNo: String? = null, + val orderTime: String? = null, + val price: Long? = null, + val gamePic: String? = null, + val status: Int? = null, + val toAvatar: String? = null, + val toErBanNo: Long? = null, + val toNick: String? = null, + val toUid: Long? = null, + val updateTime: Long? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/game_team/UserGameTeamInfo.kt b/core/src/main/java/com/chwl/core/game_team/UserGameTeamInfo.kt new file mode 100644 index 0000000..4c49b7a --- /dev/null +++ b/core/src/main/java/com/chwl/core/game_team/UserGameTeamInfo.kt @@ -0,0 +1,17 @@ +package com.chwl.core.game_team + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +data class UserGameTeamInfo( + val background: String? = null, + val finishNum: Int? = null, + val gameId: Long? = null, + val gameName: String? = null, + val logo: String? = null, + val price: Long? = null, + val pic: String? = null, + val proficiency: String? = null, + val uid: Long? = null +) : Serializable diff --git a/core/src/main/java/com/chwl/core/gift/ChargeListener.java b/core/src/main/java/com/chwl/core/gift/ChargeListener.java new file mode 100644 index 0000000..791b1c2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/ChargeListener.java @@ -0,0 +1,5 @@ +package com.chwl.core.gift; + +public interface ChargeListener { + void onNeedCharge(); +} diff --git a/core/src/main/java/com/chwl/core/gift/GiftModel.java b/core/src/main/java/com/chwl/core/gift/GiftModel.java new file mode 100644 index 0000000..585f4a9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/GiftModel.java @@ -0,0 +1,929 @@ +package com.chwl.core.gift; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ALL_SERVICE_GIFT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_SERVICE_GIFT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT; +import static com.chwl.core.utils.extension.StringExtensionKt.toast; + +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.chwl.core.Constants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.BravoNoticeInfo; +import com.chwl.core.gift.bean.GiftFreeInfo; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftListInfo; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftPanelInfo; +import com.chwl.core.gift.bean.GiftSendType; +import com.chwl.core.gift.bean.GiftSource; +import com.chwl.core.gift.bean.GiftType; +import com.chwl.core.gift.bean.LuckyBagGifts; +import com.chwl.core.gift.bean.LuckyBagNoticeInfo; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; +import com.chwl.core.gift.bean.TagsInfo; +import com.chwl.core.gift.event.GiftComboEvent; +import com.chwl.core.gift.event.RoomFreeGiftEvent; +import com.chwl.core.gift.event.UpdateKnapEvent; +import com.chwl.core.gift.event.UpdateKnapFreeGiftEvent; +import com.chwl.core.gift.event.UpdateKnapFreeGiftNumEvent; +import com.chwl.core.gift.exception.GiftOutOfDateException; +import com.chwl.core.gift.toolbox.GiftToolbox; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.GiftAllServiceAttachment; +import com.chwl.core.im.custom.bean.GiftAllServiceNotifyAttachment; +import com.chwl.core.im.custom.bean.GiftAttachment; +import com.chwl.core.im.custom.bean.GiftBatchAttachment; +import com.chwl.core.im.custom.bean.MultiGiftAttachment; +import com.chwl.core.im.custom.bean.MultiLuckyGiftAttachment; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.pay.PayModel; +import com.chwl.core.pay.event.UpdateWalletInfoEvent; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.giftvalue.bean.GiftValueCommonUpdate; +import com.chwl.core.room.giftvalue.helper.GiftValueMrg; +import com.chwl.core.utils.ComboUtil; +import com.chwl.core.utils.CoreLogger; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.RadishNotEnoughException; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.core.utils.net.VipLevelNotEnoughException; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.common.util.SPUtils; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.SingleToastUtil; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; + +import org.greenrobot.eventbus.EventBus; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + + +/** + * Created by yudi + * on 2018/3/15. + */ + +public class GiftModel extends BaseModel implements IGiftModel { + public static final String TAG = "GiftModel"; + private volatile static IGiftModel model; + private Api api; + private UiHandler handler; + private GiftPanelInfo giftPanelInfo; + private GiftListInfo allGiftListInfo; + public List tabList; + private List knapList; + private List giftQueue; + private GiftFreeInfo giftFreeInfo; + + private GiftModel() { + api = RxNet.create(Api.class); + giftQueue = new ArrayList<>(); + handler = new UiHandler(this); + } + + @Override + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static IGiftModel get() { + if (model == null) { + synchronized (GiftModel.class) { + if (model == null) { + model = new GiftModel(); + } + } + } + return model; + } + + @Override + public void tryLoadGiftList() { + if (AuthModel.get().isLogin()) { + loadTagsAndGiftInfoList(null).subscribe(); +// loadGiftInfoList(null).subscribe(); + } + } + + private void addGiftMessage(CustomAttachment attachment) { + giftQueue.add(attachment); + if (giftQueue.size() == 1) { + handler.sendEmptyMessageDelayed(0, 50); + } + } + + /** + * 进入房间后,刷新礼物列表, 保留原来的不带有房间专属礼物的列表 + * + * @param roomUid + * @return + */ + @Override + public Single> refreshGiftList(String roomUid) { +// return loadGiftInfoList(roomUid); + return loadTagsAndGiftInfoList(roomUid); + } + + /** + * 加载带有房间专属的礼物 + * + * @param roomUid 房间 UID + * @return + */ + private Single> requestTagsAndGiftInfos(String roomUid) { + return loadTagsAndGiftInfoList(roomUid); + } + + /** + * 加载普通礼物,不带上房间专属的礼物 + * + * @param roomUid + * @return + */ +// @Override +// public Single> loadGiftInfoList(String roomUid) { +// return api.requestGiftInfos(roomUid) +// .compose(new Transformer<>()) +// .doOnSuccess(response -> { +// if (response.isSuccess()) { +// giftPanelInfo = response.getData(); +// } +// }) +// .doOnError(throwable -> toast(throwable.getMessage())); +// } + + /** + * 加载面板 tags 和普通礼物,不带上房间专属的礼物 + * + * @param roomUid + * @return + */ + @Override + public Single> loadTagsAndGiftInfoList(String roomUid) { + return api.requestAllTagsAndGiftInfos(roomUid) + .compose(new Transformer<>()) + .doOnSuccess(response -> { + if (response.isSuccess()) { + giftPanelInfo = response.getData(); + tabList = giftPanelInfo.tabList; + allGiftListInfo = giftPanelInfo.giftTabMap; + } + }) + .doOnError(throwable -> { + toast(throwable.getMessage()); + }); + } + + /** + * 礼物背包 的礼物数据 + * + * @return + */ + @Override + public Single>> requestKnapGiftInfos() { + return api.getGiftKnapList(AuthModel.get().getCurrentUid() + "").compose(new Transformer<>()).doOnSuccess(response -> { + if (response.isSuccess()) { + knapList = response.getData(); + } + }); + } + + @Override + public List getKnapList() { + if (knapList != null) { + return knapList; + } else { + requestKnapGiftInfos().subscribe(); + } + return new ArrayList<>(); + } + + @Override + public List getTabList() { + return tabList; + } + + @Override + public List getGiftInfoList(int giftType) { + return getGiftInfosByType(null, giftType); + } + + @Override + public List getGiftInfosByType(String roomUid, int giftType) { + if (allGiftListInfo == null) { + requestTagsAndGiftInfos(roomUid).subscribe(); + return new ArrayList<>(); + } + List giftInfos = null; + switch (giftType) { + case GiftType.GIFT_TYPE_NORMAL: + giftInfos = allGiftListInfo.getNormalGift(); + break; + case GiftType.GIFT_TYPE_LUCKY: + giftInfos = allGiftListInfo.getLuckyBagGift(); + break; + case GiftType.GIFT_TYPE_SUPER_LUCKY: + giftInfos = allGiftListInfo.getSuperLuckyGift(); + break; + case GiftType.GIFT_TYPE_VIP: + giftInfos = allGiftListInfo.getVipGift(); + break; + case GiftType.GIFT_TYPE_WEEK_STAR: + giftInfos = allGiftListInfo.getWeekStarGift(); + break; + case GiftType.GIFT_TYPE_DRAW_GIFT: + giftInfos = allGiftListInfo.getDrawGift(); + break; + case GiftType.GIFT_TYPE_SINGLE_ROOM: + giftInfos = allGiftListInfo.getSinglePopularGift(); + break; + case GiftType.GIFT_TYPE_COUNTRY: + giftInfos = allGiftListInfo.getCountryGift(); + break; + case GiftType.GIFT_TYPE_CP: + giftInfos = allGiftListInfo.getCpGift(); + break; + case GiftType.GIFT_TYPE_CUSTOM: + giftInfos = allGiftListInfo.getCustomGift(); + break; + case GiftType.GIFT_TYPE_BRAVO: + giftInfos = allGiftListInfo.getBravoGift(); + break; + } + return giftInfos == null ? new ArrayList<>() : giftInfos; + } + + @Override + public void onReceiveChatRoomMessages(List chatRoomMessageList) { + if (chatRoomMessageList != null && chatRoomMessageList.size() > 0) { + for (ChatRoomMessage msg : chatRoomMessageList) { + LogUtil.i("onReceiveChatRoomMessages", "count--->" + chatRoomMessageList.size()); + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + OtherExtKt.doLog("接收消息 GiftModel.onReceiveChatRoomMessages 3 - Second = "+attachment.getSecond()); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT + || attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT) + addGiftMessage(attachment); + } + } + } + } + + @Override + public void onSendRoomMessageSuccess(ChatRoomMessage msg) { + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT + || attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT) { + } + addGiftMessage(attachment); + } + } + + //xxx 自己发送礼物成功 通知房间展示礼物特效 + private void parseChatRoomAttachment(CustomAttachment attachment) { + //单人 3 普通单人-31 福袋单人-33 + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT) { + + OtherExtKt.doLog("接收消息 GiftModel.parseChatRoomAttachment 3 - Second = "+attachment.getSecond()); + + if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_GIFT) { + GiftAttachment giftAttachment = (GiftAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_NORMALE_GIFT) + .setGiftReceiveInfo(giftAttachment.getGiftReceiveInfo())); + //礼物值 + GiftValueMrg.get().updateMicQueueCharm(GiftValueCommonUpdate.transformGift(giftAttachment.getGiftReceiveInfo())); + + } else if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT) { + MultiLuckyGiftAttachment luckyGiftAttachment = (MultiLuckyGiftAttachment) attachment; + LuckyBagGifts luckyBagGifts = luckyGiftAttachment.getMultiLuckyGiftReceiveInfo(); + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_LUCKY_GIFT) + .setLuckyGiftMultiReceiverInfo(luckyBagGifts)); + //礼物值 + GiftValueMrg.get().updateMicQueueCharm( + GiftValueCommonUpdate.transformGift(luckyGiftAttachment.getMultiLuckyGiftReceiveInfo())); + }else if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_ALL_SERVICE_GIFT) { + GiftAllServiceAttachment giftAllServiceAttachment = (GiftAllServiceAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_NORMALE_GIFT_ALL_SERVICE) + .setGiftReceiveInfo(giftAllServiceAttachment.getGiftReceiveInfo())); + // 全服送礼推送 没有附带礼物值 ,礼物值在 31 里面处理了, 此时转发35进房间时为了 播放礼物特效 + }else if (attachment.getSecond() == CUSTOM_MSG_ALL_SERVICE_GIFT) { + //全服礼物 飘屏 + GiftAllServiceNotifyAttachment giftAllServiceNotifyAttachment = (GiftAllServiceNotifyAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_NORMALE_GIFT_ALL_SERVICE_NOTIFY) + .setAnyData(giftAllServiceNotifyAttachment.dataBean)); + } + + } else if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT) {//多人12 + + if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT) {//普通全麦 + MultiGiftAttachment multiGiftAttachment = (MultiGiftAttachment) attachment; + MultiGiftReceiveInfo multiGiftReceiveInfo = multiGiftAttachment.getMultiGiftReceiveInfo(); + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_ALL_MIC__NORMALEI_GIFT) + .setMultiGiftReceiveInfo(multiGiftReceiveInfo)); + + //礼物值 + GiftValueMrg.get().updateMicQueueCharm(GiftValueCommonUpdate + .transformGift(multiGiftAttachment.getMultiGiftReceiveInfo())); + + } else if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT) {//普通多人 + GiftBatchAttachment giftBatchAttachment = (GiftBatchAttachment) attachment; + GiftMultiReceiverInfo giftMultiReceiverInfo = giftBatchAttachment.getGiftMultiReceiverInfo(); + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MUTLT_NORMALEI_GIFT) + .setGiftMultiReceiverInfo(giftMultiReceiverInfo)); + + //礼物值 + GiftValueMrg.get().updateMicQueueCharm(GiftValueCommonUpdate + .transformGift(giftBatchAttachment.getGiftMultiReceiverInfo())); + } else if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT) {//福袋多人 + MultiLuckyGiftAttachment giftBatchAttachment = (MultiLuckyGiftAttachment) attachment; + LuckyBagGifts luckyBagGifts = giftBatchAttachment.getMultiLuckyGiftReceiveInfo(); + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MULTI_LUCKY_GIFT) + .setLuckyGiftMultiReceiverInfo(luckyBagGifts)); + +// //礼物值 + GiftValueMrg.get().updateMicQueueCharm( + GiftValueCommonUpdate.transformGift(giftBatchAttachment.getMultiLuckyGiftReceiveInfo())); + + } else if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT) {//福袋全麦 + MultiLuckyGiftAttachment giftBatchAttachment = (MultiLuckyGiftAttachment) attachment; + LuckyBagGifts luckyBagGifts = giftBatchAttachment.getMultiLuckyGiftReceiveInfo(); + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_ALL_MIC_LUCKY_GIFT) + .setLuckyGiftMultiReceiverInfo(luckyBagGifts)); + + GiftValueMrg.get().updateMicQueueCharm( + GiftValueCommonUpdate.transformGift(giftBatchAttachment.getMultiLuckyGiftReceiveInfo())); + } + } + } + + @Override + public Single> sendGift(int giftId, int giftNum, List targetUids, int sendType, int source, String msg, boolean isKnap, boolean isWholeMic, String chatSessionId) { + return sendGift(giftId, giftNum, targetUids, sendType, source, msg, isKnap, isWholeMic, chatSessionId, null); + } + + @Override + public Single> sendGift(int giftId, + int giftNum, + List targetUids, + int sendType, + int source, + String msg, + boolean isKnap, + boolean isWholeMic, + String chatSessionId, + @Nullable List> drawFixedArray) { + if (ListUtils.isListEmpty(targetUids)) { + return Single.error(new Throwable("targetUids is empty")); + } + if (!ListUtils.isListEmpty(drawFixedArray)) { + giftNum = drawFixedArray.size(); + } + if (giftNum <= 0) { + return Single.error(new Throwable("giftNum must larger than 0")); + } + // 从内存里取出礼物实体 + GiftInfo giftInfo; + if (isKnap) { + giftInfo = findGiftInfoByIdInKnapList(giftId); + } else { + giftInfo = findGiftInfoById(giftId); + } + if (giftInfo == null) { + return Single.error(new Throwable("giftInfo doesn't exist")); + } + Single> single = null; + + long uid = AuthModel.get().getCurrentUid(); + String roomUid = null; + switch (sendType) { + case GiftSendType.TYPE_ANCHOR: + case GiftSendType.TYPE_MIC: + RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (currentRoomInfo != null) { + roomUid = String.valueOf(currentRoomInfo.getUid()); + } else { + return Single.error(new Throwable("current room info is empty")); + } + break; + + case GiftSendType.TYPE_TEAM: + break; + case GiftSendType.TYPE_PRIVATE_CHAT: + break; + + case GiftSendType.TYPE_PUBLIC_CHAT_HALL: + roomUid = InitialModel.get().getPublicChatHallUid(); + break; + } + String targetUidsString = joinTargetUidsToString(targetUids); + String finalRoomUid = roomUid; + int finalGiftNum = giftNum; + int targetUidSize = targetUids.size(); + single = api.sendGift(uid, targetUidsString, roomUid, + giftInfo.getGiftId(), giftNum, msg, sendType, source, chatSessionId) + .compose(RxHelper.handleSchedulers()) + .flatMap((Function, + SingleSource>>) serviceResult -> { + if (serviceResult.isSuccess()) { + if (isKnap) { + //应通过id去确定要需要更新的礼物背包 + EventBus.getDefault().post(new UpdateKnapEvent(giftId, finalGiftNum * targetUids.size())); + } else { + if (serviceResult.getData() != null && serviceResult.getData().getUserPurse() != null) { + PayModel.get().setWalletInfo(serviceResult.getData().getUserPurse()); + EventBus.getDefault().post(new UpdateWalletInfoEvent()); + GiftComboEvent event = new GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_COIN_TIPS); + event.setGiftPrice(giftInfo.getGoldPrice() * finalGiftNum * targetUidSize); + EventBus.getDefault().post(event); + } else { + PayModel.get().refreshWalletInfo(true); + } + } + GiftMultiReceiverInfo giftMultiReceiverInfo = serviceResult.getData(); + if (giftId != giftMultiReceiverInfo.getGiftId()) { + return Single.error(RxHelper.createThrowable(serviceResult)); + } + giftMultiReceiverInfo.setComboCount(ComboUtil.INSTANCE.getComboCount()); + switch (sendType) { + case GiftSendType.TYPE_ANCHOR: + case GiftSendType.TYPE_MIC: + if (targetUids.size() == 1 && giftMultiReceiverInfo.getTargetUsers().size() == 1) { + if (giftMultiReceiverInfo.getGift().getGiftType() == GiftType.GIFT_TYPE_LUCKY) { + //发送个人福袋 + GiftToolbox.sendLuckyGiftRoomMessage(serviceResult.getData(), CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT, CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT); + } else { + GiftToolbox.sendGiftRoomMessage(GiftToolbox.transformToGiftReceiveInfo(giftMultiReceiverInfo)); + } + } else { + //发送全麦礼物 + if (isWholeMic) { + if (giftMultiReceiverInfo.getGift().getGiftType() == GiftType.GIFT_TYPE_LUCKY) { + GiftToolbox.sendMultiLuckyGiftRoomMessage(serviceResult.getData(), CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT, CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT); + } else { + GiftToolbox.sendAllMicGiftRoomMessage(GiftToolbox.transformToMultiGiftReceiveInfo(giftMultiReceiverInfo)); + } + //发送多人礼物 + } else { + if (giftMultiReceiverInfo.getGift().getGiftType() == GiftType.GIFT_TYPE_LUCKY) { + //发送多人福袋 + GiftToolbox.sendMultiLuckyGiftRoomMessage(serviceResult.getData(), CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT, CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT); + } else { + GiftToolbox.sendMultiGiftRoomMessage(serviceResult.getData()); + } + } + } + break; + } + if (!ListUtils.isListEmpty(drawFixedArray)) { + GiftToolbox.sendDrawGiftRoomMessage(giftId, drawFixedArray); + } + return Single.just(serviceResult); + } else { + if (serviceResult.getCode() == BalanceNotEnoughExeption.code) { + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.RECHARGE)); + return Single.error(new BalanceNotEnoughExeption(serviceResult.getMessage())); + } else if (serviceResult.getCode() == VipLevelNotEnoughException.code) { + return Single.error(new VipLevelNotEnoughException(serviceResult.getMessage())); + } else if (RadishNotEnoughException.code == serviceResult.getCode()) { + //萝卜不足 + IMNetEaseManager.get().getChatRoomEventObservable().onNext( + new RoomEvent().setEvent(RoomEvent.RADISH_NOT_ENOUGH)); + } else if (serviceResult.getCode() == GiftOutOfDateException.code) { + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.GIFT_OUT_OF_DATE) + .setMessage(serviceResult.getMessage())); + requestTagsAndGiftInfos(finalRoomUid).subscribe(); + return Single.error(new GiftOutOfDateException(serviceResult.getMessage())); + } else if (serviceResult.getMessage() != null) { + SingleToastUtil.showToast(serviceResult.getMessage()); + return Single.error(new RadishNotEnoughException(serviceResult.getMessage())); + } + + + return Single.error(RxHelper.createThrowable(serviceResult)); + } + }); + return single; + } + + private String joinTargetUidsToString(List targetUids) { + StringBuilder sb = new StringBuilder(); + try { + for (int i = 0; i < targetUids.size(); i++) { + long targetUid = targetUids.get(i); + sb.append(targetUid); + sb.append(","); + } + sb.deleteCharAt(sb.length() - 1); + } catch (Exception ex) { + ex.printStackTrace(); + } + return sb.toString(); + } + + /** + * 发送礼物 + * + * @param giftId + * @param targetUids + * @param giftNum + * @param msg + * @param isKnap + * @return + */ + @Override + public Single> sendRoomGift(int giftId, + List targetUids, + final int giftNum, + String msg, + boolean isKnap, + boolean isWholeMic, + List> drawFixedArray) { + Log.e("GiftDialog", "sendRoomGift() called with: giftId = [" + giftId + "], targetUids = [" + targetUids + "], giftNum = [" + giftNum + "], msg = [" + msg + "], isKnap = [" + isKnap + "], isWholeMic = [" + isWholeMic + "]"); + return sendGift( + giftId, + giftNum, + targetUids, + GiftSendType.TYPE_MIC, + isKnap ? GiftSource.BACKPACK : GiftSource.COMMON, + msg, + isKnap, + isWholeMic, + null, + drawFixedArray); + } + + /** + * 在单聊界面送礼物 + * + * @param giftId - + * @param targetUid - + * @param giftNum - + * @return - + */ + @Override + public Single> sendPersonalGift(final int giftId, + final String targetUid, final int giftNum, + String msg, boolean isKnap) { + List targetUids = new ArrayList<>(); + targetUids.add(Long.parseLong(targetUid)); + return sendGift(giftId, giftNum, targetUids, GiftSendType.TYPE_PRIVATE_CHAT, + isKnap ? GiftSource.BACKPACK : GiftSource.COMMON, msg, isKnap, false, null); + } + + @Override + public void addNewGift(GiftInfo giftInfo) { + //兼容旧版写的,已经不需要了 + } + + /** + * 根据礼物id找到对应具体的礼物 + * + * @param giftId + * @return + */ + @Override + public GiftInfo findGiftInfoById(int giftId) { + GiftInfo giftInfo = null; + if (allGiftListInfo != null) { + giftInfo = findGiftInfoById(allGiftListInfo.getNormalGift(), giftId); + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getVipGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getLuckyBagGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getLuckyPoolGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getWeekStarGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getDrawGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getSinglePopularGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getSuperLuckyGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getCountryGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getCpGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getCustomGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getCustomGift(), giftId); + } + if (giftInfo == null) { + giftInfo = findGiftInfoById(allGiftListInfo.getBravoGift(), giftId); + } + } + return giftInfo; + } + + @Nullable + private GiftInfo findGiftInfoById(List giftInfoList, int giftId) { + if (ListUtils.isListEmpty(giftInfoList)) return null; + for (GiftInfo giftInfo : giftInfoList) { + if (giftInfo.getGiftId() == giftId) { + return giftInfo; + } + } + return null; + } + + @Override + public GiftInfo findGiftInfoByIdInKnapList(int giftId) { + if (knapList != null) { + for (GiftInfo giftInfo : knapList) { + if (giftInfo.getGiftId() == giftId) { + return giftInfo; + } + } + } + return null; + } + + @Override + public Single> sendFansTeamGift(int giftId, String targetUid) { + return api.sendJoinFansGift(AuthModel.get().getCurrentUid(), + targetUid, + String.valueOf(AvRoomDataManager.get().getRoomUid()), + giftId, + 1, + "", + GiftSendType.TYPE_ANCHOR, + GiftSource.COMMON, + null) + .compose(RxHelper.handleSchAndExce()); + } + + /** + * 免费礼物接口 + * + * @return + */ + @Override + public Single> getFreeGift(boolean isReset) { + return api.getFreeGift().compose(new Transformer<>()).doOnSuccess(response -> { + if (response.isSuccess()) { + giftFreeInfo = response.getData(); + if (isReset) { + EventBus.getDefault().post(new UpdateKnapFreeGiftNumEvent(giftFreeInfo.getGiftId(), true)); + } + startFreeGiftCountDown(giftFreeInfo.getGiftId()); + } + }); + } + + private CountDownTimer countDownTimer; + + private void startFreeGiftCountDown(int giftId) { + cancelCountDownTimer(); + if(!SPUtils.getBoolean(Constants.IS_SHOW_FREE_GIFT,false) && giftFreeInfo.getCurStage() > 0){ + EventBus.getDefault().post(new RoomFreeGiftEvent(giftFreeInfo)); + }else if(giftFreeInfo.getCurStage() == 0){ + SPUtils.putBoolean(Constants.IS_SHOW_FREE_GIFT,false); + } + if (giftFreeInfo.getCurStage() < giftFreeInfo.getMaxStage()) { + if (giftFreeInfo.getCurStageSecond() > 0) { + countDownTimer = new CountDownTimer(giftFreeInfo.getCurStageSecond() * 1000, 1000) { + @Override + public void onTick(long millisUntilFinished) { + EventBus.getDefault().post(new UpdateKnapFreeGiftEvent(giftId, millisUntilFinished / 1000)); + } + + @Override + public void onFinish() { + EventBus.getDefault().post(new UpdateKnapFreeGiftNumEvent(giftId, false)); + if (giftFreeInfo.getCurStage() == 0) { + EventBus.getDefault().post(new RoomFreeGiftEvent(giftFreeInfo)); + } + CoreLogger.info(TAG, "FREE_GIFT onTimerFinish"); + // 鲜花倒计时结束,去请求 + getFreeGift(false).subscribe(); + } + }; + countDownTimer.start(); + } + }else { + EventBus.getDefault().post(new UpdateKnapFreeGiftEvent(giftId, 0)); + } + } + + @Override + public void cancelCountDownTimer() { + if (countDownTimer != null) { + countDownTimer.cancel(); + } + } + @Override + public Single getSpecialGift() { + return api.getSpecialGift().compose(RxHelper.handleBeanData2()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single sendSpecialGift(long uid) { + return api.sendSpecialGift(uid).compose(RxHelper.handleBeanData2()) + .compose(RxHelper.handleSchedulers()).flatMap((Function>) giftMultiReceiverInfo -> { + return GiftToolbox.sendGiftPrivateChatMessage(giftMultiReceiverInfo); + }); + } + + @Override + public Single> getLuckyGiftMsgList() { + return api.getLuckyGiftMsgList() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single> getBravoGiftMsgList() { + return api.getBravoGiftMsgList() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()); + } + + + private interface Api { + + /** + * 福袋最近20条全服记录 + * @return + */ + @GET("/luckybag/getBannerList") + Single>> getLuckyGiftMsgList(); + + /** + * 超级幸运礼物最近20条全服记录 + * @return + */ + @GET("/bravo/getBannerList") + Single>> getBravoGiftMsgList(); + + /** + * 获取礼物列表 + * + * @return - + */ + @GET("/gift/getPanel") + Single> requestGiftInfos(@Query("roomUid") String roomUid); + + /** + * 获取面板标签和礼物列表 + * + * @return - + */ + @GET("/gift/getPanel") + Single> requestAllTagsAndGiftInfos(@Query("roomUid") String roomUid); + + /** + * 获取砸金蛋中奖背包里面的东西列表 + * + * @param uid + * @return + */ + @GET("backpack/listUserBackpackV3") + Single>> getGiftKnapList(@Query("uid") String uid); + + /** + * 送礼物 + * + * @param sendType 赠送类型 1给主播直接刷礼物,2私聊送个人礼物, + * 3房间内给坑位上的人送礼物,5.公聊大厅给人送礼物 + * 1、3现在不做区分,统一用3 + * @param giftSource 礼物来源:1:普通,2:背包,3:师徒 + * @return + */ + @POST("/gift/sendV5") + @FormUrlEncoded + Single> sendGift( + @Field("uid") long uid, + @Field("targetUids") String targetUids, + @Field("roomUid") String roomUid, + @Field("giftId") int giftId, + @Field("giftNum") int giftNum, + @Field("msg") String msg, + @Field("sendType") int sendType, + @Field("giftSource") int giftSource, + @Field("chatSessionId") String chatSessionId); + + /** + * 送加入粉丝团礼物 + * + * @return + */ + @POST("/anchorFansTeam/sendJoinTeamGift") + @FormUrlEncoded + Single> sendJoinFansGift( + @Field("uid") long uid, + @Field("targetUids") String targetUids, + @Field("roomUid") String roomUid, + @Field("giftId") int giftId, + @Field("giftNum") int giftNum, + @Field("msg") String msg, + @Field("sendType") int sendType, + @Field("giftSource") int giftSource, + @Field("chatSessionId") String chatSessionId); + + /** + * 获取新用户进房礼物 + * + * @return + */ + @GET("/roomFreeGift/get") + Single> getFreeGift(); + + /** + * 特殊礼物信息 + * + * @return + */ + @GET("special/gift/get") + Single> getSpecialGift(); + + + /** + * 特殊-送礼物 + * + * @return + */ + @POST("special/gift/send") + @FormUrlEncoded + Single> sendSpecialGift( + @Field("targetId") long uid); + } + + private static class UiHandler extends Handler { + WeakReference mReference; + + UiHandler(GiftModel giftModel) { + mReference = new WeakReference<>(giftModel); + } + + @Override + public void handleMessage(Message msg) { + GiftModel giftModel = null; + try { + giftModel = mReference.get(); + if (giftModel == null) return; + super.handleMessage(msg); + if (giftModel.giftQueue.size() > 0) { + CustomAttachment attachment = giftModel.giftQueue.remove(0); + if (attachment != null) + giftModel.parseChatRoomAttachment(attachment); + } + } catch (Exception e) { + OtherExtKt.doLog(" 礼物消息异常 : "+e.getMessage()); + } + + if (giftModel != null && !giftModel.giftQueue.isEmpty()) { + sendEmptyMessageDelayed(0, 150); + } + } + } +} diff --git a/core/src/main/java/com/chwl/core/gift/IGiftCore.java b/core/src/main/java/com/chwl/core/gift/IGiftCore.java new file mode 100644 index 0000000..123f74b --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/IGiftCore.java @@ -0,0 +1,36 @@ +package com.chwl.core.gift; + +import com.netease.nim.uikit.business.session.module.Container; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.library.coremanager.IBaseCore; + +import java.lang.ref.WeakReference; +import java.util.List; + +/** + * Created by chenran on 2017/7/27. + */ + +public interface IGiftCore extends IBaseCore { + List getGiftInfosByType(int type); + + void sendRoomGift(int giftId, long targetUid, long roomUid, int giftNum, int goldPrice, String msg, boolean isKnap); + + void sendRoomMultiGift(int giftId, List targetUids, long roomUid, int giftNum, int goldPrice, String msg, boolean isKnap); + + void sendPersonalGift(int giftId, long targetUid, int giftNum, int goldPrice); + + /** + * 云信发P2P礼物专用 + */ + void sendPersonalGiftToNIM(int giftId, long targetUid, int giftNum, int goldPrice, WeakReference container, ChargeListener chargeListener, String msg, boolean isKnap); + + GiftInfo findGiftInfoById(int giftId); + + void requestGiftInfos(); + + void requestAllTagsAndGiftInfos(); + + void onReceiveChatRoomMessages(List chatRoomMessageList); +} diff --git a/core/src/main/java/com/chwl/core/gift/IGiftCoreClient.java b/core/src/main/java/com/chwl/core/gift/IGiftCoreClient.java new file mode 100644 index 0000000..22e66de --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/IGiftCoreClient.java @@ -0,0 +1,36 @@ +package com.chwl.core.gift; + +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; +import com.chwl.library.coremanager.ICoreClient; + +import java.util.List; + +/** + * Created by chenran on 2017/7/27. + */ + +public interface IGiftCoreClient extends ICoreClient{ + + public static final String METHOD_ON_REQUEST_GIFT_LIST = "onRequestGiftList"; + public static final String METHOD_ON_REQUEST_GIFT_LIST_FAIL = "onRequestGiftListFail"; + public static final String METHOD_ON_RECIEVE_GIFT_MSG = "onRecieveGiftMsg"; + public static final String METHOD_ON_MULTI_GIFT_MSG = "onRecieveMultiGiftMsg"; + public static final String METHOD_ON_RECEIVE_PERSONAL_GIFT = "onRecievePersonalGift"; + public static final String METHOD_ON_SEND_PERSONAL_GIFT = "onSendPersonalGift"; + public static final String METHOD_ON_SEND_PERSONAL_GIFT_FAIL = "onSendPersonalGiftFail"; + public static final String METHOD_ON_GIFT_PAST_DUE = "onGiftPastDue"; + public static final String METHOD_ON_RECIEVE_GIFT_KNAP_MSG = "onRecieveGiftKnapMsg"; + + void onRequestGiftList(List giftInfoList); + void onRequestGiftListFail(); + void onRecievePersonalGift(GiftReceiveInfo giftRecieveInfo); + void onRecieveGiftMsg(GiftReceiveInfo giftRecieveInfo); + void onRecieveMultiGiftMsg(MultiGiftReceiveInfo multiGiftRecieveInfo); + void onRecieveAllGiftMst(); + void onSendPersonalGift(int giftId, long targetUid); + void onSendPersonalGiftFail(int code); + void onGiftPastDue(); + void onRecieveGiftKnapMsg(int count); +} diff --git a/core/src/main/java/com/chwl/core/gift/IGiftModel.java b/core/src/main/java/com/chwl/core/gift/IGiftModel.java new file mode 100644 index 0000000..1e6f3d2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/IGiftModel.java @@ -0,0 +1,214 @@ +package com.chwl.core.gift; + +import androidx.annotation.Nullable; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.BravoNoticeInfo; +import com.chwl.core.gift.bean.GiftFreeInfo; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftPanelInfo; +import com.chwl.core.gift.bean.LuckyBagNoticeInfo; +import com.chwl.core.gift.bean.TagsInfo; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; + +import java.util.List; + +import io.reactivex.Single; + +public interface IGiftModel { + + void tryLoadGiftList(); + + /** + * 加载普通礼物,不带上房间专属的礼物 + * + * @param roomUid + * @return + */ +// Single> loadGiftInfoList(String roomUid); + /** + * 加载面板 tags 和普通礼物,不带上房间专属的礼物 + * + * @param roomUid + * @return + */ + Single> loadTagsAndGiftInfoList(String roomUid); + + /** + * 进入房间后,刷新礼物列表, 保留原来的不带有房间专属礼物的列表 + * + * @param roomUid + * @return + */ + Single> refreshGiftList(String roomUid); + + /** + * 加载背包礼物 + * + * @return + */ + Single>> requestKnapGiftInfos(); + + /** + * 从内存里取出背包礼物列表 + * + * @return + */ + List getKnapList(); + + List getTabList(); + + /** + * 从内存里取出背包礼物列表 + * + * @param giftType 礼物类型 + * @return + * @see com.chwl.core.gift.bean.GiftType + */ + List getGiftInfoList(int giftType); + + /** + * 根据礼物类型获取礼物列表 + * + * @param roomUid + * @param giftType + * @return + * @see com.chwl.core.gift.bean.GiftType + */ + List getGiftInfosByType(String roomUid, int giftType); + + void onReceiveChatRoomMessages(List chatRoomMessageList); + + void onSendRoomMessageSuccess(ChatRoomMessage msg); + + /** + * 送礼物的统一接口,(房间、私聊 和 公聊大厅)送礼物都调用这个方法 + * + * @param giftId + * @param giftNum + * @param targetUids + * @param sendType + * @param msg + * @param isKnap + * @param isWholeMic + * @return + */ + Single> sendGift(int giftId, + int giftNum, + List targetUids, + int sendType, + int source, + String msg, + boolean isKnap, + boolean isWholeMic, String chatSessionId); + + Single> sendGift(int giftId, + int giftNum, + List targetUids, + int sendType, + int source, + String msg, + boolean isKnap, + boolean isWholeMic, + String chatSessionId, + @Nullable List> drawFixedArray); + + /** + * 房间内发送礼物 + * + * @param giftId + * @param targetUids + * @param giftNum + * @param msg + * @param isKnap + * @return + */ + Single> sendRoomGift(int giftId, List targetUids, + int giftNum, + String msg, + boolean isKnap, + boolean isWholeMic, + List> drawFixedArray); + + /** + * 在单聊界面送礼物 + * + * @param giftId - + * @param targetUid - + * @param giftNum - + * @return - + */ + Single> sendPersonalGift(int giftId, + String targetUid, + int giftNum, + String msg, + boolean isKnap); + + /** + * 往内存的缓存中添加新的礼物数据 + * + * @param giftInfo + */ + void addNewGift(GiftInfo giftInfo); + + /** + * 根据礼物id找到对应具体的礼物 + * + * @param giftId + * @return + */ + GiftInfo findGiftInfoById(int giftId); + + /** + * 根据礼物 id 从背包礼物列表里找到对应具体的礼物 + * + * @param giftId + * @return + */ + GiftInfo findGiftInfoByIdInKnapList(int giftId); + + + /** + * 开通粉丝团送礼物 + * + * @param giftId - + * @param targetUid - + * @return - + */ + Single> sendFansTeamGift(int giftId, + String targetUid); + + /** + * 获取免费礼物 + */ + Single> getFreeGift(boolean isReset); + + /** + * 取消倒计时 + */ + public void cancelCountDownTimer(); + + + /** + * 获取特殊礼物 + */ + Single getSpecialGift(); + + /** + * 发送特殊礼物 + */ + Single sendSpecialGift(long uid); + + /** + * 福袋最近20条全服记录 + * + * @return - + */ + Single> getLuckyGiftMsgList(); + + //超级幸运礼物 20记录 + Single> getBravoGiftMsgList(); + + void refreshApi(); +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BonsellaJoinAttack.java b/core/src/main/java/com/chwl/core/gift/bean/BonsellaJoinAttack.java new file mode 100644 index 0000000..251d9c3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BonsellaJoinAttack.java @@ -0,0 +1,15 @@ +package com.chwl.core.gift.bean; + +public class BonsellaJoinAttack { + public long sentUserid; + public String sentUserName; + public String sentAvatar; + public String giftImgUrl; + public int giftId; + public int giftNumber; + public int receiverNumber; + public String receiverUserName; + public int comboCount; + public boolean isMulti; + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomInfo.java b/core/src/main/java/com/chwl/core/gift/bean/BoomInfo.java new file mode 100644 index 0000000..2f9a0ad --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +public class BoomInfo { + public int level; + public int speed; + public List roomBoomLevelAwardVos; + public List roomBoomRankVos; + public boolean hot; + public boolean rank; + public boolean currLevel; + public String pic; + public String vapUrl; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomInfoAward.java b/core/src/main/java/com/chwl/core/gift/bean/BoomInfoAward.java new file mode 100644 index 0000000..5e5e93a --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomInfoAward.java @@ -0,0 +1,9 @@ +package com.chwl.core.gift.bean; + +public class BoomInfoAward { + public int awardType; + public String awardName; + public String awardPic; + public int seq; + public int isShow; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomInfoRank.java b/core/src/main/java/com/chwl/core/gift/bean/BoomInfoRank.java new file mode 100644 index 0000000..a154521 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomInfoRank.java @@ -0,0 +1,8 @@ +package com.chwl.core.gift.bean; + +public class BoomInfoRank { + public String avatar; + public String nick; + public long uid; + public int position; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAnimBean.java b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAnimBean.java new file mode 100644 index 0000000..a375ef6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAnimBean.java @@ -0,0 +1,24 @@ +package com.chwl.core.gift.bean; + +import java.io.File; + +public class BoomMsgAnimBean { + public String countDownUrl = ""; + public String endUrl = ""; + + public File countDownFile; + public File endFile; + + public int level; + + @Override + public String toString() { + return "BoomMsgAnimBean{" + + "countDownUrl='" + countDownUrl + '\'' + + ", endUrl='" + endUrl + '\'' + + ", countDownFile=" + countDownFile + + ", endFile=" + endFile + + ", level=" + level + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardBean.kt b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardBean.kt new file mode 100644 index 0000000..8ddd4d1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardBean.kt @@ -0,0 +1,22 @@ +package com.chwl.core.gift.bean + + +//{ +// "awardName": "yunqi", +// "awardPic": "http://pic.uat.lawachat.com/FtCxQF2n_jdjixyRvt_iha99OaLQ?imageslim", +// "level": 1, +// "nick": "mo", +// "roleType": 2, +// "roomUid": 3456, +// "uid": 3457 +//} + +data class BoomMsgAwardBean( + var awardName: String = "", + var awardPic: String = "", + var level: Int = 0, + var nick: String = "", + var roleType: Int = 0, + var roomUid: Long = 0, + var uid: Long = 0, + ) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardList.kt b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardList.kt new file mode 100644 index 0000000..482c289 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgAwardList.kt @@ -0,0 +1,3 @@ +package com.chwl.core.gift.bean + +data class BoomMsgAwardList(var list : List?=null, var second: Int = 0 ) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomMsgDialogBean.java b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgDialogBean.java new file mode 100644 index 0000000..7e2c94e --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgDialogBean.java @@ -0,0 +1,80 @@ +package com.chwl.core.gift.bean; + +//package com.chwl.core.gift.bean +// +// +////{ +//// "avatar": "https://img.molistar.xyz/default_avatar_molistar.png", +//// "countDownVapUrl": "http://pic.uat.hicat.chat/2024092315323441165004.mp4", +//// "drawTime": 1727260512548, +//// "drawTimeLong": 1727260512548, +//// "endVapUrl": "http://pic.uat.lawachat.com/2023112118545622752745.mp4", +//// "erbanNo": 2211, +//// "floatingScreenPic": "", +//// "id": 1606, +//// "level": 1, +//// "nick": "mo", +//// "notifyStaySecond": 3, +//// "partitionId": 2, +//// "pic": "http://pic.uat.lawachat.com/2023112117552001160733", +//// "roomAvatar": "https://image.pekolive.com/0baefcc9-07ee-4ee1-a600-160914f0853c.jpeg", +//// "roomTitle": "mo\u0027s Room", +//// "roomUid": 3456, +//// "status": 1, +//// "targetIcon": "http://pic.uat.lawachat.com/2023112117552001160733", +//// "uid": 3457, +//// "vapUrl": "http://pic.uat.hicat.chat/2024092315322727355848.mp4" +////} +// +//data class BoomMsgDialogBean( +// var avatar: String = "", +// var vapUrl: String = "", +// var countDownVapUrl: String = "", +// var endVapUrl: String = "", +// var pic: String = "", +// var floatingScreenPic: String = "", +// var roomAvatar: String = "", +// var targetIcon: String = "", +// var nick: String = "", +// var roomTitle: String = "", +// var level: Int = 0, +// var notifyStaySecond: Int = 0, +// var partitionId: Long = 0, +// var messTime: Long = 0, +// var drawTime: Long = 0, +// var roomUid: Long = 0, +// var status: Long = 0, +// var drawTimeLong: Long = 0, +// var erbanNo: Long = 0, +// var id: Long = 0, +// var uid: Long = 0, +// var second: Int = 0 +// ) + +import lombok.Data; + +@Data +public class BoomMsgDialogBean { + public String avatar; + public String vapUrl; + public String countDownVapUrl; + public String endVapUrl; + public String pic; + public String floatingScreenPic; + public String roomAvatar; + public String targetIcon; + public String nick; + public String roomTitle; + public int level; + public int notifyStaySecond; + public long partitionId; + public long messTime; + public long drawTime; + public long roomUid; + public long status; + public long drawTimeLong; + public long erbanNo; + public long id; + public long uid; + public int second; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BoomMsgExpPushBean.kt b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgExpPushBean.kt new file mode 100644 index 0000000..046cbca --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BoomMsgExpPushBean.kt @@ -0,0 +1,31 @@ +package com.chwl.core.gift.bean + + +//{ +// "countDownVapUrl": "http://pic.uat.hicat.chat/2024092315323441165004.mp4", +// "currLevel": false, +// "endVapUrl": "http://pic.uat.lawachat.com/2023112118545622752745.mp4", +// "exp": 200000, +// "goldNum": 700000, +// "hot": false, +// "level": 1, +// "messTime": 1727256856163, +// "pic": "http://pic.uat.lawachat.com/2023112117552001160733", +// "rank": false, +// "speed": 57, +// "vapUrl": "http://pic.uat.hicat.chat/2024092315322727355848.mp4" +//} + +data class BoomMsgExpPushBean( + var vapUrl: String = "", + var countDownVapUrl: String = "", + var endVapUrl: String = "", + var currLevel: Boolean = false, + var hot: Boolean = false, + var rank: Boolean = false, + var pic: String = "", + var speed: Int = 0, + var goldNum: Int = 0, + var level: Int = 0, + var messTime: Long = 0, + var second: Int = 0) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/BravoGiftMsgNotifyBean.kt b/core/src/main/java/com/chwl/core/gift/bean/BravoGiftMsgNotifyBean.kt new file mode 100644 index 0000000..e4091de --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BravoGiftMsgNotifyBean.kt @@ -0,0 +1,15 @@ +package com.chwl.core.gift.bean + +import com.chwl.core.bean.I18N + +//{"data":{"times":"0","sender":{"avatar":"https://img.molistar.xyz/default_avatar_molistar.png", +// "erbanNo":6247036,"gender":1,"nick":"测试","uid":3232},"coins":"99", +// "giftNameMap":{"ar":"魔力水晶鞋","en":"魔力水晶鞋","zh":"魔力水晶鞋"}},"first":106,"second":1063} +data class BravoGiftMsgNotifyBean( + var roomUid: Long = 0, + var sender: Sender? = null, + var giftNameMap: I18N?=null, + var giftPic: String?=null, + var times: Double = 0.0, + var coins: Double = 0.0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardBean.java b/core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardBean.java new file mode 100644 index 0000000..14c4adf --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardBean.java @@ -0,0 +1,16 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class BravoGiftRewardBean { + public long roomUid; + public long roomId; + public long uid; + public BravoGiftRewardTipsBean tip; //中奖弹窗提示bean + public double receiverProfit;//主播收益 + public List receiverUidList;//有主播收益的uid + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardTipsBean.java b/core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardTipsBean.java new file mode 100644 index 0000000..08cc3c6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BravoGiftRewardTipsBean.java @@ -0,0 +1,10 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class BravoGiftRewardTipsBean { + public double times; + public int level; + public double coins; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/BravoNoticeInfo.java b/core/src/main/java/com/chwl/core/gift/bean/BravoNoticeInfo.java new file mode 100644 index 0000000..e8b897b --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/BravoNoticeInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class BravoNoticeInfo implements Serializable { + private long uid = 0; + private String nick =""; + private String avatar=""; + + private String giftName=""; + private double coin=0.0; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt b/core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt new file mode 100644 index 0000000..cdbc3f8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/CpMsgBean.kt @@ -0,0 +1,26 @@ +package com.chwl.core.gift.bean + + +//private String senderAvatar; //送礼人头像 +//private String senderNick; //送礼人昵称 +//private String receiverAvatar; //收礼人头像 +//private String receiverNick; //收礼人昵称 +//private String giftUrl; //礼物图标 +//private Long senderUid; //送礼人uid +//private Long receiverUid; //收礼人uid +//private Long roomUid; //房间UID +//private Integer cpLevel; +//private Integer partitionId; + +data class CpMsgBean( + var senderAvatar: String = "", + var senderNick: String = "", + var receiverAvatar: String = "", + var receiverNick: String = "", + var giftUrl: String = "", + var senderUid: Long = 0, + var receiverUid: Long = 0, + var roomUid: Long = 0, + var cpLevel: Int = 0, + var partitionId: Int = 0, + var second: Int = 0) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/EventUserConfig.java b/core/src/main/java/com/chwl/core/gift/bean/EventUserConfig.java new file mode 100644 index 0000000..cf3e585 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/EventUserConfig.java @@ -0,0 +1,25 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Data +public class EventUserConfig { + public List durations; + public int earliestBeginHour; + public int goldNum; + public int latestDay; + // { + // "durations": [ + // 0 + // ], + // "earliestBeginHour": 0, + // "goldNum": 0, + // "latestDay": 0 + // } + + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftEffectInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftEffectInfo.java new file mode 100644 index 0000000..1682370 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftEffectInfo.java @@ -0,0 +1,32 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * Created by + * on 2017/7/28. + */ +@Data +public class GiftEffectInfo implements Serializable { + public final static int GIFT_RECEIVE_TYPE_SINGLE = 1;////送礼物的类型单人 + public final static int GIFT_RECEIVE_TYPE_MULTI = 2;//送礼物的类型多人 + public final static int GIFT_RECEIVE_TYPE_ALL = 3;//送礼物的类型全麦 + public final static int GIFT_RECEIVE_TYPE_LUCKY = 4;//福袋礼物 + + private long uid; + private String nick; + private String avatar; + List targetUsers; + private int giftId; + private int giftNum; + private GiftInfo gift; + + private int giftReceiveType;//送礼物的类型,单人,多人,全麦 + + //- 嵌套头像礼物所用字段 + private int showAvatarType; + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftFileInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftFileInfo.java new file mode 100644 index 0000000..900a9f1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftFileInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by chenran on 2017/8/7. + */ +@Data +public class GiftFileInfo implements Serializable{ + private String giftUrl; + private String giftFile; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftFreeInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftFreeInfo.java new file mode 100644 index 0000000..1c5d66c --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftFreeInfo.java @@ -0,0 +1,23 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +/** + * Created by wushaocheng + * on 2022/12/13. + */ +@Data +public class GiftFreeInfo { + + private long uid;//用户id + private int giftId;//礼物id + private String giftName;//礼物名称 + private long goldPrice;//礼物价格 + private String giftUrl;//礼物icon + private long firstSecond;//首次时长 + private long curStage;//当前阶段 + private long curStageSecond;//当前阶段剩余多少秒去倒计时 + private long maxStage;//最大阶段 + private long restTime;//重置时间 + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftInfo.java new file mode 100644 index 0000000..1f261e5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftInfo.java @@ -0,0 +1,144 @@ +package com.chwl.core.gift.bean; + +import android.text.TextUtils; + +import com.chwl.core.bean.I18N; +import com.google.gson.annotations.SerializedName; +import com.netease.nim.uikit.common.util.string.StringUtil; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by + * on 2017/7/27. + */ +@Data +public class GiftInfo implements Serializable { + + /** + * 钻石礼物 + */ + public final static int CONSUME_TYPE_GOLD = 1; + /** + * 免费礼物 + */ + public final static int CONSUME_TYPE_FREE_GIFT = 3; + + private int count; + private int giftId; + private int giftType; + private String giftName; + private int goldPrice; + private String giftUrl; + private int seqNo; + private boolean hasGifPic; + private String gifUrl; + private String gifFile; + private boolean hasVggPic; + private String vggUrl; + // 是否是最新礼物 + private boolean hasLatest; + // 是否是限时礼物 + private boolean hasTimeLimit; + // 是否有特效 + private boolean hasEffect; + /** + * 是否是贵族礼物 + */ + private boolean isNobleGift; + /** 贵族的等级 */ + @SerializedName("nobleId")//该礼物需要的贵族等级 + private int level; + @SerializedName("nobleName") + private String nobleName; + + public boolean isSelected; + + /** + * 是否全服通知 + */ + private boolean isWholeServer; + + /** + * 全服通知是否支持房间跳转 + */ + private boolean isSkipRoom; + + /** + * 全服通知是否支持文字编辑 + */ + private boolean isSendMsg; + + /** + * 消费类型,1:钻石礼物,2:萝卜礼物 + */ + private int consumeType; + + /** + * 房间专属礼物(0:否,1是) + */ + private boolean roomExclude; + + private String luckyGiftSvgaUrl; + + /** + * 礼物说明URL + */ + private String giftExplainUrl; + + private SimpleVipInfo giftVipInfo; + + private int otherViewType; + + private String viewUrl; + + private SimpleUserInfo firstLevelRankUser; + + private SimpleUserInfo firstCharmRankUser; + + private boolean drawGift; + + private String bannerUrl; + + private String skipUrl; + + //免费礼物倒计时进度 + private long mFreeGiftProgress = 0; + + private I18N i18nGiftNameMap; + + public long uid = -1; // combo + + + //- 嵌套头像礼物所用字段 + int notifyFull; //是否全服 + /** + * 0 普通礼物 , 1-送礼者 2-收礼者 3-左送右收 + */ + int showAvatarType; + + + public String getFirstGiftName() { + return I18N.getFirstOrDefault(i18nGiftNameMap, giftName); + } + + public long getFreeGiftProgress() { + return mFreeGiftProgress; + } + + public void setFreeGiftProgress(long freeGiftProgress) { + mFreeGiftProgress = freeGiftProgress; + } + + + public boolean isEffectGift() { + if (getOtherViewType() == 1 && !TextUtils.isEmpty(getViewUrl())) { + return true; + } else if (isHasVggPic() && !StringUtil.isEmpty(getVggUrl())) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftKnapInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftKnapInfo.java new file mode 100644 index 0000000..d74ada8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftKnapInfo.java @@ -0,0 +1,63 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +/** + * Created by huangmeng1 on 2018/7/23. + */ +@Data +public class GiftKnapInfo { + /** + * uid : 90004036 + * giftId : 1085 + * count : 0 + * giftVo : {"giftId":1085,"giftName":ResUtil.getString(R.string.gift_bean_giftknapinfo_01),"goldPrice":1,"giftUrl":"http://img.letusmix.com/FrcGEq1BgYFFa6vzxygP1Sf9Bt9l?imageslim","nobleId":0,"nobleName":"","isNobleGift":false,"seqNo":20,"giftType":2,"hasVggPic":false,"vggUrl":"","hasLatest":false,"hasTimeLimit":false,"hasEffect":false,"isWholeServer":false,"isSkipRoom":false,"isSendMsg":false} + */ + + private int uid; + private int giftId; + private int count; + private GiftVoBean giftVo; + + @Data + public static class GiftVoBean { + /** + * giftId : 1085 + * giftName : 冰淇淋 + * goldPrice : 1 + * giftUrl : http://img.letusmix.com/FrcGEq1BgYFFa6vzxygP1Sf9Bt9l?imageslim + * nobleId : 0 + * nobleName : + * isNobleGift : false + * seqNo : 20 + * giftType : 2 + * hasVggPic : false + * vggUrl : + * hasLatest : false + * hasTimeLimit : false + * hasEffect : false + * isWholeServer : false + * isSkipRoom : false + * isSendMsg : false + */ + + private int giftId; + private String giftName; + private int goldPrice; + private String giftUrl; + private int nobleId; + private String nobleName; + private boolean isNobleGift; + private int seqNo; + private int giftType; + private boolean hasVggPic; + private String vggUrl; + private boolean hasLatest; + private boolean hasTimeLimit; + private boolean hasEffect; + private boolean isWholeServer; + private boolean isSkipRoom; + private boolean isSendMsg; + + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftList.java b/core/src/main/java/com/chwl/core/gift/bean/GiftList.java new file mode 100644 index 0000000..6a10d64 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftList.java @@ -0,0 +1,14 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class GiftList implements Serializable { +// private GiftInfo gift; + private int giftNum; + private int prizeLevel; + private int giftId; + private GiftInfo giftInfo; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java new file mode 100644 index 0000000..54b84ce --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftListInfo.java @@ -0,0 +1,28 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * Created by + * on 2017/8/5. + */ +@Data +public class GiftListInfo implements Serializable { +// private List luckyGift; // 拆分为 lucky bag 和 super luck + private List luckyBagGift; + private List countryGift; + private List superLuckyGift; + private List vipGift; + private List normalGift; + private List luckyPoolGift; + private List weekStarGift; + private List drawGift; + private List singlePopularGift; + private List cpGift; + private List customGift; + private List bravoGift; + private String giftVersion; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftLuckyBag.java b/core/src/main/java/com/chwl/core/gift/bean/GiftLuckyBag.java new file mode 100644 index 0000000..256382d --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftLuckyBag.java @@ -0,0 +1,5 @@ +package com.chwl.core.gift.bean; + +public class GiftLuckyBag { + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftMultiReceiverInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftMultiReceiverInfo.java new file mode 100644 index 0000000..5cf9310 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftMultiReceiverInfo.java @@ -0,0 +1,33 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.pay.bean.WalletInfo; +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * Created by + * on 2017/7/28. + */ +@Data +public class GiftMultiReceiverInfo implements Serializable { + private long uid; + private String nick; + private String avatar; + private List targetUsers; + private int giftId; + private int giftNum; + private int comboCount; + private GiftInfo gift; + private List displayGift; + private List giftValueVos; + private long currentTime; + private List luckyBagGifts; + private List targetUids; + private LuckyGiftList luckyGiftList; + private WalletInfo userPurse; + public boolean isMulti; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftPanelInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftPanelInfo.java new file mode 100644 index 0000000..44347f1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftPanelInfo.java @@ -0,0 +1,12 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +public class GiftPanelInfo implements Serializable { + public List tabList; + + public GiftListInfo giftTabMap; +// public Map giftTabMap; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftReceiveInfo.java b/core/src/main/java/com/chwl/core/gift/bean/GiftReceiveInfo.java new file mode 100644 index 0000000..e420ef5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftReceiveInfo.java @@ -0,0 +1,33 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * Created by + * on 2017/7/28. + */ +@Data +public class GiftReceiveInfo implements Serializable { + private long uid; + private long targetUid; + private int giftId; + private int giftNum; + private int comboCount; + private String targetNick; + private String targetAvatar; + private String nick; + private String avatar; + private GiftInfo gift; + private List luckyBagGifts; + private List displayGift; + //礼物值 + private List giftValueVos; + private long currentTime; + + private boolean isRoomAlbum; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftReceiver.java b/core/src/main/java/com/chwl/core/gift/bean/GiftReceiver.java new file mode 100644 index 0000000..3aeee13 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftReceiver.java @@ -0,0 +1,17 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/3/11 + */ +@Data +public class GiftReceiver implements Serializable { + private long uid; + private String nick; + private String avatar; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftSendType.java b/core/src/main/java/com/chwl/core/gift/bean/GiftSendType.java new file mode 100644 index 0000000..5152539 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftSendType.java @@ -0,0 +1,32 @@ +package com.chwl.core.gift.bean; + +/** + * 赠送类型 1给主播直接刷礼物,2私聊送个人礼物, + * 3房间内给坑位上的人送礼物,5.公聊大厅给人送礼物 + */ +public class GiftSendType { + + /** + * 赠送类型 -- 给主播直接刷礼物 + */ + public static final int TYPE_ANCHOR = 1; + + /** + * 赠送类型 -- 私聊送个人礼物 + */ + public static final int TYPE_PRIVATE_CHAT = 2; + + /** + * 赠送类型 -- 房间内给坑位上的人送礼物 + */ + public static final int TYPE_MIC = 3; + + /** + * 赠送类型 -- 公聊大厅给人送礼物 + */ + public static final int TYPE_PUBLIC_CHAT_HALL = 5; + /** + * 群聊送礼 + */ + public static final int TYPE_TEAM = 6; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftSource.java b/core/src/main/java/com/chwl/core/gift/bean/GiftSource.java new file mode 100644 index 0000000..2312950 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftSource.java @@ -0,0 +1,22 @@ +package com.chwl.core.gift.bean; + +/** + * 礼物的来源,1:普通,2:背包,3:师徒 + */ +public class GiftSource { + + /** + * 礼物来源 -- 普通 + */ + public static final int COMMON = 1; + + /** + * 礼物来源 -- 背包 + */ + public static final int BACKPACK = 2; + + /** + * 礼物来源 -- 师徒 + */ + public static final int MENTORING = 3; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftTab.java b/core/src/main/java/com/chwl/core/gift/bean/GiftTab.java new file mode 100644 index 0000000..e0761db --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftTab.java @@ -0,0 +1,28 @@ +package com.chwl.core.gift.bean; + +import android.view.View; + +import lombok.Data; + +/** + * 礼物的tab bean + * create by lvzebiao @2019/3/25 + */ +@Data +public class GiftTab { + + public GiftTab(int type, String unSelectedTitle, String selectedTitle) { + this.type = type; + this.unSelectedTitle = unSelectedTitle; + this.selectedTitle = selectedTitle; + } + + private int type; + + private String selectedTitle; + + private String unSelectedTitle; + + private View itemView; + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/GiftType.java b/core/src/main/java/com/chwl/core/gift/bean/GiftType.java new file mode 100644 index 0000000..639ac19 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/GiftType.java @@ -0,0 +1,73 @@ +package com.chwl.core.gift.bean; + +/** + * 礼物类型 1轻聊房,2游戏轰趴房,3福袋, 4套卡 + */ +public class GiftType { + + /** + * 礼物类型 -- 轻聊房 + */ + public static final int LIGHT_CHAT = 1; + + /** + * 礼物类型 -- 轰趴房 + */ + public static final int GIFT_TYPE_NORMAL = 2; + + /** + * 礼物类型 -- 福袋 + */ + public static final int GIFT_TYPE_LUCKY = 3; + + /** + * 礼物类型 -- 套卡 + */ + public static final int CARDS = 4; + + /** + * 礼物类型 -- VIP + */ + + public static final int GIFT_TYPE_VIP = 7; + + /** + * 礼物类型 -- 周星礼物 + */ + + public static final int GIFT_TYPE_WEEK_STAR = 8; + + public static final int GIFT_TYPE_DRAW_GIFT = 10; + + public static final int GIFT_TYPE_SINGLE_ROOM = 11; + + /** + * 超级幸运礼物 + */ + public static final int GIFT_TYPE_SUPER_LUCKY = 16; + + public static final int GIFT_TYPE_COUNTRY = 17; + + /** + * 幸运24礼物 - 支持连击 + */ + public static final int GIFT_TYPE_LUCKY_24 = 18; + /** + * cp礼物 - 支持连击 + */ + public static final int GIFT_TYPE_CP = 19; + + /** + * 定制礼物 - 支持连击 + */ + public static final int GIFT_TYPE_CUSTOM = 20; + + /** + * 超级幸运礼物礼物 - 支持连击 + */ + public static final int GIFT_TYPE_BRAVO = 21; + /** + * 幸运25礼物 - 支持连击 + */ + public static final int GIFT_TYPE_LUCKY_25 = 22; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGift.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGift.java new file mode 100644 index 0000000..0e8de28 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGift.java @@ -0,0 +1,14 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class LuckyBagGift { + public String giftName; + public String giftPic; + public int giftPrice; + public long giftId; + public int count; + public boolean isReView; + public boolean isSelect; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGifts.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGifts.java new file mode 100644 index 0000000..9bc249c --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGifts.java @@ -0,0 +1,39 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.bean.I18N; +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class LuckyBagGifts implements Serializable { + private List giftList; + private GiftReceiver user; + private String nick; + private String giftName; + private I18N i18nGiftNameMap; + private int giftNum; + private List displayGift; + private boolean isShowAnimation = true; + private String targetNick; + private long targetUid; + // private List targetUsers; + private List targetUids; + private long uid; + private int giftId; + private List giftValueVos; + private long currentTime; + private String luckyGiftSvgaUrl; + private LuckyGiftList luckyGiftList; + + public String getFirstGiftName() { + String name = I18N.getFirstOrDefault(i18nGiftNameMap, giftName); + if (name == null) { + return ""; + } + return name; + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGold.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGold.java new file mode 100644 index 0000000..b868a7e --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagGold.java @@ -0,0 +1,9 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class LuckyBagGold { + public int number; + public boolean isSelect; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyBagNoticeInfo.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagNoticeInfo.java new file mode 100644 index 0000000..df95ae8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagNoticeInfo.java @@ -0,0 +1,20 @@ +package com.chwl.core.gift.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class LuckyBagNoticeInfo implements Serializable { + private long roomUid; + private long uid; + private String nick; + private String luckyBagName; + private String giftName; + private String roomTitle; + private String goldPrice; + private String luckyBagGiftPic; + private String giftPic; + private int giftNum; + private long partitionId; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyBagNumber.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagNumber.java new file mode 100644 index 0000000..966d5ce --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagNumber.java @@ -0,0 +1,16 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class LuckyBagNumber { + public int type; + public int number; + public boolean isSelect; + + + public @interface Type{ + int time = 1; + int num = 2; + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyBagViewOthers.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagViewOthers.java new file mode 100644 index 0000000..441cf02 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyBagViewOthers.java @@ -0,0 +1,12 @@ +package com.chwl.core.gift.bean; + +public class LuckyBagViewOthers { + public long uid; + public String avatar; + public String nick; + public long time; + public String timeStr; + public String giftName; + public int giftNum; + public int goldNum; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftList.java b/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftList.java new file mode 100644 index 0000000..d830f42 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftList.java @@ -0,0 +1,12 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +import lombok.Data; + + +@Data +public class LuckyGiftList { + private List giftList; + private GiftReceiver user; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgAllBean.kt b/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgAllBean.kt new file mode 100644 index 0000000..dfaaa8b --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgAllBean.kt @@ -0,0 +1,14 @@ +package com.chwl.core.gift.bean + +import com.chwl.core.bean.I18N + +//{"data":{"times":"0","sender":{"avatar":"https://img.molistar.xyz/default_avatar_molistar.png", +// "erbanNo":6247036,"gender":1,"nick":"测试","uid":3232},"coins":"99", +// "giftNameMap":{"ar":"魔力水晶鞋","en":"魔力水晶鞋","zh":"魔力水晶鞋"}},"first":106,"second":1063} +data class LuckyGiftMsgAllBean( + var roomUid: Long = 0, + var sender: Sender? = null, + var giftNameMap: I18N?=null, + var times: Int = 0, + var coins: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgSelfBean.kt b/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgSelfBean.kt new file mode 100644 index 0000000..a366b4c --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/LuckyGiftMsgSelfBean.kt @@ -0,0 +1,10 @@ +package com.chwl.core.gift.bean + +//{"data":{"uid":3128,"times":"0","coins":"5","level":1,"roomUid":3133,"roomId":6066081032},"first":106,"second":1062} +data class LuckyGiftMsgSelfBean( + var roomUid: Long = 0, + var roomId: Long = 0, + var uid: Long = 0, + var times: Int = 0, + var level: Int = 0, + var coins: Int = 0) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/MsgConfirmEntity.java b/core/src/main/java/com/chwl/core/gift/bean/MsgConfirmEntity.java new file mode 100644 index 0000000..101d999 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MsgConfirmEntity.java @@ -0,0 +1,43 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class MsgConfirmEntity { + public String url; + public String title; + public int titleFontSize; + public String content; + public int contentFontSize; + public int layoutType; + List titleStyles; + List contentsStyles; + + + public @interface Type{ + int empty = 0; + int def = 1; + int confirm = 2; + int cancel = 3; + } + + public boolean isEmpty() { + return layoutType == Type.empty; + } + public boolean isDef() { + return layoutType == Type.def; + } + public boolean isConfirm() { + return layoutType == Type.confirm; + } + public boolean isCancel() {return layoutType == Type.cancel;} + + public String getConfirmUrl() { + return url+"confirmType=1"; + } + public String getCancelUrl() { + return url+"confirmType=0"; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/MsgConfirmStyleBean.java b/core/src/main/java/com/chwl/core/gift/bean/MsgConfirmStyleBean.java new file mode 100644 index 0000000..28689cf --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MsgConfirmStyleBean.java @@ -0,0 +1,11 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class MsgConfirmStyleBean { + public String content; + public int fontSize; + public String fontColor; + public boolean fontBold; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalChangeEntity.java b/core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalChangeEntity.java new file mode 100644 index 0000000..c643d2c --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalChangeEntity.java @@ -0,0 +1,11 @@ +package com.chwl.core.gift.bean; + +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class MsgCpRelationalChangeEntity { + + public int recordId; + public int relationNameType; + public long uid; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalNotifyEntity.java b/core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalNotifyEntity.java new file mode 100644 index 0000000..aa85b97 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MsgCpRelationalNotifyEntity.java @@ -0,0 +1,14 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class MsgCpRelationalNotifyEntity { + + public String loverAvatar; + public int relationNameType; + public String avatar; + public int status; // 1-同意 2-是拒绝 +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/MsgEventStartNotifyEntity.java b/core/src/main/java/com/chwl/core/gift/bean/MsgEventStartNotifyEntity.java new file mode 100644 index 0000000..2bf878a --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MsgEventStartNotifyEntity.java @@ -0,0 +1,32 @@ +package com.chwl.core.gift.bean; + +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class MsgEventStartNotifyEntity { + + //{ + // "first": 68, + // "second": 681, + // "data": { + // "nick": "mo", + // "uid":3456, + // "eventBanner": "eventBanner", + // "roomUid": 3456, + // "id": 5, + // "eventTopic": "eventTopic555555", + // "eventDetail": "eventDetail5555", + // "type": 1,//1-发送给粉丝,2-发送给自己 + // "roomErbanNO": 2222 + // } + //} + + public long roomErbanNO; + public int type; + public String eventDetail; + public String eventTopic; + public long roomUid; + public String eventBanner; + public long uid; + public String nick; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/MsgSuperLuckyGift.java b/core/src/main/java/com/chwl/core/gift/bean/MsgSuperLuckyGift.java new file mode 100644 index 0000000..e5f774e --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MsgSuperLuckyGift.java @@ -0,0 +1,6 @@ +package com.chwl.core.gift.bean; + +public class MsgSuperLuckyGift { + public LuckyGiftMsgSelfBean luckyGiftMsgSelfBean; + public LuckyGiftMsgAllBean luckyGiftMsgAllBean; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/MultiGiftReceiveInfo.java b/core/src/main/java/com/chwl/core/gift/bean/MultiGiftReceiveInfo.java new file mode 100644 index 0000000..45989ee --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/MultiGiftReceiveInfo.java @@ -0,0 +1,30 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * @author jjjj + * @date 2017/10/25 + */ +@Data +public class MultiGiftReceiveInfo implements Serializable { + private long uid; + private List targetUids; + private List targetUsers; + private int giftId; + private int giftNum; + private int comboCount; + private String nick; + private String avatar; + private GiftInfo gift; + //礼物值 + private List giftValueVos; + private long currentTime; + private List luckyBagGifts; + private List displayGift; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomBgChangeBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomBgChangeBean.java new file mode 100644 index 0000000..314c783 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomBgChangeBean.java @@ -0,0 +1,8 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class RoomBgChangeBean { + public String url; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomBgInfo.java b/core/src/main/java/com/chwl/core/gift/bean/RoomBgInfo.java new file mode 100644 index 0000000..48cf32e --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomBgInfo.java @@ -0,0 +1,29 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +public class RoomBgInfo { + + public int customHour; + public int customGoldPrice; + public List itemList; + + + public @interface Type{ + //类型 + int T_FREE = 0; // 0=免费 + int T_PAY = 1; // 1=付费 + int T_CUSTOM = 2; // 2=自定义 + + } + + public @interface Status{ + //状态 + int S_EXPIRED = -1; // -1=过期 + int S_REVIEW = 0; // 0=审核中 + int S_SUCCESS = 1; // 1=通过 + int S_REJECT = 2; // 2=不过审 + + } + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomBgInfoItem.java b/core/src/main/java/com/chwl/core/gift/bean/RoomBgInfoItem.java new file mode 100644 index 0000000..829944d --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomBgInfoItem.java @@ -0,0 +1,14 @@ +package com.chwl.core.gift.bean; + +public class RoomBgInfoItem { + + public int buyHour; //购买小时 + public int remainHour = -1; //剩余小时 + public int goldPrice; //价格 + public long id; //id + public int status; //状态 1=过期 0=审核中 1=通过 2=不过审 + public int type; //类型 0=免费 1=付费 2=自定义 + public boolean isCur; //使用 + public String url; + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomLevelChangeBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomLevelChangeBean.java new file mode 100644 index 0000000..b6b0ea6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomLevelChangeBean.java @@ -0,0 +1,9 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class RoomLevelChangeBean { + public String roomLevelIcon; + public int roomLevel; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomLevelInfo.java b/core/src/main/java/com/chwl/core/gift/bean/RoomLevelInfo.java new file mode 100644 index 0000000..cb76638 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomLevelInfo.java @@ -0,0 +1,29 @@ +package com.chwl.core.gift.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class RoomLevelInfo { + + public double currentLevelExp; + public int currentLevel; + public String currentLevelIcon; + + public List micEffects; + public List micSkins; + + public double nextLevelExp; + public int nextLevel; + public double roomVal; + public int usedMicEffectId; + public int usedMicSkinId; + + public int managerLimitNum; //管理员上限 + public int currentManagerNum; //当前管理员数量 + + public boolean hasUnique = false; //是否能切换 + + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomMicDress.java b/core/src/main/java/com/chwl/core/gift/bean/RoomMicDress.java new file mode 100644 index 0000000..d6a65a6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomMicDress.java @@ -0,0 +1,24 @@ +package com.chwl.core.gift.bean; + + +public class RoomMicDress { + public int id; + public int dressType; + public int normalRes; + public int selectRes; + public int reachLevel; + public String normalMicUrl; + public String normalMicLockUrl; + public String bossMicUrl; + public String bossMicLockUrl; + public String name; + public boolean isSelect; + + public @interface RoomDressType{ + int T_Skin = 1; + int T_Effects = 2 ; + int T_Type = 100 ; //特殊, 代表房间类型 + } + + +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java new file mode 100644 index 0000000..6fb679a --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomNotifyDialogBean.java @@ -0,0 +1,13 @@ +package com.chwl.core.gift.bean; + +public class RoomNotifyDialogBean { + public int first; + public int second; + public Object data; + + public RoomNotifyDialogBean(int first, int second, Object data) { + this.first = first; + this.second = second; + this.data = data; + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomPicScreenBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomPicScreenBean.java new file mode 100644 index 0000000..5f3b8cd --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomPicScreenBean.java @@ -0,0 +1,34 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.user.bean.UserInfo; + +import lombok.Data; + +@Data +public class RoomPicScreenBean { + public String picUrl; + + public boolean newUser; + + public long uid; + public String nick; + public String avatar; + + + public String charmUrl; + public String experUrl; + public String vipIcon; + + public String inRoomNameplateWord; + public String inRoomNameplatePic; + + public String androidBubbleUrl; + + + public int defUser; + public boolean isOfficial() { + return defUser == UserInfo.USER_TYPE_OFFICIAL; + } + + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomBean.java new file mode 100644 index 0000000..a20ff81 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomBean.java @@ -0,0 +1,74 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.user.bean.UserInfo; + +import java.util.List; + +import lombok.Data; + +@Data +public class RoomUserEnterRoomBean { + + public int screenType; + + public int fromType; + public long fromUid; + public String fromNick; + + public boolean enterHide; + public boolean newUser; + + public long uid; + public String avatar; + public String nick; + public String carName; + + public String charmUrl; + public String experUrl; + public String vipIcon; + + public String inRoomNameplateWord; + public String inRoomNameplatePic; + + public String androidBubbleUrl; + public String enterRoomEffects; + public int experLevelSeq; + + public List cpList; + + public int defUser; + public boolean isOfficial() { + return defUser == UserInfo.USER_TYPE_OFFICIAL; + } + + public int platformRole; + public boolean isSuperAdmin() { + return platformRole == 1; + } + + public boolean isInRoom(){ + return screenType != ScreenType.cpUpMic; + } + + public boolean isDef() { + return screenType == ScreenType.def; + } + + public boolean isCpInRoom() { + return screenType == ScreenType.cpInRoom; + } + public boolean isCpUpMic() { + return screenType == ScreenType.cpUpMic; + } + + //本地字段,逐条显示 cp公屏用的 + public String cpNick; + public int cpLevel; + + + public @interface ScreenType { + int def = 1;// 1 = 普通公屏进房 + int cpInRoom = 2;// 2 = cp 公屏进房 + int cpUpMic = 3;// 3 = cp上麦公屏 + } +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomCpBean.java b/core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomCpBean.java new file mode 100644 index 0000000..52024b4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/RoomUserEnterRoomCpBean.java @@ -0,0 +1,15 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.user.bean.UserInfo; + +import lombok.Data; + +@Data +public class RoomUserEnterRoomCpBean { + + public String cpAvatar; + public long cpErbanNo; + public int cpLevel; + public String cpNick; + public long cpUid; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/SendGiftScenes.java b/core/src/main/java/com/chwl/core/gift/bean/SendGiftScenes.java new file mode 100644 index 0000000..508e511 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/SendGiftScenes.java @@ -0,0 +1,22 @@ +package com.chwl.core.gift.bean; + +/** + * 列举送礼物使用的场景 + */ +public class SendGiftScenes { + + /** + * 房间 + */ + public static final int SCENE_ROOM = 1; + + /** + * 私聊 + */ + public static final int SCENE_PRIVATE_CHAT = 2; + + /** + * 公聊大厅 + */ + public static final int SCENE_PUBLIC_CHAT_HALL = 3; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/Sender.java b/core/src/main/java/com/chwl/core/gift/bean/Sender.java new file mode 100644 index 0000000..3c7995a --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/Sender.java @@ -0,0 +1,9 @@ +package com.chwl.core.gift.bean; + +public class Sender { + public String avatar; + public String nick; + public long erbanNo; + public long uid; + public int gender; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/ShowAvatarType.java b/core/src/main/java/com/chwl/core/gift/bean/ShowAvatarType.java new file mode 100644 index 0000000..4ed5357 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/ShowAvatarType.java @@ -0,0 +1,8 @@ +package com.chwl.core.gift.bean; + +public @interface ShowAvatarType { + int def = 0; + int send = 1; + int recv = 2; + int sendRecv = 3; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/SimpleUserInfo.kt b/core/src/main/java/com/chwl/core/gift/bean/SimpleUserInfo.kt new file mode 100644 index 0000000..abea576 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/SimpleUserInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.gift.bean + +import java.io.Serializable + +data class SimpleUserInfo( + val nick: String = "", + val uid: Long = 0L, + val erbanNo: Long = 0L, + val avatar: String = "", + val userDesc: String = "" +) : Serializable diff --git a/core/src/main/java/com/chwl/core/gift/bean/SimpleVipInfo.java b/core/src/main/java/com/chwl/core/gift/bean/SimpleVipInfo.java new file mode 100644 index 0000000..30ce547 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/SimpleVipInfo.java @@ -0,0 +1,10 @@ +package com.chwl.core.gift.bean; + +import lombok.Data; + +@Data +public class SimpleVipInfo { + private String vipIcon; + private String vipName; + private int vipLevel; +} diff --git a/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java b/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java new file mode 100644 index 0000000..7920836 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/bean/TagsInfo.java @@ -0,0 +1,47 @@ +package com.chwl.core.gift.bean; + +import com.chwl.core.bean.I18N; + +import java.io.Serializable; + +public class TagsInfo implements Serializable { + private I18N nameMap; + + public String tagName() { + return I18N.getFirstOrDefault(nameMap, ""); + } + + // 排序 + private int seq; + + // 对应的礼物分类 + private String key; + + private GiftType giftType; + public int tagGiftType() { + if ("normalGift".equals(key)) { + return GiftType.GIFT_TYPE_NORMAL; + } else if ("luckyBagGift".equals(key)) { + return GiftType.GIFT_TYPE_LUCKY; + } else if ("superLuckyGift".equals(key)) { + return GiftType.GIFT_TYPE_SUPER_LUCKY; + } else if ("vipGift".equals(key)) { + return GiftType.GIFT_TYPE_VIP; + } else if ("weekStarGift".equals(key)) { + return GiftType.GIFT_TYPE_WEEK_STAR; + } else if ("countryGift".equals(key)) { + return GiftType.GIFT_TYPE_COUNTRY; + } else if ("singlePopularGift".equals(key)) { + return GiftType.GIFT_TYPE_SINGLE_ROOM; + } else if ("cpGift".equals(key)) { + return GiftType.GIFT_TYPE_CP; + }else if ("customGift".equals(key)) { + return GiftType.GIFT_TYPE_CUSTOM; + }else if ("bravoGift".equals(key)) { + return GiftType.GIFT_TYPE_BRAVO; + } + + + return 0; + } +} diff --git a/core/src/main/java/com/chwl/core/gift/event/GiftComboEvent.java b/core/src/main/java/com/chwl/core/gift/event/GiftComboEvent.java new file mode 100644 index 0000000..a504656 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/GiftComboEvent.java @@ -0,0 +1,58 @@ +package com.chwl.core.gift.event; + +import lombok.Data; + +//处理 礼物联机相关消息 +@Data +public class GiftComboEvent { + private int action ; + + private int giftNumber; //礼物数量 + + private int giftPrice; + + public int getGiftPrice() { + return giftPrice; + } + + public void setGiftPrice(int giftPrice) { + this.giftPrice = giftPrice; + } + + public int getGiftNumber() { + return giftNumber; + } + + public void setGiftNumber(int giftNumber) { + this.giftNumber = giftNumber; + } + + public GiftComboEvent() { + } + + public GiftComboEvent(int action) { + this.action = action; + } + + public int getAction() { + return action; + } + + public void setAction(int action) { + this.action = action; + } + + public @interface Action{ + int ACT_GIFT_BEGIN = 1; //准备送礼 + int ACT_GIFT_SEND_SUCCESS = 2; //送礼完毕 显示连击按钮 + int ACT_GIFT_COMBO_START = 3; // 连击按钮点击 发送礼物 + int ACT_GIFT_DIALOG_SHOW = 4; // 连击按钮消失 通知显示礼物弹窗 + int ACT_GIFT_COMBO_CANCEL = 5; // 连击按钮消失 送礼失败 + int ACT_GIFT_POINT = 6; // 定位 送礼动画初始点 + int ACT_GIFT_DIALOG_DISMISS = 7; // 关闭礼物弹窗 + + int ACT_GIFT_COIN_TIPS = 8; // 展示送礼扣除的金币 + + + } +} diff --git a/core/src/main/java/com/chwl/core/gift/event/HideCarEffectEvent.java b/core/src/main/java/com/chwl/core/gift/event/HideCarEffectEvent.java new file mode 100644 index 0000000..d69eedb --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/HideCarEffectEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.gift.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class HideCarEffectEvent { + private boolean isHide; +} diff --git a/core/src/main/java/com/chwl/core/gift/event/NotifyEvent.java b/core/src/main/java/com/chwl/core/gift/event/NotifyEvent.java new file mode 100644 index 0000000..d3dd265 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/NotifyEvent.java @@ -0,0 +1,33 @@ +package com.chwl.core.gift.event; + +import lombok.Data; + +//处理通用消息 公屏推送 相关消息,如 boom飘屏点击事件 +@Data +public class NotifyEvent { + + private int action ; + private Object data; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public int getAction() { + return action; + } + + public void setAction(int action) { + this.action = action; + } + + public @interface Action{ + int ACT_BAI_SHUN_GAME = 1; // 遊戲橫幅被點擊 + int ACT_ONLINE_USER_CARD_DIALOG = 2; // 在线列表弹起用户弹窗 + + } +} diff --git a/core/src/main/java/com/chwl/core/gift/event/RoomFreeGiftEvent.java b/core/src/main/java/com/chwl/core/gift/event/RoomFreeGiftEvent.java new file mode 100644 index 0000000..361d983 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/RoomFreeGiftEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.gift.event; + +import com.chwl.core.gift.bean.GiftFreeInfo; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 免費禮物彈窗事件 + * Created by wushaocheng on 2022/12/14. + */ +@AllArgsConstructor +@Data +public class RoomFreeGiftEvent { + + private GiftFreeInfo giftFreeInfo; + +} diff --git a/core/src/main/java/com/chwl/core/gift/event/UpdateKnapEvent.java b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapEvent.java new file mode 100644 index 0000000..60d6daa --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.gift.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 更新背包礼物事件 + * Created by lvzebiao on 2018/11/20. + */ +@AllArgsConstructor +@Data +public class UpdateKnapEvent { + + private int giftId; + + private int sendNumber; + +} diff --git a/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftDataEvent.java b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftDataEvent.java new file mode 100644 index 0000000..5e99f2d --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftDataEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.gift.event; + +import com.chwl.core.im.custom.bean.RoomFreeGiftMsgBean; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 更新背包免费礼物事件 + * Created by wushaocheng on 2022/12/14. + */ +@AllArgsConstructor +@Data +public class UpdateKnapFreeGiftDataEvent { + + private RoomFreeGiftMsgBean roomFreeGiftMsgBean; + +} diff --git a/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftEvent.java b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftEvent.java new file mode 100644 index 0000000..df404fe --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.gift.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 更新背包免费礼物事件 + * Created by wushaocheng on 2022/12/14. + */ +@AllArgsConstructor +@Data +public class UpdateKnapFreeGiftEvent { + + private int giftId; + + private long progress; + +} diff --git a/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftNumEvent.java b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftNumEvent.java new file mode 100644 index 0000000..3c8d93a --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/event/UpdateKnapFreeGiftNumEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.gift.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 更新背包免费礼物事件 + * Created by wushaocheng on 2022/12/14. + */ +@AllArgsConstructor +@Data +public class UpdateKnapFreeGiftNumEvent { + + private int giftId; + + private boolean isReset; + +} diff --git a/core/src/main/java/com/chwl/core/gift/exception/GiftOutOfDateException.java b/core/src/main/java/com/chwl/core/gift/exception/GiftOutOfDateException.java new file mode 100644 index 0000000..857fb49 --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/exception/GiftOutOfDateException.java @@ -0,0 +1,15 @@ +package com.chwl.core.gift.exception; + +/** + * 礼物过期 + * Created by yudi + * on 2018/3/15. + */ + +public class GiftOutOfDateException extends Throwable { + public final static int code = 8000; + + public GiftOutOfDateException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/gift/toolbox/GiftToolbox.java b/core/src/main/java/com/chwl/core/gift/toolbox/GiftToolbox.java new file mode 100644 index 0000000..00c635f --- /dev/null +++ b/core/src/main/java/com/chwl/core/gift/toolbox/GiftToolbox.java @@ -0,0 +1,689 @@ +package com.chwl.core.gift.toolbox; + +import android.text.TextUtils; + +import com.alibaba.fastjson2.JSON; +import com.chwl.core.BuildConfig; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.GiftModel; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.bean.GiftReceiver; +import com.chwl.core.gift.bean.GiftType; +import com.chwl.core.gift.bean.LuckyBagGifts; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.DrawGiftAttachment; +import com.chwl.core.im.custom.bean.GiftAttachment; +import com.chwl.core.im.custom.bean.GiftBatchAttachment; +import com.chwl.core.im.custom.bean.MultiGiftAttachment; +import com.chwl.core.im.custom.bean.MultiLuckyGiftAttachment; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.retry.ImRetryManager; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.utils.ListUtils; +import com.google.gson.Gson; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.CustomMessageConfig; +import com.netease.nimlib.sdk.msg.model.IMMessage; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.functions.BiFunction; +import io.reactivex.functions.Consumer; + +/** + * @author jack + * @Description + * @Date 2019/3/8 + */ +public class GiftToolbox { + + //单人礼物公屏 + public static final int CUSTOM_MSG_HEADER_TYPE_GIFT = 3; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_GIFT = 31; //普通单人送礼公屏 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT = 33;//单人福袋送礼公屏 + //多人礼物公屏 + public static final int CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT = 12; + //普通 + public static final int CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT = 123;// 普通多人 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT = 121;//普通全麦 + //福袋 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT = 124;// 福袋多人 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT = 122;// 福袋全麦 + /** + * 收到普通礼物 + */ + public static final int RECEIVE_NORMALE_GIFT = 34; + /** + * 收到普通全麦礼物 + */ + public static final int RECEIVE_ALL_MIC__NORMALEI_GIFT = 35; + /** + * 收到普通多人礼物 + */ + public static final int RECEIVE_MUTLT_NORMALEI_GIFT = 53; + /** + * 收到个人福袋礼物 + */ + public static final int RECEIVE_LUCKY_GIFT = 61; + /** + * 收到多人福袋礼物 + */ + public static final int RECEIVE_MULTI_LUCKY_GIFT = 62; + /** + * 收到全麦福袋礼物 + */ + public static final int RECEIVE_ALL_MIC_LUCKY_GIFT = 64; + + public static MultiGiftReceiveInfo transformToMultiGiftReceiveInfo(GiftMultiReceiverInfo giftMultiReceiverInfo) { + MultiGiftReceiveInfo giftReceiveInfo = new MultiGiftReceiveInfo(); + giftReceiveInfo.setUid(giftMultiReceiverInfo.getUid()); + giftReceiveInfo.setAvatar(giftMultiReceiverInfo.getAvatar()); + giftReceiveInfo.setNick(giftMultiReceiverInfo.getNick()); + giftReceiveInfo.setGiftId(giftMultiReceiverInfo.getGiftId()); + giftReceiveInfo.setGiftNum(giftMultiReceiverInfo.getGiftNum()); + giftReceiveInfo.setGift(giftMultiReceiverInfo.getGift()); + giftReceiveInfo.setLuckyBagGifts(giftMultiReceiverInfo.getLuckyBagGifts()); + giftReceiveInfo.setDisplayGift(giftMultiReceiverInfo.getDisplayGift()); + giftReceiveInfo.setTargetUsers(giftMultiReceiverInfo.getTargetUsers()); + List targetUids = new ArrayList<>(); + for (GiftReceiver targetUser : giftMultiReceiverInfo.getTargetUsers()) { + targetUids.add(targetUser.getUid()); + } + giftReceiveInfo.setTargetUids(targetUids); + //礼物值 + giftReceiveInfo.setGiftValueVos(giftMultiReceiverInfo.getGiftValueVos()); + giftReceiveInfo.setCurrentTime(giftMultiReceiverInfo.getCurrentTime()); + giftReceiveInfo.setComboCount(giftMultiReceiverInfo.getComboCount()); + return giftReceiveInfo; + } + + public static GiftMultiReceiverInfo transformToGiftMultiReceiverInfo(MultiGiftReceiveInfo multiGiftReceiveInfo) { + GiftMultiReceiverInfo giftMultiReceiverInfo = new GiftMultiReceiverInfo(); + try { + giftMultiReceiverInfo.setUid(multiGiftReceiveInfo.getUid()); + giftMultiReceiverInfo.setAvatar(multiGiftReceiveInfo.getAvatar()); + giftMultiReceiverInfo.setNick(multiGiftReceiveInfo.getNick()); + giftMultiReceiverInfo.setGiftId(multiGiftReceiveInfo.getGiftId()); + giftMultiReceiverInfo.setGiftNum(multiGiftReceiveInfo.getGiftNum()); + giftMultiReceiverInfo.setGift(multiGiftReceiveInfo.getGift()); + giftMultiReceiverInfo.setLuckyBagGifts(multiGiftReceiveInfo.getLuckyBagGifts()); + giftMultiReceiverInfo.setDisplayGift(multiGiftReceiveInfo.getDisplayGift()); + giftMultiReceiverInfo.setTargetUsers(multiGiftReceiveInfo.getTargetUsers()); + List targetUids = new ArrayList<>(); + if (multiGiftReceiveInfo.getTargetUsers() != null){ + for (GiftReceiver targetUser : multiGiftReceiveInfo.getTargetUsers()) { + targetUids.add(targetUser.getUid()); + } + }else { + if (multiGiftReceiveInfo.getTargetUids() != null) { + targetUids.addAll(multiGiftReceiveInfo.getTargetUids()); + } + } + giftMultiReceiverInfo.setTargetUids(targetUids); + //礼物值 + giftMultiReceiverInfo.setGiftValueVos(multiGiftReceiveInfo.getGiftValueVos()); + giftMultiReceiverInfo.setCurrentTime(multiGiftReceiveInfo.getCurrentTime()); + giftMultiReceiverInfo.setComboCount(multiGiftReceiveInfo.getComboCount()); + } catch (Exception e) { + LogUtil.e( "ComboError : "+e.getMessage()); + } + return giftMultiReceiverInfo; + } + + // 只用在给 礼物连击横幅那 + public static GiftMultiReceiverInfo transformToGiftMultiReceiverInfo(GiftReceiveInfo giftReceiveInfo) { + GiftMultiReceiverInfo giftMultiReceiverInfo = new GiftMultiReceiverInfo(); + try { + giftMultiReceiverInfo.setUid(giftReceiveInfo.getUid()); + giftMultiReceiverInfo.setNick(giftReceiveInfo.getNick()); + giftMultiReceiverInfo.setAvatar(giftReceiveInfo.getAvatar()); + giftMultiReceiverInfo.setGift(giftReceiveInfo.getGift()); + giftMultiReceiverInfo.setGiftId(giftReceiveInfo.getGiftId()); + giftMultiReceiverInfo.setGiftNum(giftReceiveInfo.getGiftNum()); + giftMultiReceiverInfo.setLuckyBagGifts(giftReceiveInfo.getLuckyBagGifts()); + giftMultiReceiverInfo.setDisplayGift(giftReceiveInfo.getDisplayGift()); + giftMultiReceiverInfo.setComboCount(giftReceiveInfo.getComboCount()); + List targetUsers = new ArrayList<>(); + GiftReceiver receiver = new GiftReceiver(); + receiver.setUid(giftReceiveInfo.getTargetUid()); + receiver.setNick(giftReceiveInfo.getTargetNick()); + receiver.setAvatar(giftReceiveInfo.getTargetAvatar()); + targetUsers.add(receiver); + giftMultiReceiverInfo.setTargetUsers(targetUsers); + } catch (Exception e) { + LogUtil.e( "ComboError : "+e.getMessage()); + } + return giftMultiReceiverInfo; + } + + public static GiftReceiveInfo transformToGiftReceiveInfo(GiftMultiReceiverInfo giftMultiReceiverInfo) { + GiftReceiver giftReceiver = giftMultiReceiverInfo.getTargetUsers().get(0); + + GiftReceiveInfo giftReceiveInfo = new GiftReceiveInfo(); + giftReceiveInfo.setUid(giftMultiReceiverInfo.getUid()); + giftReceiveInfo.setNick(giftMultiReceiverInfo.getNick()); + giftReceiveInfo.setAvatar(giftMultiReceiverInfo.getAvatar()); + giftReceiveInfo.setGiftId(giftMultiReceiverInfo.getGiftId()); + giftReceiveInfo.setGiftNum(giftMultiReceiverInfo.getGiftNum()); + giftReceiveInfo.setGift(giftMultiReceiverInfo.getGift()); + giftReceiveInfo.setTargetUid(giftReceiver.getUid()); + giftReceiveInfo.setTargetNick(giftReceiver.getNick()); + giftReceiveInfo.setTargetAvatar(giftReceiver.getAvatar()); + //礼物值 + giftReceiveInfo.setLuckyBagGifts(giftMultiReceiverInfo.getLuckyBagGifts()); + giftReceiveInfo.setDisplayGift(giftMultiReceiverInfo.getDisplayGift()); + giftReceiveInfo.setGiftValueVos(giftMultiReceiverInfo.getGiftValueVos()); + giftReceiveInfo.setCurrentTime(giftMultiReceiverInfo.getCurrentTime()); + giftReceiveInfo.setComboCount(giftMultiReceiverInfo.getComboCount()); + return giftReceiveInfo; + } + + public static List transformToGiftReceiveInfoList(GiftMultiReceiverInfo giftMultiReceiverInfo) { + List data = new ArrayList<>(); + for (int i = 0; i < giftMultiReceiverInfo.getTargetUsers().size(); i++) { + GiftReceiver giftReceiver = giftMultiReceiverInfo.getTargetUsers().get(i); + + GiftReceiveInfo giftReceiveInfo = new GiftReceiveInfo(); + giftReceiveInfo.setUid(giftMultiReceiverInfo.getUid()); + giftReceiveInfo.setNick(giftMultiReceiverInfo.getNick()); + giftReceiveInfo.setAvatar(giftMultiReceiverInfo.getAvatar()); + giftReceiveInfo.setGiftId(giftMultiReceiverInfo.getGiftId()); + giftReceiveInfo.setGiftNum(giftMultiReceiverInfo.getGiftNum()); + giftReceiveInfo.setGift(giftMultiReceiverInfo.getGift()); + giftReceiveInfo.setTargetUid(giftReceiver.getUid()); + giftReceiveInfo.setTargetNick(giftReceiver.getNick()); + giftReceiveInfo.setTargetAvatar(giftReceiver.getAvatar()); + //礼物值 + giftReceiveInfo.setLuckyBagGifts(giftMultiReceiverInfo.getLuckyBagGifts()); + giftReceiveInfo.setDisplayGift(giftMultiReceiverInfo.getDisplayGift()); + giftReceiveInfo.setGiftValueVos(giftMultiReceiverInfo.getGiftValueVos()); + giftReceiveInfo.setCurrentTime(giftMultiReceiverInfo.getCurrentTime()); + giftReceiveInfo.setComboCount(giftMultiReceiverInfo.getComboCount()); + data.add(giftReceiveInfo); + } + return data; + } + + public static List transformToGiftReceiveInfoList(MultiGiftReceiveInfo multiGiftReceiveInfo) { + List data = new ArrayList<>(); + for (int i = 0; i < multiGiftReceiveInfo.getTargetUsers().size(); i++) { + GiftReceiver giftReceiver = multiGiftReceiveInfo.getTargetUsers().get(i); + + GiftReceiveInfo giftReceiveInfo = new GiftReceiveInfo(); + giftReceiveInfo.setUid(multiGiftReceiveInfo.getUid()); + giftReceiveInfo.setNick(multiGiftReceiveInfo.getNick()); + giftReceiveInfo.setAvatar(multiGiftReceiveInfo.getAvatar()); + giftReceiveInfo.setGiftId(multiGiftReceiveInfo.getGiftId()); + giftReceiveInfo.setGiftNum(multiGiftReceiveInfo.getGiftNum()); + giftReceiveInfo.setGift(multiGiftReceiveInfo.getGift()); + giftReceiveInfo.setTargetUid(giftReceiver.getUid()); + giftReceiveInfo.setTargetNick(giftReceiver.getNick()); + giftReceiveInfo.setTargetAvatar(giftReceiver.getAvatar()); + //礼物值 + giftReceiveInfo.setLuckyBagGifts(multiGiftReceiveInfo.getLuckyBagGifts()); + giftReceiveInfo.setDisplayGift(multiGiftReceiveInfo.getDisplayGift()); + giftReceiveInfo.setGiftValueVos(multiGiftReceiveInfo.getGiftValueVos()); + giftReceiveInfo.setCurrentTime(multiGiftReceiveInfo.getCurrentTime()); + giftReceiveInfo.setComboCount(multiGiftReceiveInfo.getComboCount()); + data.add(giftReceiveInfo); + } + return data; + } + + + + /** + * 转换 ServiceResult 成 ServiceResult + */ + public static ServiceResult multiToSingleGiftReceiveInfoResult( + ServiceResult multiResult) { + ServiceResult singleResult = new ServiceResult<>(); + singleResult.setCode(multiResult.getCode()); + singleResult.setMessage(multiResult.getMessage()); + GiftMultiReceiverInfo multiInfo = multiResult.getData(); + if (multiInfo != null) { + GiftReceiveInfo singleInfo = new GiftReceiveInfo(); + singleResult.setData(singleInfo); + + singleInfo.setUid(multiInfo.getUid()); + singleInfo.setGiftId(multiInfo.getGiftId()); + singleInfo.setGiftNum(multiInfo.getGiftNum()); + singleInfo.setNick(multiInfo.getNick()); + singleInfo.setAvatar(multiInfo.getAvatar()); + singleInfo.setGift(multiInfo.getGift()); + if (!ListUtils.isListEmpty(multiInfo.getTargetUsers())) { + GiftReceiver receiver = multiInfo.getTargetUsers().get(0); + singleInfo.setTargetUid(receiver.getUid()); + singleInfo.setTargetNick(receiver.getNick()); + singleInfo.setTargetAvatar(receiver.getAvatar()); + } + } + return singleResult; + } + + + /** + * 发送涂鸦礼物特效消息 + */ + public static void sendDrawGiftRoomMessage(int giftId, List> drawFixedArray) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + DrawGiftAttachment giftAttachment = new DrawGiftAttachment( + CustomAttachment.CUSTOM_MSG_DRAW_GIFT_EFFECT, + CustomAttachment.CUSTOM_MSG_SUB_TYPE_DRAW_GIFT_EFFECT + ); + giftAttachment.setGiftId(giftId); + giftAttachment.setDrawFixedArray(drawFixedArray); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + giftAttachment + ); + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(message); + OtherExtKt.doLog("礼物msgJson 发送涂鸦礼物特效消息 = "+msgJson); + } + + ImRetryManager.sendRoomGiftMsg(message) + .doOnSuccess(retryChatRoomMessage -> { + // 送礼物的人自己的涂鸦特效 + IMNetEaseManager.get().noticeRoomEvent(message, RoomEvent.DRAW_GIFT_EFFECT); + }) + .subscribe(); + } + + + /** + * 公屏发普通礼物消息 + * + * @param giftReceiveInfo + */ + public static void sendGiftRoomMessage(GiftReceiveInfo giftReceiveInfo) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null || giftReceiveInfo == null) return; + long myUid = AuthModel.get().getCurrentUid(); + GiftAttachment giftAttachment = new GiftAttachment(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT, CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_GIFT); + giftAttachment.setUid(myUid + ""); + giftAttachment.setGiftReceiveInfo(giftReceiveInfo); + int giftId = giftReceiveInfo.getGiftId(); + GiftInfo giftInfo = GiftModel.get().findGiftInfoById(giftId); + if (giftInfo == null || TextUtils.isEmpty(giftInfo.getGiftUrl())) { + giftInfo = giftReceiveInfo.getGift(); + } + giftReceiveInfo.setGift(giftInfo); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + giftAttachment + ); + + LogUtil.print("roomId:" + roomInfo.getRoomId()); + + LogUtil.print("message sessionID:" + message.getSessionId()); + + LogUtil.print("single send gift"); + + int giftType = giftInfo.getGiftType(); + + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(message); + OtherExtKt.doLog("礼物msgJson 公屏发普通礼物消息 = "+msgJson); + } + + ImRetryManager.sendRoomGiftMsg(message) + .doOnSuccess(retryChatRoomMessage -> { + // 发送礼物成功的回调,显示动画 + GiftModel.get().onSendRoomMessageSuccess(message); + if (giftType != GiftType.GIFT_TYPE_SUPER_LUCKY) { + // 插入到公屏上 + IMNetEaseManager.get().addMessagesImmediately(message); + } + }) + .subscribe(); + + } + + + /** + * 发送个多人送普通礼物的消息到公屏 + * + * @param data + */ + public static void sendMultiGiftRoomMessage(GiftMultiReceiverInfo data) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && data != null) { + GiftMultiReceiverInfo tmpData = new Gson().fromJson(new Gson().toJson(data), GiftMultiReceiverInfo.class); + + int giftId = tmpData.getGiftId(); + GiftInfo giftInfo = GiftModel.get().findGiftInfoById(giftId); + if (giftInfo == null || TextUtils.isEmpty(giftInfo.getGiftUrl())) { + giftInfo = tmpData.getGift(); + } + tmpData.setGift(giftInfo); + + /** + * 判断 gift 是不是 嵌套头像礼物, 是的话 特殊处理 + */ + if (tmpData.getGift() != null && tmpData.getGift().getShowAvatarType() != 0) { + List giftReceiveInfos = transformToGiftReceiveInfoList(tmpData); + sendAvatarGiftRoomMessage(giftReceiveInfos); + return; + } + + //这里去掉收礼物人的头像字段,减少容量 + List targetUids = new ArrayList<>(); + for (GiftReceiver targetUser : tmpData.getTargetUsers()) { + targetUser.setAvatar(null); + targetUids.add(targetUser.getUid()); + } + //兼容旧版PK模式和iOS + tmpData.setTargetUids(targetUids); + + GiftBatchAttachment giftBatchAttachment = new GiftBatchAttachment(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT, CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT); + giftBatchAttachment.setGiftMultiReceiverInfo(tmpData); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + giftBatchAttachment + ); + + LogUtil.print("multi send gift"); + + int giftType = giftInfo.getGiftType(); + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(message); + OtherExtKt.doLog("礼物msgJson 发送个多人送普通礼物的消息到公屏 = "+msgJson); + } + + ImRetryManager.sendRoomGiftMsg(message) + .doOnSuccess(retryChatRoomMessage -> { + // 发送礼物成功的回调,显示动画 + GiftModel.get().onSendRoomMessageSuccess(message); + if (giftType != GiftType.GIFT_TYPE_SUPER_LUCKY) { + // 插入到公屏上 + IMNetEaseManager.get().addMessagesImmediately(message); + } + }) + .subscribe(); + + } + } + + /** + * 发送全麦普通礼物的公屏消息 + * + * @param giftReceiveInfo + */ + public static void sendAllMicGiftRoomMessage(MultiGiftReceiveInfo giftReceiveInfo) { + + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && giftReceiveInfo != null) { + + + int giftId = giftReceiveInfo.getGiftId(); + GiftInfo giftInfo = GiftModel.get().findGiftInfoById(giftId); + if (giftInfo == null || TextUtils.isEmpty(giftInfo.getGiftUrl())) { + giftInfo = giftReceiveInfo.getGift(); + } + giftReceiveInfo.setGift(giftInfo); + + /** + * 判断 gift 是不是 嵌套头像礼物, 是的话 特殊处理 + */ + if (giftReceiveInfo.getGift() != null && giftReceiveInfo.getGift().getShowAvatarType() != 0) { + List giftReceiveInfos = transformToGiftReceiveInfoList(giftReceiveInfo); + sendAvatarGiftRoomMessage(giftReceiveInfos); + return; + } + + + MultiGiftAttachment giftAttachment = new MultiGiftAttachment(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT, CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT); + giftAttachment.setMultiGiftAttachment(giftReceiveInfo); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + giftAttachment + ); + + LogUtil.print("all mic send gift"); + + int giftType = giftInfo.getGiftType(); + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(message); + OtherExtKt.doLog("礼物msgJson 发送全麦普通礼物的公屏消息 = "+msgJson); + } + + ImRetryManager.sendRoomGiftMsg(message) + .doOnSuccess(retryChatRoomMessage -> { + // 发送礼物成功的回调,显示动画 + GiftModel.get().onSendRoomMessageSuccess(message); + if (giftType != GiftType.GIFT_TYPE_SUPER_LUCKY) { + // 插入到公屏上 + IMNetEaseManager.get().addMessagesImmediately(message); + } + }) + .subscribe(); + } + } + + /** + * 发送 嵌套头像礼物 + */ + public static void sendAvatarGiftRoomMessage(List giftReceiveInfo) { + Observable dataObservable = Observable.fromIterable(giftReceiveInfo); + Observable timeObservable = Observable.interval(300,TimeUnit.MILLISECONDS); + Observable.zip(dataObservable, timeObservable, new BiFunction() { + @Override + public Object apply(GiftReceiveInfo giftReceiveInfo, Long aLong) throws Exception { + return giftReceiveInfo; + } + }) + .doOnNext(new Consumer() { + @Override + public void accept(Object data) throws Exception { + if (data instanceof GiftReceiveInfo){ + sendGiftRoomMessage((GiftReceiveInfo) data); + } + } + }) + .subscribe(); + } + + + /** + * 发送单人送福袋礼物的消息到公屏 + * + * @param giftReceiveInfo + */ + public static void sendLuckyGiftRoomMessage(GiftMultiReceiverInfo giftReceiveInfo, int first, int second) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && giftReceiveInfo != null) { + + for (int i = 0; i < giftReceiveInfo.getLuckyBagGifts().size(); i++) { + LuckyBagGifts luckyBagGifts = giftReceiveInfo.getLuckyBagGifts().get(i); + luckyBagGifts.setShowAnimation(i == 0); + luckyBagGifts.setNick(giftReceiveInfo.getNick()); + luckyBagGifts.setLuckyGiftSvgaUrl(giftReceiveInfo.getGift().getLuckyGiftSvgaUrl()); + luckyBagGifts.setDisplayGift(giftReceiveInfo.getDisplayGift()); + luckyBagGifts.setGiftName(giftReceiveInfo.getGift().getGiftName()); + luckyBagGifts.setI18nGiftNameMap(giftReceiveInfo.getGift().getI18nGiftNameMap()); + luckyBagGifts.setGiftNum(giftReceiveInfo.getGiftNum()); + luckyBagGifts.setTargetNick(giftReceiveInfo.getTargetUsers().get(0).getNick()); + luckyBagGifts.setTargetUid(giftReceiveInfo.getTargetUsers().get(0).getUid()); + List targetUids = new ArrayList<>(); + for (GiftReceiver targetUser : giftReceiveInfo.getTargetUsers()) { + targetUids.add(targetUser.getUid()); + } + luckyBagGifts.setTargetUids(targetUids); + luckyBagGifts.setGiftValueVos(giftReceiveInfo.getGiftValueVos()); + luckyBagGifts.setCurrentTime(giftReceiveInfo.getCurrentTime()); + luckyBagGifts.setUid(giftReceiveInfo.getUid()); + luckyBagGifts.setGiftId(giftReceiveInfo.getGiftId()); + //这里去掉收礼物人的头像字段,减少容量 + MultiLuckyGiftAttachment luckyGiftAttachment = new MultiLuckyGiftAttachment(first, second); + luckyGiftAttachment.setMultiLuckyGiftAttachment(luckyBagGifts); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + luckyGiftAttachment + ); + LogUtil.print("multi send gift"); + + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(message); + OtherExtKt.doLog("礼物msgJson 发送单人送福袋礼物的消息到公屏 = "+msgJson); + } + + ImRetryManager.sendRoomGiftMsg(message) + .doOnSuccess(retryChatRoomMessage -> { + // 发送礼物成功的回调,显示动画 + GiftModel.get().onSendRoomMessageSuccess(message); + // 插入到公屏上 + IMNetEaseManager.get().addMessagesImmediately(message); + //礼物消息发送成功回调 + }) + .doOnError(throwable -> { + //礼物消息发送失败后回调 + + }) + .subscribe(); + } + } + } + + /** + * 发送多人、全麦人送福袋礼物的消息到公屏 + * + * @param giftReceiveInfo + */ + public static void sendMultiLuckyGiftRoomMessage(GiftMultiReceiverInfo giftReceiveInfo, int first, int second) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && giftReceiveInfo != null) { + + for (int i = 0; i < giftReceiveInfo.getLuckyBagGifts().size(); i++) { + LuckyBagGifts luckyBagGifts = giftReceiveInfo.getLuckyBagGifts().get(i); + luckyBagGifts.setShowAnimation(i == 0); + luckyBagGifts.setNick(giftReceiveInfo.getNick()); + luckyBagGifts.setLuckyGiftSvgaUrl(giftReceiveInfo.getGift().getLuckyGiftSvgaUrl()); + luckyBagGifts.setDisplayGift(giftReceiveInfo.getDisplayGift()); + luckyBagGifts.setGiftName(giftReceiveInfo.getGift().getGiftName()); + luckyBagGifts.setI18nGiftNameMap(giftReceiveInfo.getGift().getI18nGiftNameMap()); + List targetUids = new ArrayList<>(); + for (GiftReceiver targetUser : giftReceiveInfo.getTargetUsers()) { + targetUids.add(targetUser.getUid()); + } + luckyBagGifts.setTargetUids(targetUids); + luckyBagGifts.setGiftValueVos(giftReceiveInfo.getGiftValueVos()); + luckyBagGifts.setCurrentTime(giftReceiveInfo.getCurrentTime()); + luckyBagGifts.setUid(giftReceiveInfo.getUid()); + luckyBagGifts.setGiftId(giftReceiveInfo.getGiftId()); + luckyBagGifts.setTargetUid(luckyBagGifts.getUser().getUid()); + luckyBagGifts.setTargetNick(luckyBagGifts.getUser().getNick()); + //这里去掉收礼物人的头像字段,减少容量 + MultiLuckyGiftAttachment luckyGiftAttachment = new MultiLuckyGiftAttachment(first, second); + luckyGiftAttachment.setMultiLuckyGiftAttachment(luckyBagGifts); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + luckyGiftAttachment + ); + LogUtil.print("multi send gift"); + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(message); + OtherExtKt.doLog("礼物msgJson 发送多人、全麦人送福袋礼物的消息到公屏 = "+msgJson); + } + ImRetryManager.sendRoomGiftMsg(message) + .doOnSuccess(retryChatRoomMessage -> { + // 发送礼物成功的回调,显示动画 + GiftModel.get().onSendRoomMessageSuccess(message); + // 插入到公屏上 + IMNetEaseManager.get().addMessagesImmediately(message); + //礼物消息发送成功回调 + }) + .doOnError(throwable -> { + //礼物消息发送失败后回调 + + }) + .subscribe(); + } + } + } + //=================================================================================== + + /** + * 私聊界面发送礼物消息 + * + * @param multiGiftReceiveInfo + * @return + */ + public static Single sendGiftPrivateChatMessage(GiftMultiReceiverInfo multiGiftReceiveInfo) { + UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); + if (myUserInfo == null) return Single.error(new Throwable("current cached user is null")); + GiftInfo giftInfo = multiGiftReceiveInfo.getGift(); + int giftId = multiGiftReceiveInfo.getGiftId(); + giftId = giftId > 0 ? giftId : giftInfo != null ? giftInfo.getGiftId() : 0; + if (giftInfo == null) { + giftInfo = new GiftInfo(); + giftInfo.setGiftId(giftId); + giftInfo.setCount(multiGiftReceiveInfo.getGiftNum()); + } + Long targetUid = multiGiftReceiveInfo.getTargetUsers().get(0).getUid(); + String targetNick = multiGiftReceiveInfo.getTargetUsers().get(0).getNick(); + GiftAttachment giftAttachment = new GiftAttachment(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT, + CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_GIFT); + giftAttachment.setUid(myUserInfo.getUid() + ""); + GiftReceiveInfo giftReceiveInfo = new GiftReceiveInfo(); + giftReceiveInfo.setNick(myUserInfo.getNick()); + giftReceiveInfo.setTargetUid(targetUid); + giftReceiveInfo.setTargetNick(targetNick); + giftReceiveInfo.setAvatar(myUserInfo.getAvatar()); + giftReceiveInfo.setGiftId(giftId); + giftReceiveInfo.setUid(myUserInfo.getUid()); + giftReceiveInfo.setGiftNum(multiGiftReceiveInfo.getGiftNum()); + giftReceiveInfo.setGift(multiGiftReceiveInfo.getGift()); + giftAttachment.setGiftReceiveInfo(giftReceiveInfo); + GiftInfo giftInfo1 = GiftModel.get().findGiftInfoById(giftReceiveInfo.getGiftId()); + if (giftInfo1 == null || TextUtils.isEmpty(giftInfo1.getGiftUrl())) { + giftInfo1 = giftReceiveInfo.getGift(); + } + giftReceiveInfo.setGift(giftInfo1); + giftAttachment.setGiftReceiveInfo(giftReceiveInfo); + CustomMessageConfig customMessageConfig = new CustomMessageConfig(); + customMessageConfig.enablePush = false; + IMMessage imMessage = MessageBuilder.createCustomMessage(targetUid + "", + SessionTypeEnum.P2P, "", giftAttachment, customMessageConfig); + + if (BuildConfig.DEBUG) { + String msgJson = JSON.toJSONString(imMessage); + OtherExtKt.doLog("礼物msgJson 私聊界面发送礼物消息 = "+msgJson); + } + + return IMNetEaseManager.get() + .sendMessageSingle(imMessage); + } +} diff --git a/core/src/main/java/com/chwl/core/helper/AtProxy.java b/core/src/main/java/com/chwl/core/helper/AtProxy.java new file mode 100644 index 0000000..8d52f84 --- /dev/null +++ b/core/src/main/java/com/chwl/core/helper/AtProxy.java @@ -0,0 +1,65 @@ +package com.chwl.core.helper; + +import android.widget.EditText; + +import com.netease.nim.uikit.business.ait.AitBlock; +import com.netease.nim.uikit.business.ait.AitManager; +import com.netease.nim.uikit.business.ait.AitTextChangeListener; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class AtProxy implements AitTextChangeListener { + + private final AitManager aitManager; + private final EditText editText; + + public AtProxy(EditText editText) { + this.aitManager = new AitManager(editText.getContext(), null, false); + this.editText = editText; + init(); + } + + private void init() { + aitManager.setTextChangeListener(this); + editText.addTextChangedListener(aitManager); + } + + public void insertAitMember(String account, String name) { + aitManager.insertAitMember(account, name); + } + + @Override + public void onTextAdd(String content, int start, int length) { + editText.getEditableText().insert(start, content); + } + + @Override + public void onTextDelete(int start, int length) { + int end = start + length - 1; + editText.getEditableText().replace(start, end, ""); + } + + public void reset() { + aitManager.reset(); + } + + public Map getAtExtensionMap() { + Map map = new HashMap<>(); + if (aitManager.getAitBlocks().size() > 0) { + List uids = new ArrayList<>(); + List names = new ArrayList<>(); + for (String account : aitManager.getAitBlocks().keySet()) { + AitBlock block = aitManager.getAitBlocks().get(account); + uids.add(account); + names.add(block.text); + } + map.put("atUids",uids); + map.put("atNames",names); + } + return map; + } +} diff --git a/core/src/main/java/com/chwl/core/helper/ImHelperUtils.java b/core/src/main/java/com/chwl/core/helper/ImHelperUtils.java new file mode 100644 index 0000000..f40cccd --- /dev/null +++ b/core/src/main/java/com/chwl/core/helper/ImHelperUtils.java @@ -0,0 +1,225 @@ +package com.chwl.core.helper; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_HEAD_CAR; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_HEAD_NOBLE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ASSISTANT_MSG; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LOTTERY; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_NOTICE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_OPEN_ROOM_NOTI; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PACKET; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_MODULE_HALL; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_NEWBIE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_PUBLIC_CHAT_HALL; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_RED_PACKAGE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SHARE_FAMILY; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SHARE_ROOM; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SHARE_TEAM; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SHIFT_OUT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT_ME; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_MONEY; + +import androidx.annotation.NonNull; + +import com.netease.nim.uikit.business.session.helper.TeamNotificationHelper; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.AudioAttachment; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; +import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.im.WorldDynamicAttachment; +import com.chwl.core.im.custom.bean.AssistantAttachment; +import com.chwl.core.im.custom.bean.CarAttachment; +import com.chwl.core.im.custom.bean.CarveUpGoldThirdLevelAttachment; +import com.chwl.core.im.custom.bean.ChatHintAttachment; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.ImTipAttachment; +import com.chwl.core.im.custom.bean.LuckyMoneyTipsAttachment; +import com.chwl.core.im.custom.bean.MatchAttachment; +import com.chwl.core.im.custom.bean.NewbieHelloAttachment; +import com.chwl.core.im.custom.bean.NobleAttachment; +import com.chwl.core.im.custom.bean.NoticeAttachment; +import com.chwl.core.im.custom.bean.RedPacketAttachment; +import com.chwl.core.im.custom.bean.SysMsgVoiceAttachment; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.public_chat_hall.attachment.AitMeAttachment; +import com.chwl.core.public_chat_hall.bean.AitMeInfo; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2020/3/18 + */ +public class ImHelperUtils { + + public static Single sendCustomMsg(String roomId, T t) { + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage(roomId, t); + return IMNetEaseManager.get().sendChatRoomMessage(message, false); + } + + public static Single sendChatRoomMessage(T t) { + long roomId = AvRoomDataManager.get().getRoomId(); + if (roomId <= 0) { + return Single.error(new Throwable("roomId <= 0")); + } + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage(String.valueOf(roomId), t); + return IMNetEaseManager.get().sendChatRoomMessage(message, false); + } + + /** + * 定义消息收到后显示的文案 + * + * @param recent + * @return + */ + public static String getMsgDigest(@NonNull RecentContact recent) { + MsgAttachment attachment = recent.getAttachment(); + switch (recent.getMsgType()) { + case text: + return recent.getContent(); + case image: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_01); + case video: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_02); + case audio: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_03); + case location: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_04); + case file: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_05); + case tip: + List uuids = new ArrayList<>(); + uuids.add(recent.getRecentMessageId()); + List messages = NIMClient.getService(MsgService.class).queryMessageListByUuidBlock(uuids); + if (messages != null && messages.size() > 0) { + return messages.get(0).getContent(); + } + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_06); + case notification: + return TeamNotificationHelper.getTeamNotificationText(recent.getContactId(), + recent.getFromAccount(), + (NotificationAttachment) recent.getAttachment()); + case robot: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_07); + case custom: + if (attachment instanceof CustomAttachment) { + CustomAttachment customAttachment = (CustomAttachment) attachment; + if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_OPEN_ROOM_NOTI) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_08); + } else if (customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_IM_TIP) { + ImTipAttachment imTipAttachment = (ImTipAttachment) attachment; + return imTipAttachment.getMsg(); + } else if (customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_09); + } else if (customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_IM_GAME) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_010); + } else if (customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_LEVEL_UP) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_011); + } else if (customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_MATCH) { + MatchAttachment matchAttachment = (MatchAttachment) attachment; + return matchAttachment.getContent(); + } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_NOTICE) { + NoticeAttachment noticeAttachment = (NoticeAttachment) attachment; + return noticeAttachment.getTitle(); + } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_PACKET) { + RedPacketAttachment redPacketAttachment = (RedPacketAttachment) attachment; + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_012) + redPacketAttachment.getRedPacketInfo().getPacketName() + ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_013); + } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_LOTTERY) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_014); + } else if (customAttachment.getFirst() == CUSTOM_MESS_HEAD_NOBLE) { + NobleAttachment nobleAttachment = (NobleAttachment) attachment; + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_015) + nobleAttachment.msg; + } else if (customAttachment.getFirst() == CUSTOM_MESS_HEAD_CAR) { + return ((CarAttachment) attachment).msg; + } else if (customAttachment.getFirst() == CUSTOM_MSG_ASSISTANT_MSG) { + return ((AssistantAttachment) attachment).title; + } else if (customAttachment.getFirst() == CUSTOM_MSG_NEWBIE) { + return ((NewbieHelloAttachment) attachment).getNewbieHelloInfo().message; + } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP) { + switch (customAttachment.getSecond()) { + case CUSTOM_MSG_SHARE_ROOM: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_016); + + case CUSTOM_MSG_SHARE_FAMILY: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_017); + + case CUSTOM_MSG_SHARE_TEAM: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_018); + + default: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_019); + + } + } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY) { + switch (customAttachment.getSecond()) { + case CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_MONEY: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_020); + + case CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY: + LuckyMoneyTipsAttachment luckyMoneyTipsAttachment = (LuckyMoneyTipsAttachment) attachment; + String currentUid = String.valueOf(AuthModel.get().getCurrentUid()); + LuckyMoneyInfo luckyMoneyInfo = luckyMoneyTipsAttachment.getLuckyMoneyInfo(); + String senderUid = String.valueOf(luckyMoneyInfo.getSenderUid()); + String receiverUid = luckyMoneyInfo.getReceiveUid(); + if (Objects.equals(currentUid, senderUid)) { + return "[" + luckyMoneyInfo.getReceiveNick() + ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_021); + } else if (Objects.equals(currentUid, receiverUid)) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_022) + luckyMoneyInfo.getNick() + ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_023); + } else { + return "[" + luckyMoneyInfo.getReceiveNick() + ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_024) + luckyMoneyInfo.getNick() + ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_025); + } + } + } else if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG + || customAttachment.getFirst() == CUSTOM_MSG_SHIFT_OUT + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG_V2) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_026); + } else if (customAttachment.getFirst() == CUSTOM_MSG_PUBLIC_CHAT_HALL) { + switch (customAttachment.getSecond()) { + case CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT_ME: + AitMeAttachment aitMeAttachment = (AitMeAttachment) customAttachment; + AitMeInfo aitMeInfo = aitMeAttachment.getAitMeInfo(); + return aitMeInfo.getContent(); + } + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_027); + } else if (customAttachment.getFirst() == CUSTOM_MSG_MODULE_HALL) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_028); + } else if (customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_SIGN_IN + && customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_JUMP_SIGN_IN_ACTIVITY) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_029); + } else if (customAttachment instanceof CarveUpGoldThirdLevelAttachment) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_030); + } else if (customAttachment instanceof SysMsgVoiceAttachment) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_031); + } else if (WorldDynamicAttachment.isShareMsg(customAttachment)) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_032); + } else if (customAttachment.getFirst() == CUSTOM_MSG_RED_PACKAGE) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_033); + } else if (customAttachment instanceof ChatHintAttachment) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_034); + } + } else if (attachment instanceof AudioAttachment) { + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_035); + } + + default: + return ResUtil.getString(R.string.xchat_android_core_helper_imhelperutils_036); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/helper/NetViewModel.java b/core/src/main/java/com/chwl/core/helper/NetViewModel.java new file mode 100644 index 0000000..bde3587 --- /dev/null +++ b/core/src/main/java/com/chwl/core/helper/NetViewModel.java @@ -0,0 +1,42 @@ +package com.chwl.core.helper; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.google.gson.JsonElement; + +import io.reactivex.Single; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public class NetViewModel extends BaseModel { + + private static final class Helper { + public static final NetViewModel INSTANCE = new NetViewModel(); + } + + public static NetViewModel get() { + return NetViewModel.Helper.INSTANCE; + } + + + /** + * //status //1-同意, 2-拒绝 + */ + public Single changeCpRelationType(int recordId, int status){ + return api.cpNameChangeAudit(recordId, status) + .compose(RxHelper.handleIgnoreData()) + .compose(RxHelper.handleSchedulers()); + } + + + private Api api = RxNet.create(Api.class); + private interface Api { + + @FormUrlEncoded + @POST("/user/cp/nameChangeAudit") + Single> cpNameChangeAudit(@Field("recordId") int recordId, @Field("status") int status); + } +} diff --git a/core/src/main/java/com/chwl/core/home/IHomeTabMapView.java b/core/src/main/java/com/chwl/core/home/IHomeTabMapView.java new file mode 100644 index 0000000..7aad471 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/IHomeTabMapView.java @@ -0,0 +1,16 @@ +package com.chwl.core.home; + +import com.chwl.core.home.bean.HomeTabMapInfo; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface IHomeTabMapView extends IMvpBaseView { + void homeTabMapSuccess(List list); + + void homeTabMapFails(String error); + + void homeTabMapLoadMoreSuccess(List list); + + void homeTabMapLoadMoreFails(String error); +} diff --git a/core/src/main/java/com/chwl/core/home/bean/BannerInfo.java b/core/src/main/java/com/chwl/core/home/bean/BannerInfo.java new file mode 100644 index 0000000..0f4ad32 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/BannerInfo.java @@ -0,0 +1,145 @@ +package com.chwl.core.home.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chwl.core.bean.IRouterData; + +import java.io.Serializable; + +import lombok.Data; +import lombok.ToString; + +/** + * Created by Administrator on 2017/8/7. + * banner跳转type + */ +@ToString +@Data +public class BannerInfo implements Parcelable, Serializable, IRouterData { + /** + * 跳转app + */ + public final static transient int SKIP_TYP_APP = 1; + /** + * 跳转房间 + */ + public final static transient int SKIP_TYP_CHAT_ROOM = 2; + /** + * 跳转H5显示 + */ + public final static transient int SKIP_TYP_H5 = 3; + + /** + * 跳转H5显示-cp + */ + public final static transient int SKIP_TYP_H5_CP = 4; + /** + * 跳转H5显示-周星 + */ + public final static transient int SKIP_TYP_H5_WEE_STAR = 5; + /** + * 跳转H5显示-定制 + */ + public final static transient int SKIP_TYP_H5_CUSTOM = 6; + + /** + * 百顺 baishun 游戏 + */ + public final static transient int SKIP_TYPE_ROOM_BAI_SHUN = 7; + + + + /** + * routerhandler跳转规则 + */ + public final static transient int SKIP_TYPE_ROUTER = 55; + + /** + * 房间用户资料卡 + */ + public final static transient int SKIP_TYPE_ROOM_USER_CARD = 66; + + + /** + * 无调整 + */ + public final static transient int SKIP_TYPE_NULL = 100; + + /* + bannerId:1 //id + bannerName: xx//横幅广告名称 + bannerPic:xx //横幅图片 + skipType:xx // 1跳app页面,2跳聊天室,3跳h5页面 + skipUri:xx //跳转uri + */ + private int bannerId; + private String bannerName; + private String bannerPic; + private int skipType; + private String skipUri; + /** + * 路由类型 + */ + private String routerType; + /** + * 路由值 + */ + private String routerValue; + + /**1-全屏,2-半屏,默认值是1*/ + private int showType; + + private boolean isFirstCharge; +// private boolean isBox; + private boolean isRadish; +// private boolean isFairy; + + private String bannerUrl; + + // 首页banner , 闪屏页 嵌套头像用 的字段和key + private FillVo fillVo; + + + public BannerInfo(){ + + } + + protected BannerInfo(Parcel in) { + bannerId = in.readInt(); + bannerName = in.readString(); + bannerPic = in.readString(); + skipType = in.readInt(); + skipUri = in.readString(); + bannerUrl = in.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(bannerId); + dest.writeString(bannerName); + dest.writeString(bannerPic); + dest.writeInt(skipType); + dest.writeString(skipUri); + dest.writeString(bannerUrl); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public BannerInfo createFromParcel(Parcel in) { + return new BannerInfo(in); + } + + @Override + public BannerInfo[] newArray(int size) { + return new BannerInfo[size]; + } + }; + + +} diff --git a/core/src/main/java/com/chwl/core/home/bean/ClientResource.java b/core/src/main/java/com/chwl/core/home/bean/ClientResource.java new file mode 100644 index 0000000..55a174d --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/ClientResource.java @@ -0,0 +1,16 @@ +package com.chwl.core.home.bean; + +import com.chwl.core.bean.I18N; +import com.chwl.core.gift.bean.RoomMicDress; + +import java.util.List; + +import lombok.Data; + +@Data +public class ClientResource { + + public List roomMicDressList; + I18N roomGiftPanelNums; + +} diff --git a/core/src/main/java/com/chwl/core/home/bean/CollectionRoomInfo.java b/core/src/main/java/com/chwl/core/home/bean/CollectionRoomInfo.java new file mode 100644 index 0000000..68db4f9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/CollectionRoomInfo.java @@ -0,0 +1,33 @@ +package com.chwl.core.home.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class CollectionRoomInfo { + /** + * totalPage : 1 + * fansRoomList : [{"id":1,"roomId":170395761,"uid":934999,"roomAvatar":"https://image.zhongjialx.com/default_avatar.png","roomName":ResUtil.getString(R.string.home_bean_collectionroominfo_01),"roomOnlineNum":1},{"id":2,"roomId":170408178,"uid":934999,"roomAvatar":"https://image.zhongjialx.com/default_avatar.png","roomName":ResUtil.getString(R.string.home_bean_collectionroominfo_02),"roomOnlineNum":1}] + */ + + private int totalPage; + private List fansRoomList; + + public int getTotalPage() { + return totalPage; + } + + public void setTotalPage(int totalPage) { + this.totalPage = totalPage; + } + + public List getFansRoomList() { + return fansRoomList; + } + + public void setFansRoomList(List fansRoomList) { + this.fansRoomList = fansRoomList; + } + +} diff --git a/core/src/main/java/com/chwl/core/home/bean/ConfigAppUI.java b/core/src/main/java/com/chwl/core/home/bean/ConfigAppUI.java new file mode 100644 index 0000000..39f6f23 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/ConfigAppUI.java @@ -0,0 +1,35 @@ +package com.chwl.core.home.bean; + +public class ConfigAppUI { + // { + // "headIcon": "https://image.pekolive.com/7388@3x.png", + // "navbar": "https://image.pekolive.com/7393@3x.png", + // "backgroundColor": "#E44CD6", + // "homeSelectIcon": "https://image.pekolive.com/7661@3x(1).png", + // "homeUnSelectIcon": "https://image.pekolive.com/7661@3x(4).png", + // "gameSelectIcon": "https://image.pekolive.com/7662@3x.png", + // "gameUnSelectIcon": "https://image.pekolive.com/7662@3x(1).png", + // "dynamicSelectIcon": "https://image.pekolive.com/7661@3x.png", + // "dynamicUnSelectIcon": "https://image.pekolive.com/7661@3x(3).png", + // "msgSelectIcon": "https://image.pekolive.com/7661@3x(2).png", + // "msgUnSelectIcon": "https://image.pekolive.com/7661@3x(5).png", + // "mineSelectIcon": "https://image.pekolive.com/7661@3x(1).png", + // "mineUnSelectIcon": "https://image.pekolive.com/7661@3x(4).png", + // "selectBar": "" + // } + + public String headIcon ; + public String navbar; + public String backgroundColor; + public String homeSelectIcon; + public String homeUnSelectIcon; + public String gameSelectIcon; + public String gameUnSelectIcon; + public String dynamicSelectIcon; + public String dynamicUnSelectIcon; + public String msgSelectIcon; + public String msgUnSelectIcon; + public String mineSelectIcon; + public String mineUnSelectIcon; + public String selectBar; +} diff --git a/core/src/main/java/com/chwl/core/home/bean/ConfigInfo.java b/core/src/main/java/com/chwl/core/home/bean/ConfigInfo.java new file mode 100644 index 0000000..0bde75c --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/ConfigInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.home.bean; + +public class ConfigInfo { + + //{ + // "appUiSetting": { + // "headIcon": "https://image.pekolive.com/7388@3x.png", + // "navbar": "https://image.pekolive.com/7393@3x.png", + // "backgroundColor": "#E44CD6", + // "homeSelectIcon": "https://image.pekolive.com/7661@3x(1).png", + // "homeUnSelectIcon": "https://image.pekolive.com/7661@3x(4).png", + // "gameSelectIcon": "https://image.pekolive.com/7662@3x.png", + // "gameUnSelectIcon": "https://image.pekolive.com/7662@3x(1).png", + // "dynamicSelectIcon": "https://image.pekolive.com/7661@3x.png", + // "dynamicUnSelectIcon": "https://image.pekolive.com/7661@3x(3).png", + // "msgSelectIcon": "https://image.pekolive.com/7661@3x(2).png", + // "msgUnSelectIcon": "https://image.pekolive.com/7661@3x(5).png", + // "mineSelectIcon": "https://image.pekolive.com/7661@3x(1).png", + // "mineUnSelectIcon": "https://image.pekolive.com/7661@3x(4).png", + // "selectBar": "" + // } + //} + public ConfigAppUI appUiSetting; + + + +} diff --git a/core/src/main/java/com/chwl/core/home/bean/CurrentResourceInfo.kt b/core/src/main/java/com/chwl/core/home/bean/CurrentResourceInfo.kt new file mode 100644 index 0000000..05913ca --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/CurrentResourceInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.home.bean + +import lombok.Data + +@Data +data class CurrentResourceInfo( + val icon: String = "", + val id: Int = 0, + val posSeq: Int = 0, + val resourceContent: String = "", + val resourceType: Int = 0, + val strategySeq: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/FeedbackConfigBean.kt b/core/src/main/java/com/chwl/core/home/bean/FeedbackConfigBean.kt new file mode 100644 index 0000000..f5ef354 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/FeedbackConfigBean.kt @@ -0,0 +1,9 @@ +package com.chwl.core.home.bean + +import androidx.annotation.Keep + +@Keep +data class FeedbackConfigBean( + val customContactMap: LinkedHashMap? = null, + val typeEnumList: List? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/FeedbackTypeBean.kt b/core/src/main/java/com/chwl/core/home/bean/FeedbackTypeBean.kt new file mode 100644 index 0000000..d6ed376 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/FeedbackTypeBean.kt @@ -0,0 +1,9 @@ +package com.chwl.core.home.bean + +import androidx.annotation.Keep + +@Keep +data class FeedbackTypeBean( + val desc: String? = null, + val type: String? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/FillVo.java b/core/src/main/java/com/chwl/core/home/bean/FillVo.java new file mode 100644 index 0000000..1a2d521 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/FillVo.java @@ -0,0 +1,77 @@ +package com.chwl.core.home.bean; + +import com.chwl.library.common.util.OtherExtKt; + +import java.io.Serializable; +import java.util.HashMap; + +/** + * 首页banner , 闪屏页 嵌套头像用 的字段和key + */ +public class FillVo implements Serializable { + public String avatar; + public long erbanNo; + public String nick; + public String loverAvatar; + public long loverErbanNo; + public String loverNick; + + public String picUrl; + public String giftName; + public int giftId; + + public @interface Key{ + public String STAR_AVATAR = "avatar"; + public String STAR_ID = "id"; + + public String GIFT_PIC = "gift"; + public String GIFT_NAME = "name"; + + public String CP_AVATAR = "avatar_1"; + public String CP_ID = "id_1"; + public String CP_LOVER_AVATAR = "avatar_2"; + public String CP_LOVER_ID = "id_2"; + } + + public HashMap getImgMap() { + HashMap map = new HashMap<>(); + + if (OtherExtKt.isVerify(this.avatar)) { + map.put(Key.STAR_AVATAR,this.avatar); + } + + if (OtherExtKt.isVerify(this.picUrl)) { + map.put(Key.GIFT_PIC,this.picUrl); + } + + if (OtherExtKt.isVerify(this.avatar)) { + map.put(Key.CP_AVATAR,this.avatar); + } + if (OtherExtKt.isVerify(this.loverAvatar)) { + map.put(Key.CP_LOVER_AVATAR,this.loverAvatar); + } + + return map; + } + public HashMap getTextMap() { + HashMap map = new HashMap<>(); + + if (this.erbanNo > 0) { + map.put(Key.STAR_ID, "ID:"+this.erbanNo); + } + + + if (OtherExtKt.isVerify(this.giftName)) { + map.put(Key.GIFT_NAME,this.giftName); + } + + if (this.erbanNo > 0) { + map.put(Key.CP_ID, "ID:"+this.erbanNo); + } + if (this.loverErbanNo > 0) { + map.put(Key.CP_LOVER_ID, "ID:"+this.loverErbanNo); + } + + return map; + } +} diff --git a/core/src/main/java/com/chwl/core/home/bean/HomeConcernsInfo.java b/core/src/main/java/com/chwl/core/home/bean/HomeConcernsInfo.java new file mode 100644 index 0000000..d966bc3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/HomeConcernsInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.home.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class HomeConcernsInfo implements Serializable { + private long roomUid; + private long followedUid; + private String name; + private String avatar; + private int followType; +} diff --git a/core/src/main/java/com/chwl/core/home/bean/HomeRankBean.kt b/core/src/main/java/com/chwl/core/home/bean/HomeRankBean.kt new file mode 100644 index 0000000..23cf0c7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/HomeRankBean.kt @@ -0,0 +1,11 @@ +package com.chwl.core.home.bean + +import androidx.annotation.Keep + +@Keep +data class HomeRankBean( + val avatar: String?, + val erbanNo: Long?, + val nick: String?, + val uid: Long? +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/HomeRoomCardInfo.kt b/core/src/main/java/com/chwl/core/home/bean/HomeRoomCardInfo.kt new file mode 100644 index 0000000..b2fc0f6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/HomeRoomCardInfo.kt @@ -0,0 +1,17 @@ +package com.chwl.core.home.bean + +import androidx.annotation.Keep + +@Keep +data class HomeRoomCardInfo( + val avatar: String?, + val roomDesc: String?, + val regionFlag: String?, + val micUserCount: Long?, + val micUsers: List?, + val onlineNum: Long?, + val partitionId: Long?, + val roomId: Long?, + val title: String?, + val uid: Long?, +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/HomeRoomInfo.java b/core/src/main/java/com/chwl/core/home/bean/HomeRoomInfo.java new file mode 100644 index 0000000..2ddba1e --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/HomeRoomInfo.java @@ -0,0 +1,81 @@ +package com.chwl.core.home.bean; + +import android.text.TextUtils; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class HomeRoomInfo implements MultiItemEntity, Serializable { + + public static final int TYPE_ROOM = 1; + public static final int TYPE_BANNER = 2; + public static final int TYPE_BROADCAST = 3; + private String roomPwd; + private long uid; + private long roomUid; + private long roomId; + private int micUserCount; + private int onlineNum; + private double hotValue; + private int isPermitRoom; + private String roomTag; + private String tagPict; + private long erbanNo; + private String title; + private String avatar; + private String nick; + //性别 1:男 2:女 0 :未知 + private int gender; + private List micUsers; + private List bannerVoList; + private boolean crossPking; + private boolean valid; + private boolean isBanner; + private long mgId; + private String mgName; + private int state; + private String broadMsg; + private String roomDesc; + + //fans/fansRoomList接口返回的是这样的... + private String roomName; + private int roomOnlineNum; + private String roomAvatar; + + private String failContext; + private boolean isPick; + private boolean needOpenSelfRoom; + private int isWeekTop1; + private int isHourTop1; + private String introduction; + + private boolean roomBoom; + private String roomBoomPic; + private String roomBoomVapUrl; + + private String regionFlag; + + + /** + * 小时榜 1,2,3 0表示没上榜 + */ + private int hourTop; + /** + * 1 = 热门 2=客服 + */ + private int homeRoomType; + + //房间等级icon + private String roomLevelIcon; + + + @Override + public int getItemType() { + return isBanner ? TYPE_BANNER : (!TextUtils.isEmpty(broadMsg) ? TYPE_BROADCAST : TYPE_ROOM); + } +} diff --git a/core/src/main/java/com/chwl/core/home/bean/HomeTabMapInfo.java b/core/src/main/java/com/chwl/core/home/bean/HomeTabMapInfo.java new file mode 100644 index 0000000..d6b3f6a --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/HomeTabMapInfo.java @@ -0,0 +1,114 @@ +package com.chwl.core.home.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class HomeTabMapInfo implements MultiItemEntity, Serializable { + + public static final int TYPE_EMPTY = 0; + public static final int TYPE_NORMAL = 1; + /** + * onlineNum : 1 + * roomUid : 935007 + * roomTitle : 大幽魂上衣的房间 + * avatar : https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim + * seq : 0 + * isTop : true + */ + + private int onlineNum; + private long roomUid; + private String title; + private String avatar; + private int seq; + private boolean isTop; + private int itemType = 0; + private String tagPict; + private String iconContent; + private boolean crossPking; + + public String getIconContent() { + return iconContent; + } + + public void setIconContent(String iconContent) { + this.iconContent = iconContent; + } + + public String getTagPict() { + return tagPict; + } + + public void setTagPict(String tagPict) { + this.tagPict = tagPict; + } + + public int getOnlineNum() { + return onlineNum; + } + + public void setOnlineNum(int onlineNum) { + this.onlineNum = onlineNum; + } + + public long getRoomUid() { + return roomUid; + } + + public void setRoomUid(long roomUid) { + this.roomUid = roomUid; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getSeq() { + return seq; + } + + public void setSeq(int seq) { + this.seq = seq; + } + + public boolean isIsTop() { + return isTop; + } + + public void setIsTop(boolean isTop) { + this.isTop = isTop; + } + + public boolean isCrossPking() { + return crossPking; + } + + public void setCrossPking(boolean crossPking) { + this.crossPking = crossPking; + } + + @Override + public int getItemType() { + return itemType; + } + + public void setItemType(int itemType) { + this.itemType = itemType; + } +} diff --git a/core/src/main/java/com/chwl/core/home/bean/HomeTagInfo.java b/core/src/main/java/com/chwl/core/home/bean/HomeTagInfo.java new file mode 100644 index 0000000..8f55dcc --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/HomeTagInfo.java @@ -0,0 +1,75 @@ +package com.chwl.core.home.bean; + +import lombok.Data; + +@Data +public class HomeTagInfo { + + /** + * id : 1 + * name : 推荐 + * seq : 1 + */ + + private int id; + private String name; + private String icon; + private int seq; + private int regionId = -1; + + public HomeTagInfo() { + } + + public HomeTagInfo(int id, String name, String icon, int seq) { + this.id = id; + this.name = name; + this.icon = icon; + this.seq = seq; + } + + public HomeTagInfo(int id, String name, int seq) { + this.id = id; + this.name = name; + this.seq = seq; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getSeq() { + return seq; + } + + public void setSeq(int seq) { + this.seq = seq; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public int getRegionId() { + return regionId; + } + + public void setRegionId(int regionId) { + this.regionId = regionId; + } +} diff --git a/core/src/main/java/com/chwl/core/home/bean/MainTabInfo.kt b/core/src/main/java/com/chwl/core/home/bean/MainTabInfo.kt new file mode 100644 index 0000000..c59e734 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/MainTabInfo.kt @@ -0,0 +1,14 @@ +package com.chwl.core.home.bean + +import lombok.Data + +@Data +data class MainTabInfo( + var tabIcon: String = "", + var tabSelectedIcon: String = "", + val tabName: String = "", + val tabType: Int = 0, + val tabSelectedAnimation: String? = null +) + + diff --git a/core/src/main/java/com/chwl/core/home/bean/MainTabType.java b/core/src/main/java/com/chwl/core/home/bean/MainTabType.java new file mode 100644 index 0000000..6bd2a4a --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/MainTabType.java @@ -0,0 +1,11 @@ +package com.chwl.core.home.bean; + +public interface MainTabType { + // int TAB_TYPE_STAR = 1; + int TAB_TYPE_HOME = 1; + int TAB_TYPE_GAME = 2; + int TAB_TYPE_SQUARE = 3; + int TAB_TYPE_MSG = 4; + int TAB_TYPE_ME = 5; + +} diff --git a/core/src/main/java/com/chwl/core/home/bean/MicUsersBean.java b/core/src/main/java/com/chwl/core/home/bean/MicUsersBean.java new file mode 100644 index 0000000..465ac60 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/MicUsersBean.java @@ -0,0 +1,19 @@ +package com.chwl.core.home.bean; + +import lombok.Data; + +@Data +public class MicUsersBean { + /** + * uid : 935002 + * nick : 辅导 + * avatar : https://image.zhongjialx.com/default_avatar.png + * gender : 2 + */ + + private int uid; + private String nick; + private String avatar; + private int gender; + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/ResourceInfo.kt b/core/src/main/java/com/chwl/core/home/bean/ResourceInfo.kt new file mode 100644 index 0000000..950a886 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/ResourceInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.home.bean + +import lombok.Data + +@Data +data class ResourceInfo( + val icon: String? = null, + val id: Int = 0, + val posSeq: Int? = null, + val resourceContent: String? = null, + val resourceType: Int = 0, + val strategySeq: Int? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/StarUser.kt b/core/src/main/java/com/chwl/core/home/bean/StarUser.kt new file mode 100644 index 0000000..edc0aa5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/StarUser.kt @@ -0,0 +1,14 @@ +package com.chwl.core.home.bean + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +data class StarUser( + val avatar: String? = null, + val gender: Int? = null, + var hasLike: Boolean? = null, + val nick: String? = null, + val uid: Long? = null, + val userDesc: String? = null, +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/bean/TabInfo.java b/core/src/main/java/com/chwl/core/home/bean/TabInfo.java new file mode 100644 index 0000000..f90b728 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/TabInfo.java @@ -0,0 +1,117 @@ +package com.chwl.core.home.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +/** + *

tab 标签数据

+ * + * @author Administrator + * @date 2017/11/21 + */ +@Data +public class TabInfo implements Parcelable,Serializable { + + /** + * id : 8 + * name : 聊天 + * pict : https://image.zhongjialx.com/tag%E8%81%8A%E5%A4%A9.png + * seq : 3 + * type : 1 + * status : true + * istop : true + * createTime : 1511155717000 + */ + + protected int id; + protected String name; + protected String pict; + protected int seq; + protected int res; + protected int type; + protected boolean status; + protected boolean istop; + protected long createTime; + + public TabInfo() { + } + + public TabInfo(int id, String name) { + this.id = id; + this.name = name; + } + + public TabInfo(int id, String name,int res) { + this.id = id; + this.name = name; + this.res = res; + } + + + protected TabInfo(Parcel in) { + id = in.readInt(); + name = in.readString(); + pict = in.readString(); + seq = in.readInt(); + type = in.readInt(); + status = in.readByte() != 0; + istop = in.readByte() != 0; + createTime = in.readLong(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(id); + dest.writeString(name); + dest.writeString(pict); + dest.writeInt(seq); + dest.writeInt(type); + dest.writeByte((byte) (status ? 1 : 0)); + dest.writeByte((byte) (istop ? 1 : 0)); + dest.writeLong(createTime); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public TabInfo createFromParcel(Parcel in) { + return new TabInfo(in); + } + + @Override + public TabInfo[] newArray(int size) { + return new TabInfo[size]; + } + }; + + public static List getTabDefaultList() { + List tabInfoList = new ArrayList<>(); + tabInfoList.add(new TabInfo(14, ResUtil.getString(R.string.home_bean_tabinfo_01))); + tabInfoList.add(new TabInfo(12, ResUtil.getString(R.string.home_bean_tabinfo_02))); + tabInfoList.add(new TabInfo(13, ResUtil.getString(R.string.home_bean_tabinfo_03))); + tabInfoList.add(new TabInfo(5, ResUtil.getString(R.string.home_bean_tabinfo_04))); + tabInfoList.add(new TabInfo(10, ResUtil.getString(R.string.home_bean_tabinfo_05))); + tabInfoList.add(new TabInfo(11, ResUtil.getString(R.string.home_bean_tabinfo_06))); + return tabInfoList; + } + + @Override + public String toString() { + return "TabInfo{" + + "name='" + name + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/home/bean/TagListInfo.java b/core/src/main/java/com/chwl/core/home/bean/TagListInfo.java new file mode 100644 index 0000000..747195b --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/TagListInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.home.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class TagListInfo implements Serializable { + + private long titleId; + private String titleName; + private long seqNo; +} diff --git a/core/src/main/java/com/chwl/core/home/bean/VisitorInfo.kt b/core/src/main/java/com/chwl/core/home/bean/VisitorInfo.kt new file mode 100644 index 0000000..86b167b --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/bean/VisitorInfo.kt @@ -0,0 +1,18 @@ +package com.chwl.core.home.bean + +import com.chwl.core.level.UserLevelVo +import com.chwl.core.vip.bean.UserVipInfo +import lombok.Data + +@Data +data class VisitorInfo( + val avatar: String? = null, + val erbanNo: Int = 0, + val gender: Int = 0, + val nick: String? = null, + val uid: Long = 0, + val visitTimeDesc: String? = null, + val regionIcon: String? = null, + val userLevelVo: UserLevelVo? = null, + val userVipInfoVO: UserVipInfo? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/event/FollowRoomEvent.java b/core/src/main/java/com/chwl/core/home/event/FollowRoomEvent.java new file mode 100644 index 0000000..fbbf93b --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/event/FollowRoomEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.home.event; + +public class FollowRoomEvent { +} diff --git a/core/src/main/java/com/chwl/core/home/event/OpenRoomMessageInputEvent.kt b/core/src/main/java/com/chwl/core/home/event/OpenRoomMessageInputEvent.kt new file mode 100644 index 0000000..8915e62 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/event/OpenRoomMessageInputEvent.kt @@ -0,0 +1,7 @@ +package com.chwl.core.home.event + +/** + * Created by Max on 2023/10/27 11:56 + * Desc:打开公屏输入 + **/ +class OpenRoomMessageInputEvent(val text: String? = null) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/event/ShareRoomEvent.java b/core/src/main/java/com/chwl/core/home/event/ShareRoomEvent.java new file mode 100644 index 0000000..eea33cc --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/event/ShareRoomEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.home.event; + +public class ShareRoomEvent { +} diff --git a/core/src/main/java/com/chwl/core/home/event/VisitorUnreadCountEvent.java b/core/src/main/java/com/chwl/core/home/event/VisitorUnreadCountEvent.java new file mode 100644 index 0000000..5c7e4b6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/event/VisitorUnreadCountEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.home.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class VisitorUnreadCountEvent { + private int visitNum; +} diff --git a/core/src/main/java/com/chwl/core/home/model/CollectionRoomModel.java b/core/src/main/java/com/chwl/core/home/model/CollectionRoomModel.java new file mode 100644 index 0000000..c13156a --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/model/CollectionRoomModel.java @@ -0,0 +1,94 @@ +package com.chwl.core.home.model; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.home.bean.CollectionRoomInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + + +public class CollectionRoomModel extends BaseModel { + private volatile static CollectionRoomModel model; + private Api api; + + public static CollectionRoomModel get() { + if (model == null) { + synchronized (CollectionRoomModel.class) { + if (model == null) { + model = new CollectionRoomModel(); + } + } + } + return model; + } + + private CollectionRoomModel() { + api = RxNet.create(Api.class); + } + + /** + * 获取收藏房间列表 + * + * @return + */ + public Single getCollectionRoomList(long uid,int page,int pageSize) { + return api.getCollectionRoomList(String.valueOf(uid), String.valueOf(page), String.valueOf(pageSize)) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 收藏房间 + * + * @return + */ + public Single followRoom(String type,long roomUid){ + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + return api.followRoom(String.valueOf(uid),String.valueOf(roomUid),type,ticket) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getMessage()); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .doOnSuccess(s -> { + + }) + .compose(RxHelper.handleSchedulers()); + } + + + + private interface Api { + /** + * 获取铭牌列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("fans/fansRoomList") + Single> getCollectionRoomList(@Query("uid") String uid, + @Query("page") String page, + @Query("pageSize") String pageSize); + + @POST("fans/fansRoom") + Single> followRoom(@Query("uid") String uid, + @Query("roomUid") String roomUid, + @Query("type") String type, + @Query("ticket") String ticket); + } +} diff --git a/core/src/main/java/com/chwl/core/home/model/CommunityNoticeModel.java b/core/src/main/java/com/chwl/core/home/model/CommunityNoticeModel.java new file mode 100644 index 0000000..ccc4241 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/model/CommunityNoticeModel.java @@ -0,0 +1,80 @@ +package com.chwl.core.home.model; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.bean.CommunityNoticeInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class CommunityNoticeModel implements ICommunityNoticeModel { + private volatile static ICommunityNoticeModel instance; + private Api api; + + public static ICommunityNoticeModel get() { + if (instance == null) { + synchronized (HomeModel.class) { + if (instance == null) { + instance = new CommunityNoticeModel(); + } + } + } + return instance; + } + + private CommunityNoticeModel() { + api = RxNet.create(Api.class); + } + + @Override + public Single> getMsg(long uid, Long id, int pageSize) { + return api.getMsgList(uid, id, pageSize).flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> listServiceResult) throws Exception { + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + + } + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single delete(long uid) { + return api.clear(uid).flatMap(new Function>() { + @Override + public SingleSource apply(ServiceResult serviceResult) throws Exception { + if (serviceResult.isSuccess()) { + return Single.just("success"); + } else { + return Single.error(new Throwable(serviceResult.getMessage())); + + } + } + }).compose(RxHelper.handleSchAndExce()); + } + + private interface Api { + + /** + * 获取互动消息 + */ + @POST("interactive/list") + Single>> getMsgList(@Query("uid") long uid, + @Query("id") Long id, @Query("pageSize") int pageSize); + + /** + * 清空互动消息 + */ + @POST("interactive/clear") + Single clear(@Query("uid") long uid); + } +} diff --git a/core/src/main/java/com/chwl/core/home/model/GameHomeModel.java b/core/src/main/java/com/chwl/core/home/model/GameHomeModel.java new file mode 100644 index 0000000..b82296e --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/model/GameHomeModel.java @@ -0,0 +1,120 @@ +package com.chwl.core.home.model; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.CommunityConstant; +import com.chwl.core.home.bean.BannerInfo; +import com.chwl.core.home.bean.HomeRoomInfo; +import com.chwl.core.home.bean.HomeTabMapInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * + */ +public class GameHomeModel extends BaseModel { + + private final Api api = RxNet.create(Api.class); + + public static GameHomeModel get() { + return GameHomeModel.Helper.INSTANCE; + } + + + public Single> getHomePlayV2() { + return api.apiHomePlayV2() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + + public Single> getHomeTabHome() { + return api.apiHomeTabHome(null, String.valueOf(AuthModel.get().getCurrentUid()), + CommunityConstant.VERSION_VALID_TYPE, + AuthModel.get().getTicket()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public Single> getHomeBanner(String type) { + return api.apiHomeBanner(type, String.valueOf(AuthModel.get().getCurrentUid()), + CommunityConstant.VERSION_VALID_TYPE, + AuthModel.get().getTicket()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + + public Single getRoomShortcut() { + return api.apiRoomShortcut(String.valueOf(AuthModel.get().getCurrentUid()), + CommunityConstant.VERSION_VALID_TYPE, + AuthModel.get().getTicket()) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + private interface Api { + + + /** + * 首页聊天交友 + * + * @return - + */ + @GET("/home/playV2") + Single>> apiHomePlayV2(); + + /** + * 首页推荐房间 + * + * @param tabId + * @param uid + * @param types + * @param ticket + * @return + */ + @GET("/home/tab/homeV2") + Single>> apiHomeTabHome( + @Query("tabId") String tabId, + @Query("uid") String uid, + @Query("types") String types, + @Query("ticket") String ticket); + + /** + * 首页Banner + * + * @param type + * @param uid + * @param types + * @param ticket + * @return + */ + @GET("/home/banner") + Single>> apiHomeBanner( + @Query("type") String type, + @Query("uid") String uid, + @Query("types") String types, + @Query("ticket") String ticket); + + + @GET("/room/shortcut/recommend") + Single> apiRoomShortcut( + @Query("uid") String uid, + @Query("types") String types, + @Query("ticket") String ticket + ); + } + + private static final class Helper { + public static final GameHomeModel INSTANCE = new GameHomeModel(); + } + + +} diff --git a/core/src/main/java/com/chwl/core/home/model/HomeModel.kt b/core/src/main/java/com/chwl/core/home/model/HomeModel.kt new file mode 100644 index 0000000..db0dfb3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/model/HomeModel.kt @@ -0,0 +1,436 @@ +package com.chwl.core.home.model + +import com.chwl.core.auth.AuthModel +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.community.CommunityConstant +import com.chwl.core.community.bean.UnReadCountInfo +import com.chwl.core.home.bean.* +import com.chwl.core.room.bean.MeCenterInfo +import com.chwl.core.user.bean.DiamondGiveHistoryInfo +import com.chwl.core.user.bean.SearchUserInfo +import com.chwl.core.user.bean.UserInfo +import com.chwl.core.utils.net.RxHelper +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +object HomeModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + /** + * 获取新人列表 + * + * @param page + * @param pageSize + * @return + */ + fun loadNewUserList( + page: String, + pageSize: String + ): Single> { + return api.loadNewUserList( + page, + pageSize + ) + .compose(RxHelper.handleSchedulers()) + .flatMap { + if (it.isSuccess) { + return@flatMap Single.just(it.data) + } else { + return@flatMap Single.error(Throwable(it.message)) + } + } + } + + fun getUnreadCount(uid: Long): Single { + return api.getUnreadCount(uid) + .flatMap { unReadCountInfoServiceResult -> + if (unReadCountInfoServiceResult.isSuccess) { + val unReadCountInfo = unReadCountInfoServiceResult.data + if (unReadCountInfo != null) { + Single.just(unReadCountInfoServiceResult.data?.total ?: 0) + } else { + Single.just(0) + } + } else { + Single.just(0) + } + }.compose(RxHelper.handleSchAndExce()) + } + + suspend fun getHomeBanner(type: String): List? = + launchRequest { + api.apiHomeBanner( + type, AuthModel.get().currentUid.toString(), + CommunityConstant.VERSION_VALID_TYPE, + AuthModel.get().ticket + ) + } + + suspend fun getHomeSecondBanner(type: String): List? = + launchRequest { + api.apiHomeSecondBanner( + type, AuthModel.get().currentUid.toString(), + CommunityConstant.VERSION_VALID_TYPE, + AuthModel.get().ticket + ) + } + + suspend fun getCommonRoom(tabId: Int, pageNum: Int, pageSize: Int): List? = + launchRequest { + api.getCommonRoom(tabId, pageNum, pageSize) + } + + suspend fun getMoreSingleAnchorList(id: Long?): List? = + launchRequest { + api.getMoreSingleAnchorList(if (id == 0L) null else id) + } + + suspend fun getStarUserList(pageNum: Int, pageSize: Int): List? = + launchRequest { + api.getStarUserList(pageNum, pageSize) + } + + suspend fun getNewHomeTab(): List? = + launchRequest { + api.getNewHomeTab() + } + + /** + * 获取首页推荐房间 + */ + suspend fun getHomeTabHome(tabId: Int, pageNum: Int, pageSize: Int): List? = + launchRequest { + api.apiHomeTabHome( + tabId, pageNum, pageSize + ) + } + + //首页改版资源位 + suspend fun getCurrentResource(): List? = + launchRequest { + api.getCurrentResource() + } + + suspend fun getResourceJumpInfo(id: Int): HomeRoomInfo? = + launchRequest { + api.getResourceJumpInfo(id) + } + + suspend fun getDiamondGiveHistory(page: Int, pageSize: Int): List? = + launchRequest { + api.getRecord(page, pageSize) + } + + suspend fun getSearchUser(erbanNo: Long): SearchUserInfo? = + launchRequest { + api.getSearchUser(erbanNo) + } + + suspend fun giveGift(toUid: Long, giftId: Int, giftNum: Int): String? = + launchRequest { + api.giveGift(toUid, giftId, giftNum) + } + + suspend fun getGiveDetail( + uid: Long, + type: Int, + page: Int, + pageSize: Int + ): List? = + launchRequest { + api.getGiveDetail(uid, type, page, pageSize) + } + + suspend fun getEffectResourceList(): MutableList? = + launchRequest { + api.getEffectResourceList() + } + + suspend fun getHomeRankList(): MutableList>? = + launchRequest { + api.getHomeRankList() + } + + suspend fun getMyRoomInfo(): HomeRoomCardInfo? = + launchRequest { + api.getMyRoomInfo() + } + + /** + * 获取首页-最近访问房间 + */ + suspend fun getHomeHistoryRoomList(pageNum: Int, pageSize: Int): List? = + launchRequest { + api.getHomeHistoryRoomList(pageNum, pageSize) + } + + /** + * 获取首页-我的收藏 + */ + suspend fun getHomeMyCollectRoomList(pageNum: Int, pageSize: Int): List? = + launchRequest { + api.getHomeMyCollectRoomList(pageNum, pageSize) + } + + suspend fun requestMeCenterInfoList(): List? = + launchRequest { + api.requestMeCenterInfoList() + } + + + /** + * 获取反馈配置 + */ + suspend fun getFeedbackConfig(): FeedbackConfigBean? = + launchRequest { + api.getFeedbackConfig() + } + + /** + * 提交反馈 + */ + suspend fun commitFeedback( + contact: String, + desc: String, + imageUrl: String, + type: String + ): String? = + launchRequest { + api.commitFeedback(contact, desc, imageUrl, type) + } + + private interface Api { + + /** + * 轉贈鉆石歷史記錄 + * + * @return + */ + @GET("/user/diamond/giveRecord") + suspend fun getRecord( + @Query("pageNum") pageNum: Int?, + @Query("pageSize") pageSize: Int? + ): ServiceResult> + + /** + * 精確搜索用戶 + * + * @return + */ + @POST("/user/diamond/searchUser") + suspend fun getSearchUser( + @Query("erbanNo") erbanNo: Long? + ): ServiceResult + + /** + * 贈送禮物 + * + * @return + */ + @POST("/user/diamond/giveGift") + suspend fun giveGift( + @Query("toUid") toUid: Long?, + @Query("giftId") giftId: Int?, + @Query("giftNum") giftNum: Int? + ): ServiceResult + + /** + * 轉贈詳情 + * + * @return + */ + @GET("/user/diamond/giveRecordVoByType") + suspend fun getGiveDetail( + @Query("toUid") toUid: Long?, + @Query("type") type: Int?, + @Query("pageNum") pageNum: Int?, + @Query("pageSize") pageSize: Int? + ): ServiceResult> + + /** + * 获取新人列表 + * + * @param page + * @param pageSize + * @return + */ + @GET("/user/list/new") + fun loadNewUserList( + @Query("page") page: String, + @Query("pageSize") pageSize: String + ): Single>> + + /** + * 获取互动消息未读数量 + * + * @param uid + * @return + */ + @POST("interactive/unreadCount") + fun getUnreadCount(@Query("uid") uid: Long): Single> + + /** + * 首页Banner + * + * @param type + * @param uid + * @param types + * @param ticket + * @return + */ + @GET("/home/banner") + suspend fun apiHomeBanner( + @Query("type") type: String, + @Query("uid") uid: String, + @Query("types") types: String, + @Query("ticket") ticket: String + ): ServiceResult> + + @GET("/home/second/banner") + suspend fun apiHomeSecondBanner( + @Query("type") type: String, + @Query("uid") uid: String, + @Query("types") types: String, + @Query("ticket") ticket: String + ): ServiceResult> + + /** + * 首页热门房间 + * + * @return + */ + @GET("/home/tab/mapV2") + suspend fun getCommonRoom( + @Query("tabId") tabId: Int, + @Query("pageNum") pageNum: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 首页人气主播更多二级页面 + * + * @return - + */ + @GET("/single/broadcast/morePopularityAnchorList") + suspend fun getMoreSingleAnchorList(@Query("singleRoomSortId") id: Long?): ServiceResult> + + /** + * 星球推荐用户列表 + * + * @return + */ + @GET("/home/recommendUsers") + suspend fun getStarUserList( + @Query("pageNum") pageNum: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 首页 Tag List + * + * @return + */ + @GET("/home/tabV3/list") + suspend fun getNewHomeTab(): ServiceResult> + + /** + * 首页推荐房间 + * + * @param tabId + * @param uid + * @param types + * @param ticket + * @return + */ + @GET("/home/tabV3/pageRoom") + suspend fun apiHomeTabHome( + @Query("tabId") tabId: Int, + @Query("pageNum") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 首页改版资源位 + * + * @return + */ + @GET("/home/currentResource") + suspend fun getCurrentResource(): ServiceResult> + + /** + * 首页资源位跳转 + * + * @return + */ + @GET("/home/pickResource") + suspend fun getResourceJumpInfo(@Query("id") id: Int): ServiceResult + + /** + * 资源列表(预加载) + * + * @return - + */ + @GET("resource/effect") + suspend fun getEffectResourceList(): ServiceResult> + + /** + * 首页-聚合排行榜 + */ + @GET("home/getRankSlideshow") + suspend fun getHomeRankList(): ServiceResult>> + + /** + * 首页-我的房间 + */ + @GET("home/getMyRoom") + suspend fun getMyRoomInfo(): ServiceResult + + /** + * 首页-最近访问房间 + */ + @GET("/home/recent/pageRoom") + suspend fun getHomeHistoryRoomList( + @Query("pageNum") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 首页-我的收藏房间 + */ + @GET("/home/collect/pageRoom") + suspend fun getHomeMyCollectRoomList( + @Query("pageNum") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 个人主页 + */ + @GET("personal/center/list") + suspend fun requestMeCenterInfoList(): ServiceResult> + + /** + * 反馈配置 + */ + @GET("feedback/getConfig") + suspend fun getFeedbackConfig(): ServiceResult + + /** + * 反馈 + */ + @POST("feedback/commit") + suspend fun commitFeedback( + @Query("contact") contact: String, + @Query("desc") desc: String, + @Query("screenUrl") screenUrl: String, + @Query("type") type: String? + ): ServiceResult + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/home/model/ICommunityNoticeModel.java b/core/src/main/java/com/chwl/core/home/model/ICommunityNoticeModel.java new file mode 100644 index 0000000..e7bf48c --- /dev/null +++ b/core/src/main/java/com/chwl/core/home/model/ICommunityNoticeModel.java @@ -0,0 +1,14 @@ +package com.chwl.core.home.model; + +import com.chwl.core.community.bean.CommunityNoticeInfo; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +import io.reactivex.Single; + +public interface ICommunityNoticeModel extends IMvpBaseView { + + Single> getMsg(long uid, Long id, int pageSize); + Single delete(long uid); +} diff --git a/core/src/main/java/com/chwl/core/im/CustomNotifyType.java b/core/src/main/java/com/chwl/core/im/CustomNotifyType.java new file mode 100644 index 0000000..64750ce --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/CustomNotifyType.java @@ -0,0 +1,6 @@ +package com.chwl.core.im; + +public class CustomNotifyType { + //异性匹配 + public static final int SEX_MATCH = 36; +} diff --git a/core/src/main/java/com/chwl/core/im/GreetModel.java b/core/src/main/java/com/chwl/core/im/GreetModel.java new file mode 100644 index 0000000..2ea2f63 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/GreetModel.java @@ -0,0 +1,35 @@ +package com.chwl.core.im; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class GreetModel extends BaseModel { + + private Api api; + + public GreetModel(){ + api = RxNet.create(Api.class); + } + + public Single> greetMsgGetOne(long uid, long toUid) { + return api.greetMsgGetOne(uid, toUid).compose(RxHelper.handleSchAndExce()); + } + + /*********************************************************************************************************************************************************/ + + private interface Api { + + /** + * 随机获取一条打招呼消息 + */ + @POST("greet/msg/getOne") + Single> greetMsgGetOne(@Query("uid") long uid, @Query("toUid") long toUid); + + } +} diff --git a/core/src/main/java/com/chwl/core/im/RefreshInRoomListEvent.java b/core/src/main/java/com/chwl/core/im/RefreshInRoomListEvent.java new file mode 100644 index 0000000..e5a9513 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/RefreshInRoomListEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.im; + +import lombok.Data; + +/** + * 刷新关注用户在房间内的列表 + */ +@Data +public class RefreshInRoomListEvent { +} diff --git a/core/src/main/java/com/chwl/core/im/avroom/IAVRoomCoreClient.java b/core/src/main/java/com/chwl/core/im/avroom/IAVRoomCoreClient.java new file mode 100644 index 0000000..e2a91cd --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/avroom/IAVRoomCoreClient.java @@ -0,0 +1,49 @@ +package com.chwl.core.im.avroom; + +import com.chwl.library.coremanager.ICoreClient; + +import java.util.Map; + +/** + * Created by zhouxiangfeng on 2017/6/6. + */ + +public interface IAVRoomCoreClient extends ICoreClient { + + public static final String METHOD_ON_CREAT_AV_ROOM = "onCreatAVRoom"; + public static final String METHOD_ON_CREAT_AV_ROOM_FAITH = "onCreatAVRoomFail"; + public static final String METHOD_ON_JOIN_AV_ROOM = "onJoinAVRoom"; + public static final String METHOD_ON_JOIN_AV_ROOM_FAITH = "onJoinAVRoomFail"; + public static final String METHOD_ON_LEAVE_AV_ROOM = "onLeaveAVRoom"; + public static final String METHOD_ON_SPEEK = "onSpeek"; + public static final String METHOD_ON_AUDIO_MIXING_FINISHED = "onAudioMixingFinished"; + public static final String METHOD_ON_AUDIO_MIXING_STARTED = "onAudioMixingStarted"; + public static final String METHOD_ON_AUDIO_MIXING_ERROR = "onAudioMixingError"; + public static final String METHOD_ON_USER_MUTE_AUDIO = "onUserMuteAudio"; + public static final String METHOD_ON_MY_AUDIO_MUTE = "onMyAudioMute"; + public static final String METHOD_ON_NETWORK_BAD = "onNetworkBad"; + public static final String METHOD_ON_CONNECT_LOST= "onConnectionLost"; + + void onAudioMixingStarted(); + void onAudioMixingFinished(); + void onAudioMixingError(); + + void onNetworkBad(); + + void onConnectionLost(); + + void onCreatAVRoom(); + void onCreatAVRoomFail(); + + void onJoinAVRoom(); + void onJoinAVRoomFail(int code); + + void onLeaveAVRoom(); + + void onSpeek(Map map); + + void onUserMuteAudio(int uid); + + void onMyAudioMute(); + +} diff --git a/core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxHelper.java b/core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxHelper.java new file mode 100644 index 0000000..5fb816e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxHelper.java @@ -0,0 +1,158 @@ +package com.chwl.core.im.chatterbox; + +import android.text.TextUtils; + +import com.chwl.core.im.chatterbox.bean.CanSendInfo; +import com.chwl.core.im.chatterbox.bean.TopicBoxItemInfo; +import com.netease.nim.uikit.business.session.helper.MessageListPanelHelper; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.CustomMessageConfig; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.im.custom.bean.ChatterBoxAttachment; +import com.chwl.core.im.custom.bean.ChatterBoxInitAttachment; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.SharedPreferenceUtils; +import com.chwl.core.utils.net.BeanObserver; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.functions.BiConsumer; + +public class ChatterBoxHelper { + public static String sessionId; + private static boolean canGo = true; + + public static void topicBoxCanSend() { + if (!TextUtils.isEmpty(sessionId)) { + + if (canGo) + ChatterBoxModel.get().topicBoxMsgCanSend(AuthModel.get().getCurrentUid(), Long.valueOf(sessionId)).subscribe(new BeanObserver() { + @Override + public void onErrorMsg(String error) { + + } + + @Override + public void onSuccess(CanSendInfo canSendInfo) { + if (canSendInfo != null) { + try { + boolean canSend = canSendInfo.isResult(); + if (canSend) { + getTopicBoxItemList(); + canGo = false; + + } else { + SingleToastUtil.showToast(canSendInfo.getReason()); + } + + } catch (Exception e) { + SingleToastUtil.showToast(ResUtil.getString(R.string.im_chatterbox_chatterboxhelper_01)); + } + } + + } + }); + + else + SingleToastUtil.showToast(ResUtil.getString(R.string.im_chatterbox_chatterboxhelper_02)); + + + } + + } + + @SuppressWarnings("CheckResult") + private static void getTopicBoxItemList() { + ChatterBoxModel.get().topicBoxItemList().subscribe(new BeanObserver>() { + @Override + public void onErrorMsg(String error) { + + } + + @Override + public void onSuccess(List topicBoxItemInfos) { + + if (topicBoxItemInfos != null && topicBoxItemInfos.size() > 0) { + sendChatterBoxMessage(sessionId, topicBoxItemInfos).subscribe(new BiConsumer() { + @Override + public void accept(IMMessage imMessage, Throwable throwable) throws Exception { + if (imMessage != null) { + topicBoxReport(AuthModel.get().getCurrentUid(), Long.valueOf(imMessage.getSessionId())); + + MessageListPanelHelper.getInstance().notifyAddMessage(imMessage); + + } + + } + }); + + } + } + }); + + } + + private static void topicBoxReport(long from, long to) { + ChatterBoxModel.get().topicBoxMsgReport(from, to, ChatterBoxModel.FLAG_TYPE_CHATTER_BOX) + .subscribe(new BeanObserver() { + @Override + public void onErrorMsg(String error) { + canGo = true; + } + + @Override + public void onSuccess(Object o) { + canGo = true; + } + }); + } + + /** + * 私聊界面发送礼物消息 + */ + private static Single sendChatterBoxMessage(String sessionId, List taskList) { + UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); + if (myUserInfo == null) return Single.error(new Throwable("current cached user is null")); + + ChatterBoxAttachment chatterBoxAttachment = new ChatterBoxAttachment(); + chatterBoxAttachment.listArray = taskList; + + CustomMessageConfig customMessageConfig = new CustomMessageConfig(); + customMessageConfig.enablePush = false; + IMMessage imMessage = MessageBuilder.createCustomMessage(sessionId, + SessionTypeEnum.P2P, "", chatterBoxAttachment, customMessageConfig); + return IMNetEaseManager.get() + .sendMessageSingle(imMessage); + } + + public static void reset() { + sessionId = ""; + canGo = true; + } + + public static void sendInitTips(String sessionId) { + if (TextUtils.isEmpty(sessionId)) + return; + + boolean inited = (boolean) SharedPreferenceUtils.get(sessionId + "chatter_init", false); + + if (!inited) { + ChatterBoxInitAttachment chatterBoxInitAttachment = new ChatterBoxInitAttachment(); + IMMessage imMessage = MessageBuilder.createCustomMessage( String.valueOf(sessionId), SessionTypeEnum.P2P, chatterBoxInitAttachment); + imMessage.setFromAccount(String.valueOf(AuthModel.get().getCurrentUid())); + imMessage.setStatus(MsgStatusEnum.success); + IMNetEaseManager.get().saveMessageToLocal(imMessage, true); + + SharedPreferenceUtils.put(sessionId + "chatter_init", true); + } + } +} diff --git a/core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxModel.java b/core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxModel.java new file mode 100644 index 0000000..1a1caf9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/chatterbox/ChatterBoxModel.java @@ -0,0 +1,96 @@ +package com.chwl.core.im.chatterbox; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.im.chatterbox.bean.CanSendInfo; +import com.chwl.core.im.chatterbox.bean.TopicBoxItemInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class ChatterBoxModel extends BaseModel implements IChatterBoxModel{ + + public static final int FLAG_TYPE_CHATTER_BOX = 1; + public static final int FLAG_TYPE_THROW_DICE = 2; + + private final ChatterBoxModel.Api api = RxNet.create(ChatterBoxModel.Api.class); + + private static final class Helper { + public static final ChatterBoxModel INSTANCE = new ChatterBoxModel(); + } + + public static ChatterBoxModel get() { + return Helper.INSTANCE; + } + + @Override + public Single> topicBoxItemList() { + return api.topicBoxItemList().compose(RxHelper.handleCommon()); + } + + @Override + public Single topicBoxMsgReport(long from, long to, int type) { + return api.topicBoxMsgReport(from, to, type).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult != null && objectServiceResult.getCode() == ServiceResult.SC_SUCCESS) { + return Single.just("report success"); + + } else { + return Single.error(new Throwable("error")); + } + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single topicBoxMsgCanSend(long from, long to) { + return api.topicBoxMsgCanSend(from, to).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult != null && objectServiceResult.getCode() == ServiceResult.SC_SUCCESS) { + return Single.just(objectServiceResult.getData()); + } else + return Single.error(new Throwable("error")); + } + }).compose(RxHelper.handleSchAndExce()); + } + + private interface Api { + /** + * 获取话匣子列表 + */ + @POST("topicBoxItem/list") + Single>> topicBoxItemList(); + + + /** + * 获取话匣子消息上报 + * + * @param from 消息发送方uid + * @param to 消息接收方uid + * @param type 上报类型 + * 1 - 话匣子消息 + * 2 - 抛点数消息 + */ + @POST("topicBoxMsg/report") + Single> topicBoxMsgReport(@Query("from") long from, @Query("to") long to, @Query("type") int type); + + /** + * 判断话匣子消息是否可以发送 + * + * @param from 消息发送方uid + * @param to 消息接收方uid + */ + @POST("topicBoxMsg/canSend") + Single> topicBoxMsgCanSend(@Query("from") long from, @Query("to") long to); + + } +} diff --git a/core/src/main/java/com/chwl/core/im/chatterbox/HideInputEvent.java b/core/src/main/java/com/chwl/core/im/chatterbox/HideInputEvent.java new file mode 100644 index 0000000..ff3cb49 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/chatterbox/HideInputEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.im.chatterbox; + +public class HideInputEvent { +} diff --git a/core/src/main/java/com/chwl/core/im/chatterbox/IChatterBoxModel.java b/core/src/main/java/com/chwl/core/im/chatterbox/IChatterBoxModel.java new file mode 100644 index 0000000..6af2a3a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/chatterbox/IChatterBoxModel.java @@ -0,0 +1,15 @@ +package com.chwl.core.im.chatterbox; + +import com.chwl.core.base.IModel; +import com.chwl.core.im.chatterbox.bean.CanSendInfo; +import com.chwl.core.im.chatterbox.bean.TopicBoxItemInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IChatterBoxModel extends IModel { + Single> topicBoxItemList(); + Single topicBoxMsgReport(long from, long to, int type); + Single topicBoxMsgCanSend(long from, long to); +} diff --git a/core/src/main/java/com/chwl/core/im/chatterbox/bean/CanSendInfo.java b/core/src/main/java/com/chwl/core/im/chatterbox/bean/CanSendInfo.java new file mode 100644 index 0000000..6ca8189 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/chatterbox/bean/CanSendInfo.java @@ -0,0 +1,9 @@ +package com.chwl.core.im.chatterbox.bean; + +import lombok.Data; + +@Data +public class CanSendInfo { + private boolean result; + private String reason; +} diff --git a/core/src/main/java/com/chwl/core/im/chatterbox/bean/TopicBoxItemInfo.java b/core/src/main/java/com/chwl/core/im/chatterbox/bean/TopicBoxItemInfo.java new file mode 100644 index 0000000..2a552dc --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/chatterbox/bean/TopicBoxItemInfo.java @@ -0,0 +1,9 @@ +package com.chwl.core.im.chatterbox.bean; + +import lombok.Data; + +@Data +public class TopicBoxItemInfo { + private int id; + private String content; // 话匣子内容 +} diff --git a/core/src/main/java/com/chwl/core/im/custom/AttachManager.java b/core/src/main/java/com/chwl/core/im/custom/AttachManager.java new file mode 100644 index 0000000..50fe696 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/AttachManager.java @@ -0,0 +1,35 @@ +package com.chwl.core.im.custom; + +import android.util.SparseArray; + +import com.chwl.core.im.custom.bean.CustomAttachment; + +/** + * + * Created by lvzebiao on 2019/1/7. + */ + +public class AttachManager { + + public static SparseArray> array = new SparseArray<>(); + + public static void register(int first, Class attachment) { + array.put(first, attachment); + } + + public static CustomAttachment getCustomAttachment(int first, int second) { + if (array.get(first) == null) { + return null; + } + try { + CustomAttachment attachment = array.get(first).newInstance(); + attachment.setFirst(first); + attachment.setSecond(second); + return attachment; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/ActivityTimerAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/ActivityTimerAttachment.java new file mode 100644 index 0000000..5a32525 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/ActivityTimerAttachment.java @@ -0,0 +1,40 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.room.activitytimer.TimerBean; + +import lombok.Getter; + +/** + * 活动的暴走倒计时 + * create by lvzebiao @2020/2/24 + */ +public class ActivityTimerAttachment extends CustomAttachment{ + + @Getter + private TimerBean timerBean; + + public ActivityTimerAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_ACTIVITY, CUSTOM_MSG_SUB_TYPE_ACTIVITY_TIMER); + } + + @Override + protected void parseData(JSONObject data) { + try { + timerBean = new Gson().fromJson(data.toJSONString(), TimerBean.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + protected JSONObject packData() { + try { + return JSONObject.parseObject(new Gson().toJson(timerBean)); + } catch (Exception ex) { + ex.printStackTrace(); + } + return new JSONObject(); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/AssistantAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/AssistantAttachment.java new file mode 100644 index 0000000..92fbc4f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/AssistantAttachment.java @@ -0,0 +1,49 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * 小秘书通用消息 + * Created by huangmeng1 on 2018/4/11. + */ + +public class AssistantAttachment extends CustomAttachment { + public String msg; + public int routerType; + public String routerValue; + public String title; + public int mSecond; + + public AssistantAttachment() { + super(CUSTOM_MSG_ASSISTANT_MSG, CUSTOM_MSG_ASSISTANT_COMMON_MSG); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("msg")) { + msg = data.getString("msg"); + } + if (data.containsKey("routerType")) { + routerType = data.getInteger("routerType"); + } + if (data.containsKey("routerValue")) { + routerValue = data.getString("routerValue"); + } + if (data.containsKey("title")) { + title = data.getString("title"); + } + } + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("routerType", routerType); + jsonObject.put("msg", msg); + jsonObject.put("routerValue", routerValue); + jsonObject.put("title", title); + return jsonObject; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/AuctionAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/AuctionAttachment.java new file mode 100644 index 0000000..f37e29d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/AuctionAttachment.java @@ -0,0 +1,76 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.room.auction.bean.AuctionInfo; +import com.chwl.core.room.auction.bean.AuctionUser; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/6/8. + */ + +public class AuctionAttachment extends CustomAttachment { + + private String uid; + + private AuctionInfo auctionInfo; + + public AuctionInfo getAuctionInfo() { + return auctionInfo; + } + + public void setAuctionInfo(AuctionInfo auctionInfo) { + this.auctionInfo = auctionInfo; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public AuctionAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data1) { + this.auctionInfo = new AuctionInfo(); + this.auctionInfo.setUid(data1.getLong("uid")); + this.auctionInfo.setAuctId(data1.getString("auctId")); + this.auctionInfo.setAuctUid(data1.getLong("auctUid")); + this.auctionInfo.setAuctMoney(data1.getInteger("auctMoney")); + this.auctionInfo.setServDura(data1.getInteger("servDura")); + this.auctionInfo.setMinRaiseMoney(data1.getInteger("minRaiseMoney")); + this.auctionInfo.setCurMaxUid(data1.getLong("curMaxUid")); + this.auctionInfo.setCurMaxMoney(data1.getInteger("curMaxMoney")); + this.auctionInfo.setAuctDesc(data1.getString("auctDesc")); +// this.auctionInfo.setCreateTime(data1.getLong("createTime")); + this.auctionInfo.setCurStatus(data1.getInteger("curStatus")); + + JSONArray rivals = data1.getJSONArray("rivals"); + List rivalList = new ArrayList<>(); + if (rivals != null) { + for (int i = 0; i < rivals.size(); i++) { + JSONObject rivalJson = (JSONObject) rivals.get(i); + AuctionUser order = new AuctionUser(rivalJson.getString("rivalId"), rivalJson.getString("auctId"), rivalJson.getLong("uid"), rivalJson.getInteger("auctMoney")); + rivalList.add(order); + } + } + this.auctionInfo.setRivals(rivalList); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", uid); + object.put("data", new Gson().toJson(auctionInfo)); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/BoomMsgAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/BoomMsgAttachment.kt new file mode 100644 index 0000000..71ade87 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/BoomMsgAttachment.kt @@ -0,0 +1,82 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONArray +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.BoomMsgAwardBean +import com.chwl.core.gift.bean.BoomMsgAwardList +import com.chwl.core.gift.bean.BoomMsgDialogBean +import com.chwl.core.gift.bean.BoomMsgExpPushBean +import com.chwl.core.utils.WLog.writeLog +import com.google.gson.Gson + +class BoomMsgAttachment (first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var expPushBean : BoomMsgExpPushBean?=null + @JvmField + var DialogBean : BoomMsgDialogBean?=null + @JvmField + var awardList : BoomMsgAwardList?=null + + override fun parseData(data: JSONObject?) { + super.parseData(data) + writeLog("本地日志 BoomMsgAttachment parseData second = $second") + if (data != null) { + try { + if (second == BOOM_SECOND_EXP_PUSH) { + expPushBean = Gson().fromJson( + data.toJSONString(), + BoomMsgExpPushBean::class.java + ) + expPushBean?.second = second + writeLog("本地日志 BoomMsgAttachment parseData expPushBean toJSON完毕 second = $second") + }else if (second == BOOM_SECOND_DIALOG) { + DialogBean = Gson().fromJson( + data.toJSONString(), + BoomMsgDialogBean::class.java + ) + DialogBean?.second = second + writeLog("本地日志 BoomMsgAttachment parseData DialogBean toJSON完毕 second = $second") + }else if (second == BOOM_SECOND_AWARD) { + awardList = BoomMsgAwardList() + awardList?.list = Gson().fromJson( + data.toJSONString(), + Array::class.java + ).toList() + awardList?.second = second + writeLog("本地日志 BoomMsgAttachment parseData awardList toJSON完毕 second = $second") + } + } catch (e: Exception) { + e.printStackTrace() + writeLog("本地日志 BoomMsgAttachment parseData toJSON失败 second = $second error+"+e.message) + } + } + } + + override fun parseDataArr(data: JSONArray?) { + super.parseDataArr(data) + writeLog("本地日志 BoomMsgAttachment parseDataArr second = $second ") + if (data != null) { + try { + if (second == BOOM_SECOND_AWARD) { + awardList = BoomMsgAwardList() + awardList?.list = Gson().fromJson( + data.toJSONString(), + Array::class.java + ).toList() + awardList?.second = second + writeLog("本地日志 BoomMsgAttachment parseDataArr awardList toJSON完毕 second = $second ") + } + } catch (e: Exception) { + e.printStackTrace() + writeLog("本地日志 BoomMsgAttachment parseDataArr toJSON失败 second = $second error+"+e.message) + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftNotifyAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftNotifyAttachment.kt new file mode 100644 index 0000000..b1826a4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftNotifyAttachment.kt @@ -0,0 +1,35 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.BravoGiftMsgNotifyBean +import com.google.gson.Gson + +class BravoGiftNotifyAttachment(first: Int, second: Int) : CustomAttachment(first, second) { + + @JvmField + var bravoData: BravoGiftMsgNotifyBean? = null + + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + if (second == CUSTOM_MSG_SUPER_BRAVO_GIFT_NOTIFY) { + bravoData = Gson().fromJson( + data.toJSONString(), + BravoGiftMsgNotifyBean::class.java + ) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftRewardAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftRewardAttachment.kt new file mode 100644 index 0000000..4e6640d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/BravoGiftRewardAttachment.kt @@ -0,0 +1,37 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.BravoGiftRewardBean +import com.chwl.library.common.util.doLogE +import com.google.gson.Gson + +class BravoGiftRewardAttachment(first: Int, second: Int) : CustomAttachment(first, second) { + + @JvmField + var bravoData: BravoGiftRewardBean? = null + + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + if (second == CUSTOM_MSG_SUPER_BRAVO_GIFT_REWARD) { + bravoData = Gson().fromJson( + data.toJSONString(), + BravoGiftRewardBean::class.java + ) + } + } catch (e: Exception) { + e.printStackTrace() + "错误 ${e.message}".doLogE() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CarAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CarAttachment.java new file mode 100644 index 0000000..fdc2419 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CarAttachment.java @@ -0,0 +1,63 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + *

座驾协议通知

+ * + * @author jiahui + * date 2018/3/1 + */ +public class CarAttachment extends CustomAttachment { + public int mSecond; + public String msg; + + public String nick; + public long uid; + public String effect; + + public int otherViewType; + + public String viewUrl; + + public CarAttachment(int first, int second) { + super(first, second); + mSecond = second; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("msg")) { + msg = data.getString("msg"); + } + if (data.containsKey("nick")) { + nick = data.getString("nick"); + } + if (data.containsKey("uid")) { + uid = data.getLong("uid"); + } + if (data.containsKey("effect")) { + effect = data.getString("effect"); + } + if (data.containsKey("otherViewType")) { + otherViewType = data.getIntValue("otherViewType"); + } + if (data.containsKey("viewUrl")) { + viewUrl = data.getString("viewUrl"); + } + } + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("effect", effect); + jsonObject.put("nick", nick); + jsonObject.put("uid", uid); + jsonObject.put("otherViewType", otherViewType); + jsonObject.put("viewUrl", viewUrl); + return jsonObject; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldAttachment.java new file mode 100644 index 0000000..be89fad --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldAttachment.java @@ -0,0 +1,42 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +import lombok.Getter; + +/** + * 钻石瓜分 + * create by lvzebiao @2019/3/29 + */ +public class CarveUpGoldAttachment extends CustomAttachment { + + private String nick; + + @Getter + private int goldNum; + + public String getNick() { + if (nick == null) { + nick = ""; + } + return nick; + } + + public CarveUpGoldAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject jsonObject) { + nick = jsonObject.getString("nick"); + goldNum = jsonObject.getInteger("goldNum"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("goldNum", goldNum); + object.put("nick", nick); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldSecondLevelAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldSecondLevelAttachment.java new file mode 100644 index 0000000..6ded204 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldSecondLevelAttachment.java @@ -0,0 +1,13 @@ +package com.chwl.core.im.custom.bean; + +/** + * 瓜分钻石,二级,房间公屏 + * create by lvzebiao @2019/3/29 + */ +public class CarveUpGoldSecondLevelAttachment extends CarveUpGoldAttachment { + + + public CarveUpGoldSecondLevelAttachment(int first, int second) { + super(first, second); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldThirdLevelAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldThirdLevelAttachment.java new file mode 100644 index 0000000..e38f550 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CarveUpGoldThirdLevelAttachment.java @@ -0,0 +1,12 @@ +package com.chwl.core.im.custom.bean; + +/** + * 瓜分钻石,三级,房间公屏+小秘书 + * create by lvzebiao @2019/3/29 + */ +public class CarveUpGoldThirdLevelAttachment extends CarveUpGoldAttachment { + + public CarveUpGoldThirdLevelAttachment(int first, int second) { + super(first, second); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/ChatHintAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/ChatHintAttachment.java new file mode 100644 index 0000000..63397f2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/ChatHintAttachment.java @@ -0,0 +1,30 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + + +public class ChatHintAttachment extends CustomAttachment { + + private String content; + + public ChatHintAttachment( int second) { + super(CUSTOM_MSG_CHAT_HINT, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + content = data.getString("content"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("content", content); + return object; + } + + public String getContent() { + return content; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxAttachment.java new file mode 100644 index 0000000..780d29e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxAttachment.java @@ -0,0 +1,39 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.chatterbox.bean.TopicBoxItemInfo; + +import java.util.List; + +public class ChatterBoxAttachment extends CustomAttachment { + + public List listArray; + public long startTime; + + public ChatterBoxAttachment() { + super(CustomAttachment.CUSTOM_MSG_CHATTER_BOX, CustomAttachment.CUSTOM_MSG_CHATTER_BOX_ASK); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + if (listArray != null) + jsonObject.put("listArray", listArray); + + jsonObject.put("startTime", System.currentTimeMillis()); + return jsonObject; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("listArray")) { + listArray = data.getJSONArray("listArray").toJavaList(TopicBoxItemInfo.class); + } + + if (data.containsKey("startTime")) + startTime = data.getLongValue("startTime"); + } + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxInitAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxInitAttachment.java new file mode 100644 index 0000000..b72a4fe --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/ChatterBoxInitAttachment.java @@ -0,0 +1,21 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +public class ChatterBoxInitAttachment extends CustomAttachment { + + public ChatterBoxInitAttachment() { + super(CustomAttachment.CUSTOM_MSG_CHATTER_BOX, CustomAttachment.CUSTOM_MSG_CHATTER_BOX_INIT); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + return jsonObject; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CleanScreenAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CleanScreenAttachment.java new file mode 100644 index 0000000..9f1d4ee --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CleanScreenAttachment.java @@ -0,0 +1,51 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + + +public class CleanScreenAttachment extends CustomAttachment { + private long uid; + private String nick; + private int roleType; + + public CleanScreenAttachment(int first, int second) { + super(first, second); + } + + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public int getRoleType() { + return roleType; + } + + public void setRoleType(int roleType) { + this.roleType = roleType; + } + + @Override + protected void parseData(JSONObject data) { + uid = data.getLongValue("uid"); + nick = data.getString("nick"); + roleType = data.getIntValue("roleType"); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CpInviteAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CpInviteAttachment.java new file mode 100644 index 0000000..9db150d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CpInviteAttachment.java @@ -0,0 +1,50 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.relation.cp.bean.CpInviteInfo; +import com.chwl.core.relation.cp.bean.CpInviteMessage; + +public class CpInviteAttachment extends CustomAttachment { + + public String msg; + public int routerType; + public String routerValue; + public String title; + public int mSecond; + private CpInviteInfo entity; + + final String TAG = "CpInviteAttachment"; + + public CpInviteAttachment(int second) { + super(CustomAttachment.CP_INVITE_MESSAGE, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + final Gson gson = new Gson(); + CpInviteMessage inviteMessage = gson.fromJson(data.toJSONString(), CpInviteMessage.class); + msg = inviteMessage.getMsg(); + title = inviteMessage.getTitle(); + routerType = inviteMessage.getRouterType(); + routerValue = inviteMessage.getPopInfo(); + entity = gson.fromJson(routerValue,CpInviteInfo.class); + } + } + + public CpInviteInfo getEntity() { + return entity; + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("routerType", routerType); + jsonObject.put("msg", msg); + jsonObject.put("propInfo", routerValue); + jsonObject.put("title", title); + return jsonObject; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt new file mode 100644 index 0000000..9b7fe7c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CpMsgAttachment.kt @@ -0,0 +1,34 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.CpMsgBean +import com.chwl.core.gift.bean.LuckyGiftMsgAllBean +import com.chwl.core.gift.bean.LuckyGiftMsgSelfBean +import com.google.gson.Gson + +class CpMsgAttachment (first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var cpMsgBean : CpMsgBean?=null + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + cpMsgBean = Gson().fromJson( + data.toJSONString(), + CpMsgBean::class.java + ) + cpMsgBean?.second = second + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java new file mode 100644 index 0000000..d5b3658 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachParser.java @@ -0,0 +1,731 @@ +package com.chwl.core.im.custom.bean; + +import static com.chwl.core.im.custom.bean.CustomAttachment.*; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.R; +import com.chwl.core.bean.attachmsg.RoomQueueMsgAttachment; +import com.chwl.core.community.attachment.DynamicSysAttachment; +import com.chwl.core.community.attachment.UnReadCountAttachment; +import com.chwl.core.community.im.WorldDynamicAttachment; +import com.chwl.core.gift.GiftModel; +import com.chwl.core.im.custom.AttachManager; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionFourAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionOneAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionThreeAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionTwoAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionFourAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionOneAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionThreeAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionTwoAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMissionTipsAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringSharingRoomAttachment; +import com.chwl.core.miniworld.bean.MWChatMemberCountAttachment; +import com.chwl.core.miniworld.bean.MWChatTopicAttachment; +import com.chwl.core.miniworld.bean.OpenAudioPartyAttachment; +import com.chwl.core.module_hall.im.ClanAttachment; +import com.chwl.core.module_hall.im.FamilyAttachment; +import com.chwl.core.public_chat_hall.attachment.AitFriendsAttachment; +import com.chwl.core.public_chat_hall.attachment.AitMeAttachment; +import com.chwl.core.room.bean.LeaveModeAttachment; +import com.chwl.core.room.pk.attachment.RoomPkAttachment; +import com.chwl.core.room.queuing_mic.attachment.QueuingMicAttachment; +import com.chwl.core.super_admin.attachment.SuperAdminOpAttachment; +import com.chwl.core.super_admin.util.SaMsgUtil; +import com.chwl.core.utils.LogUtils; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.log.MLog; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachmentParser; + +/** + * 云信自定义消息解析器 + * + * @author zhouxiangfeng + * @date 2017/6/8 + */ +public class CustomAttachParser implements MsgAttachmentParser { + private static final String TAG = "CustomAttachParser"; + + public static String packData(int first, int second, JSONObject data) { + JSONObject object = new JSONObject(); + object.put("first", first); + object.put("second", second); + if (data != null) { + object.put("data", data); + } + return object.toJSONString(); + } + + // 根据解析到的消息类型,确定附件对象类型 + @Override + public MsgAttachment parse(String json) { + CustomAttachment attachment = null; + MLog.info(TAG, json); + try { + JSONObject object = JSON.parseObject(json); + int first = object.getInteger("first"); + int second = object.getInteger("second"); +// OtherExtKt.doLog("IM消息 收到 first = "+first+" second = "+second ); + switch (first) { + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_AUCTION: + attachment = new AuctionAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT: + OtherExtKt.doLog("礼物IM消息 收到 first = 3 second = "+second ); + 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) { + attachment = new MultiLuckyGiftAttachment(first, second); + }else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_SERVICE_GIFT) { + attachment = new GiftAllServiceAttachment(first, second); + }else if (second == CustomAttachment.CUSTOM_MSG_ALL_SERVICE_GIFT) { + attachment = new GiftAllServiceNotifyAttachment(first, second); + } + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT) { + 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) { + attachment = new MultiLuckyGiftAttachment(first, second); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT) { + attachment = new MultiLuckyGiftAttachment(first, second); + } + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_OPEN_ROOM_NOTI: + attachment = new OpenRoomNotiAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE: + attachment = new RoomQueueMsgAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FACE: + attachment = new FaceAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_NOTICE: + attachment = new NoticeAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP: + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FOLLOW_ROOM: + attachment = new RoomTipAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PACKET: + attachment = new RedPacketAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LOTTERY: + attachment = new LotteryAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MESS_HEAD_NOBLE: + attachment = new NobleAttachment(first, second); + break; + case CUSTOM_MESS_HEAD_CAR: + attachment = new CarAttachment(first, second); + break; + case CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC: + if (second == CUSTOM_MSG_SUB_TYPE_SEND_MULTI_MAGIC) { + // 多个魔法 + attachment = new MagicAllMicAttachment(); + } else if (second == CUSTOM_MSG_SUB_TYPE_SEND_SINGLE_MAGIC) { + // 单个魔法 + attachment = new MagicAttachment(); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_MAGIC) { + attachment = new MagicBatchAttachment(); + } + break; + case CUSTOM_MSG_HEADER_TYPE_KICK_MIC: + if (second == CUSTOM_MSG_SUB_TYPE_SEND_KICK_ROOM) { + // 踢出房间 + attachment = new RoomQueueMsgAttachment(CUSTOM_MSG_HEADER_TYPE_KICK_MIC, CUSTOM_MSG_SUB_TYPE_SEND_KICK_ROOM); + } else if (second == CUSTOM_MSG_SUB_TYPE_SEND_ADD_BLACK) { + // 拉黑 + attachment = new RoomQueueMsgAttachment(CUSTOM_MSG_HEADER_TYPE_KICK_MIC, CUSTOM_MSG_SUB_TYPE_SEND_ADD_BLACK); + } + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING: + switch (second) { + case CUSTOM_NOTI_SUB_GAME_ATTACK: + attachment = new MonsterAttackAttachment(); + break; + + case CUSTOM_NOTI_SUB_GAME_RESULT: + attachment = new MonsterHuntingResultAttachment(); + break; + + default: + attachment = new MonsterStatusAttachment(second); + break; + } + break; + case CUSTOM_MSG_ASSISTANT_MSG: + if (second == CUSTOM_MSG_ASSISTANT_COMMON_MSG) { + attachment = new AssistantAttachment(); + } + break; + + case CUSTOM_MSG_UPDATE_ROOM_INFO: + switch (second) { + case CUSTOM_MSG_UPDATE_ROOM_INFO_GIFT: + case CUSTOM_MSG_UPDATE_ROOM_INFO_AUDIO: + case CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_SCREEN: + case CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_REDPACKAGE: + attachment = new RoomInfoAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, second); + break; + + case CUSTOM_MSG_UPDATE_ROOM_INFO_NOTICE: + attachment = new RoomNoticeAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, second); + break; + case CUSTOM_MSG_UPDATE_ROOM_INFO_CLEAN_SCREEN: + attachment = new CleanScreenAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, second); + break; + } + break; + + case CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY: + switch (second) { + case CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_MONEY: + attachment = new LuckyMoneyAttachment(); + break; + + case CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY: + attachment = new LuckyMoneyTipsAttachment(); + break; + } + break; + + case CUSTOM_MSG_MINI_WORLD: + switch (second) { + case CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT: + attachment = new MWChatMemberCountAttachment(); + break; + + case CUSTOM_MSG_GROUP_CHAT_TOPIC: + attachment = new MWChatTopicAttachment(); + break; + + case CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY: + attachment = new OpenAudioPartyAttachment(); + break; + case CUSTOM_MSG_GROUP_ROOM_JOIN_NOTICE: + attachment = new JoinMiniWorldNoticeAttachment(); + break; + } + break; + + case CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP: + switch (second) { + case CUSTOM_MSG_SHARE_ROOM: + attachment = new InAppSharingRoomAttachment(); + break; + + case CUSTOM_MSG_SHARE_FAMILY: + attachment = new InAppSharingFamilyAttachment(); + break; + + case CUSTOM_MSG_SHARE_TEAM: + attachment = new InAppSharingTeamAttachment(); + break; + + case CUSTOM_MSG_SHARE_MINI_WORLD: + attachment = new InAppSharingMiniWorldAttachment(); + break; + } + break; + case CUSTOM_MSG_LEVEL_UP: + switch (second) { + case CUSTOM_MSG_EXPER_LEVEL_UP: + case CUSTOM_MSG_CHARM_LEVEL_UP: + attachment = new LevelUpAttachment(CUSTOM_MSG_LEVEL_UP, second); + break; + case CUSTOM_MSG_EXPER_LEVEL_UP_NOTICE: + attachment = new LevelUpNoticeAttachment(CUSTOM_MSG_LEVEL_UP, second); + break; + } + break; + case CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG: + attachment = new SysMsgAttachment(CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG, second); + break; + + case CUSTOM_MSG_HEAD_SHIFT_OUT: + attachment = new SysMsgAttachment(CUSTOM_MSG_HEAD_SHIFT_OUT, second); + break; + + case CUSTOM_MSG_DRAGON_BAR: + attachment = new FaceAttachment(CUSTOM_MSG_DRAGON_BAR, second); + break; + case CUSTOM_MSG_BOX: + attachment = new RoomBoxPrizeAttachment(CUSTOM_MSG_BOX, second); + break; + case CUSTOM_MSG_PUBLIC_CHAT_HALL: + switch (second) { + case CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT: + attachment = new AitFriendsAttachment(); + break; + + case CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT_ME: + attachment = new AitMeAttachment(); + break; + + case CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_GIFT: + attachment = new GiftAttachment(CUSTOM_MSG_PUBLIC_CHAT_HALL, + CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_GIFT); + break; + + case CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_FULL_SCREEN: + break; + } + break; + + case CUSTOM_MSG_QUEUING_MIC: + attachment = new QueuingMicAttachment(second); + break; + + case CUSTOM_MESS_HEAD_ROOM_PK: + attachment = new RoomPkAttachment(second); + break; + + case CUSTOM_MSG_MODULE_HALL: + switch (second) { + case CUSTOM_MSG_SUB_HALL_APPLY_JOIN: + case CUSTOM_MSG_SUB_HALL_MANAGER_INVITE: + case CUSTOM_MSG_SUB_HALL_APPLY_EXIT: + case CUSTOM_MSG_SUB_HALL_NOTICE: + case CUSTOM_MSG_SUB_HALL_TO_BE_OWNER: + attachment = AttachManager.getCustomAttachment(CUSTOM_MSG_MODULE_HALL, + second); + break; + } + + break; + case CUSTOM_MSG_FAMILY: + switch (second) { + case CUSTOM_MSG_FAMILY_INVITE: + case CUSTOM_MSG_FAMILY_DEAL_INVITE: + case CUSTOM_MSG_FAMILY_APPLY: + case CUSTOM_MSG_FAMILY_DEAL_APPLY: + case CUSTOM_MSG_FAMILY_SET_MANAGER: + case CUSTOM_MSG_FAMILY_REMOVE_MEMBER: + case CUSTOM_MSG_FAMILY_CREATE: + case CUSTOM_MSG_FAMILY_DISMISS: + attachment = new FamilyAttachment(second); + break; + } + + break; + case CUSTOM_MSG_CLAN: + switch (second) { + case CUSTOM_MSG_SUB_CLANAPPLY: + case CUSTOM_MSG_SUB_CLANNORMAL: + attachment = new ClanAttachment(second); + break; + } + break; + case CUSTOM_MSG_IM_TIP: + attachment = new ImTipAttachment(CUSTOM_MSG_IM_TIP, second); + break; + case CUSTOM_MSG_MENTORING_RELATIONSHIP: + switch (second) { + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER: + attachment = new MentoringMasterMissionOneAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_APPRENTICE: + attachment = new MentoringApprenticeMissionOneAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_MASTER: + attachment = new MentoringMasterMissionTwoAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_APPRENTICE: + attachment = new MentoringApprenticeMissionTwoAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_MASTER: + attachment = new MentoringMasterMissionThreeAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_APPRENTICE: + attachment = new MentoringApprenticeMissionThreeAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_MASTER: + attachment = new MentoringMasterMissionFourAttachment(); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_APPRENTICE: + attachment = new MentoringApprenticeMissionFourAttachment(); + break; + + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_TIPS: + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_RESULT: + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER_TIPS: + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FAIL_TIPS: + attachment = new MentoringMissionTipsAttachment(second); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_SHARE_ROOM: + attachment = new MentoringSharingRoomAttachment(); + break; + } + break; + //签到 + case CUSTOM_MSG_SIGN_IN: + if (second == CustomAttachment.CUSTOM_MSG_SUB_JUMP_SIGN_IN_ACTIVITY) { + attachment = new OpenSignInAttachment(first, second); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_CARVE_UP_GOLD_SECOND_LEVEL) { + attachment = new CarveUpGoldSecondLevelAttachment(first, second); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_CARVE_UP_GOLD_THIRD_LEVEL) { + attachment = new CarveUpGoldThirdLevelAttachment(first, second); + } + break; + + case CUSTOM_MSG_ROOM_GIFT_VALUE: + if (second == CustomAttachment.CUSTOM_MSG_SUB_GIFT_VALUE_SYNC) { + attachment = new RoomGiftValueAttachment(); + } + break; + + case CUSTOM_MSG_RED_PACKAGE: + switch (second) { + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_DIAMOND: + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ALL_DIAMOND: + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_DIAMOND2: + attachment = new RedPackageAttachment(second); + break; + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_MSG: + attachment = new RedPackageRoomMsgAttachment(second); + break; + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_LUCKY_BAG: + attachment = new RedPackageLuckyBagAttachment(); + break; + } + break; + + case CUSTOM_MSG_LEAVE_MODE: + if (second == CUSTOM_MSG_LEAVE_MODE_NOTICE) { + attachment = new LeaveModeAttachment(); + } + break; + + case CUSTOM_MSG_CHATTER_BOX: + if (second == CUSTOM_MSG_CHATTER_BOX_ASK) { + attachment = new ChatterBoxAttachment(); + + } else if (second == CUSTOM_MSG_CHATTER_BOX_DROP) { + attachment = new DiceThrowAttachment(); + } else if (second == CUSTOM_MSG_CHATTER_BOX_INIT) { + attachment = new ChatterBoxInitAttachment(); + } + break; + case CUSTOM_MSG_VOICE_BOTTLE_HEAD: + if (second == CUSTOM_MSG_VOICE_BOTTLE_SUB_TO_RECORDING) { + attachment = new SysMsgVoiceAttachment(first, second); + } else if (second == CUSTOM_MSG_VOICE_BOTTLE_SUB_tO_MATCHING) { + attachment = new SysMsgVoiceAttachment(first, second); + } else if (second == CUSTOM_MSG_VOICE_BOTTLE_SUB_HELLO) { + attachment = new VoiceBottleSayHiAttachment(first, second); + } else if (second == CUSTOM_MSG_VOICE_BOTTLE_SUB_HEART) { + attachment = new VoiceBottleShakeHeartAttachment(first, second); + } + break; + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN: + if (SaMsgUtil.secondIsValid(second)) { + attachment = new SuperAdminOpAttachment(first, second); + } + break; + + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC: + if (second == CUSTOM_DYNAMTC_PASS) { + attachment = new DynamicSysAttachment(CUSTOM_DYNAMTC_PASS); + } else if (second == CUSTOM_DYNAMTC_BAN_DELETE) { + attachment = new DynamicSysAttachment(CUSTOM_DYNAMTC_BAN_DELETE); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_WORLD_DYNAMIC_SHARE) { + attachment = new WorldDynamicAttachment(first, second); + } else if (second == CUSTOM_DYNAMTC_UNREADCOUNT) { + attachment = new UnReadCountAttachment(); + } + break; + + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ACTIVITY: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_ACTIVITY_TIMER) { + attachment = new ActivityTimerAttachment(); + } + break; + + + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PUBLIC_SCREEN: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_PUBLIC_SCREEN_WELCOME) { + attachment = new WelcomeAttachment(); + } + break; + + case CustomAttachment.CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG_V2: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_TEXT + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_APPROVAL) { + attachment = new SysMsgV2Attachment(first, second); + } + break; + + case CustomAttachment.CUSTOM_MSG_PUSH_NOTIFIFICATION: + 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: + case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY: + attachment = new RoomReceivedLuckyGiftAttachment(second); + break; + default: + break; + } + break; + + case CustomAttachment.CUSTOM_MSG_NEWBIE: + if (second == CustomAttachment.CUSTOM_MSG_RECEIV_NEWBIE_HELLO) { + 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; + } + 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, second); + break; + case CustomAttachment.CUSTOM_MSG_CHAT_HINT: + attachment = new ChatHintAttachment(CustomAttachment.CUSTOM_MSG_SUB_CHAT_HINT); + break; + case CustomAttachment.CUSTOM_MSG_MATCH: + attachment = new MatchAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_MATCH_TICKET: + attachment = new MatchTicketAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_ROOM_PK: + attachment = new RoomPKAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_VIP: + attachment = new VipMessageAttachment(second); + break; + case CustomAttachment.ANCHOR_ROOM_AUDIENCE_UPMIC: + attachment = new RequestUpmicAttachment(CustomAttachment.ANCHOR_ROOM_AUDIENCE_UPMIC, 0); + break; + case CustomAttachment.SKILL_MSG_AUDIO: + attachment = new SkillMsgAttachment(second); + break; + case CustomAttachment.CP_INVITE_MESSAGE: + attachment = new CpInviteAttachment(CustomAttachment.CP_INVITE_MESSAGE_TOP_NOTICE); + break; + case CustomAttachment.CUSTOM_MSG_FANS_TEAM: + attachment = new FansTeamMsgAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_SINGLE_ROOM_RANK: + attachment = new SingleRoomRankAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_ROOM_RANK: + attachment = new RoomRankAttachment(second); + break; + case CustomAttachment.CUSTOM_MSG_GIFT_COMPOUND: + attachment = new GiftCompoundAttachment(second); + break; + case CUSTOM_MSG_RADISH: + attachment = new RoomBoxPrizeAttachment(CUSTOM_MSG_RADISH, second); + break; + case CUSTOM_MSG_DRAW_GIFT_EFFECT: + if (second == CUSTOM_MSG_SUB_TYPE_DRAW_GIFT_EFFECT) { + attachment = new DrawGiftAttachment(first, second); + } + break; + case CUSTOM_MSG_LUCKY_SEA: + switch (second) { + case CUSTOM_MSG_LUCKY_SEA_GIFT_ROOM_NOTIFY: + case CUSTOM_MSG_LUCKY_SEA_GIFT_SERVER_NOTIFY: + attachment = new RoomLuckySeaAttachment(first, second); + break; + } + break; + case ROOM_FREE_GIFT: + if (second == ROOM_FREE_GIFT_REST) { + GiftModel.get().getFreeGift(true).subscribe(); + } else if (second == ROOM_FREE_GIFT_CHANGE) { + GiftModel.get().getFreeGift(false).subscribe(); + attachment = new RoomFreeGiftAttachment(first, second); + } + break; + case CUSTOM_MSG_FAIRY: + if (second == CUSTOM_MSG_SUB_FAIRY_SEND || + second == CUSTOM_MSG_SUB_FAIRY_ASK_FOR) { + attachment = new FairySendAttachment(first, second); + } else { + attachment = new FairyMsgAttachment(first, second); + } + break; + case CustomAttachment.CUSTOM_MSG_NOTIFY_H5: + attachment = new NotifyH5Attachment(second); + break; + case CustomAttachment.CUSTOM_MSG_P2P: + if (second == CustomAttachment.CUSTOM_MSG_P2P_CONTACT_RECHAGE) { + attachment = new P2PContactRechargeAttachment(); + } + break; + case CustomAttachment.CUSTOM_MSG_ROOM_ALBUM: + if (second == CustomAttachment.CUSTOM_MSG_ROOM_ALBUM_SUB) { + attachment = new RoomAlbumAttachment(); + } + break; + case CustomAttachment.CUSTOM_MSG_ROOM_TEMPLATE: + if (second == CustomAttachment.CUSTOM_MSG_ROOM_TEMPLATE_SUB_ROOM + || second == CustomAttachment.CUSTOM_MSG_ROOM_TEMPLATE_SUB_ALL_ROOM) { + attachment = new TemplateMessageAttachment(first, second); + } + break; + case CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE: + if (second == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE_SUB || second == CustomAttachment.CUSTOM_MSG_SUPER_BRAVO_GIFT_TEMPLATE_SUB) { + attachment = new TemplateMessageAttachment(first, second); + }else if (second == CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM + || second == CUSTOM_MSG_SUPER_LUCKY_GIFT_ALL + || second == CUSTOM_MSG_SUPER_LUCKY_GIFT_SELF){ + attachment = new LuckyGiftNotifyAttachment(first,second); + }else if (second == CUSTOM_MSG_SUPER_BRAVO_GIFT_NOTIFY){ + attachment = new BravoGiftNotifyAttachment(first,second); + }else if (second == CUSTOM_MSG_SUPER_BRAVO_GIFT_REWARD){ + attachment = new BravoGiftRewardAttachment(first,second); + } + break; + case CP_FIRST: + attachment = new CpMsgAttachment(first,second); + break; + case BOOM_FIRST: + attachment = new BoomMsgAttachment(first,second); + break; + case ROOM_BG_CHANGE_FIRST: + attachment = new RoomBgChangeMsgAttachment(first,second); + break; + case ROOM_LEVEL_CHANGE_FIRST: + attachment = new RoomLevelChangeMsgAttachment(first,second); + break; + case ROOM_PIC_SCREEN_FIRST: + switch (second) { + case CustomAttachment.ROOM_PIC_SCREEN_SECOND: + attachment = new RoomPicScreenMsgAttachment(); + break; + case CustomAttachment.ROOM_MSG_USER_ENTER_ROOM: + attachment = new RoomUserEnterRoomMsgAttachment(); + break; + } + break; + case MSG_CONFIRM_FIRST: + switch (second) { + case CustomAttachment.MSG_CONFIRM_SECOND: + attachment = new MsgConfirmMsgAttachment(); + break; + } + break; + case MSG_CONFIRM_CP_CHANGE_FIRST: + switch (second) { + case CustomAttachment.MSG_CONFIRM_CP_CHANGE_SECOND_CONFIRM: + attachment = new MsgCpRelationalChangeConfirmAttachment(); + break; + case CustomAttachment.MSG_CONFIRM_CP_CHANGE_SECOND_NOTIFY: + attachment = new MsgCpRelationalChangeNotifyAttachment(); + break; + } + break; + case MSG_EVENT_START_NOTIFY_FIRST: + attachment = new MsgEventStartNotifyAttachment(); + break; + case CustomAttachment.CUSTOM_MSG_CRAZY_ZOO: + switch (second) { + case CustomAttachment.CUSTOM_MSG_CRAZY_ZOO_SUB_ROOM: + case CustomAttachment.CUSTOM_MSG_CRAZY_ZOO_SUB_ALL_ROOM: + attachment = new RoomLuckySeaAttachment(first, second); + break; + } + break; + case CustomAttachment.CUSTOM_MSG_TEMPLATE_NOTIFY: + switch (second) { + case CustomAttachment.CUSTOM_MSG_TEMPLATE_NOTIFY_ROOM: + case CustomAttachment.CUSTOM_MSG_TEMPLATE_NOTIFY_ALL: + attachment = new RoomTemplateNotifyAttachment(first, second); + break; + } + break; + case CustomAttachment.CUSTOM_MSG_HEADLINE_CHANGED: + switch (second) { + case CustomAttachment.CUSTOM_MSG_HEADLINE_CHANGED_SUB: + attachment = new HeadlineChangedAttachment(first, second); + break; + } + break; + case CustomAttachment.CUSTOM_MSG_MINI_GAME: + switch (second) { + case CustomAttachment.CUSTOM_MSG_MINI_GAME_QUEUE_CHANGED: + attachment = new GameQueueChangedAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_MINI_GAME_MATCH_FAILED: + attachment = new GameMatchFailedAttachment(first, second); + break; + case CustomAttachment.CUSTOM_MSG_MINI_GAME_FORCED_END: + attachment = new GameForcedEndAttachment(first, second); + break; + } + break; + case CustomAttachment.CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED: + switch (second) { + case CustomAttachment.CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED_SUB: + attachment = new RoomSerialValueChangedAttachment(first, second); + break; + } + break; + case CustomAttachment.CUSTOM_MSG_GAME_TEAM: + switch (second) { + case CustomAttachment.CUSTOM_MSG_GAME_TEAM_INVITE: + attachment = new GameTeamInviteAttachment(first, second); + break; + } + break; + default: + LogUtils.e(ResUtil.getString(R.string.custom_bean_customattachparser_01) + first + " second=" + second); + break; + } + Object value = object.get("data"); + if (value instanceof JSONArray) { + JSONArray data = object.getJSONArray("data"); + if (attachment != null) { + attachment.fromJsonArr(data); + } + } else { + JSONObject data = object.getJSONObject("data"); + if (attachment != null) { + attachment.fromJson(data); + } + } + + } catch (Exception e) { + LogUtils.dd("本地日志 CustomAttachment MsgAttachment parse error = "+e.getMessage()); + e.printStackTrace(); + } + + return attachment; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java new file mode 100644 index 0000000..d50d3c5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/CustomAttachment.java @@ -0,0 +1,683 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.noble.bean.NobleInfo; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; + +/** + * 先定义一个自定义消息附件的基类,负责解析你的自定义消息的公用字段,比如类型等等。 + * + * @author zhouxiangfeng + * @date 2017/6/8 + */ +public class CustomAttachment implements MsgAttachment { + public static final int CUSTOM_MSG_HEADER_TYPE_AUCTION = 1; + public static final int CUSTOM_MSG_SUB_TYPE_AUCTION_START = 11; + public static final int CUSTOM_MSG_SUB_TYPE_AUCTION_FINISH = 12; + public static final int CUSTOM_MSG_SUB_TYPE_AUCTION_UPDATE = 13; + + public static final int CUSTOM_MSG_HEADER_TYPE_ROOM_TIP = 2; + public static final int CUSTOM_MSG_SUB_TYPE_ROOM_TIP_SHARE_ROOM = 21; + public static final int CUSTOM_MSG_SUB_TYPE_ROOM_TIP_ATTENTION_ROOM_OWNER = 22; + + public static final int CUSTOM_MSG_HEADER_TYPE_GIFT = 3; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_GIFT = 31; //普通单人送礼公屏 + public static final int CUSTOM_MSG_ALL_SERVICE_GIFT = 32; //全服礼物 - 广播 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT = 34;//单人福袋送礼公屏 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_ALL_SERVICE_GIFT = 35;// 全服礼物 - 房间消息 + + public static final int CUSTOM_MSG_HEADER_TYPE_ACCOUNT = 5; + + public static final int CUSTOM_MSG_HEADER_TYPE_OPEN_ROOM_NOTI = 6; + + public static final int CUSTOM_MSG_HEADER_TYPE_QUEUE = 8; + public static final int CUSTOM_MSG_HEADER_TYPE_QUEUE_INVITE = 81; + public static final int CUSTOM_MSG_HEADER_TYPE_QUEUE_KICK = 82; + + public static final int CUSTOM_MSG_HEADER_TYPE_FACE = 9; + public static final int CUSTOM_MSG_SUB_TYPE_FACE_SEND = 91; + + public static final int CUSTOM_MSG_HEADER_TYPE_NOTICE = 10; + + public static final int CUSTOM_MSG_HEADER_TYPE_PACKET = 11; + public static final int CUSTOM_MSG_SUB_TYPE_PACKET_FIRST = 111; + //送礼物 + public static final int CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT = 12; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT = 121;//普通全麦 + public static final int CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT = 123;// 普通多人 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT = 125;// 福袋全麦 + public static final int CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT = 124;// 福袋多人 + //转盘抽奖 + public static final int CUSTOM_MSG_HEADER_TYPE_LOTTERY = 13; + public static final int CUSTOM_MSG_SUB_TYPE_NOTI_LOTTERY = 131; + // 贵族 + public static final int CUSTOM_MESS_HEAD_NOBLE = 14; + /** + * 靓号未生效提醒 + */ + public static final int CUSTOM_MSG_HEADER_TYPE_GOOD_NUMBER_INACTIVE = 147; + /** + * 贵族快到期(前三天)消息 + */ + public static final int CUSTOM_MSG_HEADER_TYPE_NOBLE_END = 144; + // 开通贵族 + public static final int CUSTOM_MESS_SUB_OPENNOBLE = 142; + // 续费贵族 + public static final int CUSTOM_MESS_SUB_RENEWNOBLE = 143; + // 贵族已到期 + public static final int CUSTOM_MESS_SUB_HADEXPIRE = 145; + // 靓号生效 + public static final int CUSTOM_MESS_SUB_GOODNUM_OK = 146; + // 房主分成 + public static final int CUSTOM_MESS_SUB_ROOM_INCOME = 148; + // 推荐房间 + public static final int CUSTOM_MESS_SUB_RECOM_ROOM = 149; + /** + * 进场横幅 (客户端定义) + */ + public static final int CUSTOM_MESS_SUB_ROOM_WELCOME = 141; + // 座驾 + public static final int CUSTOM_MESS_HEAD_CAR = 15; + // 座驾已到期 + public static final int CUSTOM_MESS_SUB_CAR_EXPIRE = 151; + public static final int CUSTOM_MESS_SUB_CAR_ENTER_ROOM = 159; + // 送魔法协议 + public static final int CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC = 16; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_SINGLE_MAGIC = 161; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_MULTI_MAGIC = 162; + public static final int CUSTOM_MSG_SUB_TYPE_BATCH_SEND_MAGIC = 163;//送魔法给一个或者多个人 + // 打怪兽 + public static final int CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING = 17; + public static final int CUSTOM_MSG_SUB_TYPE_MONSTER_HUNTING = 171; + public static final int CUSTOM_NOTI_SUB_GAME_END = 172;//游戏结束 + public static final int CUSTOM_NOTI_SUB_GAME_RESULT = 173; //游戏结果 + public static final int CUSTOM_NOTI_SUB_GAME_ATTACK = 174; //攻击 + // 踢出房间/拉黑 + public static final int CUSTOM_MSG_HEADER_TYPE_KICK_MIC = 18; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_KICK_ROOM = 181; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_ADD_BLACK = 182; + // 小秘书消息 (原先是怪兽奖励消息,3.1.2版本后拓展为通用消息) + public static final int CUSTOM_MSG_ASSISTANT_MSG = 19; + // 小秘书通用消息 + public static final int CUSTOM_MSG_ASSISTANT_COMMON_MSG = 191; + // 房间信息更新 + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO = 20; + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO_GIFT = 201; + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO_AUDIO = 202; + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_SCREEN = 203; + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO_NOTICE = 204; // 通用公屏提示文案,使用于各种模式的开和关 + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_REDPACKAGE = 205; + public static final int CUSTOM_MSG_UPDATE_ROOM_INFO_CLEAN_SCREEN = 206; + // 群红包 + public static final int CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY = 21; + public static final int CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_MONEY = 211; + public static final int CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY = 212; + // 应用内分享 + public static final int CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP = 22; + public static final int CUSTOM_MSG_SHARE_ROOM = 221; + public static final int CUSTOM_MSG_SHARE_FAMILY = 222; + public static final int CUSTOM_MSG_SHARE_TEAM = 223; + public static final int CUSTOM_MSG_SHARE_MINI_WORLD = 225;// 分享话题 + // 通用系统通知 + public static final int CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG = 23; + public static final int CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_TEXT = 231; + public static final int CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_APPROVAL = 232; + //等级提升弹窗 + public static final int CUSTOM_MSG_LEVEL_UP = 24; + public static final int CUSTOM_MSG_EXPER_LEVEL_UP = 241; + public static final int CUSTOM_MSG_CHARM_LEVEL_UP = 242; + public static final int CUSTOM_MSG_EXPER_LEVEL_UP_NOTICE = 243; + //龙珠游戏 + public static final int CUSTOM_MSG_DRAGON_BAR = 25; + public static final int CUSTOM_MSG_DRAGON_BAR_START = 251; + public static final int CUSTOM_MSG_DRAGON_BAR_END = 252; + public static final int CUSTOM_MSG_DRAGON_BAR_CANCEL = 253; + public static final int CUSTOM_MSG_DRAGON_BAR_RUNAWAY = 254; + //寻爱之旅 + public static final int CUSTOM_MSG_BOX = 98; + public static final int CUSTOM_MSG_SUB_BOX_ME = 981;//自己可见 + public static final int CUSTOM_MSG_SUB_BOX_IN_ROOM = 982;//当前房间可见 + public static final int CUSTOM_MSG_SUB_BOX_ALL_ROOM = 983;//所有房间可见 + public static final int CUSTOM_MSG_SUB_BOX_ALL_ROOM_NOTIFY = 984;//所有房间可见+小秘书 + public static final int CUSTOM_MSG_SUB_BOX_ALL_ROOM_NOTIFY_BY_SVGA = 985;//所有房间可见+小秘书+高大上的SVGA + //KTV + public static final int CUSTOM_MSG_KTV = 27; + public static final int CUSTOM_MSG_SUB_KTV_ADD = 271; + public static final int CUSTOM_MSG_SUB_KTV_DELETE = 272; + public static final int CUSTOM_MSG_SUB_KTV_DELETE_USER_ALL = 273; + public static final int CUSTOM_MSG_SUB_KTV_SWITCH_NO_SEND = 274; + public static final int CUSTOM_MSG_SUB_KTV_TOP = 275; + public static final int CUSTOM_MSG_SUB_KTV_END = 276; + public static final int CUSTOM_MSG_SUB_KTV_STOP = 277; + public static final int CUSTOM_MSG_SUB_KTV_CONTINUE = 278; + public static final int CUSTOM_MSG_SUB_KTV_SWITCH = 279; + public static final int CUSTOM_MSG_SUB_KTV_FINISH = 2710; + public static final int CUSTOM_MSG_SUB_KTV_CLOSE = 2711; + public static final int CUSTOM_MSG_SUB_KTV_OPEN = 2712; + // 公聊大厅 + public static final int CUSTOM_MSG_PUBLIC_CHAT_HALL = 28; + public static final int CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_GIFT = 281; // 公聊大厅送礼物 + public static final int CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT = 282; // 公聊大厅 @ 人 + public static final int CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_FULL_SCREEN = 283; // 公聊大厅 霸屏 + public static final int CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT_ME = 284; // @ 人的时候,私聊发给对应的人 + public static final int CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_GAME = 285; // @ 人的时候,私聊发给对应的人 + // 排麦 + public static final int CUSTOM_MSG_QUEUING_MIC = 30; + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_NON_EMPTY = 301; // 从无人排麦到有人排麦 + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_EMPTY = 302; // 从有人排麦到无人排麦 + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_MODE_OPEN = 303; // 开启排麦模式 + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_MODE_CLOSE = 304; // 关闭排麦模式 + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_FREE_MIC_OPEN = 305; // 将坑位设置成自由麦 + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_FREE_MIC_CLOSE = 306; // 将坑位设置成排麦 + public static final int CUSTOM_MSG_SUB_QUEUING_MIC_UP_MIC = 307; // 管理员将用户抱上麦 + // 房间 PK + public static final int CUSTOM_MESS_HEAD_ROOM_PK = 31; //pk模式 + public static final int CUSTOM_MESS_SUB_ROOM_PK_NON_EMPTY = 311; //从无人报名pk排麦到有人报名pk排麦 + public static final int CUSTOM_MESS_SUB_ROOM_PK_EMPTY = 312; //从有人报名pk排麦到无人报名pk排麦 + public static final int CUSTOM_MESS_SUB_ROOM_PK_MODE_OPEN = 313; // 创建pk模式 + public static final int CUSTOM_MESS_SUB_ROOM_PK_MODE_CLOSE = 314; //关闭pk模式 + public static final int CUSTOM_MESS_SUB_ROOM_PK_MODE_START = 315; // 开始 PK + public static final int CUSTOM_MESS_SUB_ROOM_PK_RESULT = 316; // pk 结果 + public static final int CUSTOM_MESS_SUB_ROOM_PK_RE_START = 317; // 重开 + public static final int CUSTOM_MESS_SUB_ROOM_PK_INVITE = 318; // 邀请进队 + /** + * 模厅消息 + */ + public static final int CUSTOM_MSG_MODULE_HALL = 32; + public static final int CUSTOM_MSG_SUB_HALL_APPLY_JOIN = 321;//申请加入厅 + public static final int CUSTOM_MSG_SUB_HALL_MANAGER_INVITE = 322;//管理邀请入厅 + public static final int CUSTOM_MSG_SUB_HALL_APPLY_EXIT = 323;//申请退出厅 + + /** + * 公会消息 + */ + public static final int CUSTOM_MSG_CLAN = 33;// 家族消息 + public static final int CUSTOM_MSG_SUB_CLANAPPLY = 331;// 申请加入家族 + public static final int CUSTOM_MSG_SUB_CLANNORMAL = 332;// 其他文本消息 + + //模厅 + public static final int CUSTOM_MSG_SUB_HALL_NOTICE = 324;//模厅通知 + public static final int CUSTOM_MSG_SUB_HALL_TO_BE_OWNER = 325;//成为模厅厅主 + // 游戏 + public static final int CUSTOM_MSG_GAME = 33; + public static final int CUSTOM_MSG_GAME_SELECT = 331; // 确认选择游戏 + public static final int CUSTOM_MSG_GAME_PREPARE = 332; // 接受邀请 + public static final int CUSTOM_MSG_GAME_START = 333; // 游戏开始 + public static final int CUSTOM_MSG_GAME_END = 334; // 游戏结束 + public static final int CUSTOM_MSG_GAME_CANCEL_PREPARE = 335; // 取消准备或拒绝 + public static final int CUSTOM_MSG_GAME_OPEN = 336; // 打开游戏模式 + public static final int CUSTOM_MSG_GAME_CLOSE = 337; // 关闭游戏模式 + public static final int CUSTOM_MSG_GAME_AI_ENTER = 338; // 游戏ai进入 + // 师徒关系 + public static final int CUSTOM_MSG_MENTORING_RELATIONSHIP = 34; + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER = 341; // 师父收到的任务一消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_APPRENTICE = 342; // 徒弟收到的任务一消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_TIPS = 343; // 徒弟收到的师父关注提示 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_MASTER = 344; // 师父收到的任务二消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_APPRENTICE = 345; // 徒弟收到的任务二消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_MASTER = 346; // 师父收到的任务三消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_APPRENTICE = 347; // 徒弟收到的任务三消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_MASTER = 348; // 师父收到的任务四消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_APPRENTICE = 349; // 徒弟收到的任务四消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_RESULT = 3410; // 收徒结果 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER_TIPS = 3411; // 师父完成任务一的提示消息 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FAIL_TIPS = 3412; // 任务失败提示 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_SHARE_ROOM = 3413; // 徒弟看到的分享房间的链接 + public static final int CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_GRAB_APPRENTICES = 3414; // 抢徒弟推送消息 + // 私聊发起游戏 + public static final int CUSTOM_MSG_IM_GAME = 35; + public static final int CUSTOM_MSG_IM_REQUST_GAME = 351; // 确认选择游戏 + // im系统提示 + public static final int CUSTOM_MSG_IM_TIP = 36; + public static final int CUSTOM_MSG_IM_TIP_CANCEL = 361;//取消游戏 + public static final int CUSTOM_MSG_IM_TIP_RESULT = 362;//游戏结果 + // 接受游戏 + public static final int CUSTOM_MSG_GAME_RESPOND = 37; + public static final int CUSTOM_MSG_GAME_RESPOND_ACCEPT = 371;//接受 + public static final int CUSTOM_MSG_GAME_RESPOND_CANCEL = 372;//取消 + //签到 + public static final int CUSTOM_MSG_SIGN_IN = 41; + public static final int CUSTOM_MSG_SUB_JUMP_SIGN_IN_ACTIVITY = 411;//提醒,点击跳转到签到界面 + public static final int CUSTOM_MSG_SUB_CARVE_UP_GOLD_SECOND_LEVEL = 412;//瓜分钻石,第二等级,有房间公屏通知 + public static final int CUSTOM_MSG_SUB_CARVE_UP_GOLD_THIRD_LEVEL = 413;//瓜分钻石,第三等级,房间公屏+小秘书 + //礼物值 + public static final int CUSTOM_MSG_ROOM_GIFT_VALUE = 42; + public static final int CUSTOM_MSG_SUB_GIFT_VALUE_SYNC = 421;//房间礼物值同步 + // 离开模式 + public static final int CUSTOM_MSG_LEAVE_MODE = 43; + public static final int CUSTOM_MSG_LEAVE_MODE_NOTICE = 431; // 给其他客户端发送房主信息(避免再次调用用户信息接口) + // 话匣子 + public static final int CUSTOM_MSG_CHATTER_BOX = 44; + public static final int CUSTOM_MSG_CHATTER_BOX_ASK = 441; // 发起游戏 + public static final int CUSTOM_MSG_CHATTER_BOX_DROP = 442; // 抛点数 + public static final int CUSTOM_MSG_CHATTER_BOX_INIT = 443; // 打招呼 + // 声音瓶子 + public static final int CUSTOM_MSG_VOICE_BOTTLE_HEAD = 45; // 声音瓶子 + public static final int CUSTOM_MSG_VOICE_BOTTLE_SUB_HELLO = 451; // 声音瓶子私聊打招呼 + public static final int CUSTOM_MSG_VOICE_BOTTLE_SUB_TO_RECORDING = 452; // 声音瓶子去录制 + public static final int CUSTOM_MSG_VOICE_BOTTLE_SUB_tO_MATCHING = 453; // 声音瓶子去匹配 + public static final int CUSTOM_MSG_VOICE_BOTTLE_SUB_HEART = 454; // 声音瓶子爱心信息 + // 话题 + public static final int CUSTOM_MSG_MINI_WORLD = 46; + public static final int CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT = 461; // 话题群聊派对人数 + public static final int CUSTOM_MSG_GROUP_CHAT_TOPIC = 462; // 话题群聊派对话题 + public static final int CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY = 463; // 话题群聊派对通知 + public static final int CUSTOM_MSG_GROUP_CHAT_ROOM_JOIN_TIP = 464; // 话题群聊派对通知 + public static final int CUSTOM_MSG_GROUP_ROOM_JOIN_NOTICE = 465; // 话题房间某个人加入的通知 + public static final int CUSTOM_MSG_ROOM_FOLLOW = 466;//在房间的公屏上关注房主 + public static final int CUSTOM_MSG_ROOM_FOLLOW_2 = 467;//在房间的公屏上关注房主,第二个 + public static final int CUSTOM_MSG_ROOM_FOLLOW_SUCCESS = 468;//在房间的关注房主,第二个 + //全服广播 + public static final int CUSTOM_MSG_HEADER_ALL_SERVICE_PUSH = 49; + public static final int CUSTOM_MSG_SUB_TYPE_PUSH_APP_TO_UPDATE = 491;//推送App更新消息 + //青少年模式 + public static final int CUSTOM_MSG_HEADER_PM_ROOM_LIMIT = 48; + public static final int CUSTOM_MSG_SUB_PM_ROOM_LIMIT_TIME = 481; //到达时间,限制进房 + //超管 + public static final int CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN = 50; + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_CP_ROOM_LIMIT = 501;//超管解除陪伴房的进房限制 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_ROOM_PWD = 502;//超管解除多人房的房间密码 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_LOCK_MIC = 503;//锁麦 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MUTE_MIC = 504;//闭麦 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_DOWN_MIC = 505;//踢人下麦 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MARK_BLACK = 506;//拉黑 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ROOM = 507;//踢出房间 + public static final int CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ADMIN = 508;//踢管理员出房间 + // 移出话题系统通知 + public static final int CUSTOM_MSG_HEAD_SHIFT_OUT = 51; + public static final int CUSTOM_MSG_SHIFT_OUT = 511; // 移出话题 + //世界动态 + public static final int CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC = 52; + // 动态自定义消息 + public static final int CUSTOM_DYNAMTC_UNREADCOUNT = 521; // 未读提醒 + public static final int CUSTOM_DYNAMTC_BAN_DELETE = 522; // 违禁删除 + public static final int CUSTOM_DYNAMTC_PASS = 523; // 动态审核 + public static final int CUSTOM_MSG_SUB_TYPE_WORLD_DYNAMIC_SHARE = 524; //分享app内好友 + public static final int CUSTOM_MSG_SUB_TYPE_WORLD_DYNAMIC_PUBLISH = 525; // 关注用户发了一条动态 + //活动的暴走倒计时 + public static final int CUSTOM_MSG_HEADER_TYPE_ACTIVITY = 53; + public static final int CUSTOM_MSG_SUB_TYPE_ACTIVITY_TIMER = 531; + //麦上用户 公屏欢迎消息 + public static final int CUSTOM_MSG_HEADER_TYPE_PUBLIC_SCREEN = 56; + public static final int CUSTOM_MSG_SUB_TYPE_PUBLIC_SCREEN_WELCOME = 561; //欢迎语 + //通用系统通知,带路由跳转功能,23废弃,因为字段乱定义 + public static final int CUSTOM_MSG_HEADER_COMMON_SYSTEM_MSG_V2 = 57; + public static final int CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_TEXT = 571; + + //54 55 iOS使用了 + public static final int CUSTOM_MSG_SUB_TYPE_COMMON_SYSTEM_MSG_V2_APPROVAL = 572; + //系统通知,一个通用的头,可以往下拓展second + public static final int CUSTOM_MSG_HEADER_TYPE_COMMON_SYS_NOTICATION = 58; + public static final int CUSTOM_MSG_SUB_TYPE_FIRST_RECHARGE_SUCCESS = 581; //首充成功 + //收藏房间消息 + public static final int CUSTOM_MSG_HEADER_TYPE_FOLLOW_ROOM = 59; + public static final int CUSTOM_MSG_SUB_TYPE_FOLLOW_ROOM_SUCCESS = 591; + //红包消息 + public static final int CUSTOM_MSG_RED_PACKAGE = 60; + public static final int CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_DIAMOND = 602; + public static final int CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ALL_DIAMOND = 604;//全服红包 + public static final int CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_MSG = 605; + public static final int CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_DIAMOND2 = 606;//新版本-厅内红包 + public static final int CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_LUCKY_BAG = 607;//新版本-幸运礼包 + //开福袋飘屏 + public static final int CUSTOM_MSG_LUCKY_GIFT = 61; + public static final int CUSTOM_MSG_LUCKY_GIFT_ROOM_NOTIFY = 610;// 福袋礼物房间飘屏通知 + public static final int CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY = 611; // 福袋礼物全服飘屏通知 + public static final int CUSTOM_MSG_LUCKY_GIFT_SERVER_ALL = 612; // 福袋礼物全服飘屏通知+房间外 + //发现萌新打招呼 + public static final int CUSTOM_MSG_NEWBIE = 62; + public static final int CUSTOM_MSG_RECEIV_NEWBIE_HELLO = 621; + //推送消息 + 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_MESS_TAROT = 71; //塔罗牌充值消息 + public static final int CUSTOM_MESS_TAROT_SUCCESS = 711; //塔罗牌充值中奖消息 + public static final int CUSTOM_MESS_TAROT_JUNIOR_PRIZE_WINNING = 712; //塔罗牌初级卡中奖消息 + public static final int CUSTOM_MESS_TAROT_INTERMEDIATE_PRIZE_WINNING = 713; //塔罗牌中级卡中奖消息 + public static final int CUSTOM_MESS_TAROT_SENIOR_PRIZE_WINNING = 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 static final int CUSTOM_MSG_DATING_All = 73; + public static final int CUSTOM_MSG_SUB_DATING_Al_NOTIFY = 731; + //赛事消息 + public static final int CUSTOM_MSG_MATCH = 74; + public static final int CUSTOM_MSG_MATCH_TICKET = 77; + //public static final int CUSTOM_MSG_SUB_MATCH = 741; + public static final int CUSTOM_MSG_QUICK_DISMISS = 745; + public static final int CUSTOM_MSG_QUICK_ENOUGH_QUOTA = 746; + //私聊提示 + public static final int CUSTOM_MSG_CHAT_HINT = 75; + public static final int CUSTOM_MSG_SUB_CHAT_HINT = 751; + //首充礼包 + public static final int CUSTOM_MSG_FIRST_CHARGE = 76; + public static final int CUSTOM_MSG_SUB_FIRST_CHARGE_PRIZE = 761; + public static final int CUSTOM_MSG_SUB_NEW_USER_CHARGE_PRIZE = 762; + //访客未读 + public static final int CUSTOM_MSG_HEADER_TYPE_VISITOR = 78; + public static final int CUSTOM_MSG_SUB_TYPE_VISITOR_UNREAD = 781; + + //房间开宝箱 + public static final int CUSTOM_MSG_RADISH = 81; + public static final int CUSTOM_MSG_SUB_RADISH_ME = 811;//自己可见 + public static final int CUSTOM_MSG_SUB_RADISH_IN_ROOM = 812;//当前房间可见 + public static final int CUSTOM_MSG_SUB_RADISH_ALL_ROOM = 813;//所有房间可见 + public static final int CUSTOM_MSG_SUB_RADISH_ALL_ROOM_NOTIFY = 814;//所有房间可见+小秘书 + public static final int CUSTOM_MSG_SUB_RADISH_ALL_ROOM_NOTIFY_BY_SVGA = 815;//所有房间可见+小秘书+高大上的SVGA + + //跨房PK + public static final int CUSTOM_MSG_ROOM_PK = 83; + public static final int CUSTOM_MSG_SUB_ROOM_PK_INVITE = 831; + public static final int CUSTOM_MSG_SUB_ROOM_PK_REFUSE = 832; + public static final int CUSTOM_MSG_SUB_ROOM_PK_ACCEPT = 833; + public static final int CUSTOM_MSG_SUB_ROOM_PK_UPDATE = 834; + public static final int CUSTOM_MSG_SUB_ROOM_PK_FINISH = 835; + public static final int CUSTOM_MSG_SUB_ROOM_PK_NOTIFY = 836; + public static final int CUSTOM_MSG_SUB_ROOM_PK_ORDER = 8314; + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_INVITE = 837;// 个播pk发出邀请 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_REFUSE = 838;// 个播pk拒绝邀请 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_ACCEPT = 839;// 个播pk接受邀请 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_UPDATE = 8310;// 个播pk面板更新消息 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_RESULT = 8311;// 个播pk结果通知 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_NOTIFY = 8312;// 个播pk结束触发的飘屏通知 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_FINISH = 8313;// 个播pk结束通知 + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_PK_MUTE_MIC = 8316;// 个播pk禁用对方麦克风 + /** + * 贵族 + */ + public static final int CUSTOM_MSG_VIP = 85; + public static final int CUSTOM_MSG_VIP_ROOM_OPEN = 851; // 开通贵族房内消息 + public static final int CUSTOM_MSG_VIP_ROOM_UPGRADE = 853; // 贵族升级房内消息 + public static final int CUSTOM_MSG_VIP_ROOM_ALL_UPGRADE = 856; // 贵族升级全服房间公屏通知消息 + public static final int CUSTOM_MSG_VIP_ROOM_BROADCAST = 857; // 贵族小喇叭消息 + public static final int CUSTOM_MSG_VIP_SELF_OPEN = 852; // 开通贵族成功系统消息 + public static final int CUSTOM_MSG_VIP_SELF_UPGRADE = 854; // 贵族升级系统消息 + public static final int CUSTOM_MSG_VIP_USER_ALL_UPGRADE = 855; // 贵族升级全服飘屏通知消息 + ///个播房观众点击空坑位,房主收到请求上麦提示 + public static final int ANCHOR_ROOM_AUDIENCE_UPMIC = 86; + //技能卡审核 + public static final int SKILL_MSG_AUDIO = 87; + public static final int CP_INVITE_MESSAGE = 88; + public static final int CP_INVITE_MESSAGE_TOP_NOTICE = 881; + + public static final int CUSTOM_MSG_SINGLE_ROOM_RANK = 89; + public static final int CUSTOM_MSG_SUB_SINGLE_ROOM_RANK_TOP = 891; + + public static final int CUSTOM_MSG_FANS_TEAM = 90; + public static final int CUSTOM_MSG_SUB_FANS_TEAM_OPEN = 901; //开通粉丝团 + public static final int CUSTOM_MSG_SUB_FANS_TEAM_OPEN_FAILED = 902; // 开通粉丝团失败 + public static final int CUSTOM_MSG_SUB_FANS_TEAM_JOIN = 903; // 加入粉丝团 + public static final int CUSTOM_MSG_SUB_FANS_TEAM_EXIT = 904; // 退出粉丝团 + + public static final int CUSTOM_MSG_ROOM_RANK = 91; + public static final int CUSTOM_MSG_SUB_ROOM_RANK_TOP = 911; + + public static final int CUSTOM_MSG_ROOM_TASK_TIPS = 92; + public static final int CUSTOM_MSG_SUB_ROOM_TASK_TIPS = 921; + + public static final int CUSTOM_MSG_GIFT_COMPOUND = 93; + public static final int CUSTOM_MSG_SUB_GIFT_COMPOUND = 931; + + public static final int CUSTOM_MSG_DRAW_GIFT_EFFECT = 94; + public static final int CUSTOM_MSG_SUB_TYPE_DRAW_GIFT_EFFECT = 941; + + //星级厨房 + public static final int CUSTOM_MSG_LUCKY_SEA = 95; // 深海奇缘消息 + public static final int CUSTOM_MSG_LUCKY_SEA_GIFT_ROOM_NOTIFY = 950; // 深海奇缘礼物房间飘屏通知 + public static final int CUSTOM_MSG_LUCKY_SEA_GIFT_SERVER_NOTIFY = 951;// 深海奇缘礼物全服飘屏通知 + public static final int CUSTOM_MSG_LUCKY_SEA_GIFT_SERVER_ALL = 952;// 深海奇缘礼物全服飘屏通知+房间外 + + //免费礼物倒计时重置推送 + public static final int ROOM_FREE_GIFT = 96; + public static final int ROOM_FREE_GIFT_REST = 960; + public static final int ROOM_FREE_GIFT_CHANGE = 961; + + public static final int CUSTOM_MSG_FAIRY = 97; // 夺宝精灵 + public static final int CUSTOM_MSG_SUB_FAIRY_SEND = 9701; // 赠送小精灵 + public static final int CUSTOM_MSG_SUB_FAIRY_ASK_FOR = 9702; // 索要小精灵 + + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L1 = 9711; // 抽奖L1礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L2 = 9712; // 抽奖L2礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L3 = 9713; // 抽奖L3礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L4 = 9714; // 抽奖L4礼物 + public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L5 = 9715; // 抽奖L5礼物 + + public static final int CUSTOM_MSG_SUB_DRAW_BALL_L1 = 9721; // 抽奖L1精灵球 + public static final int CUSTOM_MSG_SUB_DRAW_BALL_L2 = 9722; // 抽奖L2精灵球 + public static final int CUSTOM_MSG_SUB_DRAW_BALL_L3 = 9723; // 抽奖L3精灵球 + + public static final int CUSTOM_MSG_SUB_CONVERT_L1 = 9731; // 召唤L1 + public static final int CUSTOM_MSG_SUB_CONVERT_L2 = 9732; // 召唤L2 + public static final int CUSTOM_MSG_SUB_CONVERT_L3 = 9733; // 召唤L3 + + public static final int CUSTOM_MSG_P2P = 99; + + /** + * 联系客服充值 + */ + public static final int CUSTOM_MSG_P2P_CONTACT_RECHAGE = 99; + + /** + * H5活动通用飘屏 + */ + public static final int CUSTOM_MSG_NOTIFY_H5 = 100; + + /** + * H5活动通用飘屏 - 房间 + */ + public static final int CUSTOM_MSG_NOTIFY_H5_SUB_ROOM = 1101; + + /** + * H5活动通用飘屏 - 全服 + */ + public static final int CUSTOM_MSG_NOTIFY_H5_SUB_WHOLE_SERVICE = 1102; + + public static final int CUSTOM_MSG_ROOM_ALBUM = 101; + public static final int CUSTOM_MSG_ROOM_ALBUM_SUB = 1011; + + // 通用模版公屏 + public static final int CUSTOM_MSG_ROOM_TEMPLATE = 103; + public static final int CUSTOM_MSG_ROOM_TEMPLATE_SUB_ROOM = 1031; + public static final int CUSTOM_MSG_ROOM_TEMPLATE_SUB_ALL_ROOM = 1032; + + // 疯狂动物圆 + public static final int CUSTOM_MSG_CRAZY_ZOO = 104; + public static final int CUSTOM_MSG_CRAZY_ZOO_SUB_ROOM = 1041;// 动物园房间飘屏通知 + public static final int CUSTOM_MSG_CRAZY_ZOO_SUB_ALL_ROOM = 1042;// 动物园全服飘屏通知 + + // 通用模版飘屏 + public static final int CUSTOM_MSG_TEMPLATE_NOTIFY = 107; + public static final int CUSTOM_MSG_TEMPLATE_NOTIFY_ROOM = 1071;// 通用模版飘屏-房间 + public static final int CUSTOM_MSG_TEMPLATE_NOTIFY_ALL = 1072;// 通用模版飘屏-全服 + + // 超级幸运礼物-通用模版公屏 + public static final int CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE = 106; + public static final int CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE_SUB = 1061;// 幸运礼物 公屏 + + public static final int CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM = 1063;// 幸运礼物 中奖 飘屏 单房间 + public static final int CUSTOM_MSG_SUPER_LUCKY_GIFT_ALL = 1063;// 幸运礼物 中奖 飘屏 全服 + public static final int CUSTOM_MSG_SUPER_LUCKY_GIFT_SELF = 1062;// 幸运礼物 中奖 提示弹窗 + + public static final int CUSTOM_MSG_SUPER_BRAVO_GIFT_TEMPLATE_SUB = 1064;// 超级幸运礼物 中奖 公屏 + public static final int CUSTOM_MSG_SUPER_BRAVO_GIFT_REWARD = 1065;// 超级幸运礼物 中奖 主播金币特效+中奖弹窗提示 + public static final int CUSTOM_MSG_SUPER_BRAVO_GIFT_NOTIFY = 1066;// 超级幸运礼物 中奖 飘屏 + + + // 头条-更新 + public static final int CUSTOM_MSG_HEADLINE_CHANGED = 108; + public static final int CUSTOM_MSG_HEADLINE_CHANGED_SUB = 1081; + + + // 游戏-麦位更新 + public static final int CUSTOM_MSG_MINI_GAME = 109; + // 麦位变更 + public static final int CUSTOM_MSG_MINI_GAME_QUEUE_CHANGED = 1091; + // 匹配失败 + public static final int CUSTOM_MSG_MINI_GAME_MATCH_FAILED = 1092; + // 提前结束 + public static final int CUSTOM_MSG_MINI_GAME_FORCED_END = 1093; + + /** + * 家族 + */ + public static final int CUSTOM_MSG_FAMILY = 110; + public static final int CUSTOM_MSG_FAMILY_INVITE = 1101; + public static final int CUSTOM_MSG_FAMILY_DEAL_INVITE = 1102; + public static final int CUSTOM_MSG_FAMILY_APPLY = 1103; + public static final int CUSTOM_MSG_FAMILY_DEAL_APPLY = 1104; + public static final int CUSTOM_MSG_FAMILY_SET_MANAGER = 1105; + public static final int CUSTOM_MSG_FAMILY_REMOVE_MEMBER = 1106; + public static final int CUSTOM_MSG_FAMILY_CREATE = 1107; + public static final int CUSTOM_MSG_FAMILY_DISMISS = 1108; + + + /** + * 房间总流水 + */ + public static final int CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED = 111; + public static final int CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED_SUB = 1110; + + /** + * 游戏组队 + */ + public static final int CUSTOM_MSG_GAME_TEAM = 112; + // 游戏组队-邀请 + public static final int CUSTOM_MSG_GAME_TEAM_INVITE = 1121; + + //--------------CP礼物--------------------------- + public static final int CP_FIRST = 64; + public static final int CP_SECOND_GIFT = 641; //CP礼物全服飘屏 + public static final int CP_SECOND_UPGRADE = 642; //CP升级全服飘屏 + public static final int CP_SECOND_BIND = 643; //CP绑定 + + //--------------Boom玩法 + public static final int BOOM_FIRST = 63; + public static final int BOOM_SECOND_EXP_PUSH = 631; + public static final int BOOM_SECOND_DIALOG = 632; + public static final int BOOM_SECOND_AWARD = 633; + + //-----房間背景修改消息 + public static final int ROOM_BG_CHANGE_FIRST = 113; + public static final int ROOM_BG_CHANGE_SECOND = 1131; + //-----房間等级修改消息 + public static final int ROOM_LEVEL_CHANGE_FIRST = 114; + public static final int ROOM_LEVEL_CHANGE_SECOND = 1141; + + //-----房間公屏图片消息 + public static final int ROOM_PIC_SCREEN_FIRST = 115; + public static final int ROOM_PIC_SCREEN_SECOND = 1151; + public static final int ROOM_MSG_USER_ENTER_ROOM = 1152; + + //-----通用确定取消 的 消息 + public static final int MSG_CONFIRM_FIRST = 116; + public static final int MSG_CONFIRM_SECOND = 1160; + + //-----cp关系确定取消 的 消息 + public static final int MSG_CONFIRM_CP_CHANGE_FIRST = 117; + public static final int MSG_CONFIRM_CP_CHANGE_SECOND_CONFIRM = 1170; + public static final int MSG_CONFIRM_CP_CHANGE_SECOND_NOTIFY = 1171; + + //-----用户自建活动开启通知 + public static final int MSG_EVENT_START_NOTIFY_FIRST = 68; + public static final int MSG_EVENT_START_NOTIFY_SECOND = 681; + + + + + /** + * 自定义消息附件的类型,根据该字段区分不同的自定义消息 + */ + protected int first; + protected int second; + protected JSONObject data; + protected NobleInfo mNobleInfo; + + public CustomAttachment() { + + } + + public CustomAttachment(int first, int second) { + this.first = first; + this.second = second; + } + + public int getFirst() { + return first; + } + + public void setFirst(int first) { + this.first = first; + } + + public int getSecond() { + return second; + } + + public void setSecond(int second) { + this.second = second; + } + + public JSONObject getData() { + return data; + } + + public void setData(JSONObject data) { + this.data = data; + } + + // 解析附件内容。 + public void fromJson(JSONObject data) { + if (data != null) { + parseData(data); + } + } + public void fromJsonArr(JSONArray data) { + if (data != null) { + parseDataArr(data); + } + } + + // 实现 MsgAttachment 的接口,封装公用字段,然后调用子类的封装函数。 + @Override + public String toJson(boolean send) { + JSONObject jsonObject = packData(); + setData(jsonObject); + return CustomAttachParser.packData(first, second, jsonObject); + } + + // 子类的解析和封装接口。 + protected void parseData(JSONObject data) { + + } + + // 子类的解析和封装接口。 + protected void parseDataArr(JSONArray data) { + + } + + protected JSONObject packData() { + return null; + } + + protected JSONArray packArray() { + return null; + } + + + @Override + public String toString() { + return "CustomAttachment{" + + "first=" + first + + ", second=" + second + + ", data=" + data + + ", mNobleInfo=" + mNobleInfo + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/DatingAllNotifyAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/DatingAllNotifyAttachment.java new file mode 100644 index 0000000..e44ed54 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/DatingAllNotifyAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.room.bean.DatingAllNotifyInfo; + +/** + * @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/chwl/core/im/custom/bean/DatingAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/DatingAttachment.java new file mode 100644 index 0000000..ea2e5ff --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/DatingAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.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/chwl/core/im/custom/bean/DatingPublishAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/DatingPublishAttachment.java new file mode 100644 index 0000000..7d9af9b --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/DatingPublishAttachment.java @@ -0,0 +1,43 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.chwl.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/chwl/core/im/custom/bean/DiceThrowAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/DiceThrowAttachment.java new file mode 100644 index 0000000..187706f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/DiceThrowAttachment.java @@ -0,0 +1,28 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +public class DiceThrowAttachment extends CustomAttachment { + public int pointCount = 0; + + public DiceThrowAttachment() { + super(CustomAttachment.CUSTOM_MSG_CHATTER_BOX, CustomAttachment.CUSTOM_MSG_CHATTER_BOX_DROP); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("pointCount", pointCount); + return jsonObject; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("pointCount")) { + pointCount = data.getIntValue("pointCount"); + } + } + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/DrawGiftAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/DrawGiftAttachment.java new file mode 100644 index 0000000..ce04517 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/DrawGiftAttachment.java @@ -0,0 +1,52 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; + +import java.util.List; + +/** + * @author chenran + * @date 2017/7/28 + */ + +public class DrawGiftAttachment extends CustomAttachment { + private int giftId; + private List> drawFixedArray; + + public DrawGiftAttachment(int first, int second) { + super(first, second); + } + + public int getGiftId() { + return giftId; + } + + public void setGiftId(int giftId) { + this.giftId = giftId; + } + + public List> getDrawFixedArray() { + return drawFixedArray; + } + + public void setDrawFixedArray( List> drawFixedArray) { + this.drawFixedArray = drawFixedArray; + } + + @Override + protected void parseData(JSONObject data) { + giftId = data.getIntValue("giftId"); + drawFixedArray = data.getObject("drawFixedArray", new TypeReference>>() { + }.getType()); + + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("drawFixedArray", drawFixedArray); + object.put("giftId", giftId); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/FaceAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/FaceAttachment.java new file mode 100644 index 0000000..18e9890 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/FaceAttachment.java @@ -0,0 +1,70 @@ +package com.chwl.core.im.custom.bean; + +import android.util.Log; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.chwl.core.room.face.FaceReceiveInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author chenran + * @date 2017/9/12 + */ + +public class FaceAttachment extends CustomAttachment { + private List faceReceiveInfos; + private long uid; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public FaceAttachment(int first, int second) { + super(first, second); + } + + + public List getFaceReceiveInfos() { + return faceReceiveInfos; + } + + public void setFaceReceiveInfos(List faceReceiveInfos) { + this.faceReceiveInfos = faceReceiveInfos; + } + + @Override + protected void parseData(JSONObject data) { + uid = data.getLong("uid"); + faceReceiveInfos = new ArrayList<>(); + JSONArray jsonArray = data.getJSONArray("data"); + faceReceiveInfos = JSON.parseObject(jsonArray.toJSONString(), new TypeReference>() { + }); + } + + @Override + protected JSONObject packData() { + JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(faceReceiveInfos)); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("data", jsonArray); + jsonObject.put("uid", uid); + Log.e("hehe", jsonObject.toJSONString()); + return jsonObject; + } + + @Override + public String toString() { + return "FaceAttachment{" + + "faceReceiveInfos=" + faceReceiveInfos + + ", uid=" + uid + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/FairyMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/FairyMsgAttachment.java new file mode 100644 index 0000000..04c435a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/FairyMsgAttachment.java @@ -0,0 +1,36 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.treasurefairy.bean.FairyMsgInfoBean; + +/** + * Created by chenran on 2017/10/4. + */ + +public class FairyMsgAttachment extends CustomAttachment { + private FairyMsgInfoBean fairyMsgInfo; + + public FairyMsgAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject jsonObject) { + fairyMsgInfo = new Gson().fromJson(jsonObject.toJSONString(), FairyMsgInfoBean.class); + } + + public FairyMsgInfoBean getFairyMsgInfo() { + return fairyMsgInfo; + } + + public void setFairyMsgInfo(FairyMsgInfoBean fairyMsgInfo) { + this.fairyMsgInfo = fairyMsgInfo; + } + + @Override + protected JSONObject packData() { + return null; + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/FairySendAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/FairySendAttachment.java new file mode 100644 index 0000000..5d8d89e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/FairySendAttachment.java @@ -0,0 +1,104 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * Created by chenran on 2017/10/4. + */ + +public class FairySendAttachment extends CustomAttachment { + private long uid; + private String nick; + private long targetUid; + private String targetNick; + private long elfId; + private String elfPicUrl; + private String elfName; + private String msgContent; + + public FairySendAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject jsonObject) { + uid = jsonObject.getLongValue("uid"); + targetUid = jsonObject.getLongValue("targetUid"); + elfId = jsonObject.getLongValue("elfId"); + elfPicUrl = jsonObject.getString("elfPicUrl"); + msgContent = jsonObject.getString("msgContent"); + targetNick = jsonObject.getString("targetNick"); + nick = jsonObject.getString("nick"); + elfName = jsonObject.getString("elfName"); + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public long getTargetUid() { + return targetUid; + } + + public void setTargetUid(long targetUid) { + this.targetUid = targetUid; + } + + public long getElfId() { + return elfId; + } + + public void setElfId(long elfId) { + this.elfId = elfId; + } + + public String getElfPicUrl() { + return elfPicUrl; + } + + public void setElfPicUrl(String elfPicUrl) { + this.elfPicUrl = elfPicUrl; + } + + public String getMsgContent() { + return msgContent; + } + + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + public String getTargetNick() { + return targetNick; + } + + public void setTargetNick(String targetNick) { + this.targetNick = targetNick; + } + + public String getElfName() { + return elfName; + } + + public void setElfName(String elfName) { + this.elfName = elfName; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + @Override + protected JSONObject packData() { + return null; + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/FansTeamMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/FansTeamMsgAttachment.java new file mode 100644 index 0000000..664d026 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/FansTeamMsgAttachment.java @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.fansteam.bean.FansTeamMsgInfo; + +public class FansTeamMsgAttachment extends CustomAttachment { + + private FansTeamMsgInfo fansTeamMsgInfo; + + public FansTeamMsgAttachment(int second) { + super(CUSTOM_MSG_FANS_TEAM, second); + } + + public FansTeamMsgInfo getFansTeamMsgInfo() { + return fansTeamMsgInfo; + } + + public void setFansTeamMsgInfo(FansTeamMsgInfo fansTeamMsgInfo) { + this.fansTeamMsgInfo = fansTeamMsgInfo; + } + + @Override + protected void parseData(JSONObject data) { + fansTeamMsgInfo = new Gson().fromJson(data.toJSONString(), FansTeamMsgInfo.class); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndAttachment.kt new file mode 100644 index 0000000..50a2d0f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndAttachment.kt @@ -0,0 +1,20 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.bean.game.GameRoomInfo +import com.chwl.library.utils.json.JsonUtils +import com.google.gson.Gson + +@Keep +class GameForcedEndAttachment : CustomAttachment { + + var msgData: GameForcedEndMsgBean? = null + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + override fun parseData(data: JSONObject?) { + msgData = JsonUtils.fromJson(data?.toJSONString(), GameForcedEndMsgBean::class.java) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndMsgBean.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndMsgBean.kt new file mode 100644 index 0000000..32c63b9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GameForcedEndMsgBean.kt @@ -0,0 +1,10 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import com.chwl.core.bean.game.GameResultBean + +@Keep +class GameForcedEndMsgBean { + val results: List? = null + val matchStatus: Int? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GameMatchFailedAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GameMatchFailedAttachment.kt new file mode 100644 index 0000000..5278e38 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GameMatchFailedAttachment.kt @@ -0,0 +1,16 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.bean.game.GameRoomInfo +import com.google.gson.Gson + +@Keep +class GameMatchFailedAttachment : CustomAttachment { + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + override fun parseData(data: JSONObject?) { + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GameQueueChangedAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GameQueueChangedAttachment.kt new file mode 100644 index 0000000..1f05a87 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GameQueueChangedAttachment.kt @@ -0,0 +1,19 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.bean.game.GameRoomInfo +import com.chwl.library.utils.json.JsonUtils +import com.google.gson.Gson + +@Keep +class GameQueueChangedAttachment : CustomAttachment { + var gameInfo: GameRoomInfo? = null + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + override fun parseData(data: JSONObject?) { + gameInfo = JsonUtils.fromJson(data?.toJSONString(), GameRoomInfo::class.java) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteAttachment.kt new file mode 100644 index 0000000..aaf64a0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteAttachment.kt @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.library.utils.json.JsonUtils +import com.google.gson.Gson + + +class GameTeamInviteAttachment : CustomAttachment { + var msgData: GameTeamInviteMsgBean? = null + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + public override fun parseData(data: JSONObject?) { + super.parseData(data) + try { + msgData = JsonUtils.getGson().fromJson( + data!!.toJSONString(), + GameTeamInviteMsgBean::class.java + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun packData(): JSONObject? { + val jsonStr = JsonUtils.getGson().toJson(msgData) + return JSONObject.parseObject(jsonStr) + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteMsgBean.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteMsgBean.kt new file mode 100644 index 0000000..1d5bef1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GameTeamInviteMsgBean.kt @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +data class GameTeamInviteMsgBean( + val amount: Long? = null, + val createTime: String? = null, + val fromAvatar: String? = null, + val fromErBanNo: Long? = null, + val fromNick: String? = null, + val fromUid: Long? = null, + val gameBackground: String? = null, + val gameId: Long? = null, + val gameLogo: String? = null, + val gameName: String? = null, + val gamePic: String? = null, + val id: Long? = null, + val inning: Long? = null, + val orderNo: String? = null, + val orderTime: String? = null, + val price: Long? = null, + val status: Int? = null, + val tags: List? = null, + val toAvatar: String? = null, + val toErBanNo: Long? = null, + val toNick: String? = null, + val toUid: Long? = null, + val updateTime: String? = null +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceAttachment.java new file mode 100644 index 0000000..930a639 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceAttachment.java @@ -0,0 +1,90 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.GiftModel; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.google.gson.Gson; + +/** + * @author chenran + * @date 2017/7/28 + */ + +public class GiftAllServiceAttachment extends CustomAttachment { + private GiftReceiveInfo giftReceiveInfo; + private String uid; + + public GiftAllServiceAttachment(int first, int second) { + super(first, second); + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public GiftReceiveInfo getGiftReceiveInfo() { + return giftReceiveInfo; + } + + public void setGiftReceiveInfo(GiftReceiveInfo giftReceiveInfo) { + this.giftReceiveInfo = giftReceiveInfo; + } + + @Override + protected void parseData(JSONObject data) { + giftReceiveInfo = new GiftReceiveInfo(); + giftReceiveInfo.setGiftId(data.getInteger("giftId")); + giftReceiveInfo.setUid(data.getLong("sendUserUid")); + giftReceiveInfo.setNick(data.getString("sendUserNick")); + giftReceiveInfo.setAvatar(data.getString("sendUserAvatar")); + giftReceiveInfo.setTargetUid(data.getLong("recvUserUid")); + giftReceiveInfo.setTargetNick(data.getString("recvUserNick")); + giftReceiveInfo.setTargetAvatar(data.getString("recvUserAvatar")); + + + GiftInfo giftInfo; + + if (data.containsKey("giftVo")) { + JSONObject giftJson = data.getJSONObject("giftVo"); + if (giftJson != null) { + giftInfo = new Gson().fromJson(giftJson.toJSONString(), GiftInfo.class); + giftReceiveInfo.setGift(giftInfo); + } + } else { + //先找礼物列表 + giftInfo = GiftModel.get().findGiftInfoById(giftReceiveInfo.getGiftId()); + if (giftInfo != null) { + giftInfo.setNotifyFull(data.getInteger("notifyFull")); + giftInfo.setShowAvatarType(data.getInteger("showAvatarType")); + } else { + //再找背包列表 + giftInfo = GiftModel.get().findGiftInfoByIdInKnapList(giftReceiveInfo.getGiftId()); + if (giftInfo != null) { + giftInfo.setNotifyFull(data.getInteger("notifyFull")); + giftInfo.setShowAvatarType(data.getInteger("showAvatarType")); + } + } + giftReceiveInfo.setGift(giftInfo); + } + + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("giftId", giftReceiveInfo.getGiftId()); + object.put("sendUserUid", giftReceiveInfo.getUid()); + object.put("sendUserNick", giftReceiveInfo.getNick()); + object.put("sendUserAvatar", giftReceiveInfo.getAvatar()); + object.put("recvUserUid", giftReceiveInfo.getTargetUid()); + object.put("recvUserNick", giftReceiveInfo.getTargetNick()); + object.put("recvUserAvatar", giftReceiveInfo.getTargetAvatar()); + object.put("giftInfo", giftReceiveInfo.getGift()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceNotifyAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceNotifyAttachment.kt new file mode 100644 index 0000000..faa0f88 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GiftAllServiceNotifyAttachment.kt @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.noble.bean.AllServiceGiftProtocol +import com.google.gson.Gson + +// 3 - 32 CUSTOM_MSG_ALL_SERVICE_GIFT , 是全服礼物 飘屏 +class GiftAllServiceNotifyAttachment (first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var dataBean : AllServiceGiftProtocol.DataBean?=null + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + dataBean = Gson().fromJson( + data.toJSONString(), + AllServiceGiftProtocol.DataBean::class.java + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GiftAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/GiftAttachment.java new file mode 100644 index 0000000..148433d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GiftAttachment.java @@ -0,0 +1,107 @@ +package com.chwl.core.im.custom.bean; + +import android.text.TextUtils; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.List; + +/** + * @author chenran + * @date 2017/7/28 + */ + +public class GiftAttachment extends CustomAttachment { + private GiftReceiveInfo giftReceiveInfo; + private String uid; + + public GiftAttachment(int first, int second) { + super(first, second); + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public GiftReceiveInfo getGiftReceiveInfo() { + return giftReceiveInfo; + } + + public void setGiftReceiveInfo(GiftReceiveInfo giftReceiveInfo) { + this.giftReceiveInfo = giftReceiveInfo; + } + + @Override + protected void parseData(JSONObject data) { + giftReceiveInfo = new GiftReceiveInfo(); + giftReceiveInfo.setUid(data.getLong("uid")); + giftReceiveInfo.setGiftId(data.getInteger("giftId")); + giftReceiveInfo.setAvatar(data.getString("avatar")); + giftReceiveInfo.setNick(data.getString("nick")); + giftReceiveInfo.setTargetUid(data.getLong("targetUid")); + giftReceiveInfo.setGiftNum(data.getIntValue("giftNum")); + giftReceiveInfo.setComboCount(data.getIntValue("comboCount")); + giftReceiveInfo.setTargetNick(data.getString("targetNick")); + giftReceiveInfo.setTargetAvatar(data.getString("targetAvatar")); + if (data.containsKey("isRoomAlbum")) { + giftReceiveInfo.setRoomAlbum(data.getBoolean("isRoomAlbum")); + } + JSONObject giftJson = null; + if (data.containsKey("gift")) { + giftJson = data.getJSONObject("gift"); + } else if (data.containsKey("giftInfo")) { + giftJson = data.getJSONObject("giftInfo"); + } + if (giftJson != null) { + GiftInfo giftInfo = new Gson().fromJson(giftJson.toJSONString(), GiftInfo.class); + giftReceiveInfo.setGift(giftInfo); + } + //礼物值数据处理 + if (data.containsKey("giftValueVos")) { + JSONArray giftValueVosArray = data.getJSONArray("giftValueVos"); + String giftValueVosStr = null; + if (giftValueVosArray != null) { + giftValueVosStr = giftValueVosArray.toJSONString(); + } + if (!TextUtils.isEmpty(giftValueVosStr)) { + List giftValueVos = new Gson().fromJson(giftValueVosStr, + new TypeToken>() { + }.getType()); + giftReceiveInfo.setGiftValueVos(giftValueVos); + } + } + giftReceiveInfo.setCurrentTime(data.getLong("currentTime")); + + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", giftReceiveInfo.getUid()); + object.put("giftId", giftReceiveInfo.getGiftId()); + object.put("avatar", giftReceiveInfo.getAvatar()); + object.put("nick", giftReceiveInfo.getNick()); + object.put("targetUid", giftReceiveInfo.getTargetUid()); + object.put("giftNum", giftReceiveInfo.getGiftNum()); + object.put("comboCount", giftReceiveInfo.getComboCount()); + object.put("targetNick", giftReceiveInfo.getTargetNick()); + object.put("targetAvatar", giftReceiveInfo.getTargetAvatar()); + object.put("giftInfo", giftReceiveInfo.getGift()); + object.put("isRoomAlbum", giftReceiveInfo.isRoomAlbum()); + if (giftReceiveInfo.getGiftValueVos() != null) { + object.put("giftValueVos", giftReceiveInfo.getGiftValueVos()); + } + object.put("currentTime", giftReceiveInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GiftBatchAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/GiftBatchAttachment.java new file mode 100644 index 0000000..d1d92fc --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GiftBatchAttachment.java @@ -0,0 +1,94 @@ +package com.chwl.core.im.custom.bean; + +import android.text.TextUtils; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftReceiver; +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.List; + +/** + * @author jack + * @date 2019/3/7 + */ + +public class GiftBatchAttachment extends CustomAttachment { + private GiftMultiReceiverInfo giftMultiReceiverInfo; + + public GiftBatchAttachment(int first, int second) { + super(first, second); + } + + public GiftMultiReceiverInfo getGiftMultiReceiverInfo() { + return giftMultiReceiverInfo; + } + + public void setGiftMultiReceiverInfo(GiftMultiReceiverInfo giftMultiReceiverInfo) { + this.giftMultiReceiverInfo = giftMultiReceiverInfo; + } + + @Override + protected void parseData(JSONObject data) { + giftMultiReceiverInfo = new GiftMultiReceiverInfo(); + giftMultiReceiverInfo.setUid(data.getLong("uid")); + giftMultiReceiverInfo.setGiftId(data.getInteger("giftId")); + giftMultiReceiverInfo.setAvatar(data.getString("avatar")); + giftMultiReceiverInfo.setNick(data.getString("nick")); + giftMultiReceiverInfo.setTargetUsers(data.getObject("targetUsers", + new TypeReference>() { + })); + giftMultiReceiverInfo.setGiftNum(data.getIntValue("giftNum")); + giftMultiReceiverInfo.setComboCount(data.getIntValue("comboCount")); + JSONObject giftJson = null; + if (data.containsKey("gift")) { + giftJson = data.getJSONObject("gift"); + } else if (data.containsKey("giftInfo")) { + giftJson = data.getJSONObject("giftInfo"); + } + GiftInfo giftInfo = JSON.parseObject(giftJson.toJSONString(), GiftInfo.class); + giftMultiReceiverInfo.setGift(giftInfo); + //礼物值数据处理 + if (data.containsKey("giftValueVos")) { + JSONArray giftValueVosArray = data.getJSONArray("giftValueVos"); + String giftValueVosStr = null; + if (giftValueVosArray != null) { + giftValueVosStr = giftValueVosArray.toJSONString(); + } + if (!TextUtils.isEmpty(giftValueVosStr)) { + List giftValueVos = new Gson().fromJson(giftValueVosStr, + new TypeToken>() { + }.getType()); + giftMultiReceiverInfo.setGiftValueVos(giftValueVos); + } + } + giftMultiReceiverInfo.setCurrentTime(data.getLong("currentTime")); + + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", giftMultiReceiverInfo.getUid()); + object.put("giftId", giftMultiReceiverInfo.getGiftId()); + object.put("avatar", giftMultiReceiverInfo.getAvatar()); + object.put("nick", giftMultiReceiverInfo.getNick()); + object.put("targetUsers", giftMultiReceiverInfo.getTargetUsers()); + object.put("giftNum", giftMultiReceiverInfo.getGiftNum()); + object.put("comboCount", giftMultiReceiverInfo.getComboCount()); + object.put("gift", giftMultiReceiverInfo.getGift()); + //礼物值 + if (giftMultiReceiverInfo.getGiftValueVos() != null) { + object.put("giftValueVos", giftMultiReceiverInfo.getGiftValueVos()); + } + object.put("currentTime", giftMultiReceiverInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundAttachment.java new file mode 100644 index 0000000..b3ff3d8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundAttachment.java @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +public class GiftCompoundAttachment extends CustomAttachment { + + private GiftCompoundMsgBean msgBean; + + public GiftCompoundAttachment(int second) { + super(CUSTOM_MSG_GIFT_COMPOUND, second); + } + + public GiftCompoundMsgBean getMsgBean() { + return msgBean; + } + + public void setMsgBean(GiftCompoundMsgBean msgBean) { + this.msgBean = msgBean; + } + + @Override + protected void parseData(JSONObject data) { + msgBean = new Gson().fromJson(data.toJSONString(), GiftCompoundMsgBean.class); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundMsgBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundMsgBean.java new file mode 100644 index 0000000..74e1ab7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/GiftCompoundMsgBean.java @@ -0,0 +1,14 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class GiftCompoundMsgBean { + private long uid; + private String msg; + private String nick; + private String giftId; + private String giftName; +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/HeadlineChangedAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/HeadlineChangedAttachment.kt new file mode 100644 index 0000000..ae3eba0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/HeadlineChangedAttachment.kt @@ -0,0 +1,21 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.public_chat_hall.bean.HeadlineBean +import com.google.gson.Gson + +class HeadlineChangedAttachment : CustomAttachment { + + var headlineData: HeadlineBean? = null + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + override fun parseData(data: JSONObject?) { + try { + headlineData = Gson().fromJson(data?.toJSONString(), HeadlineBean::class.java) + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/ImTipAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/ImTipAttachment.java new file mode 100644 index 0000000..bbba443 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/ImTipAttachment.java @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +public class ImTipAttachment extends CustomAttachment { + private String msg; + + public ImTipAttachment(int first, int second) { + super(first, second); + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("msg", msg); + return object; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + msg = data.getString("msg"); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingFamilyAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingFamilyAttachment.java new file mode 100644 index 0000000..3cd00dc --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingFamilyAttachment.java @@ -0,0 +1,41 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.share.bean.InAppSharingFamilyInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingFamilyAttachment extends CustomAttachment { + private String uid; + + private InAppSharingFamilyInfo info; + + public InAppSharingFamilyAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP, CUSTOM_MSG_SHARE_FAMILY); + } + + @Override + protected void parseData(JSONObject data) { + info = new Gson().fromJson(data.toJSONString(), InAppSharingFamilyInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("info", JSON.toJSON(info.getInfo())); + object.put("title", info.getTitle()); + object.put("avatar", info.getAvatar()); + object.put("actionName", info.getActionName()); + object.put("routerValue", info.getRouterValue()); + object.put("routerType", info.getRouterType()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingMiniWorldAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingMiniWorldAttachment.java new file mode 100644 index 0000000..505fa35 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingMiniWorldAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.share.bean.InAppSharingMiniWorldInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingMiniWorldAttachment extends CustomAttachment { + private String uid; + + private InAppSharingMiniWorldInfo info; + + public InAppSharingMiniWorldAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP, CUSTOM_MSG_SHARE_MINI_WORLD); + } + + @Override + protected void parseData(JSONObject data) { + info = new Gson().fromJson(data.toJSONString(), InAppSharingMiniWorldInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("info", JSON.toJSON(info.getInfo())); + object.put("title", info.getTitle()); + object.put("avatar", info.getAvatar()); + object.put("actionName", info.getActionName()); + object.put("routerValue", info.getRouterValue()); + object.put("routerType", info.getRouterType()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingRoomAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingRoomAttachment.java new file mode 100644 index 0000000..739772b --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingRoomAttachment.java @@ -0,0 +1,42 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.share.bean.InAppSharingRoomInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingRoomAttachment extends CustomAttachment { + + private String uid; + + private InAppSharingRoomInfo info; + + public InAppSharingRoomAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP, CUSTOM_MSG_SHARE_ROOM); + } + + @Override + protected void parseData(JSONObject data) { + info = new Gson().fromJson(data.toJSONString(), InAppSharingRoomInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("info", JSON.toJSON(info.getInfo())); + object.put("title", info.getTitle()); + object.put("avatar", info.getAvatar()); + object.put("actionName", info.getActionName()); + object.put("routerValue", info.getRouterValue()); + object.put("routerType", info.getRouterType()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingTeamAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingTeamAttachment.java new file mode 100644 index 0000000..df56b3a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/InAppSharingTeamAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.share.bean.InAppSharingTeamInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingTeamAttachment extends CustomAttachment { + private String uid; + + private InAppSharingTeamInfo info; + + public InAppSharingTeamAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SHARE_IN_APP, CUSTOM_MSG_SHARE_TEAM); + } + + @Override + protected void parseData(JSONObject data) { + info = new Gson().fromJson(data.toJSONString(), InAppSharingTeamInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(new Gson().toJson(info)); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldAttachment.java new file mode 100644 index 0000000..56c60fc --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldAttachment.java @@ -0,0 +1,37 @@ +package com.chwl.core.im.custom.bean; + +import com.chwl.core.miniworld.bean.MiniWorldInWorldInfo; +import com.chwl.core.user.bean.UserInfo; + + +public class JoinMiniWorldAttachment extends CustomAttachment { + private MiniWorldInWorldInfo miniWorldInfo; + private UserInfo userInfo; + private boolean joined; + + public MiniWorldInWorldInfo getMiniWorldInfo() { + return miniWorldInfo; + } + + public void setMiniWorldInfo(MiniWorldInWorldInfo miniWorldInfo) { + this.miniWorldInfo = miniWorldInfo; + } + + public JoinMiniWorldAttachment() { + this(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_GROUP_CHAT_ROOM_JOIN_TIP); + } + + public JoinMiniWorldAttachment(int first, int second) { + super(first, second); + } + + + @Override + public String toString() { + return "JoinMiniWorldAttachment{" + + "miniWorldInfo=" + miniWorldInfo + + ", userInfo=" + userInfo + + ", joined=" + joined + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldNoticeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldNoticeAttachment.java new file mode 100644 index 0000000..4e2b14d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/JoinMiniWorldNoticeAttachment.java @@ -0,0 +1,85 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; + +/** + * 加入话题的通知 + */ +public class JoinMiniWorldNoticeAttachment extends CustomAttachment { + + private long uid; + private String nick; + private long worldId; + private String worldName; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public long getWorldId() { + return worldId; + } + + public void setWorldId(long worldId) { + this.worldId = worldId; + } + + public String getWorldName() { + return worldName; + } + + public void setWorldName(String worldName) { + this.worldName = worldName; + } + + public JoinMiniWorldNoticeAttachment() { + this(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_GROUP_ROOM_JOIN_NOTICE); + } + + public JoinMiniWorldNoticeAttachment(int first, int second) { + super(first, second); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(this)); + return jsonObject; + } + + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data == null) { + return; + } + uid = data.getLongValue("uid"); + nick = data.getString("nick"); + worldId = data.getLongValue("worldId"); + worldName = data.getString("worldName"); + + } + + @Override + public String toString() { + return "JoinMiniWorldNoticeAttachment{" + + "uid=" + uid + + ", nick='" + nick + '\'' + + ", worldId=" + worldId + + ", worldName='" + worldName + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/LevelUpAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/LevelUpAttachment.java new file mode 100644 index 0000000..207bf80 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/LevelUpAttachment.java @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * Created by huangmeng1 on 2018/6/21. + */ + +public class LevelUpAttachment extends CustomAttachment { + /** -- 经验/魅力等级序号 */ + public String levelSeq; + public String levelName; + public LevelUpAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + levelSeq = data.getString("levelSeq"); + levelName = data.getString("levelName"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("levelSeq", levelSeq); + object.put("levelName",levelName); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/LevelUpNoticeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/LevelUpNoticeAttachment.java new file mode 100644 index 0000000..8282f58 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/LevelUpNoticeAttachment.java @@ -0,0 +1,58 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * Created by huangmeng1 on 2018/6/21. + */ + +public class LevelUpNoticeAttachment extends CustomAttachment { + /** -- 经验/魅力等级序号 */ + public String picUrl; + public long roomUid; + public String message; + public LevelUpNoticeAttachment(int first, int second) { + super(first, second); + } + + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + + public long getRoomUid() { + return roomUid; + } + + public void setRoomUid(long roomUid) { + this.roomUid = roomUid; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + picUrl = data.getString("picUrl"); + roomUid = data.getLong("roomUid"); + message = data.getString("message"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("picUrl", picUrl); + object.put("roomUid",roomUid); + object.put("message", message); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/LotteryAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/LotteryAttachment.java new file mode 100644 index 0000000..3e7a22a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/LotteryAttachment.java @@ -0,0 +1,45 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.activity.bean.LotteryInfo; + +/** + * Created by chenran on 2017/12/26. + */ + +public class LotteryAttachment extends CustomAttachment{ + private LotteryInfo lotteryInfo; + + public LotteryInfo getLotteryInfo() { + return lotteryInfo; + } + + public void setLotteryInfo(LotteryInfo lotteryInfo) { + this.lotteryInfo = lotteryInfo; + } + + public LotteryAttachment(int first, int second) { + super(first,second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + + lotteryInfo = new LotteryInfo(); + lotteryInfo.setLeftDrawNum(data.getIntValue("leftDrawNum")); + lotteryInfo.setUid(data.getLongValue("uid")); + lotteryInfo.setTotalDrawNum(data.getIntValue("totalDrawNum")); + lotteryInfo.setTotalWinDrawNum(data.getIntValue("totalWinDrawNum")); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("leftDrawNum", lotteryInfo.getLeftDrawNum()); + object.put("uid", lotteryInfo.getUid()); + object.put("totalDrawNum", lotteryInfo.getTotalDrawNum()); + object.put("totalWinDrawNum", lotteryInfo.getTotalWinDrawNum()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/LuckyGiftNotifyAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/LuckyGiftNotifyAttachment.kt new file mode 100644 index 0000000..556d05d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/LuckyGiftNotifyAttachment.kt @@ -0,0 +1,42 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.LuckyGiftMsgAllBean +import com.chwl.core.gift.bean.LuckyGiftMsgSelfBean +import com.google.gson.Gson + +class LuckyGiftNotifyAttachment(first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var luckyGiftMsgSelfBean: LuckyGiftMsgSelfBean? = null + @JvmField + var luckyGiftMsgAllBean: LuckyGiftMsgAllBean? = null + + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + if (second == CUSTOM_MSG_SUPER_LUCKY_GIFT_SELF){ + luckyGiftMsgSelfBean = Gson().fromJson( + data.toJSONString(), + LuckyGiftMsgSelfBean::class.java + ) + }else if (second == CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM || second == CUSTOM_MSG_SUPER_LUCKY_GIFT_ALL) { + luckyGiftMsgAllBean = Gson().fromJson( + data.toJSONString(), + LuckyGiftMsgAllBean::class.java + ) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyAttachment.java new file mode 100644 index 0000000..ca398da --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyAttachment.java @@ -0,0 +1,46 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 31/05/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class LuckyMoneyAttachment extends CustomAttachment { + + private String uid; + + private LuckyMoneyInfo luckyMoneyInfo; + + public LuckyMoneyAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY, CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_MONEY); + } + + @Override + protected void parseData(JSONObject data) { + luckyMoneyInfo = new Gson().fromJson(data.toJSONString(), LuckyMoneyInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("nick", luckyMoneyInfo.getNick()); + object.put("avatar", luckyMoneyInfo.getAvatar()); + object.put("claimStatus", luckyMoneyInfo.getClaimStatus()); + object.put("id", luckyMoneyInfo.getId()); + object.put("senderUid", luckyMoneyInfo.getSenderUid()); + object.put("familyId", luckyMoneyInfo.getFamilyId()); + object.put("amount", luckyMoneyInfo.getAmount()); + object.put("num", luckyMoneyInfo.getNum()); + object.put("coinName", luckyMoneyInfo.getCoinName()); + object.put("message", luckyMoneyInfo.getMessage()); + object.put("teamId", luckyMoneyInfo.getTId()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyTipsAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyTipsAttachment.java new file mode 100644 index 0000000..0880cec --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/LuckyMoneyTipsAttachment.java @@ -0,0 +1,47 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 02/07/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class LuckyMoneyTipsAttachment extends CustomAttachment { + private String uid; + + private LuckyMoneyInfo luckyMoneyInfo; + + public LuckyMoneyTipsAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY, CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY); + } + + @Override + protected void parseData(JSONObject data) { + luckyMoneyInfo = new Gson().fromJson(data.toJSONString(), LuckyMoneyInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("nick", luckyMoneyInfo.getNick()); + object.put("avatar", luckyMoneyInfo.getAvatar()); + object.put("claimStatus", luckyMoneyInfo.getClaimStatus()); + object.put("id", luckyMoneyInfo.getId()); + object.put("senderUid", luckyMoneyInfo.getSenderUid()); + object.put("receiveUid", luckyMoneyInfo.getReceiveUid()); + object.put("receiveNick", luckyMoneyInfo.getReceiveNick()); + object.put("familyId", luckyMoneyInfo.getFamilyId()); + object.put("amount", luckyMoneyInfo.getAmount()); + object.put("num", luckyMoneyInfo.getNum()); + object.put("coinName", luckyMoneyInfo.getCoinName()); + object.put("message", luckyMoneyInfo.getMessage()); + object.put("teamId", luckyMoneyInfo.getTId()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MagicAllMicAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MagicAllMicAttachment.java new file mode 100644 index 0000000..6b05b05 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MagicAllMicAttachment.java @@ -0,0 +1,64 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.magic.MagicModel; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.bean.MultiMagicReceivedInfo; + +/** + * @author xiaoyu + */ + +public class MagicAllMicAttachment extends CustomAttachment { + private MultiMagicReceivedInfo mMultiMagicReceivedInfo; + private String uid; + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public MagicAllMicAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC, CUSTOM_MSG_SUB_TYPE_SEND_MULTI_MAGIC); + } + + public MultiMagicReceivedInfo getMultiMagicReceivedInfo() { + return mMultiMagicReceivedInfo; + } + + public void setMultiMagicReceivedInfo(MultiMagicReceivedInfo multiMagicReceivedInfo) { + this.mMultiMagicReceivedInfo = multiMagicReceivedInfo; + } + + @Override + protected void parseData(JSONObject data) { + mMultiMagicReceivedInfo = JSON.parseObject(data.toJSONString(), MultiMagicReceivedInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", mMultiMagicReceivedInfo.getUid()); + object.put("avatar", mMultiMagicReceivedInfo.getAvatar()); + object.put("nick", mMultiMagicReceivedInfo.getNick()); + object.put("targetUids", mMultiMagicReceivedInfo.getTargetUids()); + object.put("giftMagicId", mMultiMagicReceivedInfo.getMagicId()); + object.put("giftMagicNum", mMultiMagicReceivedInfo.getNumber()); + object.put("playEffect", mMultiMagicReceivedInfo.isNeedShowExplode()); + MagicInfo magicInfo = MagicModel.get().getMagicInfo(mMultiMagicReceivedInfo.getMagicId()); + if (magicInfo != null) { + object.put("magicSvgUrl", magicInfo.getPathAnim()); + object.put("effectSvgUrl", magicInfo.getExplodeAnim()); + object.put("playPosition", magicInfo.getPosition()); + } + if (mMultiMagicReceivedInfo.getGiftValueVos() != null) { + object.put("giftValueVos", mMultiMagicReceivedInfo.getGiftValueVos()); + } + object.put("currentTime", mMultiMagicReceivedInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MagicAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MagicAttachment.java new file mode 100644 index 0000000..d722743 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MagicAttachment.java @@ -0,0 +1,66 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.magic.MagicModel; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.bean.MagicReceivedInfo; + +/** + * @author xiaoyu + */ + +public class MagicAttachment extends CustomAttachment { + private MagicReceivedInfo mMagicReceivedInfo; + private String uid; + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public MagicAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC, CUSTOM_MSG_SUB_TYPE_SEND_SINGLE_MAGIC); + } + + public MagicReceivedInfo getMagicReceivedInfo() { + return mMagicReceivedInfo; + } + + public void setMagicReceivedInfo(MagicReceivedInfo magicReceivedInfo) { + this.mMagicReceivedInfo = magicReceivedInfo; + } + + @Override + protected void parseData(JSONObject data) { + mMagicReceivedInfo = JSON.parseObject(data.toJSONString(), MagicReceivedInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", mMagicReceivedInfo.getUid()); + object.put("avatar", mMagicReceivedInfo.getAvatar()); + object.put("nick", mMagicReceivedInfo.getNick()); + object.put("targetUid", mMagicReceivedInfo.getTargetUid()); + object.put("targetAvatar", mMagicReceivedInfo.getTargetAvatar()); + object.put("targetNick", mMagicReceivedInfo.getTargetNick()); + object.put("giftMagicId", mMagicReceivedInfo.getMagicId()); + object.put("giftMagicNum", mMagicReceivedInfo.getNumber()); + object.put("playEffect", mMagicReceivedInfo.isNeedShowExplodeEffect()); + MagicInfo magicInfo = MagicModel.get().getMagicInfo(mMagicReceivedInfo.getMagicId()); + if (magicInfo != null) { + object.put("magicSvgUrl", magicInfo.getPathAnim()); + object.put("effectSvgUrl", magicInfo.getExplodeAnim()); + object.put("playPosition", magicInfo.getPosition()); + } + if (mMagicReceivedInfo.getGiftValueVos() != null) { + object.put("giftValueVos", mMagicReceivedInfo.getGiftValueVos()); + } + object.put("currentTime", mMagicReceivedInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MagicBatchAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MagicBatchAttachment.java new file mode 100644 index 0000000..6954967 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MagicBatchAttachment.java @@ -0,0 +1,55 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.magic.MagicModel; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.bean.MagicMultiReceiverInfo; + +/** + * @author xiaoyu + */ + +public class MagicBatchAttachment extends CustomAttachment { + private MagicMultiReceiverInfo magicMultiReceiverInfo; + + public MagicBatchAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC, CUSTOM_MSG_SUB_TYPE_BATCH_SEND_MAGIC); + } + + public MagicMultiReceiverInfo getMagicMultiReceiverInfo() { + return magicMultiReceiverInfo; + } + + public void setMagicMultiReceiverInfo(MagicMultiReceiverInfo magicMultiReceiverInfo) { + this.magicMultiReceiverInfo = magicMultiReceiverInfo; + } + + @Override + protected void parseData(JSONObject data) { + magicMultiReceiverInfo = JSON.parseObject(data.toJSONString(), MagicMultiReceiverInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", magicMultiReceiverInfo.getUid()); + object.put("avatar", magicMultiReceiverInfo.getAvatar()); + object.put("nick", magicMultiReceiverInfo.getNick()); + object.put("giftMagicId", magicMultiReceiverInfo.getMagicId()); + object.put("giftMagicNum", magicMultiReceiverInfo.getNumber()); + object.put("playEffect", magicMultiReceiverInfo.isNeedShowExplode()); + object.put("targetUsers", magicMultiReceiverInfo.getTargetUsers()); + MagicInfo magicInfo = MagicModel.get().getMagicInfo(magicMultiReceiverInfo.getMagicId()); + if (magicInfo != null) { + object.put("magicSvgUrl", magicInfo.getPathAnim()); + object.put("effectSvgUrl", magicInfo.getExplodeAnim()); + object.put("playPosition", magicInfo.getPosition()); + } + if (magicMultiReceiverInfo.getGiftValueVos() != null) { + object.put("giftValueVos", magicMultiReceiverInfo.getGiftValueVos()); + } + object.put("currentTime", magicMultiReceiverInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MatchAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MatchAttachment.java new file mode 100644 index 0000000..dfa0cf3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MatchAttachment.java @@ -0,0 +1,55 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * 小秘书通用消息 + * Created by huangmeng1 on 2018/4/11. + */ + +public class MatchAttachment extends CustomAttachment { + private String content; + private String matchId; + private boolean isNeedForwardToMatchDetail; + + public MatchAttachment(int second) { + super(CUSTOM_MSG_MATCH, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("content")) { + content = data.getString("content"); + } + if (data.containsKey("matchId")) { + matchId = data.getString("matchId"); + } + if (data.containsKey("isNeedForwardToMatchDetail")) { + isNeedForwardToMatchDetail = data.getBooleanValue("isNeedForwardToMatchDetail"); + } + } + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("content", content); + jsonObject.put("matchId", matchId); + jsonObject.put("isNeedForwardToMatchDetail", isNeedForwardToMatchDetail); + return jsonObject; + } + + public String getContent() { + return content; + } + + public String getMatchId() { + return matchId; + } + + public boolean isNeedForwardToMatchDetail() { + return isNeedForwardToMatchDetail; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MatchTicketAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MatchTicketAttachment.java new file mode 100644 index 0000000..2835769 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MatchTicketAttachment.java @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +public class MatchTicketAttachment extends CustomAttachment { + private String content; + + public MatchTicketAttachment(int second) { + super(CUSTOM_MSG_MATCH, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("content")) { + content = data.getString("content"); + } + } + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("content", content); + return jsonObject; + } + + public String getContent() { + return content; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MonsterAttackAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MonsterAttackAttachment.java new file mode 100644 index 0000000..85aa88f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MonsterAttackAttachment.java @@ -0,0 +1,62 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.monsterhunting.bean.MonsterAttackInfo; + +/** + * Created by MadisonRong on 31/03/2018. + */ + +public class MonsterAttackAttachment extends CustomAttachment { + + private String uid; + + private MonsterAttackInfo monsterAttackReceiveInfo; + + public MonsterAttackAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING, CUSTOM_NOTI_SUB_GAME_ATTACK); + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public MonsterAttackInfo getMonsterAttackReceiveInfo() { + return monsterAttackReceiveInfo; + } + + public void setMonsterAttackInfo(MonsterAttackInfo monsterAttackReceiveInfo) { + this.monsterAttackReceiveInfo = monsterAttackReceiveInfo; + } + + @Override + protected void parseData(JSONObject data) { + monsterAttackReceiveInfo = new Gson().fromJson(data.toJSONString(), MonsterAttackInfo.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", monsterAttackReceiveInfo.getUid()); + object.put("avatar", monsterAttackReceiveInfo.getAvatar()); + object.put("nick", monsterAttackReceiveInfo.getNick()); + object.put("monsterId", monsterAttackReceiveInfo.getMonsterId()); + object.put("monsterName", monsterAttackReceiveInfo.getMonsterName()); + object.put("monsterRemainBlood", monsterAttackReceiveInfo.getMonsterRemainBlood()); + object.put("monsterTotalBlood", monsterAttackReceiveInfo.getMonsterTotalBlood()); + object.put("monsterStatus", monsterAttackReceiveInfo.getMonsterStatus()); + object.put("beforeDisappearSeconds", monsterAttackReceiveInfo.getBeforeDisappearSeconds()); + object.put("magicId", monsterAttackReceiveInfo.getMagicId()); + object.put("magicIcon", monsterAttackReceiveInfo.getMagicIcon()); + object.put("impactValue", monsterAttackReceiveInfo.getImpactValue()); + object.put("remainMills", monsterAttackReceiveInfo.getRemainMills()); + object.put("playEffect", monsterAttackReceiveInfo.getPlayEffect()); + object.put("sequence", monsterAttackReceiveInfo.getSequence()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MonsterHuntingResultAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MonsterHuntingResultAttachment.java new file mode 100644 index 0000000..6b20b39 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MonsterHuntingResultAttachment.java @@ -0,0 +1,46 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.monsterhunting.bean.MonsterHuntingResult; + +/** + * Created by MadisonRong on 12/04/2018. + */ + +public class MonsterHuntingResultAttachment extends CustomAttachment { + + private MonsterHuntingResult result; + + public MonsterHuntingResultAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING, CUSTOM_NOTI_SUB_GAME_RESULT); + } + + public MonsterHuntingResult getResult() { + return result; + } + + public void setResult(MonsterHuntingResult result) { + this.result = result; + } + + @Override + protected void parseData(JSONObject data) { + result = new Gson().fromJson(data.toJSONString(), MonsterHuntingResult.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(result)); + } + + @Override + public String toString() { + return "MonsterHuntingResultAttachment{" + + "result=" + result + + ", first=" + first + + ", second=" + second + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MonsterStatusAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MonsterStatusAttachment.java new file mode 100644 index 0000000..2f6b78d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MonsterStatusAttachment.java @@ -0,0 +1,70 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.monsterhunting.bean.MonsterDataBean; +import com.google.gson.Gson; +import com.chwl.core.monsterhunting.bean.MonsterProtocol; + +/** + * Created by MadisonRong on 11/04/2018. + */ + +public class MonsterStatusAttachment extends CustomAttachment { + + private MonsterDataBean dataBean; + + public MonsterStatusAttachment(int second) { + super(CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING, second); + } + + public MonsterDataBean getDataBean() { + return dataBean; + } + + public void setDataBean(MonsterDataBean dataBean) { + this.dataBean = dataBean; + } + + @Override + protected void parseData(JSONObject data) { + dataBean = new Gson().fromJson(data.toJSONString(), MonsterDataBean.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("appearDuration", dataBean.getAppearDuration()); + object.put("appearRoomUid", dataBean.getAppearRoomUid()); + object.put("appearSvg", dataBean.getAppearSvg()); + object.put("appearTime", dataBean.getAppearTime()); + object.put("attackSvg", dataBean.getAttackSvg()); + object.put("beforeAppearSeconds", dataBean.getBeforeAppearSeconds()); + object.put("beforeDisappearSeconds", dataBean.getBeforeDisappearSeconds()); + object.put("defeatSvg", dataBean.getDefeatSvg()); + object.put("disappearTime", dataBean.getDisappearTime()); + object.put("escapeSvg", dataBean.getEscapeSvg()); + object.put("hallNotifyBg", dataBean.getHallNotifyBg()); + object.put("hallNotifyClockImg", dataBean.getHallNotifyClockImg()); + object.put("monsterId", dataBean.getMonsterId()); + object.put("monsterImg", dataBean.getMonsterImg()); + object.put("monsterName", dataBean.getMonsterName()); + object.put("monsterStatus", dataBean.getMonsterStatus()); + object.put("normalSvg", dataBean.getNormalSvg()); + object.put("notifyMessage", dataBean.getNotifyMessage()); + object.put("remainBlood", dataBean.getRemainBlood()); + object.put("roomNotifyBg", dataBean.getRoomNotifyBg()); + object.put("roomNotifyClockImg", dataBean.getRoomNotifyClockImg()); + object.put("serverTime", dataBean.getServerTime()); + object.put("totalBlood", dataBean.getTotalBlood()); + return object; + } + + @Override + public String toString() { + return "MonsterStatusAttachment{" + + "dataBean=" + dataBean + + ", first=" + first + + ", second=" + second + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MsgConfirmMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MsgConfirmMsgAttachment.java new file mode 100644 index 0000000..25a3693 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MsgConfirmMsgAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.MsgConfirmEntity; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MsgConfirmMsgAttachment extends CustomAttachment { + + public MsgConfirmEntity msgConfirmEntity; + + public MsgConfirmMsgAttachment() { + super(MSG_CONFIRM_FIRST, MSG_CONFIRM_SECOND); + } + + @Override + protected void parseData(JSONObject data) { + msgConfirmEntity = new Gson().fromJson(data.toJSONString(), MsgConfirmEntity.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(msgConfirmEntity); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeConfirmAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeConfirmAttachment.java new file mode 100644 index 0000000..7d2f5b1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeConfirmAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.MsgCpRelationalChangeEntity; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MsgCpRelationalChangeConfirmAttachment extends CustomAttachment { + + public MsgCpRelationalChangeEntity msgData; + + public MsgCpRelationalChangeConfirmAttachment() { + super(MSG_CONFIRM_CP_CHANGE_FIRST, MSG_CONFIRM_CP_CHANGE_SECOND_CONFIRM); + } + + @Override + protected void parseData(JSONObject data) { + msgData = new Gson().fromJson(data.toJSONString(), MsgCpRelationalChangeEntity.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(msgData); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeNotifyAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeNotifyAttachment.java new file mode 100644 index 0000000..850c437 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MsgCpRelationalChangeNotifyAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.MsgCpRelationalNotifyEntity; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MsgCpRelationalChangeNotifyAttachment extends CustomAttachment { + + public MsgCpRelationalNotifyEntity msgData; + + public MsgCpRelationalChangeNotifyAttachment() { + super(MSG_CONFIRM_CP_CHANGE_FIRST, MSG_CONFIRM_CP_CHANGE_SECOND_NOTIFY); + } + + @Override + protected void parseData(JSONObject data) { + msgData = new Gson().fromJson(data.toJSONString(), MsgCpRelationalNotifyEntity.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(msgData); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MsgEventStartNotifyAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MsgEventStartNotifyAttachment.java new file mode 100644 index 0000000..0607ec1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MsgEventStartNotifyAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.MsgEventStartNotifyEntity; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MsgEventStartNotifyAttachment extends CustomAttachment { + + public MsgEventStartNotifyEntity msgData; + + public MsgEventStartNotifyAttachment() { + super(MSG_EVENT_START_NOTIFY_FIRST, MSG_EVENT_START_NOTIFY_SECOND); + } + + @Override + protected void parseData(JSONObject data) { + msgData = new Gson().fromJson(data.toJSONString(), MsgEventStartNotifyEntity.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(msgData); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MultiGiftAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MultiGiftAttachment.java new file mode 100644 index 0000000..c2cf4d8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MultiGiftAttachment.java @@ -0,0 +1,95 @@ +package com.chwl.core.im.custom.bean; + +import android.text.TextUtils; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by chenran on 2017/10/25. + */ + +public class MultiGiftAttachment extends CustomAttachment { + private MultiGiftReceiveInfo multiGiftReceiveInfo; + + public MultiGiftAttachment(int first, int second) { + super(first, second); + } + + public MultiGiftReceiveInfo getMultiGiftReceiveInfo() { + return multiGiftReceiveInfo; + } + + public void setMultiGiftAttachment(MultiGiftReceiveInfo multiGiftRecieveInfo) { + this.multiGiftReceiveInfo = multiGiftRecieveInfo; + } + + @Override + protected void parseData(JSONObject data) { + multiGiftReceiveInfo = new MultiGiftReceiveInfo(); + multiGiftReceiveInfo.setUid(data.getLong("uid")); + multiGiftReceiveInfo.setGiftId(data.getInteger("giftId")); + multiGiftReceiveInfo.setAvatar(data.getString("avatar")); + multiGiftReceiveInfo.setNick(data.getString("nick")); + multiGiftReceiveInfo.setGiftNum(data.getIntValue("giftNum")); + multiGiftReceiveInfo.setComboCount(data.getIntValue("comboCount")); + JSONArray jsonArray = data.getJSONArray("targetUids"); + List targetUids = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + Long uid = jsonArray.getLong(i); + targetUids.add(uid); + } + multiGiftReceiveInfo.setTargetUids(targetUids); + data.getJSONObject("gift").toJSONString(); + GiftInfo giftInfo = new Gson().fromJson(data.getJSONObject("gift").toJSONString(), GiftInfo.class); + multiGiftReceiveInfo.setGift(giftInfo); + //礼物值数据处理 + if (data.containsKey("giftValueVos")) { + JSONArray giftValueVosArray = data.getJSONArray("giftValueVos"); + String giftValueVosStr = null; + if (giftValueVosArray != null) { + giftValueVosStr = giftValueVosArray.toJSONString(); + } + if (!TextUtils.isEmpty(giftValueVosStr)) { + List giftValueVos = new Gson().fromJson(giftValueVosStr, + new TypeToken>() { + }.getType()); + multiGiftReceiveInfo.setGiftValueVos(giftValueVos); + } + } + multiGiftReceiveInfo.setCurrentTime(data.getLong("currentTime")); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("uid", multiGiftReceiveInfo.getUid()); + object.put("giftId", multiGiftReceiveInfo.getGiftId()); + object.put("avatar", multiGiftReceiveInfo.getAvatar()); + object.put("nick", multiGiftReceiveInfo.getNick()); + object.put("giftNum", multiGiftReceiveInfo.getGiftNum()); + object.put("comboCount", multiGiftReceiveInfo.getComboCount()); + object.put("gift", multiGiftReceiveInfo.getGift()); + + JSONArray jsonArray = new JSONArray(); + for (int i = 0; i < multiGiftReceiveInfo.getTargetUids().size(); i++) { + Long uid = multiGiftReceiveInfo.getTargetUids().get(i); + jsonArray.add(uid); + } + object.put("targetUids", jsonArray); + //礼物值 + if (multiGiftReceiveInfo.getGiftValueVos() != null) { + object.put("giftValueVos", multiGiftReceiveInfo.getGiftValueVos()); + } + object.put("currentTime", multiGiftReceiveInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/MultiLuckyGiftAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/MultiLuckyGiftAttachment.java new file mode 100644 index 0000000..4b3fb79 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/MultiLuckyGiftAttachment.java @@ -0,0 +1,80 @@ +package com.chwl.core.im.custom.bean; + +import android.text.TextUtils; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.gift.bean.LuckyBagGifts; +import com.chwl.core.gift.bean.LuckyGiftList; + +/** + * Created by chenran on 2017/10/25. + */ + +public class MultiLuckyGiftAttachment extends CustomAttachment { + private LuckyBagGifts multiLuckyGiftReceiveInfo; + + public MultiLuckyGiftAttachment(int first, int second) { + super(first, second); + } + + public LuckyBagGifts getMultiLuckyGiftReceiveInfo() { + return multiLuckyGiftReceiveInfo; + } + + public void setMultiLuckyGiftAttachment(LuckyBagGifts multiGiftRecieveInfo) { + this.multiLuckyGiftReceiveInfo = multiGiftRecieveInfo; + } + + @Override + protected void parseData(JSONObject data) { + multiLuckyGiftReceiveInfo = new Gson().fromJson(data.toJSONString(), LuckyBagGifts.class); + LuckyGiftList luckyGiftList = multiLuckyGiftReceiveInfo.getLuckyGiftList(); + if (luckyGiftList != null) { + multiLuckyGiftReceiveInfo.setGiftList(luckyGiftList.getGiftList()); + multiLuckyGiftReceiveInfo.setUser(luckyGiftList.getUser()); + } + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("nick", multiLuckyGiftReceiveInfo.getNick()); + + if (multiLuckyGiftReceiveInfo.getGiftList() != null) { + JSONObject luckyGiftListObj = new JSONObject(); + luckyGiftListObj.put("giftList", multiLuckyGiftReceiveInfo.getGiftList()); + luckyGiftListObj.put("user", multiLuckyGiftReceiveInfo.getUser()); + object.put("luckyGiftList", luckyGiftListObj); + } + if (multiLuckyGiftReceiveInfo.getDisplayGift() != null) { + object.put("displayGift", multiLuckyGiftReceiveInfo.getDisplayGift()); + } + object.put("uid", multiLuckyGiftReceiveInfo.getUid()); + if (!TextUtils.isEmpty(multiLuckyGiftReceiveInfo.getLuckyGiftSvgaUrl())) { + object.put("luckyGiftSvgaUrl", multiLuckyGiftReceiveInfo.getLuckyGiftSvgaUrl()); + } + object.put("giftId", multiLuckyGiftReceiveInfo.getGiftId()); + object.put("giftName", multiLuckyGiftReceiveInfo.getGiftName()); + object.put("i18nGiftNameMap", multiLuckyGiftReceiveInfo.getI18nGiftNameMap()); + object.put("targetNick", multiLuckyGiftReceiveInfo.getUser().getNick()); + object.put("giftNum", multiLuckyGiftReceiveInfo.getGiftNum()); + object.put("isShowAnimation", multiLuckyGiftReceiveInfo.isShowAnimation()); + object.put("targetUid", multiLuckyGiftReceiveInfo.getUser().getUid()); + //礼物值 + if (multiLuckyGiftReceiveInfo.getGiftValueVos() != null) { + object.put("giftValueVos", multiLuckyGiftReceiveInfo.getGiftValueVos()); + } + + JSONArray jsonArray = new JSONArray(); + for (int i = 0; i < multiLuckyGiftReceiveInfo.getTargetUids().size(); i++) { + Long uid = multiLuckyGiftReceiveInfo.getTargetUids().get(i); + jsonArray.add(uid); + } + object.put("targetUids", jsonArray); + + object.put("currentTime", multiLuckyGiftReceiveInfo.getCurrentTime()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/NewbieHelloAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/NewbieHelloAttachment.java new file mode 100644 index 0000000..25d349d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/NewbieHelloAttachment.java @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.newbie.bean.NewbieHelloInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class NewbieHelloAttachment extends CustomAttachment { + private NewbieHelloInfo newbieHelloInfo; + + public NewbieHelloAttachment(int second) { + super(CUSTOM_MSG_NEWBIE, second); + } + + @Override + protected void parseData(JSONObject data) { + newbieHelloInfo = new Gson().fromJson(data.toJSONString(), NewbieHelloInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(newbieHelloInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/NobleAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/NobleAttachment.java new file mode 100644 index 0000000..66a5034 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/NobleAttachment.java @@ -0,0 +1,126 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; +import com.orhanobut.logger.Logger; +import com.chwl.core.R; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.noble.bean.NobleProtocol; +import com.chwl.library.rxbus.RxBusHelper; +import com.chwl.library.utils.ResUtil; + +import java.io.IOException; + +/** + *

贵族相关通知

+ * + * @author jiahui + * @date 2018/1/10 + */ +public class NobleAttachment extends CustomAttachment { + + public int mSecond; + public String msg; + + public NobleInfo nobleInfo; + public String nick; + public long uid; + public String avatar; + /** 1:开通,2:续费 */ + public int type; + + /** + * 用于把boolean值转换成int类型 + */ + private static final TypeAdapter intAsBooleanAdapter = new TypeAdapter() { + @Override + public void write(JsonWriter out, Integer value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + out.value(value); + } + } + + @Override + public Integer read(JsonReader in) throws IOException { + JsonToken peek = in.peek(); + switch (peek) { + case BOOLEAN: + return in.nextBoolean() ? 1 : 0; + case NULL: + in.nextNull(); + return null; + case NUMBER: + return in.nextInt(); + case STRING: + return Integer.parseInt(in.nextString()); + default: + throw new IllegalStateException("Expected BOOLEAN or NUMBER but was " + peek); + } + } + }; + + public NobleAttachment(int first, int second) { + super(first, second); + mSecond = second; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + Logger.i(ResUtil.getString(R.string.custom_bean_nobleattachment_01), data.toJSONString()); + if (data.containsKey("msg")) { + msg = data.getString("msg"); + } + if (data.containsKey("nick")) { + nick = data.getString("nick"); + } + if (data.containsKey("uid")) { + uid = data.getLong("uid"); + } + if (data.containsKey("avatar")) { + avatar = data.getString("avatar"); + } + if (data.containsKey("type")) { + type = data.getInteger("type"); + } + if (data.containsKey("nobleInfo")) { + JSONObject nobleInfo = data.getJSONObject("nobleInfo"); + if (nobleInfo != null) { + Gson gson = new GsonBuilder() + .registerTypeAdapter(Integer.class, intAsBooleanAdapter) + .registerTypeAdapter(int.class, intAsBooleanAdapter) + .create(); + this.nobleInfo = gson.fromJson(nobleInfo.toJSONString(), NobleInfo.class); + } + } + NobleProtocol nobleProtocol = new NobleProtocol(); + nobleProtocol.setFirst(first); + nobleProtocol.setSecond(second); + NobleProtocol.DataBean dataBean = new NobleProtocol.DataBean(); + dataBean.setType(type); + dataBean.setAvatar(avatar); + dataBean.setNick(nick); + dataBean.setUid(uid); + dataBean.setNobleInfo(nobleInfo); + nobleProtocol.setData(dataBean); + RxBusHelper.post(nobleProtocol); + } + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nobleInfo", nobleInfo); + jsonObject.put("nick", nick); + jsonObject.put("uid", uid); + return jsonObject; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/NoticeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/NoticeAttachment.java new file mode 100644 index 0000000..23c548f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/NoticeAttachment.java @@ -0,0 +1,69 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * Created by chenran on 2017/9/22. + */ + +public class NoticeAttachment extends CustomAttachment { + private String title; + private String desc; + private String picUrl; + private String webUrl; + + public NoticeAttachment(int first, int second) { + super(first, second); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + + public String getWebUrl() { + return webUrl; + } + + public void setWebUrl(String webUrl) { + this.webUrl = webUrl; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + title = data.getString("title"); + desc = data.getString("desc"); + picUrl = data.getString("picUrl"); + webUrl = data.getString("webUrl"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("title", title); + object.put("desc", desc); + object.put("picUrl", picUrl); + object.put("webUrl", webUrl); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Attachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Attachment.kt new file mode 100644 index 0000000..44434fc --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Attachment.kt @@ -0,0 +1,11 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.google.gson.Gson + +class NotifyH5Attachment(second: Int) : CustomAttachment(CUSTOM_MSG_NOTIFY_H5, second) { + var bean: NotifyH5Info? = null + override fun parseData(data: JSONObject) { + bean = Gson().fromJson(data.toJSONString(), NotifyH5Info::class.java) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Info.java b/core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Info.java new file mode 100644 index 0000000..66a7d55 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/NotifyH5Info.java @@ -0,0 +1,16 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; + +@Data +public class NotifyH5Info { + + private long roomUid; + + /** + * 飘屏类型 0 房间静态飘屏 1 全服动态飘屏 + */ + private int floatingType; + + private String content; +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/OpenRoomNotiAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/OpenRoomNotiAttachment.java new file mode 100644 index 0000000..8b39d45 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/OpenRoomNotiAttachment.java @@ -0,0 +1,58 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +/** + * Created by chenran on 2017/8/14. + */ + +public class OpenRoomNotiAttachment extends CustomAttachment{ + private long uid; + private String nick; + private String avatar; + + public void setUid(long uid) { + this.uid = uid; + } + + public long getUid() { + return uid; + } + + @Override + protected void parseData(JSONObject data) { + uid = data.getLong("uid"); + nick = data.getString("nick"); + avatar = data.getString("avatar"); + + JSONObject userInfo = data.getJSONObject("userVo"); + nick = userInfo.getString("nick"); + avatar = userInfo.getString("avatar"); + } + + OpenRoomNotiAttachment(int first, int second) { + super(first,second); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + return object; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/OpenSignInAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/OpenSignInAttachment.java new file mode 100644 index 0000000..e2471ec --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/OpenSignInAttachment.java @@ -0,0 +1,39 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.radish.signin.bean.ImNotice; + +import lombok.Getter; + +/** + * 打开签到 + * create by lvzebiao @2019/3/20 + */ +public class OpenSignInAttachment extends CustomAttachment { + + @Getter + private ImNotice imNotice; + + public OpenSignInAttachment(int first, int second) { + super(first, second); + } + + @Override + protected JSONObject packData() { + if (imNotice != null) { + String jsonStr = new Gson().toJson(imNotice); + return JSONObject.parseObject(jsonStr); + } + return super.packData(); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + imNotice = new Gson().fromJson(data.toJSONString(), ImNotice.class); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/P2PContactRechargeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/P2PContactRechargeAttachment.java new file mode 100644 index 0000000..4c2dd40 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/P2PContactRechargeAttachment.java @@ -0,0 +1,26 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; + +public class P2PContactRechargeAttachment extends CustomAttachment { + private String idWeChat; + private String idLine; + + public P2PContactRechargeAttachment() { + super(CUSTOM_MSG_P2P, CUSTOM_MSG_P2P_CONTACT_RECHAGE); + } + + @Override + protected void parseData(JSONObject data) { + idWeChat = data.getString("official0"); + idLine = data.getString("official1"); + } + + public String getIdWeChat() { + return idWeChat; + } + + public String getIdLine() { + return idLine; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/PlayEffectInfo.java b/core/src/main/java/com/chwl/core/im/custom/bean/PlayEffectInfo.java new file mode 100644 index 0000000..6052110 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/PlayEffectInfo.java @@ -0,0 +1,20 @@ +package com.chwl.core.im.custom.bean; + +import com.chwl.core.gift.bean.LuckyBagNoticeInfo; +import com.chwl.core.treasurefairy.bean.FairyMsgInfoBean; + +import lombok.Data; + +@Data +public class PlayEffectInfo { + + private int second; + private RoomBoxPrizeInfo roomBoxPrizeInfo; + private RoomLuckySeaMsgBean roomLuckySeaMsgBean; + private LuckyBagNoticeInfo luckyBagNoticeInfo; + private FairyMsgInfoBean fairyMsgInfo; + + private TarotMsgBean tarotMsgBean; + + private NotifyH5Info notifyH5; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageAttachment.java new file mode 100644 index 0000000..367342f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.redpackage.bean.RedPackageNotifyInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RedPackageAttachment extends CustomAttachment { + + public RedPackageNotifyInfo redPackageNotifyInfo; + + public RedPackageAttachment(int second) { + super(CUSTOM_MSG_RED_PACKAGE, second); + } + + @Override + protected void parseData(JSONObject data) { + redPackageNotifyInfo = new Gson().fromJson(data.toJSONString(), RedPackageNotifyInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(redPackageNotifyInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageLuckyBagAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageLuckyBagAttachment.java new file mode 100644 index 0000000..dbd6a8f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageLuckyBagAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.redpackage.bean.RedPackageLuckyBag; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RedPackageLuckyBagAttachment extends CustomAttachment { + + public RedPackageLuckyBag redPackageLuckyBag; + + public RedPackageLuckyBagAttachment() { + super(CUSTOM_MSG_RED_PACKAGE, CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_LUCKY_BAG); + } + + @Override + protected void parseData(JSONObject data) { + redPackageLuckyBag = new Gson().fromJson(data.toJSONString(), RedPackageLuckyBag.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(redPackageLuckyBag); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageRoomMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageRoomMsgAttachment.java new file mode 100644 index 0000000..7fca4d6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RedPackageRoomMsgAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.redpackage.bean.RedEnvelopeRoomMsg; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RedPackageRoomMsgAttachment extends CustomAttachment { + + private RedEnvelopeRoomMsg redEnvelopeRoomMsg; + + public RedPackageRoomMsgAttachment(int second) { + super(CUSTOM_MSG_RED_PACKAGE, second); + } + + @Override + protected void parseData(JSONObject data) { + redEnvelopeRoomMsg = new Gson().fromJson(data.toJSONString(), RedEnvelopeRoomMsg.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(redEnvelopeRoomMsg); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RedPacketAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RedPacketAttachment.java new file mode 100644 index 0000000..99c948c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RedPacketAttachment.java @@ -0,0 +1,46 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.redPacket.bean.RedPacketInfoV2; + +/** + * Created by chenran on 2017/10/4. + */ + +public class RedPacketAttachment extends CustomAttachment { + private RedPacketInfoV2 redPacketInfo; + + public RedPacketInfoV2 getRedPacketInfo() { + return redPacketInfo; + } + + public void setRedPacketInfo(RedPacketInfoV2 redPacketInfo) { + this.redPacketInfo = redPacketInfo; + } + + public RedPacketAttachment(int first, int second) { + super(first,second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + redPacketInfo = new RedPacketInfoV2(); + redPacketInfo.setType(data.getIntValue("type")); + redPacketInfo.setUid(data.getLongValue("uid")); + redPacketInfo.setNeedAlert(data.getBooleanValue("needAlert")); + redPacketInfo.setPacketNum(data.getDoubleValue("packetNum")); + redPacketInfo.setPacketName(data.getString("packetName")); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("type", redPacketInfo.getType()); + object.put("uid", redPacketInfo.getUid()); + object.put("needAlert", redPacketInfo.isNeedAlert()); + object.put("packetNum", redPacketInfo.getPacketNum()); + object.put("packetName", redPacketInfo.getPacketName()); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RequestUpmicAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RequestUpmicAttachment.java new file mode 100644 index 0000000..cca5c4a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RequestUpmicAttachment.java @@ -0,0 +1,35 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.user.bean.UserInfo; + +public class RequestUpmicAttachment extends CustomAttachment { + private UserInfo userInfo; + + public RequestUpmicAttachment(int second){ + this(CustomAttachment.ANCHOR_ROOM_AUDIENCE_UPMIC, second); + } + public RequestUpmicAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + userInfo = new Gson().fromJson(data.toJSONString(), UserInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(userInfo); + return JSONObject.parseObject(jsonStr); + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RewardBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/RewardBean.java new file mode 100644 index 0000000..487e9b8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RewardBean.java @@ -0,0 +1,50 @@ +package com.chwl.core.im.custom.bean; + +import java.io.Serializable; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class RewardBean implements Serializable { + + private String rewardId; + + private long uid; + + private String rewardMoney; + + private int servDura; + + public String getRewardId() { + return rewardId; + } + + public void setRewardId(String rewardId) { + this.rewardId = rewardId; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getRewardMoney() { + return rewardMoney; + } + + public void setRewardMoney(String rewardMoney) { + this.rewardMoney = rewardMoney; + } + + public int getServDura() { + return servDura; + } + + public void setServDura(int servDura) { + this.servDura = servDura; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumAttachment.java new file mode 100644 index 0000000..ee3d0ef --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumAttachment.java @@ -0,0 +1,22 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +import lombok.Getter; + +public class RoomAlbumAttachment extends CustomAttachment { + + @Getter + private RoomAlbumMsgInfo mRoomAlbumMsgInfo; + + public RoomAlbumAttachment() { + super(CUSTOM_MSG_ROOM_ALBUM, CUSTOM_MSG_ROOM_ALBUM_SUB); + } + + @Override + protected void parseData(JSONObject data) { + mRoomAlbumMsgInfo = new Gson().fromJson(data.toJSONString(), RoomAlbumMsgInfo.class); + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumMsgInfo.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumMsgInfo.kt new file mode 100644 index 0000000..5f8a546 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomAlbumMsgInfo.kt @@ -0,0 +1,9 @@ +package com.chwl.core.im.custom.bean + +import com.chwl.core.level.UserLevelVo + +data class RoomAlbumMsgInfo( + val roomPhoto: RoomPhoto, + val user: User, + val userLevel: UserLevelVo +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomBgChangeMsgAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomBgChangeMsgAttachment.kt new file mode 100644 index 0000000..9e93bac --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomBgChangeMsgAttachment.kt @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.RoomBgChangeBean +import com.google.gson.Gson + +class RoomBgChangeMsgAttachment (first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var bgChangeBean : RoomBgChangeBean?=null + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + bgChangeBean = Gson().fromJson( + data.toJSONString(), + RoomBgChangeBean::class.java + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeAttachment.java new file mode 100644 index 0000000..10818ab --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeAttachment.java @@ -0,0 +1,117 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.netease.nim.uikit.common.util.string.StringUtil; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +/** + * Created by chenran on 2017/10/4. + */ + +public class RoomBoxPrizeAttachment extends CustomAttachment { + private long uid; + private String prizeName; + private String nick; + private String boxTypeStr; + private long roomUid; + private int prizeNum; + private int userLevelLimit; + + public RoomBoxPrizeAttachment(int first, int second) { + super(first, second); + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getPrizeName() { + return prizeName; + } + + public void setPrizeName(String prizeName) { + this.prizeName = prizeName; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public long getRoomUid() { + return roomUid; + } + + public void setRoomUid(long roomUid) { + this.roomUid = roomUid; + } + + public int getPrizeNum() { + return prizeNum; + } + + public void setPrizeNum(int prizeNum) { + this.prizeNum = prizeNum; + } + + public String getBoxTypeStr() { + return boxTypeStr; + } + + public void setBoxTypeStr(String boxTypeStr) { + this.boxTypeStr = boxTypeStr; + } + + public int getUserLevelLimit() { + return userLevelLimit; + } + + public void setUserLevelLimit(int userLevelLimit) { + this.userLevelLimit = userLevelLimit; + } + + @Override + protected void parseData(JSONObject jsonObject) { + uid = jsonObject.getLongValue("uid"); + prizeName = jsonObject.getString("prizeName"); + nick = jsonObject.getString("nick"); + boxTypeStr = jsonObject.getString("boxTypeStr"); + roomUid = jsonObject.getLongValue("roomUid"); + prizeNum = jsonObject.getIntValue("prizeNum"); + userLevelLimit = jsonObject.getIntValue("userLevelLimit"); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + if (StringUtil.isEmpty(prizeName)) { + prizeName = ResUtil.getString(R.string.custom_bean_roomboxprizeattachment_01); + } + jsonObject.put("prizeName", prizeName); + JSONObject object = new JSONObject(); + object.put("uid", uid); + object.put("data", jsonObject); + return object; + } + + @Override + public String toString() { + return "RoomBoxPrizeAttachment{" + + "uid=" + uid + + ", prizeName='" + prizeName + '\'' + + ", nick='" + nick + '\'' + + ", roomUid=" + roomUid + + ", prizeNum=" + prizeNum + + ", first=" + first + + ", second=" + second + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeInfo.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeInfo.java new file mode 100644 index 0000000..7b43a5c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomBoxPrizeInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; + +@Data +public class RoomBoxPrizeInfo { + private long uid; + private String prizeName; + private String nick; + private String boxTypeStr; + private long roomUid; + private int prizeNum; + private int userLevelLimit; + private long partitionId; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment.java new file mode 100644 index 0000000..5e3afea --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment.java @@ -0,0 +1,42 @@ +package com.chwl.core.im.custom.bean; + +import com.chwl.core.user.bean.UserInfo; + +/** + * 聊天室弹出关注房主的提示 + */ +public class RoomFollowOwnerAttachment extends CustomAttachment { + private long ownerUid; + private UserInfo userInfo; + private boolean follow; + + + public boolean isFollow() { + return follow; + } + + public void setFollow(boolean follow) { + this.follow = follow; + } + + public long getOwnerUid() { + return ownerUid; + } + + public void setOwnerUid(long ownerUid) { + this.ownerUid = ownerUid; + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + public RoomFollowOwnerAttachment() { + super(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_ROOM_FOLLOW); + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment2.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment2.java new file mode 100644 index 0000000..5e99519 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFollowOwnerAttachment2.java @@ -0,0 +1,42 @@ +package com.chwl.core.im.custom.bean; + +import com.chwl.core.user.bean.UserInfo; + +/** + * 聊天室弹出关注房主的提示 + */ +public class RoomFollowOwnerAttachment2 extends CustomAttachment { + private long ownerUid; + private UserInfo userInfo; + private boolean follow; + + + public boolean isFollow() { + return follow; + } + + public void setFollow(boolean follow) { + this.follow = follow; + } + + public long getOwnerUid() { + return ownerUid; + } + + public void setOwnerUid(long ownerUid) { + this.ownerUid = ownerUid; + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + public RoomFollowOwnerAttachment2() { + super(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_ROOM_FOLLOW_2); + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftAttachment.java new file mode 100644 index 0000000..863aa12 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +/** + * 免费礼物 + * Created by wushaocheng on 2022/12/16. + */ +public class RoomFreeGiftAttachment extends CustomAttachment { + + private RoomFreeGiftMsgBean roomFreeGiftMsgBean; + + public RoomFreeGiftAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + roomFreeGiftMsgBean = new Gson().fromJson(data.toJSONString(), RoomFreeGiftMsgBean.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(roomFreeGiftMsgBean); + return JSONObject.parseObject(jsonStr); + } + + public RoomFreeGiftMsgBean getRoomFreeGiftMsgInfo() { + return roomFreeGiftMsgBean; + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftMsgBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftMsgBean.java new file mode 100644 index 0000000..1efa2b7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomFreeGiftMsgBean.java @@ -0,0 +1,11 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; + +@Data +public class RoomFreeGiftMsgBean { + private int giftId;//礼物id + private String giftName;//礼物名称 + private String giftUrl;//礼物icon + private long goldPrice;//礼物价格 +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomGiftValueAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomGiftValueAttachment.java new file mode 100644 index 0000000..1dcca8e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomGiftValueAttachment.java @@ -0,0 +1,46 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; + +import lombok.Getter; +import lombok.Setter; + +/** + * 房间礼物值,用于同步聊天室的礼物值 + * create by lvzebiao @2019/4/16 + */ +public class RoomGiftValueAttachment extends CustomAttachment { + + @Getter + @Setter + private RoomGiftValue roomGiftValue; + + public RoomGiftValueAttachment() { + super(CUSTOM_MSG_ROOM_GIFT_VALUE, CUSTOM_MSG_SUB_GIFT_VALUE_SYNC); + } + + @Override + protected JSONObject packData() { + try { + if (roomGiftValue != null) { + return JSON.parseObject(new Gson().toJson(roomGiftValue)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return super.packData(); + } + + @Override + protected void parseData(JSONObject data) { + try { + roomGiftValue = new Gson().fromJson(data.toJSONString(), RoomGiftValue.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomInfoAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomInfoAttachment.java new file mode 100644 index 0000000..e9a983c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomInfoAttachment.java @@ -0,0 +1,22 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.room.bean.RoomInfo; + +/** + * Created by huangmeng1 on 2018/6/7. + */ + +public class RoomInfoAttachment extends CustomAttachment { + + public RoomInfo roomInfo; + public RoomInfoAttachment(int first, int second) { + super(first, second); + } + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("roomInfo", roomInfo); + return jsonObject; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansAttachment.java new file mode 100644 index 0000000..d2007e7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansAttachment.java @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RoomInviteFansAttachment extends CustomAttachment { + + private RoomInviteFansInfo roomInviteFansInfo; + + public RoomInviteFansAttachment(int second) { + super(CUSTOM_MSG_PUSH_NOTIFIFICATION, second); + } + + @Override + protected void parseData(JSONObject data) { + roomInviteFansInfo = new Gson().fromJson(data.toJSONString(), RoomInviteFansInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(roomInviteFansInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansInfo.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansInfo.java new file mode 100644 index 0000000..cdd3ce9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomInviteFansInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.im.custom.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class RoomInviteFansInfo implements Serializable { + + private DataInfo data; + + private int skiptype; + + private String pushTitle; + + @Data + public static class DataInfo implements Serializable{ + private PayloadData data; + } + + @Data + public static class PayloadData implements Serializable{ + private long roomUid; + private String content; + } +} + diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomLevelChangeMsgAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomLevelChangeMsgAttachment.kt new file mode 100644 index 0000000..7296f4a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomLevelChangeMsgAttachment.kt @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.gift.bean.RoomLevelChangeBean +import com.google.gson.Gson + +class RoomLevelChangeMsgAttachment (first: Int, second: Int) : CustomAttachment(first, second) { + @JvmField + var mLevelChangeBean : RoomLevelChangeBean?=null + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + mLevelChangeBean = Gson().fromJson( + data.toJSONString(), + RoomLevelChangeBean::class.java + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + + override fun packData(): JSONObject { + val data = JSONObject() + return data + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaAttachment.java new file mode 100644 index 0000000..25534c9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaAttachment.java @@ -0,0 +1,37 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +/** + * 星级厨房 + * Created by wushaocheng on 2022/12/8. + */ +public class RoomLuckySeaAttachment extends CustomAttachment { + + private RoomLuckySeaMsgBean roomLuckySeaMsgBean; + + public RoomLuckySeaAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + roomLuckySeaMsgBean = new Gson().fromJson(data.toJSONString(), RoomLuckySeaMsgBean.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(roomLuckySeaMsgBean); + return JSONObject.parseObject(jsonStr); + } + + public void setRoomLuckySeaMsgBean(RoomLuckySeaMsgBean roomLuckySeaMsgBean) { + this.roomLuckySeaMsgBean = roomLuckySeaMsgBean; + } + + public RoomLuckySeaMsgBean getRoomLuckySeaMsgInfo() { + return roomLuckySeaMsgBean; + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaMsgBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaMsgBean.java new file mode 100644 index 0000000..66b82e0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomLuckySeaMsgBean.java @@ -0,0 +1,15 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; + +@Data +public class RoomLuckySeaMsgBean { + private long uid; + private String nick; + private long roomUid;//房间uid + private long itemId;//中奖选项id + private int itemMultiple;//倍数 + private long diamonds;//钻石 + private int bannerId;//bannerId + private String skipUrl;//跳转id +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomNoticeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomNoticeAttachment.java new file mode 100644 index 0000000..7c507cd --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomNoticeAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.room.bean.RoomMessageViewNoticeInfo; + +public class RoomNoticeAttachment extends RoomInfoAttachment { + + private RoomMessageViewNoticeInfo roomMessageViewNoticeInfo; + + public RoomNoticeAttachment(int first, int second) { + super(first, second); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(roomMessageViewNoticeInfo)); + } + + @Override + protected void parseData(JSONObject data) { + this.roomMessageViewNoticeInfo = new Gson().fromJson(String.valueOf(data), + RoomMessageViewNoticeInfo.class); + } + + public RoomMessageViewNoticeInfo getRoomMessageViewNoticeInfo() { + return roomMessageViewNoticeInfo; + } + + public void setRoomMessageViewNoticeInfo(RoomMessageViewNoticeInfo roomMessageViewNoticeInfo) { + this.roomMessageViewNoticeInfo = roomMessageViewNoticeInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomPKAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPKAttachment.java new file mode 100644 index 0000000..08f5ac8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPKAttachment.java @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +public class RoomPKAttachment extends CustomAttachment { + + private RoomPkBean roomPkBean; + + public RoomPKAttachment(int second) { + super(CUSTOM_MSG_ROOM_PK, second); + } + + public RoomPkBean getRoomPkBean() { + return roomPkBean; + } + + public void setRoomPkBean(RoomPkBean roomPkBean) { + this.roomPkBean = roomPkBean; + } + + @Override + protected void parseData(JSONObject data) { + roomPkBean = new Gson().fromJson(data.toJSONString(), RoomPkBean.class); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomPhoto.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPhoto.kt new file mode 100644 index 0000000..6ff5af9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPhoto.kt @@ -0,0 +1,16 @@ +package com.chwl.core.im.custom.bean + +data class RoomPhoto( + val createTime: String, + val giftId: Int, + val giftName: String, + val giftNum: Int, + val giftUrl: String, + val id: Int, + val photoUrl: String, + val roomUid: Int, + val status: Int, + val totalGoldPrice: Int, + val type: Int, + val uid: Int +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomPicScreenMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPicScreenMsgAttachment.java new file mode 100644 index 0000000..2a6792a --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPicScreenMsgAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.RoomPicScreenBean; +import com.chwl.core.redpackage.bean.RedPackageLuckyBag; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RoomPicScreenMsgAttachment extends CustomAttachment { + + public RoomPicScreenBean roomPicScreenBean; + + public RoomPicScreenMsgAttachment() { + super(ROOM_PIC_SCREEN_FIRST, ROOM_PIC_SCREEN_SECOND); + } + + @Override + protected void parseData(JSONObject data) { + roomPicScreenBean = new Gson().fromJson(data.toJSONString(), RoomPicScreenBean.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(roomPicScreenBean); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomPkBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPkBean.java new file mode 100644 index 0000000..114433c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomPkBean.java @@ -0,0 +1,142 @@ +package com.chwl.core.im.custom.bean; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class RoomPkBean implements Serializable { + /** + * PK时长 + **/ + private long pkDuration; + /** + * 邀请房间标题 + **/ + private String inviteRoomTitle; + /** + * 邀请人昵称 + **/ + private String inviteNick; + /** + * 邀请房间uid + **/ + private long inviteUid; + /** + * PK玩法 + **/ + private String pkDesc; + + /** + * PK轮次Id + **/ + private String roundId; + + /** + * 是否初始化 + */ + private boolean isInit; + /** + * 是否提前/强制结束 + */ + private boolean isForce; + /** + * 倒计时开始时间点:时间戳 + */ + private long endTime; + + /** + * 胜利方房主uid + */ + private long winUid; + //房间总流水 + private long allAmount; + + //当前方房主uid + private long cUid; + //当前方房主roomId + private long cRoomId; + //当前方房主头像 + private String cAvatar; + //当前方房间名称 + private String cTitle; + //当前方房主昵称 + private String cNick; + //当前方流水 + private long cAmount; + //比例:0-100,当前方进度条比率 + private float cPercent; + //当前神豪榜前三 + private List csRank; + //当前魅力榜前三 + private List crRank; + + //另一方方房主uid + private long aUid; + //另一方方房主roomId + private long aRoomId; + //另一方房主头像 + private String aAvatar; + //另一方房间名称 + private String aTitle; + //另一方房主昵称 + private String aNick; + //另一方流水 + private long aAmount; + //比例:0-100,另一方进度条比率 + private String aPercent; + //另一方神豪榜前三 + private List asRank; + //另一方魅力榜前三 + private List arRank; + + //<-------------个播PK新增start---------------> + //pk进行状态(1:pk中 2:惩罚中) + private int pkState; + //惩罚时间结束时间戳 + private Long penaltyEndTime; + //<-------------个播PK新增end---------------> + + /** + * 通知相关字段 + */ + private String msg; + private String failAvatar; + private String winAvatar; + private String failUid; + private String failTitle; + private String winTitle; + private String winNick; + private String failNick; + + /** + * PK预约字段 + */ + private long beginTime; + // 0:屏蔽 1:开启 + /** + * 个播PK匹配新增字段 + */ + @SerializedName(value = "aMicStatus", alternate = "amicStatus") + private int aMicStatus; + + @Data + public static class RankBean implements Serializable { + //uid + private long uid; + //昵称 + private String nick; + //头像 + private String avatar; + //性别 + private int gender; + //贡献值/魅力值 + private String amount; + } + +} + + diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomRankAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomRankAttachment.java new file mode 100644 index 0000000..d4a184d --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomRankAttachment.java @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +public class RoomRankAttachment extends CustomAttachment { + + private RoomRankMsgBean msgBean; + + public RoomRankAttachment(int second) { + super(CUSTOM_MSG_ROOM_RANK, second); + } + + public RoomRankMsgBean getMsgBean() { + return msgBean; + } + + public void setMsgBean(RoomRankMsgBean msgBean) { + this.msgBean = msgBean; + } + + @Override + protected void parseData(JSONObject data) { + msgBean = new Gson().fromJson(data.toJSONString(), RoomRankMsgBean.class); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomRankMsgBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomRankMsgBean.java new file mode 100644 index 0000000..702b0f3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomRankMsgBean.java @@ -0,0 +1,11 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; + +@Data +public class RoomRankMsgBean { + private long uid; + private String title; + private String avatar; + private String desc; +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomReceivedLuckyGiftAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomReceivedLuckyGiftAttachment.java new file mode 100644 index 0000000..ded461e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomReceivedLuckyGiftAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.gift.bean.LuckyBagNoticeInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RoomReceivedLuckyGiftAttachment extends CustomAttachment { + + private LuckyBagNoticeInfo luckyBagNoticeInfo; + + public RoomReceivedLuckyGiftAttachment(int second) { + super(CUSTOM_MSG_LUCKY_GIFT, second); + } + + @Override + protected void parseData(JSONObject data) { + luckyBagNoticeInfo = new Gson().fromJson(data.toJSONString(), LuckyBagNoticeInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(luckyBagNoticeInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomSerialValueChangedAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomSerialValueChangedAttachment.kt new file mode 100644 index 0000000..30e41d1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomSerialValueChangedAttachment.kt @@ -0,0 +1,22 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import com.alibaba.fastjson2.JSONObject +import com.chwl.core.bean.game.GameRoomInfo +import com.chwl.library.utils.json.JsonUtils +import com.google.gson.Gson + +@Keep +class RoomSerialValueChangedAttachment : CustomAttachment { + + var serialValue: Double? = null + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + override fun parseData(data: JSONObject?) { + if (data?.contains("serialValue") == true) { + serialValue = data.getDoubleValue("serialValue") + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyAttachment.kt new file mode 100644 index 0000000..80db3fe --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyAttachment.kt @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean + +import com.alibaba.fastjson2.JSONObject +import com.google.gson.Gson + + +class RoomTemplateNotifyAttachment : CustomAttachment { + var msgBean: RoomTemplateNotifyMsgBean? = null + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + public override fun parseData(data: JSONObject?) { + super.parseData(data) + try { + msgBean = Gson().fromJson( + data!!.toJSONString(), + RoomTemplateNotifyMsgBean::class.java + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun packData(): JSONObject? { + val jsonStr = Gson().toJson(msgBean) + return JSONObject.parseObject(jsonStr) + } + + fun getTemplateMsg() = msgBean + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyMsgBean.kt b/core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyMsgBean.kt new file mode 100644 index 0000000..894f10f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomTemplateNotifyMsgBean.kt @@ -0,0 +1,37 @@ +package com.chwl.core.im.custom.bean + +class RoomTemplateNotifyMsgBean : TemplateMessage() { + companion object { + const val TYPE_SVGA = "SVGA" + const val TYPE_IMAGE = "IMAGE" + } + var fontSize: Int? = null + + // IMAGE、SVGA + var resourceType: String? = null + var resourceContent: String? = null + var skipType: Int? = null + var skipContent: String? = null + @Deprecated("已不需要,自己可以获取到") + var resourceWidth: Int? = null + @Deprecated("已不需要,自己可以获取到") + var resourceHeight: Int? = null + + // SVGA-文本的坑位KEY + private var svgaTextKey: String? = null + + val partitionId: Long? = null + val uidList: List? = null + val roomUid: Long? = null + + fun getSvgaTextKey(): String { + return svgaTextKey ?: "noble_text_tx" + } + + fun getDimensionRatio(): String? { + if (resourceWidth != null && resourceHeight != null) { + return "$resourceWidth:$resourceHeight" + } + return null + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomTipAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomTipAttachment.java new file mode 100644 index 0000000..91ebd13 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomTipAttachment.java @@ -0,0 +1,78 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.netease.nim.uikit.common.util.string.StringUtil; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +/** + * Created by chenran on 2017/10/4. + */ + +public class RoomTipAttachment extends CustomAttachment { + private long uid; + private String nick; + private long targetUid; + private String targetNick; + + public RoomTipAttachment(int first, int second) { + super(first, second); + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public long getTargetUid() { + return targetUid; + } + + public void setTargetUid(long targetUid) { + this.targetUid = targetUid; + } + + public String getTargetNick() { + return targetNick; + } + + public void setTargetNick(String targetNick) { + this.targetNick = targetNick; + } + + @Override + protected void parseData(JSONObject data) { + uid = data.getLong("uid"); + JSONObject jsonObject = data.getJSONObject("data"); + nick = jsonObject.getString("nick"); + targetUid = jsonObject.getLongValue("targetUid"); + targetNick = jsonObject.getString("targetNick"); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("nick", nick); + jsonObject.put("targetUid", targetUid); + + if (StringUtil.isEmpty(targetNick)) { + targetNick = ResUtil.getString(R.string.custom_bean_roomtipattachment_01); + } + jsonObject.put("targetNick", targetNick); + JSONObject object = new JSONObject(); + object.put("uid", uid); + object.put("data", jsonObject); + return object; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RoomUserEnterRoomMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/RoomUserEnterRoomMsgAttachment.java new file mode 100644 index 0000000..20cca67 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RoomUserEnterRoomMsgAttachment.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.gift.bean.RoomUserEnterRoomBean; +import com.google.gson.Gson; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class RoomUserEnterRoomMsgAttachment extends CustomAttachment { + + public RoomUserEnterRoomBean userEnterRoomBean; + + public RoomUserEnterRoomMsgAttachment() { + super(ROOM_PIC_SCREEN_FIRST, ROOM_MSG_USER_ENTER_ROOM); + } + + @Override + protected void parseData(JSONObject data) { + userEnterRoomBean = new Gson().fromJson(data.toJSONString(), RoomUserEnterRoomBean.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(userEnterRoomBean); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java b/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java new file mode 100644 index 0000000..0620c7e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java @@ -0,0 +1,244 @@ +package com.chwl.core.im.custom.bean; + +/** + * Created by MadisonRong on 08/06/2018. + * MeFragment跳转type + */ + +public class RouterType { + /** + * 1-房间页 传参:uid; + */ + public static final int ROOM = 1; + + /** + * 2-H5; + */ + public static final int H5 = 2; + + /** + * 5-充值页; + */ + public static final int RECHARGE = 5; + + /** + * 6-个人页 传参:uid; + */ + public static final int PERSON = 6; + + /** + * 7-座驾 传参:0(装扮商城) 或者 1(车库); + */ + public static final int CAR = 7; + + /** + * 8-头饰 传参:0(装扮商城) 或者 1(头饰库) + */ + public static final int DECORATION = 8; + + /** + * 9-铭牌 传参:0(装扮商城) 或者 1(铭牌库) + */ + public static final int NAMEPLATE = 9; + + /** + * 55-资料卡装扮 + */ + public static final int USER_CARD_WEAR = 55; + + /** + * 10-家族 传参:家族 id(FamilyId) 跳转到家族客态页; + */ + public static final int FAMILY = 10; + + /** + * 11-群组 传参: 云信群组 id(TeamId) 跳转到群聊界面; + */ + public static final int TEAM = 11; + + /** + * 公聊大厅 + */ + public static final int PUBLIC_CHAT_HALL = 15; + + /** + * 绑定手机号 + */ + public static final int BINDING_PHONE = 17; + + /** + * 设置支付密码 + */ + public static final int SETTING_PAY_PWD = 18; + + /** + * 我的推荐位 + */ + public static final int MY_RECOMMEND = 20; + + /** + * 跳转模厅首页 + */ + public static final int MODULE_HALL_HOME = 22; + + /** + * 签到 + */ + public static final int SIGN_IN = 26; + + /** + * 做任务 + */ + public static final int DO_TASK = 27; + + /** + * 师徒关系首页 + */ + public static final int MENTORING_RELATIONSHIP_HOME = 28; + + /** + * 去游戏列表 + */ + public static final int GAME_LIST = 29; + + public static final int PERSION_SETTING = 30; + + /** + * 声音匹配首页 + */ + public static final int VOICE_BOTTLE_PAGE = 42; + /** + * 异性匹配 + */ + public static final int OPPOSITE_SEX_MATCHING = 43; + + /** + * 城市匹配 + */ + public static final int CITY_MATCHING = 45; + /** + * 游戏匹配 + */ + public static final int GAME_MATCHING = 46; + + /** + * 话题客态页 + */ + public static final int MINI_WORLD_DETAIL = 49; + /** + * 发布动态 + */ + public static final int SQUARE_PUBLISH = 51; + /** + * APP内的反馈 + */ + public static final int FEED_BACK = 52; + + /** + * 设置密码 + */ + public static final int SET_PASSWORD = 53; + + /** + * 设置密码 + */ + public static final int VIP_MAIN = 54; + + /** + * Cp邀请 + */ + public static final int CP_INVITE = 61; + + /** + * Cp关系任务 + */ + + public static final int CP_TASK = 62; + + /** + * Cp头饰 + */ + + public static final int CP_WARE = 63; + + + /** + * 65-资料卡装扮 + */ + public static final int USER_BUBBLE = 56; + + /** + * 64我的房间 + */ + public static final int MY_ROOM = 64; + + /** + * 66-收藏的房间 + */ + public static final int COLLECTION_ROOM = 65; + /** + * 67-我的公会 + */ + public static final int MODULE_CLAN = 67; + /** + * 70-访客记录 + */ + public static final int VISITOR_LIST = 70; + + /** + * 71-CP主页 + */ + public static final int CP_HOME = 71; + + /** + * 72-粉丝团列表 + */ + public static final int FANS_TEAM_LIST = 72; + + /** + * 73-装扮商城 + */ + public static final int DECORATION_STORE = 73; + + /** + * 74-我的装扮 + */ + public static final int MY_DECORATION = 74; + + /** + * 75-设置 + */ + public static final int MY_SET = 75; + + /** + * 76-切换分区 + */ + public static final int SWITCH_REGION= 76; + + /** + * 77-我的转赠 + */ + public static final int MY_DONATION = 77; + + /** + * 78-点单记录 + */ + public static final int GAME_TEAM_RECORD = 78; + + /** + * 79-我的装扮 + */ + public static final int MY_DRESS_ITEM = 79; + + /** + * 80-我的装扮 + */ + public static final int MY_GUILD = 80; + + + + /** + * 收益记录(目前只是本地用到,所以用了100000) + */ + public static final int MY_REVENUE = 100000; +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankAttachment.java new file mode 100644 index 0000000..7d2c009 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankAttachment.java @@ -0,0 +1,31 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; + +public class SingleRoomRankAttachment extends CustomAttachment { + + private SingleRoomRankMsgBean msgBean; + + public SingleRoomRankAttachment(int second) { + super(CUSTOM_MSG_SINGLE_ROOM_RANK, second); + } + + public SingleRoomRankMsgBean getMsgBean() { + return msgBean; + } + + public void setMsgBean(SingleRoomRankMsgBean msgBean) { + this.msgBean = msgBean; + } + + @Override + protected void parseData(JSONObject data) { + msgBean = new Gson().fromJson(data.toJSONString(), SingleRoomRankMsgBean.class); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankMsgBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankMsgBean.java new file mode 100644 index 0000000..0351beb --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/SingleRoomRankMsgBean.java @@ -0,0 +1,11 @@ +package com.chwl.core.im.custom.bean; + +import lombok.Data; + +@Data +public class SingleRoomRankMsgBean { + private long uid; + private String nick; + private String avatar; + private String desc; +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/SkillMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/SkillMsgAttachment.java new file mode 100644 index 0000000..31499a7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/SkillMsgAttachment.java @@ -0,0 +1,42 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.skill.entity.SkillNotifyEntity; + +public class SkillMsgAttachment extends CustomAttachment { + private SkillNotifyEntity entity; + + @Override + protected void parseData(JSONObject data) { + //不服不行 + if (data != null) { + String json = data.toJSONString(); + if (json.contains("\\")) { + json = json.replace("\\", ""); + if (json.contains("\"{")) { + json = json.replace("\"{", "{"); + } + if (json.contains("}\"")) { + json = json.replace("}\"", "}"); + } + } + entity = new Gson().fromJson(json, SkillNotifyEntity.class); + } + } + + public SkillMsgAttachment(int second) { + super(SKILL_MSG_AUDIO, second); + } + + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(entity); + return JSONObject.parseObject(jsonStr); + } + + public SkillNotifyEntity getEntity() { + return entity; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgAttachment.java new file mode 100644 index 0000000..93cb5a2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgAttachment.java @@ -0,0 +1,36 @@ +package com.chwl.core.im.custom.bean; + +import androidx.annotation.Keep; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 17/06/2018. + */ +@Keep +@EqualsAndHashCode(callSuper = true) +@Data +public class SysMsgAttachment extends CustomAttachment { + + private ErbanSysMsgInfo erbanSysMsgInfo; + + public SysMsgAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + erbanSysMsgInfo = new Gson().fromJson(data.toJSONString(), ErbanSysMsgInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(erbanSysMsgInfo); + return JSONObject.parseObject(jsonStr); + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgV2Attachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgV2Attachment.java new file mode 100644 index 0000000..b1fefdf --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgV2Attachment.java @@ -0,0 +1,43 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.msg.sysv2.bean.ErbanSysMsgV2Info; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by lvzebiao on 2020/3/28. + */ +public class SysMsgV2Attachment extends CustomAttachment{ + + @Getter + @Setter + private ErbanSysMsgV2Info erbanSysMsgV2Info; + + public SysMsgV2Attachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + try { + erbanSysMsgV2Info = new Gson().fromJson(data.toJSONString(), ErbanSysMsgV2Info.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + protected JSONObject packData() { + try { + String jsonStr = new Gson().toJson(erbanSysMsgV2Info); + return JSONObject.parseObject(jsonStr); + } catch (Exception ex) { + ex.printStackTrace(); + } + return new JSONObject(); + } + +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgVoiceAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgVoiceAttachment.java new file mode 100644 index 0000000..22e8776 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/SysMsgVoiceAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.im.custom.bean; + + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.audio.bean.SysMsgVoiceInfo; + +/** + * 声音瓶子审核结果的系统通知 + */ +public class SysMsgVoiceAttachment extends CustomAttachment { + + private SysMsgVoiceInfo voiceInfo; + + public SysMsgVoiceAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + voiceInfo = new Gson().fromJson(data.toJSONString(), SysMsgVoiceInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(voiceInfo)); + } + + public SysMsgVoiceInfo getVoiceInfo() { + return voiceInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/TarotAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/TarotAttachment.java new file mode 100644 index 0000000..49c56c3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/TarotAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.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()); + jsonObject.put("drawMsgText", tarotMsgBean.getDrawMsgText()); + return jsonObject; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/TarotMsgBean.java b/core/src/main/java/com/chwl/core/im/custom/bean/TarotMsgBean.java new file mode 100644 index 0000000..25f0d21 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/TarotMsgBean.java @@ -0,0 +1,34 @@ +package com.chwl.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; + + /** 中奖的房间消息文本 **/ + private String drawMsgText; +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessage.kt b/core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessage.kt new file mode 100644 index 0000000..fe4199c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessage.kt @@ -0,0 +1,130 @@ +package com.chwl.core.im.custom.bean + +import androidx.annotation.Keep +import com.chwl.core.bean.I18N +import com.chwl.core.bean.IRouterData +import com.example.lib_utils.StringUtils2 +import java.io.Serializable +import java.util.regex.Pattern + +//xxx 充当 幸运礼物公屏 data +open class TemplateMessage : Serializable { + + var template: I18N? = null + var textColor: String? = null + var contents: List? = null + + private val nodeList: List? = null + + fun getNodeList(): List { + var nodeList = this.nodeList + if (nodeList == null) { + nodeList = parseNodes() + } + return nodeList + } + + // 转化为方便渲染的节点列表 + private fun parseNodes(): List { + val templateText = template?.getFirstText() + val contentList = this.contents + val defTextColor = this.textColor + if (templateText.isNullOrEmpty()) { + return emptyList() + } + if (contentList.isNullOrEmpty()) { + return listOf( + TemplateNode.NormalNode( + text = templateText, + textColor = defTextColor + ) + ) + } + val list = ArrayList() + StringUtils2.split( + content = templateText, + pattern = Pattern.compile("\\{.+?\\}"), + onNormalNode = { + list.add( + TemplateNode.NormalNode( + text = it, + textColor = defTextColor + ) + ) + }, + onMatchNode = { text -> + val content = contentList.firstOrNull { + "{${it.key}}" == text + } + if (content?.type == Content.TEXT && content.textColor.isNullOrEmpty()) { + // 默认文本色 + content.textColor = textColor + } + if (content != null) { + list.add( + TemplateNode.SpecialNode( + content = content + ) + ) + } + }) + return list + } + + @Keep + class Content : Serializable, IRouterData { + /** + * 公共字段 + */ + val key: String? = null + // TEXT,IMAGE + val type: String? = null + val skipType: Int? = null + val skipContent: String? = null + + /** + * 文本相关字段(type=TEXT) + */ + val text: I18N? = null + var textColor: String? = null + + /** + * 图片相关字段(type=IMAGE) + */ + val image: String? = null + val width: Int? = null + val height: Int? = null + + override fun getSkipType(): Int { + return skipType ?: 0 + } + + override fun getRouterType(): String? { + return null + } + + override fun getRouterValue(): String? { + return null + } + + override fun getSkipUri(): String? { + return skipContent + } + + companion object { + const val TEXT = "TEXT" + const val IMAGE = "IMAGE" + } + } + + interface TemplateNode : Serializable { + data class NormalNode( + var text: String, + var textColor: String? = null + ) : TemplateNode + + data class SpecialNode( + var content: Content + ) : TemplateNode + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessageAttachment.kt b/core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessageAttachment.kt new file mode 100644 index 0000000..74630ce --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/TemplateMessageAttachment.kt @@ -0,0 +1,28 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject +import com.google.gson.Gson + +class TemplateMessageAttachment : CustomAttachment { + + constructor() : super() + constructor(first: Int, second: Int) : super(first, second) + + private var templateMessage: TemplateMessage? = null + + fun getTemplateMessage() = templateMessage + + override fun parseData(data: JSONObject?) { + super.parseData(data) + if (data != null) { + try { + templateMessage = Gson().fromJson( + data.toJSONString(), + TemplateMessage::class.java + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/User.kt b/core/src/main/java/com/chwl/core/im/custom/bean/User.kt new file mode 100644 index 0000000..a4ea547 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/User.kt @@ -0,0 +1,33 @@ +package com.chwl.core.im.custom.bean + +data class User( + val avatar: String, + val birth: String, + val certifyModifyTimes: Int, + val channel: String, + val channelType: Int, + val createTime: String, + val currentApp: String, + val defUser: Int, + val deviceId: String, + val erbanNo: Int, + val fansNum: Int, + val followNum: Int, + val gender: Int, + val hasPrettyErbanNo: Boolean, + val lastLoginIp: String, + val lastLoginRegion: String, + val lastLoginTime: String, + val newDevice: Boolean, + val nick: String, + val nobleId: Int, + val os: String, + val osversion: String, + val parentMode: Boolean, + val phone: String, + val phoneAreaCode: String, + val platformRole: Int, + val uid: Long, + val updateTime: String, + val useStatus: Int +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/VipMessageAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/VipMessageAttachment.java new file mode 100644 index 0000000..0f2e2f4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/VipMessageAttachment.java @@ -0,0 +1,32 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.vip.bean.VipMessageInfo; + +public class VipMessageAttachment extends CustomAttachment { + + private VipMessageInfo vipMessageInfo; + + public VipMessageAttachment(int second) { + super(CUSTOM_MSG_VIP, second); + } + + public VipMessageInfo getVipMessageInfo() { + return vipMessageInfo; + } + + public void setVipMessageInfo(VipMessageInfo vipMessageInfo) { + this.vipMessageInfo = vipMessageInfo; + } + + @Override + protected void parseData(JSONObject data) { + vipMessageInfo = new Gson().fromJson(data.toJSONString(), VipMessageInfo.class); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleSayHiAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleSayHiAttachment.java new file mode 100644 index 0000000..65904f3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleSayHiAttachment.java @@ -0,0 +1,39 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.audio.bean.VoiceBottleSayHiInfo; + +/** + * 声音瓶子打招呼提示信息 + */ +public class VoiceBottleSayHiAttachment extends CustomAttachment { + + public static final String KEY_VOICE_BOTTLE_HAVE_SAY_HI = "key_voice_bottle_have_say_hi"; + + private VoiceBottleSayHiInfo sayHiInfo; + + VoiceBottleSayHiAttachment(int first, int second) { + super(first, second); + } + + public VoiceBottleSayHiAttachment() { + super(CustomAttachment.CUSTOM_MSG_VOICE_BOTTLE_HEAD, CustomAttachment.CUSTOM_MSG_VOICE_BOTTLE_SUB_HELLO); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + sayHiInfo = new Gson().fromJson(data.toJSONString(), VoiceBottleSayHiInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(sayHiInfo)); + } + + public VoiceBottleSayHiInfo getSayHiInfo() { + return sayHiInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleShakeHeartAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleShakeHeartAttachment.java new file mode 100644 index 0000000..f1f765e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/VoiceBottleShakeHeartAttachment.java @@ -0,0 +1,40 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.audio.bean.VoiceBottleSayHiInfo; + +/** + * 声音瓶子点击打招呼:发送爱心动画 + 发送固定文本信息 + */ +public class VoiceBottleShakeHeartAttachment extends CustomAttachment { + + public static final String KEY_VOICE_BOTTLE_NEED_SHAKE_HEART = "key_voice_bottle_need_shake_heart"; + + private VoiceBottleSayHiInfo sayHiInfo; + + VoiceBottleShakeHeartAttachment(int first, int second) { + super(first, second); + } + + public VoiceBottleShakeHeartAttachment(VoiceBottleSayHiInfo sayHiInfo) { + super(CustomAttachment.CUSTOM_MSG_VOICE_BOTTLE_HEAD, CustomAttachment.CUSTOM_MSG_VOICE_BOTTLE_SUB_HEART); + this.sayHiInfo = sayHiInfo; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + sayHiInfo = new Gson().fromJson(data.toJSONString(), VoiceBottleSayHiInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(sayHiInfo)); + } + + public VoiceBottleSayHiInfo getSayHiInfo() { + return sayHiInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/WelcomeAttachment.java b/core/src/main/java/com/chwl/core/im/custom/bean/WelcomeAttachment.java new file mode 100644 index 0000000..c582557 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/custom/bean/WelcomeAttachment.java @@ -0,0 +1,56 @@ +package com.chwl.core.im.custom.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.room.bean.WelcomeInfo; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by lvzebiao on 2020/3/17. + */ +public class WelcomeAttachment extends CustomAttachment { + + @Getter + @Setter + private WelcomeInfo welcomeInfo; + + public WelcomeAttachment() { + super(CUSTOM_MSG_HEADER_TYPE_PUBLIC_SCREEN, + CUSTOM_MSG_SUB_TYPE_PUBLIC_SCREEN_WELCOME); + } + + @Override + protected void parseData(JSONObject data) { + try { + welcomeInfo = new Gson().fromJson(data.toJSONString(), WelcomeInfo.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + protected JSONObject packData() { + try { + if (welcomeInfo != null) { + return JSONObject.parseObject(new Gson().toJson(welcomeInfo)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return new JSONObject(); + } + + /** + * 判断下这条消息,对当前用户来说,需不需要添加到公屏 + * + * @return - + */ + public boolean isNeedAddToMsg() { + return welcomeInfo != null && welcomeInfo.getTargetUid() > 0 + && welcomeInfo.getTargetUid() == AuthModel.get().getCurrentUid(); + } + +} diff --git a/core/src/main/java/com/chwl/core/im/friend/IIMFriendCore.java b/core/src/main/java/com/chwl/core/im/friend/IIMFriendCore.java new file mode 100644 index 0000000..ce135a4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/friend/IIMFriendCore.java @@ -0,0 +1,112 @@ +package com.chwl.core.im.friend; + +import com.netease.nimlib.sdk.friend.constant.FriendFieldEnum; +import com.chwl.library.coremanager.IBaseCore; + +import java.util.List; +import java.util.Map; + +/** + * Created by chenran on 2017/2/16. + */ + +public interface IIMFriendCore extends IBaseCore { + + /** + * 获取我的好友列表 + * List + */ + void getMyFriends(); + + /** + * 获取我的黑名单列表 + * + * @return + */ + List getBlackList(); + + /** + * 获取禁言列表 + * + * @return + */ + List getMuteList(); + + /** + * 通过对方的好友请求 + * + * @param account + * @param isPass + */ + void passRequestFriend(String account, boolean isPass); + + /** + * 是否是好友 + * + * @param uid + * @return + */ + boolean isMyFriend(String uid); + + /** + * 添加好友 + * + * @param uid + * @param tip + */ + void addFriend(String uid, String tip); + + /** + * 删除好友 + * + * @param uid + */ + void deleteFriend(String uid); + + /** + * 请求加为好友 + * + * @param uid + */ + void requestFriend(String uid); + + /** + * 添加黑名单 + * + * @param uid + */ + void addToBlackList(String uid); + + /** + * 移出黑名单 + * + * @param uid + */ + void removeFromBlackList(String uid); + + /** + * 用户是否在黑名单中 + * + * @param uid + */ + boolean isUserInBlackList(String uid); + + /** + * 更新我的好友 + * 更新好友关系 + * 目前支持更新好友的备注名和好友关系扩展字段,见 @FriendFieldEnum + *

+ * 注意:备注名最长128个字符;扩展字段需要传入 Map, SDK 会负责转成Json String,最大长度256字符。 + */ + void updateFriendFields(String tempnick, Map map); + + /** + * 设置指定好友的消息提醒与否 + * 网易云通信支持对用户设置或关闭消息提醒(静音),关闭后,收到该用户发来的消息时,不再进行通知栏消息提醒。个人用户的消息提醒设置支持漫游。 + * 设置/关闭消息提醒 + */ + void setMessageNotify(String account, boolean checkState); + + boolean isNeedMessageNotify(String account); +} + diff --git a/core/src/main/java/com/chwl/core/im/friend/IMFriendModel.java b/core/src/main/java/com/chwl/core/im/friend/IMFriendModel.java new file mode 100644 index 0000000..2936465 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/friend/IMFriendModel.java @@ -0,0 +1,190 @@ +package com.chwl.core.im.friend; + +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.friend.FriendService; +import com.netease.nimlib.sdk.friend.FriendServiceObserve; +import com.netease.nimlib.sdk.friend.model.FriendChangedNotify; +import com.chwl.core.R; +import com.chwl.core.bean.response.result.UserListResult; +import com.chwl.core.manager.BaseMvpModel; +import com.chwl.core.manager.IMMessageManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RelationShipEvent; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.BiConsumer; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * Created by yudi + * on 2018/3/12. + */ + +public class IMFriendModel extends BaseMvpModel { + private static IMFriendModel model; + private Api api = RxNet.create(Api.class); + public static IMFriendModel get() { + if (model == null) { + synchronized (IMFriendModel.class) { + if (model == null) { + model = new IMFriendModel(); + } + } + } + return model; + } + + /** + * 缓存所有关闭过提示的非好友用户 + */ + private List tipsList = new ArrayList<>(); + + private IMFriendModel() { + NIMClient.getService(FriendServiceObserve.class) + .observeFriendChangedNotify((Observer) friendChangedNotify -> { + List deletedFriends = friendChangedNotify.getDeletedFriends(); + // 如果已经删除好友,最近联系人那里也要被删除调 + if (deletedFriends != null && deletedFriends.size() > 0) { + for (int i = 0; i < deletedFriends.size(); i++) { + IMMessageManager.get().deleteRecentContact(deletedFriends.get(i)); + } + } + // 通知页面更新朋友的数量 + IMNetEaseManager.get().getRelationShipEventObservable() + .onNext(new RelationShipEvent() + .setEvent(RelationShipEvent.EVENT_FRIEND_UPDATE) + .setAccounts(getMyFriendsAccounts())); + }, true); + + + } + + /** + * 获取我所有好友的列表 + * List + */ + public Single> getAllMyFriendsUserInfos() { + if (getMyFriendsAccounts().size() < 1){ + return Single.error(new Throwable(ResUtil.getString(R.string.im_friend_imfriendmodel_01))); + } + return getMyFriendsUserInfos(1, getMyFriendsAccounts().size()); + } + + /** + * 分页获取朋友信息列表.减少服务器负担 + * @param page + * @param pageSize + * @return + */ + public Single> getMyFriendsUserInfos(int page, int pageSize) { + if (page < 1){ + throw new IllegalArgumentException(ResUtil.getString(R.string.im_friend_imfriendmodel_02)); + } + if (pageSize < 1){ + throw new IllegalArgumentException(ResUtil.getString(R.string.im_friend_imfriendmodel_03)); + } + return Single.create((SingleOnSubscribe>) e -> { + List friendsAccounts = getMyFriendsAccounts(); + if (friendsAccounts.size() < 1){ + e.onSuccess(new ArrayList()); + return; + } + int fromIndex = (page - 1) * pageSize; + int toIndex = page * pageSize; + + if (fromIndex > (friendsAccounts.size() - 1)){ + e.onSuccess(new ArrayList()); + return; + } + if (toIndex > friendsAccounts.size()){ + toIndex = friendsAccounts.size(); + } + List subFriendAccounts = friendsAccounts.subList(fromIndex, toIndex); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < subFriendAccounts.size() ; i++) { + sb.append(subFriendAccounts.get(i)); + if (i < subFriendAccounts.size() - 1) { + sb.append(","); + } + } + api.getUserInfoListByUids(sb.toString()).subscribe(new BiConsumer() { + @Override + public void accept(UserListResult response, Throwable throwable) throws Exception { + if (throwable != null){ + e.onError(throwable); + return; + } + if (response.isSuccess()) { + e.onSuccess(response.getData()); + }else { + e.onError(new Throwable(response.getMessage())); + } + } + }); + + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + /** + * 获取我所有好友的账号 + * List + */ + public List getMyFriendsAccounts() { + return NIMClient.getService(FriendService.class).getFriendAccounts(); + } + + /** + * 是否是我的好友 + * + * @param uid - + * @return - + */ + public boolean isMyFriend(String uid) { + return NIMClient.getService(FriendService.class).isMyFriend(uid); + } + + public List getTipsList() { + return tipsList; + } + + /** + * 判断指定用户是否已经关闭过提示 + * @param account + * @return + */ + public boolean hasCloseTips(String account) { + return tipsList.contains(account); + } + + /** + * 缓存用户到列表中 + * @param account + * @return + */ + public boolean addCloseTipsAccount(String account) { + return tipsList.add(account); + } + + private interface Api { + /** + * 根据uids 去获取具体的userInfo + * @param uids + * @return + */ + @GET("/user/list") + Single getUserInfoListByUids(@Query("uids") String uids); + } +} diff --git a/core/src/main/java/com/chwl/core/im/login/IIMLoginClient.java b/core/src/main/java/com/chwl/core/im/login/IIMLoginClient.java new file mode 100644 index 0000000..6469ebe --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/login/IIMLoginClient.java @@ -0,0 +1,33 @@ +package com.chwl.core.im.login; + +import com.netease.nimlib.sdk.StatusCode; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.nimlib.sdk.auth.OnlineClient; + +/** + * Created by chenran on 2017/2/16. + */ + +public interface IIMLoginClient { + public static final String METHOD_ON_IM_LOGIN_SUCCESS = "onImLoginSuccess" ; + public static final String METHOD_ON_IM_SYNC_SUCCESS = "onImSyncSuccess" ; + public static final String METHOD_ON_IM_LOGIN_FAITH = "onImLoginFaith" ; + public static final String METHOD_ON_KICK_OTHER = "onKickOther" ; + public static final String METHOD_ON_KICKED_OUT = "onKickedOut"; + + void onImLoginSuccess(LoginInfo loginInfo); + + void onImLoginFaith(String error); + + void onImSyncSuccess(); + + /** + * 踢出其他端 + */ + void onKickOther(OnlineClient onlineClient); + + /** + * 被踢出 + */ + void onKickedOut(StatusCode code); +} diff --git a/core/src/main/java/com/chwl/core/im/login/IIMLoginCore.java b/core/src/main/java/com/chwl/core/im/login/IIMLoginCore.java new file mode 100644 index 0000000..717275b --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/login/IIMLoginCore.java @@ -0,0 +1,34 @@ +package com.chwl.core.im.login; + +import com.netease.nimlib.sdk.auth.OnlineClient; +import com.chwl.core.base.IModel; + +/** + * Created by chenran on 2017/2/16. + */ + +public interface IIMLoginCore extends IModel { + + /** + * 登录Im + * @param account + * @param token + */ + void login(String account, String token); + + void logout(); + + boolean isImLogin(); + + void kickOtherClient(OnlineClient onlineClient); + + /** + * 注册其他端登录事件 + */ + void registerOtherClientsObserver(boolean isRegister); + + /** + * 注册AuthService观察者,监听回调 + */ + void registAuthServiceObserver(boolean isRegister); +} diff --git a/core/src/main/java/com/chwl/core/im/notification/INotificationCore.java b/core/src/main/java/com/chwl/core/im/notification/INotificationCore.java new file mode 100644 index 0000000..40e7ea4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/notification/INotificationCore.java @@ -0,0 +1,16 @@ +package com.chwl.core.im.notification; + +import com.netease.nimlib.sdk.msg.model.CustomNotification; +import com.chwl.library.coremanager.IBaseCore; + +/** + * Created by zhouxiangfeng on 2017/6/19. + */ + +public interface INotificationCore extends IBaseCore { + + void sendCustomNotification(CustomNotification notification); + + void observeCustomNotification(boolean register); + +} diff --git a/core/src/main/java/com/chwl/core/im/notification/INotificationCoreClient.java b/core/src/main/java/com/chwl/core/im/notification/INotificationCoreClient.java new file mode 100644 index 0000000..96b278e --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/notification/INotificationCoreClient.java @@ -0,0 +1,14 @@ +package com.chwl.core.im.notification; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.library.coremanager.ICoreClient; + +/** + * Created by zhouxiangfeng on 2017/6/19. + */ + +public interface INotificationCoreClient extends ICoreClient { + public static final String METHOD_ON_RECEIVED_CUSTOM_NOTIFICATION = "onReceivedCustomNotification"; + + void onReceivedCustomNotification(JSONObject attachment); +} diff --git a/core/src/main/java/com/chwl/core/im/room/IIMRoomCoreClient.java b/core/src/main/java/com/chwl/core/im/room/IIMRoomCoreClient.java new file mode 100644 index 0000000..e05b08f --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/room/IIMRoomCoreClient.java @@ -0,0 +1,125 @@ +package com.chwl.core.im.room; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMemberUpdate; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomQueueChangeAttachment; +import com.netease.nimlib.sdk.util.Entry; +import com.chwl.library.coremanager.ICoreClient; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/20. + */ + +public interface IIMRoomCoreClient extends ICoreClient { + + public static final String METHOD_ON_ENTER_ROOM = "onEnterRoom"; + public static final String METHOD_ON_ENTER_ROOM_FAITH = "onEnterRoomFail"; + public static final String METHOD_ON_QUITE_ROOM = "onQuiteRoom"; + public static final String METHOD_ON_ROOM_ONLINE_MEMBER_UPDATE = "onRoomOnlineMemberUpdate"; + public static final String METHOD_ON_ROOM_GUEST_MEMBER_UPDATE = "onRoomGuestMemberUpdate"; + public static final String METHOD_ON_MEMBER_IN = "onMemberIn"; + public static final String METHOD_ON_MEMBER_EXIT = "onMemberExit"; + public static final String METHOD_ON_MEMBER_UPDATE = "onMemberUpdate"; + + public static final String METHOD_ON_KICK_OUT = "onKickOut"; + public static final String METHOD_ON_NEED_OUT = "onNeedOut"; + public static final String METHOD_ON_EXCEPTION = "onException"; + public static final String METHOD_ON_ONLINE_STATE_CHANGED = "onOnlineStateChanged"; + public static final String METHOD_ON_RECEIVE_CHATROOM_MESSAGES = "onReceiveChatRoomMessages"; + public static final String METHOD_ON_RECEIVE_CHATROOM_QUEUE_CHANGED = "onReceiveChatRoomQueueChanged"; + public static final String METHOD_ON_ROOM_INFO_UPDATE = "onRoomInfoUpdate"; + public static final String METHOD_ON_RECEIVE_CHATROOM_MY_ROOM_ROLE_UPDATE = "onReceiveChatRoomMyRoomRoleUpdate"; + public static final String METHOD_ON_QUERY_CHATROOM_QUEUE_SUCCESS= "onQueryChatRoomQueueSuccess"; + public static final String METHOD_ON_QUERY_CHATROOM_QUEUE_FAIL= "onQueryChatRoomQueueFail"; + public static final String METHOD_ON_UPDATE_CHATROOM_QUEUE_SUCCESS= "onUpdateChatRoomQueueSuccess"; + public static final String METHOD_ON_UPDATE_CHATROOM_QUEUE_FAIL= "onUpdateChatRoomQueueFail"; + public static final String METHOD_ON_UPDATE_MY_ROOM_ROLE_SUCCESS= "onUpdateMyRoomRoleSuccess"; + public static final String METHOD_ON_UPDATE_MY_ROOM_ROLE_FAIL= "onUpdateMyRoomRoleFail"; + public static final String METHOD_ON_SEND_ROOM_MESSAGE_SUCCESS= "onSendRoomMessageSuccess"; + public static final String METHOD_ON_QUERY_MANAGER_LIST= "onQueryManagerList"; + public static final String METHOD_ON_QUERY_MANAGER_LIST_FAIL= "onQueryManagerListFail"; + public static final String METHOD_ON_MARK_MANAGER_LIST= "onMarkManagerList"; + public static final String METHOD_ON_MARK_MANAGER_LIST_FAIL= "onMarkManagerListFail"; + public static final String METHOD_ON_QUERY_BLACK_LIST= "onQueryBlackList"; + public static final String METHOD_ON_QUERY_BLACK_LIST_FAIL= "onQueryBlackListFail"; + public static final String METHOD_ON_MARK_BLACK_LIST= "onMarkBlackList"; + public static final String METHOD_ON_MARK_BLACK_LIST_FAIL= "onMarkBlackListFail"; + public static final String METHOD_ON_MEMBER_BE_MANAGER= "onMemberBeManager"; + public static final String METHOD_ON_MEMBER_BE_REMOVE_MANAGER= "onMemberBeRemoveManager"; + + void onEnterRoom(); + void onEnterRoomFail(int code, String error); + void onGetRoomInfo(); + + void onQuiteRoom(); + + void onRoomGuestMemberUpdate(List guestMembers); + void onRoomOnlineMemberUpdate(List onlineMembers, List normalMembers); + void onMemberIn(ChatRoomMember chatRoomMember); + void onMemberUpdate(ChatRoomMember chatRoomMember); + void onMemberExit(String account); + + void onSendRoomMessageSuccess(ChatRoomMessage message); + + void onReceiveMessage(); + + void onRegisterRoomOnlineStatus(); + + void onKickMember(); + + void onKickOut(ChatRoomKickOutEvent.ChatRoomKickOutReason reason); + + void onReceiveChatRoomMessages(List chatRoomMessageList); + + void onReceiveChatRoomQueueChanged(ChatRoomQueueChangeAttachment attachment); + + void onRoomInfoUpdate(); + + void onReceiveChatRoomMyRoomRoleUpdate(ChatRoomMessage chatRoomMessage); + + void onQueryChatRoomQueueSuccess(List> entries); + + void onQueryChatRoomQueueFail(); + + void onUpdateChatRoomQueueSuccess(); + + void onUpdateChatRoomQueueFail(); + + void onUpdateMyRoomRoleSuccess(ChatRoomMemberUpdate chatRoomMemberUpdate); + + void onUpdateMyRoomRoleFail(); + + void onReceiveNoti(ChatRoomMessage msg); + + void onReceiveText(ChatRoomMessage msg); + + void onException(); + + void onOnlineStateChanged(boolean isOnline); + + void onNeedOut(); + + void onQueryManagerList(List managerList); + + void onQueryManagerListFail(); + + void onMarkManagerList(ChatRoomMember chatRoomMember); + + void onMarkManagerListFail(); + + void onQueryBlackList(List blackList); + + void onQueryBlackListFail(); + + void onMarkBlackList(ChatRoomMember chatRoomMember); + + void onMarkBlackListFail(); + + void onMemberBeManager(String account); + + void onMemberBeRemoveManager(String account); +} diff --git a/core/src/main/java/com/chwl/core/im/state/IPhoneCallStateModel.java b/core/src/main/java/com/chwl/core/im/state/IPhoneCallStateModel.java new file mode 100644 index 0000000..0be25d2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/state/IPhoneCallStateModel.java @@ -0,0 +1,23 @@ +package com.chwl.core.im.state; + +import com.chwl.core.base.IModel; + +public interface IPhoneCallStateModel extends IModel { + /** + * 设置电话呼入状态 + * @param state + */ + void callStateChanged(String state); + + /** + * 获取电话呼入状态 + * @return + */ + PhoneCallStateModel.PhoneCallStateEnum getPhoneCallState(); + + /** + * 设置监听电话呼入状态 + * @param callStateListener + */ + void setCallStateListener(PhoneCallStateModel.PhoneCallStateListener callStateListener); +} diff --git a/core/src/main/java/com/chwl/core/im/state/PhoneCallStateModel.java b/core/src/main/java/com/chwl/core/im/state/PhoneCallStateModel.java new file mode 100644 index 0000000..cebfbd4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/state/PhoneCallStateModel.java @@ -0,0 +1,92 @@ +package com.chwl.core.im.state; + +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.chwl.core.base.BaseModel; + +public class PhoneCallStateModel extends BaseModel implements IPhoneCallStateModel { + private static final String TAG = "PhoneCallStateModel"; + + private volatile static IPhoneCallStateModel instance; + + private PhoneCallStateModel(){ + + } + + public static IPhoneCallStateModel get(){ + if (instance == null){ + synchronized (PhoneCallStateModel.class){ + if (instance == null){ + instance = new PhoneCallStateModel(); + } + } + } + return instance; + } + + public enum PhoneCallStateEnum { + IDLE, // 空闲 + INCOMING_CALL, // 有来电 + DIALING_OUT, // 呼出电话已经接通 + DIALING_IN // 来电已接通 + } + + + private int phoneState = TelephonyManager.CALL_STATE_IDLE; + private PhoneCallStateEnum stateEnum = PhoneCallStateEnum.IDLE;; + + /** + * 设置电话呼入状态 + * @param state + */ + @Override + public void callStateChanged(String state) { + Log.i(TAG, "onCallStateChanged, now state =" + state); + stateEnum = PhoneCallStateEnum.IDLE; + if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) { + phoneState = TelephonyManager.CALL_STATE_IDLE; + stateEnum = PhoneCallStateEnum.IDLE; + } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) { + phoneState = TelephonyManager.CALL_STATE_RINGING; + stateEnum = PhoneCallStateEnum.INCOMING_CALL; + } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) { + int lastPhoneState = phoneState; + phoneState = TelephonyManager.CALL_STATE_OFFHOOK; + if (lastPhoneState == TelephonyManager.CALL_STATE_IDLE) { + stateEnum = PhoneCallStateEnum.DIALING_OUT; + } else if (lastPhoneState == TelephonyManager.CALL_STATE_RINGING) { + stateEnum = PhoneCallStateEnum.DIALING_IN; + } + } + + if (callStateListener != null){ + callStateListener.onPhoneCallSatausChange(stateEnum); + } + } + + /** + * 获取电话呼入状态 + * @return + */ + @Override + public PhoneCallStateEnum getPhoneCallState() { + return stateEnum; + } + + private PhoneCallStateListener callStateListener; + + /** + * 设置监听电话呼入状态 + * @param callStateListener + */ + @Override + public void setCallStateListener(PhoneCallStateListener callStateListener) { + this.callStateListener = callStateListener; + } + + public interface PhoneCallStateListener{ + void onPhoneCallSatausChange(PhoneCallStateEnum callStateEnum); + } + +} diff --git a/core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCore.java b/core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCore.java new file mode 100644 index 0000000..e155385 --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCore.java @@ -0,0 +1,80 @@ +package com.chwl.core.im.sysmsg; + +import com.netease.nimlib.sdk.msg.constant.SystemMessageStatus; +import com.netease.nimlib.sdk.msg.constant.SystemMessageType; +import com.netease.nimlib.sdk.msg.model.SystemMessage; +import com.chwl.library.coremanager.IBaseCore; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/19. + */ + +public interface ISysMsgCore extends IBaseCore { + + + + /** + * 注册SystemMessage观察者,监听回调 + * 监听系统通知的到达事件和监听未读数变化 + */ + void registSystemMessageObserver(boolean isRegister); + + + /** + * 查询系统消息列表 + * @param offset + * @param limit + * @return + */ + List querySystemMessageList(int offset, int limit); + + /** + * 只查询“添加好友”类型的系统通知 + */ + List querySystemMessageByType(List types, int loadOffset, int count); + + /** + * 设置系统通知状态 + */ + void setSystemMessageStatus(SystemMessage msg, SystemMessageStatus status); + + /** + * 删除系统通知 + */ + void deleteSystemMessage(SystemMessage msg); + + /** + * 清除所有系统消息 + */ + void clearAllSystemMessage(); + + /** + * 查询系统通知未读数总和 + */ + int querySystemMessageCount(); + + /** + * 查询指定类型的系统通知未读数总和 + * @param types + * @return + */ + int querySystemMessageCountByType(List types); + + /** + * 设置单条系统通知为已读 + */ + void setSystemMessageRead(long sysMsgId); + + /** + * 将所有系统通知设为已读 + */ + void setAllSystemMessageRead(); + + /** + * 将指定类型的系统通知设为已读接口 + */ + void setSystemMessageReadByType(List types); + +} diff --git a/core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCoreClient.java b/core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCoreClient.java new file mode 100644 index 0000000..d98291c --- /dev/null +++ b/core/src/main/java/com/chwl/core/im/sysmsg/ISysMsgCoreClient.java @@ -0,0 +1,20 @@ +package com.chwl.core.im.sysmsg; + +import com.netease.nimlib.sdk.msg.model.SystemMessage; +import com.chwl.library.coremanager.ICoreClient; + +/** + * Created by zhouxiangfeng on 2017/5/19. + */ + +public interface ISysMsgCoreClient extends ICoreClient { + + public static final String METHOD_ON_UNREAD_COUNT_CHANGE = "onUnreadCountChange"; + public static final String METHOD_ON_RECEIVE_SYSTEM_MSG = "onReceiveSystemMsg"; + + + void onUnreadCountChange(Integer integer); + + void onReceiveSystemMsg(SystemMessage message); + +} diff --git a/core/src/main/java/com/chwl/core/initial/IInitialModel.java b/core/src/main/java/com/chwl/core/initial/IInitialModel.java new file mode 100644 index 0000000..bc233a6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/IInitialModel.java @@ -0,0 +1,61 @@ +package com.chwl.core.initial; + + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; + +import com.chwl.core.base.IModel; +import com.chwl.core.home.bean.ClientResource; +import com.chwl.core.home.bean.ConfigInfo; +import com.chwl.core.home.bean.MainTabInfo; +import com.chwl.core.initial.bean.FairyOpenInfo; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.core.initial.bean.SplashComponent; + +import java.util.List; + +import io.reactivex.Single; + +/** + * @author: hewenhao + * @date: 2018/9/10 11:32 + */ +public interface IInitialModel extends IModel { + + @NonNull + LiveData> getMainTabInfosLiveData(); + + Single init(boolean force); + + SplashComponent getLocalSplashVo(); + + @Nullable + InitInfo getCacheInitInfo(); + + /** + * 只是load 一下初始化接口 + * + * @return + */ + Single loadInitInfo(); + + String getPublicChatHallUid(); + + int getTeenagerMode(); + + Single requestFairyOpenInfo(); + + @Nullable + FairyOpenInfo getFairyOpenInfo(); + + void regionCheck(); + + String getPublicChatSessionId(); + + Single loadConfig(); + + Single clientResource(); + + void refreshApi(); +} diff --git a/core/src/main/java/com/chwl/core/initial/InitialModel.java b/core/src/main/java/com/chwl/core/initial/InitialModel.java new file mode 100644 index 0000000..7730dab --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/InitialModel.java @@ -0,0 +1,566 @@ +package com.chwl.core.initial; + + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; + +import com.bumptech.glide.request.FutureTarget; +import com.bumptech.glide.request.target.Target; +import com.chwl.core.DemoCache; +import com.chwl.core.R; +import com.chwl.core.auth.event.LogoutEvent; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.certification.CertificationModel; +import com.chwl.core.home.bean.ClientResource; +import com.chwl.core.home.bean.ConfigInfo; +import com.chwl.core.home.bean.MainTabInfo; +import com.chwl.core.home.bean.MainTabType; +import com.chwl.core.initial.bean.BoxInfo; +import com.chwl.core.initial.bean.FairyOpenInfo; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.core.initial.bean.SplashComponent; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.noble.NobleDataManager; +import com.chwl.core.room.face.DynamicFaceModel; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.user.event.LoadLoginUserInfoEvent; +import com.chwl.core.utils.CurrentTimeUtils; +import com.chwl.core.utils.SharedPreferenceUtils; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.language.LanguageHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.JavaUtil; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.NetworkUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.config.BasicConfig; +import com.example.lib_utils.TelephonyUtils; +import com.netease.nim.uikit.support.glide.GlideApp; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; + +/** + * @author: hewenhao + * @date: 2018/9/10 11:32 + */ +public class InitialModel extends BaseModel implements IInitialModel { + + public static final String KEY_UPDATE_URL = "key_update_url"; + + private static final String TAG = "InitialModel"; + /** + * 缓存过期时间 + */ + private static final long TIME_EXPIRED = 24 * 60 * 60 * 1000; + private volatile static IInitialModel model; + private Api api; + private final MutableLiveData> mainTabInfosLiveData = new MutableLiveData<>(); + private boolean requesting; + private boolean success; + private BroadcastReceiver receiver; + private Single initResultSingle; + // TODO: 03/12/2018 考虑到兼容性问题,这里暂时把这个字段放在这里,等所有应用都移植了公聊大厅后, + // TODO: 03/12/2018 可以改用回 PublicChatHallDataManager 里的那个字段 + private String publicChatHallUid; + /** + * 宝箱开关,等级限制 + */ + private BoxInfo boxInfo; + /** + * 注册图片验证码开关 + */ + private boolean captchaSwitch; + /** + * 记录服务器与本地的时间差 + */ + private long timeDiff; + /** + * 是否需要上报消息的开关 + */ + private boolean reportSwitch; + /** + * 家长模式引导 1-强 2- 弱 + */ + private int teenagerMode; + /** + * 首页房间刷新频率 + */ + private int roomRefresh; + /** + * 首页动态刷新频率 + */ + private int dynamicRefresh; + /** + * 首页默认TAB + */ + private int defaultHomeTab; + /** + * 发现萌新列表展示等级配置 + */ + private int findNewbieCharmLevel; + /** + * 宝箱开关,等级限制 + */ + @Nullable + private FairyOpenInfo fairyOpenInfo; + + @Nullable + private InitInfo cacheInitInfo; + + private Disposable regionCheckTimer; + + private InitialModel() { + api = RxNet.create(Api.class); + List tabInfoList = getDefaultMainTab(); + mainTabInfosLiveData.setValue(tabInfoList); + IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); + receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + boolean available = NetworkUtils.isNetworkAvailable(context); + if (!requesting && available) { + init(true).subscribe(); + } + } + }; + try { + BasicConfig.INSTANCE.getAppContext().registerReceiver(receiver, filter); + } catch (Exception e) { + } + } + + @Override + public void refreshApi() { + api = RxNet.create(Api.class); + } + + + public static IInitialModel get() { + if (model == null) { + synchronized (InitialModel.class) { + if (model == null) { + model = new InitialModel(); + } + } + } + return model; + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoadLoginUserInfoEvent(LoadLoginUserInfoEvent event) { + getFairyOpenInfo(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogoutEvent(LogoutEvent event) { + fairyOpenInfo = null; + } + + @Override + @NonNull + public LiveData> getMainTabInfosLiveData() { + return mainTabInfosLiveData; + } + + @Override + public Single init(boolean force) { + if (requesting && initResultSingle != null) return initResultSingle; + if (!force && success) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_01))); + } + requesting = true; + initResultSingle = api.init().subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()).doFinally(new Action() { + @Override + public void run() throws Exception { + requesting = false; + initResultSingle = null; + } + }) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult initInfoServiceResult) throws Exception { + if (initInfoServiceResult.isSuccess() && initInfoServiceResult.getData() != null) { + CurrentTimeUtils.initTime(initInfoServiceResult.getTimestamp()); + return Single.just(initInfoServiceResult.getData()); + } else { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_02))); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(new Consumer() { + @Override + public void accept(InitInfo initResult) throws Exception { + success = true; + if (receiver != null) { + BasicConfig.INSTANCE.getAppContext().unregisterReceiver(receiver); + receiver = null; + } + if (initResult != null) cacheInitData(initResult); + } + }); + return initResultSingle; + } + + private void cacheInitData(InitInfo initInfo) { + if (initInfo == null) return; + this.cacheInitInfo = initInfo; + DemoCache.saveInitInfo(initInfo); + // 更新时间 + DemoCache.saveInitInfoSavingTime(System.currentTimeMillis()); + if (initInfo.getFaceJson() != null) { + // 缓存表情 + DynamicFaceModel.get() + .onReceiveOnlineFaceJson(initInfo.getFaceJson().getJson()); + } + if (initInfo.getSplashVo() != null) { + // 缓存闪屏页信息 + DemoCache.saveSplashInfo(initInfo.getSplashVo()); + // 下载闪屏的图片 + downloadSplashPicture(initInfo.getSplashVo().getPict()); + } + if (!ListUtils.isListEmpty(initInfo.getRights())) { + // 贵族特权 + NobleDataManager.get().setOnlineRights(initInfo.getRights()); + } + if (initInfo.getNobleResource() != null) { + // 贵族配置json + NobleDataManager.get().setOnlineConfigs(initInfo.getNobleResource()); + } + // 兑换比率 + if (initInfo.getExchangeGoldRate() != 0) { + SharedPreferenceUtils.setExchangeGoldRate(initInfo.getExchangeGoldRate()); + } + + + + // 是否可以开启 一起玩 按钮 + AvRoomDataManager.get().setAllowedToPlayTogether(initInfo.isPlayTogether()); + + //宝箱相关 + boxInfo = initBoxInfo(initInfo); + + // 获取实名认证引导类型 + if (initInfo.getCertificationType() > 0) { + CertificationModel.get().setCertificationType(initInfo.getCertificationType()); + } + + // 注册时是否显示图片验证码 + this.captchaSwitch = initInfo.isCaptchaSwitch(); + + // 时间差 + this.timeDiff = System.currentTimeMillis() - JavaUtil.str2long(initInfo.getCurrentTime()); + + // 家长模式 + this.teenagerMode = initInfo.getTeenagerMode(); + + this.roomRefresh = initInfo.getRoomRefresh(); + + this.dynamicRefresh = initInfo.getDynamicRefresh(); + + this.defaultHomeTab = initInfo.getDefaultHomeTab(); + + this.findNewbieCharmLevel = initInfo.getFindNewbieCharmLevel(); + + // 客户端更新 URL + if (initInfo.getUpdateUrl() != null && + !TextUtils.isEmpty(initInfo.getUpdateUrl().getAndroidUrl())) { + SharedPreferenceUtils.put(KEY_UPDATE_URL, initInfo.getUpdateUrl().getAndroidUrl()); + } + } + + public String getPublicChatHallUid() { + return publicChatHallUid; + } + + /** + * 如果返回的是null,则可能是过期了,也有可能是因为图片还没有下载 + * + * @return - + */ + @Override + public SplashComponent getLocalSplashVo() { + // 过期了 + if (System.currentTimeMillis() - DemoCache.readInitInfoSavingTime() > TIME_EXPIRED) + return null; + // 没有缓存 + SplashComponent splashInfo = DemoCache.readSplashInfo(); + if (splashInfo == null) { + return null; + } + // 图片是否存在 + String path = DemoCache.readSplashPicture(); + if (TextUtils.isEmpty(path)) { + return null; + } else { + if (!new File(path).exists()) { + downloadSplashPicture(path); + return null; + } + } + return splashInfo; + } + + /** + * 如果返回的是null,则可能是过期了,也有可能是因为图片还没有下载 + * + * @return - + */ + @Nullable + @Override + public InitInfo getCacheInitInfo() { + return cacheInitInfo == null ? DemoCache.readInitInfo() : cacheInitInfo; + } + + private void downloadSplashPicture(final String path) { + if (TextUtils.isEmpty(path)) return; + if (path.equals(DemoCache.readSplashPicture()) && new File(path).exists()) return; + Single.create((SingleOnSubscribe) e -> { + FutureTarget target = GlideApp.with(BasicConfig.INSTANCE.getAppContext()) + .asFile().load(path).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); + try { + File file = target.get(); + if (file != null) { + DemoCache.saveSplashPicture(file.getAbsolutePath()); + } + e.onSuccess(true); + } catch (Exception e1) { + DemoCache.saveSplashPicture(""); + e.onError(e1); + } + }).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).subscribe(); + } + + + /** + * 只是load 一下初始化接口 + * + * @return + */ + @Override + public Single loadInitInfo() { + return api.init().subscribeOn(Schedulers.io()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult initInfoServiceResult) throws Exception { + if (initInfoServiceResult.isSuccess()) { + return Single.just(initInfoServiceResult.getData()); + } else { + return Single.error(new Throwable(initInfoServiceResult.getMessage())); + } + } + }) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single loadConfig() { + return api.loadConfig() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single clientResource() { + return api.clientResource() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + private List getDefaultMainTab() { + return new ArrayList<>(Arrays.asList( + new MainTabInfo( + "", + "", + ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_03), + MainTabType.TAB_TYPE_HOME, + null + ), + new MainTabInfo( + "", + "", + "Game", + MainTabType.TAB_TYPE_GAME, + null + ), + new MainTabInfo( + "", + "", + "Square", + MainTabType.TAB_TYPE_SQUARE, + null + ), + new MainTabInfo( + "", + "", + ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_06), + MainTabType.TAB_TYPE_MSG, + null + ), + new MainTabInfo( + "", + "", + ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_07), + MainTabType.TAB_TYPE_ME, + null + ) + )); + } + + private BoxInfo initBoxInfo(InitInfo info) { + BoxInfo boxInfo = new BoxInfo(); + boxInfo.setOpenBoxSwitchLevelNo(info.getOpenBoxSwitchLevelNo()); + return boxInfo; + } + + /** + * 地区检测 + */ + + @Override + public void regionCheck() { + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo == null) { + return; + } + if (TextUtils.isEmpty(userInfo.getNick()) || TextUtils.isEmpty(userInfo.getAvatar())) { + return; + } + String operatorCode; + if (TelephonyUtils.INSTANCE.isChinaOperator()) { + operatorCode = "460"; + } else { + operatorCode = TelephonyUtils.INSTANCE.getOperatorFirstSim(); + } + api.regionCheck(LanguageHelper.INSTANCE.getSystemLanguage().toLanguageTag(), operatorCode) + .compose(RxHelper.handleSchedulers()) + .doOnSuccess(longServiceResult -> { + if (regionCheckTimer != null && !regionCheckTimer.isDisposed()) { + regionCheckTimer.dispose(); + } + if (longServiceResult.isSuccess() && longServiceResult.getData() != null && longServiceResult.getData() > 0) { + regionCheckTimer = Observable.timer(Math.max(longServiceResult.getData(), 30 * 1000), TimeUnit.MILLISECONDS).subscribe(aLong -> { + regionCheck(); + }); + } + }).subscribe(); + } + + @Override + public int getTeenagerMode() { + return teenagerMode; + } + + @Override + public Single requestFairyOpenInfo() { + return api.getFairyOpenInfo() + .compose(RxHelper.handleCommon()); + } + + @Nullable + @Override + public FairyOpenInfo getFairyOpenInfo() { + //每次请求都刷新 + requestFairyOpenInfo() + .doOnSuccess(fairyOpenInfo -> this.fairyOpenInfo = fairyOpenInfo) + .subscribe(); + return fairyOpenInfo; + } + + @Override + public String getPublicChatSessionId() { + long partitionId = UserModel.get().getPartitionId(); + InitInfo initInfo = getCacheInitInfo(); + if (initInfo == null) { + return null; + } + Map idMap = initInfo.getPublicChatRoomIdMap(); + if (idMap == null) { + return null; + } + return idMap.get(partitionId + ""); + } + + private interface Api { + /** + * 客户端初始化 + * + * @return - + */ + @GET("/client/init") + Single> init(); + + /** + * 客户端初始化 + * + * @return - + */ + @GET("/client/config") + Single> loadConfig(); + + /** + * 夺宝精灵开放状态 + * + * @return - + */ + @GET("act/seize-treasure/status") + Single> getFairyOpenInfo(); + + /** + * 地区检测 + * + * @param lang 语言 + * @param mcc 运营商码 + * @return + */ + @POST("/ipRegion/check") + @FormUrlEncoded + Single> regionCheck(@Field("lang") String lang, @Field("mcc") String mcc); + + + /** + * 资源接口 : + * 房间资源信息 , 麦位皮肤,麦位光圈 + * + * @return - + */ + @GET("/client/resource") + Single> clientResource(); + + } +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/BoxInfo.java b/core/src/main/java/com/chwl/core/initial/bean/BoxInfo.java new file mode 100644 index 0000000..45ebf22 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/BoxInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.initial.bean; + +import lombok.Data; + +/** + * 开宝箱 + * Created by lvzebiao on 2019/1/2. + */ + +@Data +public class BoxInfo { + /**宝箱限制等级*/ + private int openBoxSwitchLevelNo; +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/FaceComponent.java b/core/src/main/java/com/chwl/core/initial/bean/FaceComponent.java new file mode 100644 index 0000000..a42fc70 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/FaceComponent.java @@ -0,0 +1,68 @@ +package com.chwl.core.initial.bean; + + +import java.io.Serializable; + +/** + * @author xiaoyu + * @date 2017/12/8 + */ + +public class FaceComponent implements Serializable{ + private int id; + private String version; + private int status; + private long createTime; + private String json; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public String getJson() { + return json; + } + + public void setJson(String json) { + this.json = json; + } + + @Override + public String toString() { + return "FaceComponent{" + + "id=" + id + + ", version='" + version + '\'' + + ", status=" + status + + ", createTime=" + createTime + + ", json='" + json + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/FairyOpenInfo.java b/core/src/main/java/com/chwl/core/initial/bean/FairyOpenInfo.java new file mode 100644 index 0000000..4286ce9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/FairyOpenInfo.java @@ -0,0 +1,22 @@ +package com.chwl.core.initial.bean; + +public class FairyOpenInfo { + private int levelLimit; + private boolean open; + + public int getLevelLimit() { + return levelLimit; + } + + public void setLevelLimit(int levelLimit) { + this.levelLimit = levelLimit; + } + + public boolean isOpen() { + return open; + } + + public void setOpen(boolean open) { + this.open = open; + } +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/InitInfo.java b/core/src/main/java/com/chwl/core/initial/bean/InitInfo.java new file mode 100644 index 0000000..b7c4643 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/InitInfo.java @@ -0,0 +1,176 @@ +package com.chwl.core.initial.bean; + + +import com.chwl.core.monsterhunting.bean.MonsterInitInfo; +import com.chwl.core.noble.bean.NobleRight; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +import lombok.Data; + +/** + * @author xiaoyu + * @date 2017/12/8 + */ +@Data +public class InitInfo implements Serializable { + private FaceComponent faceJson; + private SplashComponent splashVo; + private RedEnvelopeConfig redEnvelopeConfig; + private List rights; + @SerializedName("nobleZip") + private NobleResourceComponent nobleResource; + + private List monsters; + /** 转赠钻石白名单 */ + private List giveDiamondErbanNoList; + /** 每日转赠钻石总额限制 */ + private Long giveDiamondDailyNum; + /** 转赠钻石单笔最大限额 */ + private Long giveDiamondOnceLimitNum; + /** 转赠手续费率 */ + private Double giveDiamondRate; + /** 转赠钻石财富等级 */ + private Integer giveDiamondExperLevel; + /** 转赠礼物白名单 */ + private List giveGiftErbanNoList; + /** 转赠礼物财富等级 */ + private Integer giveGiftExperLevel; + private double exchangeGoldRate;// 钻石兑换钻石比率 + private double exchangeRate;// 钻石兑换钻石比率 + + private TaxInfo tax;//提现手续费 + /** + * 动态配置网页的域名 + */ + private String webHostName; + + + // 私聊等级限制 + private int privateChatLevelNo; + // 私聊注册天数限制 + private int privateChatRegisterDay; + /** + * 宝箱开关 + */ + private boolean openBoxSwitch; + /** + * 宝箱限制等级 + */ + private int openBoxSwitchLevelNo; + + /** + * 梦幻许愿池开关 + */ + private boolean diamondBoxSwitch; + /** + * 首页TAB默认位置(动态、聊天交友) + */ + private int defaultHomeTab; + /** + * 许愿池图标 + */ + private String openBoxIcon; + + /** + * 一起玩 按钮的开关 + */ + private boolean playTogether; + + // 实名认证引导类型,0:不提示,1:强制,2:强引导 + private int certificationType; + + //首页动态刷新频率 + private int dynamicRefresh; + //首页房间刷新频率 + private int roomRefresh; + + private boolean gameSwitch;//游戏入口开关 + private boolean gameRankSwitch;//游戏入口开关 + + private int gameTime;//游戏链接有效期 + private int gameFrequency;// 游戏发起间隔时间 + + + + /** + * 1厅内 2全服 + */ + private int redEnvelopedPosition; + + /** + * 1 水晶 2礼物 + */ + private int redEnvelopeType; + + + /** + * 注册图片验证码开关 + */ + private boolean captchaSwitch; + + /** + * 当前系统时间,单位毫秒 + */ + private String currentTime; + private int worldGroupChatLevelNo; // 话题群聊发言等级 + + /** + * 是否需要上报消息的开关 + */ + private boolean reportSwitch; + + /** + * 青少年模式引导 1-强 2- 弱 + */ + private int teenagerMode; + + /** + * 客户端更新url + */ + private AppUpgradePackageAddress updateUrl; + + /** + * 域名列表 + */ + private List domainList; + + private int roomMessageCount; + + /** + * 发现萌新列表展示等级配置 + */ + private int findNewbieCharmLevel; + + /** + * 腾讯trtc预埋 + */ + private String trtcAppId; + + /** + * 公聊ID + */ + private HashMap publicChatRoomIdMap; + + @Data + public class AppUpgradePackageAddress implements Serializable{ + private String androidUrl; + private String iOSUrl; + } + + private List checkUids; + + private boolean checkInviteCode; + + private List homeTabList; + + private int roomBlackListSize; + + private double hideCarEffectGiftPrice; + + private int linearlyPoolOpenLevel; + +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/NobleResourceComponent.java b/core/src/main/java/com/chwl/core/initial/bean/NobleResourceComponent.java new file mode 100644 index 0000000..8d53b03 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/NobleResourceComponent.java @@ -0,0 +1,53 @@ +package com.chwl.core.initial.bean; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +/** + * 1.贵族的资源url + * 2.所有贵族对应的资源配置json + * + * @author xiaoyu + * @date 2018/1/8 + */ + +public class NobleResourceComponent implements Serializable { + private String zipUrl; + private int version; + @SerializedName("resConf") + private String resourceConfig; + + public String getZipUrl() { + return zipUrl; + } + + public void setZipUrl(String zipUrl) { + this.zipUrl = zipUrl; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public String getResourceConfig() { + return resourceConfig; + } + + public void setResourceConfig(String resourceConfig) { + this.resourceConfig = resourceConfig; + } + + @Override + public String toString() { + return "NobleResourceComponent{" + + "zipUrl='" + zipUrl + '\'' + + ", version=" + version + + ", resourceConfig='" + resourceConfig + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/RedEnvelopeConfig.java b/core/src/main/java/com/chwl/core/initial/bean/RedEnvelopeConfig.java new file mode 100644 index 0000000..3edf0e4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/RedEnvelopeConfig.java @@ -0,0 +1,62 @@ +package com.chwl.core.initial.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class RedEnvelopeConfig implements Serializable { + + /** + * 钻石转赠手续费 + */ + private double rate; + + private int roomRedEnvelopeMinNum; + private int roomRedEnvelopeMaxNum; + private int serverRedEnvelopeMinNum; + private int serverRedEnvelopeMaxNum; + private int roomRedEnvelopeMinAmount; + private int serverRedEnvelopeMinAmount; + + /** + * 红包结束时间(秒) + */ + private long endSecond; + /** + * 红包显示开关 + */ + private boolean open; + + private double exchangeDiamondsRate;//手气红包兑换水晶比率 + + /** + * 全服红包最大金额 + */ + private int serverRedEnvelopeMaxAmount; + /** + * 房间红包最大金额 + */ + private int roomRedEnvelopeMaxAmount; + + private boolean redEnvelopeSwitch; + + @Override + public String toString() { + return "RedEnvelopeConfig{" + + "rate=" + rate + + ", roomRedEnvelopeMinNum=" + roomRedEnvelopeMinNum + + ", open=" + open + + ", roomRedEnvelopeMaxNum=" + roomRedEnvelopeMaxNum + + ", serverRedEnvelopeMinNum=" + serverRedEnvelopeMinNum + + ", serverRedEnvelopeMaxNum=" + serverRedEnvelopeMaxNum + + ", roomRedEnvelopeMinAmount=" + roomRedEnvelopeMinAmount + + ", serverRedEnvelopeMinAmount=" + serverRedEnvelopeMinAmount + + ", exchangeDiamondsRate=" + exchangeDiamondsRate + + ", serverRedEnvelopeMaxAmount=" + serverRedEnvelopeMaxAmount + + ", roomRedEnvelopeMaxAmount=" + roomRedEnvelopeMaxAmount + + ", redEnvelopeSwitch=" + redEnvelopeSwitch + + ", endSecond=" + endSecond + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/SplashComponent.java b/core/src/main/java/com/chwl/core/initial/bean/SplashComponent.java new file mode 100644 index 0000000..4658205 --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/SplashComponent.java @@ -0,0 +1,71 @@ +package com.chwl.core.initial.bean; + + +import com.chwl.core.home.bean.FillVo; + +import java.io.Serializable; + +/** + * @author xiaoyu + * @date 2017/12/29 + */ + +public class SplashComponent implements Serializable { + /** + * 封面 + */ + private String pict; + /** + * 跳转的链接 + */ + private String link; + /** + * 跳转的类型 + * 1跳app页面,2跳聊天室,3跳h5页面 + */ + private int type; + + // 首页banner , 闪屏页 嵌套头像用 的字段和key + private FillVo fillVo = new FillVo(); + + public String getPict() { + return pict; + } + + public FillVo getFillVo() { + return fillVo; + } + + public void setFillVo(FillVo fillVo) { + this.fillVo = fillVo; + } + + public void setPict(String pict) { + this.pict = pict; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + @Override + public String toString() { + return "SplashComponent{" + + "pict='" + pict + '\'' + + ", link='" + link + '\'' + + ", type=" + type + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/initial/bean/TaxInfo.java b/core/src/main/java/com/chwl/core/initial/bean/TaxInfo.java new file mode 100644 index 0000000..d970d8c --- /dev/null +++ b/core/src/main/java/com/chwl/core/initial/bean/TaxInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.initial.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/8/7 + */ +@Data +public class TaxInfo implements Serializable { + private double rate;//提现税率 + private String tips;//提示 +} diff --git a/core/src/main/java/com/chwl/core/interceptor/MyOkHttpRetryInterceptor.java b/core/src/main/java/com/chwl/core/interceptor/MyOkHttpRetryInterceptor.java new file mode 100644 index 0000000..92eaa9f --- /dev/null +++ b/core/src/main/java/com/chwl/core/interceptor/MyOkHttpRetryInterceptor.java @@ -0,0 +1,59 @@ +package com.chwl.core.interceptor; + +import com.chwl.core.utils.CoreLogger; + +import java.io.IOException; +import java.io.InterruptedIOException; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * User: Administrator + * Date: 2017/9/19 + * Description: + */ +public class MyOkHttpRetryInterceptor implements Interceptor { + public int executionCount = 3;//最大重试次数 + private long retryInterval = 1000;//重试的间隔 + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + Response response = doRequest(chain, request); + int retryNum = 0; + while ((response == null || !response.isSuccessful()) && retryNum <= executionCount) { + CoreLogger.info("intercept Request is not successful - {}", String.valueOf(retryNum)); + final long nextInterval = getRetryInterval(); + try { + CoreLogger.info("Wait for {}", String.valueOf(nextInterval)); + Thread.sleep(nextInterval); + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); + throw new InterruptedIOException(); + } + retryNum++; + // retry the request + response = doRequest(chain, request); + } + return response; + } + + private Response doRequest(Chain chain, Request request) { + Response response = null; + try { + response = chain.proceed(request); + } catch (Exception e) { + } + return response; + } + + /** + * retry间隔时间 + */ + public long getRetryInterval() { + return this.retryInterval; + } + +} diff --git a/core/src/main/java/com/chwl/core/interceptor/NoParamsInterceptor.java b/core/src/main/java/com/chwl/core/interceptor/NoParamsInterceptor.java new file mode 100644 index 0000000..dab1a3f --- /dev/null +++ b/core/src/main/java/com/chwl/core/interceptor/NoParamsInterceptor.java @@ -0,0 +1,43 @@ +package com.chwl.core.interceptor; + + +import java.io.IOException; + +import okhttp3.HttpUrl; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + *

添加头部参数

+ * + * @author jiahui + * date 2017/12/7 + */ +public final class NoParamsInterceptor implements Interceptor { + // 自定义特殊的http 头key + private final static String NO_PARAMS_HEADER_KEY = "_NO_PARAMS_HEADER_"; + //自定义特殊http 请求头,带有这个http头的参数经过这个过滤器后会去掉所有的http请求参数 + public final static String NO_PARAMS_HEADER = NO_PARAMS_HEADER_KEY + ":1"; + + public NoParamsInterceptor() { + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request oldRequest = chain.request(); + if (oldRequest.headers().get(NO_PARAMS_HEADER_KEY) != null){ + HttpUrl.Builder urlBuilder = new HttpUrl.Builder() + .scheme(oldRequest.url().scheme()) + .host(oldRequest.url().host()) + .encodedPath(oldRequest.url().encodedPath()); + Request.Builder reqBuilder = new Request.Builder(); + reqBuilder.url(urlBuilder.build()); + reqBuilder.headers(oldRequest.headers()); + return chain.proceed(reqBuilder.build()); + }else{ + return chain.proceed(oldRequest); + } + + } +} diff --git a/core/src/main/java/com/chwl/core/interceptor/ParamsInterceptor.java b/core/src/main/java/com/chwl/core/interceptor/ParamsInterceptor.java new file mode 100644 index 0000000..bde78c6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/interceptor/ParamsInterceptor.java @@ -0,0 +1,169 @@ +package com.chwl.core.interceptor; + + +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import com.chwl.library.language.LanguageHelper; +import com.example.lib_utils.TelephonyUtils; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.utils.APIEncryptUtil; +import com.chwl.core.utils.OaidUtil; +import com.chwl.library.utils.codec.MD5Utils; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +import okhttp3.FormBody; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.Interceptor; +import okhttp3.MultipartBody; +import okhttp3.Request; +import okhttp3.Response; +import okio.Buffer; + +/** + *

公参拦截器

+ * + * @author jiahui + * date 2017/12/13 + */ +public class ParamsInterceptor implements Interceptor { + + private Map mHttpParams; + + // 运营商码 + private String operatorCode; + + // 运营商码的获取时间 + private long operatorCodeTime; + + public ParamsInterceptor(Map params) { + this.mHttpParams = params; + } + + @NonNull + @Override + public Response intercept(Chain chain) throws IOException { + Request oldRequest = chain.request(); + + if (mHttpParams == null || mHttpParams.isEmpty()) { + return chain.proceed(oldRequest.newBuilder().build()); + } + + if (!TextUtils.isEmpty(OaidUtil.getOaid()) && !mHttpParams.containsKey("oaid")) { + mHttpParams.put("oaid", OaidUtil.getOaid()); + mHttpParams.put("oaidMd5", MD5Utils.getMD5String(OaidUtil.getOaid())); + } + Map paramsMap = new HashMap<>(); + + if ("GET".equals(oldRequest.method())) { +// Log.e("ParamsInterceptor","timestamp:"+timestamp + "method:"+oldRequest.method()+" url: " + oldRequest.url()); + for (int i = 0; i < oldRequest.url().querySize(); i++) { + paramsMap.put(oldRequest.url().queryParameterName(i), oldRequest.url().queryParameterValue(i)); + } + + } else if ("POST".equals(oldRequest.method()) || "DELETE".equals(oldRequest.method())) { +// Log.e("ParamsInterceptor","timestamp:"+timestamp + "method:"+oldRequest.method()+" url: " + oldRequest.url()); + for (int i = 0; i < oldRequest.url().querySize(); i++) { + paramsMap.put(oldRequest.url().queryParameterName(i), oldRequest.url().queryParameterValue(i)); + } + if (oldRequest.body() != null) { +// Log.e("ParamsInterceptor", "body length: " + oldRequest.body().contentLength()); + if (oldRequest.body() instanceof FormBody) { + FormBody oldFormBody = (FormBody) oldRequest.body(); + for (int i = 0; i < oldFormBody.size(); i++) { + paramsMap.put(oldFormBody.name(i), oldFormBody.value(i)); + } + + } else if (oldRequest.body() instanceof MultipartBody) { + + } else { + try { + if (PathFilter.isNeedFilter(oldRequest)) { + //发布接口不走这个流程,春节后再做改动 + + } else { + Buffer buffer = new Buffer(); + oldRequest.body().writeTo(buffer); + String content = buffer.readString(Charset.forName("UTF-8")); +// Log.e("ParamsInterceptor", "timestamp:"+timestamp + "body : " + content); + paramsMap.putAll(APIEncryptUtil.urlEncodeToMap(content)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + +// Log.e("ParamsInterceptor", " url: " + oldRequest.url()+ " params Map : " + paramsMap.toString()); + + long uid = 0; + String ticket; + + uid = AuthModel.get().getCurrentUid(); + ticket = AuthModel.get().getTicket(); + if (ticket == null) { + ticket = ""; + } + + String timestamp = String.valueOf(System.currentTimeMillis()); + paramsMap.put("pub_timestamp", timestamp); + // paramsMap.putAll(mHttpParams); + paramsMap.remove("ticket");//服务器要求移除ticket,后签名 + + String signStr = ""; + try { +// Log.e("ParamsInterceptor", " url: " + oldRequest.url()+ " encrypt params Map : " + paramsMap.toString()); + signStr = APIEncryptUtil.paramsToSign(paramsMap); + } catch (Exception e) { + e.printStackTrace(); + } +// Log.e("ParamsInterceptor", " url: " + oldRequest.url()+ " final params Map : " + paramsMap.toString()); +// Log.e("ParamsInterceptor", "timestamp:"+timestamp + " url: " + oldRequest.url()+ " sign : " + signStr); + + Headers headers = oldRequest.headers().newBuilder() + .add("pub_ticket", ticket) + .add("pub_uid", uid == 0 ? "" : String.valueOf(uid)) + .add("Accept-Language", LanguageHelper.INSTANCE.getCurrentLanguageType()) + .build(); + HttpUrl.Builder builder = oldRequest.url().newBuilder() + .scheme(oldRequest.url().scheme()) + .host(oldRequest.url().host()); + for (Map.Entry entry : mHttpParams.entrySet()) { + builder.addQueryParameter(entry.getKey(), entry.getValue()); + } + builder.addQueryParameter("pub_timestamp", timestamp); + builder.addQueryParameter("pub_sign", signStr); + addHeaderWithOperator(builder); + Request newRequest = oldRequest.newBuilder() + .method(oldRequest.method(), oldRequest.body()) + .headers(headers) + .url(builder.build()) + .build(); + return chain.proceed(newRequest); + + } + + private void addHeaderWithOperator(HttpUrl.Builder builder) { + if ((System.currentTimeMillis() - operatorCodeTime) > (1000 * 60 * 10)) { + loadOperatorCode(); + } + builder.addQueryParameter("mcc", operatorCode); + } + + private void loadOperatorCode() { + if (TelephonyUtils.INSTANCE.isChinaOperator()) { + operatorCode = "460"; + } else { + operatorCode = TelephonyUtils.INSTANCE.getOperatorFirstSim(); + } + operatorCodeTime = System.currentTimeMillis(); + } +} diff --git a/core/src/main/java/com/chwl/core/interceptor/PathFilter.java b/core/src/main/java/com/chwl/core/interceptor/PathFilter.java new file mode 100644 index 0000000..bb60841 --- /dev/null +++ b/core/src/main/java/com/chwl/core/interceptor/PathFilter.java @@ -0,0 +1,36 @@ +package com.chwl.core.interceptor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import okhttp3.Request; + +/** + * create by lvzebiao @2020/1/17 + */ +public class PathFilter { + + private static List filterList() { + List list = new ArrayList<>(); + list.add("/dynamic/square/publish"); + list.add("dynamic/square/publish"); + return list; + } + + public static boolean isNeedFilter(Request oldRequest) { + try { + String requestPath = oldRequest.url().url().getPath(); + List list = filterList(); + for (String filterPath : list) { + if (Objects.equals(filterPath, requestPath)) { + return true; + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return false; + } + +} diff --git a/core/src/main/java/com/chwl/core/interceptor/TimeSyncInterceptor.kt b/core/src/main/java/com/chwl/core/interceptor/TimeSyncInterceptor.kt new file mode 100644 index 0000000..0d3a8f2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/interceptor/TimeSyncInterceptor.kt @@ -0,0 +1,57 @@ +package com.chwl.core.interceptor + +import com.example.lib_utils.AppUtils +import com.example.lib_utils.ServiceTime +import com.chwl.core.utils.LogUtils +import com.chwl.library.utils.NetworkUtils +import okhttp3.Headers +import okhttp3.Interceptor +import okhttp3.Response + +/** + * Created by Max on 2023/10/25 14:17 AM + * Desc:服务器时间同步器 + */ +class TimeSyncInterceptor : Interceptor { + + private var minResponseTime = Long.MAX_VALUE + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val startTime = System.nanoTime() + val proceed = chain.proceed(request) + val lastTime = System.nanoTime() - startTime + val headers = proceed.headers + calibration(lastTime, headers) + return proceed + } + + private fun calibration(responseTime: Long, headers: Headers?) { + if (headers == null) { + return + } + + //如果这一次的请求响应时间小于上一次,则更新本地维护的时间 + if (responseTime >= minResponseTime) { + return + } + + try { + // 网络无法使用时,不能同步时间 + if (!NetworkUtils.isNetworkAvailable(AppUtils.getApp())) { + return + } + // 网络响应头包含Date字段(世界时间) + // 利用Interceptor记录每次请求响应时间,如果本次网络操作的时间小于上一次网络操作的时间,则获取Date字段,转换时区后更新本地 + val date = headers.getDate("Date") + LogUtils.d("TimeSyncInterceptor date:$date time:${date?.time}") + date?.let { + //客户端请求过程一般大于比收到响应时间耗时,所以没有简单的除2 加上去,而是直接用该时间 + ServiceTime.refreshServiceTime(it.time) + minResponseTime = responseTime + } + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/kick/IKickModel.java b/core/src/main/java/com/chwl/core/kick/IKickModel.java new file mode 100644 index 0000000..31cf33f --- /dev/null +++ b/core/src/main/java/com/chwl/core/kick/IKickModel.java @@ -0,0 +1,15 @@ +package com.chwl.core.kick; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.base.IModel; + +public interface IKickModel extends IModel { + + /** + * 发送消息到公屏上 + * @param chatRoomMessage + */ + void sendMessage(ChatRoomMessage chatRoomMessage); + + void onSendRoomMessageSuccess(ChatRoomMessage msg); +} diff --git a/core/src/main/java/com/chwl/core/kick/KickModel.java b/core/src/main/java/com/chwl/core/kick/KickModel.java new file mode 100644 index 0000000..96632f8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/kick/KickModel.java @@ -0,0 +1,118 @@ +package com.chwl.core.kick; + +import android.annotation.SuppressLint; +import android.os.Handler; +import android.os.Message; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.chwl.core.base.BaseModel; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.super_admin.util.SaMsgUtil; +import com.chwl.core.utils.net.RxHelper; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; + +/** + * Created by huangmeng1 on 2018/3/31. + */ + +public class KickModel extends BaseModel implements IKickModel { + + private static KickModel model; + private UiHandler handler; + + public static KickModel get() { + if (model == null) { + synchronized (KickModel.class) { + if (model == null) { + model = new KickModel(); + } + } + } + return model; + } + + private KickModel() { + magicQueue = new ArrayList<>(); + handler = new UiHandler(this); + } + + @SuppressLint("CheckResult") + @Override + public void sendMessage(ChatRoomMessage chatRoomMessage) { + if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment(); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE || + attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_KICK_MIC) { + Single.timer(150, TimeUnit.MILLISECONDS) + .compose(RxHelper.handleSchedulers()) + .subscribe(aLong -> notifyMessageView(chatRoomMessage)); + } + } + } + + private void notifyMessageView(ChatRoomMessage chatRoomMessage) { + IMNetEaseManager.get() + .getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MSG) + .setChatRoomMessage(chatRoomMessage)); + } + + @Override + public void onSendRoomMessageSuccess(ChatRoomMessage msg) { + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE + || attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_KICK_MIC + //超管公屏判断 + || SaMsgUtil.isNeedAddToMsgView(attachment)) { + magicQueue.add(msg); + if (magicQueue.size() == 1) { + handler.sendEmptyMessageDelayed(0, 150); + } + } + } + } + + private List magicQueue; + + private static class UiHandler extends Handler { + WeakReference mReference; + + UiHandler(KickModel magicModel) { + mReference = new WeakReference<>(magicModel); + } + + @Override + public void handleMessage(Message msg) { + KickModel magicModel = mReference.get(); + if (magicModel == null) return; + super.handleMessage(msg); + if (magicModel.magicQueue.size() > 0) { + ChatRoomMessage attachment = magicModel.magicQueue.remove(0); + if (attachment != null) + magicModel.parseChatRoomAttachment(attachment); + } + + if (magicModel.magicQueue.size() > 0) { + sendEmptyMessageDelayed(0, 150); + } + } + } + + private void parseChatRoomAttachment(ChatRoomMessage attachment) { + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MSG) + .setChatRoomMessage(attachment)); + } + +} diff --git a/core/src/main/java/com/chwl/core/level/UserLevelResourceType.java b/core/src/main/java/com/chwl/core/level/UserLevelResourceType.java new file mode 100644 index 0000000..4c3e337 --- /dev/null +++ b/core/src/main/java/com/chwl/core/level/UserLevelResourceType.java @@ -0,0 +1,14 @@ +package com.chwl.core.level; + +/** + *

+ * + * @author jiahui + * @date 2018/1/29 + */ +public interface UserLevelResourceType { + String EXPER_URL = "experUrl"; + String CHARM_URL = "charmUrl"; + String EXPER_LEVEL_SEQ = "experLevelSeq"; + String CHARM_LEVEL_SEQ = "charmLevelSeq"; +} diff --git a/core/src/main/java/com/chwl/core/level/UserLevelVo.java b/core/src/main/java/com/chwl/core/level/UserLevelVo.java new file mode 100644 index 0000000..e4866ce --- /dev/null +++ b/core/src/main/java/com/chwl/core/level/UserLevelVo.java @@ -0,0 +1,139 @@ +package com.chwl.core.level; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + *

+ * + * @author jiahui + * @date 2018/1/29 + */ +public class UserLevelVo implements Serializable { + /** -- 用户当前经验值 */ + public long experAmount; + /** -- 经验等级图片链接 */ + public String experUrl; + /** -- 经验等级名称 */ + public String experLevelName; + /** -- 经验等级组名 */ + public String experLevelGrp; + /** -- 用户当前魅力值 */ + public long charmAmount; + /** -- 魅力等级图片链接 */ + public String charmUrl; + /** -- 魅力等级名称 */ + public String charmLevelName; + /** -- 魅力等级组名 */ + public String charmLevelGrp; + /** -- 经验等级序号 */ + public int experLevelSeq; + /** -- 魅力等级序号 */ + public int charmLevelSeq; + + public long getExperAmount() { + return experAmount; + } + + public void setExperAmount(long experAmount) { + this.experAmount = experAmount; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public String getExperLevelName() { + return experLevelName; + } + + public void setExperLevelName(String experLevelName) { + this.experLevelName = experLevelName; + } + + public String getExperLevelGrp() { + return experLevelGrp; + } + + public void setExperLevelGrp(String experLevelGrp) { + this.experLevelGrp = experLevelGrp; + } + + public long getCharmAmount() { + return charmAmount; + } + + public void setCharmAmount(long charmAmount) { + this.charmAmount = charmAmount; + } + + public String getCharmUrl() { + return charmUrl; + } + + public void setCharmUrl(String charmUrl) { + this.charmUrl = charmUrl; + } + + public String getCharmLevelName() { + return charmLevelName; + } + + public void setCharmLevelName(String charmLevelName) { + this.charmLevelName = charmLevelName; + } + + public String getCharmLevelGrp() { + return charmLevelGrp; + } + + public void setCharmLevelGrp(String charmLevelGrp) { + this.charmLevelGrp = charmLevelGrp; + } + + public int getExperLevelSeq() { + return experLevelSeq; + } + + public void setExperLevelSeq(int experLevelSeq) { + this.experLevelSeq = experLevelSeq; + } + + public int getCharmLevelSeq() { + return charmLevelSeq; + } + + public void setCharmLevelSeq(int charmLevelSeq) { + this.charmLevelSeq = charmLevelSeq; + } + + public Map toMap(Map map) { + if (map == null) { + map = new HashMap<>(); + } + map.put(UserLevelResourceType.EXPER_URL, experUrl); + map.put(UserLevelResourceType.CHARM_URL, charmUrl); + return map; + } + + /** + * 进入公聊大厅时候的特殊处理,加入 经验等级序号 和 魅力等级序号 + * @param map + * @return + */ + public Map toMapForPublicChatHall(Map map) { + if (map == null) { + map = new HashMap<>(); + } + map.put(UserLevelResourceType.EXPER_URL, experUrl); + map.put(UserLevelResourceType.CHARM_URL, charmUrl); + map.put(UserLevelResourceType.EXPER_LEVEL_SEQ, experLevelSeq); + map.put(UserLevelResourceType.CHARM_LEVEL_SEQ, charmLevelSeq); + return map; + } +} diff --git a/core/src/main/java/com/chwl/core/level/event/CharmLevelUpEvent.java b/core/src/main/java/com/chwl/core/level/event/CharmLevelUpEvent.java new file mode 100644 index 0000000..be247c1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/level/event/CharmLevelUpEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.level.event; + +public class CharmLevelUpEvent { + + private String levelName; + + public String getLevelName() { + return levelName; + } + + public CharmLevelUpEvent setLevelName(String levelName) { + this.levelName = levelName; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/level/event/LevelUpEvent.java b/core/src/main/java/com/chwl/core/level/event/LevelUpEvent.java new file mode 100644 index 0000000..e839f24 --- /dev/null +++ b/core/src/main/java/com/chwl/core/level/event/LevelUpEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.level.event; + +public class LevelUpEvent { + + private String levelName; + + public LevelUpEvent setLevelName(String levelName) { + this.levelName = levelName; + return this; + } + + public String getLevelName() { + return levelName; + } +} diff --git a/core/src/main/java/com/chwl/core/linked/ILinkedModel.java b/core/src/main/java/com/chwl/core/linked/ILinkedModel.java new file mode 100644 index 0000000..cddabdc --- /dev/null +++ b/core/src/main/java/com/chwl/core/linked/ILinkedModel.java @@ -0,0 +1,13 @@ +package com.chwl.core.linked; + +import com.chwl.core.base.IModel; +import com.chwl.core.linked.bean.LinkedInfo; + + +public interface ILinkedModel extends IModel { + + void setLinkedInfo(LinkedInfo linkedInfo); + + LinkedInfo getLinkedInfo(); + +} diff --git a/core/src/main/java/com/chwl/core/linked/LinkedModel.java b/core/src/main/java/com/chwl/core/linked/LinkedModel.java new file mode 100644 index 0000000..30b6dee --- /dev/null +++ b/core/src/main/java/com/chwl/core/linked/LinkedModel.java @@ -0,0 +1,37 @@ +package com.chwl.core.linked; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.linked.bean.LinkedInfo; + +public class LinkedModel extends BaseModel implements ILinkedModel{ + + private LinkedInfo linkedInfo; + + private volatile static ILinkedModel model; + + public static ILinkedModel get() { + if (model == null) { + synchronized (LinkedModel.class) { + if (model == null) { + model = new LinkedModel(); + } + } + } + return model; + } + + private LinkedModel() { + } + + + @Override + public void setLinkedInfo(LinkedInfo linkedInfo) { + this.linkedInfo = linkedInfo; + } + + @Override + public LinkedInfo getLinkedInfo() { + return linkedInfo; + } + +} diff --git a/core/src/main/java/com/chwl/core/linked/bean/LinkedInfo.java b/core/src/main/java/com/chwl/core/linked/bean/LinkedInfo.java new file mode 100644 index 0000000..07c75b8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/linked/bean/LinkedInfo.java @@ -0,0 +1,25 @@ +package com.chwl.core.linked.bean; + +import lombok.Data; + +/** + * Created by chenran on 2017/8/11. + */ +@Data +public class LinkedInfo { + + private String channel; + private String roomUid; + private String uid; + /** + * 2:房间 3:网页 4:家族首页 5:话题客态页 6:动态详情 7:私聊页 + */ + private String type; + private boolean isNewUser; + private String familyId; + private String url; + private String worldId;// 话题ID + private String dynamicId; //动态id + private String inviteCode; + +} diff --git a/core/src/main/java/com/chwl/core/linked/event/LinkMeInfoUpdateEvent.java b/core/src/main/java/com/chwl/core/linked/event/LinkMeInfoUpdateEvent.java new file mode 100644 index 0000000..af499ee --- /dev/null +++ b/core/src/main/java/com/chwl/core/linked/event/LinkMeInfoUpdateEvent.java @@ -0,0 +1,20 @@ +package com.chwl.core.linked.event; + +import com.chwl.core.linked.bean.LinkedInfo; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/11/7 + */ +@Data +public class LinkMeInfoUpdateEvent { + private LinkedInfo linkedInfo; + + public LinkMeInfoUpdateEvent(LinkedInfo linkedInfo) { + this.linkedInfo = linkedInfo; + } +} + diff --git a/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyInfo.java b/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyInfo.java new file mode 100644 index 0000000..c03d8fd --- /dev/null +++ b/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyInfo.java @@ -0,0 +1,113 @@ +package com.chwl.core.luckymoney.bean; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; + +/** + * Created by MadisonRong on 31/05/2018. + */ +@Data +public class LuckyMoneyInfo implements Serializable { + + /** + * 红包未打开(红包刚发出来的时候的状态) + */ + public static final int STATE_NOT_OPEN = 1; + + /** + * 红包已经打开(领取红包成功的时候的状态) + */ + public static final int STATE_DID_OPEN = 2; + + /** + * 红包已过期 + */ + public static final int STATE_OUT_DATE = 3; + + /** + * 红包已派完 + */ + public static final int STATE_OUT_BONUS = 4; + + /** + * 红包不存在 + */ + public static final int LUCKY_MONEY_NOT_EXIST = 7016; + + /** + * 该红包已经领取过 + */ + public static final int LUCKY_MONEY_HAS_TOKEN = 7018; + + /** + * 红包已经领完 + */ + public static final int LUCKY_MONEY_HAS_GONE = 7019; + + /** + * 红包已经过期 + */ + public static final int LUCKY_MONEY_HAS_EXPIRED = 7022; + + private String nick; + private String avatar; + private int claimStatus; + private int status; + private int senderUid; // 发红包者的 UID + private int id; + private int uid; + private int familyId; + private double amount; + private int num; // 红包数量 + private String coinName; + private String message; // 祝福语 + private int tId; + private int groupId; + private double fee; + private double claimedAmount; // 已领取金额 + private int claimedNum; // 已领取数量 + private String receiveUid; // 收红包者的 UID + private String receiveNick;// 收红包者的昵称 + + public static Map convertToMap(LuckyMoneyInfo luckyMoneyInfo) { + Map localExtension = new HashMap<>(); + localExtension.put("nick", luckyMoneyInfo.getNick()); + localExtension.put("avatar", luckyMoneyInfo.getAvatar()); + localExtension.put("claimStatus", luckyMoneyInfo.getClaimStatus()); + localExtension.put("id", luckyMoneyInfo.getId()); + localExtension.put("uid", luckyMoneyInfo.getSenderUid()); + localExtension.put("senderUid", luckyMoneyInfo.getSenderUid()); + localExtension.put("familyId", luckyMoneyInfo.getFamilyId()); + localExtension.put("amount", luckyMoneyInfo.getAmount()); + localExtension.put("num", luckyMoneyInfo.getNum()); + localExtension.put("coinName", luckyMoneyInfo.getCoinName()); + localExtension.put("message", luckyMoneyInfo.getMessage()); + localExtension.put("teamId", luckyMoneyInfo.getTId()); + localExtension.put("groupId", luckyMoneyInfo.getGroupId()); + return localExtension; + } + + public static LuckyMoneyInfo convertMapToObject(Map localExtension) { + LuckyMoneyInfo luckyMoneyInfo = new LuckyMoneyInfo(); + if (localExtension != null) { + luckyMoneyInfo.setNick(String.valueOf(localExtension.get("nick"))); + luckyMoneyInfo.setAvatar(String.valueOf(localExtension.get("avatar"))); + luckyMoneyInfo.setClaimStatus((Integer) localExtension.get("claimStatus")); + luckyMoneyInfo.setId((Integer) localExtension.get("id")); + luckyMoneyInfo.setUid((Integer) localExtension.get("uid")); + luckyMoneyInfo.setSenderUid((Integer) localExtension.get("senderUid")); + luckyMoneyInfo.setFamilyId((Integer) localExtension.get("familyId")); + luckyMoneyInfo.setAmount(Double.parseDouble(String.valueOf(localExtension.get("amount")))); + luckyMoneyInfo.setNum((Integer) localExtension.get("num")); + luckyMoneyInfo.setCoinName(String.valueOf(localExtension.get("coinName"))); + luckyMoneyInfo.setMessage(String.valueOf(localExtension.get("message"))); + luckyMoneyInfo.setTId((Integer) localExtension.get("teamId")); + luckyMoneyInfo.setGroupId((Integer) localExtension.get("groupId")); + } + return luckyMoneyInfo; + } + +} diff --git a/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyRecordsInfo.java b/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyRecordsInfo.java new file mode 100644 index 0000000..1cf327f --- /dev/null +++ b/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyRecordsInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.luckymoney.bean; + +import java.util.List; + +import lombok.Data; + +/** + * Created by MadisonRong on 29/06/2018. + */ +@Data +public class LuckyMoneyRecordsInfo { + + private LuckyMoneyInfo redPacket; + private List records; +} diff --git a/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyUserInfo.java b/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyUserInfo.java new file mode 100644 index 0000000..a6cbf2e --- /dev/null +++ b/core/src/main/java/com/chwl/core/luckymoney/bean/LuckyMoneyUserInfo.java @@ -0,0 +1,18 @@ +package com.chwl.core.luckymoney.bean; + +import lombok.Data; + +/** + * Created by MadisonRong on 29/06/2018. + */ +@Data +public class LuckyMoneyUserInfo { + + private String uid; + private String avatar; + private String nick; + private double amount; // 领取的金额 + private boolean luckiest; // 是否为手气最佳 + private long createTime; + private long updateTime; +} diff --git a/core/src/main/java/com/chwl/core/magic/IMagicModel.java b/core/src/main/java/com/chwl/core/magic/IMagicModel.java new file mode 100644 index 0000000..60cd46f --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/IMagicModel.java @@ -0,0 +1,71 @@ +package com.chwl.core.magic; + +import androidx.annotation.Nullable; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.base.IModel; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.bean.MagicMultiReceiverInfo; +import com.chwl.core.magic.bean.MagicReceivedInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IMagicModel extends IModel { + + /** + * 发送云信自定义信息 + * + * @param magicReceivedInfo - + * @return - + */ + Single sendSingleMagicMessage(MagicReceivedInfo magicReceivedInfo); + /** + * 如果本地没有魔法礼物列表,加载网络的数据 + * + * @return 返回魔法表情的列表 + */ + Single> getLocalMagicList(); + /** + * 获取魔法表情列表 + * @return + */ + Single> getRemoteMagicList(); + + /** + * 在轰趴房送某人魔法 + * + * @param magicId - + * @param targetUid - + * @return - + */ + Single sendMagic(int magicId, long targetUid); + + /** + * 发送魔法表情给一个或多个用户 + * @param magicId + * @param magicNum + * @param targetUids + * @return + */ + Single sendBatchMagic(int magicId, int magicNum, List targetUids, boolean isWholeMic); + + /** + * 获取收到的所有魔法 + * @param uid + * @return + */ + Single> getTargetMagicWall(long uid); + + /** + * 根据id获取魔法表情 + * @param magicId + * @return + */ + @Nullable + MagicInfo getMagicInfo(int magicId); + + void handleMagicGiftValue(CustomAttachment attachment); +} diff --git a/core/src/main/java/com/chwl/core/magic/MagicModel.java b/core/src/main/java/com/chwl/core/magic/MagicModel.java new file mode 100644 index 0000000..2e89d2d --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/MagicModel.java @@ -0,0 +1,524 @@ +package com.chwl.core.magic; + +import android.annotation.SuppressLint; +import android.os.Handler; +import android.os.Message; + +import androidx.annotation.Nullable; + +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.exception.UnKnowException; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.MagicAllMicAttachment; +import com.chwl.core.im.custom.bean.MagicAttachment; +import com.chwl.core.im.custom.bean.MagicBatchAttachment; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.bean.MagicMultiReceiverInfo; +import com.chwl.core.magic.bean.MagicReceivedInfo; +import com.chwl.core.magic.bean.MultiMagicReceivedInfo; +import com.chwl.core.magic.exception.MagicOutOfDateException; +import com.chwl.core.magic.toolbox.MagicToolbox; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.pay.PayModel; +import com.chwl.core.retry.ImRetryManager; +import com.chwl.core.retry.RetryChatRoomMessage; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.giftvalue.bean.GiftValueCommonUpdate; +import com.chwl.core.room.giftvalue.helper.GiftValueMrg; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.FreezeException; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.functions.Consumer; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by yudi + * on 2018/3/16. + */ + +public class MagicModel extends BaseModel implements IMagicModel { + private volatile static IMagicModel model; + private Api api; + private UiHandler handler; + private List mMagicInfos; + + private MagicModel() { + api = RxNet.create(Api.class); + magicQueue = new ArrayList<>(); + handler = new UiHandler(this); + } + + + public static IMagicModel get() { + if (model == null) { + synchronized (MagicModel.class) { + if (model == null) { + model = new MagicModel(); + } + } + } + return model; + } + + private List magicQueue; + + private static class UiHandler extends Handler { + WeakReference mReference; + + UiHandler(MagicModel magicModel) { + mReference = new WeakReference<>(magicModel); + } + + @Override + public void handleMessage(Message msg) { + MagicModel magicModel = mReference.get(); + if (magicModel == null) return; + super.handleMessage(msg); + if (magicModel.magicQueue.size() > 0) { + CustomAttachment attachment = magicModel.magicQueue.remove(0); + if (attachment != null) + magicModel.parseChatRoomAttachment(attachment); + } + + if (magicModel.magicQueue.size() > 0) { + sendEmptyMessageDelayed(0, 150); + } + } + } + + /** + * 发送表情成功 + * @param msg + */ + private void onSendRoomMessageSuccess(ChatRoomMessage msg) { + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC) { + magicQueue.add(attachment); + if (magicQueue.size() == 1) { + handler.sendEmptyMessageDelayed(0, 150); + } + } + } + } + + private void parseChatRoomAttachment(CustomAttachment attachment) { + if (attachment.getFirst() != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC) return; + if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_SINGLE_MAGIC) { + MagicAttachment magicAttachment = (MagicAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVED_SINGLE_MAGIC) + .setMagicReceivedInfo(magicAttachment.getMagicReceivedInfo())); + + } else if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_MAGIC) { + MagicAllMicAttachment multiGiftAttachment = (MagicAllMicAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVED_ALL_MIC_MAGIC) + .setMultiMagicReceivedInfo(multiGiftAttachment.getMultiMagicReceivedInfo())); + + } else if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_MAGIC) { + MagicBatchAttachment magicBatchAttachment = (MagicBatchAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVED_ALL_MIC_MAGIC) + .setMultiMagicReceivedInfo(MagicToolbox.transformToMultiMagicReceivedInfo( + magicBatchAttachment.getMagicMultiReceiverInfo()))); + + } + handleMagicGiftValue(attachment); + } + + @Override + public void handleMagicGiftValue(CustomAttachment attachment) { + if (attachment == null) { + return; + } + if (attachment.getFirst() != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC) return; + if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_SINGLE_MAGIC) { + MagicAttachment magicAttachment = (MagicAttachment) attachment; + + //礼物值 + GiftValueMrg.get().updateMicQueueCharm(GiftValueCommonUpdate + .transformMagic(magicAttachment.getMagicReceivedInfo())); + + } else if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_MAGIC) { + MagicAllMicAttachment multiGiftAttachment = (MagicAllMicAttachment) attachment; + + //礼物值 + GiftValueMrg.get().updateMicQueueCharm(GiftValueCommonUpdate + .transformMagic(multiGiftAttachment.getMultiMagicReceivedInfo())); + + } else if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_MAGIC) { + MagicBatchAttachment magicBatchAttachment = (MagicBatchAttachment) attachment; + + //礼物值 + GiftValueMrg.get().updateMicQueueCharm(GiftValueCommonUpdate + .transformMagic(magicBatchAttachment.getMagicMultiReceiverInfo())); + } + } + + /** + * 发送全麦魔法云信自定义信息 + * + * @param multiMagicReceivedInfo - + * @return - + */ + + private Single sendMultiMagicMessage(MultiMagicReceivedInfo multiMagicReceivedInfo) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null || multiMagicReceivedInfo == null) + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_01))); + long myUid = AuthModel.get().getCurrentUid(); + MagicAllMicAttachment magicAttachment = new MagicAllMicAttachment(); + magicAttachment.setUid(String.valueOf(myUid)); + magicAttachment.setMultiMagicReceivedInfo(multiMagicReceivedInfo); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + magicAttachment + ); + return ImRetryManager.sendRoomGiftMsg(message); + } + + /** + * 发送单人或多人魔法云信自定义信息 + * + * @return - + */ + private Single sendBatchMagicMessage(MagicMultiReceiverInfo magicMultiReceiverInfo) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null || magicMultiReceiverInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_02))); + } + long myUid = AuthModel.get().getCurrentUid(); + MagicBatchAttachment batchAttachment = new MagicBatchAttachment(); + batchAttachment.setMagicMultiReceiverInfo(magicMultiReceiverInfo); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + batchAttachment + ); + return ImRetryManager.sendRoomGiftMsg(message); + } + + + /** + * 发送云信自定义信息 + * + * @param magicReceivedInfo - + * @return - + */ + @Override + public Single sendSingleMagicMessage(MagicReceivedInfo magicReceivedInfo) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null || magicReceivedInfo == null) + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_03))); + long myUid = AuthModel.get().getCurrentUid(); + MagicAttachment magicAttachment = new MagicAttachment(); + magicAttachment.setUid(String.valueOf(myUid)); + magicAttachment.setMagicReceivedInfo(magicReceivedInfo); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + magicAttachment + ); + return IMNetEaseManager.get().sendChatRoomMessage(message, false); + } + + /** + * 如果本地没有魔法礼物列表,加载网络的数据 + * + * @return 返回魔法表情的列表 + */ + @Override + public Single> getLocalMagicList() { + if (!ListUtils.isListEmpty(mMagicInfos)) { + return Single.just(mMagicInfos); + } else { + return getRemoteMagicList(); + } + } + + /** + * 获取魔法表情列表 + * @return + */ + @Override + public Single> getRemoteMagicList() { + return api.getMagicList().compose(new Transformer<>()).flatMap(response -> { + if (response == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_04))); + } else if (response.isSuccess() && response.getData() != null) { + return Single.just(filterNobleMagic(response.getData())); + } else if (response.isSuccess() && response.getData() == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_05))); + } else { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_06) + response.getCode())); + } + }).doOnSuccess(response -> { + this.mMagicInfos = filterNobleMagic(response); + }); + } + + /** + * 过滤贵族魔法 + * + * @param magicInfos - + * @return - + */ + private List filterNobleMagic(List magicInfos) { + List infos = new ArrayList<>(); + if (magicInfos == null) return infos; + for (int i = 0; i < magicInfos.size(); i++) { + magicInfos.get(i).setMagicType(MagicInfo.ROOM_MAGIC); + if (!magicInfos.get(i).isNobleMagic()) + infos.add(magicInfos.get(i)); + } + return infos; + } + + /** + * 在轰趴房送某人魔法 + * + * @param magicId - + * @param targetUid - + * @return - + */ + @Override + public Single sendMagic(final int magicId, final long targetUid) { + MagicInfo magicInfo = getMagicInfo(magicId); + if (magicInfo == null) return Single.error(new UnKnowException()); + long uid = AuthModel.get().getCurrentUid(); + long roomUid = AvRoomDataManager.get().mCurrentRoomInfo.getUid(); + String ticket = AuthModel.get().getTicket(); + return api.sendSingleMagic(uid, targetUid, magicId, roomUid, ticket) + .compose(new Transformer<>()) + .flatMap(response -> { + MagicReceivedInfo magicReceivedInfo = response.getData(); + if (response.isSuccess() && magicReceivedInfo != null) { + // 为MagicReceivedInfo增加svga(路径,爆炸)的特效 + magicReceivedInfo.setPathAnim(magicInfo.getPathAnim()); + magicReceivedInfo.setExplodeAnim(magicInfo.getExplodeAnim()); + magicReceivedInfo.setPosition(magicInfo.getPosition()); + return Single.just(magicReceivedInfo); + } else if (response.getCode() == BalanceNotEnoughExeption.code) { + return Single.error(new BalanceNotEnoughExeption(response.getMessage())); + } else if (response.getCode() == MagicOutOfDateException.code) { + return Single.error(new MagicOutOfDateException(response.getMessage())); + } + return Single.error(new UnKnowException()); + }) + .doOnSuccess(new Consumer() { + @Override + public void accept(MagicReceivedInfo magicReceivedInfo) throws Exception { + // 扣钱 + PayModel.get().minusGold(magicInfo.getPrice()); + // 发送自定义消息,成功后显示动画 + MagicModel.get() + .sendSingleMagicMessage(magicReceivedInfo) + .subscribe((chatRoomMessage, throwable) -> onSendMagicMessage(chatRoomMessage, throwable)); + } + }); + } + + /** + * 发送魔法表情给一个或多个用户 + * @param magicId + * @param magicNum + * @param targetUids + * @param isWholeMic + * @return + */ + @Override + public Single sendBatchMagic(int magicId, int magicNum, final List targetUids, boolean isWholeMic) { + MagicInfo magicInfo = getMagicInfo(magicId); + if (magicInfo == null || targetUids == null || targetUids.size() <= 0) { + return Single.error(new UnKnowException()); + } + long uid = AuthModel.get().getCurrentUid(); + long roomUid = AvRoomDataManager.get().mCurrentRoomInfo.getUid(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < targetUids.size(); i++) { + sb.append(targetUids.get(i)); + sb.append(","); + } + sb.deleteCharAt(sb.length() - 1); + return api.sendBatchMagic(uid, roomUid, sb.toString(), magicId, magicNum) + .compose(new Transformer<>()) + .flatMap(response -> { + + MagicMultiReceiverInfo magicMultiReceiverInfo = response.getData(); + if (response.isSuccess() && magicMultiReceiverInfo != null) { + // 为MultiMagicReceivedInfo增加svga(路径,爆炸)的特效 + magicMultiReceiverInfo.setPathAnim(magicInfo.getPathAnim()); + magicMultiReceiverInfo.setExplodeAnim(magicInfo.getExplodeAnim()); + magicMultiReceiverInfo.setPosition(magicInfo.getPosition()); + return Single.just(magicMultiReceiverInfo); + } else if (response.getCode() == BalanceNotEnoughExeption.code) { + return Single.error(new BalanceNotEnoughExeption(response.getMessage())); + } else if (response.getCode() == MagicOutOfDateException.code) { + return Single.error(new MagicOutOfDateException(response.getMessage())); + } else if (response.getCode() == FreezeException.code) { + return Single.error(new FreezeException(response.getMessage())); + } + return Single.error(new UnKnowException()); + }) + .doOnSuccess(new Consumer() { + @SuppressLint("CheckResult") + @Override + public void accept(MagicMultiReceiverInfo magicMultiReceiverInfo) throws Exception { + // 扣钱 + PayModel.get().minusGold(magicInfo.getPrice() * targetUids.size()); + // 发送自定义消息,成功后显示动画 + Single single = sendBatchMagicMessage(magicMultiReceiverInfo); + if (isWholeMic) { + single = sendMultiMagicMessage(MagicToolbox.transformToMultiMagicReceivedInfo(magicMultiReceiverInfo)); + } + //noinspection ResultOfMethodCallIgnored + single.subscribe((retryChatRoomMessage, throwable) + -> onSendMagicMessage(retryChatRoomMessage.getMessage(), throwable)); + } + }); + } + + private void onSendMagicMessage(ChatRoomMessage chatRoomMessage, Throwable throwable) { + if (chatRoomMessage != null) { + // 显示公屏 + IMNetEaseManager.get().addMessagesImmediately(chatRoomMessage); + // 显示动画 + onSendRoomMessageSuccess(chatRoomMessage); + } else { + throwable.printStackTrace(); + } + } + + /** + * 获取收到的所有魔法 + * @param uid + * @return + */ + @Override + public Single> getTargetMagicWall(long uid) { + return api.getReceivedMagicList(uid, 1).compose(new Transformer<>()).flatMap(response -> { + if (response == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_07))); + } else if (response.isSuccess() && response.getData() != null) { + return Single.just(response.getData()); + } else if (response.isSuccess() && response.getData() == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_08))); + } else { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_magic_magicmodel_09) + response.getCode())); + } + }); + } + + /** + * 根据id获取魔法表情 + * @param magicId + * @return + */ + @Nullable + @Override + public MagicInfo getMagicInfo(int magicId) { + if (ListUtils.isListEmpty(mMagicInfos)) return null; + int index = mMagicInfos.indexOf(new MagicInfo(magicId)); + if (index == -1) return null; + return mMagicInfos.get(index); + } + + private interface Api { + + /** + * 送魔法给一个或者多个人 + * + * @param uid - 送魔法的人的id + * @param targetUids - 被送魔法的人的ids + * @param giftMagicId - 魔法id + * @param roomUid - 房主id + * @param giftMagicNum - 礼物数量 + * @return - + */ + @FormUrlEncoded + @POST("/giftmagic/v1/batch/send") + Single> sendBatchMagic(@Field("uid") long uid, + @Field("roomUid") long roomUid, + @Field("targetUids") String targetUids, + @Field("giftMagicId") int giftMagicId, + @Field("giftMagicNum") int giftMagicNum); + + + /** + * 送魔法给全麦 + * + * @param uid - 送魔法的人的id + * @param targetUids - 被送魔法的人的id + * @param giftMagicId - 魔法id + * @param roomUid - 房主id + * @param ticket - token + * @return - + */ + @FormUrlEncoded + @POST("/giftmagic/v1/send/wholemicro") + Single> sendAllMicMagic(@Field("uid") long uid, + @Field("targetUids") String targetUids, + @Field("giftMagicId") int giftMagicId, + @Field("roomUid") long roomUid, + @Field("ticket") String ticket); + + /** + * 送魔法给一个人 + * + * @param uid - 送魔法的人的id + * @param targetUid - 被送魔法的人的id + * @param giftMagicId - 魔法id + * @param roomUid - 房主id + * @param ticket - token + * @return - + */ + @FormUrlEncoded + @POST("/giftmagic/v1/send/single") + Single> sendSingleMagic(@Field("uid") long uid, + @Field("targetUid") long targetUid, + @Field("giftMagicId") int giftMagicId, + @Field("roomUid") long roomUid, + @Field("ticket") String ticket); + + /** + * 获取魔法列表 + * + * @return + */ + @POST("/giftmagic/list") + Single>> getMagicList(); + + /** + * 获取收到的所有魔法 + * + * @param uid - 对应的uid + * @param orderType - 排序类型 1是按数量排序 2是按收到时间排序 + * @return - + */ + @GET("/magicwall/get") + Single>> getReceivedMagicList(@Query("uid") long uid, + @Query("orderType") int orderType); + } +} diff --git a/core/src/main/java/com/chwl/core/magic/ObjectPool.java b/core/src/main/java/com/chwl/core/magic/ObjectPool.java new file mode 100644 index 0000000..3adde32 --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/ObjectPool.java @@ -0,0 +1,108 @@ +package com.chwl.core.magic; + +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** + * copy rx里面的对象池,以后可以自己实现,这里可能有未知的bug + * + * @param + */ +public abstract class ObjectPool { + Queue pool; + final int minSize; + final int maxSize; + private final long validationInterval; + private final AtomicReference> periodicTask; + + public ObjectPool() { + this(0, 10, 67L); + } + + private ObjectPool(int min, int max, long validationInterval) { + this.minSize = min; + this.maxSize = max; + this.validationInterval = validationInterval; + this.periodicTask = new AtomicReference(); + this.initialize(min); + this.start(); + } + + public T borrowObject() { + Object object; + if ((object = this.pool.poll()) == null) { + object = this.createObject(); + } + + return (T) object; + } + + public void returnObject(T object) { + if (object != null) { + this.pool.offer(object); + } + } + + public void shutdown() { + Future f = this.periodicTask.getAndSet(null); + if (f != null) { + f.cancel(false); + } + + } + + public void start() { + while (this.periodicTask.get() == null) { + ScheduledExecutorService w = Executors.newSingleThreadScheduledExecutor();//GenericScheduledExecutorService.getInstance(); + ScheduledFuture f; + try { + f = w.scheduleAtFixedRate(() -> { + int size = ObjectPool.this.pool.size(); + int sizeToBeRemoved; + int i; + if (size < ObjectPool.this.minSize) { + sizeToBeRemoved = ObjectPool.this.maxSize - size; + + for (i = 0; i < sizeToBeRemoved; ++i) { + ObjectPool.this.pool.add(ObjectPool.this.createObject()); + } + } else if (size > ObjectPool.this.maxSize) { + sizeToBeRemoved = size - ObjectPool.this.maxSize; + + for (i = 0; i < sizeToBeRemoved; ++i) { + ObjectPool.this.pool.poll(); + } + } + + }, this.validationInterval, this.validationInterval, TimeUnit.SECONDS); + } catch (RejectedExecutionException var4) { + var4.printStackTrace(); + return; + } + + if (this.periodicTask.compareAndSet(null, f)) { + return; + } + + f.cancel(false); + } + + } + + protected abstract T createObject(); + + private void initialize(int min) { + this.pool = new ConcurrentLinkedQueue(); + for (int i = 0; i < min; ++i) { + this.pool.add(this.createObject()); + } + + } +} diff --git a/core/src/main/java/com/chwl/core/magic/bean/MagicInfo.java b/core/src/main/java/com/chwl/core/magic/bean/MagicInfo.java new file mode 100644 index 0000000..8719e46 --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/bean/MagicInfo.java @@ -0,0 +1,94 @@ +package com.chwl.core.magic.bean; + +import com.google.gson.annotations.SerializedName; +import com.chwl.core.gift.bean.GiftInfo; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by yudi + * on 2018/3/16. + */ +@Data +public class MagicInfo implements Serializable { + @SerializedName("magicId") + private int magicId; + @SerializedName("magicName") + private String name; + @SerializedName("magicPrice") + private long price; + @SerializedName("magicIcon") + private String icon; + @SerializedName("magicSvgUrl") + private String pathAnim; + @SerializedName("effectSvgUrl") + private String explodeAnim; + /** + * 播放的位置,中心播放还是随机播放 + */ + @SerializedName("playPosition") + private int position = POS_NONE; + @SerializedName("nobleId") + private int nobleId; + /** + * 是不是要播放全屏爆炸特效 + */ + private byte showExplodeAnim; + /** + * 收到魔法的数量,只存在与魔法墙 + */ + @SerializedName("amount") + private int amount; + + /** + * 魔法类型 + * @see #ROOM_MAGIC 房间魔法 + * @see #MONSTER_MAGIC 打怪兽魔法 + */ + private int magicType; + + /** + * 魔法伤害值(暂时用于打怪兽) + */ + private String impactValue; + + /** + * 消费类型,1:钻石礼物,2:萝卜礼物 + */ + private int consumeType = GiftInfo.CONSUME_TYPE_GOLD; + + public static final int ROOM_MAGIC = 0; + public static final int MONSTER_MAGIC = 1; + + public static final int POS_CENTER = 1; + public static final int POS_NONE = 0; + + public MagicInfo() { + + } + + public MagicInfo(int magicId) { + this.magicId = magicId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MagicInfo magicInfo = (MagicInfo) o; + + return magicId == magicInfo.magicId; + } + + @Override + public int hashCode() { + return magicId; + } + + public boolean isNobleMagic() { + return nobleId > 0; + } +} diff --git a/core/src/main/java/com/chwl/core/magic/bean/MagicMultiReceiverInfo.java b/core/src/main/java/com/chwl/core/magic/bean/MagicMultiReceiverInfo.java new file mode 100644 index 0000000..23dcc1d --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/bean/MagicMultiReceiverInfo.java @@ -0,0 +1,45 @@ +package com.chwl.core.magic.bean; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.google.gson.annotations.SerializedName; +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; + +import java.io.Serializable; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * 发送魔法成功后的实体 + * Created by yudi + * on 2018/3/16. + */ +@Getter +@Setter +public class MagicMultiReceiverInfo extends RoomGiftValue implements Serializable { + private long uid; + private String avatar; + private String nick; + private List targetUsers; + @SerializedName("magicSvgUrl") + @JSONField(name = "magicSvgUrl") + private String pathAnim; + @SerializedName("effectSvgUrl") + @JSONField(name = "effectSvgUrl") + private String explodeAnim; + @SerializedName("giftMagicId") + @JSONField(name = "giftMagicId") + private int magicId; + @SerializedName("giftMagicNum") + @JSONField(name = "giftMagicNum") + private int number;//收到魔法的数量 + @SerializedName("playEffect") + @JSONField(name = "playEffect") + private boolean needShowExplode;//是否需要播放爆炸特效 + @SerializedName("playPosition") + @JSONField(name = "playPosition") + private int position; + + +} diff --git a/core/src/main/java/com/chwl/core/magic/bean/MagicReceivedInfo.java b/core/src/main/java/com/chwl/core/magic/bean/MagicReceivedInfo.java new file mode 100644 index 0000000..0943a5f --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/bean/MagicReceivedInfo.java @@ -0,0 +1,51 @@ +package com.chwl.core.magic.bean; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.google.gson.annotations.SerializedName; +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * 发送魔法成功后的实体 + * Created by yudi + * on 2018/3/16. + */ +@Getter +@Setter +public class MagicReceivedInfo extends RoomGiftValue implements Serializable { + private long uid; + private String avatar; + private String nick; + private long targetUid; + private String targetAvatar; + private String targetNick; + @SerializedName("magicSvgUrl") + @JSONField(name = "magicSvgUrl") + private String pathAnim; + @SerializedName("effectSvgUrl") + @JSONField(name = "effectSvgUrl") + private String explodeAnim; + @SerializedName("giftMagicId") + @JSONField(name = "giftMagicId") + private int magicId; + @SerializedName("playPosition") + @JSONField(name = "playPosition") + private int position; + /** + * 收到魔法的数量 + */ + @SerializedName("giftMagicNum") + @JSONField(name = "giftMagicNum") + private int number; + /** + * 是否需要播放爆炸特效 + */ + @SerializedName("playEffect") + @JSONField(name = "playEffect") + private boolean needShowExplodeEffect; + +} diff --git a/core/src/main/java/com/chwl/core/magic/bean/MagicReceiver.java b/core/src/main/java/com/chwl/core/magic/bean/MagicReceiver.java new file mode 100644 index 0000000..7388aa7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/bean/MagicReceiver.java @@ -0,0 +1,17 @@ +package com.chwl.core.magic.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/3/11 + */ +@Data +public class MagicReceiver implements Serializable { + private long uid; + private String nick; + private String avatar; +} diff --git a/core/src/main/java/com/chwl/core/magic/bean/MultiMagicReceivedInfo.java b/core/src/main/java/com/chwl/core/magic/bean/MultiMagicReceivedInfo.java new file mode 100644 index 0000000..baf11a3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/bean/MultiMagicReceivedInfo.java @@ -0,0 +1,44 @@ +package com.chwl.core.magic.bean; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.google.gson.annotations.SerializedName; +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; + +import java.io.Serializable; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * 全麦发送礼物后收到的实体 + * Created by yudi + * on 2018/3/20. + */ +@Getter +@Setter +public class MultiMagicReceivedInfo extends RoomGiftValue implements Serializable { + private long uid; + private String avatar; + private String nick; + private List targetUids; + @SerializedName("magicSvgUrl") + @JSONField(name = "magicSvgUrl") + private String pathAnim; + @SerializedName("effectSvgUrl") + @JSONField(name = "effectSvgUrl") + private String explodeAnim; + @SerializedName("giftMagicId") + @JSONField(name = "giftMagicId") + private int magicId; + @SerializedName("giftMagicNum") + @JSONField(name = "giftMagicNum") + private int number; + @SerializedName("playEffect") + @JSONField(name = "playEffect") + private boolean needShowExplode; + @SerializedName("playPosition") + @JSONField(name = "playPosition") + private int position; + +} diff --git a/core/src/main/java/com/chwl/core/magic/exception/MagicOutOfDateException.java b/core/src/main/java/com/chwl/core/magic/exception/MagicOutOfDateException.java new file mode 100644 index 0000000..e0fe764 --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/exception/MagicOutOfDateException.java @@ -0,0 +1,15 @@ +package com.chwl.core.magic.exception; + +/** + * 魔法礼物过期 + * Created by yudi + * on 2018/3/20. + */ + +public class MagicOutOfDateException extends Throwable { + public final static int code = 8000; + + public MagicOutOfDateException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/magic/toolbox/MagicToolbox.java b/core/src/main/java/com/chwl/core/magic/toolbox/MagicToolbox.java new file mode 100644 index 0000000..4d5c9b5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/magic/toolbox/MagicToolbox.java @@ -0,0 +1,36 @@ +package com.chwl.core.magic.toolbox; + +import com.chwl.core.magic.bean.MagicMultiReceiverInfo; +import com.chwl.core.magic.bean.MagicReceiver; +import com.chwl.core.magic.bean.MultiMagicReceivedInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author jack + * @Description + * @Date 2019/3/11 + */ +public class MagicToolbox { + public static MultiMagicReceivedInfo transformToMultiMagicReceivedInfo(MagicMultiReceiverInfo magicMultiReceiverInfo) { + MultiMagicReceivedInfo receivedInfo = new MultiMagicReceivedInfo(); + receivedInfo.setUid(magicMultiReceiverInfo.getUid()); + receivedInfo.setAvatar(magicMultiReceiverInfo.getAvatar()); + receivedInfo.setNick(magicMultiReceiverInfo.getNick()); + receivedInfo.setMagicId(magicMultiReceiverInfo.getMagicId()); + receivedInfo.setNumber(magicMultiReceiverInfo.getNumber()); + receivedInfo.setPathAnim(magicMultiReceiverInfo.getPathAnim()); + receivedInfo.setNeedShowExplode(magicMultiReceiverInfo.isNeedShowExplode()); + receivedInfo.setExplodeAnim(magicMultiReceiverInfo.getExplodeAnim()); + receivedInfo.setPosition(magicMultiReceiverInfo.getPosition()); + List targetUids = new ArrayList<>(); + for (MagicReceiver targetUser : magicMultiReceiverInfo.getTargetUsers()) { + targetUids.add(targetUser.getUid()); + } + receivedInfo.setTargetUids(targetUids); + receivedInfo.setGiftValueVos(magicMultiReceiverInfo.getGiftValueVos()); + receivedInfo.setCurrentTime(magicMultiReceiverInfo.getCurrentTime()); + return receivedInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/AudioEngineManager.java b/core/src/main/java/com/chwl/core/manager/AudioEngineManager.java new file mode 100644 index 0000000..e14fccc --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/AudioEngineManager.java @@ -0,0 +1,371 @@ +package com.chwl.core.manager; + + +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.pref.CommonPref; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.chwl.core.manager.agora.RtcEngineManager; +import com.chwl.core.manager.trtc.TRtcEngineManager; +import com.chwl.core.room.bean.RoomAudioSdkType; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.utils.LogUtils; + +import io.agora.rtc2.Constants; +import io.agora.rtc2.video.VideoCanvas; + + +public class AudioEngineManager { + private static final String TAG = "AudioEngineManager"; + + private IAudioEngine iAudioEngine; + + private static final class Helper { + private static final AudioEngineManager INSTANCE = new AudioEngineManager(); + } + + private AudioEngineManager() { + } + + public static AudioEngineManager get() { + return Helper.INSTANCE; + } + + public void initRtcEngine(EngineType engineType) { + switch (engineType) { + case TYPE_TRTC: + this.iAudioEngine = TRtcEngineManager.get(); + break; + case TYPE_AGORA: + default: + this.iAudioEngine = RtcEngineManager.get(); + break; + } + } + + public void startRtcEngine(long uid, String audioSdkType) { + LogUtils.d("audioSdkType= " + audioSdkType); + RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (curRoomInfo == null) return; + if (iAudioEngine != null) iAudioEngine.leaveChannel(); + + if (audioSdkType == null) audioSdkType = RoomAudioSdkType.SHENGWANG; + + switch (audioSdkType) { + case RoomAudioSdkType.TRTC: + initRtcEngine(EngineType.TYPE_TRTC); + break; + default: + initRtcEngine(EngineType.TYPE_AGORA); + break; + } + joinChannel(curRoomInfo.getRoomId(), uid); + setRole(Constants.CLIENT_ROLE_AUDIENCE); + } + + public void joinChannel(long channelId, long uid) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.enterChannel(channelId, uid); + } + + public void leaveChannel() { + if (this.iAudioEngine == null) return; + this.iAudioEngine.leaveChannel(); + } + + public void resetChannel() { + if (this.iAudioEngine == null) return; + this.iAudioEngine.resetChannel(); + } + + public void reEnterChannel(long channelId, long uid) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.reEnterChannel(channelId, uid); + } + + //设置静音 + public void setRemoteMute(boolean mute) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.setRemoteMute(mute); + } + + public boolean isRemoteMute() { + if (this.iAudioEngine == null) { + LogUtil.e(TAG, "isRemoteMute called before Audio engine init!!!!"); + return false; + } + return iAudioEngine.isRemoteMute(); + } + + public void stopLocalAudio() { + if (this.iAudioEngine != null) { + this.iAudioEngine.stopLocalAudio(); + } + } + + /** + * 设置角色,上麦,下麦(调用) + * + * @param role CLIENT_ROLE_AUDIENCE: 听众 ,ROLE_BROADCASTER: 主播 + */ + public boolean setRole(int role) { + return this.iAudioEngine != null && this.iAudioEngine.setRole(role); + } + + public boolean isAudienceRole() { + if (this.iAudioEngine == null) { + LogUtil.e(TAG, "isAudienceRole called before Audio engine init!!!!"); + return false; + } + return this.iAudioEngine.isAudienceRole(); + } + + /** + * 设置是否能说话,静音,人自己的行为 + * + * @param mute true:静音,false:不静音 + */ + public void setMute(boolean mute) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.setMute(mute); + } + + public boolean isMute() { + if (this.iAudioEngine == null) { + LogUtil.e(TAG, "isMute called before Audio engine init!!!!"); + return false; + } + return this.iAudioEngine.isMute(); + } + + public void delayStartPlay(long pushUid) { + // 针对使用 无界聊天室 SDK + zego SDK 的情况下, + // zego 进房比无界聊天室快的时候,会导致无法播放麦上用户的流 + // 所以,在 zego 引擎那边已经预先缓存了流的 ID,这里重新播放已经缓存的流 + // 就是为了解决两个 SDK 不一致导致的进房后听不到声音的问题 + this.iAudioEngine.delayStartPlay(pushUid); + } + + /** + * 切换耳返 + * + * @param enable + */ + public void switchLoopBack(boolean enable) { + if (this.iAudioEngine == null) { + LogUtil.e(TAG, "switchLoopBack called before Audio engine init!!!!"); + return; + } + this.iAudioEngine.switchLoopBack(enable); + } + + public boolean isEnableLoopBack() { + return this.iAudioEngine != null && this.iAudioEngine.isEnableLoopBack(); + } + + public void connectOtherRoom(String roomId, long userUid) { + if (iAudioEngine != null) { + iAudioEngine.connectOtherRoom(roomId, userUid); + } + } + + public void disconnectOtherRoom() { + if (iAudioEngine != null) { + iAudioEngine.disconnectOtherRoom(); + } + } + + //音乐播放相关---------------begin-------------------------- + public void adjustAudioMixingVolume(int volume) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.adjustAudioMixingVolume(volume); + } + + public void adjustRecordingSignalVolume(int volume) { + if (this.iAudioEngine == null) return; +// this.iAudioEngine.adjustRecordingSignalVolume(volume); + if (notRecord) { + this.iAudioEngine.adjustRecordingSignalVolume(0); + } else { + this.iAudioEngine.adjustRecordingSignalVolume(volume); + } + } + + private boolean notRecord = false; + public void setNotRecord(boolean isNotRecord){ + notRecord = isNotRecord; + if (notRecord) { + adjustRecordingSignalVolume(0); + } else { + adjustRecordingSignalVolume(VolumeSetting.getVoiceVolume()); + } + } + + public boolean isNotRecord() { + return notRecord; + } + + + public int startAudioMixing(String filePath, boolean loopback, int cycle) { + if (this.iAudioEngine == null) { + return 0; + } + return this.iAudioEngine.startAudioMixing(filePath, loopback, cycle); + } + + public int stopAudioMixing() { + if (this.iAudioEngine == null) { + return 0; + } + return this.iAudioEngine.stopAudioMixing(); + } + + public int resumeAudioMixing() { + if (this.iAudioEngine == null) { + return 0; + } + return this.iAudioEngine.resumeAudioMixing(); + } + + public int pauseAudioMixing() { + if (this.iAudioEngine == null) { + return 0; + } + return this.iAudioEngine.pauseAudioMixing(); + } + + public int getAudioMixingCurrentPosition() { + if (this.iAudioEngine == null) { + return 0; + } + return this.iAudioEngine.getAudioMixingCurrentPosition(); + } + + public int getAudioMixingDuration() { + if (this.iAudioEngine == null) { + return 0; + } + return this.iAudioEngine.getAudioMixingDuration(); + } + //音乐播放相关---------------end-------------------------- + + + public void setRemoteMute(long uid, boolean mute) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.setRemoteMute(uid, mute); + } + + public void setChatRoomOnlineStatus(boolean status) { + if (this.iAudioEngine == null) return; + this.iAudioEngine.setChatRoomOnlineStatus(status); + } + + //--------------------------asmr-------------------------- + + public void setASMRMode(boolean enable) { + if (this.iAudioEngine == null) return; + + this.iAudioEngine.setASMRMode(enable); + } + + //ktv相关---------------begin-------------------------- + private boolean isPlaying; + private boolean isAccompany = true; + private boolean isPush; + private boolean isOpenKtv; + private boolean isLive; + private int remoteUid; + private double accompanyVoice = 0.5; + private double personVoice = 0.5; + + public synchronized void openKtvModel() { + + } + + public synchronized void closeKtvModel() { + + } + + public void stopPush() { + + } + + public synchronized void startMv(String url) { + + } + + public synchronized void setupRemoteVideo(VideoCanvas canvas, int remoteUid) { + + } + + + public void playOrPause() { + isPlaying = !isPlaying; + } + + public void changeAudioStream() { + isAccompany = !isAccompany; + } + + public void setAccompanyVoice(double progress) { + if (progress < 0 || progress > 1) { + return; + } + accompanyVoice = progress; + } + + public void setPersonVoice(double progress) { + if (progress < 0 || progress > 1) { + return; + } + personVoice = progress; + } + + public boolean isPlaying() { + return isPlaying; + } + + public boolean isPush() { + return isPush; + } + + public boolean isAccompany() { + return isAccompany; + } + + public boolean isOpenKtv() { + return isOpenKtv; + } + + public boolean isLive() { + return isLive; + } + + public void setLive(boolean live) { + isLive = live; + } + + public int getRemoteUid() { + return remoteUid; + } + + public double getAccompanyVoice() { + return accompanyVoice; + } + + public double getPersonVoice() { + return personVoice; + } + + + public double getPlayPos() { + return 0; + } + + public int getPlayDuration() { + return 0; + } + + //ktv相关---------------end-------------------------- + + +} diff --git a/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java b/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java new file mode 100644 index 0000000..354b479 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/AvRoomDataManager.java @@ -0,0 +1,1440 @@ +package com.chwl.core.manager; + +import android.annotation.SuppressLint; +import android.graphics.Point; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.Log; +import android.util.SparseArray; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.MutableLiveData; + +import com.alibaba.fastjson2.JSON; +import com.chwl.core.DemoCache; +import com.chwl.core.R; +import com.chwl.core.XConstants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.im.custom.bean.RoomPkBean; +import com.chwl.core.room.bean.BoxSwitchVo; +import com.chwl.core.room.bean.FindLoveSwitchVo; +import com.chwl.core.room.bean.RightBottomIconConfig; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomModeType; +import com.chwl.core.room.bean.SeizeTreasureSwitchVo; +import com.chwl.core.room.bean.SimplePartyRoomInfo; +import com.chwl.core.room.event.RoomClearScreenEvent; +import com.chwl.core.room.game.GameStatus; +import com.chwl.core.room.giftvalue.helper.GiftValueMrg; +import com.chwl.core.super_admin.SuperAdminDataMrg; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.support.room.AudioRoomContext; +import com.chwl.core.support.room.RoomContext; +import com.chwl.core.user.UserModel; +import com.chwl.core.utils.CurrentTimeUtils; +import com.chwl.core.utils.LogUtils; +import com.chwl.core.utils.StringFormatUtils; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; +import com.netease.nimlib.sdk.NIMChatRoomSDK; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.chatroom.constant.MemberType; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomStatusChangeData; +import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData; +import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.NotificationType; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Objects; + +import io.reactivex.Single; +import io.reactivex.processors.PublishProcessor; +import lombok.Getter; + +/** + *

全局变量,存储房间相关信息(周期与房间一样)

+ * + * @author jiahui + * @date 2017/12/11 + */ +public final class AvRoomDataManager { + /** + * 不在麦上的位置值 + */ + public final static int POSITON_NOT_ON_MIC = Integer.MIN_VALUE; + /** + * 大头麦位的位置 + */ + public static final int POSITION_BOSS_MIC = -1; + /** + * VIP麦位的位置 + */ + public static final int POSITION_VIP_MIC = 999; + + /** + * 游戏房最小坑位数 + */ + public static final int GAME_DEF_MIC_COUNT = 9; + + /************************************************公屏数据****************************************************/ + + private final static int MAX_MESSAGE_SIZE = 2000;//公屏最多展示条数 + + public static final int MIC_POS_19_ROOM_BOSS = 6; + public static final int ITEM_POS_19_ROOM_BOSS = 7; + /** + * 房间所有超管 + */ + @NonNull + public final List roomSuperAdminList = new ArrayList<>(); + public final MutableLiveData roomPkLiveData = new MutableLiveData<>(); + /** + * 是否需要关麦,用户自己的行为,不受房主管理员的管理,与闭麦状态相同,当闭麦这个值就是ture; + * 2022/9/1更改:无论什么情况上麦,默认都是关麦的! + */ + public final boolean mIsNeedOpenMic = true; + private final PublishProcessor> chatRoomMsgProcessor = PublishProcessor.create(); + @Nullable + public RoomInfo mCurrentRoomInfo; + public BoxSwitchVo mBoxSwitchVo; + public FindLoveSwitchVo mFindLoveSwitchVo; + public EnterChatRoomResultData mEnterChatRoomResultData; + /** + * 房间创建者 + */ + public ChatRoomMember mRoomCreateMember; + /** + * 自己的实体 + */ + public ChatRoomMember mOwnerMember; + /** + * 房间管理员集合 + */ + public List mRoomManagerList; + /** + * 房间普通成员 + */ + public List mRoomNormalMemberList; + /** + * 房间受限成员:禁言用户和黑名单用户都属于受限用户 + */ + public List mRoomLimitMemberList; + /** + * 固定成员:包括创建者,管理员,普通用户,受限用户 + */ + public List mRoomFixedMemberList; + /** + * 房间所有人员 + */ + public List mRoomAllMemberList; + /** + * 麦序位置信息:对应的位置,坑位信息(用户成员,坑位状态) + */ + public SparseArray mMicQueueMemberMap; + /** + * 记录每一个麦位的中心点位置 + */ + public SparseArray mMicPointMap; + /** + * 坑位上用户的头饰 + */ + public HashMap> mHeadWearMap; + /** + * 是否需要打开礼物特效 + */ + public boolean mIsNeedGiftEffect = true; + /** + * 自己是否操作过礼物特效 + */ + public boolean haveSelfChange; + public volatile ChatRoomStatusChangeData chatRoomStatusChangeData; + /** + * 龙珠状态 + */ + public boolean haveStartDragon; + /** + * 房间收藏状态 + */ + public boolean isRoomFans; + /** + * 房间收藏状态 + */ + public boolean isFirstFollow = true; + /** + * 龙珠数组 + */ + public List dragons; + // 房主基本信息 + public String nick; + public int gender; + public String avatar; + //房间的activity是否被销毁 + public boolean roomNoDestory; + public List phrases = new ArrayList<>(Arrays.asList(ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_01), ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_02), ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_03), ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_04))); + /** + * 表示自己是否在队列中 + */ + public boolean myIsInQueue = false; + //TRTC SIG + public String trtcSig; + //清空公屏消息时间 + public long clearScreenTime; + public boolean showPkBeginTime; + public long pkBeginTime; + /** + * 一起玩 按钮开关 + */ + private boolean isAllowedToPlayTogether; + /**zZ + * 是否从师徒任务中跳转进来的 + */ + private boolean isFromMentoring; + /** + * 嗨聊房列表 + */ + private List roomUidList; + /** + * 是否在嗨聊房 + */ + private boolean isParty; + /** + * 红包发送权限:1 厅内红包 2 全服红包 3 厅内红包+全服红包 + */ + private int redEnvelopeType; + /** + * 缓存师父的 UID + */ + private long masterUid; + /** + * 公屏数据 + */ + private List chatRoomMessages = new LinkedList<>(); + /** + * 记录该用户被踢房间的uid + */ + private Map kickOutRoomUids; + + @Getter + private SeizeTreasureSwitchVo mSeizeTreasureSwitchVo; + + @Getter + private boolean hasRoomAlbum; + + @Getter + private double serialValue; + + private List unlockedRoomAlbumPhotos = new ArrayList<>(); + + public RightBottomIconConfig rightBottomIconConfig; + + public boolean hasAvRoomAct = false; + + private AvRoomDataManager() { + mRoomManagerList = new ArrayList<>(); + mRoomFixedMemberList = new ArrayList<>(); + mRoomAllMemberList = new ArrayList<>(); + mMicQueueMemberMap = new SparseArray<>(); + mRoomNormalMemberList = new ArrayList<>(); + mRoomLimitMemberList = new ArrayList<>(); + roomUidList = new ArrayList<>(); + dragons = new ArrayList<>(); + mHeadWearMap = new HashMap<>(); + observerChatRoomMessage(); + } + + public static AvRoomDataManager get() { + return Helper.INSTANCE; + } + + public void release() { + EventBus.getDefault().post(new RoomClearScreenEvent()); + IMNetEaseManager.get().release(); + AudioEngineManager.get().leaveChannel(); + clear(); + chatRoomDataRelease(); + //清空缓存 + IMNetEaseManager.get().mCacheRoomQueueInfo = null; + if (UserModel.get().getCacheLoginUserInfo() != null) { + UserModel.get().getCacheLoginUserInfo().setGameStatus(GameStatus.STATUS_NOT_JOIN); + } + if (kickOutRoomUids != null) { + kickOutRoomUids.clear(); + kickOutRoomUids = null; + } + RoomContext context = AudioRoomContext.Companion.get(); + if (context != null) { + context.performStop(); + } + LogUtils.d(ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_05)); + } + + /** + * 云信的RoomInfo和我们服务端的RoomInfo是不同步的,需要单独保存一下有用到的字段 + * + * @param roomInfo + */ + + public void updateServiceRoomInfo(RoomInfo roomInfo) { + //我们自己服务端信息 + mCurrentRoomInfo = roomInfo; + mBoxSwitchVo = roomInfo.boxSwitchVo; + mFindLoveSwitchVo = roomInfo.findLoveDrawSwitchVo; + mSeizeTreasureSwitchVo = roomInfo.seizeTreasureSwitchVo; + phrases = roomInfo.getSpeakTemplate(); + nick = roomInfo.getNick(); + gender = roomInfo.getGender(); + avatar = roomInfo.getAvatar(); + isRoomFans = roomInfo.isRoomFans(); + trtcSig = roomInfo.getTrtcSig(); + clearScreenTime = roomInfo.getClearScreenTime(); + showPkBeginTime = roomInfo.isShowPkBeginTime(); + pkBeginTime = roomInfo.getPkBeginTime(); + redEnvelopeType = roomInfo.getRedEnvelopeType(); + hasRoomAlbum = roomInfo.isHasRoomAlbum(); + serialValue = roomInfo.getSerialValue(); + rightBottomIconConfig = roomInfo.rightBottomIconConfig; + } + + /** + * 获取麦上队列信息 + * + * @param micPosition 麦的位置 + * @return 对应队列信息 + */ + public RoomQueueInfo getRoomQueueMemberInfoByMicPosition(int micPosition) { + return mMicQueueMemberMap.get(micPosition); + } + + /** + * 获取麦上队列信息 + * + * @param account 用户的id + * @return 对应队列信息 + */ + @Nullable + public RoomQueueInfo getRoomQueueMemberInfoByAccount(String account) { + if (TextUtils.isEmpty(account)) return null; + RoomQueueInfo roomQueueInfo = null; + if (mMicQueueMemberMap == null) return null; + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember != null && + Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), account)) { + return roomQueueInfo; + } + } + return null; + } + + /** + * 获取麦上队列的Uid + * + * @param micPosition 麦的位置 + * @return 对应队列信息 + */ + public String getRoomQueueMemberUidByMicPosition(int micPosition) { + RoomQueueInfo roomQueueInfo = getRoomQueueMemberInfoByMicPosition(micPosition); + if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null) { + return roomQueueInfo.mChatRoomMember.getAccount(); + } + return null; + } + + /** + * 检查用户是否在坑上 + * + * @param account 用户的id + * @return 对应队列信息 + */ + public boolean checkIsOnMicByAccount(String account) { + if (TextUtils.isEmpty(account)) return false; + RoomQueueInfo roomQueueInfo = null; + if (mMicQueueMemberMap == null) return false; + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember != null && + Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), account)) { + return true; + } + } + return false; + } + + /** + * 清除房间成员信息 + */ + public void clearMembers() { + if (mOwnerMember != null) { + mOwnerMember = null; + } + if (mRoomCreateMember != null) { + mRoomCreateMember = null; + } + mRoomAllMemberList.clear(); + mRoomFixedMemberList.clear(); + mRoomManagerList.clear(); + mRoomLimitMemberList.clear(); + mRoomNormalMemberList.clear(); + roomSuperAdminList.clear(); + } + + public void clear() { + clearMembers(); + if (mEnterChatRoomResultData != null) { + mEnterChatRoomResultData = null; + } + if (mCurrentRoomInfo != null) { + mCurrentRoomInfo = null; + } + haveSelfChange = false; + GiftValueMrg.get().clearObsever(); + mMicQueueMemberMap.clear(); + + mHeadWearMap.clear(); + haveStartDragon = false; + myIsInQueue = false; + roomNoDestory = false; + SuperAdminDataMrg.get().clearData(); + roomPkLiveData.setValue(null); + isFirstFollow = true; + } + + + /** + * 更新在队列上的某个人ext字段,可以让它即时生效 + * + * @param account - + * @param map - + */ + public void updateQueueChatRoomMemberExtension(String account, Map map) { + if (TextUtils.isEmpty(account)) return; + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + int key = mMicQueueMemberMap.keyAt(i); + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(key); + if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) continue; + if (!account.equals(roomQueueInfo.mChatRoomMember.getAccount())) + continue; + roomQueueInfo.mChatRoomMember.setExtension(map); + } + } + + public void updateQueueChatRoomMemberExtension(SparseArray queue, ChatRoomMember chatRoomMember) { + int size = queue.size(); + if (chatRoomMember == null || chatRoomMember.getExtension() == null || + TextUtils.isEmpty(chatRoomMember.getAccount())) return; + for (int i = 0; i < size; i++) { + int key = queue.keyAt(i); + RoomQueueInfo roomQueueInfo = queue.get(key); + if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) continue; + if (!chatRoomMember.getAccount().equals(roomQueueInfo.mChatRoomMember.getAccount())) + continue; + roomQueueInfo.mChatRoomMember.setExtension(chatRoomMember.getExtension()); + } + } + + public ChatRoomMember getChatRoomMember(String uid) { + if (!ListUtils.isListEmpty(mRoomAllMemberList)) { + for (ChatRoomMember chatRoomMember : mRoomAllMemberList) { + if (Objects.equals(chatRoomMember.getAccount(), uid)) { + return chatRoomMember; + } + } + } + return null; + } + + /** + * 把成员从在线列表里去掉 + * + * @param uid + */ + public void removeChatRoomMember(String uid) { + if (!ListUtils.isListEmpty(mRoomAllMemberList)) { + Iterator iterator = mRoomAllMemberList.iterator(); + while (iterator.hasNext()) { + ChatRoomMember chatRoomMember = iterator.next(); + if (Objects.equals(chatRoomMember.getAccount(), uid)) { + iterator.remove(); + } + } + } + } + + public void addAdminMember(ChatRoomMember chatRoomMember) { + if (chatRoomMember == null || containsAdminMember(chatRoomMember.getAccount())) return; + AvRoomDataManager.get().addManagerMember(chatRoomMember); + } + + public boolean containsAdminMember(String uid) { + for (ChatRoomMember chatRoomMember : mRoomManagerList) { + if (Objects.equals(chatRoomMember.getAccount(), String.valueOf(uid))) { + return true; + } + } + return false; + } + + /** + * 判断该用户是第一次进来还是切换房间 + * + * @param roomUid 要进入房间的用户id + * @return + */ + public boolean isFirstEnterRoomOrChangeOtherRoom(long roomUid) { + return mCurrentRoomInfo == null || mCurrentRoomInfo.getUid() != roomUid; + } + + /*** + * 是否是房间创建者 + * @param currentUid + * @return + */ + public boolean isRoomOwner(String currentUid) { + return mCurrentRoomInfo != null && Objects.equals(String.valueOf(mCurrentRoomInfo.getUid()), currentUid); + } + + /*** + * 是否是房间创建者 + * @param currentUid + * @return + */ + public boolean isRoomOwner(long currentUid) { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getUid() == currentUid; + } + + /** + * 是否是自己 + */ + public boolean isOwner(String currentUid) { + return Objects.equals(currentUid, String.valueOf(AuthModel.get().getCurrentUid())); + } + + public boolean isCurrentRoom(long roomUid) { + return roomUid == getRoomUid(); + } + + /** + * 是否是自己 + */ + public boolean isOwner(long currentUid) { + return currentUid == AuthModel.get().getCurrentUid(); + } + + public boolean isRoomOwner() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getUid() == AuthModel.get().getCurrentUid(); + } + + void removeManagerMember(String account) { + if (ListUtils.isListEmpty(mRoomManagerList) || TextUtils.isEmpty(account)) return; + ListIterator iterator = mRoomManagerList.listIterator(); + for (; iterator.hasNext(); ) { + ChatRoomMember chatRoomMember = iterator.next(); + if (Objects.equals(chatRoomMember.getAccount(), account)) { + iterator.remove(); + break; + } + } + if (AvRoomDataManager.get().isOwner(account) && mOwnerMember != null) { + //自己是管理员被移除,恢复身份 + mOwnerMember.setMemberType(MemberType.NORMAL); + } + } + + public void addBlackMember(ChatRoomMember chatRoomMember) { + if (chatRoomMember == null || containsAdminMember(chatRoomMember.getAccount())) return; + mRoomLimitMemberList.add(chatRoomMember); + } + + public boolean containsBlackMember(String uid) { + for (ChatRoomMember chatRoomMember : mRoomLimitMemberList) { + if (Objects.equals(chatRoomMember.getAccount(), String.valueOf(uid))) { + return true; + } + } + return false; + } + + public void removeBlackMember(String account) { + if (ListUtils.isListEmpty(mRoomLimitMemberList) || TextUtils.isEmpty(account)) return; + ListIterator iterator = mRoomLimitMemberList.listIterator(); + while (iterator.hasNext()) { + ChatRoomMember chatRoomMember = iterator.next(); + if (Objects.equals(chatRoomMember.getAccount(), account)) { + iterator.remove(); + break; + } + } + } + + public boolean isGuess() { + return !isRoomAdmin() && !isRoomOwner(); + } + + public boolean isGuess(String account) { + return !isRoomAdmin(account) && !isRoomOwner(account); + } + + + public int getRoomType() { + if (mCurrentRoomInfo == null) { + return -1; + } + return mCurrentRoomInfo.getType(); + } + + /** + * 是否是房间管理员 + * + * @return - + */ + public boolean isRoomAdmin() { + return isRoomAdmin(String.valueOf(AuthModel.get().getCurrentUid())); + } + + public boolean isRoomAdmin(String account) { + if (ListUtils.isListEmpty(mRoomManagerList)) return false; + for (ChatRoomMember chatRoomMember : mRoomManagerList) { + if (Objects.equals(chatRoomMember.getAccount(), account)) { + return true; + } + } + return false; + } + + public boolean isRoomAdmin(long uid) { + return uid > 0 && isRoomAdmin(String.valueOf(uid)); + } + + /** + * 房主是否在线 + */ + public boolean isRoomOwnnerOnline() { + return mRoomCreateMember != null; + } + + /** + * 判断指定用户id是否在麦上 + * + * @param myUid 用户id + * @return - + */ + public boolean isOnMic(long myUid) { + return isOnMic(String.valueOf(myUid)); + } + + /** + * 判断指定用户id是否在麦上 + * + * @param myUid 用户id + * @return - + */ + public boolean isOnMic(String myUid) { + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null && Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), myUid)) { + return true; + } + } + return false; + } + + /** + * 排查有无同个人在 多个麦位上 + */ + public int isOnMicNum(String myUid) { + int num = 0; + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null && Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), myUid)) { + num++; + } + } + return num; + } + + /** + * 判断自己是否在麦上 + * + * @return - + */ + public boolean isOwnerOnMic() { + return isOnMic(AuthModel.get().getCurrentUid()); + } + + /** + * 根据用户id去获取当前用户在麦上的位置 + * + * @param currentUid - + * @return - + */ + public int getMicPosition(long currentUid) { + if (AvRoomDataManager.get().isLeaveMode() && AvRoomDataManager.get().isRoomOwner(currentUid)) { + return -1; + } + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null && Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), String.valueOf(currentUid))) { + return mMicQueueMemberMap.keyAt(i); + } + } + return POSITON_NOT_ON_MIC; + } + + /** + * 根据用户id去获取当前用户在麦上的位置 + * + * @param currentUid - + * @return - + */ + public int getMicPosition(String currentUid) { + return getMicPosition(Long.valueOf(currentUid)); + } + + /** + * 获取坑上没人的位置 + */ + public int findFreePosition() { + int size; + if (mMicQueueMemberMap != null && (size = mMicQueueMemberMap.size()) >= 0) { + for (int i = 0; i < size; i++) { + int key = mMicQueueMemberMap.keyAt(i); + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember == null) { + return key; + } + } + } + return Integer.MIN_VALUE; + } + + /** + * 获取坑上有多少人 + */ + public int getOnMicUserCount() { + int count = 0; + int size; + if (mMicQueueMemberMap != null && (size = mMicQueueMemberMap.size()) >= 0) { + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember != null) { + count++; + } + } + } + return count; + } + + /** + * 获取坑上没人且没上锁且最大6个坑位的位置 + */ + public int findGamePosition() { + if (mMicQueueMemberMap != null && mMicQueueMemberMap.size() >= getMgMicNum()) { + for (int i = 0; i < getMgMicNum(); i++) { + int key = mMicQueueMemberMap.keyAt(i); + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember == null && + (roomQueueInfo.mRoomMicInfo != null && !roomQueueInfo.mRoomMicInfo.isMicLock())) { + return key; + } + } + } + return Integer.MIN_VALUE; + } + + /** + * 当前房间是否正在游戏中 + */ + public boolean isGamePlaying() { + if (!isOpenGame()) return false; + if (mMicQueueMemberMap != null && mMicQueueMemberMap.size() >= getMgMicNum()) { + for (int i = 0; i < getMgMicNum(); i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember != null && + roomQueueInfo.mChatRoomMember.getGameStatus() == GameStatus.STATUS_PLAYING) { + return true; + } + } + } + return false; + } + + /** + * 是否正在游戏中 + */ + public boolean isSelfGamePlaying() { + return isGamePlaying(AvRoomDataManager.get().getMicPosition(AuthModel.get().getCurrentUid())); + } + + /** + * 是否正在游戏中 + */ + public boolean isGamePlaying(long uid) { + return isGamePlaying(AvRoomDataManager.get().getMicPosition(uid)); + } + + + /** + * 是否正在游戏中 + */ + public boolean isGamePlaying(int micPosition) { + if (!isOpenGame()) return false; + if (mMicQueueMemberMap != null && mMicQueueMemberMap.size() >= getMgMicNum()) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(micPosition); + return roomQueueInfo != null && + roomQueueInfo.mChatRoomMember != null && + roomQueueInfo.mChatRoomMember.getGameStatus() == GameStatus.STATUS_PLAYING; + } + return false; + } + + /** + * @return 游戏坑位, 最少6个, 低于6个不支持 + */ + public int getMgMicNum() { + return AvRoomDataManager.get().mCurrentRoomInfo == null ? GAME_DEF_MIC_COUNT : AvRoomDataManager.get().mCurrentRoomInfo.getMgMicNum(); + } + + /** + * 获取坑上没人的位置,排除房主的位置,也就是-1 + */ + public int findFreePositionNoOwner() { + int size; + if (mMicQueueMemberMap != null && (size = mMicQueueMemberMap.size()) > 0) { + for (int i = 0; i < size; i++) { + int key = mMicQueueMemberMap.keyAt(i); + if (key == -1) continue; + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember == null && !roomQueueInfo.mRoomMicInfo.isMicLock()) { + return key; + } + } + } + return Integer.MIN_VALUE; + } + + // 添加麦位信息 + public void addRoomQueueInfo(String micPosition, RoomQueueInfo roomQueueInfo) { + OtherExtKt.doLog(" 上麦 addRoomQueueInfo() 添加麦位信息 pos="+micPosition +" roomQueueInfo = "+ JSON.toJSONString(roomQueueInfo) + "/n"); + if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) return; + Integer position = Integer.valueOf(micPosition); + int size = AvRoomDataManager.get().mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + RoomQueueInfo temp = AvRoomDataManager.get().mMicQueueMemberMap.valueAt(i); + if (temp != null && temp.mChatRoomMember != null + && Objects.equals(temp.mChatRoomMember.getAccount(), roomQueueInfo.mChatRoomMember.getAccount())) { + //更新该位置麦序信息,同时也移除观察者 + if (temp.giftValueData != null) { + temp.giftValueData.removeObserver(); + } + + Log.i("remove roomMember", temp.mChatRoomMember.getAccount() + " " + temp.mChatRoomMember.getNick()); + mMicQueueMemberMap.put(AvRoomDataManager.get().mMicQueueMemberMap.keyAt(i), + new RoomQueueInfo(temp.mRoomMicInfo, null)); + } + } + mMicQueueMemberMap.put(position, roomQueueInfo); + } + + public void resetMicMembers() { + int size = mMicQueueMemberMap.size(); + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember != null) + roomQueueInfo.mChatRoomMember = null; + } + } + + // 添加麦位信息 + public void replaceMicQueue(SparseArray queue) { + if (queue == null) { + return; + } + mMicQueueMemberMap.clear(); + for (int i = 0; i < queue.size(); i++) { + OtherExtKt.doLog(" 上麦 replaceMicQueue() 添加麦位信息 pos="+i +" key = "+queue.keyAt(i)+" value = "+ JSON.toJSONString(queue.valueAt(i)) + "/n"); + mMicQueueMemberMap.put(queue.keyAt(i), queue.valueAt(i)); + } + } + + public int getMicSize(){ return mMicQueueMemberMap.size();} + + /** + * 是否是房主或管理员 + * + * @return - + */ + public boolean isManager() { + return isRoomAdmin() || isRoomOwner(); + } + + /** + * 是否是房主或管理员 + * + * @return - + */ + public boolean isManager(String account) { + return isRoomAdmin(account) || isRoomOwner(account); + } + + public void setAllRoomSuperAdminList(List data) { + roomSuperAdminList.clear(); + roomSuperAdminList.addAll(data); + } + + public void addRoomSuperAdmin(ChatRoomMember member) { + roomSuperAdminList.add(member); + } + + public void removeRoomSuperAdmin(String account) { + for (int i = 0; i < roomSuperAdminList.size(); i++) { + ChatRoomMember chatRoomMember = roomSuperAdminList.get(i); + if (chatRoomMember.getAccount().equals(account)) { + roomSuperAdminList.remove(i); + break; + } + } + } + + /** + * 自己是否是房间超管 + * + * @return - + */ + public boolean isSuperAdmin() { + return isSuperAdmin(String.valueOf(AuthModel.get().getCurrentUid())); + } + + /** + * 是否是房间超管 + * + * @return - + */ + public boolean isSuperAdmin(String account) { + if (roomSuperAdminList.isEmpty()) return false; + for (ChatRoomMember chatRoomMember : roomSuperAdminList) { + if (chatRoomMember.getAccount().equals(account)) return true; + } + return false; + } + + /** + * 判断坑位是否被锁了 + */ + public boolean queryMicLockByPosition(int position) { + RoomQueueInfo roomQueueInfo = getRoomQueueMemberInfoByMicPosition(position); + if (roomQueueInfo == null) { + return true; + } + if (roomQueueInfo.mRoomMicInfo == null) { + return true; + } + return roomQueueInfo.mRoomMicInfo.isMicLock(); + } + + /** + * 获取聊天公屏数据 + * + * @return + */ + public List getChatRoomMessages() { + return chatRoomMessages; + } + + public void addChatRoomMessage(ChatRoomMessage msg) { + if (msg == null) return; + addChatRoomMessages(new ArrayList<>(Collections.singletonList(msg))); + } + + public void addChatRoomMessages(List msgList) { + if (ListUtils.isListEmpty(msgList)) return; + + Iterator iterator = msgList.iterator(); + ChatRoomMessage msg; + while (iterator.hasNext()) { + msg = iterator.next(); + if (msg.getMsgType() == MsgTypeEnum.notification) { + NotificationAttachment attachment = (NotificationAttachment) msg.getAttachment(); + if (attachment != null && attachment.getType() == NotificationType.ChatRoomMemberIn) { + boolean isSuperAdmin = SuperAdminUtil.isSuperAdmin(msg); + if (isSuperAdmin) iterator.remove(); + } + } + } + + chatRoomMessages.addAll(msgList); + chatRoomMsgProcessor.onNext(msgList); + keepSizeUnderLimit(); + } + + private void keepSizeUnderLimit() { + while (chatRoomMessages.size() > MAX_MESSAGE_SIZE) { + chatRoomMessages.remove(0); + } + } + + public PublishProcessor> getChatRoomMsgProcessor() { + return chatRoomMsgProcessor; + } + + @SuppressLint("CheckResult") + private void observerChatRoomMessage() { + IMNetEaseManager.get().getChatRoomMsgFlowable() + .subscribe(message -> { + if (message == null) return; + addChatRoomMessage(message); + }); + IMNetEaseManager.get().getChatRoomEventObservable() + .subscribe(roomEvent -> { + if (roomEvent == null || + (roomEvent.getEvent() != RoomEvent.RECEIVE_MSG + && roomEvent.getEvent() != RoomEvent.MONSTER_HUNTING + && roomEvent.getEvent() != RoomEvent.KICK_OUT_ROOM + && roomEvent.getEvent() != RoomEvent.KICK_DOWN_MIC + && roomEvent.getEvent() != RoomEvent.ADD_BLACK_LIST)) { + return; + } + ChatRoomMessage chatRoomMessage = roomEvent.getChatRoomMessage(); + if (chatRoomMessage == null) return; + addChatRoomMessage(chatRoomMessage); + }); + chatRoomDataRelease(); + } + + private void chatRoomDataRelease() { + chatRoomDataRelease(true); + } + + public void chatRoomDataRelease(boolean addFirst) { + chatRoomMessages.clear(); + if (addFirst) { + addChatRoomMessage(IMNetEaseManager.get().getFirstMessageContent()); + } + } + + private void onKickMember(ChatRoomKickOutEvent reason) { + if (reason == null) return; + ChatRoomKickOutEvent.ChatRoomKickOutReason reasonReason = reason.getReason(); + if (reasonReason == ChatRoomKickOutEvent.ChatRoomKickOutReason.CHAT_ROOM_INVALID) { +// subscribe = Observable.interval(0, 1, TimeUnit.SECONDS) +// .take(121) +// .doOnSubscribe(disposable -> { +// }).flatMap((Function>) aLong -> Observable.just(120 - aLong)) +// .observeOn(AndroidSchedulers.mainThread()) +// .doOnComplete(() -> { +// }) +// .subscribe(aLong -> EventBus.getDefault().post(new ExitCountDownEvent((Long) aLong))); + + } + } + + /** + * ture为关闭公屏 + * + * @return - + */ + public boolean isCloseScreen() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return false; + } + return roomInfo.isCloseScreen(); + } + + /** + * ture为开启全服红包 + * + * @return - + */ + public boolean isOpenRedPackage() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return true; + } + return roomInfo.isServerRedEnvelopeSwitch(); + } + + + /** + * 是否为ktv模式 + * + * @return - + */ + public boolean isOpenKTV() { + return false; + } + + /** + * 是否为游戏模式 + * + * @return - + */ + public boolean isOpenGame() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return false; + } + return roomInfo.getType() == RoomInfo.ROOMTYPE_GAME; + } + + public boolean isOpenPureMode() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return false; + } + return roomInfo.isPureMode() || roomInfo.isCloseBox(); + } + + public boolean hasDragonGame() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return false; + } + return roomInfo.hasDragonGame; + } + + public boolean isCpRoom() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_CP; + } + public boolean isOpenPKMode() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getRoomModeType() == RoomModeType.OPEN_PK_MODE; + } + + public boolean isOpenAnotherPKMode() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getRoomModeType() == RoomModeType.OPEN_ANOTHER_PK_MODE; + } + + public boolean isSingleRoom() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOM_TYPE_SINGLE; + } + public boolean isGameRoom() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_GAME; + } + public boolean isHomeParty() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_HOME_PARTY; + } + + public boolean isPartyRoom() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_PARTY; + } + public boolean isRevelryRoom() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_REVELRY; + } + + public boolean is19Room() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_19_ROOM; + } + public boolean is20Room() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_20_ROOM; + } + + public boolean is19RoomBoosMicPos(int micPos){ + return micPos == MIC_POS_19_ROOM_BOSS; + } + public boolean is19RoomBoosItemPos(int itemPos){ + return itemPos == ITEM_POS_19_ROOM_BOSS; + } + + + /** + * 是否开启排麦模式 + * + * @return + */ + public boolean isQueuingMicro() { + return isRoomInQueuingMicMode(mCurrentRoomInfo); + } + + /** + * 给定房间是否开启排麦模式 + * 相亲模式必开排麦模式 + * + * @return + */ + public boolean isRoomInQueuingMicMode(RoomInfo roomInfo) { + if (roomInfo == null) return false; + return roomInfo.getRoomModeType() == RoomModeType.OPEN_MICRO_MODE + || roomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE; + } + + public void addManagerMember(ChatRoomMember member) { + if (member == null) { + return; + } + if (mRoomManagerList == null) { + mRoomManagerList = new ArrayList<>(); + } + boolean isContain = false; + //ChatRoomMember没有重写equals方法 + for (ChatRoomMember index : mRoomManagerList) { + if (index != null && !TextUtils.isEmpty(index.getAccount()) && + index.getAccount().equals(member.getAccount())) { + isContain = true; + break; + } + } + if (!isContain) { + mRoomManagerList.add(member); + } + } + + public long getRoomId() { + return mCurrentRoomInfo == null ? 0 : mCurrentRoomInfo.getRoomId(); + } + + /** + * 房主的uid + */ + public long getRoomUid() { + return mCurrentRoomInfo == null ? 0 : mCurrentRoomInfo.getUid(); + } + + /** + * true表示具有KTV权限 + */ + public boolean hasKTVPriv() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.hasKTVPriv; + } + + /** + * 判断在不在聊天室 + */ + public Single checkMemberInRoomById(long uid) { + return Single.create(emitter -> { + List accounts = new ArrayList<>(); + accounts.add(String.valueOf(uid)); + NIMChatRoomSDK.getChatRoomService().fetchRoomMembersByIds( + String.valueOf(getRoomId()), accounts) + .setCallback(new RequestCallback>() { + @Override + public void onSuccess(List param) { + if (!ListUtils.isListEmpty(param)) { + for (ChatRoomMember member : param) { + if (member != null && Objects.equals(member.getAccount(), String.valueOf(uid))) { + emitter.onSuccess(member); + break; + } + } + } else { + emitter.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_06))); + } + } + + @Override + public void onFailed(int code) { + emitter.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_manager_avroomdatamanager_07) + code)); + } + + @Override + public void onException(Throwable exception) { + emitter.onError(exception); + } + }); + }); + } + + public boolean isAllowedToPlayTogether() { + return isAllowedToPlayTogether; + } + + public void setAllowedToPlayTogether(boolean allowedToPlayTogether) { + isAllowedToPlayTogether = allowedToPlayTogether; + } + + public boolean isFromMentoring() { + return isFromMentoring; + } + + public void setFromMentoring(boolean fromMentoring) { + isFromMentoring = fromMentoring; + } + + public long getMasterUid() { + return masterUid; + } + + public void setMasterUid(long masterUid) { + this.masterUid = masterUid; + } + + public List getRoomUidList() { + return roomUidList; + } + + public void setRoomUidList(List roomUidList) { + this.roomUidList = roomUidList; + } + + public void setSerialValue(Double value){ + if (value == null) { + serialValue = 0; + } else { + serialValue = value; + } + } + + public boolean isParty() { + return isParty; + } + + public void setIsParty(boolean party) { + isParty = party; + } + + public int getRedEnvelopeType() { + return redEnvelopeType; + } + + /** + * 是否开启礼物值 + */ + public boolean isShowGiftValue() { + if (isCpRoom()) { + return false; + } + if (isOpenKTV()) { + return false; + } + return mCurrentRoomInfo != null && mCurrentRoomInfo.isShowGiftValue(); + } + + public boolean isLeaveMode() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.isLeaveMode() || AvRoomDataManager.get().isSingleRoom(); + } + + /** + * 房间是否被隐藏 + * + * @return - + */ + public boolean isHideRoom() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getHideFlag() == 1; + } + + /** + * 房间是否上锁 + * + * @return - + */ + public boolean isRoomLock() { + return mCurrentRoomInfo != null && !TextUtils.isEmpty(mCurrentRoomInfo.getRoomPwd()); + } + + public boolean isCpRoomLock() { + if (mCurrentRoomInfo == null) { + return false; + } + return isCpRoom() && !TextUtils.isEmpty(mCurrentRoomInfo.getLimitType()); + } + + /** + * 超管关闭公屏 + * + * @return - + */ + public boolean closeScreenBySAdmin() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getCloseScreenFlag() == 1; + } + + /** + * @return 是否相亲模式的主持 + */ + public boolean isPreside(long uid) { + return isDatingMode() && Objects.equals(String.valueOf(uid), getRoomQueueMemberUidByMicPosition(POSITION_BOSS_MIC)); + } + + /** + * @return true 相亲模式 + */ + public boolean isDatingMode() { + return mCurrentRoomInfo != null && mCurrentRoomInfo.getRoomModeType() == RoomModeType.OPEN_DATING_MODE; + } + + /** + * @return true 相亲模式的VIP麦位 + */ + public boolean isDatingVipMic(int position) { + return position == AvRoomDataManager.POSITION_VIP_MIC || + isDatingVip(StringFormatUtils.toLong(AvRoomDataManager.get().getRoomQueueMemberUidByMicPosition(position))); + } + + /** + * @return true 相亲模式的VIP + */ + public boolean isDatingVip(long uid) { + return mCurrentRoomInfo != null && + mCurrentRoomInfo.getBlindDateVipUid() != 0 && + mCurrentRoomInfo.getBlindDateVipUid() == uid; + } + + /** + * @return 相亲模式是否已经选择心动对象了 + */ + public boolean isSelectUser(long uid) { + RoomQueueInfo roomQueueInfo = getRoomQueueMemberInfoByAccount(String.valueOf(uid)); + if (roomQueueInfo == null || roomQueueInfo.mChatRoomMember == null) return false; + return isDatingMode() && roomQueueInfo.mChatRoomMember.isHasSelectUser(); + } + + public boolean isLimitEnterRoom(String roomUid) { + initKickOutRoomUids(); + Long limitTime = kickOutRoomUids.get(roomUid); + return limitTime != null && CurrentTimeUtils.getCurrentTime() - limitTime < XConstants.KICK_OUT_ROOM_LIMIT_ENTER_TIME; + } + + public void addCurrentRoomLimitEnter() { + if (mCurrentRoomInfo == null) return; + initKickOutRoomUids(); + String roomUid = String.valueOf(getRoomUid()); + kickOutRoomUids.put(roomUid, CurrentTimeUtils.getCurrentTime()); + DemoCache.saveKickOutRoom(roomUid); + } + + private void initKickOutRoomUids() { + if (kickOutRoomUids == null) { + kickOutRoomUids = DemoCache.readKickOutRoom(); + } + if (kickOutRoomUids == null) { + kickOutRoomUids = new HashMap<>(); + } + } + + public void setUnlockedRoomAlbumPhotos(List unlockedRoomAlbumPhotos) { + this.unlockedRoomAlbumPhotos = unlockedRoomAlbumPhotos; + } + + public List getUnlockedRoomAlbumPhotos() { + return unlockedRoomAlbumPhotos; + } + + public void addUnlockedRoomAlbumPhoto(int photoId) { + unlockedRoomAlbumPhotos.add(photoId); + } + + private static final class Helper { + private static final AvRoomDataManager INSTANCE = new AvRoomDataManager(); + } + +} diff --git a/core/src/main/java/com/chwl/core/manager/BaseEngine.java b/core/src/main/java/com/chwl/core/manager/BaseEngine.java new file mode 100644 index 0000000..27d113d --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/BaseEngine.java @@ -0,0 +1,73 @@ +package com.chwl.core.manager; + +import java.util.ArrayList; +import java.util.List; + +public abstract class BaseEngine implements IAudioEngine { + /** + * 角色-主播 + */ + public static final int ROLE_BROADCASTER = 1; + + /** + * 角色-观众 + */ + public static final int ROLE_AUDIENCE = 2; + + /** + * 队列说话列表 + */ + public List speakQueueMembersPosition; + protected long channelId; + public long uid; + protected volatile boolean isAudienceRole; + + /** + * 麦上是否闭麦,true:闭麦,false:开麦 + */ + public volatile boolean isMute = false; + + /** + * 听筒是否关闭 + */ + public volatile boolean isRemoteMute; + public boolean needRecord; + //是否在房间,判断是切换品质还是第一次进 + public volatile boolean inRoom; + + /** + * 是否打开耳返,true 表示打开,false 表示关闭 + * 默认不打开耳返 + */ + protected volatile boolean enableLoopBack = false; + + /** + * 音乐播放器是否正在播放歌曲 + */ + public volatile boolean isMusicPlaying = false; + + public BaseEngine() { + this.speakQueueMembersPosition = new ArrayList<>(); + } + + @Override + public void switchLoopBack(boolean isNeedOpenLoopBack) { + this.enableLoopBack = isNeedOpenLoopBack; + } + + @Override + public boolean isRemoteMute() { + return isRemoteMute; + } + + @Override + public boolean isAudienceRole() { + return isAudienceRole; + } + + @Override + public boolean isMute() { + return isMute; + } + +} diff --git a/core/src/main/java/com/chwl/core/manager/BaseMvpModel.java b/core/src/main/java/com/chwl/core/manager/BaseMvpModel.java new file mode 100644 index 0000000..47e5310 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/BaseMvpModel.java @@ -0,0 +1,172 @@ +package com.chwl.core.manager; + +import com.netease.nimlib.sdk.util.api.RequestResult; +import com.chwl.core.R; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.utils.ResUtil; + +import java.net.UnknownHostException; +import java.util.concurrent.TimeoutException; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableSource; +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleSource; +import io.reactivex.SingleTransformer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; + +/** + *

+ * + * @author jiahui + * @date 2017/12/12 + */ +public class BaseMvpModel { + + public static final int RESULT_OK = 200; + protected static final int WAIT_IMMCLIENT_TIME = 3000; + + public void changeBaseUrl(){ + + } + + public void execute(Observable> observable, final CallBack callBack) { + observable.subscribe(new DisposableObserver>() { + @Override + public void onNext(ServiceResult tServiceResult) { + if (tServiceResult != null) { + if (tServiceResult.isSuccess()) { + if (callBack != null) { + callBack.onSuccess(tServiceResult.getData()); + } + } else { + if (callBack != null) { + callBack.onFail(-1, tServiceResult.getError()); + } + } + } else { + if (callBack != null) { + callBack.onFail(-1, ResUtil.getString(R.string.xchat_android_core_manager_basemvpmodel_01)); + } + } + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + if (callBack != null) { + String error = e.getMessage(); + if (e instanceof UnknownHostException) { + error = ResUtil.getString(R.string.xchat_android_core_manager_basemvpmodel_02); + }else if (e instanceof TimeoutException){ + error = ResUtil.getString(R.string.xchat_android_core_manager_basemvpmodel_03); + } + callBack.onFail(-1, error); + } + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 异步执行云信操作 + * + * @param requestResult -- + * @param e -- + * @param -- + */ + public void executeNIMClient(RequestResult requestResult, ObservableEmitter e) { + if (e.isDisposed()) return; + if (requestResult.exception != null) { + e.onError(requestResult.exception); + } else if (requestResult.code != RESULT_OK) { + e.onError(new Throwable(String.valueOf(requestResult.code))); + } else { + e.onNext(requestResult.data); + } + e.onComplete(); + } + + /** + * 异步执行云信操作 + * + * @param requestResult -- + * @param e -- + * @param -- + */ + public void executeNIMClient(RequestResult requestResult, SingleEmitter e) { + if (e.isDisposed()) return; + if (requestResult.exception != null) { + e.onError(requestResult.exception); + } else if (requestResult.code != RESULT_OK) { + e.onError(new Throwable(String.valueOf(requestResult.code))); + } else { + e.onSuccess(requestResult.data); + } + } + + protected Function, ObservableSource> getFunction() { + return roomInfoServiceResult -> { + if (roomInfoServiceResult == null) + return Observable.error(new Throwable("roomInfoServiceResult == null")); + if (roomInfoServiceResult.isSuccess()) + Observable.just(roomInfoServiceResult.getData()); + return Observable.error(new Throwable( + roomInfoServiceResult.getCode() + "-" + roomInfoServiceResult.getErrorMessage())); + }; + } + + protected Function>> getCommonExceptionFunction() { + return throwable -> { + ServiceResult errorResult = new ServiceResult<>(); + if (throwable instanceof UnknownHostException) { + errorResult.setCode(ServiceResult.NOT_NET); + } else { + errorResult.setCode(ServiceResult.OTHER); + } + return Observable.error(new Throwable(errorResult.getErrorMessage())); + }; + } + + + protected Function, SingleSource> getSingleFunction() { + return roomInfoServiceResult -> { + if (roomInfoServiceResult == null) + return Single.error(new Throwable("roomInfoServiceResult == null")); + if (roomInfoServiceResult.isSuccess()) + return Single.just(roomInfoServiceResult.getData()); + return Single.error(new Throwable(roomInfoServiceResult.getErrorMessage())); + }; + } + + + protected Function>> getSingleCommonExceptionFunction() { + return throwable -> { + ServiceResult errorResult = new ServiceResult<>(); + if (throwable instanceof UnknownHostException) { + errorResult.setCode(ServiceResult.NOT_NET); + } else { + errorResult.setCode(ServiceResult.OTHER); + } + return Single.error(new Throwable(errorResult.getErrorMessage())); + }; + } + + public class Transformer implements SingleTransformer { + @Override + public SingleSource apply(Single upstream) { + return upstream.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + } +} diff --git a/core/src/main/java/com/chwl/core/manager/EngineType.java b/core/src/main/java/com/chwl/core/manager/EngineType.java new file mode 100644 index 0000000..d79d85d --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/EngineType.java @@ -0,0 +1,8 @@ +package com.chwl.core.manager; + +public enum EngineType { + TYPE_AGORA, + TYPE_AGORA_QUICKNESS, + TYPE_QTT_AUDIO, + TYPE_TRTC, +} diff --git a/core/src/main/java/com/chwl/core/manager/IAudioEngine.java b/core/src/main/java/com/chwl/core/manager/IAudioEngine.java new file mode 100644 index 0000000..dfbe578 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/IAudioEngine.java @@ -0,0 +1,78 @@ +package com.chwl.core.manager; + +public interface IAudioEngine { + + void enterChannel(long channelId, long uid); + + void leaveChannel(); + + void resetChannel(); + + void reEnterChannel(long channelId, long uid); + + void stopLocalAudio(); + + /** + * 设置角色,上麦,下麦(调用) + * + * @param role CLIENT_ROLE_AUDIENCE: 听众 ,CLIENT_ROLE_BROADCASTER: 主播 + */ + boolean setRole(int role); + + /** + * 设置是否能说话,静音,人自己的行为 + * + * @param mute true:静音,false:不静音 + */ + void setMute(boolean mute); + + /** + * 静音远端声音 + * + * @param mute true:静音,false:不静音 + */ + void setRemoteMute(boolean mute); + + + boolean isEnableLoopBack(); + + void connectOtherRoom(String roomId, long userUid); + + void disconnectOtherRoom(); + + //音乐播放相关---------------begin-------------------------- + void adjustAudioMixingVolume(int volume); + + void adjustRecordingSignalVolume(int volume); + + int startAudioMixing(String filePath, boolean loopback, int cycle); + + int stopAudioMixing(); + + int resumeAudioMixing(); + + int pauseAudioMixing(); + + int getAudioMixingCurrentPosition(); + + int getAudioMixingDuration(); + //音乐播放相关---------------end-------------------------- + + + void setRemoteMute(long uid, boolean mute); + + boolean isRemoteMute(); + + boolean isAudienceRole(); + + boolean isMute(); + + void switchLoopBack(boolean enable); + + void setChatRoomOnlineStatus(boolean status); + + void setASMRMode(boolean enable); + + default void delayStartPlay(long pushUid) { + } +} diff --git a/core/src/main/java/com/chwl/core/manager/IMBroadcastManager.java b/core/src/main/java/com/chwl/core/manager/IMBroadcastManager.java new file mode 100644 index 0000000..8dae079 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/IMBroadcastManager.java @@ -0,0 +1,90 @@ +package com.chwl.core.manager; + +import android.text.TextUtils; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.netease.nimlib.sdk.NIMSDK; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.msg.model.BroadcastMessage; +import com.chwl.core.bean.BaseProtocol; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.upgrade.bean.NewestVersionInfo; +import com.chwl.core.upgrade.event.ImPushUpdateAppEvent; + +import org.greenrobot.eventbus.EventBus; + + +/** + * 全服广播处理 + * 以前是放baseActivity,处理,这里独立出来 + * create by lvzebiao @2019/8/14 + */ +public class IMBroadcastManager { + + private IMBroadcastManager() { + + } + + private static final class Helper { + private static final IMBroadcastManager INSTANCE = new IMBroadcastManager(); + } + + public static IMBroadcastManager get() { + return Helper.INSTANCE; + } + + private Observer observer; + + public void onCreate() { + if (observer == null) { + observer = (Observer) broadcastMessage -> { + if (broadcastMessage != null) { + String contentStr = broadcastMessage.getContent(); + if (TextUtils.isEmpty(contentStr)) return; + JSONObject jsonObject; + try { + jsonObject = JSON.parseObject(contentStr); + } catch (Exception e) { + jsonObject = null; + } + if (jsonObject == null) return; + if (jsonObject.containsKey("body")) { + String body = jsonObject.getString("body"); + if (TextUtils.isEmpty(body)) return; + onReceivedNimBroadcastMessage(body); + } + + } + }; + NIMSDK.getMsgServiceObserve().observeBroadcastMessage(observer, true); + } + } + + private void onReceivedNimBroadcastMessage(String body) { + BaseProtocol baseProtocol; + try { + baseProtocol = JSON.parseObject(body, BaseProtocol.class); + } catch (Exception e) { + baseProtocol = null; + } + if (baseProtocol == null) return; + int first = baseProtocol.getFirst(); + int second = baseProtocol.getSecond(); + switch (first) { + case CustomAttachment.CUSTOM_MSG_HEADER_ALL_SERVICE_PUSH: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_PUSH_APP_TO_UPDATE) { + NewestVersionInfo newestVersionInfo = JSON.parseObject(String.valueOf(baseProtocol.getData()), NewestVersionInfo.class); + EventBus.getDefault().post(new ImPushUpdateAppEvent(newestVersionInfo)); + } + break; + } + } + + public void onDestroy() { + if (observer != null) { + NIMSDK.getMsgServiceObserve().observeBroadcastMessage(observer, false); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/manager/IMMessageManager.java b/core/src/main/java/com/chwl/core/manager/IMMessageManager.java new file mode 100644 index 0000000..5290b33 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/IMMessageManager.java @@ -0,0 +1,452 @@ +package com.chwl.core.manager; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CP_INVITE_MESSAGE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LOTTERY; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PACKET; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_LEVEL_UP; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_MODULE_HALL; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_NEWBIE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_RECEIV_NEWBIE_HELLO; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_NOTICE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_TO_BE_OWNER; + +import android.util.Log; + +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.netease.nim.uikit.common.util.AntiSpamUtil; +import com.netease.nimlib.sdk.InvocationFuture; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.RequestCallbackWrapper; +import com.netease.nimlib.sdk.StatusBarNotificationConfig; +import com.netease.nimlib.sdk.friend.FriendService; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.MsgServiceObserve; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.chwl.core.activity.event.ActivityEvent; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.im.custom.bean.CpInviteAttachment; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.LevelUpAttachment; +import com.chwl.core.im.custom.bean.LotteryAttachment; +import com.chwl.core.im.custom.bean.LuckyMoneyTipsAttachment; +import com.chwl.core.im.custom.bean.NewbieHelloAttachment; +import com.chwl.core.im.custom.bean.RedPacketAttachment; +import com.chwl.core.level.event.CharmLevelUpEvent; +import com.chwl.core.level.event.LevelUpEvent; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; +import com.chwl.core.manager.event.HallInfoChangeEvent; +import com.chwl.core.newbie.bean.NewbieHelloInfo; +import com.chwl.core.newbie.event.NewbieHelloDialogEvent; +import com.chwl.core.relation.cp.bean.CpInviteInfo; +import com.chwl.core.web.event.WebViewRefreshEvent; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * Created by MadisonRong on 23/07/2018. + */ + +public class IMMessageManager { + + private static final String TAG = "IMMessageManager"; + + private static final class Helper { + private static final IMMessageManager INSTANCE = new IMMessageManager(); + } + + public static IMMessageManager get() { + return Helper.INSTANCE; + } + + public void init() { + Log.e(TAG, "IMMessageManager: init"); + registerInComingMessage(); + + registerRecentContactObserver(); + + registerMsgStatusObserver(); + +// pullMessageHistory(); + } + + private IMMessageManager() { + } + + private void registerMsgStatusObserver() { + Observer msgStatusObserver = (Observer) imMessages -> { + if (imMessages != null) { + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(imMessages.getFromAccount()) && AntiSpamUtil.isAntiSpam(imMessages)) { + SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05)); + } + } + }; + NIMClient.getService(MsgServiceObserve.class).observeMsgStatus( + msgStatusObserver, true); + } + + private void registerRecentContactObserver() { + //会话改变监听 + Observer> recentContactObserver = (Observer>) recentContacts -> { + // 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。 + if (recentContacts != null && recentContacts.size() > 0) { + recentContacts = IMMessageManager.filterRecentContact(recentContacts); + EventBus.getDefault().post(recentContacts); + } + }; + NIMClient.getService(MsgServiceObserve.class) + .observeRecentContact(recentContactObserver, true); + + //注册删除会话监听 + Observer deleteContactObserver = (Observer) deleteContact -> { + if (deleteContact != null) { + EventBus.getDefault().post(Collections.singletonList(deleteContact)); + } + }; + NIMClient.getService(MsgServiceObserve.class) + .observeRecentContactDeleted(deleteContactObserver, true); + } + + private void registerInComingMessage() { + Observer> incomingMessageObserver = (Observer>) messages -> { + // 处理新收到的消息,为了上传处理方便,SDK 保证参数 messages 全部来自同一个聊天对象。 + messages = IMMessageManager.filterMessage(messages); + if (messages != null && messages.size() > 0) { +// notifyClients(IIMMessageCoreClient.class, IIMMessageCoreClient.METHOD_ON_RECEIVE_PERSONAL_MESSAGES, messages); + for (IMMessage msg : messages) { + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + if (attachment == null){ + continue; + } + switch (attachment.getFirst()) { + case CUSTOM_MSG_HEADER_TYPE_LOTTERY: + LotteryAttachment lotteryAttachment = (LotteryAttachment) msg.getAttachment(); + EventBus.getDefault().post(new ActivityEvent().setLotteryInfo(lotteryAttachment.getLotteryInfo())); + EventBus.getDefault().post(new WebViewRefreshEvent()); + break; + + case CUSTOM_MSG_LEVEL_UP: + LevelUpAttachment levelUpAttachment = (LevelUpAttachment) msg.getAttachment(); + if (levelUpAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_EXPER_LEVEL_UP) { + EventBus.getDefault().post(new LevelUpEvent().setLevelName(levelUpAttachment.levelName)); + } else if (levelUpAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_CHARM_LEVEL_UP) { + EventBus.getDefault().post(new CharmLevelUpEvent().setLevelName(levelUpAttachment.levelName)); + } + break; + + case CUSTOM_MSG_HEADER_TYPE_PACKET: + RedPacketAttachment redPacketAttachment = (RedPacketAttachment) msg.getAttachment(); +// notifyClients(IRedPacketCoreClient.class, IRedPacketCoreClient.METHOD_ON_RECEIVE_NEW_PACKET, redPacketAttachment.getRedPacketInfo()); + EventBus.getDefault().post(redPacketAttachment.getRedPacketInfo()); + break; + //模厅消息 + case CUSTOM_MSG_MODULE_HALL: + //如果是模厅的通知,发出通知,通知刷新界面 + if (attachment.getSecond() == CUSTOM_MSG_SUB_HALL_NOTICE || + attachment.getSecond() == CUSTOM_MSG_SUB_HALL_TO_BE_OWNER) { + EventBus.getDefault().post(new HallInfoChangeEvent()); + } + break; + + case CUSTOM_MSG_NEWBIE: + //打招呼弹窗 + NewbieHelloAttachment newbieHelloAttachment = (NewbieHelloAttachment) msg.getAttachment(); + NewbieHelloInfo helloInfo = newbieHelloAttachment.getNewbieHelloInfo(); + if (attachment.getSecond() == CUSTOM_MSG_RECEIV_NEWBIE_HELLO) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + if (!(Objects.equals(uid, String.valueOf(helloInfo.getUid())))){ + EventBus.getDefault().post(new NewbieHelloDialogEvent(helloInfo)); + } + } + break; + case CP_INVITE_MESSAGE: + CpInviteInfo cpInviteInfo = ((CpInviteAttachment) attachment).getEntity(); + EventBus.getDefault().post(cpInviteInfo); + break; + } + } + } + + } + }; + NIMClient.getService(MsgServiceObserve.class) + .observeReceiveMessage(incomingMessageObserver, true); + } + + /** + * 过滤推送消息 + * @param messageList + * @return + */ + public static List filterMessage(List messageList) { + if (messageList != null) { + Iterator iterator = messageList.iterator(); + while (iterator.hasNext()) { + IMMessage message = iterator.next(); + if (message.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment customAttachment = (CustomAttachment) message.getAttachment(); + if (customAttachment == null){ + continue; + } + + switch (customAttachment.getFirst()) { + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY: + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY) { + LuckyMoneyTipsAttachment luckyMoneyAttachment = (LuckyMoneyTipsAttachment) message.getAttachment(); + LuckyMoneyInfo luckyMoneyInfo = luckyMoneyAttachment.getLuckyMoneyInfo(); + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + // 你领取了某人的红包 || 某人领取了你的红包 + if (!(Objects.equals(uid, String.valueOf(luckyMoneyInfo.getReceiveUid())) || + Objects.equals(uid, String.valueOf(luckyMoneyInfo.getSenderUid())))) { + NIMClient.getService(MsgService.class).deleteChattingHistory(message); + iterator.remove(); + } + } + break; + + case CustomAttachment.CUSTOM_MSG_PUSH_NOTIFIFICATION: + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_ROOM){ + NIMClient.getService(MsgService.class).deleteChattingHistory(message); + iterator.remove(); + } + break; + } + } + } + } + return messageList; + } + + /** + * 过滤消息列表 + * @param recentContacts + * @return + */ + public static List filterRecentContact(List recentContacts) { + if (recentContacts != null) { + Iterator iterator = recentContacts.iterator(); + while (iterator.hasNext()) { + RecentContact recentContact = iterator.next(); + if (recentContact.getSessionType() == SessionTypeEnum.Team) { + if (recentContact.getMsgType() == MsgTypeEnum.custom) { + List uuids = new ArrayList<>(); + uuids.add(recentContact.getRecentMessageId()); + List imMessages = NIMClient.getService(MsgService.class).queryMessageListByUuidBlock(uuids); + if (imMessages != null && imMessages.size() > 0) { + Iterator messageIterator = imMessages.iterator(); + while (messageIterator.hasNext()) { + IMMessage message = messageIterator.next(); + if (message == null) { + continue; + } + if (message.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment customAttachment = (CustomAttachment) message.getAttachment(); + if (customAttachment == null) { + continue; + } + switch (customAttachment.getFirst()) { + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY: + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY) { + LuckyMoneyTipsAttachment luckyMoneyAttachment = (LuckyMoneyTipsAttachment) message.getAttachment(); + LuckyMoneyInfo luckyMoneyInfo = luckyMoneyAttachment.getLuckyMoneyInfo(); + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + // 你领取了某人的红包 || 某人领取了你的红包 + if (!Objects.equals(uid, String.valueOf(luckyMoneyInfo.getReceiveUid())) && + !Objects.equals(uid, String.valueOf(luckyMoneyInfo.getSenderUid()))) { + NIMClient.getService(MsgService.class).clearUnreadCount(recentContact.getContactId(), SessionTypeEnum.Team); + iterator.remove(); + } + } + break; + + case CustomAttachment.CUSTOM_MSG_PUSH_NOTIFIFICATION: + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_ROOM){ + NIMClient.getService(MsgService.class).deleteChattingHistory(message); + iterator.remove(); + } + break; + } + } + + } + } + + } + + + } + } + } + return recentContacts; + } + + public static int filterMessageCount(List messageList) { + if (messageList != null) { + int count = 0; + Iterator iterator = messageList.iterator(); + while (iterator.hasNext()) { + IMMessage message = iterator.next(); + if (message.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment customAttachment = (CustomAttachment) message.getAttachment(); + int second = customAttachment.getSecond(); + switch (customAttachment.getFirst()) { + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY: + switch (second) { + case CustomAttachment.CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY: + LuckyMoneyTipsAttachment luckyMoneyAttachment = (LuckyMoneyTipsAttachment) message.getAttachment(); + LuckyMoneyInfo luckyMoneyInfo = luckyMoneyAttachment.getLuckyMoneyInfo(); + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + // 你领取了某人的红包 || 某人领取了你的红包 + if (!(Objects.equals(uid, String.valueOf(luckyMoneyInfo.getReceiveUid())) || + Objects.equals(uid, String.valueOf(luckyMoneyInfo.getSenderUid())))) { + count++; + } + break; + } + break; + } + } + } + } + return 0; + } + + public int queryUnreadMsg() { + return NIMClient.getService(MsgService.class).getTotalUnreadCount(); + } + + public void deleteRecentContact(String account) { + NIMClient.getService(MsgService.class).deleteRecentContact2(account, SessionTypeEnum.P2P); + } + + public void updateMessageNotiConfig(StatusBarNotificationConfig config) { + // 更新消息提醒配置 StatusBarNotificationConfig + NIMClient.updateStatusBarNotificationConfig(config); + } + + public void setMessageNoti(String account, boolean checkState) { + NIMClient.getService(FriendService.class).setMessageNotify(account, checkState).setCallback(new RequestCallback() { + + + @Override + public void onSuccess(Void aVoid) { + + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(Throwable throwable) { + + } + }); + } + + public void setTeamMessageNoti(String teamId, boolean mute) { +// NIMClient.getService(TeamService.class).muteTeam(teamId, mute).setCallback(new RequestCallback() { +// @Override +// public void onSuccess(Void aVoid) { +// +// } +// +// @Override +// public void onFailed(int i) { +// +// } +// +// @Override +// public void onException(Throwable throwable) { +// +// } +// }); + } + + // 以测试帐号 testAccount,查询100条消息 + + + public InvocationFuture> pullMessageHistoryEx(IMMessage anchor, long toTime, int limit, QueryDirectionEnum direction, boolean persist) { + return NIMClient.getService(MsgService.class).pullMessageHistoryEx(anchor, toTime, limit, direction, persist); + } + + public InvocationFuture> pullMessageHistory(IMMessage anchor, int limit, boolean persist) { + return NIMClient.getService(MsgService.class).pullMessageHistory(anchor, limit, persist); + } + + public InvocationFuture> queryMessageListEx(IMMessage anchor, QueryDirectionEnum directionEnum, int limit, boolean asc) { + return NIMClient.getService(MsgService.class).queryMessageListEx(anchor, directionEnum, limit, asc); + } + + public InvocationFuture> queryMessageListExTime(IMMessage anchor, long toTime, QueryDirectionEnum direction, int limit) { + return NIMClient.getService(MsgService.class).queryMessageListExTime(anchor, toTime, direction, limit); + } + + public List queryMessageListByUuidBlock(List uuids) { + return NIMClient.getService(MsgService.class).queryMessageListByUuidBlock(uuids); + } + + public InvocationFuture> queryMessageListByUuid(List uuids) { +// List uuids = new ArrayList<>(); +// uuids.add(message.getUuid()); + return NIMClient.getService(MsgService.class).queryMessageListByUuid(uuids); + } + + public InvocationFuture> queryMessageListByType(MsgTypeEnum msgTypeEnum, IMMessage anchor, int limit) { + return NIMClient.getService(MsgService.class).queryMessageListByType(msgTypeEnum, anchor, limit); + } + + public void searchMessageHistory(String keyword, List fromAccounts, IMMessage anchor, int limit) { + NIMClient.getService(MsgService.class).searchMessageHistory(keyword, fromAccounts, anchor, limit) + .setCallback(new RequestCallbackWrapper>() { + @Override + public void onResult(int i, List imMessages, Throwable throwable) { + + } + }); + } + + public void searchAllMessageHistory(String keyword, List fromAccounts, long time, int limit) { + NIMClient.getService(MsgService.class).searchAllMessageHistory(keyword, fromAccounts, time, limit) + .setCallback(new RequestCallbackWrapper>() { + @Override + public void onResult(int i, List imMessages, Throwable throwable) { + + } + }); + } + + public void deleteChattingHistory(IMMessage message) { + NIMClient.getService(MsgService.class).deleteChattingHistory(message); + } + + public void clearChattingHistory(String account, SessionTypeEnum sessionTypeEnum) { + NIMClient.getService(MsgService.class).clearChattingHistory(account, sessionTypeEnum); + } + + public void setChattingAccount(String account, SessionTypeEnum sessionType) { + // 进入聊天界面,建议放在onResume中 + NIMClient.getService(MsgService.class).setChattingAccount(account, sessionType); +// 进入最近联系人列表界面,建议放在onResume中 +// NIMClient.getService(MsgService.class).setChattingAccount(MsgService.MSG_CHATTING_ACCOUNT_ALL, SessionTypeEnum.None); + // 退出聊天界面或离开最近联系人列表界面,建议放在onPause中 +// NIMClient.getService(MsgService.class).setChattingAccount(MsgService.MSG_CHATTING_ACCOUNT_NONE, SessionTypeEnum.None); + + + } +} diff --git a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java new file mode 100644 index 0000000..72921c3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java @@ -0,0 +1,3947 @@ +package com.chwl.core.manager; + +import static com.chwl.core.XConstants.SELECT_ANIM_DURATION; +import static com.chwl.core.im.custom.bean.CustomAttachment.*; + +import android.annotation.SuppressLint; +import android.graphics.BitmapFactory; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.ImageSpan; +import android.util.Log; +import android.util.SparseArray; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.chwl.core.BuildConfig; +import com.chwl.core.Constants; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.RoomMicInfo; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.bean.attachmsg.RoomQueueMsgAttachment; +import com.chwl.core.decoration.car.bean.CarInfo; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.exception.ErrorThrowable; +import com.chwl.core.family.bean.FamilyInfo; +import com.chwl.core.family.event.FamilyMineEvent; +import com.chwl.core.gift.GiftModel; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.bean.GiftType; +import com.chwl.core.gift.bean.MsgSuperLuckyGift; +import com.chwl.core.gift.event.UpdateKnapFreeGiftDataEvent; +import com.chwl.core.helper.AtProxy; +import com.chwl.core.im.custom.bean.ActivityTimerAttachment; +import com.chwl.core.im.custom.bean.AssistantAttachment; +import com.chwl.core.im.custom.bean.BoomMsgAttachment; +import com.chwl.core.im.custom.bean.BravoGiftNotifyAttachment; +import com.chwl.core.im.custom.bean.BravoGiftRewardAttachment; +import com.chwl.core.im.custom.bean.CarAttachment; +import com.chwl.core.im.custom.bean.CpMsgAttachment; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.DatingAttachment; +import com.chwl.core.im.custom.bean.DatingPublishAttachment; +import com.chwl.core.im.custom.bean.GiftAttachment; +import com.chwl.core.im.custom.bean.GiftBatchAttachment; +import com.chwl.core.im.custom.bean.InAppSharingFamilyAttachment; +import com.chwl.core.im.custom.bean.InAppSharingMiniWorldAttachment; +import com.chwl.core.im.custom.bean.InAppSharingRoomAttachment; +import com.chwl.core.im.custom.bean.InAppSharingTeamAttachment; +import com.chwl.core.im.custom.bean.LuckyGiftNotifyAttachment; +import com.chwl.core.im.custom.bean.LuckyMoneyAttachment; +import com.chwl.core.im.custom.bean.LuckyMoneyTipsAttachment; +import com.chwl.core.im.custom.bean.MagicAllMicAttachment; +import com.chwl.core.im.custom.bean.MagicAttachment; +import com.chwl.core.im.custom.bean.MagicBatchAttachment; +import com.chwl.core.im.custom.bean.MonsterAttackAttachment; +import com.chwl.core.im.custom.bean.MonsterHuntingResultAttachment; +import com.chwl.core.im.custom.bean.MonsterStatusAttachment; +import com.chwl.core.im.custom.bean.MultiGiftAttachment; +import com.chwl.core.im.custom.bean.NobleAttachment; +import com.chwl.core.im.custom.bean.RedPackageLuckyBagAttachment; +import com.chwl.core.im.custom.bean.RoomBgChangeMsgAttachment; +import com.chwl.core.im.custom.bean.RoomBoxPrizeAttachment; +import com.chwl.core.im.custom.bean.RoomFreeGiftAttachment; +import com.chwl.core.im.custom.bean.RoomFreeGiftMsgBean; +import com.chwl.core.im.custom.bean.RoomGiftValueAttachment; +import com.chwl.core.im.custom.bean.RoomInfoAttachment; +import com.chwl.core.im.custom.bean.RoomLevelChangeMsgAttachment; +import com.chwl.core.im.custom.bean.RoomLuckySeaAttachment; +import com.chwl.core.im.custom.bean.RoomLuckySeaMsgBean; +import com.chwl.core.im.custom.bean.RoomPKAttachment; +import com.chwl.core.im.custom.bean.RoomPkBean; +import com.chwl.core.im.custom.bean.RoomSerialValueChangedAttachment; +import com.chwl.core.im.custom.bean.RoomTipAttachment; +import com.chwl.core.im.custom.bean.RoomUserEnterRoomMsgAttachment; +import com.chwl.core.im.custom.bean.RouterType; +import com.chwl.core.im.custom.bean.SysMsgAttachment; +import com.chwl.core.im.custom.bean.TarotAttachment; +import com.chwl.core.im.custom.bean.WelcomeAttachment; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; +import com.chwl.core.magic.MagicModel; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.toolbox.MagicToolbox; +import com.chwl.core.miniworld.bean.MiniWorldDetailInfo; +import com.chwl.core.miniworld.bean.MiniWorldDetailInfoWithCurrentMember; +import com.chwl.core.miniworld.event.MiniWorldJoinVerifiedEvent; +import com.chwl.core.monsterhunting.bean.MonsterDataBean; +import com.chwl.core.monsterhunting.bean.MonsterInfo; +import com.chwl.core.msg.sys.ErbanSysMsgParamKey; +import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; +import com.chwl.core.msg.sysv2.bean.ErbanSysMsgV2Info; +import com.chwl.core.noble.NobleResourceType; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.redpackage.bean.RedPackageLuckyBag; +import com.chwl.core.retry.ImRetryManager; +import com.chwl.core.retry.ReconnectListener; +import com.chwl.core.retry.RetryChatRoomMessage; +import com.chwl.core.room.activitytimer.ActivityTimerEvent; +import com.chwl.core.room.activitytimer.TimerBean; +import com.chwl.core.room.auction.bean.AuctionInfo; +import com.chwl.core.room.bean.LeaveModeAttachment; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.exception.AntiSpamHitException; +import com.chwl.core.room.face.DynamicFaceModel; +import com.chwl.core.room.giftvalue.helper.GiftValueMrg; +import com.chwl.core.room.model.AvRoomModel; +import com.chwl.core.room.model.MicQueueModel; +import com.chwl.core.room.pk.attachment.RoomPkAttachment; +import com.chwl.core.room.pk.bean.PKTeamInfo; +import com.chwl.core.room.pk.bean.RoomPKInvitedUpMicMember; +import com.chwl.core.room.pk.bean.RoomPkData; +import com.chwl.core.room.pk.model.PkModel; +import com.chwl.core.room.queue.bean.MicMemberInfo; +import com.chwl.core.room.queuing_mic.attachment.QueuingMicAttachment; +import com.chwl.core.room.queuing_mic.bean.QueuingMicInfo; +import com.chwl.core.room.queuing_mic.event.QueuingMicEmptyEvent; +import com.chwl.core.room.queuing_mic.event.QueuingMicNotEmptyEvent; +import com.chwl.core.share.bean.InAppSharingFamilyInfo; +import com.chwl.core.share.bean.InAppSharingMiniWorldInfo; +import com.chwl.core.share.bean.InAppSharingRoomInfo; +import com.chwl.core.share.bean.InAppSharingTeamInfo; +import com.chwl.core.share.bean.SessionType; +import com.chwl.core.statistic.StatLogKey; +import com.chwl.core.super_admin.SuperAdminDataMrg; +import com.chwl.core.super_admin.attachment.SuperAdminOpAttachment; +import com.chwl.core.super_admin.bean.SaOpInfo; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.team.bean.TeamInfo; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.BaseInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.ExtensionUtils; +import com.chwl.core.utils.LogUtils; +import com.chwl.core.utils.SharedPreferenceUtils; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.ServerException; +import com.chwl.core.vip.VipBroadcastMsgEvent; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.rxbus.RxBus; +import com.chwl.library.utils.JavaUtil; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.NetworkUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.log.MLog; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.hjq.toast.ToastUtils; +import com.netease.nim.uikit.business.session.helper.MessageListPanelHelper; +import com.netease.nim.uikit.common.antispam.AntiSpamEvent; +import com.netease.nim.uikit.common.util.AntiSpamUtil; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.NIMChatRoomSDK; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.ResponseCode; +import com.netease.nimlib.sdk.StatusCode; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.ChatRoomService; +import com.netease.nimlib.sdk.chatroom.ChatRoomServiceObserver; +import com.netease.nimlib.sdk.chatroom.constant.MemberType; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +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; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.MsgServiceObserve; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; +import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.NotificationType; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.util.Entry; +import com.netease.nimlib.sdk.util.api.RequestResult; +import com.orhanobut.logger.Logger; + +import org.greenrobot.eventbus.EventBus; +import org.reactivestreams.Publisher; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import io.reactivex.BackpressureStrategy; +import io.reactivex.Flowable; +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.BiConsumer; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.functions.Predicate; +import io.reactivex.processors.PublishProcessor; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subjects.PublishSubject; + +/** + *

雲信聊天室管理,一個全局的Model

+ * + * @author jiahui + * @date 2017/12/12 + */ +public final class IMNetEaseManager { + public static final String ROOM_ENTER_DAY = "current_day_room_id"; + public static final String ROOM_INTRO_TAG = ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_01); + private static final String TAG = "IMNetEaseManager"; + private static final int LOAD_MESSAGE_COUNT = 10; + private static PublishProcessor roomProcessor; + private static PublishProcessor relationShipProcessor; + private static PublishSubject msgProcessor; + private final AvRoomModel model; + @NonNull + private final Gson gson = new Gson(); + public RoomQueueInfo mCacheRoomQueueInfo; + private Disposable datingDisposable; + + // 用于网络重连的判断 + private boolean isNetBroken = false; + + // 临时方案:解决1V1游戏房被filterAnotherChatRoomInternal误杀问题 + @Deprecated() + public static String gameChatRoomId; + + private IMNetEaseManager() { + roomProcessor = PublishProcessor.create(); + relationShipProcessor = PublishProcessor.create(); + msgProcessor = PublishSubject.create(); + + registerInComingRoomMessage(); + registerKickoutEvent(); + registerOnlineStatusChange(); + registerServerMessage(); + registerMessageFilter(); + registerMsgStatusObserver(); + model = AvRoomModel.get(); + } + + public static IMNetEaseManager get() { + return Helper.INSTANCE; + } + + public static void postRoomEvent(RoomEvent roomEvent) { + get().getChatRoomEventObservable().onNext(roomEvent); + } + + /** + * 註冊消息過濾器 + */ + private void registerMessageFilter() { + NIMClient.getService(MsgService.class) + .registerIMMessageFilter(message -> { + if (message.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment customAttachment = (CustomAttachment) message.getAttachment(); + if (customAttachment != null) { + switch (customAttachment.getFirst()) { + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_LUCKY_MONEY: + switch (customAttachment.getSecond()) { + case CustomAttachment.CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY: + LuckyMoneyTipsAttachment luckyMoneyAttachment = (LuckyMoneyTipsAttachment) message.getAttachment(); + LuckyMoneyInfo luckyMoneyInfo = luckyMoneyAttachment.getLuckyMoneyInfo(); + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + // 你領取了某人的紅包 || 某人領取了你的紅包 + if (!(Objects.equals(uid, String.valueOf(luckyMoneyInfo.getReceiveUid())) || + Objects.equals(uid, String.valueOf(luckyMoneyInfo.getSenderUid())))) { + Log.e(TAG, "registerMessageFilter: CUSTOM_MSG_SUB_TYPE_RECEIVE_LUCKY_MONEY"); + return true; + } + break; + } + break; + + //邀請粉絲 + case CustomAttachment.CUSTOM_MSG_PUSH_NOTIFIFICATION: + switch (customAttachment.getSecond()) { + case CustomAttachment.CUSTOM_MSG_SUB_PUSH_NOTIFICATION_IN_ROOM: + Log.e(TAG, "registerMessageFilter: CUSTOM_MSG_PUSH_NOTIFIFICATION"); + return true; + } + break; + } + } + } else if (message.getMsgType() == MsgTypeEnum.notification) { + NotificationAttachment notificationAttachment = (NotificationAttachment) message.getAttachment(); + if (notificationAttachment != null + && (notificationAttachment.getType() == NotificationType.KickMember || notificationAttachment.getType() == NotificationType.LeaveTeam)) { + return true; + } + } + return false; + }); + } + + /** + * 接收來後臺的開通貴族的小秘書通知,做出更新房間貴族和等級,座駕等操作 + */ + private void registerServerMessage() { + MsgServiceObserve service = NIMClient.getService(MsgServiceObserve.class); + service.observeReceiveMessage((Observer>) imMessages -> { + imMessages = IMMessageManager.filterMessage(imMessages); + for (IMMessage imMessage : imMessages) { + MsgAttachment attachment = imMessage.getAttachment(); + if (attachment instanceof NobleAttachment) { + int first = ((NobleAttachment) attachment).getFirst(); + if (first == CustomAttachment.CUSTOM_MESS_HEAD_NOBLE) { + int second = ((NobleAttachment) attachment).getSecond(); + if (second == CustomAttachment.CUSTOM_MESS_SUB_OPENNOBLE || + second == CustomAttachment.CUSTOM_MESS_SUB_HADEXPIRE) { + RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (mCurrentRoomInfo == null || mCurrentRoomInfo.getRoomId() == 0) + return; + // 如果是開通或者過期都需要更新房間裏面的ext字段 + updateMyRoomRole(); + } + } + } else if (attachment instanceof CarAttachment) { + int first = ((CarAttachment) attachment).getFirst(); + if (first == CUSTOM_MESS_HEAD_CAR) { + int second = ((CarAttachment) attachment).getSecond(); + if (second == CUSTOM_MESS_SUB_CAR_ENTER_ROOM) { + + } + } + } else if (attachment instanceof SysMsgAttachment) { + SysMsgAttachment sysMsgAttachment = (SysMsgAttachment) attachment; + ErbanSysMsgInfo erbanSysMsgInfo = sysMsgAttachment.getErbanSysMsgInfo(); + if (erbanSysMsgInfo == null) return; + Map params = erbanSysMsgInfo.getParams(); + if (params != null && params.get(ErbanSysMsgParamKey.FAMILY_ID) != null && + params.get(ErbanSysMsgParamKey.ACTION_TYPE) != null) { + RxBus.get().post(new FamilyMineEvent() + .setFamilyId(String.valueOf(params.get(ErbanSysMsgParamKey.FAMILY_ID))) + .setType(JavaUtil.str2int(params.get(ErbanSysMsgParamKey.ACTION_TYPE)))); + } + + if (params != null && params.get(ErbanSysMsgParamKey.WORLD_ID) != null && + params.get(ErbanSysMsgParamKey.ACTION_TYPE) != null) { + MiniWorldJoinVerifiedEvent miniWorldJoinVerifiedEvent = new MiniWorldJoinVerifiedEvent(); + miniWorldJoinVerifiedEvent.setWorldId(JavaUtil.str2long(params.get(ErbanSysMsgParamKey.WORLD_ID))); + miniWorldJoinVerifiedEvent.setActionType(JavaUtil.str2int(params.get(ErbanSysMsgParamKey.ACTION_TYPE))); + EventBus.getDefault().post(miniWorldJoinVerifiedEvent); + } + } else if (attachment instanceof AssistantAttachment) { + //被贈送 頭飾,座駕 + AssistantAttachment monsterAwardAttachment = (AssistantAttachment) attachment; + if (monsterAwardAttachment.routerType == RouterType.CAR + || monsterAwardAttachment.routerType == RouterType.DECORATION) { + SharedPreferenceUtils.put("IS_CHECK_MY_DECORATION", false); + } + + } + } + }, true); + } + + + public Map toMap(Map map, String namePlateWord, String namePlatePic) { + if (map == null) { + map = new HashMap<>(); + } + map.put(UserInfo.NAMEPLATE_WORD, namePlateWord); + map.put(UserInfo.NAMEPLATE_PIC, namePlatePic); + + return map; + } + + /** + * 更新本人在聊天室內的信息 + */ + public void updateMyRoomRole() { + final long currentUid = AuthModel.get().getCurrentUid(); + if (currentUid <= 0) return; + UserModel.get().getUserInfoFromServer(currentUid) + .flatMap((Function>) userInfo -> { + if (userInfo == null) + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_02))); + return Single.create((SingleOnSubscribe) e -> { + RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (mCurrentRoomInfo == null || mCurrentRoomInfo.getRoomId() == 0) { + e.onError(new Exception(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_03))); + return; + } + long roomId = mCurrentRoomInfo.getRoomId(); + NobleInfo nobleInfo = userInfo.getNobleInfo(); + UserLevelVo userLevelVo = userInfo.getUserLevelVo(); + HeadWearInfo headWearInfo = userInfo.getUserHeadwear(); + CarInfo carInfo = userInfo.getCarInfo(); + ChatRoomMemberUpdate chatRoomMemberUpdate = new ChatRoomMemberUpdate(); + Map map = new HashMap<>(1); + Map valueMap; + valueMap = userInfo.toMap(null, userInfo); + if (userLevelVo != null) { + valueMap = userLevelVo.toMap((nobleInfo != null && nobleInfo.getLevel() > 0) ? nobleInfo.toMap(valueMap) : valueMap); + } + if (carInfo != null) { + valueMap = carInfo.toMap(valueMap, carInfo); + } + //多個判斷,頭飾不過期才傳pic + if (headWearInfo != null && headWearInfo.getStatus() == HeadWearInfo.STATUS_IN_USED) { + valueMap = headWearInfo.toMap(valueMap); + } + + valueMap = toMap(valueMap, userInfo.getNameplateWord(), userInfo.getNameplatePic()); + + if (valueMap != null && valueMap.size() > 0) { + map.put(String.valueOf(userInfo.getUid()), valueMap); + } + chatRoomMemberUpdate.setExtension(map); + NIMChatRoomSDK.getChatRoomService().updateMyRoomRole(String.valueOf(roomId), chatRoomMemberUpdate, true, map); + }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); + }).subscribe(); + } + + private void registerOnlineStatusChange() { + Observer onlineStatus = chatRoomStatusChangeData -> { + if (chatRoomStatusChangeData.status == StatusCode.NET_BROKEN) { + isNetBroken = true; + } + boolean reconnection = false; + if (chatRoomStatusChangeData.status == StatusCode.LOGINED) { + if (isNetBroken) { + reconnection = true; + } + isNetBroken = false; + } + dealChatRoomOnlineStatus(chatRoomStatusChangeData, reconnection); + }; + NIMChatRoomSDK.getChatRoomServiceObserve().observeOnlineStatus(onlineStatus, true); + } + + private void registerKickoutEvent() { + Observer kickOutObserver = (Observer) chatRoomKickOutEvent -> { + // 收到不是自己房間的踢人消息直接return + if (filterAnotherChatRoom(chatRoomKickOutEvent)) return; + LogUtil.e(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_04)); + // 提示被踢出的原因(聊天室已解散、被管理員踢出、被其他端踢出等 + Map extension = chatRoomKickOutEvent.getExtension(); + String account = null; + String userIdKick = null; + if (extension != null) { + LogUtil.print("kick ext info = ", extension); + account = (String) extension.get("account"); + userIdKick = (String) extension.get(StatLogKey.USER_ID_KICK); + } + if (AvRoomDataManager.get().mCurrentRoomInfo != null) { + //通知服務端該用戶要退出房間 + model.quitUserRoomV2().subscribe(); + //取消報名 + if (AvRoomDataManager.get().isQueuingMicro() && AvRoomDataManager.get().myIsInQueue) { + MicQueueModel.get().cancelApplyForQueuing().subscribe(); + } + } + noticeKickOutChatMember(chatRoomKickOutEvent, account); + // 清空緩存數據 + AvRoomDataManager.get().release(); + }; + NIMChatRoomSDK.getChatRoomServiceObserve().observeKickOutEvent(kickOutObserver, true); + } + + private void registerInComingRoomMessage() { + Observer> incomingChatObserver = (Observer>) chatRoomMessages -> { + if (ListUtils.isListEmpty(chatRoomMessages)) return; + dealChatMessage(chatRoomMessages); + }; + NIMChatRoomSDK.getChatRoomServiceObserve().observeReceiveMessage(incomingChatObserver, true); + } + + private void registerMsgStatusObserver() { + Observer msgStatusObserver = (Observer) message -> { + if (message != null) { + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(message.getFromAccount()) && AntiSpamUtil.isAntiSpam(message)) { + SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05)); + } + } + }; + NIMClient.getService(ChatRoomServiceObserver.class).observeMsgStatus( + msgStatusObserver, true); + } + + private void dealChatRoomOnlineStatus(ChatRoomStatusChangeData chatRoomStatusChangeData, boolean reconnection) { + if (filterAnotherChatRoom(chatRoomStatusChangeData)) return; + if (reconnection) { + tryCheckKickState(); + } + long currentUid = AuthModel.get().getCurrentUid(); + if (chatRoomStatusChangeData.status == StatusCode.CONNECTING) { + MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_06)); + } else if (chatRoomStatusChangeData.status == StatusCode.UNLOGIN) { + int errorCode = NIMChatRoomSDK.getChatRoomService().getEnterErrorCode(chatRoomStatusChangeData.roomId); + // 如果遇到錯誤碼13001,13002,13003,403,404,414,表示無法進入聊天室,此時應該調用離開聊天室接口。 + if (errorCode == ResponseCode.RES_CHATROOM_STATUS_EXCEPTION) { + // 聊天室連接狀態異常 + MLog.error(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_07)); + } + MLog.error(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_08)); + if (AvRoomDataManager.get().isOnMic(currentUid)) { + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(String.valueOf(currentUid)); + if (roomQueueInfo == null) return; + mCacheRoomQueueInfo = new RoomQueueInfo(roomQueueInfo.mRoomMicInfo, roomQueueInfo.mChatRoomMember); + //把禮物值也保留起來 + mCacheRoomQueueInfo.giftValueData = roomQueueInfo.giftValueData; + } + } else if (chatRoomStatusChangeData.status == StatusCode.LOGINING) { + MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_09)); + } else if (chatRoomStatusChangeData.status == StatusCode.LOGINED) { + MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_010)); + if (mCacheRoomQueueInfo != null) { + noticeImNetReLogin(mCacheRoomQueueInfo); + } + Map parans = new HashMap<>(3); + parans.put("user_id", String.valueOf(currentUid)); + parans.put("net_type", NetworkUtils.getNetworkTypeName(BasicConfig.INSTANCE.getAppContext())); + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null) + parans.put("room_id", String.valueOf(roomInfo.getRoomId())); + } else if (chatRoomStatusChangeData.status.wontAutoLogin()) { + MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_012)); + + } else if (chatRoomStatusChangeData.status == StatusCode.NET_BROKEN) { + Map parans = new HashMap<>(4); + parans.put("user_id", String.valueOf(currentUid)); + parans.put("net_type", NetworkUtils.getNetworkTypeName(BasicConfig.INSTANCE.getAppContext())); + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null) + parans.put("room_id", String.valueOf(roomInfo.getRoomId())); + + MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_013)); + if (AvRoomDataManager.get().isOnMic(currentUid)) { + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(String.valueOf(currentUid)); + if (roomQueueInfo == null) { + parans.put("is_on_mic", "1"); + return; + } + parans.put("is_on_mic", "2"); + mCacheRoomQueueInfo = new RoomQueueInfo(roomQueueInfo.mRoomMicInfo, roomQueueInfo.mChatRoomMember); + //禮物值 + mCacheRoomQueueInfo.giftValueData = roomQueueInfo.giftValueData; + } else { + parans.put("is_on_mic", "0"); + } + } + } + + /** + * 尝试检测被踢状态(离线时被踢,重连后需要退出) + */ + @SuppressLint("CheckResult") + private void tryCheckKickState() { + String currentUid = AuthModel.get().getCurrentUid() + ""; + if (currentUid.isEmpty() || currentUid.equals("0")) { + return; + } + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return; + } + model.getKickList().subscribe(strings -> { + if (strings.isEmpty()) { + return; + } + RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (currentRoomInfo == null) { + return; + } + long roomUid = currentRoomInfo.getRoomUid(); + for (String uid : strings) { + if (uid != null && uid.equals(currentUid)) { + noticeKickOutChatMember(new ChatRoomKickOutEvent(roomUid + "", ChatRoomKickOutEvent.ChatRoomKickOutReason.KICK_OUT_BY_MANAGER.getValue(), null), currentUid); + // 清空緩存數據 + AvRoomDataManager.get().release(); + return; + } + } + }); + } + + private boolean needToHideEnterMessage(ChatRoomMessage chatRoomMessage) { + String resource = NobleUtil.getResource(NobleResourceType.KEY_ENTER_HIDE, chatRoomMessage); + if (resource.toLowerCase().equals("0")) { + return false; + } else if (resource.toLowerCase().equals("1")) { + return true; + } + return false; + } + + private boolean filterAnotherChatRoom(ChatRoomStatusChangeData chatRoomStatusChangeData) { + return chatRoomStatusChangeData != null && filterAnotherChatRoomInternal(chatRoomStatusChangeData.roomId); + } + + private boolean filterAnotherChatRoom(ChatRoomKickOutEvent chatRoomKickOutEvent) { + return chatRoomKickOutEvent != null && filterAnotherChatRoomInternal(chatRoomKickOutEvent.getRoomId()); + } + + private boolean filterAnotherChatRoom(ChatRoomMessage chatRoomMessage) { + return chatRoomMessage != null && filterAnotherChatRoomInternal(chatRoomMessage.getSessionId()); + } + + private boolean filterAnotherChatRoomInternal(String sessionId) { + + if (Objects.equals(sessionId, gameChatRoomId)) { + return true; + } + if (Objects.equals(sessionId, InitialModel.get().getPublicChatSessionId())) { + return true; + } + RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (currentRoomInfo == null) { + return false; + } + String roomId = String.valueOf(currentRoomInfo.getRoomId()); + System.out.println("roomId: " + roomId + ", sessionId: " + sessionId); + boolean notTheSameRoom = !Objects.equals(roomId, sessionId); + // 退出異常的房間 + if (notTheSameRoom) + NIMChatRoomSDK.getChatRoomService().exitChatRoom(sessionId); + return !(TextUtils.isEmpty(sessionId) || TextUtils.isEmpty(roomId)) && notTheSameRoom; + } + + private void dealChatMessage(List chatRoomMessages) { + ArrayList messages = new ArrayList<>(); + boolean face = false; + boolean gift = false; + for (ChatRoomMessage msg : chatRoomMessages) { + // 過濾其他房間的信息 + if (filterAnotherChatRoom(msg)) continue; + if (msg.getMsgType() == MsgTypeEnum.notification) { + NotificationAttachment attachment = (NotificationAttachment) msg.getAttachment(); + 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); + } else if (attachment.getType() == NotificationType.ChatRoomMemberIn) { + //xxx 成员进房消息 在这里监听 + sendDescMessage(msg); + // 如果能隱身進入不顯示公屏通知,否則顯示公屏通知 + // TODO 超管-公屏不展示 +// addMessagesImmediately(!needToHideEnterMessage(msg) ? msg : null); + List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); + if (ListUtils.isListEmpty(targets)) { + return; + } +// chatRoomMemberIn(targets.get(0), msg); + //如果是自己進房,立即刷新一次超管緩存 + if (UserModel.get().isMyseft(targets.get(0))) { + SuperAdminDataMrg.get().firstInitList(); + } else { + SuperAdminDataMrg.get().handleMemberInRoom(msg, targets.get(0)); + } + } else if (attachment.getType() == NotificationType.ChatRoomMemberExit) { + List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); + if (ListUtils.isListEmpty(targets)) { + return; + } + chatRoomMemberExit(targets.get(0), msg); + SuperAdminDataMrg.get().handleMemberOutRoom(targets.get(0)); + + } else if (attachment.getType() == NotificationType.ChatRoomManagerAdd) { + //管理員id集合列表 + List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); + addManagerMember(targets.get(0)); + } else if (attachment.getType() == NotificationType.ChatRoomManagerRemove) { + List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); + removeManagerMember(targets.get(0)); + } else if (attachment.getType() == NotificationType.ChatRoomMemberBlackAdd) { + List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); + noticeChatMemberBlackAdd(targets.get(0)); + addBlankMember(targets.get(0)); + } else if (attachment.getType() == NotificationType.ChatRoomMemberBlackRemove) { + List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); + AvRoomDataManager.get().removeBlackMember(targets.get(0)); + } else if (attachment.getType() == NotificationType.ChatRoomMyRoomRoleUpdated) { + // 房間內的某人的貴族信息更新了 + Map extension = null; + ChatRoomMessageExtension chatRoomMessageExtension = msg.getChatRoomMessageExtension(); + // 如果有發送過來的,獲取對應的ext字段 + if (attachment instanceof ChatRoomQueueChangeAttachment) { + extension = ((ChatRoomQueueChangeAttachment) attachment).getExtension(); + } + // 沒有直接發送過來,可以獲取發送者的ext字段 + if (extension == null && chatRoomMessageExtension != null) { + extension = chatRoomMessageExtension.getSenderExtension(); + } + // 如果有對應的ext字段 + if (extension != null) { + // 更新房間內隊列的chatRoomMember + AvRoomDataManager.get().updateQueueChatRoomMemberExtension(msg.getFromAccount(), extension); + noticeQueueMemberInfoUpdate(); + } + } else if (attachment.getType() == NotificationType.ChatRoomMemberKicked) { + //暂时注释掉 , 后台封禁时 服务端帮忙踢下麦了 +// String json = JSON.toJSONString(attachment); +// OtherExtKt.doLog(" 有人被踢了 json = "+json); +// List targets = ((ChatRoomNotificationAttachment) attachment).getTargets(); +// OtherExtKt.isVerify(targets, 0, s -> { +// if (String.valueOf(AuthModel.get().getCurrentUid()).equals(s)){ +// int micPosition = AvRoomDataManager.get().getMicPosition(s); +// if (micPosition != AvRoomDataManager.POSITON_NOT_ON_MIC){ +// IMNetEaseManager.get().downMicroPhoneBySdk(micPosition, new CallBack() { +// @Override +// public void onSuccess(String data) { +// OtherExtKt.doLog(" 有人被踢了 并 踢下麦-成功 "); +// } +// +// @Override +// public void onFail(int code, String error) { +// OtherExtKt.doLog(" 有人被踢了 并 踢下麦-失败 "); +// } +// }); +// } +// } +// return null; +// }); + } + } else if (msg.getMsgType() == MsgTypeEnum.tip) { + addMessages(msg); + } else if (msg.getMsgType() == MsgTypeEnum.custom) { + MsgAttachment attachment = msg.getAttachment(); + if (attachment == null) return; + + //自定義消息 + CustomAttachment customAttachment = (CustomAttachment) msg.getAttachment(); + if (customAttachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_AUCTION + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP + || 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() == CustomAttachment.CUSTOM_MESS_TAROT + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING + || customAttachment.getFirst() == CustomAttachment.CUSTOM_MSG_MINI_WORLD) { + if (!isIgnoreMessageOfSuperLuckGift(customAttachment)) { + addMessages(msg); + } + } + Logger.i(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_015) + customAttachment); + int second = customAttachment.getSecond(); + switch (customAttachment.getFirst()) { + case CUSTOM_MSG_HEADER_TYPE_QUEUE: + RoomQueueMsgAttachment queueMsgAttachment = (RoomQueueMsgAttachment) attachment; + long uid = AuthModel.get().getCurrentUid(); + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE_INVITE) { + //邀請上麥 + noticeInviteUpMic(queueMsgAttachment.micPosition, queueMsgAttachment.uid); + if (AvRoomDataManager.get().isQueuingMicro()) { + //判斷自定義消息的昵稱是不是為空,為空過濾。舊版可能為空 + if (!TextUtils.isEmpty(queueMsgAttachment.targetNick)) { + addMessages(msg); + } + } + } else if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE_KICK) { + //踢他下麥 + if (Objects.equals(queueMsgAttachment.uid, String.valueOf(uid))) { + int micPosition = AvRoomDataManager.get().getMicPosition(uid); + //經調試,因為之前已經回調過下麥事件,這裏的position是獲取不到的 + //不知道這麼寫的原因是什麼 (lvzebiao備註) + noticeKickDownMic(micPosition); + } + //只有下麥需要添加消息,修復房主拉人上麥,出現空公屏的bug + addMessages(msg); + } + break; + + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN: + if (!(attachment instanceof SuperAdminOpAttachment)) { + return; + } + SuperAdminOpAttachment opAttachment = (SuperAdminOpAttachment) attachment; + long currUid = AuthModel.get().getCurrentUid(); + String targetUid = null; + if (opAttachment.getInfo() != null) { + targetUid = opAttachment.getInfo().getTargetUid(); + } + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_DOWN_MIC) { + //超管踢人下麥 + if (Objects.equals(String.valueOf(currUid), targetUid)) { + noticeKickDownMicBySAdmin(String.valueOf(targetUid)); + } + addMessages(msg); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MUTE_MIC + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_LOCK_MIC) { + //鎖麥 閉麥 邏輯基本一樣 + addMessages(msg); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ROOM + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MARK_BLACK) { + //拉黑 踢普通人出房間 + addMessages(msg); + noticeReceivedKickOrBlackBySAdmin(opAttachment); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ADMIN) { + //踢管理員出房間 + + noticeReceivedKickOrBlackBySAdmin(opAttachment); + addMessages(msg); + + if (Objects.equals(String.valueOf(currUid), targetUid)) { + noticeMyselfKickOutBySAdmin(opAttachment); + } + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_CP_ROOM_LIMIT + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_ROOM_PWD) { + addMessages(msg); + } + break; + + case CUSTOM_MSG_HEADER_TYPE_AUCTION: +// AuctionAttachment auctionAttachment = (AuctionAttachment) attachment; +// if (auctionAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_AUCTION_START) { +// AuctionModel.get().setAuctionInfo(auctionAttachment.getAuctionInfo()); +// noticeAuctionStart(auctionAttachment.getAuctionInfo()); +// } else if (auctionAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_AUCTION_FINISH) { +// AuctionModel.get().setAuctionInfo(null); +// noticeAuctionFinish(auctionAttachment.getAuctionInfo()); +// } else if (CustomAttachment.CUSTOM_MSG_SUB_TYPE_AUCTION_UPDATE == auctionAttachment.getSecond()) { +// AuctionModel.get().setAuctionInfo(auctionAttachment.getAuctionInfo()); +// noticeAuctionUpdate(auctionAttachment.getAuctionInfo()); +// } + break; + case CUSTOM_MSG_HEADER_TYPE_FACE: + messages.add(msg); + face = true; + break; + case CUSTOM_MSG_HEADER_TYPE_GIFT: + OtherExtKt.doLog("接收消息 IMNetEaseManager 3 - Second = "+customAttachment.getSecond()); + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_GIFT) { + GiftAttachment giftAttachment = (GiftAttachment) attachment; + GiftReceiveInfo giftReceiveInfo = giftAttachment.getGiftReceiveInfo(); + GiftInfo giftInfo = giftReceiveInfo.getGift(); + // 兼容舊版發過來的giftAttachment沒有發送giftInfo的問題 + giftInfo = giftInfo == null ? GiftModel.get().findGiftInfoById(giftReceiveInfo.getGiftId()) : giftInfo; + giftReceiveInfo.setGift(giftInfo); + GiftModel.get().addNewGift(giftInfo); + messages.add(msg); + gift = true; + if (!giftReceiveInfo.isRoomAlbum() && giftInfo.getGiftType() != GiftType.GIFT_TYPE_SUPER_LUCKY) { + addMessages(msg); + } + }else if (customAttachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_ALL_SERVICE_GIFT) { // 35-全服礼物 + messages.add(msg); + gift = true; + }else if (customAttachment.getSecond() == CUSTOM_MSG_ALL_SERVICE_GIFT) { //32-全服礼物飘屏 + messages.add(msg); + gift = true; + } else if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_LUCKY_GIFT) { + messages.add(msg); + gift = true; + addMessages(msg); + } else { + addMessages(msg); + } + break; + case CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT: + if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT) { + MultiGiftAttachment multiGiftAttachment = (MultiGiftAttachment) attachment; + GiftInfo giftInfo1 = multiGiftAttachment.getMultiGiftReceiveInfo().getGift(); + // 兼容舊版發過來的giftAttachment沒有發送giftInfo的問題 + giftInfo1 = giftInfo1 == null ? + GiftModel.get().findGiftInfoById(multiGiftAttachment.getMultiGiftReceiveInfo().getGiftId()) : giftInfo1; + multiGiftAttachment.getMultiGiftReceiveInfo().setGift(giftInfo1); + GiftModel.get().addNewGift(giftInfo1); + messages.add(msg); + gift = true; + } else if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT) { + GiftBatchAttachment giftBatchAttachment = (GiftBatchAttachment) attachment; + GiftModel.get().addNewGift(giftBatchAttachment.getGiftMultiReceiverInfo().getGift()); + messages.add(msg); + gift = true; + } else if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ALL_MIC_LUCKY_GIFT) { + messages.add(msg); + gift = true; + } else if (customAttachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_MULTI_LUCK_GIFT) { + messages.add(msg); + gift = true; + } + break; + case CUSTOM_MESS_HEAD_NOBLE: + NobleAttachment nobleMsgAttachment = (NobleAttachment) attachment; + // 是否需要顯示在公屏上 + NobleInfo nobleInfo = nobleMsgAttachment.nobleInfo; + Map remoteExtension = msg.getRemoteExtension(); + if (nobleInfo == null && remoteExtension != null) + nobleInfo = new NobleInfo((Map) remoteExtension.get(msg.getFromAccount())); + if (nobleInfo == null) continue; + nobleMsgAttachment.nobleInfo = nobleInfo; + if (second == CUSTOM_MESS_SUB_OPENNOBLE || second == CUSTOM_MESS_SUB_RENEWNOBLE) { + addMessagesImmediately(msg); + } + if (second == CUSTOM_MESS_SUB_ROOM_WELCOME) { + noticeNobleMemberIn(nobleMsgAttachment); + } else if (second == CUSTOM_MESS_SUB_OPENNOBLE) { + // 開通貴族需要展示svga,顯示出來,否則只顯示公屏 + if (NobleUtil.needShowSvgaOpenEffect(nobleInfo.getLevel())) + noticeOpenNoble(nobleMsgAttachment); + } + break; + case CUSTOM_MSG_UPDATE_ROOM_INFO: + if (second == CUSTOM_MSG_UPDATE_ROOM_INFO_AUDIO && + (AvRoomDataManager.get().mCurrentRoomInfo != null && AvRoomDataManager.get().mCurrentRoomInfo.getAudioQuality() == 2)) { + addMessages(msg); + } else if (second == CUSTOM_MSG_UPDATE_ROOM_INFO_GIFT) { + if (!AvRoomDataManager.get().mIsNeedGiftEffect) { + ChatRoomMessage tipMessage = ChatRoomMessageBuilder.createTipMessage(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_016)); + tipMessage.setContent(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_017)); + addMessages(tipMessage); + } + } else if (second == CUSTOM_MSG_UPDATE_ROOM_INFO_NOTICE) { + addMessages(msg); + } else if (second == CUSTOM_MSG_UPDATE_ROOM_INFO_CLEAN_SCREEN) { + noticeRoomEvent(msg, RoomEvent.ROOM_CLEAN_SCREEN); + AvRoomDataManager.get().chatRoomDataRelease(true); + addMessages(msg); + } else { + noticeUpdateRoomInfo((CustomAttachment) attachment); + } + break; + case CUSTOM_MESS_HEAD_CAR: + CarAttachment carAttachment = (CarAttachment) attachment; + if (second == CUSTOM_MESS_SUB_CAR_ENTER_ROOM) { + noticeCarMemberIn(carAttachment); + } + break; + case CUSTOM_MSG_HEADER_TYPE_SEND_MAGIC: + // 如果本地沒有的話,嘗試獲取服務器最新列表 + // iOS那邊沒傳url,如果是首次接收的話,可能緩存沒有 + // 改成訪問成功,再處理消息 + MagicModel.get().getLocalMagicList() + .subscribe(new DontWarnObserver>() { + @Override + public void acceptThrowable(List magicInfos, Throwable throwable) { + super.acceptThrowable(magicInfos, throwable); + if (second == CUSTOM_MSG_SUB_TYPE_SEND_SINGLE_MAGIC) { + MagicAttachment magicAttachment = (MagicAttachment) attachment; + noticeReceivedSingleMagic(magicAttachment); + } else if (second == CUSTOM_MSG_SUB_TYPE_SEND_MULTI_MAGIC) { + MagicAllMicAttachment magicAllMicAttachment = (MagicAllMicAttachment) attachment; + noticeReceivedAllMicMagic(magicAllMicAttachment); + } else if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_BATCH_SEND_MAGIC) { + MagicBatchAttachment magicBatchAttachment = (MagicBatchAttachment) attachment; + MagicAllMicAttachment magicAllMicAttachment = new MagicAllMicAttachment(); + magicAllMicAttachment.setMultiMagicReceivedInfo(MagicToolbox.transformToMultiMagicReceivedInfo(magicBatchAttachment.getMagicMultiReceiverInfo())); + noticeReceivedAllMicMagic(magicAllMicAttachment); + } + } + }); + MagicModel.get().handleMagicGiftValue(customAttachment); + break; + case CUSTOM_MSG_HEADER_TYPE_KICK_MIC: + // 如果本地沒有的話,嘗試獲取服務器最新列表 + if (second == CUSTOM_MSG_SUB_TYPE_SEND_KICK_ROOM) { + RoomQueueMsgAttachment magicAttachment = (RoomQueueMsgAttachment) attachment; + noticeReceivedKickRoom(magicAttachment); + } else if (second == CUSTOM_MSG_SUB_TYPE_SEND_ADD_BLACK) { + RoomQueueMsgAttachment magicAttachment = (RoomQueueMsgAttachment) attachment; + noticeReceivedAddBlack(magicAttachment); + } + if (AvRoomDataManager.get().isRoomOwner() || + AvRoomDataManager.get().isRoomAdmin() || + AvRoomDataManager.get().isSuperAdmin() || + SuperAdminUtil.isSuperAdmin()) { + addMessages(msg); + } + break; + case CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING: + switch (second) { + case CUSTOM_NOTI_SUB_GAME_ATTACK: + MonsterAttackAttachment monsterAttackAttachment = (MonsterAttackAttachment) attachment; + noticeReceivedMonsterHuntingAttack(monsterAttackAttachment); + break; + + case CUSTOM_MSG_SUB_TYPE_MONSTER_HUNTING: + case CUSTOM_NOTI_SUB_GAME_END: + MonsterStatusAttachment monsterStatusAttachment = (MonsterStatusAttachment) attachment; + Log.e(TAG, "dealChatMessage: " + monsterStatusAttachment); + noticeReceivedMonsterStatus(monsterStatusAttachment); + break; + + case CUSTOM_NOTI_SUB_GAME_RESULT: + MonsterHuntingResultAttachment monsterHuntingResultAttachment = (MonsterHuntingResultAttachment) attachment; + Log.e(TAG, "dealChatMessage: " + monsterHuntingResultAttachment); + noticeReceivedMonsterResult(monsterHuntingResultAttachment); + break; + } + case CUSTOM_MSG_ASSISTANT_MSG: + if (second == CUSTOM_MSG_ASSISTANT_COMMON_MSG) { + AssistantAttachment monsterAwardAttachment = (AssistantAttachment) attachment; + noticeReceivedMonsterAward(monsterAwardAttachment); + } + break; + case CUSTOM_MSG_BOX: + switch (second) { + case CUSTOM_MSG_SUB_BOX_ME: + if (AuthModel.get().getCurrentUid() == ((RoomBoxPrizeAttachment) msg.getAttachment()).getUid()) + addMessages(msg); + break; + case CUSTOM_MSG_SUB_BOX_IN_ROOM: + case CUSTOM_MSG_SUB_BOX_ALL_ROOM: + if (AvRoomDataManager.get().isOpenPureMode()) { + // 純凈模式打開後,僅能看跟自己相關的砸蛋消息 + RoomBoxPrizeAttachment roomBoxPrizeAttachment = (RoomBoxPrizeAttachment) msg.getAttachment(); + if (Objects.equals(roomBoxPrizeAttachment.getUid(), AuthModel.get().getCurrentUid())) { + addMessages(msg); + } + } else { + addMessages(msg); + } + break; + case CUSTOM_MSG_SUB_BOX_ALL_ROOM_NOTIFY: + if (AvRoomDataManager.get().isOpenPureMode()) { + // 純凈模式打開後,僅能看跟自己相關的砸蛋消息 + RoomBoxPrizeAttachment roomBoxPrizeAttachment = (RoomBoxPrizeAttachment) msg.getAttachment(); + if (Objects.equals(roomBoxPrizeAttachment.getUid(), AuthModel.get().getCurrentUid())) { + addMessages(msg); + } + } else { + addMessages(msg); + noticeBox(msg, second); + } + break; + } + break; + case CUSTOM_MSG_RADISH: + RoomBoxPrizeAttachment boxPrizeAttachment = ((RoomBoxPrizeAttachment) msg.getAttachment()); + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo == null || boxPrizeAttachment == null) break; + boolean showRadishMsg = userInfo.getUserLevelVo() != null && + userInfo.getUserLevelVo().getExperLevelSeq() >= boxPrizeAttachment.getUserLevelLimit(); + switch (second) { + case CUSTOM_MSG_SUB_RADISH_ME: + if (AuthModel.get().getCurrentUid() == boxPrizeAttachment.getUid()) + addMessages(msg); + break; + case CUSTOM_MSG_SUB_RADISH_IN_ROOM: + case CUSTOM_MSG_SUB_RADISH_ALL_ROOM: + if (showRadishMsg) { + addMessages(msg); + } + break; + case CUSTOM_MSG_SUB_RADISH_ALL_ROOM_NOTIFY: + case CUSTOM_MSG_SUB_RADISH_ALL_ROOM_NOTIFY_BY_SVGA: + if (showRadishMsg) { + addMessages(msg); + noticeRadish(msg, second); + } + break; + } + break; + case CUSTOM_MSG_DRAGON_BAR: + if (second == CUSTOM_MSG_DRAGON_BAR_START) { + noticeDragonBarStart(msg, RoomEvent.DRAGON_BAR_START); + } else if (second == CUSTOM_MSG_DRAGON_BAR_END) { + addMessages(msg); + noticeDragonBarStart(msg, RoomEvent.DRAGON_BAR_END); + } else if (second == CUSTOM_MSG_DRAGON_BAR_CANCEL) { + addMessages(msg); + noticeDragonBarStart(msg, RoomEvent.DRAGON_BAR_CANCEL); + } else if (second == CUSTOM_MSG_DRAGON_BAR_RUNAWAY) { + addMessages(msg); + noticeDragonBarStart(msg, RoomEvent.DRAGON_BAR_START); + } + break; + case CUSTOM_MSG_GAME: + break; + case CUSTOM_MSG_QUEUING_MIC: + switch (second) { + case CUSTOM_MSG_SUB_QUEUING_MIC_MODE_CLOSE: + case CUSTOM_MSG_SUB_QUEUING_MIC_MODE_OPEN: + addMessages(msg); + break; + case CUSTOM_MSG_SUB_QUEUING_MIC_FREE_MIC_OPEN: + case CUSTOM_MSG_SUB_QUEUING_MIC_FREE_MIC_CLOSE: + QueuingMicInfo micInfo = ((QueuingMicAttachment) msg.getAttachment()).getQueuingMicInfo(); + if (!Objects.equals(micInfo.getMicPos(), "-1")) { + addMessages(msg); + } + break; + case CUSTOM_MSG_SUB_QUEUING_MIC_EMPTY: + EventBus.getDefault().post(new QueuingMicEmptyEvent()); + break; + + case CUSTOM_MSG_SUB_QUEUING_MIC_NON_EMPTY: + EventBus.getDefault().post(new QueuingMicNotEmptyEvent()); + break; + } + break; + + case CUSTOM_MESS_HEAD_ROOM_PK: + switch (second) { + case CUSTOM_MESS_SUB_ROOM_PK_EMPTY: + EventBus.getDefault().post(new QueuingMicEmptyEvent()); + break; + case CUSTOM_MESS_SUB_ROOM_PK_NON_EMPTY: + EventBus.getDefault().post(new QueuingMicNotEmptyEvent()); + break; + case CUSTOM_MESS_SUB_ROOM_PK_INVITE: + RoomPkAttachment roomPkAttachment = (RoomPkAttachment) msg.getAttachment(); + Map inviteMap = roomPkAttachment.getRoomPKInvitedUpMicMemberMap(); + + //這裏判斷這條消息是否有人被邀請進隊,否則不顯示消息 + Iterator> iterator = inviteMap.entrySet().iterator(); + boolean isInTeam = false; + while (iterator.hasNext()) { + RoomPKInvitedUpMicMember value = iterator.next().getValue(); + //已經在隊伍裏面的人就不顯示進隊伍 + if (PkModel.get().getTeamIdInPKMemberList(value.getUid()) > 0) { + continue; + } + if (value.getGroupType() != PKTeamInfo.TEAM_NONE) { + isInTeam = true; + } + } + if (isInTeam) { + addMessagesImmediately(msg); + } + + //自己查看隊伍裏面有沒有自己的id,有的話更新自己的麥序信息 + inviteInPKTeam(inviteMap); + break; + case CUSTOM_MESS_SUB_ROOM_PK_MODE_OPEN: + Logger.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_018) + msg.getUuid() + " account:" + msg.getFromAccount() + " ClientType:" + msg.getFromClientType() + ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_019) + msg.getTime()); + Logger.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_020) + msg.getAttachment().toJson(false)); + //更新房間PK信息 + PkModel.get().onReceivePKCreate(((RoomPkAttachment) msg.getAttachment()).getRoomPkData()); + noticePKCreate(); + noticePKInfo(); + addMessages(msg); + break; + case CUSTOM_MESS_SUB_ROOM_PK_MODE_CLOSE: + //所有人收到這個消息在麥上,取消自己的隊伍 + PkModel.get().onClosePk(); + pkCloseUpdateSelfMicInfo(); + addMessages(msg); + break; + case CUSTOM_MESS_SUB_ROOM_PK_MODE_START: + Logger.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_021) + msg.getUuid() + " account:" + msg.getFromAccount() + " ClientType:" + msg.getFromClientType() + ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_022) + msg.getTime()); + Logger.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_023) + msg.getAttachment().toJson(false)); + //開始pk + RoomPkData roomPkData = ((RoomPkAttachment) msg.getAttachment()).getRoomPkData(); + roomPkData.setCurPkTimeUntilEnd(roomPkData.getDuration()); + PkModel.get().onReceivePKBegin(roomPkData); + noticePKInfo(); + noticePKStart(); + addMessages(msg); + break; + case CUSTOM_MESS_SUB_ROOM_PK_RE_START: + PkModel.get().onReceivePKCreate(((RoomPkAttachment) msg.getAttachment()).getRoomPkData()); + noticePKCreate(); + noticePKInfo(); + addMessages(msg); + break; + case CUSTOM_MESS_SUB_ROOM_PK_RESULT: + Logger.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_024) + msg.getUuid() + " account:" + msg.getFromAccount() + " ClientType:" + msg.getFromClientType() + ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_025) + msg.getTime()); + Logger.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_026) + msg.getAttachment().toJson(false)); + //其他途徑更新了PK結果 + if (PkModel.get().getCurPkInfo() != null + && PkModel.get().getCurPkInfo().getPkStatus() == RoomPkData.PK_STATUS_AFTER_PK) { + break; + } + //通知PK模塊處理結束 + PkModel.get().onReceivePKResult(((RoomPkAttachment) msg.getAttachment()).getRoomPkData()); + addMessages(msg); + break; + + } + break; + case CustomAttachment.CUSTOM_MSG_IM_GAME: + addMessages(msg); + break; + case CustomAttachment.CUSTOM_MSG_GAME_RESPOND: + break; + case CustomAttachment.CUSTOM_MSG_SIGN_IN: + if (second == CustomAttachment.CUSTOM_MSG_SUB_CARVE_UP_GOLD_SECOND_LEVEL) { + addMessages(msg); + } + break; + + case CustomAttachment.CUSTOM_MSG_ROOM_GIFT_VALUE: + if (second == CustomAttachment.CUSTOM_MSG_SUB_GIFT_VALUE_SYNC + && msg.getAttachment() instanceof RoomGiftValueAttachment) { + RoomGiftValueAttachment roomGiftValueAttachment = (RoomGiftValueAttachment) msg.getAttachment(); + if (roomGiftValueAttachment.getRoomGiftValue() != null) { + GiftValueMrg.get().updateRoomGiftValue( + roomGiftValueAttachment.getRoomGiftValue(), true); + } + } + break; + + case CustomAttachment.CUSTOM_MSG_LEAVE_MODE: + if (second == CustomAttachment.CUSTOM_MSG_LEAVE_MODE_NOTICE) { + LeaveModeAttachment leaveModeAttachment = (LeaveModeAttachment) msg.getAttachment(); + sendLeaveModeEvent(leaveModeAttachment.nick, leaveModeAttachment.gender, leaveModeAttachment.avatar); + } + break; + //活動的暴走倒計時觸發 + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ACTIVITY: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_ACTIVITY_TIMER) { + ActivityTimerAttachment activityTimerAttachment = + (ActivityTimerAttachment) msg.getAttachment(); + TimerBean timerBean = activityTimerAttachment.getTimerBean(); + if (timerBean == null) { + LogUtil.e(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_027)); + return; + } + + LogUtil.print(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_028) + timerBean.getLimitTime()); + + EventBus.getDefault().post(new ActivityTimerEvent(timerBean)); + } + break; + //公屏歡迎語 + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PUBLIC_SCREEN: + if (second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_PUBLIC_SCREEN_WELCOME) { + WelcomeAttachment welcomeAttachment = (WelcomeAttachment) msg.getAttachment(); + if (welcomeAttachment.isNeedAddToMsg()) { + addMessages(msg); + } + } + break; + + case CustomAttachment.CUSTOM_MSG_RED_PACKAGE: + switch (second) { + // 老版本厅内红包(2.2.0之前) + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_DIAMOND: + noticeRoomEvent(msg, RoomEvent.RECEIVE_RED_PACKAGE); + break; + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_MSG: + addMessages(msg); + break; + // 新版厅内红包(>=2.2.0版本) + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_DIAMOND2: + noticeRoomEvent(msg, RoomEvent.RECEIVE_RED_PACKAGE); + break; + case CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ROOM_LUCKY_BAG: + if (attachment instanceof RedPackageLuckyBagAttachment) { + RedPackageLuckyBag redPackageLuckyBag = ((RedPackageLuckyBagAttachment) attachment).getRedPackageLuckyBag(); + if (redPackageLuckyBag != null) { + noticeRoomEvent(msg, RoomEvent.MSG_ROOM_LUCKY_BAG_ADD); + if (redPackageLuckyBag.getRoomUid() == AvRoomDataManager.get().getRoomUid()) { + addMessages(msg); + } + } + } + break; + } + break; + + case CustomAttachment.CUSTOM_MSG_LUCKY_GIFT: + switch (second) { + case CUSTOM_MSG_LUCKY_GIFT_ROOM_NOTIFY: + noticeRoomLuckyBagNotice(msg); + break; + case CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY: + noticeServiceLuckyBagNotice(msg); + addMessages(msg); + 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_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; + case CUSTOM_MSG_DATING_All: + if (second == CUSTOM_MSG_SUB_DATING_Al_NOTIFY) { + noticeRoomEvent(msg, RoomEvent.DATING_ALL_NOTIFY); + } + break; + case CUSTOM_MSG_ROOM_PK: + RoomPkBean roomPkBean = ((RoomPKAttachment) msg.getAttachment()).getRoomPkBean(); + //點擊去圍觀切換房間可能會收到之前房間的消息,要忽略掉 + if (roomPkBean.getCUid() != 0 && roomPkBean.getCUid() != AvRoomDataManager.get().getRoomUid()) { + break; + } + switch (second) { + case CUSTOM_MSG_SUB_ROOM_PK_INVITE: + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_INVITE: + if ((AvRoomDataManager.get().isRoomOwner() || AvRoomDataManager.get().isSuperAdmin()) && + !AvRoomDataManager.get().isOpenAnotherPKMode()) { + noticeRoomEvent(msg, RoomEvent.ROOM_PK_INVITE); + } + break; + case CUSTOM_MSG_SUB_ROOM_PK_ACCEPT: + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_ACCEPT: + noticeRoomEvent(msg, RoomEvent.ROOM_PK_ACCEPT); + if (second == CUSTOM_MSG_SUB_SINGLE_ROOM_PK_ACCEPT && + AuthModel.get().getCurrentUid() == roomPkBean.getInviteUid()) { + /* + * TODO #特殊问题记录# + * 2024.3.12发现问题:A给B发出PK邀请,B接收后,A无法听到B的声音,B能听到A的声音; + * 问题原因:B接收后,服务端会发839给A(A就连接B了),但没有地方触发B连接A; + * 临时解决:借用839通道、服务端也发839给B,但由于线上版本839处理时判断了inviteUid==当前房间(即:上面的判断) + * ,所以补发的这条消息某些字段是反的(inviteUid、aRoomId、aUid) + * 所以:后面再处理839事件时需要考虑这点!!! + */ + AudioEngineManager.get().connectOtherRoom(String.valueOf(roomPkBean.getARoomId()), roomPkBean.getAUid()); + } + break; + case CUSTOM_MSG_SUB_ROOM_PK_REFUSE: + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_REFUSE: + if (roomPkBean.getInviteUid() == AuthModel.get().getCurrentUid()) { + noticeRoomEvent(msg, RoomEvent.ROOM_PK_REFUSE); + SingleToastUtil.showToast(ResUtil.getString(R.string.pk_refuse)); + } + break; + case CUSTOM_MSG_SUB_ROOM_PK_UPDATE: + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_UPDATE: + AvRoomDataManager.get().roomPkLiveData.postValue(roomPkBean); + AudioEngineManager.get().setRemoteMute(roomPkBean.getAUid(), roomPkBean.getAMicStatus() == 0); + break; + case CUSTOM_MSG_SUB_ROOM_PK_FINISH: + noticeRoomEvent(msg, RoomEvent.ROOM_PK_FINISH); + AvRoomDataManager.get().roomPkLiveData.postValue(null); + break; + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_FINISH: + AvRoomDataManager.get().roomPkLiveData.postValue(null); + if (AvRoomDataManager.get().isRoomOwner()) { + AudioEngineManager.get().disconnectOtherRoom(); + } + break; + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_RESULT: + AvRoomDataManager.get().roomPkLiveData.postValue(roomPkBean); + noticeRoomEvent(msg, RoomEvent.ROOM_PK_FINISH); + break; + case CUSTOM_MSG_SUB_ROOM_PK_NOTIFY: + noticeRoomEvent(msg, RoomEvent.ROOM_PK_NOTIFY); + break; + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_NOTIFY: + noticeRoomEvent(msg, RoomEvent.SINGLE_ROOM_PK_NOTIFY); + break; + case CUSTOM_MSG_SUB_ROOM_PK_ORDER: + AvRoomDataManager.get().showPkBeginTime = true; + AvRoomDataManager.get().pkBeginTime = roomPkBean.getBeginTime(); + noticeRoomEvent(msg, RoomEvent.ROOM_PK_ORDER); + break; + case CUSTOM_MSG_SUB_SINGLE_ROOM_PK_MUTE_MIC: + AudioEngineManager.get().setRemoteMute(roomPkBean.getAUid(), roomPkBean.getAMicStatus() == 0); + RoomPkBean currRoomPkBean = AvRoomDataManager.get().roomPkLiveData.getValue(); + if (currRoomPkBean != null) { + currRoomPkBean.setAMicStatus(roomPkBean.getAMicStatus()); + AvRoomDataManager.get().roomPkLiveData.postValue(currRoomPkBean); + } + noticeRoomEvent(msg, RoomEvent.ROOM_PK_MUTE_MIC); + break; + } + break; + case CUSTOM_MSG_VIP: + if (second == CUSTOM_MSG_VIP_ROOM_UPGRADE || + second == CUSTOM_MSG_VIP_ROOM_ALL_UPGRADE || + second == CUSTOM_MSG_VIP_ROOM_OPEN) { + addMessages(msg); + } else if (second == CUSTOM_MSG_VIP_ROOM_BROADCAST) { + EventBus.getDefault().post(new VipBroadcastMsgEvent(msg)); + } + break; + case ANCHOR_ROOM_AUDIENCE_UPMIC: + if (AvRoomDataManager.get().isRoomOwner()) { + msg.setAttachment(attachment); + noticeRoomEvent(msg, RoomEvent.REQUEST_UP_MIC); + } + break; + case CUSTOM_MSG_FANS_TEAM: + switch (second) { + case CUSTOM_MSG_SUB_FANS_TEAM_OPEN: + noticeRoomEvent(msg, RoomEvent.FANS_TEAM_OPEN_SUCCESS); + break; + case CUSTOM_MSG_SUB_FANS_TEAM_OPEN_FAILED: + noticeRoomEvent(msg, RoomEvent.FANS_TEAM_OPEN_FAILED); + break; + case CUSTOM_MSG_SUB_FANS_TEAM_JOIN: + noticeRoomEvent(msg, RoomEvent.FANS_TEAM_JOIN); + addMessages(msg); + break; + case CUSTOM_MSG_SUB_FANS_TEAM_EXIT: + noticeRoomEvent(msg, RoomEvent.FANS_TEAM_EXIT); + break; + default: + break; + } + break; + case CUSTOM_MSG_SINGLE_ROOM_RANK: + if (second == CUSTOM_MSG_SUB_SINGLE_ROOM_RANK_TOP) { + noticeRoomEvent(msg, RoomEvent.SINGLE_ROOM_RANK_TOP_NOTIFY); + } + break; + case CUSTOM_MSG_ROOM_RANK: + if (second == CUSTOM_MSG_SUB_ROOM_RANK_TOP) { + noticeRoomEvent(msg, RoomEvent.ROOM_RANK_TOP_NOTIFY); + } + break; + case CUSTOM_MSG_GIFT_COMPOUND: + if (second == CUSTOM_MSG_SUB_GIFT_COMPOUND) { + noticeRoomEvent(msg, RoomEvent.ROOM_GIFT_COMPOUND); + addMessages(msg); + } + break; + case CUSTOM_MSG_DRAW_GIFT_EFFECT: + if (customAttachment.getSecond() == CUSTOM_MSG_SUB_TYPE_DRAW_GIFT_EFFECT) { + noticeRoomEvent(msg, RoomEvent.DRAW_GIFT_EFFECT); + } + break; + case CUSTOM_MSG_LUCKY_SEA: + RoomLuckySeaAttachment luckySeaAttachment = (RoomLuckySeaAttachment) msg.getAttachment(); + RoomLuckySeaMsgBean roomLuckySeaMsgInfo = luckySeaAttachment.getRoomLuckySeaMsgInfo(); + if (second == CUSTOM_MSG_LUCKY_SEA_GIFT_ROOM_NOTIFY) { + if (roomLuckySeaMsgInfo.getRoomUid() == AvRoomDataManager.get().getRoomUid()) { + addMessages(msg); + } + } else if (second == CUSTOM_MSG_LUCKY_SEA_GIFT_SERVER_NOTIFY) { + addMessages(msg); + if (roomLuckySeaMsgInfo.getRoomUid() == AvRoomDataManager.get().getRoomUid()) { + noticeRoomEvent(msg, RoomEvent.LUCKY_SEA_GIFT_SERVER_NOTIFY); + } + } + break; + case ROOM_FREE_GIFT: + if (second == ROOM_FREE_GIFT_CHANGE) { + RoomFreeGiftAttachment freeGiftAttachment = (RoomFreeGiftAttachment) attachment; + RoomFreeGiftMsgBean bean = freeGiftAttachment.getRoomFreeGiftMsgInfo(); + EventBus.getDefault().post(new UpdateKnapFreeGiftDataEvent(bean)); + } + break; + case CUSTOM_MSG_FAIRY: + if (second != CUSTOM_MSG_SUB_FAIRY_SEND && second != CUSTOM_MSG_SUB_FAIRY_ASK_FOR) { + addMessages(msg); + } + switch (second) { + case CUSTOM_MSG_SUB_DRAW_GIFT_L4: + noticeRoomEvent(msg, RoomEvent.FAIRY_DRAW_GIFT_L4); + break; +// case CUSTOM_MSG_SUB_DRAW_GIFT_L5: +// noticeRoomEvent(msg, RoomEvent.FAIRY_DRAW_GIFT_L5); +// break; + case CUSTOM_MSG_SUB_CONVERT_L1: + noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L1); + break; + case CUSTOM_MSG_SUB_CONVERT_L2: + noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L2); + break; + case CUSTOM_MSG_SUB_CONVERT_L3: + noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L3); + break; + } + break; + case CUSTOM_MESS_TAROT: + if (second == CUSTOM_MESS_TAROT_INTERMEDIATE_PRIZE_WINNING + || second == CUSTOM_MESS_TAROT_SENIOR_PRIZE_WINNING) { + noticeTarot(msg, second); + } + break; + case CUSTOM_MSG_NOTIFY_H5: + noticeH5(msg); + break; + case CUSTOM_MSG_ROOM_ALBUM: + addMessages(msg); + break; + case CUSTOM_MSG_ROOM_TEMPLATE: + switch (second){ + case CUSTOM_MSG_ROOM_TEMPLATE_SUB_ROOM: + case CUSTOM_MSG_ROOM_TEMPLATE_SUB_ALL_ROOM: + addMessages(msg); + break; + } + break; + case CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE: + if (second == CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE_SUB || second == CUSTOM_MSG_SUPER_BRAVO_GIFT_TEMPLATE_SUB) { + addMessages(msg); + } else if (second == CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM + || second == CUSTOM_MSG_SUPER_LUCKY_GIFT_ALL + || second == CUSTOM_MSG_SUPER_LUCKY_GIFT_SELF){ + + LuckyGiftNotifyAttachment luckyGiftAttachment = (LuckyGiftNotifyAttachment) attachment; + MsgSuperLuckyGift msgSuperLuckyGift = new MsgSuperLuckyGift(); + msgSuperLuckyGift.luckyGiftMsgSelfBean = luckyGiftAttachment.luckyGiftMsgSelfBean; + msgSuperLuckyGift.luckyGiftMsgAllBean = luckyGiftAttachment.luckyGiftMsgAllBean; + + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_SUPER_LUCKY_GIFT) + .setMsgSuperLuckyGift(msgSuperLuckyGift)); + }else if (second == CUSTOM_MSG_SUPER_BRAVO_GIFT_NOTIFY){ + BravoGiftNotifyAttachment bravoGiftNotifyAttachment = (BravoGiftNotifyAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_SUPER_BRAVO_NOTIFY) + .setAnyData(bravoGiftNotifyAttachment.bravoData)); + }else if (second == CUSTOM_MSG_SUPER_BRAVO_GIFT_REWARD){ + BravoGiftRewardAttachment bravoGiftRewardAttachment = (BravoGiftRewardAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_SUPER_BRAVO_REWARD) + .setAnyData(bravoGiftRewardAttachment.bravoData)); + } + + break; + case CUSTOM_MSG_TEMPLATE_NOTIFY: + if (second == CUSTOM_MSG_TEMPLATE_NOTIFY_ROOM) { + noticeRoomEvent(msg, RoomEvent.TEMPLATE_NOTIFY); + } + break; + + case CP_FIRST: + CpMsgAttachment cpMsgAttachment = (CpMsgAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_CP_ABOUT) + .setCpMsgBean(cpMsgAttachment.cpMsgBean)); + break; + case BOOM_FIRST: + // BOOM_SECOND_DIALOG 是广播消息,在BaseAct 处理 + BoomMsgAttachment boomMsgAttachment = (BoomMsgAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_BOOM) + .setBoomMsg(boomMsgAttachment)); + break; + + case ROOM_BG_CHANGE_FIRST: + RoomBgChangeMsgAttachment roomBgChangeMsgAttachment = (RoomBgChangeMsgAttachment) attachment; + + // 针对房间最小化时的处理 + if (AvRoomDataManager.get().mCurrentRoomInfo != null && !AvRoomDataManager.get().hasAvRoomAct) { + String fromAccount = msg.getFromAccount(); + String sessionId = msg.getSessionId(); + String roomUid = String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getUid()); + String roomId = String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId()); + + if (fromAccount !=null && fromAccount.equals(roomUid)){ + if (sessionId != null && sessionId.equals(roomId)) { + if (roomBgChangeMsgAttachment.bgChangeBean != null && roomBgChangeMsgAttachment.bgChangeBean.url!=null) { + AvRoomDataManager.get().mCurrentRoomInfo.setBackPic(roomBgChangeMsgAttachment.bgChangeBean.url); + } + } + } + } + + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_ROOM_BG_CHANGE) + .setRoomBgChangeBean(roomBgChangeMsgAttachment.bgChangeBean)); + break; + + case ROOM_LEVEL_CHANGE_FIRST: + RoomLevelChangeMsgAttachment levelChangeMsgAttachment = (RoomLevelChangeMsgAttachment) attachment; + + // 针对房间最小化时的处理 + if (AvRoomDataManager.get().mCurrentRoomInfo != null && !AvRoomDataManager.get().hasAvRoomAct) { + String fromAccount = msg.getFromAccount(); + String sessionId = msg.getSessionId(); + String roomUid = String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getUid()); + String roomId = String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId()); + + if (fromAccount !=null && fromAccount.equals(roomUid)){ + if (sessionId != null && sessionId.equals(roomId)) { + if (levelChangeMsgAttachment.mLevelChangeBean != null && levelChangeMsgAttachment.mLevelChangeBean.roomLevelIcon != null) { + AvRoomDataManager.get().mCurrentRoomInfo.setRoomLevelIcon(levelChangeMsgAttachment.mLevelChangeBean.roomLevelIcon); + } + } + } + } + + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MSG_ROOM_LEVEL_CHANGE) + .setAnyData(levelChangeMsgAttachment.mLevelChangeBean)); + break; + + case CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED: + if (second == CUSTOM_MSG_ROOM_SERIAL_VALUE_CHANGED_SUB) { + RoomSerialValueChangedAttachment serialValueAttachment = (RoomSerialValueChangedAttachment) attachment; + AvRoomDataManager.get().setSerialValue(serialValueAttachment.getSerialValue()); + noticeRoomEvent(msg, RoomEvent.SERIAL_VALUE_CHANGED); + } + break; + + case ROOM_PIC_SCREEN_FIRST: +// OtherExtKt.doLog("收到 ROOM_PIC_SCREEN_FIRST 消息"); + + if (second == ROOM_PIC_SCREEN_SECOND){ + addMessages(msg); + }else if (second == ROOM_MSG_USER_ENTER_ROOM) { +// //xxx 成员进房消息 在这里监听 +// chatRoomMemberIn(targets.get(0), msg); + RoomUserEnterRoomMsgAttachment enterRoomMsgAttachment = (RoomUserEnterRoomMsgAttachment) attachment; + + boolean addMsg = true; + if (enterRoomMsgAttachment.userEnterRoomBean.isInRoom()) { + if (enterRoomMsgAttachment.userEnterRoomBean.enterHide || enterRoomMsgAttachment.userEnterRoomBean.isSuperAdmin()) { + addMsg = false; //是进房,但是开了隐身 或者 超管,那就不要添加公屏 + if ( AuthModel.get().getCurrentUid() == enterRoomMsgAttachment.userEnterRoomBean.uid) { + //SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_029)); + SpannableStringBuilder builder = new SpannableStringBuilder(); + builder.append("-"); + builder.setSpan(new ImageSpan(BitmapFactory.decodeResource(BasicConfig.INSTANCE.getAppContext().getResources(), R.drawable.ic_hide_enter_room)), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + builder.append(" "); + builder.append(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_030)); + ToastUtils.show(builder); + } + } else { + addMsg = true; //是进房, 没开隐身不是超管,那就 -> 飘屏通知 + 添加公屏 + noticeMemBerInNotice(msg); //成员进房飘屏通知 + } + + ChatRoomMember chatRoomMember = new ChatRoomMember(); + chatRoomMember.setAccount(String.valueOf(enterRoomMsgAttachment.userEnterRoomBean.uid)); + chatRoomMember.setAvatar(enterRoomMsgAttachment.userEnterRoomBean.avatar); + chatRoomMember.setNick(enterRoomMsgAttachment.userEnterRoomBean.nick); + AvRoomDataManager.get().mRoomAllMemberList.add(chatRoomMember); + } + + if (addMsg) { + if (OtherExtKt.isVerify(enterRoomMsgAttachment.userEnterRoomBean.cpList)) { + //有cp列表,要循环添加公屏 + for (int i = 0; i < enterRoomMsgAttachment.userEnterRoomBean.cpList.size(); i++) { + RoomUserEnterRoomMsgAttachment newMsgAttachment = (RoomUserEnterRoomMsgAttachment) attachment; + newMsgAttachment.userEnterRoomBean.cpNick = enterRoomMsgAttachment.userEnterRoomBean.cpList.get(i).cpNick; + newMsgAttachment.userEnterRoomBean.cpLevel = enterRoomMsgAttachment.userEnterRoomBean.cpList.get(i).cpLevel; + msg.setAttachment(newMsgAttachment); + addMessages(msg); + } + } else { + addMessages(msg); + } + } + } + break; + default: + break; + } + } else if (msg.getMsgType() == MsgTypeEnum.text) { + addMessages(msg); + } + } + + if (face) { + DynamicFaceModel.get().onReceiveChatRoomMessages(messages); + } else if (gift) { + GiftModel.get().onReceiveChatRoomMessages(messages); + } + } + + /** + * 是否不需要添加到公屏(超级幸运礼物特殊,会单独添加到公屏) + */ + private boolean isIgnoreMessageOfSuperLuckGift(CustomAttachment attachment) { + if (attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_MULTI_GIFT) { + if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_MULTI_GIFT || attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_BATCH_SEND_GIFT) { + if (attachment instanceof MultiGiftAttachment) { + MultiGiftAttachment multiGiftAttachment = (MultiGiftAttachment) attachment; + GiftInfo giftInfo = multiGiftAttachment.getMultiGiftReceiveInfo().getGift(); + if (giftInfo != null && giftInfo.getGiftType() == GiftType.GIFT_TYPE_SUPER_LUCKY) { + return true; + } + } + } + } + if (attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_GIFT) { + if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_GIFT) { + if (attachment instanceof GiftAttachment) { + GiftAttachment giftAttachment = (GiftAttachment) attachment; + GiftReceiveInfo giftReceiveInfo = giftAttachment.getGiftReceiveInfo(); + GiftInfo giftInfo = giftReceiveInfo.getGift(); + if (giftInfo != null && giftInfo.getGiftType() == GiftType.GIFT_TYPE_SUPER_LUCKY) { + return true; + } + } + } + } + return false; + } + + private void pkCloseUpdateSelfMicInfo() { + if (AvRoomDataManager.get().isOnMic(AuthModel.get().getCurrentUid())) { + UserModel.get().getCacheLoginUserInfo().setGroupType(PKTeamInfo.TEAM_NONE); + //在麥上就更新信息 + AvRoomModel.get().updateMyMicQueue( + AvRoomDataManager.get().getMicPosition(AuthModel.get().getCurrentUid()), + String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId()), + UserModel.get().getCacheLoginUserInfo(), + !AudioEngineManager.get().isMute() + ) + .subscribe(); + } + } + + private void inviteInPKTeam(Map inviteMap) { + for (Map.Entry stringRoomPKInvitedUpMicMemberEntry : inviteMap.entrySet()) { + RoomPKInvitedUpMicMember value = stringRoomPKInvitedUpMicMemberEntry.getValue(); + //自己查看隊伍裏面有沒有自己的id,有的話更新自己的麥序信息 + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(value.getUid())) { + //更新麥序 + AvRoomModel.get().updateOrUpMic(value).subscribe(); + } + + //如果沒在麥上,通知邀請上麥的相關UI邏輯,如:自己退出排麥隊列...等。 + if (!AvRoomDataManager.get().isOwnerOnMic()) { + noticePKInviteUpMic(value.getUid()); + } + + } + } + + private void noticePKInviteUpMic(String account) { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.PK_INVITE_IN_TEAM).setAccount(account)); + } + + private void noticeReceivedMonsterAward(AssistantAttachment monsterAwardAttachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.MONSTER_HUNTING) + .setMonsterAwardAttachment(monsterAwardAttachment)); + } + + public void noticeRoomEvent(ChatRoomMessage message, int eventID) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(eventID) + .setChatRoomMessage(message) + ); + } + + private void noticeReceivedKickRoom(RoomQueueMsgAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.OTHER_KICK_OUT_ROOM) + .setAccount(attachment.uid)); + } + + /** + * 拉黑/踢出房間 + */ + private void noticeReceivedKickOrBlackBySAdmin(SuperAdminOpAttachment attachment) { + String targetUid = null; + if (attachment.getInfo() != null) { + targetUid = attachment.getInfo().getTargetUid(); + } + if (targetUid == null) { + targetUid = ""; + } + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.OTHER_KICK_OUT_OR_ADD_BLACK_BY_S_ADMIN) + .setAccount(targetUid)); + } + + /** + * 自己被超管踢出房間 + */ + private void noticeMyselfKickOutBySAdmin(SuperAdminOpAttachment attachment) { + String targetUid = null; + if (attachment.getInfo() != null) { + targetUid = attachment.getInfo().getTargetUid(); + } + if (targetUid == null) { + targetUid = ""; + } + //如果avroom的實例存在,由avroom執行退出房間 + //如果不存在,由main執行退出房間 + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.MY_SELF_KICK_OUT_ROOM_BY_S_ADMIN) + .setAccount(targetUid)); + } + + private void noticeReceivedAddBlack(RoomQueueMsgAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.OTHER_ADD_BLACK) + .setAccount(attachment.uid)); + } + + /** + * 成員進入房間 + */ + private void chatRoomMemberIn(final String account, ChatRoomMessage msg) { + List list = new ArrayList<>(1); + list.add(account); + noticeRoomMemberChange(true, account, msg); + ChatRoomMessageExtension messageExtension = msg.getChatRoomMessageExtension(); + ChatRoomMember chatRoomMember = new ChatRoomMember(); + Map extensionMap = null; + if (messageExtension != null) { + chatRoomMember.setNick(messageExtension.getSenderNick()); + chatRoomMember.setAvatar(messageExtension.getSenderAvatar()); + 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()); + if (extensionData instanceof Map) { + Map extensionDataMap = (Map) extensionData; + int fromType = 0; + if (extensionDataMap.containsKey("fromType")) { + fromType = (int) extensionDataMap.get("fromType"); + } + + String fromNick = ""; + if (extensionDataMap.containsKey("fromNick")) { + fromNick = (String) extensionDataMap.get("fromNick"); + } + + String fromUid = ""; + if (extensionDataMap.containsKey("fromUid")) { + fromUid = (String) extensionDataMap.get("fromUid"); + } + + //擴展字段是自己服務器的,更新及時點 + if (extensionDataMap.containsKey("avatar")) { + chatRoomMember.setAvatar((String) extensionDataMap.get("avatar")); + } + + int experLevelSeq = 0; + if (extensionDataMap.containsKey("experLevelSeq")) { + experLevelSeq = (int) extensionDataMap.get("experLevelSeq"); + } + + String enterRoomEffects = ""; + if (extensionDataMap.containsKey(UserInfo.ENTER_ROOM_EFFECTS)) { + enterRoomEffects = (String) extensionDataMap.get(UserInfo.ENTER_ROOM_EFFECTS); + } + Map remoteExtension = msg.getRemoteExtension(); + if (remoteExtension == null) { + remoteExtension = new HashMap<>(); + } + + remoteExtension.put("fromType", fromType); + remoteExtension.put("fromNick", fromNick); + remoteExtension.put("fromUid", fromUid); + remoteExtension.put("experLevelSeq", experLevelSeq); + remoteExtension.put(UserInfo.ENTER_ROOM_EFFECTS, enterRoomEffects); + msg.setRemoteExtension(remoteExtension); + } + } + + if (!needToHideEnterMessage(msg)) { + // 添加消息到公屏 +// addMessagesImmediately(msg); + //需要稍微延遲點,否則有沖突 + //通知播放 进场横幅动画 +// new Handler().postDelayed(() -> noticeMemBerInNotice(msg), 500); + } else { + if (Objects.equals(String.valueOf(AuthModel.get().getCurrentUid()), account)) { + //SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_029)); + SpannableStringBuilder builder = new SpannableStringBuilder(); + builder.append("-"); + builder.setSpan(new ImageSpan( + BitmapFactory.decodeResource( + BasicConfig.INSTANCE.getAppContext().getResources(), + R.drawable.ic_hide_enter_room)), + 0, 1, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + builder.append(" "); + builder.append(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_030)); + ToastUtils.show(builder); + } + } + AvRoomDataManager.get().mRoomAllMemberList.add(chatRoomMember); + } + + + /** + * 退出房間處理 + */ + private void chatRoomMemberExit(String account, ChatRoomMessage message) { + noticeRoomMemberChange(false, account, message); + RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (mCurrentRoomInfo == null) return; + + ChatRoomMember removeChatMember = null; + boolean isAdmin = false; + ListIterator iterator = AvRoomDataManager.get().mRoomAllMemberList.listIterator(); + while (iterator.hasNext()) { + removeChatMember = iterator.next(); + if (Objects.equals(removeChatMember.getAccount(), account)) { + if (removeChatMember.getMemberType() == MemberType.ADMIN) { + isAdmin = true; + } + iterator.remove(); + } + } + if (isAdmin) { + removeManagerMember(removeChatMember); + } + + // 這裏要清理調退出房間的PK 隊員 + PkModel.get().onTeamMemberExitRoom(account); + } + + /** + * 麥序更新 + * + * @param extension - + */ + private void roomQueueMicUpdate(Map extension) { + String micInfo = (String) extension.get("micInfo"); + if (!TextUtils.isEmpty(micInfo)) { + int type = (int) extension.get("type"); + if (type == 2) { + RoomMicInfo roomMicInfo = gson.fromJson(micInfo, RoomMicInfo.class); + updateRoomQueueMicInfo(gson, roomMicInfo); + } else if (type == 3) { + List roomMicInfoList = gson.fromJson(micInfo, new TypeToken>() { + }.getType()); + for (RoomMicInfo roomMicInfo : roomMicInfoList) { + updateRoomQueueMicInfo(gson, roomMicInfo); + } + } + + } + } + + private void updateRoomQueueMicInfo(Gson gson, RoomMicInfo roomMicInfo) { + if (roomMicInfo != null) { + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(roomMicInfo.getPosition()); + if (roomQueueInfo != null) { + roomQueueInfo.mRoomMicInfo = roomMicInfo; + //處理聲網聲音相關的 + if (roomQueueInfo.mChatRoomMember != null) { + if (AvRoomDataManager.get().isOwner(roomQueueInfo.mChatRoomMember.getAccount())) { + AudioEngineManager.get().setRole( + roomQueueInfo.mRoomMicInfo.isMicMute() ? Constants.CLIENT_ROLE_AUDIENCE : Constants.CLIENT_ROLE_BROADCASTER); + } + } + noticeMicPosStateChange(roomMicInfo.getPosition() + 1, roomQueueInfo); + } + } + } + + + /** + * 麥序狀態,房間信息 + * + * @param msg - + */ + private void chatRoomInfoUpdate(ChatRoomMessage msg) { + ChatRoomNotificationAttachment notificationAttachment = (ChatRoomNotificationAttachment) msg.getAttachment(); + Map extension = notificationAttachment.getExtension(); + if (extension != null) { + // 1----房間信息更新 2-----麥序信息更新 + // 3----更新房間信息和麥序信息(排麥模式) + int type = (int) extension.get("type"); + + if (BuildConfig.DEBUG) { + LogUtils.d("chatRoomInfoUpdate type =" + type + " extension=" + Arrays.toString(extension.entrySet().toArray())); + } + if (type == 2) { + roomQueueMicUpdate(extension); + } else if (type == 1) { + roomInfoUpdate(extension); + } else if (type == 3) { + roomQueueMicUpdate(extension); + roomInfoUpdate(extension); + } + } + } + + + /** + * 房間信息更新 + * + * @param extension -- + */ + private void roomInfoUpdate(Map extension) { + String roomInfoStr = (String) extension.get("roomInfo"); + if (!TextUtils.isEmpty(roomInfoStr)) { + com.example.lib_utils.log.LogUtil.d(TAG, "roomInfoUpdate roomInfoStr:" + roomInfoStr, false); + RoomInfo roomInfo = gson.fromJson(roomInfoStr, RoomInfo.class); + if (roomInfo != null) { + boolean isTypeChanged = false; + if (AvRoomDataManager.get().mCurrentRoomInfo != null && AvRoomDataManager.get().mCurrentRoomInfo.getType() != roomInfo.getType()) { + isTypeChanged = true; + } + AvRoomDataManager.get().mCurrentRoomInfo = roomInfo; + com.example.lib_utils.log.LogUtil.d(TAG, "roomInfoUpdate isTypeChanged:" + isTypeChanged, false); + if (isTypeChanged) { + onRoomTypeChanged(roomInfo); + }else{ + AvRoomDataManager.get().mCurrentRoomInfo = roomInfo; + noticeRoomInfoUpdate(roomInfo); + } + } + } + } + + @SuppressLint("CheckResult") + private void onRoomTypeChanged(RoomInfo roomInfo) { + RoomMicQueueModel.INSTANCE.queueMicQueue(roomInfo.getRoomId()).subscribe(new Consumer>() { + @Override + public void accept(SparseArray roomQueue) throws Exception { + com.example.lib_utils.log.LogUtil.d(TAG, "onRoomTypeChanged accept", false); + AvRoomDataManager.get().replaceMicQueue(roomQueue); + GiftValueMrg.get().updateRoomGiftValue(false); + noticeRoomInfoUpdate(roomInfo); + tryAutoUpMic(); + } + }); + } + //xxx 上麦,云信 监听云信上麦 + private void chatRoomQueueChangeNotice(ChatRoomMessage msg) { + 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(); + LogUtils.d(content); + String key = roomQueueChangeAttachment.getKey(); + switch (roomQueueChangeAttachment.getChatRoomQueueChangeType()) { + case DROP: + break; + case POLL: + downMicroQueue(key); + + break; + case OFFER: + Map senderExtension = msg.getChatRoomMessageExtension().getSenderExtension(); + upMicroQueue(content, key, senderExtension); + break; + case PARTCLEAR: + break; + case BATCH_UPDATE: + // Error 衛明說有邏輯上的bug 禁止使用 + break; + case undefined: + break; + default: + } + } + + /** + * 在麥位的用戶退出房間處理退出房間 + * 標題:關於聊天室隊列變更通知的特別說明 + * 鏈接: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); + } + } + } + } + + /** + * 進入聊天室 + */ + public void joinAvRoom() { + RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (curRoomInfo == null) return; + noticeEnterMessages(); + //個播模式房主進房自動上麥 + tryAutoUpMic(); + } + + private void tryAutoUpMic() { + RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (curRoomInfo == null) return; + if (AvRoomDataManager.get().isSingleRoom() && AvRoomDataManager.get().isRoomOwner() && !AvRoomDataManager.get().isOwnerOnMic()) { + AvRoomModel.get().upMicroPhone( + -1, + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(curRoomInfo.getRoomId()), + false, + new CallBack() { + @Override + public void onSuccess(String data) { + + } + + @Override + public void onFail(int code, String error) { + + } + } + ); + } + } + + public ChatRoomMessage getFirstMessageContent() { + String content = ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_01); + ChatRoomMessage message = ChatRoomMessageBuilder.createTipMessage(content); + message.setContent(content); + return message; + } + + /** + * 檢查是否是公屏需要的消息,打怪獸的消息不加入公屏 + * + * @param chatRoomMessage + * @return + */ + private boolean checkNoNeedMsg(ChatRoomMessage chatRoomMessage) { + if (chatRoomMessage == null) return true; + if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment(); + if (attachment.getSecond() == CustomAttachment.CUSTOM_NOTI_SUB_GAME_ATTACK || + attachment.getSecond() == CustomAttachment.CUSTOM_NOTI_SUB_GAME_END) { + return true; + } + if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_MONSTER_HUNTING) { + MonsterDataBean dataBean = ((MonsterStatusAttachment) attachment).getDataBean(); + if (dataBean.getMonsterStatus() == MonsterInfo.MONSTER_STATUS_WILL_APPEAR) { + if (dataBean.getBeforeAppearSeconds() > 15) { + return true; + } + } + } + if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE_KICK || + attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_KICK_ROOM || + attachment.getSecond() == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SEND_ADD_BLACK) { + RoomQueueMsgAttachment roomQueueMsgAttachment = (RoomQueueMsgAttachment) attachment; + if (Objects.equals("", roomQueueMsgAttachment.targetNick)) { + return true; + } + } + + if (attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_GIFT) { + if (attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_SEND_ALL_SERVICE_GIFT + || attachment.getSecond() == CUSTOM_MSG_ALL_SERVICE_GIFT){ + return true; + } + } + } + return false; + } + + + /** + * 添加消息到公屏 + * + * @param msg + */ + public void addMessagesImmediately(ChatRoomMessage msg) { + if (AvRoomDataManager.get().mCurrentRoomInfo != null && AvRoomDataManager.get().mCurrentRoomInfo.isCloseScreen()) + return; + + if (msg == null) { + return; + } + + if (msg.getAttachment() != null && msg.getAttachment() instanceof GiftAttachment) { + GiftAttachment attachment = (GiftAttachment) msg.getAttachment(); + if (attachment.getGiftReceiveInfo().isRoomAlbum()) { + return; + } + } + + if (!checkNoNeedMsg(msg)) { + noticeReceiverMessageImmediately(msg); + } + } + + /** + * 添加消息到公屏 + * + * @param msg + */ + public void addMessages(ChatRoomMessage msg) { + if (AvRoomDataManager.get().mCurrentRoomInfo != null && AvRoomDataManager.get().mCurrentRoomInfo.isCloseScreen()) + return; + if (msg != null && !checkNoNeedMsg(msg)) { + noticeReceiverMessage(msg); + } + } + + + public void addCloseScreenMessages(ChatRoomMessage msg) { + noticeReceiverMessage(msg); + } + + public void addOpenRedPackageSwitch(ChatRoomMessage msg) { + noticeReceiverMessage(msg); + } + + + public Observable getChatRoomMsgFlowable() { + return getChatRoomMsgPublisher() + .toFlowable(BackpressureStrategy.BUFFER) + .toObservable() + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()); + } + + private PublishSubject getChatRoomMsgPublisher() { + return msgProcessor; + } + + public PublishProcessor getRelationShipEventObservable() { + return relationShipProcessor; + } + + public PublishProcessor getChatRoomEventObservable() { + return roomProcessor; + } + + /************************雲信聊天室 普通操作(每個人都可以使用的) start******************************/ + + /** + * 發送公屏上的Tip信息 + * 子協議一: 關註房主提示- CustomAttachment.CUSTOM_MSG_SUB_TYPE_ROOM_TIP_SHARE_ROOM + * 子協議二: 分享房間成功的提示- CustomAttachment.CUSTOM_MSG_SUB_TYPE_ROOM_TIP_ATTENTION_ROOM_OWNER + * + * @param targetUid - + * @param subType -發送公屏上Tip信息的子協議 + */ + public Single sendChatRoomTipMsg(long targetUid, int subType) { + return UserModel.get().getUserInfo(targetUid) + .flatMap(new Function>() { + @Override + public SingleSource apply(UserInfo userInfo) throws Exception { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); + if (roomInfo != null && userInfo != null && myUserInfo != null) { + RoomTipAttachment roomTipAttachment = new RoomTipAttachment( + CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP, + subType + ); + roomTipAttachment.setUid(myUserInfo.getUid()); + roomTipAttachment.setNick(myUserInfo.getNick()); + roomTipAttachment.setTargetUid(targetUid); + roomTipAttachment.setTargetNick(userInfo.getNick()); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + // 自定義消息 + roomTipAttachment + ); + return sendChatRoomMessage(message, false); + } + return Single.error(new Exception("roomInfo or userInfo or myUserInfo is null !")); + } + }); + + } + + /** + * 發送文本信息 + * + * @param message - + */ + public Single sendTextMsg(long roomId, String message, @Nullable AtProxy atProxy) { + if (TextUtils.isEmpty(message) || TextUtils.isEmpty(message.trim())) + return Single.error(new ErrorThrowable("message == null !!!")); + ChatRoomMessage chatRoomMessage = ChatRoomMessageBuilder.createChatRoomTextMessage( + String.valueOf(roomId), message); + + if (atProxy != null) { + chatRoomMessage.setLocalExtension(atProxy.getAtExtensionMap()); + atProxy.reset(); + } +// NIMAntiSpamOption antiSpamOption = new NIMAntiSpamOption(); +// antiSpamOption.antiSpamConfigId = XConstants.CHAT_ROOM_ANTI_SPAM_CONFIG_ID; +// chatRoomMessage.setNIMAntiSpamOption(antiSpamOption); + if (AntiSpamUtil.checkLocalAntiSpam(chatRoomMessage)) { + EventBus.getDefault().post(new AntiSpamEvent()); + return Single.error(new AntiSpamHitException("檢測到敏感詞,需要過濾,不能發送")); + } else { + return sendChatRoomMessage(chatRoomMessage, false); + } + } + + /** + * 下麥 + * + * @param key -- + */ + private void downMicroQueue(String key) { + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (!TextUtils.isEmpty(key) && mMicQueueMemberMap != null) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(Integer.parseInt(key)); + if (roomQueueInfo != null && roomQueueInfo.mChatRoomMember != null) { + MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; + + RoomPkData roomPkData = PkModel.get().getCurPkInfo(); + //這裏處理把這個人添加到隊伍,或者移除隊伍 + if (roomPkData != null && (roomPkData.getPkStatus() == RoomPkData.PK_STATUS_BEFORE_PK + || roomPkData.getPkStatus() == RoomPkData.PK_STATUS_AFTER_PK)) { + UserInfo userInfo = new UserInfo(); + userInfo.setUid(Long.parseLong(chatRoomMember.getAccount())); + userInfo.setNick(chatRoomMember.getNick()); + userInfo.setAvatar(chatRoomMember.getAvatar()); + userInfo.setGender(chatRoomMember.getGender()); + PkModel.get().syncPkList(userInfo, PKTeamInfo.TEAM_NONE); + noticePKInfo(); + } + + + String account = roomQueueInfo.mChatRoomMember.getAccount(); + if (AvRoomDataManager.get().isOwner(account)) { + // 更新聲網閉麥 ,發送狀態信息 + AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE); + } + roomQueueInfo.mChatRoomMember = null; + // 通知界面更新麥序信息 + noticeDownMic(key, account); + } + } + } + + /** + * 上麥 + * + * @param content -- + */ + private synchronized void upMicroQueue(String content, final String key, Map extension) { + final SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (!TextUtils.isEmpty(content)) { + JsonParser jsonParser = new JsonParser(); + final JsonObject contentJsonObj = jsonParser.parse(content).getAsJsonObject(); + if (contentJsonObj != null) { + int micPosition = Integer.parseInt(key); + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(micPosition); + if (roomQueueInfo == null) { + return; + } + MicMemberInfo chatRoomMember = gson.fromJson(contentJsonObj, MicMemberInfo.class); + //這裏處理把這個人添加到隊伍,或者移除隊伍 + UserInfo userInfo = new UserInfo(); + userInfo.setUid(Long.parseLong(chatRoomMember.getAccount())); + userInfo.setNick(chatRoomMember.getNick()); + userInfo.setAvatar(chatRoomMember.getAvatar()); + userInfo.setGender(chatRoomMember.getGender()); + PkModel.get().syncPkList(userInfo, chatRoomMember.getGroupType()); + noticePKInfo(); + + int oldMicPosition = AvRoomDataManager.get().getMicPosition(AuthModel.get().getCurrentUid()); + boolean oldIsOnMic = AvRoomDataManager.get().isOwnerOnMic(); + + int size = mMicQueueMemberMap.size(); + if (size > 0) { + for (int j = 0; j < size; j++) { + RoomQueueInfo temp = mMicQueueMemberMap.valueAt(j); + if (temp.mChatRoomMember != null && Objects.equals(temp.mChatRoomMember.getAccount(), chatRoomMember.getAccount())) { + //處理同一個人換坑問題 + temp.mChatRoomMember = null; + } + // 允許接收所有人的聲網音頻流,不會影響本來麥上的靜音狀態,也不會影響自己操作過的靜音按鈕 + if (temp.mChatRoomMember != null) { + AudioEngineManager.get().setRemoteMute(Long.parseLong(temp.mChatRoomMember.getAccount()), false); + } + } + } + RoomQueueInfo tempRoomQueueInfo = mMicQueueMemberMap.get(micPosition); + if (tempRoomQueueInfo != null && tempRoomQueueInfo.mChatRoomMember != null && !Objects.equals(tempRoomQueueInfo.mChatRoomMember.getAccount(), chatRoomMember.getAccount())) { + //被擠下麥的情況 + 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; + // 這個人上麥後,恢復之前他因為是黑麥被禁言 + AudioEngineManager.get().setRemoteMute(Long.parseLong(chatRoomMember.getAccount()), false); + + //重新更新隊列,隊列上是否還有自己 + if (!AvRoomDataManager.get().isOwnerOnMic()) { + //處理可能自己被擠下還能說話的情況 + AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE); + } + + if (AvRoomDataManager.get().isOwner(chatRoomMember.getAccount())) { + //開麥 + AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER); + if (!roomQueueInfo.mChatRoomMember.isNoProhibitMic()) { + /* + 修复相亲房自动闭麦bug + 原因:相亲房的某些麦位状态更新,走的是上麦通道,导致默认闭麦了 + 临时解决:若是相亲房且之前在麦或麦位没变化->不做闭麦操作 + */ + if (!AvRoomDataManager.get().isDatingMode() || (AvRoomDataManager.get().isDatingMode() && (!oldIsOnMic || oldMicPosition != micPosition))) { + AudioEngineManager.get().setMute(roomQueueInfo.mRoomMicInfo.isMicMute() || AvRoomDataManager.get().mIsNeedOpenMic); + // 默認閉麥去掉聲音采集upMicroQueue + AudioEngineManager.get().stopLocalAudio(); + } + } + } + noticeUpMic(Integer.parseInt(key), chatRoomMember.getAccount()); + } + } else { + AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE); + } + } + + public Single> fetchRoomMembersByIds(final List accounts) { + return Single.create((SingleOnSubscribe>) e -> { + final RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (mCurrentRoomInfo == null || ListUtils.isListEmpty(accounts)) { + e.onError(new IllegalArgumentException("RoomInfo is null or accounts is null")); + return; + } + NIMChatRoomSDK.getChatRoomService() + .fetchRoomMembersByIds(String.valueOf(mCurrentRoomInfo.getRoomId()), accounts) + .setCallback(new RequestCallback>() { + @Override + public void onSuccess(List param) { + e.onSuccess(param); + } + + @Override + public void onFailed(int code) { + e.onError(new Exception("錯誤碼: " + code)); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + + }).subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /************************雲信聊天室 普通操作 end******************************/ + + /************************雲信聊天室 房主/管理員操作 begin******************************/ + + /** + * 增加管理員 + * + * @param chatRoomMember - + */ + private void addManagerMember(final ChatRoomMember chatRoomMember) { + AvRoomDataManager.get().addAdminMember(chatRoomMember); + + } + + /** + * 增加管理員 + * + * @param account - + */ + private void addManagerMember(final String account) { + List accounts = new ArrayList<>(1); + accounts.add(account); + fetchRoomMembersByIds(accounts).subscribe(new BiConsumer, Throwable>() { + @Override + public void accept(List chatRoomMembers, Throwable throwable) throws Exception { + if (!ListUtils.isListEmpty(chatRoomMembers)) { + ChatRoomMember chatRoomMember = chatRoomMembers.get(0); + addManagerMember(chatRoomMember); + if (AvRoomDataManager.get().isOwner(chatRoomMember.getAccount())) { + AvRoomDataManager.get().mOwnerMember = chatRoomMember; + } + // 放在這裏的原因是,只有管理員身份改變了才能發送通知 + noticeManagerChange(true, account); + } + } + }); + } + + private void removeManagerMember(final String account) { + if (TextUtils.isEmpty(account)) return; + List accounts = new ArrayList<>(1); + accounts.add(account); + fetchRoomMembersByIds(accounts).subscribe(new BiConsumer, Throwable>() { + @Override + public void accept(List chatRoomMemberList, Throwable throwable) throws Exception { + if (!ListUtils.isListEmpty(chatRoomMemberList)) { + ChatRoomMember chatRoomMember = chatRoomMemberList.get(0); + if (AvRoomDataManager.get().isOwner(chatRoomMember.getAccount())) { + AvRoomDataManager.get().mOwnerMember = chatRoomMember; + } + removeManagerMember(chatRoomMember); + noticeManagerChange(false, account); + } + } + }); + } + + private void removeManagerMember(ChatRoomMember chatRoomMember) { + if (chatRoomMember == null) return; + String account = chatRoomMember.getAccount(); + AvRoomDataManager.get().removeManagerMember(account); + } + + /** + * 增加黑名單 + * + * @param account - + */ + @SuppressLint("CheckResult") + private void addBlankMember(final String account) { + List accounts = new ArrayList<>(1); + accounts.add(account); + fetchRoomMembersByIds(accounts).subscribe((chatRoomMembers, throwable) -> { + if (!ListUtils.isListEmpty(chatRoomMembers)) { + ChatRoomMember chatRoomMember = chatRoomMembers.get(0); + AvRoomDataManager.get().addBlackMember(chatRoomMember); + } + }); + } + + /** + * 加入黑名單 + * + * @param roomId - + * @param account - + * @param mark true:設置,false:取消 + */ + public void markBlackListBySdk(String roomId, final String account, final boolean mark, final CallBack callBack) { + NIMClient.getService(ChatRoomService.class) + .markChatRoomBlackList(mark, new MemberOption(roomId, account)) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(ChatRoomMember chatRoomMember) { + if (callBack != null) { + callBack.onSuccess(chatRoomMember); + } + } + + @Override + public void onFailed(int i) { + if (i == 417) { + SingleToastUtil.showToast(R.string.public_chat_hall_model_publicchathallmodel_02); + } else { + SingleToastUtil.showToast(R.string.public_chat_hall_model_publicchathallmodel_02); + } + if (callBack != null) { + callBack.onFail(i, ""); + } + } + + @Override + public void onException(Throwable throwable) { + SingleToastUtil.showToast(R.string.public_chat_hall_model_publicchathallmodel_02); + if (callBack != null) { + callBack.onFail(-1, throwable.getMessage()); + } + } + }); + } + //xxx 设置管理员 + /** + * 設置管理員 + * + * @param roomId - + * @param account 要設置的管理員id + * @param mark true:設置,false:取消 + */ + public void markManagerListBySdk(String roomId, final String account, final boolean mark, final CallBack callBack) { + OtherExtKt.doLog("开始设置管理员 - 请求接口"); + AvRoomModel.get().getCheckManagerNum(AvRoomDataManager.get().getRoomUid(),mark) + .doOnSuccess(s -> { + OtherExtKt.doLog("开始设置管理员 - 请求接口 - 成功 str = "+s); + NIMClient.getService(ChatRoomService.class) + .markChatRoomManager(mark, new MemberOption(roomId, account)) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(ChatRoomMember chatRoomMember) { + if (callBack != null) callBack.onSuccess(chatRoomMember); + if (mark) addManagerMember(chatRoomMember);else removeManagerMember(chatRoomMember); + } + + @Override + public void onFailed(int i) { + if (i == 417) { + SingleToastUtil.showToast(mark ? ResUtil.getString(R.string.public_chat_hall_model_publicchathallmodel_02) : ResUtil.getString(R.string.public_chat_hall_model_publicchathallmodel_01)); + } else { + SingleToastUtil.showToast(R.string.public_chat_hall_model_publicchathallmodel_02); + } + if (callBack != null) { + callBack.onFail(i, ""); + } + } + + @Override + public void onException(Throwable throwable) { + SingleToastUtil.showToast(R.string.public_chat_hall_model_publicchathallmodel_02); + if (callBack != null) { + callBack.onFail(-1, throwable.getMessage()); + } + } + }); + }) + .doOnError(throwable -> { + OtherExtKt.doLog("开始设置管理员 - 请求接口 - 失败"); + if (throwable != null) { + if (throwable instanceof ServerException) { + if (callBack != null) { + callBack.onFail(((ServerException) throwable).code, throwable.getMessage()); + } + } else { + if (callBack != null) { + callBack.onFail(-1, throwable.getMessage()); + } + } + } + }).subscribe(); + + } + + /** + * 下麥 + * + * @param micPosition - + * @param callBack - + */ + public void downMicroPhoneBySdk(int micPosition, final CallBack callBack) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + String downMicUid = AvRoomDataManager.get().getRoomQueueMemberUidByMicPosition(micPosition); + NIMChatRoomSDK.getChatRoomService() + .pollQueue(String.valueOf(roomInfo.getRoomId()), String.valueOf(micPosition)) + .setCallback(new RequestCallback>() { + @Override + public void onSuccess(Entry stringStringEntry) { + if (callBack != null) + callBack.onSuccess("下麥成功"); + + //下麥接口 + GiftValueMrg.get().requestDownMic(micPosition, downMicUid); + + } + + @Override + public void onFailed(int i) { + if (callBack != null) { + callBack.onFail(-1, "下麥失敗"); + } + } + + @Override + public void onException(Throwable throwable) { + if (callBack != null) { + callBack.onFail(-1, "下麥異常:" + throwable.getMessage()); + } + } + }); + } + + /** + *

下麥

+ * 雲信聊天室隊列服務:取出隊列頭部或者指定元素 + *

roomId - 聊天室id

+ *

key - 需要取出的元素的唯一鍵。若為 null,則表示取出隊頭元素

+ * + * @param micPosition - + */ + public Single downMicroPhoneBySdk(final int micPosition) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return null; + String downMicUid = AvRoomDataManager.get().getRoomQueueMemberUidByMicPosition(micPosition); + return Single.create((SingleOnSubscribe) e -> { + RequestResult> result = NIMClient.syncRequest(NIMChatRoomSDK.getChatRoomService() + .pollQueue(String.valueOf(roomInfo.getRoomId()), String.valueOf(micPosition))); + if (result.exception != null) + e.onError(result.exception); + else if (result.code != BaseMvpModel.RESULT_OK) + e.onError(new Throwable("錯誤碼: " + result.code)); + else { + e.onSuccess("下麥回調成功"); + } + }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(s -> GiftValueMrg.get().requestDownMic(micPosition, downMicUid)); + } + + /** + * 加入/移除黑名單 + *

添加/移出聊天室黑名單

+ * Parameters: + * isAdd - true:添加, false:移出 + * memberOption - 請求參數,包含聊天室id,帳號id以及可選的擴展字段 + * Returns: + * InvocationFuture 可以設置回調函數。回調中返回成員信息 + * + * @param roomId - + * @param account - + * @param mark true:設置,false:取消 + */ + public Single markBlackListBySdk(final String roomId, final String account, final boolean mark, String nick) { + RoomQueueMsgAttachment queueMsgAttachment = new RoomQueueMsgAttachment(CUSTOM_MSG_HEADER_TYPE_KICK_MIC, + CUSTOM_MSG_SUB_TYPE_SEND_ADD_BLACK); + queueMsgAttachment.uid = String.valueOf(account); + queueMsgAttachment.handleUid = AuthModel.get().getCurrentUid(); + queueMsgAttachment.targetNick = nick; + queueMsgAttachment.handleNick = UserModel.get().getCacheLoginUserInfo().getNick(); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + return sendChatRoomMessage(message, false); + } + + /** + * 加入/移除黑名單 + *

添加/移出聊天室黑名單

+ * Parameters: + * isAdd - true:添加, false:移出 + * memberOption - 請求參數,包含聊天室id,帳號id以及可選的擴展字段 + * Returns: + * InvocationFuture 可以設置回調函數。回調中返回成員信息 + * + * @param roomId - + * @param account - + * @param mark true:設置,false:取消 + */ + public Single markBlackListBySdk(final String roomId, final String account, final boolean mark) { + return Single.create((SingleOnSubscribe) e -> { + RequestResult result = NIMClient.syncRequest(NIMClient.getService(ChatRoomService.class) + .markChatRoomBlackList(mark, new MemberOption(roomId, account))); + if (result.exception != null) + e.onError(result.exception); + else if (result.code != BaseMvpModel.RESULT_OK) + e.onError(new Exception("錯誤碼: " + result.code)); + else { + e.onSuccess("黑名單處理回調成功"); + } + }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 踢出房間 + * + * @param roomId 聊天室 id + * @param account 踢出成員帳號。僅管理員可以踢;如目標是管理員僅創建者可以踢 + * @param notifyExtension 被踢通知擴展字段,這個字段會放到被踢通知的擴展字段中 + */ + public Single kickMemberFromRoomBySdk(final long roomId, final long account, final Map notifyExtension) { + return Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + NIMChatRoomSDK.getChatRoomService().kickMember( + String.valueOf(roomId), + String.valueOf(account), + notifyExtension + ) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(Void param) { + e.onSuccess("踢人出房間回調成功"); + model.kickUser(account).subscribe(); + } + + @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()); + + } + + /** + * 踢出房間 + * + * @param roomId 聊天室 id + * @param account 踢出成員帳號。僅管理員可以踢;如目標是管理員僅創建者可以踢 + */ + public Single kickMemberFromRoomBySdk(final long roomId, final long account, String nick) { + + RoomQueueMsgAttachment queueMsgAttachment = new RoomQueueMsgAttachment(CUSTOM_MSG_HEADER_TYPE_KICK_MIC, + CUSTOM_MSG_SUB_TYPE_SEND_KICK_ROOM); + queueMsgAttachment.uid = String.valueOf(account); + queueMsgAttachment.handleUid = AuthModel.get().getCurrentUid(); + queueMsgAttachment.targetNick = nick; + queueMsgAttachment.handleNick = UserModel.get().getCacheLoginUserInfo().getNick(); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + return sendChatRoomMessage(message, false); + } + + /** + * 更改房間聲音品質 + * + * @param roomId 聊天室 id + */ + public Single updateAudiouality(final long roomId) { + RoomInfoAttachment queueMsgAttachment = new RoomInfoAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, + CUSTOM_MSG_UPDATE_ROOM_INFO_AUDIO); + queueMsgAttachment.roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + return sendChatRoomMessage(message, false); + } + + /** + * 開啟關閉公屏 + * + * @param roomId 聊天室 id + */ + public Single closeOpenScreen(final long roomId, RoomInfo roomInfo) { + RoomInfoAttachment queueMsgAttachment = new RoomInfoAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, + CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_SCREEN); + queueMsgAttachment.roomInfo = roomInfo; + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + return sendChatRoomMessage(message, false); + } + + public Single closeOpenRedPackage(final long roomId, RoomInfo roomInfo) { + RoomInfoAttachment queueMsgAttachment = new RoomInfoAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, + CUSTOM_MSG_UPDATE_ROOM_INFO_CLOSE_REDPACKAGE); + queueMsgAttachment.roomInfo = roomInfo; + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + return sendChatRoomMessage(message, false); + } + + + /** + * 關閉房間禮物特效 + * + * @param roomId 聊天室 id + */ + public Single updateGiftEffect(final long roomId) { + RoomInfoAttachment queueMsgAttachment = new RoomInfoAttachment(CUSTOM_MSG_UPDATE_ROOM_INFO, + CUSTOM_MSG_UPDATE_ROOM_INFO_GIFT); + queueMsgAttachment.roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + return sendChatRoomMessage(message, false); + } + + /** + * 邀請上麥的自定義消息 + * + * @param baseInfo 上麥用戶信息 + * @param position 要上麥的位置 + */ + public Single inviteMicroPhoneBySdk(final BaseInfo baseInfo, final int position) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR)); + final long micUid = baseInfo.getUid(); + return Single.create( + new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + RoomQueueMsgAttachment queueMsgAttachment = new RoomQueueMsgAttachment(CUSTOM_MSG_HEADER_TYPE_QUEUE, + CUSTOM_MSG_HEADER_TYPE_QUEUE_INVITE); + + queueMsgAttachment.uid = String.valueOf(micUid); + queueMsgAttachment.micPosition = position; + queueMsgAttachment.handleUid = AuthModel.get().getCurrentUid(); + UserInfo myInfo = UserModel.get().getCacheLoginUserInfo(); + if (myInfo != null) { + queueMsgAttachment.handleNick = myInfo.getNick() == null ? "" : myInfo.getNick(); + } + queueMsgAttachment.targetNick = baseInfo.getNick(); + if (baseInfo.getGroupType() != 0) { + queueMsgAttachment.groupType = baseInfo.getGroupType(); + } + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomInfo.getRoomId()), queueMsgAttachment); + e.onSuccess(message); + } + }).subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .filter(new Predicate() { + @Override + public boolean test(ChatRoomMessage chatRoomMessage) throws Exception { + //上麥條件:遊客不在麥上 或者是管理員,房主 + return (!AvRoomDataManager.get().isOnMic(micUid) + || AvRoomDataManager.get().isRoomOwner() + || AvRoomDataManager.get().isRoomAdmin()) + && position != Integer.MIN_VALUE; + } + }) + .toSingle() + .flatMap(new Function>() { + @Override + public SingleSource apply(ChatRoomMessage chatRoomMessage) throws Exception { + return sendChatRoomMessage(chatRoomMessage, false); + } + }).doOnSuccess(chatRoomMessage -> { + if (AvRoomDataManager.get().isQueuingMicro()) { + addMessages(chatRoomMessage); + } + }); + } + + /** + * 踢人下麥 發自定義消息 + * + * @param micUid 被踢用戶uid + * @param roomId 房間ID + */ + public Single kickMicroPhoneBySdk(long micUid, String micNick, long roomId) { + RoomQueueMsgAttachment queueMsgAttachment = new RoomQueueMsgAttachment(CUSTOM_MSG_HEADER_TYPE_QUEUE, + CUSTOM_MSG_HEADER_TYPE_QUEUE_KICK); + queueMsgAttachment.uid = String.valueOf(micUid); + queueMsgAttachment.handleUid = AuthModel.get().getCurrentUid(); + queueMsgAttachment.targetNick = micNick; + queueMsgAttachment.handleNick = UserModel.get().getCacheLoginUserInfo().getNick(); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), queueMsgAttachment); + int micPosition = AvRoomDataManager.get().getMicPosition(micUid); + 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)) { + return Single.error(new Exception(name + "不能被踢下麥")); + } + } + return sendChatRoomMessage(message, false); + } + + /** + * 超管踢人下麥 + */ + public Single kickMicroBySdkBySAdmin(long micUid, String micNick, long roomId) { + SuperAdminOpAttachment attachment = new SuperAdminOpAttachment( + CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN, + CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_DOWN_MIC); + SaOpInfo info = new SaOpInfo(); + info.setTargetNick(micNick); + info.setTargetUid(String.valueOf(micUid)); + info.setHandleUid(String.valueOf(AuthModel.get().getCurrentUid())); + info.setHandleNick(UserModel.get().getNick()); + attachment.setInfo(info); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), attachment); + return sendChatRoomMessage(message, false); + } + + + /** + * 發送貴族進場自定義消息 + * + * @param nobleInfo 貴族信息 + * @param nick 昵稱 + * @param uid 帳號id + * @return Single + */ + public Single sendNobleInRoomMsgBySdk(final NobleInfo nobleInfo, + final String nick, + final long uid) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR)); + return Single.create( + (SingleOnSubscribe) e -> { + NobleAttachment nobleMsgAttachment = new NobleAttachment(CUSTOM_MESS_HEAD_NOBLE, + CUSTOM_MESS_SUB_ROOM_WELCOME); + nobleMsgAttachment.uid = uid; + nobleMsgAttachment.nick = nick; + nobleMsgAttachment.nobleInfo = nobleInfo; + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomInfo.getRoomId()), nobleMsgAttachment); + e.onSuccess(message); + }).subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .filter(chatRoomMessage -> nobleInfo != null && !TextUtils.isEmpty(nick) && uid != 0) + .toSingle() + .flatMap(chatRoomMessage -> sendChatRoomMessage(chatRoomMessage, false)); + } + + /** + * 發送座駕進場自定義消息 + * + * @param carInfo 座駕信息 + * @param uid + * @param nick + * @return + */ + public Single sendCarPlayRoomMsgBySdk(CarInfo carInfo, long uid, String nick) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR)); + return Single.create( + (SingleOnSubscribe) e -> { + CarAttachment carAttachment = new CarAttachment(CUSTOM_MESS_HEAD_CAR, + CUSTOM_MESS_SUB_CAR_ENTER_ROOM); + carAttachment.uid = uid; + carAttachment.nick = nick; + carAttachment.effect = carInfo.getEffect(); + carAttachment.viewUrl = carInfo.getViewUrl(); + carAttachment.otherViewType = carInfo.getOtherViewType(); + OtherExtKt.doLog(" 座驾 , 发送 座驾消息 播放动画"); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomInfo.getRoomId()), carAttachment); + e.onSuccess(message); + }).subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .filter(chatRoomMessage -> carInfo != null && !TextUtils.isEmpty(nick) && uid != 0) + .toSingle() + .flatMap(chatRoomMessage -> sendChatRoomMessage(chatRoomMessage, false)); + } + + + /************************雲信聊天室 房主/管理員操作 end******************************/ + + /** + *

發送 雲信聊天室信息

+ *

返回的是一個觀察者,需要subscribe才會開始發送信息

+ *

不關心信息發送是否成功的,可以直接調用無參subscribe()方法, + * 相反關心的則需要在subscribe(new Consumer(..){...})方法中通過Consumer來消耗事件

+ *

ps: 無參subscribe()方法調用如果發生錯誤,會在rxjava的error handler中得到回調,默認的實現在application的onCreate中

+ * + * @param chatRoomMessage 自定義的聊天室信息 + * @param resend 是否自動重發 + * @return 返回一個可被observer觀察訂閱的observable + */ + public Single sendChatRoomMessage(final ChatRoomMessage chatRoomMessage, final boolean resend) { + 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() { + @Override + public void onSuccess(Void param) { + e.onSuccess(chatRoomMessage); + } + + @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()); + + } + + public boolean isExitRoom() { + return AvRoomDataManager.get().mCurrentRoomInfo == null; + } + + public boolean isChangeRoom(ChatRoomMessage message) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + ImRetryManager.log("isChangeRoom:roomInfo == null"); + return true; + } + String currRoomId = String.valueOf(roomInfo.getRoomId()); + String sessionId = message.getSessionId(); + if (TextUtils.isEmpty(currRoomId) || TextUtils.isEmpty(sessionId)) { + ImRetryManager.log("isChangeRoom:empty roomId or sessionId"); + return true; + } + if (!Objects.equals(currRoomId, sessionId)) { + ImRetryManager.log("currRoomId:" + currRoomId + ", sessionId:" + sessionId); + return true; + } + return false; + } + + public Single sendChatRoomMessageWithRetry( + RetryChatRoomMessage retryChatRoomMessage, + int maxRetryCount, + long delayTime, ReconnectListener listener) { + + return Single.create((SingleOnSubscribe) emitter -> { + retryChatRoomMessage.setRetryCount(retryChatRoomMessage.getRetryCount() + 1); + ImRetryManager.logIde("start send im msg :" + retryChatRoomMessage.getRetryCount()); + if (isExitRoom()) { + String error = "exite room when send msg"; + emitter.onError(new Throwable(error)); + return; + } + if (isChangeRoom(retryChatRoomMessage.getMessage())) { + String error = "changed room when send msg"; + emitter.onError(new Throwable(error)); + return; + } + sendChatRoomMessage(retryChatRoomMessage.getMessage(), false) + .subscribe((message, throwable) -> { + if (throwable == null) { + retryChatRoomMessage.setMessage(message); + emitter.onSuccess(retryChatRoomMessage); + } else { + emitter.onError(throwable); + } + }); + }) + .retryWhen(flowable -> flowable + .flatMap(new Function>() { + @Override + public Publisher apply(Throwable throwable) throws Exception { + String error = throwable.getMessage(); + if (TextUtils.isEmpty(error)) { + error = ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_015); + } + if (listener != null) { + listener.onFailed(retryChatRoomMessage.getRetryCount(), error); + } + //如果已經退出房間或者已經更換房間,則不在重連 + if (isExitRoom()) { + error = error + ", exited room when ready retry, retryCount:" + + retryChatRoomMessage.getRetryCount(); + return Flowable.error(new Throwable(error)); + } + if (isChangeRoom(retryChatRoomMessage.getMessage())) { + error = error + ", changed room when ready retry, retryCount:" + + retryChatRoomMessage.getRetryCount(); + return Flowable.error(new Throwable(error)); + } + if (retryChatRoomMessage.getRetryCount() <= maxRetryCount) { + return Flowable.timer(delayTime, TimeUnit.MILLISECONDS, + AndroidSchedulers.mainThread()); + } + return Flowable.error(throwable); + } + })) + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + + /** + * 雲信發送消息 + * + * @param message + * @return + */ + public Single sendMessageSingle(IMMessage message) { + return Single.create(e -> { + NIMClient.getService(MsgService.class).sendMessage(message, true) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(Void param) { + e.onSuccess(message); + } + + @Override + public void onFailed(int code) { + e.onError(new Exception("錯誤碼: " + code)); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + }); + } + + /** + * 雲信發送消息 + * + * @param message + * @return + */ + public Single sendMessage(IMMessage message) { + return Single.create(e -> { + NIMClient.getService(MsgService.class).sendMessage(message, 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); + } + }); + }); + } + + /** + * 雲信發送消息 + * + * @param message + * @return + */ + public void sendChatRoomMessage(final ChatRoomMessage message, CallBack callBack) { + // 發送消息。如果需要關心發送結果,可設置回調函數。發送完成時,會收到回調。如果失敗,會有具體的錯誤碼。 + IMNetEaseManager.get().sendChatRoomMessage(message, false) + .subscribe((chatRoomMessage, throwable) -> { + //這裏回調發送結果 + if (callBack != null) { + if (throwable == null) { + callBack.onSuccess(message); + } else { + callBack.onFail(0, throwable.getMessage()); + } + } + }); + } + + /** + * 雲信查詢本地數據 + * + * @param uuid 消息 UUID + * @return + */ + public IMMessage queryMessageByUuid(String uuid) { + List uuids = new ArrayList<>(); + uuids.add(uuid); + List data = + NIMClient.getService(MsgService.class) + .queryMessageListByUuidBlock(uuids); + return data != null && data.size() > 0 ? data.get(0) : null; + } + + /** + * 保存數據到本地數據庫 + * + * @param message 消息本身 + * @return + */ + public void saveMessageToLocal(IMMessage message) { + saveMessageToLocal(message, false); + } + + /** + * 保存數據到本地數據庫 + * + * @param message 消息本身 + * @param notify 是否通知更新界面 + * @return + */ + public void saveMessageToLocal(IMMessage message, boolean notify) { + NIMClient.getService(MsgService.class) + .saveMessageToLocalEx(message, notify, message.getTime()); + } + + /** + * 更新消息到數據庫 + * + * @param message + */ + public void updateMessageToLocal(IMMessage message) { + NIMClient.getService(MsgService.class) + .updateIMMessage(message); + } + + /** + * 分享家族時使用的發送雲信自定義消息的方法 + * + * @param sessionType 取值: + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#P2P} 私聊 + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#Team} 群聊 + * @param sessionId 如果是私聊,則為用戶 UID;如果是群聊,則為群組的 teamId + */ + public void sendSharingRoomMessage(int sessionType, String sessionId) { + InAppSharingRoomInfo inAppSharingRoomInfo = new InAppSharingRoomInfo(); + RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (currentRoomInfo == null) { + return; + } + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + inAppSharingRoomInfo.setInfo(currentRoomInfo); + inAppSharingRoomInfo.setTitle(String.format("我想邀請你進入:%1$s, 和我一起愉快的玩耍~", + currentRoomInfo.getTitle())); + inAppSharingRoomInfo.setAvatar(currentRoomInfo.getAvatar() != null ? currentRoomInfo.getAvatar() : ""); + inAppSharingRoomInfo.setActionName("立即進入"); + inAppSharingRoomInfo.setRouterType(RouterType.ROOM); + inAppSharingRoomInfo.setRouterValue(String.valueOf(currentRoomInfo.getUid())); + InAppSharingRoomAttachment attachment = new InAppSharingRoomAttachment(); + attachment.setUid(String.valueOf(AuthModel.get().getCurrentUid())); + attachment.setInfo(inAppSharingRoomInfo); + IMMessage message = MessageBuilder.createCustomMessage(sessionId, SessionType.get(sessionType), attachment); + sendMessage(message) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } + + /** + * 分享房間時使用的發送雲信自定義消息的方法 + * + * @param sessionType 取值: + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#P2P} 私聊 + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#Team} 群聊 + * @param sessionId 如果是私聊,則為用戶 UID;如果是群聊,則為群組的 teamId + */ + public void sendSharingFamilyMessage(int sessionType, String sessionId, FamilyInfo familyInfo) { + + //群太多這裏了去掉群,成員,遊戲,防止家族轉json時候 超出雲信4096長度限製 + FamilyInfo temp = new Gson().fromJson(new Gson().toJson(familyInfo), FamilyInfo.class); + temp.setGroups(new ArrayList<>()); + temp.setGames(new ArrayList<>()); + temp.setMembers(new ArrayList<>()); + + InAppSharingFamilyInfo inAppSharingFamilyInfo = new InAppSharingFamilyInfo(); + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + inAppSharingFamilyInfo.setInfo(temp); + inAppSharingFamilyInfo.setTitle(String.format("我想邀請你加入:%1$s, 和我一起愉快的玩耍~", + temp.getFamilyName())); + inAppSharingFamilyInfo.setAvatar(temp.getFamilyIcon() != null ? temp.getFamilyIcon() : ""); + inAppSharingFamilyInfo.setActionName("立即加入"); + inAppSharingFamilyInfo.setRouterType(RouterType.FAMILY); + inAppSharingFamilyInfo.setRouterValue(temp.getFamilyId()); + InAppSharingFamilyAttachment attachment = new InAppSharingFamilyAttachment(); + attachment.setUid(String.valueOf(AuthModel.get().getCurrentUid())); + attachment.setInfo(inAppSharingFamilyInfo); + IMMessage message = MessageBuilder.createCustomMessage(sessionId, SessionType.get(sessionType), attachment); + sendMessage(message) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } + + + /** + * 分享話題時使用的發送雲信自定義消息的方法 + */ + public void sendSharingMiniWorldMessage(int sessionType, String sessionId, + MiniWorldDetailInfo detailInfo) { + if (detailInfo == null) { + return; + } + InAppSharingMiniWorldInfo inAppSharingMiniWorldInfo = new InAppSharingMiniWorldInfo(); + inAppSharingMiniWorldInfo.setInfo(detailInfo); + MiniWorldDetailInfoWithCurrentMember currentMember = detailInfo.getCurrentMember(); + String showTitle; + if (detailInfo.isInWorld() && currentMember != null) { + String worldName = TextUtils.isEmpty(detailInfo.getName()) ? "" : detailInfo.getName(); + showTitle = "作為「" + worldName + "」的第" + currentMember.getMemberNo() + "位成員,世界那麼大,我想帶你一起去看看~"; + } else { + showTitle = "世界那麼大,我想帶你一起去看看~"; + } + inAppSharingMiniWorldInfo.setTitle(showTitle); + inAppSharingMiniWorldInfo.setAvatar(TextUtils.isEmpty(detailInfo.getIcon()) ? "" : detailInfo.getIcon()); + inAppSharingMiniWorldInfo.setActionName("立即加入"); + inAppSharingMiniWorldInfo.setRouterType(RouterType.MINI_WORLD_DETAIL); + inAppSharingMiniWorldInfo.setRouterValue(String.valueOf(detailInfo.getId())); + InAppSharingMiniWorldAttachment attachment = new InAppSharingMiniWorldAttachment(); + attachment.setUid(String.valueOf(AuthModel.get().getCurrentUid())); + attachment.setInfo(inAppSharingMiniWorldInfo); + IMMessage message = MessageBuilder.createCustomMessage(sessionId, SessionType.get(sessionType), attachment); + sendMessage(message) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } + + /** + * 分享群組時使用的發送雲信自定義消息的方法 + * + * @param sessionType 取值: + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#P2P} 私聊 + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#Team} 群聊 + * @param sessionId 如果是私聊,則為用戶 UID;如果是群聊,則為群組的 teamId + * @param teamInfo 群組信息(必須包含 ID 和名字) + */ + public void sendSharingTeamMessage(int sessionType, String sessionId, TeamInfo teamInfo) { + InAppSharingTeamInfo inAppSharingTeamInfo = new InAppSharingTeamInfo(); + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + inAppSharingTeamInfo.setInfo(teamInfo); + inAppSharingTeamInfo.setTitle(String.format("我想邀請你加入:%1$s, 和我一起愉快的玩耍~", + teamInfo.getName())); + inAppSharingTeamInfo.setAvatar(userInfo != null ? userInfo.getAvatar() : ""); + inAppSharingTeamInfo.setActionName("立即加入"); + inAppSharingTeamInfo.setRouterType(RouterType.TEAM); + inAppSharingTeamInfo.setRouterValue(teamInfo.getId()); + InAppSharingTeamAttachment attachment = new InAppSharingTeamAttachment(); + attachment.setUid(String.valueOf(AuthModel.get().getCurrentUid())); + attachment.setInfo(inAppSharingTeamInfo); + IMMessage message = MessageBuilder.createCustomMessage(sessionId, SessionType.get(sessionType), attachment); + sendMessage(message) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } + + /** + * 發送紅包時,發送雲信自定義消息 + * + * @param sessionType 取值: + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#P2P} 私聊 + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#Team} 群聊 + * @param teamId 如果是私聊,則為用戶 UID;如果是群聊,則為群組的 teamId + * @param uid 用戶 UID + * @param luckyMoneyInfo 紅包信息(請求發送紅包接口後獲得) + */ + public void sendLuckyMoneyMessage(int sessionType, String teamId, String uid, LuckyMoneyInfo luckyMoneyInfo) { + luckyMoneyInfo.setClaimStatus(LuckyMoneyInfo.STATE_NOT_OPEN); + LuckyMoneyAttachment attachment = new LuckyMoneyAttachment(); + attachment.setUid(uid); + attachment.setLuckyMoneyInfo(luckyMoneyInfo); + IMMessage message = MessageBuilder.createCustomMessage(teamId, SessionType.get(sessionType), attachment); + sendMessage(message) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + MessageListPanelHelper.getInstance().notifyAddMessage(message); + } + + /** + * 領取群紅包時,發送雲信 tips 的自定義消息 + * + * @param sessionType 取值: + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#P2P} 私聊 + * {@link com.netease.nimlib.sdk.msg.constant.SessionTypeEnum#Team} 群聊 + * @param teamId 如果是私聊,則為用戶 UID;如果是群聊,則為群組的 teamId + * @param uid 用戶 UID + * @param luckyMoneyInfo 紅包實體 + */ + public void receiveLuckyMoneyMessage(int sessionType, String teamId, String uid, LuckyMoneyInfo luckyMoneyInfo) { + LuckyMoneyTipsAttachment attachment = new LuckyMoneyTipsAttachment(); + attachment.setUid(uid); + attachment.setLuckyMoneyInfo(luckyMoneyInfo); + IMMessage message = MessageBuilder.createCustomMessage(teamId, SessionType.get(sessionType), attachment); + + sendMessage(message) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + MessageListPanelHelper.getInstance().notifyAddMessage(message); + } + + /** + * 更新紅包信息 + * + * @param uuid 消息 UUID + * @param luckyMoneyInfo 紅包實體 + */ + public void updateLuckyMoneyMessage(String uuid, LuckyMoneyInfo luckyMoneyInfo) { + IMMessage message = queryMessageByUuid(uuid); + if (message != null) { + Map localExtension = LuckyMoneyInfo.convertToMap(luckyMoneyInfo); + message.setLocalExtension(localExtension); + NIMClient.getService(MsgService.class) + .updateIMMessage(message); + } + } + + /** + * 更新系統消息到本地數據庫 + * + * @param uuid 消息 UUID + * @param sysMsgInfo 系統消息實體 + */ + public void updateErbanSysMsgInfoMessage(String uuid, ErbanSysMsgInfo sysMsgInfo) { + IMMessage message = queryMessageByUuid(uuid); + if (message != null) { + Map localExtension = ErbanSysMsgInfo.convertToMap(sysMsgInfo); + message.setLocalExtension(localExtension); + NIMClient.getService(MsgService.class) + .updateIMMessage(message); + } + } + + /** + * 更新系統消息到本地數據庫 + * + * @param uuid 消息 UUID + * @param sysMsgV2Info 系統消息實體 + */ + public void updateErbanSysMsgV2InfoMessage(String uuid, ErbanSysMsgV2Info sysMsgV2Info) { + IMMessage message = queryMessageByUuid(uuid); + if (message != null) { + Map localExtension = ErbanSysMsgV2Info.convertToMap(sysMsgV2Info); + message.setLocalExtension(localExtension); + NIMClient.getService(MsgService.class) + .updateIMMessage(message); + } + } + + /** + * -------------------------通知begin------------------------------- + */ + private void noticeReceivedMonsterResult(MonsterHuntingResultAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.MONSTER_HUNTING_RESULT) + .setMonsterHuntingResultAttachment(attachment)); + } + + private void noticeReceivedMonsterStatus(MonsterStatusAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.MONSTER_STATUS_CHANGED) + .setMonsterStatusAttachment(attachment)); + } + + private void noticeReceivedMonsterHuntingAttack(MonsterAttackAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.MONSTER_HUNTING) + .setMonsterAttackReceiveInfo(attachment.getMonsterAttackReceiveInfo())); + } + + private void noticeReceivedAllMicMagic(MagicAllMicAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVED_ALL_MIC_MAGIC) + .setMultiMagicReceivedInfo(attachment.getMultiMagicReceivedInfo())); + } + + private void noticeReceivedSingleMagic(MagicAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVED_SINGLE_MAGIC) + .setMagicReceivedInfo(attachment.getMagicReceivedInfo())); + } + + public void noticeImNetReLogin(RoomQueueInfo roomQueueInfo) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.ROOM_CHAT_RECONNECTION) + .setRoomQueueInfo(roomQueueInfo)); + } + + private void noticeRoomMemberChange(boolean isMemberIn, String account, ChatRoomMessage msg) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setAccount(account) + .setChatRoomMessage(msg) + .setEvent(isMemberIn ? RoomEvent.ROOM_MEMBER_IN : RoomEvent.ROOM_MEMBER_EXIT)); + } + + public void noticeManagerChange(boolean isAdd, String account) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(isAdd ? RoomEvent.ROOM_MANAGER_ADD : RoomEvent.ROOM_MANAGER_REMOVE) + .setAccount(account)); + } + + public void noticeManagerChange() { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.ROOM_MANAGER_ADD)); + } + + private void noticeReceiverMessageImmediately(ChatRoomMessage chatRoomMessage) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MSG) + .setChatRoomMessage(chatRoomMessage) + ); + } + + private void noticeReceiverMessage(ChatRoomMessage chatRoomMessage) { + getChatRoomMsgPublisher().onNext(chatRoomMessage); + } + + private void noticeEnterMessages() { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.ENTER_ROOM)); + } + + public void noticeKickOutChatMember(ChatRoomKickOutEvent reason, String account) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.KICK_OUT_ROOM) + .setReason(reason) + .setAccount(account)); + } + + private void noticeKickDownMic(int position) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.KICK_DOWN_MIC) + .setMicPosition(position)); + } + + /** + * 超管踢人下麥 + */ + private void noticeKickDownMicBySAdmin(String account) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setAccount(account) + .setEvent(RoomEvent.KICK_DOWN_MIC_BY_S_ADMIN)); + } + + private void noticeInviteUpMic(int position, String account) { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.INVITE_UP_MIC) + .setAccount(account) + .setMicPosition(position)); + } + + private void noticeDownMic(String position, String account) { + int micPosition; + try { + micPosition = Integer.valueOf(position); + } catch (Exception ex) { + ex.printStackTrace(); + return; + } + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.DOWN_MIC) + .setAccount(account) + .setMicPosition(micPosition)); + //此處進行禮物值的處理,不放在fragment,防止消息未處理前,fragment已被銷毀 + //下麥的處理 + GiftValueMrg.get().handleDownMic(micPosition, account); + } + + + private void noticeMicPosStateChange(int position, RoomQueueInfo roomQueueInfo) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MIC_QUEUE_STATE_CHANGE) + .setMicPosition(position) + .setRoomQueueInfo(roomQueueInfo)); + } + + + private void noticeChatMemberBlackAdd(String account) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.ADD_BLACK_LIST) + .setAccount(account)); + } + + private void noticeUpdateRoomInfo(CustomAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MSG) + .setCustomAttachment(attachment)); + } + + private void noticeUpMic(int position, String account) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.UP_MIC) + .setMicPosition(position) + .setAccount(account) + ); + } + + /** + * 被擠下麥通知 + */ + private void noticeDownCrowdedMic(int position, String account) { + getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.DOWN_CROWDED_MIC) + .setMicPosition(position) + .setAccount(account) + ); + //擠下麥這種情況不好模擬,禮物值代碼 + GiftValueMrg.get().handleDownCrowdedMic(position, account); + } + + private void noticeRoomInfoUpdate(RoomInfo roomInfo) { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.ROOM_INFO_UPDATE).setRoomInfo(roomInfo)); + } + + private void noticeAuctionStart(AuctionInfo auctionInfo) { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.AUCTION_START).setAuctionInfo(auctionInfo)); + } + + private void noticeAuctionFinish(AuctionInfo auctionInfo) { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.AUCTION_FINISH).setAuctionInfo(auctionInfo)); + } + + private void noticeAuctionUpdate(AuctionInfo auctionInfo) { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.AUCTION_UPDATE).setAuctionInfo(auctionInfo)); + } + + private void noticeCarMemberIn(CarAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.CAR_MEMBER_IN) + .setRoomCarMsgAttachment(attachment)); + } + + private void noticeNobleMemberIn(NobleAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.ON_NOBLE_MEMBER_IN) + .setRoomNobleMsgAttachment(attachment)); + } + + private void noticeOpenNoble(NobleAttachment attachment) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.ON_OPEN_NOBLE_NOTICE) + .setRoomNobleMsgAttachment(attachment)); + } + + private void noticeQueueMemberInfoUpdate() { + getChatRoomEventObservable() + .onNext(new RoomEvent().setEvent(RoomEvent.ON_QUEUE_MEMBER_INFO_UPDATE)); + } + + private void noticeDragonBarStart(ChatRoomMessage msg, int event) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(event) + .setChatRoomMessage(msg)); + } + + private void noticeBox(ChatRoomMessage msg, int second) { + int event = second == CUSTOM_MSG_SUB_BOX_ALL_ROOM_NOTIFY ? RoomEvent.BOX_NOTIFY : RoomEvent.BOX_NOTIFY_SVGA; + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(event) + .setChatRoomMessage(msg)); + } + + private void noticeTarot(ChatRoomMessage msg, int second) { + TarotAttachment attachment = (TarotAttachment) msg.getAttachment(); + + // 所在房间才触发静态飘屏 + if (second == CUSTOM_MESS_TAROT_INTERMEDIATE_PRIZE_WINNING + && attachment.getTarotMsgBean().getRoomUid() != AvRoomDataManager.get().getRoomUid()) { + return; + } + + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(second == CUSTOM_MESS_TAROT_INTERMEDIATE_PRIZE_WINNING + ? RoomEvent.TAROT_NOTIFY : RoomEvent.TAROT_NOTIFY_SVGA) + .setChatRoomMessage(msg)); + } + + private void noticeH5(ChatRoomMessage msg) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.NOTIFY_H5) + .setChatRoomMessage(msg)); + } + + private void noticeRadish(ChatRoomMessage msg, int second) { + int event = second == CUSTOM_MSG_SUB_RADISH_ALL_ROOM_NOTIFY ? RoomEvent.RADISH_NOTIFY : RoomEvent.RADISH_NOTIFY_SVGA; + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(event) + .setChatRoomMessage(msg)); + } + + private void noticeRoomLuckyBagNotice(ChatRoomMessage msg) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_ROOM_LUCKY_BAG_NOTICE) + .setChatRoomMessage(msg)); + } + + public void noticeServiceLuckyBagNotice(ChatRoomMessage msg) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_SERVICE_LUCKY_BAG_NOTICE) + .setChatRoomMessage(msg)); + } + + //成员进房飘屏通知 + private void noticeMemBerInNotice(ChatRoomMessage msg) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_MEMBER_IN_NOTICE) + .setChatRoomMessage(msg)); + } + + private void noticeExperLevelUpNotice(ChatRoomMessage msg) { + getChatRoomEventObservable() + .onNext(new RoomEvent() + .setEvent(RoomEvent.RECEIVE_EXPER_LEVEL_UP_NOTICE) + .setChatRoomMessage(msg)); + } + + + private void noticePKInfo() { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.PK_INFO_UPDATE)); + } + + private void noticePKStart() { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.PK_START)); + } + + private void noticePKCreate() { + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.PK_CREATE)); + } + + /** + * 記錄用戶一天進入的房間id,隔天重置 + */ + private boolean saveCurrentDayRoomId(long roomId) { + String ids = (String) SharedPreferenceUtils.get(IMNetEaseManager.ROOM_ENTER_DAY + AuthModel.get().getCurrentUid(), ""); + + if (!TextUtils.isEmpty(ids)) { + String[] idArray = ids.split(","); + + String day = idArray[0]; + long currentDay = System.currentTimeMillis() / 1000 / 60 / 60 / 24; + + if (day.equals(String.valueOf(currentDay))) { + String strRoomId = String.valueOf(roomId); + + for (String id : idArray) { + if (id.equals(strRoomId)) + return true; + } + + SharedPreferenceUtils.put(IMNetEaseManager.ROOM_ENTER_DAY + AuthModel.get().getCurrentUid(), ids + "," + roomId); + } else + resetCurrentDayRoomId(roomId); + + } else { + resetCurrentDayRoomId(roomId); + } + + return false; + } + + private void resetCurrentDayRoomId(long roomId) { + long currentDay = System.currentTimeMillis() / 1000 / 60 / 60 / 24; + String ids = String.valueOf(currentDay) + "," + String.valueOf(roomId); + SharedPreferenceUtils.put(IMNetEaseManager.ROOM_ENTER_DAY + AuthModel.get().getCurrentUid(), ids); + } + + /** + * 公屏本地添加房間介紹信息 + */ + private void sendDescMessage(ChatRoomMessage chatRoomMessage) { + + // 僅房主不提示 + if (AvRoomDataManager.get().isRoomOwner()) + return; + + String from = chatRoomMessage.getFromAccount(); + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) { + return; + } + // 判斷當天是否已經進入過此直播間 + boolean isCurrentDayEnter = saveCurrentDayRoomId(roomInfo.getUid()); + + if (!TextUtils.isEmpty(from)) { + + if (from.equals(String.valueOf(AuthModel.get().getCurrentUid()))) { + + String content = roomInfo.getIntroduction(); + ChatRoomMessage message; + + if (!TextUtils.isEmpty(content) && !isCurrentDayEnter) { + message = ChatRoomMessageBuilder.createTipMessage(content); + message.setContent(ROOM_INTRO_TAG + "\n" + content); + addMessagesImmediately(message); + } + + content = ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_08); + message = ChatRoomMessageBuilder.createTipMessage(content); + message.setContent(content); + addMessagesImmediately(message); + + } + + } + } + + public Single leaveModeMessage(long roomId, String nick, int gender, String avatar) { + + sendLeaveModeEvent(nick, gender, avatar); + + LeaveModeAttachment leaveModeAttachment = new LeaveModeAttachment(); + leaveModeAttachment.nick = String.valueOf(nick); + leaveModeAttachment.gender = gender; + leaveModeAttachment.avatar = avatar; + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(roomId), leaveModeAttachment); + return sendChatRoomMessage(message, false); + } + + /** + * 本地更新房主位ui + */ + public void sendLeaveModeEvent(String nick, int gender, String avatar) { + AvRoomDataManager.get().nick = nick; + AvRoomDataManager.get().gender = gender; + AvRoomDataManager.get().avatar = avatar; + + getChatRoomEventObservable().onNext(new RoomEvent().setEvent(RoomEvent.LEAVE_MODE)); + } + + //釋放退出房間雲信需要釋放的資源 + public void release() { + mCacheRoomQueueInfo = null; + if (datingDisposable != null) { + datingDisposable.dispose(); + datingDisposable = null; + } + } + + private static final class Helper { + private static final IMNetEaseManager INSTANCE = new IMNetEaseManager(); + } +} diff --git a/core/src/main/java/com/chwl/core/manager/IMSystemMsgManager.java b/core/src/main/java/com/chwl/core/manager/IMSystemMsgManager.java new file mode 100644 index 0000000..94a0b42 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/IMSystemMsgManager.java @@ -0,0 +1,324 @@ +package com.chwl.core.manager; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_DYNAMTC_UNREADCOUNT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_TOPIC; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ACCOUNT; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_VISITOR; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_MINI_WORLD; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ROOM_TASK_TIPS; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_ROOM_TASK_TIPS; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_VISITOR_UNREAD; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_VIP; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_VIP_SELF_OPEN; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_VIP_SELF_UPGRADE; + +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgServiceObserve; +import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.CustomNotification; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.attachment.UnReadCountAttachment; +import com.chwl.core.community.event.UnReadCountEvent; +import com.chwl.core.home.event.VisitorUnreadCountEvent; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.VoiceBottleSayHiAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionFourAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionOneAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionThreeAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionTwoAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringGrabApprenticesAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionFourAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionOneAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionThreeAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionTwoAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMissionTipsAttachment; +import com.chwl.core.mentoring_relationship.event.MentoringRelationshipMissionEvent; +import com.chwl.core.miniworld.event.MWChatTopicEvent; +import com.chwl.core.miniworld.event.MWGroupChatMemberEvent; +import com.chwl.core.patriarch.bean.LimitNotice; +import com.chwl.core.patriarch.event.ImPushMsgPmLimitTimeEvent; +import com.chwl.core.pay.bean.FirstChargeGoods; +import com.chwl.core.pay.event.ChargeCustomNotificationEvent; +import com.chwl.core.pay.event.FirstChargeEvent; +import com.chwl.core.pay.event.FirstRechargeEvent; +import com.chwl.core.pay.event.NewUserChargeEvent; +import com.chwl.core.room.event.RoomTaskTipsEvent; +import com.chwl.core.user.UserModel; +import com.chwl.core.vip.bean.VipInfo; +import com.chwl.core.vip.VipOpenEvent; +import com.chwl.core.vip.VipUpgradeEvent; + +import org.greenrobot.eventbus.EventBus; + +/** + * 云信系统通知管理类 + */ +public class IMSystemMsgManager { + + private static final String TAG = "IMSystemMsgManager"; + + private IMSystemMsgManager() { + } + + public static IMSystemMsgManager get() { + return Helper.INSTANCE; + } + + public void init() { + Log.e(TAG, "init: IMSystemMsgManager"); + NIMClient.getService(MsgServiceObserve.class).observeCustomNotification(new Observer() { + @Override + public void onEvent(CustomNotification notification) { + String content = notification.getContent(); + JSONObject object = JSONObject.parseObject(notification.getContent()); + onReceivedCustomNotification(object); + Log.e(TAG, "onEvent: " + object); + } + }, true); + } + + private void onReceivedCustomNotification(JSONObject attachment) { + int headType = attachment.getIntValue("first"); + int subType = attachment.getIntValue("second"); + JSONObject data = attachment.getJSONObject("data"); + Log.e(TAG, "onReceivedCustomNotification() called with: attachment = [" + attachment + "]"); + if (headType > 0 && subType > 0) { + switch (headType) { + + case CUSTOM_MSG_MINI_WORLD: + switch (subType) { + case CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT: // 在线人数 + MWGroupChatMemberEvent mwGroupChatMemberEvent = new MWGroupChatMemberEvent(); + mwGroupChatMemberEvent.setWorldId(data.getLong("worldId")); + mwGroupChatMemberEvent.setCount(data.getIntValue("count")); + mwGroupChatMemberEvent.setRoomUids(data.getJSONArray("roomUids").toJavaList(Long.class)); + EventBus.getDefault().post(mwGroupChatMemberEvent); + break; + + case CUSTOM_MSG_GROUP_CHAT_TOPIC: // 群聊话题 + MWChatTopicEvent mwChatTopicEvent = new MWChatTopicEvent(); + mwChatTopicEvent.setWorldId(data.getLong("worldId")); + mwChatTopicEvent.setTopic(data.getString("topic")); + EventBus.getDefault().post(mwChatTopicEvent); + break; + + case CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY: // TODO 开启语音派对 + break; + } + break; + + case CUSTOM_MSG_HEADER_TYPE_ACCOUNT: + EventBus.getDefault().post(new ChargeCustomNotificationEvent().setAttachment(attachment)); + break; + + case CustomAttachment.CUSTOM_MSG_VOICE_BOTTLE_HEAD: + switch (subType) { + case CustomAttachment.CUSTOM_MSG_VOICE_BOTTLE_SUB_HELLO: + VoiceBottleSayHiAttachment voiceBottleSayHiAttachment = new VoiceBottleSayHiAttachment(); + voiceBottleSayHiAttachment.setData(data); + voiceBottleSayHiAttachment.fromJson(data); + if (voiceBottleSayHiAttachment.getSayHiInfo() != null) { + String voiceUid = voiceBottleSayHiAttachment.getSayHiInfo().getVoiceUid(); + IMMessage imMessage = MessageBuilder.createCustomMessage( + String.valueOf(voiceUid), + SessionTypeEnum.P2P, + voiceBottleSayHiAttachment); + imMessage.setFromAccount(String.valueOf(AuthModel.get().getCurrentUid())); + imMessage.setStatus(MsgStatusEnum.success); + IMNetEaseManager.get().saveMessageToLocal(imMessage, true); + } + break; + } + break; + + case CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP: + MentoringRelationshipMissionEvent mentoringRelationshipMissionEvent = + new MentoringRelationshipMissionEvent(); + switch (subType) { + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER: + MentoringMasterMissionOneAttachment masterMissionOneAttachment = + new MentoringMasterMissionOneAttachment(); + masterMissionOneAttachment.setData(data); + masterMissionOneAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(masterMissionOneAttachment); + // 师父任务一开始,打点 + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_APPRENTICE: + MentoringApprenticeMissionOneAttachment apprenticeMissionOneAttachment = + new MentoringApprenticeMissionOneAttachment(); + apprenticeMissionOneAttachment.setData(data); + apprenticeMissionOneAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(apprenticeMissionOneAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_MASTER: + MentoringMasterMissionTwoAttachment masterMissionTwoAttachment = + new MentoringMasterMissionTwoAttachment(); + masterMissionTwoAttachment.setData(data); + masterMissionTwoAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(masterMissionTwoAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_APPRENTICE: + MentoringApprenticeMissionTwoAttachment apprenticeMissionTwoAttachment = + new MentoringApprenticeMissionTwoAttachment(); + apprenticeMissionTwoAttachment.setData(data); + apprenticeMissionTwoAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(apprenticeMissionTwoAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_MASTER: + MentoringMasterMissionThreeAttachment masterMissionThreeAttachment = + new MentoringMasterMissionThreeAttachment(); + masterMissionThreeAttachment.setData(data); + masterMissionThreeAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(masterMissionThreeAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_APPRENTICE: + MentoringApprenticeMissionThreeAttachment apprenticeMissionThreeAttachment = + new MentoringApprenticeMissionThreeAttachment(); + apprenticeMissionThreeAttachment.setData(data); + apprenticeMissionThreeAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(apprenticeMissionThreeAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_MASTER: + MentoringMasterMissionFourAttachment masterMissionFourAttachment = + new MentoringMasterMissionFourAttachment(); + masterMissionFourAttachment.setData(data); + masterMissionFourAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(masterMissionFourAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_APPRENTICE: + MentoringApprenticeMissionFourAttachment apprenticeMissionFourAttachment = + new MentoringApprenticeMissionFourAttachment(); + apprenticeMissionFourAttachment.setData(data); + apprenticeMissionFourAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(apprenticeMissionFourAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_RESULT: + MentoringMissionTipsAttachment resultAttachment = new MentoringMissionTipsAttachment(subType); + resultAttachment.setData(data); + resultAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(resultAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_TIPS: + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER_TIPS: + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FAIL_TIPS: + MentoringMissionTipsAttachment tipsAttachment = new MentoringMissionTipsAttachment(subType); + tipsAttachment.setData(data); + tipsAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(tipsAttachment); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_GRAB_APPRENTICES: + Log.e("main", "onReceivedCustomNotification() called with: attachment = [" + attachment + "]"); + MentoringGrabApprenticesAttachment grabApprenticesAttachment = new MentoringGrabApprenticesAttachment(); + grabApprenticesAttachment.setData(data); + grabApprenticesAttachment.fromJson(data); + mentoringRelationshipMissionEvent.setCustomAttachment(grabApprenticesAttachment); + break; + } + EventBus.getDefault().post(mentoringRelationshipMissionEvent); + break; + + case CustomAttachment.CUSTOM_MSG_HEADER_PM_ROOM_LIMIT: + if (subType == CustomAttachment.CUSTOM_MSG_SUB_PM_ROOM_LIMIT_TIME) { + if (data != null) { + LimitNotice limitNotice = new Gson().fromJson(new Gson().toJson(data), + LimitNotice.class); + if (limitNotice != null && !TextUtils.isEmpty(limitNotice.getMsg())) { + EventBus.getDefault().post(new ImPushMsgPmLimitTimeEvent(limitNotice.getMsg())); + } + } + } + break; + + case CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC: + if (subType == CUSTOM_DYNAMTC_UNREADCOUNT) { + UnReadCountAttachment unReadCountAttachment = new UnReadCountAttachment(); + unReadCountAttachment.fromJson(data); + EventBus.getDefault().post(new UnReadCountEvent(unReadCountAttachment.getTotal())); + } + break; + + case CustomAttachment.CUSTOM_MSG_HEADER_TYPE_COMMON_SYS_NOTICATION: + //首充成功 + if (subType == CustomAttachment.CUSTOM_MSG_SUB_TYPE_FIRST_RECHARGE_SUCCESS) { + EventBus.getDefault().post(new FirstRechargeEvent()); + } + break; + + case CustomAttachment.CUSTOM_MSG_MATCH_TICKET: + // TODO:获取赛事门票弹窗 + break; + + case CustomAttachment.CUSTOM_MSG_FIRST_CHARGE: + //首充成功 + if (subType == CustomAttachment.CUSTOM_MSG_SUB_FIRST_CHARGE_PRIZE) { + if (UserModel.get().getCacheLoginUserInfo() != null) { + UserModel.get().getCacheLoginUserInfo().setFirstCharge(false); + } + FirstChargeGoods firstChargeGoods = data.toJavaObject(FirstChargeGoods.class); + FirstChargeEvent event = new FirstChargeEvent(); + event.setChargeProdTitle(firstChargeGoods.getChargeProdTitle()); + event.setFirstChargeRewardList(firstChargeGoods.getFirstChargeRewardList()); + EventBus.getDefault().post(event); + } else if (subType == CustomAttachment.CUSTOM_MSG_SUB_NEW_USER_CHARGE_PRIZE) { + FirstChargeGoods firstChargeGoods = data.toJavaObject(FirstChargeGoods.class); + NewUserChargeEvent event = new NewUserChargeEvent(); + event.setChargeProdTitle(firstChargeGoods.getChargeProdTitle()); + event.setFirstChargeRewardList(firstChargeGoods.getFirstChargeRewardList()); + EventBus.getDefault().post(event); + } + break; + case CUSTOM_MSG_VIP: + if (subType == CUSTOM_MSG_VIP_SELF_UPGRADE) { + VipInfo vipInfo = new Gson().fromJson(data.toJSONString(), VipInfo.class); + EventBus.getDefault().post(new VipUpgradeEvent(vipInfo)); + } else if (subType == CUSTOM_MSG_VIP_SELF_OPEN) { + UserModel.get().onlyUpdateLoginUserInfoCache(); + EventBus.getDefault().post(new VipOpenEvent()); + } + break; + case CUSTOM_MSG_HEADER_TYPE_VISITOR: + if (subType == CUSTOM_MSG_SUB_TYPE_VISITOR_UNREAD) { + int visitNum = 0; + if (data.containsKey("visitNum")) { + visitNum = data.getIntValue("visitNum"); + } + EventBus.getDefault().postSticky(new VisitorUnreadCountEvent(visitNum)); + } + break; + case CUSTOM_MSG_ROOM_TASK_TIPS: + if (subType == CUSTOM_MSG_SUB_ROOM_TASK_TIPS) { + EventBus.getDefault().post(data.toJavaObject(RoomTaskTipsEvent.class)); + } + break; + default: + break; + } + } + } + + private static final class Helper { + private static final IMSystemMsgManager INSTANCE = new IMSystemMsgManager(); + } +} diff --git a/core/src/main/java/com/chwl/core/manager/RelationShipEvent.java b/core/src/main/java/com/chwl/core/manager/RelationShipEvent.java new file mode 100644 index 0000000..b9dafcd --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/RelationShipEvent.java @@ -0,0 +1,37 @@ +package com.chwl.core.manager; + +import java.util.List; + +/** + * 定义用户的操作 + * + * @author xiaoyu + * @date 2017/12/22 + */ + +public class RelationShipEvent { + public static final int NONE = 0; + public static final int EVENT_FRIEND_DELETED = 1; + public static final int EVENT_FRIEND_UPDATE = 2; + + public int event = NONE; + public String account; + public List accounts; + + public RelationShipEvent setEvent(int event) { + this.event = event; + return this; + } + + public RelationShipEvent setAccount(String account) { + this.account = account; + return this; + } + + public RelationShipEvent setAccounts(List accounts) { + this.accounts = accounts; + return this; + } + + +} diff --git a/core/src/main/java/com/chwl/core/manager/RoomEvent.java b/core/src/main/java/com/chwl/core/manager/RoomEvent.java new file mode 100644 index 0000000..83bef9c --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/RoomEvent.java @@ -0,0 +1,639 @@ +package com.chwl.core.manager; + +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.bean.attachmsg.RoomQueueMsgAttachment; +import com.chwl.core.gift.bean.CpMsgBean; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.bean.LuckyBagGifts; +import com.chwl.core.gift.bean.MsgSuperLuckyGift; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; +import com.chwl.core.gift.bean.RoomBgChangeBean; +import com.chwl.core.im.custom.bean.AssistantAttachment; +import com.chwl.core.im.custom.bean.BoomMsgAttachment; +import com.chwl.core.im.custom.bean.CarAttachment; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.MonsterHuntingResultAttachment; +import com.chwl.core.im.custom.bean.MonsterStatusAttachment; +import com.chwl.core.im.custom.bean.NobleAttachment; +import com.chwl.core.magic.bean.MagicReceivedInfo; +import com.chwl.core.magic.bean.MultiMagicReceivedInfo; +import com.chwl.core.monsterhunting.bean.MonsterAttackInfo; +import com.chwl.core.pay.bean.WalletInfo; +import com.chwl.core.room.auction.bean.AuctionInfo; +import com.chwl.core.room.bean.RoomInfo; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; + +import java.util.List; + +/** + * 定义房间的操作 + * + * @author xiaoyu + * @date 2017/12/22 + */ + +public class RoomEvent { + public static final int NONE = 0; + public static final int ENTER_ROOM = 1; + public static final int KICK_OUT_ROOM = 2; + public static final int RECEIVE_MSG = 3; + public static final int KICK_DOWN_MIC = 4; + public static final int INVITE_UP_MIC = 5; + public static final int DOWN_MIC = 6; + /** + * 坑的状态:1--锁,0--不锁 + */ + public static final int MIC_QUEUE_STATE_CHANGE = 7; + public static final int ADD_BLACK_LIST = 8; + public static final int UP_MIC = 9; + public static final int ROOM_INFO_UPDATE = 10; + public static final int ROOM_MANAGER_ADD = 11; + public static final int ROOM_MANAGER_REMOVE = 12; + public static final int SPEAK_STATE_CHANGE = 13; + public static final int FOLLOW = 14; + public static final int UNFOLLOW = 15; + /** + * 充值 + */ + public static final int RECHARGE = 16; + public static final int AUCTION_START = 17; + public static final int AUCTION_FINISH = 18; + public static final int AUCTION_UPDATE = 19; + public static final int ROOM_EXIT = 20; + public static final int AUCTION_UPDATE_FAIL = 21; + //房间成员进出 + public static final int ROOM_MEMBER_IN = 22; + public static final int ROOM_MEMBER_EXIT = 23; + /** + * 房间断网重连 + */ + public static final int ROOM_CHAT_RECONNECTION = 24; + /** + * 用户被挤下麦 + */ + public static final int DOWN_CROWDED_MIC = 25; + /** + * 网络弱 + */ + public static final int RTC_ENGINE_NETWORK_BAD = 26; + public static final int RTC_ENGINE_NETWORK_CLOSE = 27; + public static final int METHOD_ON_AUDIO_MIXING_FINISHED = 28; + public static final int ON_NOBLE_CAN_USE = 29; + /** + * 贵族进场 + */ + public static final int ON_NOBLE_MEMBER_IN = 30; + + /** + * 开通贵族 + */ + public static final int ON_OPEN_NOBLE_NOTICE = 31; + /** + * 队列上的用户信息更新(比如开通贵族,贵族过期等) + */ + public static final int ON_QUEUE_MEMBER_INFO_UPDATE = 32; + public static final int CAR_MEMBER_IN = 33; + /** + * 收到礼物 + */ + public static final int RECEIVE_NORMALE_GIFT = 34; + /** + * 收到普通全麦礼物 + */ + public static final int RECEIVE_ALL_MIC__NORMALEI_GIFT = 35; + + /** + * 礼物过期 + */ + public static final int GIFT_OUT_OF_DATE = 36; + public static final int WALLET_UPDATE = 37; + /** + * 魔法过期 + */ + public static final int MAGIC_OUT_OF_DATE = 38; + public static final int RECEIVED_SINGLE_MAGIC = 39; + public static final int RECEIVED_ALL_MIC_MAGIC = 40; + + /** + * 打怪兽 + */ + public static final int MONSTER_HUNTING = 41; + public static final int MONSTER_HUNTING_ANIMATION_FINISHED = 42; + public static final int MONSTER_STATUS_CHANGED = 43; + public static final int MONSTER_HUNTING_RESULT = 44; + //桌球开始 + public static final int DRAGON_BAR_START=45; + //桌球开牌 + public static final int DRAGON_BAR_END=46; + //桌球自己开始 + public static final int DRAGON_BAR_SELF_START=47; + //桌球开牌 + public static final int DRAGON_BAR_CANCEL=48; + + //开宝箱横幅 + public static final int BOX_NOTIFY = 49; + + //pk相关信息更新 + public static final int PK_INFO_UPDATE = 50; + //PK邀请进队伍 + public static final int PK_INVITE_IN_TEAM = 51; + //PK开始 + public static final int PK_START = 52; + + /** + * 收到普通多人礼物 + */ + public static final int RECEIVE_MUTLT_NORMALEI_GIFT = 53; + + + + /** + * 萝卜不足 + */ + public static final int RADISH_NOT_ENOUGH = 54; + + /** + * 其他人被踢出房间 + */ + public static final int OTHER_KICK_OUT_ROOM = 55; + /** + * 其他人被拉黑 + */ + public static final int OTHER_ADD_BLACK = 56; + + public static final int LEAVE_MODE = 57; + + /** + * 超管踢人下麦 + */ + public static final int KICK_DOWN_MIC_BY_S_ADMIN = 58; + + /** + * 其他人被超管拉黑/踢出房间 + */ + public static final int OTHER_KICK_OUT_OR_ADD_BLACK_BY_S_ADMIN = 59; + + /** + * 自己被超管踢出房间了 + */ + public static final int MY_SELF_KICK_OUT_ROOM_BY_S_ADMIN = 60; + + /** + * 收到个人福袋礼物 + */ + public static final int RECEIVE_LUCKY_GIFT = 61; + + /** + * 收到多人福袋礼物 + */ + public static final int RECEIVE_MULTI_LUCKY_GIFT = 62; + + /** + * 收到全麦福袋礼物 + */ + public static final int RECEIVE_ALL_MIC_LUCKY_GIFT = 64; + + public static final int RECEIVE_RED_PACKAGE = 63; + + public static final int RECEIVE_ROOM_LUCKY_BAG_NOTICE = 65; + + public static final int RECEIVE_SERVICE_LUCKY_BAG_NOTICE = 66; + + /** 成员进房飘屏通知*/ + public static final int RECEIVE_MEMBER_IN_NOTICE = 67; + /** */ + public static final int RECEIVE_EXPER_LEVEL_UP_NOTICE = 68; + + //开宝箱横幅,SVGA背景的 + public static final int BOX_NOTIFY_SVGA = 69; + + public static final int DATING_PUBLISH_RESULT = 70; + + public static final int DATING_ALL_NOTIFY = 71; + + public static final int ROOM_PK_INVITE = 72; + public static final int ROOM_PK_REFUSE = 73; + public static final int ROOM_PK_ACCEPT = 74; + public static final int ROOM_PK_FINISH = 75; + public static final int ROOM_PK_NOTIFY = 76; + public static final int ROOM_PK_MUTE_MIC = 78; + + /** + * 请求上麦 + */ + public static final int REQUEST_UP_MIC = 83; + + public static final int FANS_TEAM_OPEN_SUCCESS = 84; + public static final int FANS_TEAM_OPEN_FAILED = 85; + public static final int FANS_TEAM_JOIN = 86; + public static final int FANS_TEAM_EXIT = 87; + + public static final int SINGLE_ROOM_PK_NOTIFY = 88; + public static final int SINGLE_ROOM_RANK_TOP_NOTIFY = 89; + + public static final int ROOM_CLEAN_SCREEN = 90; + + public static final int ROOM_RANK_TOP_NOTIFY = 91; + + public static final int ROOM_PK_ORDER = 92; + + public static final int ROOM_GIFT_COMPOUND = 93; + + public static final int ROOM_CAR_EFFECT_HIDE = 94; + public static final int ROOM_CAR_EFFECT_SHOW = 95; + + //开宝箱横幅 + public static final int RADISH_NOTIFY = 96; + //开宝箱横幅,SVGA背景的 + public static final int RADISH_NOTIFY_SVGA = 97; + + public static final int DRAW_GIFT_EFFECT = 98; + + //深海奇缘礼物房间飘屏通知 + public static final int LUCKY_SEA_GIFT_ROOM_NOTIFY = 99; + //深海奇缘礼物全服飘屏通知 + public static final int LUCKY_SEA_GIFT_SERVER_NOTIFY = 100; + + public static final int FAIRY_DRAW_GIFT_L4 = 102; + public static final int FAIRY_DRAW_GIFT_L5 = 103; + public static final int FAIRY_CONVERT_L1 = 104; + public static final int FAIRY_CONVERT_L2 = 105; + public static final int FAIRY_CONVERT_L3 = 106; + + public static final int TAROT_NOTIFY = 107; + public static final int TAROT_NOTIFY_SVGA = 108; + + public static final int NOTIFY_H5 = 109; + + public static final int TEMPLATE_NOTIFY = 110; + + //PK创建 + public static final int PK_CREATE = 111; + + //房间流水 + public static final int SERIAL_VALUE_CHANGED = 112; + + + //幸运礼物中奖飘屏,弹窗 + public static final int MSG_SUPER_LUCKY_GIFT = 113; + + //CP相关中奖飘屏,弹窗 + public static final int MSG_CP_ABOUT = 114; + //Boom相关 + public static final int MSG_BOOM = 115; + public static final int MSG_SELF_ENTER_ROOM = 116; + //房間背景變更 + public static final int MSG_ROOM_BG_CHANGE = 117; + //房间等级 变更 + public static final int MSG_ROOM_LEVEL_CHANGE = 119; + + /** + * 收到全服礼物 + */ + public static final int RECEIVE_NORMALE_GIFT_ALL_SERVICE = 118; + public static final int RECEIVE_NORMALE_GIFT_ALL_SERVICE_NOTIFY = 120; //全服飘屏 + + /** + * 收到 幸运礼包 + */ + public static final int MSG_ROOM_LUCKY_BAG_ADD = 121; + + //超级幸运礼物中奖飘屏 + public static final int MSG_SUPER_BRAVO_NOTIFY = 122; + //超级幸运礼物中奖弹窗/主播收益 + public static final int MSG_SUPER_BRAVO_REWARD = 123; + + private int event = NONE; + private int micPosition = Integer.MIN_VALUE; + private int posState = -1; + private ChatRoomKickOutEvent reason; + private String account; + private RoomInfo roomInfo; + private boolean success; + private AuctionInfo auctionInfo; + public RoomQueueInfo roomQueueInfo; + private int code; + private ChatRoomMessage mChatRoomMessage; + private List micPositionList; + public NobleAttachment mRoomNobleMsgAttachment; + public CarAttachment mRoomCarMsgAttachment; + private GiftReceiveInfo mGiftReceiveInfo; + private MultiGiftReceiveInfo mMultiGiftReceiveInfo; + private MagicReceivedInfo mMagicReceivedInfo; + private MultiMagicReceivedInfo mMultiMagicReceivedInfo; + private WalletInfo mWalletInfo; + private RoomQueueMsgAttachment queueMsgAttachment; + private MonsterAttackInfo monsterAttackReceiveInfo; + private AssistantAttachment monsterAwardAttachment; + private MonsterStatusAttachment monsterStatusAttachment; + private MonsterHuntingResultAttachment monsterHuntingResultAttachment; + private CustomAttachment customAttachment; + private GiftMultiReceiverInfo giftMultiReceiverInfo; + private LuckyBagGifts LuckygiftMultiReceiverInfo; + private MsgSuperLuckyGift msgSuperLuckyGift; + private CpMsgBean cpMsgBean; + private BoomMsgAttachment boomMsg; + private RoomBgChangeBean roomBgChangeBean; + + private Object anyData; //通用data + + /** + * 需要透传出去的消息 + */ + private String message; + + public CustomAttachment getCustomAttachment() { + return customAttachment; + } + + public RoomEvent setCustomAttachment(CustomAttachment customAttachment) { + this.customAttachment = customAttachment; + return this; + } + + public RoomQueueMsgAttachment getQueueMsgAttachment() { + return queueMsgAttachment; + } + + public AssistantAttachment getMonsterAwardAttachment() { + return monsterAwardAttachment; + } + + public RoomEvent setMonsterAwardAttachment(AssistantAttachment monsterAwardAttachment) { + this.monsterAwardAttachment = monsterAwardAttachment; + return this; + } + + public RoomEvent setQueueMsgAttachment(RoomQueueMsgAttachment queueMsgAttachment) { + this.queueMsgAttachment = queueMsgAttachment; + return this; + } + + public MonsterStatusAttachment getMonsterStatusAttachment() { + return monsterStatusAttachment; + } + + public RoomEvent setMonsterStatusAttachment(MonsterStatusAttachment monsterStatusAttachment) { + this.monsterStatusAttachment = monsterStatusAttachment; + return this; + } + + public MonsterHuntingResultAttachment getMonsterHuntingResultAttachment() { + return monsterHuntingResultAttachment; + } + + public RoomEvent setMonsterHuntingResultAttachment(MonsterHuntingResultAttachment monsterHuntingResultAttachment) { + this.monsterHuntingResultAttachment = monsterHuntingResultAttachment; + return this; + } + + public int getEvent() { + return event; + } + + public RoomEvent setEvent(int event) { + this.event = event; + return this; + } + + public ChatRoomKickOutEvent getReason() { + return reason; + } + + public RoomEvent setReason(ChatRoomKickOutEvent reason) { + this.reason = reason; + return this; + } + + public RoomEvent setRoomQueueInfo(RoomQueueInfo roomQueueInfo) { + this.roomQueueInfo = roomQueueInfo; + return this; + } + + public int getMicPosition() { + return micPosition; + } + + public RoomEvent setMicPosition(int micPosition) { + this.micPosition = micPosition; + return this; + } + + public int getPosState() { + return posState; + } + + public RoomEvent setPosState(int posState) { + this.posState = posState; + return this; + } + + public String getAccount() { + return account; + } + + public RoomEvent setAccount(String account) { + this.account = account; + return this; + } + + public RoomInfo getRoomInfo() { + return roomInfo; + } + + public RoomEvent setRoomInfo(RoomInfo roomInfo) { + this.roomInfo = roomInfo; + return this; + } + + public boolean isSuccess() { + return success; + } + + public RoomEvent setSuccess(boolean success) { + this.success = success; + return this; + } + + public AuctionInfo getAuctionInfo() { + return auctionInfo; + } + + public RoomEvent setAuctionInfo(AuctionInfo auctionInfo) { + this.auctionInfo = auctionInfo; + return this; + } + + public RoomEvent setRoomNobleMsgAttachment(NobleAttachment roomNobleMsgAttachment) { + mRoomNobleMsgAttachment = roomNobleMsgAttachment; + return this; + } + + public ChatRoomMessage getChatRoomMessage() { + return mChatRoomMessage; + } + + public RoomEvent setChatRoomMessage(ChatRoomMessage chatRoomMessage) { + mChatRoomMessage = chatRoomMessage; + return this; + } + + public int getCode() { + return code; + } + + public RoomEvent setCode(int code) { + this.code = code; + return this; + } + + public List getMicPositionList() { + return micPositionList; + } + + public RoomEvent setMicPositionList(List micPositionList) { + this.micPositionList = micPositionList; + return this; + } + + public RoomEvent setRoomCarMsgAttachment(CarAttachment carMsgAttachment) { + this.mRoomCarMsgAttachment = carMsgAttachment; + return this; + } + + + + public MagicReceivedInfo getMagicReceivedInfo() { + return mMagicReceivedInfo; + } + + public RoomEvent setMagicReceivedInfo(MagicReceivedInfo magicReceivedInfo) { + mMagicReceivedInfo = magicReceivedInfo; + return this; + } + + + + public RoomEvent setMonsterAttackReceiveInfo(MonsterAttackInfo monsterAttackReceiveInfo) { + this.monsterAttackReceiveInfo = monsterAttackReceiveInfo; + return this; + } + + public WalletInfo getWalletInfo() { + return mWalletInfo; + } + + public RoomEvent setWalletInfo(WalletInfo walletInfo) { + mWalletInfo = walletInfo; + return this; + } + + public MultiMagicReceivedInfo getMultiMagicReceivedInfo() { + return mMultiMagicReceivedInfo; + } + + public RoomEvent setMultiMagicReceivedInfo(MultiMagicReceivedInfo multiMagicReceivedInfo) { + mMultiMagicReceivedInfo = multiMagicReceivedInfo; + return this; + } + + public String getMessage() { + return message; + } + + public RoomEvent setMessage(String message) { + this.message = message; + return this; + } + + + public GiftReceiveInfo getGiftReceiveInfo() { + return mGiftReceiveInfo; + } + + public RoomEvent setGiftReceiveInfo(GiftReceiveInfo giftReceiveInfo) { + mGiftReceiveInfo = giftReceiveInfo; + return this; + } + + /** + *普通多人 + * @return + */ + public GiftMultiReceiverInfo getGiftMultiReceiverInfo() { + return giftMultiReceiverInfo; + } + + public RoomEvent setGiftMultiReceiverInfo(GiftMultiReceiverInfo giftMultiReceiverInfo) { + this.giftMultiReceiverInfo = giftMultiReceiverInfo; + return this; + } + + + /** + *普通全麦 + * @return + */ + public MultiGiftReceiveInfo getMultiGiftReceiveInfo() { + return mMultiGiftReceiveInfo; + } + + public RoomEvent setMultiGiftReceiveInfo(MultiGiftReceiveInfo multiGiftReceiveInfo) { + mMultiGiftReceiveInfo = multiGiftReceiveInfo; + return this; + } + + + public RoomEvent setLuckyGiftMultiReceiverInfo(LuckyBagGifts luckyGiftMultiReceiverInfo) { + this.LuckygiftMultiReceiverInfo = luckyGiftMultiReceiverInfo; + return this; + } + + public LuckyBagGifts getLuckygiftMultiReceiverInfo() { + return LuckygiftMultiReceiverInfo; + } + + public MsgSuperLuckyGift getMsgSuperLuckyGift() { + return msgSuperLuckyGift; + } + + public RoomEvent setMsgSuperLuckyGift(MsgSuperLuckyGift msgSuperLuckyGift) { + this.msgSuperLuckyGift = msgSuperLuckyGift; + return this; + } + + + public CpMsgBean getCpMsgBean() { + return cpMsgBean; + } + + public RoomEvent setCpMsgBean(CpMsgBean cpMsgBean) { + this.cpMsgBean = cpMsgBean; + return this; + } + + public BoomMsgAttachment getBoomMsg() { + return boomMsg; + } + + public RoomEvent setBoomMsg(BoomMsgAttachment boomMsg) { + this.boomMsg = boomMsg; + return this; + } + + public RoomBgChangeBean getRoomBgChangeBean() { + return roomBgChangeBean; + } + public RoomEvent setRoomBgChangeBean(RoomBgChangeBean roomBgChangeBean) { + this.roomBgChangeBean = roomBgChangeBean; + return this; + } + + public Object getAnyData() {return anyData;} + public RoomEvent setAnyData(Object anyData) { + this.anyData = anyData; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt b/core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt new file mode 100644 index 0000000..cae859d --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/RoomMicQueueModel.kt @@ -0,0 +1,129 @@ +package com.chwl.core.manager + +import android.util.SparseArray +import com.chwl.core.Constants +import com.chwl.core.bean.RoomMicInfo +import com.chwl.core.bean.RoomQueueInfo +import com.chwl.core.room.model.AvRoomModel +import com.chwl.core.room.queue.bean.MicMemberInfo +import com.chwl.library.utils.ListUtils +import com.chwl.library.utils.json.JsonUtils +import com.example.lib_utils.log.ILog +import com.google.gson.JsonParser +import com.google.gson.reflect.TypeToken +import com.netease.nimlib.sdk.chatroom.model.ChatRoomInfo +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember +import com.netease.nimlib.sdk.util.Entry +import io.reactivex.Observable +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers + +object RoomMicQueueModel : ILog { + + fun queueMicQueue(roomId: Long): Observable> { + return AvRoomModel.get().queryRoomInfo(roomId).map { + parseMicQueue(it) + }.flatMap { + queueMicQueue(roomId, it) + } + } + + fun queueMicQueue( + roomId: Long, + queue: SparseArray + ): Observable> { + return AvRoomModel.get().queryRoomMicInfo(roomId.toString()).map { + dealMicMemberFromIMNet(queue, it) + }.flatMap { + dealMicChatRoomMemberFromIMNet(queue, it) + } + } + + private fun parseMicQueue( + chatRoomInfo: ChatRoomInfo + ): SparseArray { + val extension: Map = chatRoomInfo.extension + val micQueueStr = + extension[Constants.KEY_CHAT_ROOM_INFO_MIC] as? String + return parseMicQueue(micQueueStr) + } + + private fun parseMicQueue( + micQueueStr: String? + ): SparseArray { + val micQueue = SparseArray() + if (micQueueStr.isNullOrEmpty()) { + return micQueue + } + val micQueueMap = JsonUtils.getGson().fromJson>( + micQueueStr, object : TypeToken>() {}.type + ) + logD("parseMicQueue micQueueStr:$micQueueStr") + micQueueMap.forEach { + val micPosition = it.key.toIntOrNull() + val micInfo = + JsonUtils.getGson().fromJson(it.value, RoomMicInfo::class.java) + if (micPosition != null && micInfo != null) { + micQueue.put( + micPosition, + RoomQueueInfo( + micInfo, + null + ) + ) + } + } + return micQueue + } + + /** + * 处理网易云信坑位信息 + */ + private fun dealMicMemberFromIMNet( + micQueue: SparseArray, + entries: List> + ): List { + logD("dealMicMemberFromIMNet entries:${entries.size}") + val accounts: MutableList = ArrayList() + if (!ListUtils.isListEmpty(entries)) { + val jsonParser = JsonParser() + var chatRoomMember: MicMemberInfo + for (entry in entries) { + val roomQueueInfo = micQueue[entry.key.toInt()] + if (roomQueueInfo != null) { + val valueJsonObj = jsonParser.parse(entry.value).asJsonObject + if (valueJsonObj != null) { + chatRoomMember = + JsonUtils.getGson() + .fromJson(valueJsonObj, MicMemberInfo::class.java) + accounts.add(chatRoomMember.account) + roomQueueInfo.mChatRoomMember = chatRoomMember + } + micQueue.put( + Integer.valueOf(entry.key), + roomQueueInfo + ) + } + } + } + return accounts + } + + /** + * 处理网易云信队列上人员的信息 + */ + private fun dealMicChatRoomMemberFromIMNet( + micQueue: SparseArray, + accounts: List + ): Observable> { + return if (ListUtils.isListEmpty(accounts)) Observable.just(micQueue) else IMNetEaseManager.get() + .fetchRoomMembersByIds(accounts).observeOn(AndroidSchedulers.mainThread()) + .flatMap { chatRoomMembers: List -> + for (chatRoomMember in chatRoomMembers) { + AvRoomDataManager.get() + .updateQueueChatRoomMemberExtension(micQueue, chatRoomMember) + } + Single.just(micQueue) + }.toObservable() + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/manager/VolumeSetting.java b/core/src/main/java/com/chwl/core/manager/VolumeSetting.java new file mode 100644 index 0000000..c800888 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/VolumeSetting.java @@ -0,0 +1,42 @@ +package com.chwl.core.manager; + +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.pref.CommonPref; + +/** + * Created by MadisonRong on 2019-12-26 + */ +public class VolumeSetting { + + /** + * 获取音乐播放器的音量 + * @return + */ + public static int getMusicVolume() { + return CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("volume", 25); + } + + /** + * 获取人声的音量 + * @return + */ + public static int getVoiceVolume() { + return CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("recordingVolume", 100); + } + + /** + * 设置音乐播放器的音量 + * @param musicVolume + */ + public static void putMusicVolume(int musicVolume) { + CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("volume", musicVolume); + } + + /** + * 设置人声的音量 + * @param voiceVolume + */ + public static void putVoiceVolume(int voiceVolume) { + CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("recordingVolume", voiceVolume); + } +} diff --git a/core/src/main/java/com/chwl/core/manager/agora/EngineEventHandler.java b/core/src/main/java/com/chwl/core/manager/agora/EngineEventHandler.java new file mode 100644 index 0000000..6d063ae --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/agora/EngineEventHandler.java @@ -0,0 +1,196 @@ +package com.chwl.core.manager.agora; + +import android.os.Message; + +import com.chwl.core.im.custom.bean.RoomPkBean; +import com.chwl.core.manager.AudioEngineManager; +import com.orhanobut.logger.Logger; +import com.chwl.core.R; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +import io.agora.rtc2.ClientRoleOptions; +import io.agora.rtc2.Constants; +import io.agora.rtc2.IRtcEngineEventHandler; +import io.reactivex.Observable; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.android.schedulers.AndroidSchedulers; + + +/** + * @author by 梁馨 on 2020/9/14. + */ +public class EngineEventHandler extends IRtcEngineEventHandler { + + public static String TAG = EngineEventHandler.class.getSimpleName(); + + @Override + public void onError(int err) { + super.onError(err); + Logger.t(TAG).d("onError" + err); + switch (err) { + case 1107: { + SingleToastUtil.showToast(ResUtil.getString(R.string.manager_agora_engineeventhandler_01)); + break; + } + default: { + break; + } + } + + } + + @Override + public void onJoinChannelSuccess(String channel, int uid, int elapsed) { + super.onJoinChannelSuccess(channel, uid, elapsed); + Logger.t(TAG).d("onJoinChannelSuccess" + channel + "uid:" + uid); + //声网进入频道成功日志 + RtcEngineManager manager = RtcEngineManager.get(); + if (manager != null) { + Message message = manager.mRtcEngineHandler.obtainMessage(); + message.what = RtcEngineHandler.notifyJoinAvRoom; + manager.mRtcEngineHandler.sendMessage(message); + manager.uid = uid; + } + + } + + + @Override + public void onRejoinChannelSuccess(String channel, int uid, int elapsed) { + super.onRejoinChannelSuccess(channel, uid, elapsed); + } + + @Override + public void onLeaveChannel(RtcStats stats) { + super.onLeaveChannel(stats); + Logger.t(TAG).d("onLeaveChannel"); + } + + @Override + public void onUserJoined(int uid, int elapsed) { + super.onUserJoined(uid, elapsed); + } + + @Override + public void onActiveSpeaker(int uid) { + super.onActiveSpeaker(uid); + } + + @Override + public void onLastmileQuality(int quality) { + super.onLastmileQuality(quality); + if (quality >= 3) { + IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_BAD) + ); + } + } + + @Override + public void onConnectionInterrupted() { + super.onConnectionInterrupted(); + IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE)); + } + + @Override + public void onConnectionLost() { + super.onConnectionLost(); + IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE)); + } + + /** + * 用户音量提示回调。 + * + * @param speakers + * @param totalVolume + */ + @Override + public void onAudioVolumeIndication(AudioVolumeInfo[] speakers, int totalVolume) { + super.onAudioVolumeIndication(speakers, totalVolume); + if (totalVolume == 0) { + return; + } + RtcEngineManager manager = RtcEngineManager.get(); + Message message = manager.mRtcEngineHandler.obtainMessage(); + message.what = RtcEngineHandler.onAudioVolumeIndication; + message.obj = speakers; + manager.mRtcEngineHandler.sendMessage(message); + } + + @Override + public void onUserMuteAudio(int uid, boolean muted) { + super.onUserMuteAudio(uid, muted); + RtcEngineManager manager = RtcEngineManager.get(); + if (muted) { + Message message = manager.mRtcEngineHandler.obtainMessage(); + message.what = RtcEngineHandler.onUserMuteAudio; + message.obj = uid; + manager.mRtcEngineHandler.sendMessage(message); + } + } + + @Override + public void onClientRoleChanged(int oldRole, int newRole, ClientRoleOptions newRoleOptions) { + super.onClientRoleChanged(oldRole, newRole, newRoleOptions); + //角色切换 麦克风切换 + if (newRole == Constants.CLIENT_ROLE_BROADCASTER) { + Observable.create((ObservableOnSubscribe) emitter -> { + RtcEngineManager.get().setMute(RtcEngineManager.get().isMute); + if (AvRoomDataManager.get().isRoomOwner() && + AvRoomDataManager.get().isSingleRoom() && + AvRoomDataManager.get().isOpenAnotherPKMode()) { + RoomPkBean pkBean = AvRoomDataManager.get().roomPkLiveData.getValue(); + if (pkBean != null) { + AudioEngineManager.get().connectOtherRoom(String.valueOf(pkBean.getARoomId()), pkBean.getAUid()); + } + } + emitter.onComplete(); + }).subscribeOn(AndroidSchedulers.mainThread()).subscribe(); + } + } + + @Override + public void onChannelMediaRelayStateChanged(int state, int code) { + super.onChannelMediaRelayStateChanged(state, code); + if (state == Constants.RELAY_STATE_FAILURE) { + SingleToastUtil.showToast("Join failed:" + code); + } + } + + @Override + public void onAudioMixingFinished() {//伴奏播放已结束回调 + super.onAudioMixingFinished(); + } + + @Override + public void onAudioMixingStateChanged(int state, int reasonCode) { + super.onAudioMixingStateChanged(state, reasonCode); + if (state == Constants.AUDIO_MIXING_STATE_STOPPED && reasonCode == Constants.AUDIO_MIXING_REASON_ALL_LOOPS_COMPLETED) { + IMNetEaseManager.get().getChatRoomEventObservable().onNext( + new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED) + ); + } + } + + @Override + public void onRemoteAudioStateChanged(int i, int i1, int i2, int i3) { + super.onRemoteAudioStateChanged(i, i1, i2, i3); + } + + @Override + public void onRemoteAudioStats(RemoteAudioStats remoteAudioStats) { + super.onRemoteAudioStats(remoteAudioStats); + Logger.t(TAG).d("onRemoteAudioStats uid%d", remoteAudioStats.uid); + long uid = (long) remoteAudioStats.uid; + // 如果麦上没有这个人,不接收这个人的声音 + if (!(AvRoomDataManager.get().isSingleRoom() && AvRoomDataManager.get().isOpenAnotherPKMode())) { + Observable.create((ObservableOnSubscribe) emitter -> { + RtcEngineManager.get().setRemoteMute(uid, !AvRoomDataManager.get().checkIsOnMicByAccount(uid + "")); + emitter.onComplete(); + }).subscribeOn(AndroidSchedulers.mainThread()).subscribe(); + } + } +} diff --git a/core/src/main/java/com/chwl/core/manager/agora/RtcEngineHandler.java b/core/src/main/java/com/chwl/core/manager/agora/RtcEngineHandler.java new file mode 100644 index 0000000..7dcbca4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/agora/RtcEngineHandler.java @@ -0,0 +1,89 @@ +package com.chwl.core.manager.agora; + +import static io.agora.rtc2.Constants.AUDIO_RECORDING_QUALITY_LOW; + +import android.os.Environment; +import android.os.Handler; +import android.os.Message; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.manager.AudioEngineManager; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.library.common.file.FileHelper; +import com.chwl.library.utils.config.BasicConfig; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +import io.agora.rtc2.Constants; +import io.agora.rtc2.IRtcEngineEventHandler; + +/** + * @author by 梁馨 on 2020/9/14. + */ + + +public class RtcEngineHandler extends Handler { + + public static int notifyJoinAvRoom = 0; + public static int onAudioVolumeIndication = 1; + public static int onUserMuteAudio = 2; + + @Override + public void handleMessage(@NotNull Message msg) { + super.handleMessage(msg); + RtcEngineManager rtcEngineManager = RtcEngineManager.get(); + if (rtcEngineManager == null) return; + if (msg.what == notifyJoinAvRoom) { + if (!rtcEngineManager.inRoom) { + //IMNetEaseManager.get().joinAvRoom(); + } + rtcEngineManager.inRoom = true; + if (rtcEngineManager.needRecord && rtcEngineManager.mRtcEngine != null) { + rtcEngineManager.mRtcEngine.startAudioRecording(FileHelper.getRootFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + + File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName() + + "/audio/" + System.currentTimeMillis() + ".aac", AUDIO_RECORDING_QUALITY_LOW); + } + + } else if (msg.what == onAudioVolumeIndication) {//onAudioVolumeIndication 说话声音音量提示回调 + IRtcEngineEventHandler.AudioVolumeInfo[] speakers = (IRtcEngineEventHandler.AudioVolumeInfo[]) msg.obj; + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + if (rtcEngineManager.speakQueueMembersPosition.size() > 0) { + rtcEngineManager.speakQueueMembersPosition.clear(); + } + if (speakers == null || speakers.length == 0) return; + for (IRtcEngineEventHandler.AudioVolumeInfo speaker : speakers) { + // 0 代表的是房主,其他代表的是uid + long uid = speaker.uid == 0 ? rtcEngineManager.uid : speaker.uid; + int micPosition = AvRoomDataManager.get().getMicPosition(uid); + // 如果是房主的话,并且房主的mic位置没有的啊,则把房主的位置设置为-1(兼容ios轻聊房光晕) + if (uid == AvRoomDataManager.get().mCurrentRoomInfo.getUid() && + AvRoomDataManager.get().mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_LIGHT_CHAT + && micPosition == Integer.MIN_VALUE) { + micPosition = -1; + } + if (micPosition == Integer.MIN_VALUE && + uid == AuthModel.get().getCurrentUid()) { + // 如果麦上没有自己,并且自己在说话,要把自己变成听众 + AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE); + } else if (micPosition == Integer.MIN_VALUE && + uid != AuthModel.get().getCurrentUid() && + !(AvRoomDataManager.get().isSingleRoom() && AvRoomDataManager.get().isOpenAnotherPKMode())) { + // 如果麦上没有这个人,要把他静音 + AudioEngineManager.get().setRemoteMute(uid, true); + } + if (micPosition == Integer.MIN_VALUE) continue; + rtcEngineManager.speakQueueMembersPosition.add(micPosition); + } + IMNetEaseManager.get().getChatRoomEventObservable().onNext( + new RoomEvent().setEvent(RoomEvent.SPEAK_STATE_CHANGE) + .setMicPositionList(rtcEngineManager.speakQueueMembersPosition) + ); + } + } +} diff --git a/core/src/main/java/com/chwl/core/manager/agora/RtcEngineManager.java b/core/src/main/java/com/chwl/core/manager/agora/RtcEngineManager.java new file mode 100644 index 0000000..e310335 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/agora/RtcEngineManager.java @@ -0,0 +1,311 @@ +package com.chwl.core.manager.agora; + +import static io.agora.rtc2.Constants.AUDIO_PROFILE_MUSIC_STANDARD; +import static io.agora.rtc2.Constants.AUDIO_SCENARIO_GAME_STREAMING; + +import android.os.Environment; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.chwl.core.SdkConfig; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.library.common.application.Env; +import com.orhanobut.logger.Logger; +import com.chwl.core.XConstants; +import com.chwl.core.manager.BaseEngine; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.model.PlayerModel; +import com.chwl.library.common.file.FileHelper; +import com.chwl.library.utils.config.BasicConfig; + +import java.io.File; +import java.util.Locale; + +import io.agora.rtc2.Constants; +import io.agora.rtc2.RtcEngine; +import io.agora.rtc2.video.ChannelMediaInfo; +import io.agora.rtc2.video.ChannelMediaRelayConfiguration; + + +/** + * @author by 梁馨 on 2020/9/14. + */ +public class RtcEngineManager extends BaseEngine { + public static String TAG = RtcEngineManager.class.getSimpleName(); + @Nullable + public RtcEngine mRtcEngine; + @NonNull + public final Handler mRtcEngineHandler = new RtcEngineHandler(); + @NonNull + public final EngineEventHandler mEngineEventHandler = new EngineEventHandler(); + + private static final class Helper { + private static final RtcEngineManager INSTANCE = new RtcEngineManager(); + } + + private RtcEngineManager() { + super(); + } + + public static RtcEngineManager get() { + return RtcEngineManager.Helper.INSTANCE; + } + + @Override + public void enterChannel(long channelId, long uid) { + Logger.t(TAG).d("enterChannel channelId:%d", channelId); + if (mRtcEngine == null) { + try { + mRtcEngine = RtcEngine.create(BasicConfig.INSTANCE.getAppContext(), Env.isDebug() ? SdkConfig.INSTANCE.getAgoraKeyDebug() : SdkConfig.INSTANCE.getAgoraKey(), mEngineEventHandler); + } catch (Exception e) { + throw new RuntimeException( + "NEED TO check rtc sdk init fatal error\n" + Log.getStackTraceString(e)); + } + //设置频道模式为直播 + mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING); + mRtcEngine.setAudioProfile(AUDIO_PROFILE_MUSIC_STANDARD, AUDIO_SCENARIO_GAME_STREAMING); + mRtcEngine.enableAudioVolumeIndication(600, 3, false); + mRtcEngine.setDefaultAudioRoutetoSpeakerphone(true); + mRtcEngine.setExternalVideoSource(true, false, Constants.ExternalVideoSourceType.ENCODED_VIDEO_FRAME); + mRtcEngine.setRecordingAudioFrameParameters(48000, 2, 2, 960); + mRtcEngine.setVideoProfile(Constants.VIDEO_PROFILE_360P, false); + mRtcEngine.enableDualStreamMode(true); + mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.headset.monitoring,true\"}")); + mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.enable.androidlowlatencymode,true\"}")); + mRtcEngine.setLogFile(FileHelper.getRootFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + + File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName() + + "/log/agora-rtc.log"); + } + mRtcEngine.joinChannel(null, String.valueOf(channelId), null, (int) uid); + } + + @Override + public int stopAudioMixing() { + Logger.t(TAG).d("stopAudioMixing "); + if (mRtcEngine != null) { + int result = mRtcEngine.stopAudioMixing(); + isMusicPlaying = false; + return result; + } + return -1; + } + + @Override + public void resetChannel() { + Logger.t(TAG).d("resetChannel "); + + if (mRtcEngine != null) { + stopAudioMixing(); + mRtcEngine.leaveChannel(); + mRtcEngine = null; + } + mRtcEngineHandler.removeCallbacksAndMessages(null); + } + + @Override + public void reEnterChannel(long channelId, long uid) { + enterChannel(channelId, uid); + setRemoteMute(isRemoteMute); + setMute(isMute); + } + + @Override + public void stopLocalAudio() { + + } + + + @Override + public void leaveChannel() { + Logger.t(TAG).d("leaveChannel "); + if (mRtcEngine != null) { + stopAudioMixing(); + mRtcEngine.leaveChannel(); + RtcEngine.destroy(); + mRtcEngine = null; + } + mRtcEngineHandler.removeCallbacksAndMessages(null); + isMute = false; + isRemoteMute = false; + needRecord = false; + inRoom = false; + isAudienceRole = false; + } + + @Override + public void setRemoteMute(boolean mute) { + Logger.t(TAG).d("setRemoteMute mute=" + mute); + if (mRtcEngine != null) { + int result = mRtcEngine.muteAllRemoteAudioStreams(mute); + if (result == 0) { + isRemoteMute = mute; + } + } + } + + @Override + public boolean isEnableLoopBack() { + return false; + } + + @Override + public void connectOtherRoom(String roomId, long userUid) { + RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (curRoomInfo == null) { + return; + } + ChannelMediaInfo srcChannelInfo = new ChannelMediaInfo(null, null, 0); + ChannelMediaRelayConfiguration mediaRelayConfiguration = new ChannelMediaRelayConfiguration(); + mediaRelayConfiguration.setSrcChannelInfo(srcChannelInfo); + + ChannelMediaInfo destChannelInfo = new ChannelMediaInfo(roomId, null, 0); + mediaRelayConfiguration.setDestChannelInfo(roomId, destChannelInfo); + + if (mRtcEngine != null) { + mRtcEngine.startOrUpdateChannelMediaRelay(mediaRelayConfiguration); + } + } + + @Override + public void disconnectOtherRoom() { + if (mRtcEngine != null) { + mRtcEngine.stopChannelMediaRelay(); + } + } + + @Override + public void setRemoteMute(long uid, boolean mute) { + Logger.t(TAG).d("setRemoteMute uid:%s mute:%s", uid, mute); + + if (mRtcEngine != null && !isRemoteMute) { + mRtcEngine.muteRemoteAudioStream((int) uid, mute); + } + } + + @Override + public boolean setRole(int role) { + Logger.t(TAG).d("setRole role=" + role + ",isAudienceRole:" + isAudienceRole); + + if (mRtcEngine != null) { + mRtcEngine.setClientRole(role); + isAudienceRole = role == Constants.CLIENT_ROLE_AUDIENCE; + } + return true; + } + + @Override + public void setMute(boolean mute) { + Logger.t(TAG).d("setMute bool:" + mute); + if (mRtcEngine == null) { + return; + } + mRtcEngine.muteLocalAudioStream(mute); + mRtcEngine.enableLocalAudio(!mute); + isMute = mute; + } + + @Override + public void adjustAudioMixingVolume(int volume) { + Logger.t(TAG).d("adjustAudioMixingVolume" + volume); + + if (mRtcEngine != null) { + mRtcEngine.adjustAudioMixingVolume(volume); + } + } + + @Override + public void adjustRecordingSignalVolume(int volume) { + Logger.t(TAG).d("adjustRecordingSignalVolume volume=" + volume); + + if (mRtcEngine != null) { + mRtcEngine.adjustRecordingSignalVolume(volume); + } + } + + @Override + public int resumeAudioMixing() { + Logger.t(TAG).d("resumeAudioMixing"); + + if (mRtcEngine == null) { + return -1; + } + + int currentPosition = mRtcEngine.getAudioMixingCurrentPosition(); + int result = 0; + if (currentPosition > 0) { + result = mRtcEngine.resumeAudioMixing(); + } else { + LocalMusicBean current = PlayerModel.get().getCurrent(); + startAudioMixing(current.getLocalUri(), false, 1); + } + + isMusicPlaying = true; + return result; + } + + @Override + public int pauseAudioMixing() { + Logger.t(TAG).d("pauseAudioMixing"); + if (mRtcEngine == null) { + return -1; + } + int result = mRtcEngine.pauseAudioMixing(); + isMusicPlaying = false; + return result; + } + + @Override + public int startAudioMixing(String filePath, boolean loopback, int cycle) { + Logger.t(TAG).d("startAudioMixing filePath=" + filePath + " loopback=" + loopback + " cycle=" + cycle); + if (mRtcEngine == null || TextUtils.isEmpty(filePath)) { + return -1; + } + mRtcEngine.stopAudioMixing(); + int result; + try { + result = mRtcEngine.startAudioMixing(filePath, loopback, cycle); + } catch (Exception e) { + return -1; + } + isMusicPlaying = true; + + return result; + } + + //新方法还没有翻译 还没有验证 + @Override + public int getAudioMixingCurrentPosition() { + + if (mRtcEngine == null) { + return -1; + } + int currentPosition = mRtcEngine.getAudioMixingCurrentPosition(); + + Logger.t(TAG).d("getAudioMixingCurrentPosition() returned: " + currentPosition); + return currentPosition; + } + + @Override + public int getAudioMixingDuration() { + if (mRtcEngine == null) { + return -1; + } + return mRtcEngine.getAudioMixingDuration(); + } + + + @Override + public void setChatRoomOnlineStatus(boolean status) { + + } + + @Override + public void setASMRMode(boolean enable) { + + } +} diff --git a/core/src/main/java/com/chwl/core/manager/event/HallInfoChangeEvent.java b/core/src/main/java/com/chwl/core/manager/event/HallInfoChangeEvent.java new file mode 100644 index 0000000..5655a3c --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/event/HallInfoChangeEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.manager.event; + +/** + * 模厅信息变更事件 + * Created by lvzebiao on 2019/1/11. + */ + +public class HallInfoChangeEvent { +} diff --git a/core/src/main/java/com/chwl/core/manager/event/HistoryMessageEvent.java b/core/src/main/java/com/chwl/core/manager/event/HistoryMessageEvent.java new file mode 100644 index 0000000..0017223 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/event/HistoryMessageEvent.java @@ -0,0 +1,22 @@ +package com.chwl.core.manager.event; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; + +import java.util.List; + +public class HistoryMessageEvent { + + private List messages; + + public HistoryMessageEvent(List messages) { + this.messages = messages; + } + + public List getMessages() { + return messages; + } + + public void setMessages(List messages) { + this.messages = messages; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/BaseAdapterImpl.java b/core/src/main/java/com/chwl/core/manager/trtc/BaseAdapterImpl.java new file mode 100644 index 0000000..65901e6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/BaseAdapterImpl.java @@ -0,0 +1,868 @@ +package com.chwl.core.manager.trtc; + +import android.graphics.Bitmap; + +import com.tencent.rtmp.ui.TXCloudVideoView; +import com.tencent.trtc.TRTCCloud; +import com.tencent.trtc.TRTCCloudDef; + +import io.agora.rtc2.IAudioEffectManager; +import io.agora.rtc2.IAudioFrameObserver; +import io.agora.rtc2.IMetadataObserver; +import io.agora.rtc2.IRtcEngineEventHandler; +import io.agora.rtc2.internal.LastmileProbeConfig; +import io.agora.rtc2.live.LiveInjectStreamConfig; +import io.agora.rtc2.live.LiveTranscoding; +import io.agora.rtc2.video.AgoraImage; +import io.agora.rtc2.video.AgoraVideoFrame; +import io.agora.rtc2.video.BeautyOptions; +import io.agora.rtc2.video.CameraCapturerConfiguration; +import io.agora.rtc2.video.ChannelMediaRelayConfiguration; +import io.agora.rtc2.video.VideoCanvas; +import io.agora.rtc2.video.VideoEncoderConfiguration; +import io.agora.rtc2.video.WatermarkOptions; + +/** + * 默认实现所有的IRTCEngine,避免两个adapter需要实现所有的接口 + */ +public class BaseAdapterImpl implements IRTCEngine { + @Override + public void setNetworkQosParam(TRTCCloudDef.TRTCNetworkQosParam param) { + + } + + @Override + public void showDebugView(int showType) { + + } + + @Override + public void setDebugViewMargin(int userId, TRTCCloud.TRTCViewMargin margin) { + + } + + @Override + public void startRemoteSubStreamView(int userId, TXCloudVideoView view) { + + } + + @Override + public void stopRemoteSubStreamView(int userId) { + + } + + @Override + public void setRemoteSubStreamViewFillMode(int userId, int mode) { + + } + + @Override + public void setEyeScaleLevel(int eyeScaleLevel) { + + } + + @Override + public void setFaceSlimLevel(int faceScaleLevel) { + + } + + @Override + public void setFaceVLevel(int faceVLevel) { + + } + + @Override + public void setFaceShortLevel(int faceShortlevel) { + + } + + @Override + public void setChinLevel(int chinLevel) { + + } + + @Override + public void setNoseSlimLevel(int noseSlimLevel) { + + } + + @Override + public boolean setGreenScreenFile(String file) { + return false; + } + + @Override + public void selectMotionTmpl(String motionPath) { + + } + + @Override + public void setMotionMute(boolean motionMute) { + + } + + @Override + public void setFilter(Bitmap image) { + + } + + @Override + public void setFilterConcentration(float concentration) { + + } + + @Override + public void setLocalViewRotation(int rotation) { + + } + + @Override + public void setVideoEncoderMirror(boolean mirror) { + + } + + @Override + public void setGSensorMode(int mode) { + + } + + @Override + public void ConnectOtherRoom(String param) { + + } + + @Override + public void DisconnectOtherRoom() { + + } + + @Override + public void setMixTranscodingConfig(TRTCCloudDef.TRTCTranscodingConfig config) { + + } + + @Override + public void startCdnPlayerWithUrl(String url, TXCloudVideoView view) { + + } + + @Override + public void stopCdnPlayer() { + + } + + @Override + public int setChannelProfile(int profile) { + return 0; + } + + @Override + public int setClientRole(int role) { + return 0; + } + + @Override + public int joinChannel(String token, String channelName, String optionalInfo, int optionalUid) { + return 0; + } + + @Override + public int switchChannel(String token, String channelName) { + return 0; + } + + @Override + public int leaveChannel() { + return 0; + } + + @Override + public int renewToken(String token) { + return 0; + } + + @Override + public int registerLocalUserAccount(String appId, String userAccount) { + return 0; + } + + @Override + public int joinChannelWithUserAccount(String token, String channelName, String userAccount) { + return 0; + } + + @Override + public int getUserInfoByUserAccount(String userAccount, io.agora.rtc2.UserInfo userInfo) { + return 0; + } + + @Override + public int getUserInfoByUid(int uid, io.agora.rtc2.UserInfo userInfo) { + return 0; + } + + @Override + public int enableWebSdkInteroperability(boolean enabled) { + return 0; + } + + @Override + public int getConnectionState() { + return 0; + } + + @Override + public int enableAudio() { + return 0; + } + + @Override + public int disableAudio() { + return 0; + } + + @Override + public int pauseAudio() { + return 0; + } + + @Override + public int resumeAudio() { + return 0; + } + + @Override + public int setAudioProfile(int profile, int scenario) { + return 0; + } + + @Override + public int setHighQualityAudioParameters(boolean fullband, boolean stereo, boolean fullBitrate) { + return 0; + } + + @Override + public int adjustRecordingSignalVolume(int volume) { + return 0; + } + + @Override + public int adjustPlaybackSignalVolume(int volume) { + return 0; + } + + @Override + public int enableAudioVolumeIndication(int interval, int smooth, boolean report_vad) { + return 0; + } + + @Override + public int enableAudioQualityIndication(boolean enabled) { + return 0; + } + + @Override + public int enableLocalAudio(boolean enabled) { + return 0; + } + + @Override + public int muteLocalAudioStream(boolean muted) { + return 0; + } + + @Override + public int muteRemoteAudioStream(int uid, boolean muted) { + return 0; + } + + @Override + public int muteAllRemoteAudioStreams(boolean muted) { + return 0; + } + + @Override + public int setDefaultMuteAllRemoteAudioStreams(boolean muted) { + return 0; + } + + @Override + public int enableVideo() { + return 0; + } + + @Override + public int disableVideo() { + return 0; + } + + @Override + public int setVideoProfile(int profile, boolean swapWidthAndHeight) { + return 0; + } + + @Override + public int setVideoProfile(int width, int height, int frameRate, int bitrate) { + return 0; + } + + @Override + public int setVideoEncoderConfiguration(VideoEncoderConfiguration config) { + return 0; + } + + @Override + public int setCameraCapturerConfiguration(CameraCapturerConfiguration config) { + return 0; + } + + @Override + public int setupLocalVideo(VideoCanvas local) { + return 0; + } + + @Override + public int setupRemoteVideo(VideoCanvas remote) { + return 0; + } + + @Override + public int setLocalRenderMode(int mode) { + return 0; + } + + @Override + public int setRemoteRenderMode(int uid, int mode) { + return 0; + } + + @Override + public int startPreview() { + return 0; + } + + @Override + public int stopPreview() { + return 0; + } + + @Override + public int enableLocalVideo(boolean enabled) { + return 0; + } + + @Override + public int muteLocalVideoStream(boolean muted) { + return 0; + } + + @Override + public int muteRemoteVideoStream(int uid, boolean muted) { + return 0; + } + + @Override + public int muteAllRemoteVideoStreams(boolean muted) { + return 0; + } + + @Override + public int setDefaultMuteAllRemoteVideoStreams(boolean muted) { + return 0; + } + + @Override + public int setBeautyEffectOptions(boolean enabled, BeautyOptions options) { + return 0; + } + + @Override + public int setDefaultAudioRoutetoSpeakerphone(boolean defaultToSpeaker) { + return 0; + } + + @Override + public int setEnableSpeakerphone(boolean enabled) { + return 0; + } + + @Override + public boolean isSpeakerphoneEnabled() { + return false; + } + + @Override + public int enableInEarMonitoring(boolean enabled) { + return 0; + } + + @Override + public int setInEarMonitoringVolume(int volume) { + return 0; + } + + @Override + public int useExternalAudioDevice() { + return 0; + } + + @Override + public int setLocalVoicePitch(double pitch) { + return 0; + } + + @Override + public int setLocalVoiceEqualization(int bandFrequency, int bandGain) { + return 0; + } + + @Override + public int setLocalVoiceReverb(int reverbKey, int value) { + return 0; + } + + @Override + public int enableSoundPositionIndication(boolean enabled) { + return 0; + } + + @Override + public int setRemoteVoicePosition(int uid, double pan, double gain) { + return 0; + } + + @Override + public int startAudioMixing(String filePath, boolean loopback, boolean replace, int cycle) { + return 0; + } + + @Override + public int stopAudioMixing() { + return 0; + } + + @Override + public int pauseAudioMixing() { + return 0; + } + + @Override + public int resumeAudioMixing() { + return 0; + } + + @Override + public int adjustAudioMixingVolume(int volume) { + return 0; + } + + @Override + public int adjustAudioMixingPlayoutVolume(int volume) { + return 0; + } + + @Override + public int adjustAudioMixingPublishVolume(int volume) { + return 0; + } + + @Override + public int getAudioMixingPlayoutVolume() { + return 0; + } + + @Override + public int getAudioMixingPublishVolume() { + return 0; + } + + @Override + public int getAudioMixingDuration() { + return 0; + } + + @Override + public int getAudioMixingCurrentPosition() { + return 0; + } + + @Override + public int setAudioMixingPosition(int pos) { + return 0; + } + + @Override + public IAudioEffectManager getAudioEffectManager() { + return null; + } + + @Override + public int startAudioRecording(String filePath, int quality) { + return 0; + } + + @Override + public int startAudioRecording(String filePath, int sampleRate, int quality) { + return 0; + } + + @Override + public int stopAudioRecording() { + return 0; + } + + @Override + public int startEchoTest() { + return 0; + } + + @Override + public int startEchoTest(int intervalInSeconds) { + return 0; + } + + @Override + public int stopEchoTest() { + return 0; + } + + @Override + public int enableLastmileTest() { + return 0; + } + + @Override + public int disableLastmileTest() { + return 0; + } + + @Override + public int startLastmileProbeTest(LastmileProbeConfig config) { + return 0; + } + + @Override + public int stopLastmileProbeTest() { + return 0; + } + + @Override + public int setExternalAudioSink(boolean enabled, int sampleRate, int channels) { + return 0; + } + + @Override + public int pullPlaybackAudioFrame(byte[] data, int lengthInByte) { + return 0; + } + + @Override + public int setExternalAudioSource(boolean enabled, int sampleRate, int channels) { + return 0; + } + + @Override + public int pushExternalAudioFrame(byte[] data, long timestamp) { + return 0; + } + + @Override + public void setExternalVideoSource(boolean enable, boolean useTexture, boolean pushMode) { + + } + + @Override + public boolean pushExternalVideoFrame(AgoraVideoFrame frame) { + return false; + } + + @Override + public boolean isTextureEncodeSupported() { + return false; + } + + @Override + public int registerAudioFrameObserver(IAudioFrameObserver observer) { + return 0; + } + + @Override + public int setRecordingAudioFrameParameters(int sampleRate, int channel, int mode, int samplesPerCall) { + return 0; + } + + @Override + public int setPlaybackAudioFrameParameters(int sampleRate, int channel, int mode, int samplesPerCall) { + return 0; + } + + @Override + public int setMixedAudioFrameParameters(int sampleRate, int samplesPerCall) { + return 0; + } + + @Override + public int addVideoWatermark(AgoraImage watermark) { + return 0; + } + + @Override + public int addVideoWatermark(String watermarkUrl, WatermarkOptions options) { + return 0; + } + + @Override + public int clearVideoWatermarks() { + return 0; + } + + @Override + public int setRemoteUserPriority(int uid, int userPriority) { + return 0; + } + + @Override + public int setLocalPublishFallbackOption(int option) { + return 0; + } + + @Override + public int setRemoteSubscribeFallbackOption(int option) { + return 0; + } + + @Override + public int enableDualStreamMode(boolean enabled) { + return 0; + } + + @Override + public int setRemoteVideoStreamType(int uid, int streamType) { + return 0; + } + + @Override + public int setRemoteDefaultVideoStreamType(int streamType) { + return 0; + } + + @Override + public int setEncryptionSecret(String secret) { + return 0; + } + + @Override + public int setEncryptionMode(String encryptionMode) { + return 0; + } + + @Override + public int addInjectStreamUrl(String url, LiveInjectStreamConfig config) { + return 0; + } + + @Override + public int removeInjectStreamUrl(String url) { + return 0; + } + + @Override + public int addPublishStreamUrl(String url, boolean transcodingEnabled) { + return 0; + } + + @Override + public int removePublishStreamUrl(String url) { + return 0; + } + + @Override + public int setLiveTranscoding(LiveTranscoding transcoding) { + return 0; + } + + @Override + public int createDataStream(boolean reliable, boolean ordered) { + return 0; + } + + @Override + public int sendStreamMessage(int streamId, byte[] message) { + return 0; + } + + @Override + public int setVideoQualityParameters(boolean preferFrameRateOverImageQuality) { + return 0; + } + + @Override + public int setLocalVideoMirrorMode(int mode) { + return 0; + } + + @Override + public int switchCamera() { + return 0; + } + + @Override + public boolean isCameraZoomSupported() { + return false; + } + + @Override + public boolean isCameraTorchSupported() { + return false; + } + + @Override + public boolean isCameraFocusSupported() { + return false; + } + + @Override + public boolean isCameraExposurePositionSupported() { + return false; + } + + @Override + public boolean isCameraAutoFocusFaceModeSupported() { + return false; + } + + @Override + public int setCameraZoomFactor(float factor) { + return 0; + } + + @Override + public float getCameraMaxZoomFactor() { + return 0; + } + + @Override + public int setCameraFocusPositionInPreview(float positionX, float positionY) { + return 0; + } + + @Override + public int setCameraExposurePosition(float positionXinView, float positionYinView) { + return 0; + } + + @Override + public int setCameraTorchOn(boolean isOn) { + return 0; + } + + @Override + public int setCameraAutoFocusFaceModeEnabled(boolean enabled) { + return 0; + } + + @Override + public String getCallId() { + return null; + } + + @Override + public int rate(String callId, int rating, String description) { + return 0; + } + + @Override + public int complain(String callId, String description) { + return 0; + } + + @Override + public int setLogFile(String filePath) { + return 0; + } + + @Override + public int setLogFilter(int filter) { + return 0; + } + + @Override + public int setLogFileSize(int fileSizeInKBytes) { + return 0; + } + + @Override + public long getNativeHandle() { + return 0; + } + + @Override + public void addHandler(IRtcEngineEventHandler handler) { + + } + + @Override + public void removeHandler(IRtcEngineEventHandler handler) { + + } + + @Override + public boolean enableHighPerfWifiMode(boolean enable) { + return false; + } + + @Override + public void monitorHeadsetEvent(boolean monitor) { + + } + + @Override + public void monitorBluetoothHeadsetEvent(boolean monitor) { + + } + + @Override + public void setPreferHeadset(boolean enabled) { + + } + + @Override + public int setParameters(String parameters) { + return 0; + } + + @Override + public String getParameter(String parameter, String args) { + return null; + } + + @Override + public int registerMediaMetadataObserver(IMetadataObserver observer, int type) { + return 0; + } + + @Override + public int startChannelMediaRelay(ChannelMediaRelayConfiguration channelMediaRelayConfiguration) { + return 0; + } + + @Override + public int stopChannelMediaRelay() { + return 0; + } + + @Override + public int updateChannelMediaRelay(ChannelMediaRelayConfiguration channelMediaRelayConfiguration) { + return 0; + } + + @Override + public int startDumpVideoReceiveTrack(int uid) { + return 0; + } + + @Override + public int stopDumpVideoReceiveTrack() { + return 0; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraHandlerInterface.java b/core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraHandlerInterface.java new file mode 100644 index 0000000..2a7b86e --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraHandlerInterface.java @@ -0,0 +1,155 @@ +package com.chwl.core.manager.trtc; + +import android.graphics.Rect; + +import io.agora.rtc2.IRtcEngineEventHandler; + + +/** + * 对齐IRtcEngineEventHandler的所有接口 + */ +interface BaseAgoraHandlerInterface { + void onWarning(int warn); + + void onError(int err); + + void onJoinChannelSuccess(String channel, int uid, int elapsed); + + void onRejoinChannelSuccess(String channel, int uid, int elapsed); + + void onLeaveChannel(IRtcEngineEventHandler.RtcStats stats); + + void onClientRoleChanged(int oldRole, int newRole); + + @Version(agora = "4.2.2") + void onLocalUserRegistered(int uid, String userAccount); + + @Version(agora = "4.2.2") + void onUserInfoUpdated(int uid, io.agora.rtc2.UserInfo userInfo); + + void onUserJoined(int uid, int elapsed); + + void onUserOffline(int uid, int reason); + + void onConnectionStateChanged(int state, int reason); + + void onConnectionLost(); + + @Version(agora = "3.0.0") + void onConnectionInterrupted(); + + @Version(agora = "3.0.0") + void onAudioQuality(int uid, int quality, short delay, short lost); + + void onApiCallExecuted(int error, String api, String result); + + void onTokenPrivilegeWillExpire(String token); + + void onRequestToken(); + + void onMicrophoneEnabled(boolean enabled); + + void onAudioVolumeIndication(IRtcEngineEventHandler.AudioVolumeInfo[] speakers, int totalVolume); + + void onActiveSpeaker(int uid); + + void onFirstLocalAudioFrame(int elapsed); + + void onFirstRemoteAudioFrame(int uid, int elapsed); + + void onFirstRemoteAudioDecoded(int uid, int elapsed); + + void onVideoStopped(); + + void onFirstLocalVideoFrame(int width, int height, int elapsed); + + void onFirstRemoteVideoDecoded(int uid, int width, int height, int elapsed); + + void onFirstRemoteVideoFrame(int uid, int width, int height, int elapsed); + + void onUserMuteAudio(int uid, boolean muted); + + void onUserMuteVideo(int uid, boolean muted); + + void onUserEnableVideo(int uid, boolean enabled); + + void onUserEnableLocalVideo(int uid, boolean enabled); + + void onVideoSizeChanged(int uid, int width, int height, int rotation); + + @Version(agora = "2.9.2") + void onRemoteAudioStateChanged(int uid, int state, int reason, int elapsed); + + @Version(agora = "2.9.2") + void onRemoteVideoStateChanged(int uid, int state, int reason, int elapsed); + + @Version(agora = "2.9.2") + void onChannelMediaRelayStateChanged(int state, int code); + + @Version(agora = "2.9.2") + void onChannelMediaRelayEvent(int code); + + void onLocalPublishFallbackToAudioOnly(boolean isFallbackOrRecover); + + void onRemoteSubscribeFallbackToAudioOnly(int uid, boolean isFallbackOrRecover); + + void onAudioRouteChanged(int routing); + + void onCameraReady(); + + void onCameraFocusAreaChanged(Rect rect); + + void onCameraExposureAreaChanged(Rect rect); + + void onRtcStats(IRtcEngineEventHandler.RtcStats stats); + + void onLastmileQuality(int quality); + + void onLastmileProbeResult(IRtcEngineEventHandler.LastmileProbeResult result); + + void onNetworkQuality(int uid, int txQuality, int rxQuality); + + void onLocalVideoStats(IRtcEngineEventHandler.LocalVideoStats stats); + + void onRemoteVideoStats(IRtcEngineEventHandler.RemoteVideoStats stats); + + void onLocalAudioStats(IRtcEngineEventHandler.LocalAudioStats stats); + + @Version(agora = "2.9.2") + void onRemoteAudioStats(IRtcEngineEventHandler.RemoteAudioStats stats); + + void onRemoteAudioTransportStats(int uid, int delay, int lost, int rxKBitRate); + + void onRemoteVideoTransportStats(int uid, int delay, int lost, int rxKBitRate); + + void onAudioMixingStateChanged(int state, int errorCode); + + void onAudioMixingFinished(); + + void onAudioEffectFinished(int soundId); + + @Version(agora = "2.9.2") + void onLocalAudioStateChanged(int state, int error); + + @Version(agora = "2.9.2") + void onLocalVideoStateChanged(int localVideoState, int error); + + @Version(agora = "2.9.2") + void onRtmpStreamingStateChanged(String url, int state, int errCode); + + void onStreamPublished(String url, int error); + + void onStreamUnpublished(String url); + + void onTranscodingUpdated(); + + void onStreamInjectedStatus(String url, int uid, int status); + + void onStreamMessage(int uid, int streamId, byte[] data); + + void onStreamMessageError(int uid, int streamId, int error, int missed, int cached); + + void onMediaEngineLoadSuccess(); + + void onMediaEngineStartCallSuccess(); +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraInterface.java b/core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraInterface.java new file mode 100644 index 0000000..5d23480 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/BaseAgoraInterface.java @@ -0,0 +1,340 @@ +package com.chwl.core.manager.trtc; + +import io.agora.rtc2.IAudioFrameObserver; +import io.agora.rtc2.IMetadataObserver; +import io.agora.rtc2.IRtcEngineEventHandler; +import io.agora.rtc2.internal.LastmileProbeConfig; +import io.agora.rtc2.live.LiveInjectStreamConfig; +import io.agora.rtc2.live.LiveTranscoding; +import io.agora.rtc2.IAudioEffectManager; +import io.agora.rtc2.video.AgoraImage; +import io.agora.rtc2.video.AgoraVideoFrame; +import io.agora.rtc2.video.BeautyOptions; +import io.agora.rtc2.video.CameraCapturerConfiguration; +import io.agora.rtc2.video.ChannelMediaRelayConfiguration; +import io.agora.rtc2.video.VideoCanvas; +import io.agora.rtc2.video.VideoEncoderConfiguration; +import io.agora.rtc2.video.WatermarkOptions; + +/** + * 接口类,和声网所有接口保持一致 + */ +@Version(agora = "3.0.0", trtc = "6.8") +public interface BaseAgoraInterface { + int setChannelProfile(int profile); + + int setClientRole(int role); + + int joinChannel(String token, String channelName, String optionalInfo, int optionalUid); + + int switchChannel(String token, String channelName); + + int leaveChannel(); + + int renewToken(String token); + + int registerLocalUserAccount(String appId, String userAccount); + + int joinChannelWithUserAccount(String token, String channelName, String userAccount); + + int getUserInfoByUserAccount(String userAccount, io.agora.rtc2.UserInfo userInfo); + + int getUserInfoByUid(int uid, io.agora.rtc2.UserInfo userInfo); + + int enableWebSdkInteroperability(boolean enabled); + + int getConnectionState(); + + int enableAudio(); + + int disableAudio(); + + /** @deprecated */ + @Deprecated + int pauseAudio(); + + /** @deprecated */ + @Deprecated + int resumeAudio(); + + int setAudioProfile(int profile, int scenario); + + /** @deprecated */ + @Deprecated + int setHighQualityAudioParameters(boolean fullband, boolean stereo, boolean fullBitrate); + + int adjustRecordingSignalVolume(int volume); + + int adjustPlaybackSignalVolume(int volume); + + int enableAudioVolumeIndication(int interval, int smooth, boolean report_vad); + + /** @deprecated */ + @Deprecated + int enableAudioQualityIndication(boolean enabled); + + int enableLocalAudio(boolean enabled); + + int muteLocalAudioStream(boolean muted); + + int muteRemoteAudioStream(int uid, boolean muted); + + int muteAllRemoteAudioStreams(boolean muted); + + int setDefaultMuteAllRemoteAudioStreams(boolean muted); + + int enableVideo(); + + int disableVideo(); + + /** @deprecated */ + @Deprecated + int setVideoProfile(int profile, boolean swapWidthAndHeight); + + /** @deprecated */ + @Deprecated + int setVideoProfile(int width, int height, int frameRate, int bitrate); + + int setVideoEncoderConfiguration(VideoEncoderConfiguration config); + + int setCameraCapturerConfiguration(CameraCapturerConfiguration config); + + int setupLocalVideo(VideoCanvas local); + + int setupRemoteVideo(VideoCanvas remote); + + int setLocalRenderMode(int mode); + + int setRemoteRenderMode(int uid, int mode); + + int startPreview(); + + int stopPreview(); + + int enableLocalVideo(boolean enabled); + + int muteLocalVideoStream(boolean muted); + + int muteRemoteVideoStream(int uid, boolean muted); + + int muteAllRemoteVideoStreams(boolean muted); + + int setDefaultMuteAllRemoteVideoStreams(boolean muted); + + int setBeautyEffectOptions(boolean enabled, BeautyOptions options); + + int setDefaultAudioRoutetoSpeakerphone(boolean defaultToSpeaker); + + int setEnableSpeakerphone(boolean enabled); + + boolean isSpeakerphoneEnabled(); + + int enableInEarMonitoring(boolean enabled); + + int setInEarMonitoringVolume(int volume); + + /** @deprecated */ + @Deprecated + int useExternalAudioDevice(); + + int setLocalVoicePitch(double pitch); + + int setLocalVoiceEqualization(int bandFrequency, int bandGain); + + int setLocalVoiceReverb(int reverbKey, int value); + + + int enableSoundPositionIndication(boolean enabled); + + int setRemoteVoicePosition(int uid, double pan, double gain); + + int startAudioMixing(String filePath, boolean loopback, boolean replace, int cycle); + + int stopAudioMixing(); + + int pauseAudioMixing(); + + int resumeAudioMixing(); + + int adjustAudioMixingVolume(int volume); + + int adjustAudioMixingPlayoutVolume(int volume); + + int adjustAudioMixingPublishVolume(int volume); + + int getAudioMixingPlayoutVolume(); + + int getAudioMixingPublishVolume(); + + int getAudioMixingDuration(); + + int getAudioMixingCurrentPosition(); + + int setAudioMixingPosition(int pos); + + IAudioEffectManager getAudioEffectManager(); + + /** @deprecated */ + @Deprecated + int startAudioRecording(String filePath, int quality); + + int startAudioRecording(String filePath, int sampleRate, int quality); + + int stopAudioRecording(); + + /** @deprecated */ + @Deprecated + int startEchoTest(); + + int startEchoTest(int intervalInSeconds); + + int stopEchoTest(); + + int enableLastmileTest(); + + int disableLastmileTest(); + + int startLastmileProbeTest(LastmileProbeConfig config); + + int stopLastmileProbeTest(); + + int setExternalAudioSink(boolean enabled, int sampleRate, int channels); + + int pullPlaybackAudioFrame(byte[] data, int lengthInByte); + + int setExternalAudioSource(boolean enabled, int sampleRate, int channels); + + int pushExternalAudioFrame(byte[] data, long timestamp); + + void setExternalVideoSource(boolean enable, boolean useTexture, boolean pushMode); + + boolean pushExternalVideoFrame(AgoraVideoFrame frame); + + boolean isTextureEncodeSupported(); + + int registerAudioFrameObserver(IAudioFrameObserver observer); + + int setRecordingAudioFrameParameters(int sampleRate, int channel, int mode, int samplesPerCall); + + int setPlaybackAudioFrameParameters(int sampleRate, int channel, int mode, int samplesPerCall); + + int setMixedAudioFrameParameters(int sampleRate, int samplesPerCall); + + /** @deprecated */ + @Deprecated + int addVideoWatermark(AgoraImage watermark); + + int addVideoWatermark(String watermarkUrl, WatermarkOptions options); + + int clearVideoWatermarks(); + + int setRemoteUserPriority(int uid, int userPriority); + + int setLocalPublishFallbackOption(int option); + + int setRemoteSubscribeFallbackOption(int option); + + int enableDualStreamMode(boolean enabled); + + int setRemoteVideoStreamType(int uid, int streamType); + + int setRemoteDefaultVideoStreamType(int streamType); + + int setEncryptionSecret(String secret); + + int setEncryptionMode(String encryptionMode); + + int addInjectStreamUrl(String url, LiveInjectStreamConfig config); + + int removeInjectStreamUrl(String url); + + int addPublishStreamUrl(String url, boolean transcodingEnabled); + + int removePublishStreamUrl(String url); + + int setLiveTranscoding(LiveTranscoding transcoding); + + int createDataStream(boolean reliable, boolean ordered); + + int sendStreamMessage(int streamId, byte[] message); + + /** @deprecated */ + @Deprecated + int setVideoQualityParameters(boolean preferFrameRateOverImageQuality); + + int setLocalVideoMirrorMode(int mode); + + int switchCamera(); + + boolean isCameraZoomSupported(); + + boolean isCameraTorchSupported(); + + boolean isCameraFocusSupported(); + + boolean isCameraExposurePositionSupported(); + + boolean isCameraAutoFocusFaceModeSupported(); + + int setCameraZoomFactor(float factor); + + float getCameraMaxZoomFactor(); + + int setCameraFocusPositionInPreview(float positionX, float positionY); + + int setCameraExposurePosition(float positionXinView, float positionYinView); + + int setCameraTorchOn(boolean isOn); + + int setCameraAutoFocusFaceModeEnabled(boolean enabled); + + String getCallId(); + + int rate(String callId, int rating, String description); + + int complain(String callId, String description); + + int setLogFile(String filePath); + + int setLogFilter(int filter); + + int setLogFileSize(int fileSizeInKBytes); + + long getNativeHandle(); + + void addHandler(IRtcEngineEventHandler handler); + + void removeHandler(IRtcEngineEventHandler handler); + + /** @deprecated */ + @Deprecated + boolean enableHighPerfWifiMode(boolean enable); + + /** @deprecated */ + @Deprecated + void monitorHeadsetEvent(boolean monitor); + + /** @deprecated */ + @Deprecated + void monitorBluetoothHeadsetEvent(boolean monitor); + + /** @deprecated */ + @Deprecated + void setPreferHeadset(boolean enabled); + + int setParameters(String parameters); + + String getParameter(String parameter, String args); + + int registerMediaMetadataObserver(IMetadataObserver observer, int type); + + int startChannelMediaRelay(ChannelMediaRelayConfiguration channelMediaRelayConfiguration); + + int stopChannelMediaRelay(); + + int updateChannelMediaRelay(ChannelMediaRelayConfiguration channelMediaRelayConfiguration); + + int startDumpVideoReceiveTrack(int uid); + + int stopDumpVideoReceiveTrack(); +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/IRTCEngine.java b/core/src/main/java/com/chwl/core/manager/trtc/IRTCEngine.java new file mode 100644 index 0000000..16f87fe --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/IRTCEngine.java @@ -0,0 +1,66 @@ +package com.chwl.core.manager.trtc; + +import android.graphics.Bitmap; + +import com.tencent.rtmp.ui.TXCloudVideoView; +import com.tencent.trtc.TRTCCloud; +import com.tencent.trtc.TRTCCloudDef; + +/** + * 接口类,包括声网和TRTC自己的函数,可以增加自定义的接口,然后让两套适配层进行适配 + */ +public interface IRTCEngine extends BaseAgoraInterface { + /** + * ====================这些都是TRTC特有的函数============= + */ + void setNetworkQosParam(TRTCCloudDef.TRTCNetworkQosParam param); + + void showDebugView(int showType); + + void setDebugViewMargin(int userId, TRTCCloud.TRTCViewMargin margin); + + void startRemoteSubStreamView(int userId, TXCloudVideoView view); + + void stopRemoteSubStreamView(int userId); + + void setRemoteSubStreamViewFillMode(int userId, int mode); + + void setEyeScaleLevel(int eyeScaleLevel); + + void setFaceSlimLevel(int faceScaleLevel); + + void setFaceVLevel(int faceVLevel); + + void setFaceShortLevel(int faceShortlevel); + + void setChinLevel(int chinLevel); + + void setNoseSlimLevel(int noseSlimLevel); + + boolean setGreenScreenFile(String file); + + void selectMotionTmpl(String motionPath); + + void setMotionMute(boolean motionMute); + + void setFilter(Bitmap image); + + void setFilterConcentration(float concentration); + + void setLocalViewRotation(int rotation); + + void setVideoEncoderMirror(boolean mirror); + + void setGSensorMode(int mode); + + void ConnectOtherRoom(String param); + + void DisconnectOtherRoom(); + + //设置云端的混流转码参数 + void setMixTranscodingConfig(TRTCCloudDef.TRTCTranscodingConfig config); + + void startCdnPlayerWithUrl(String url, TXCloudVideoView view); + + void stopCdnPlayer(); +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/IRTCEngineHandler.java b/core/src/main/java/com/chwl/core/manager/trtc/IRTCEngineHandler.java new file mode 100644 index 0000000..0e8ecff --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/IRTCEngineHandler.java @@ -0,0 +1,21 @@ +package com.chwl.core.manager.trtc; + +import com.tencent.trtc.TRTCCloudDef; + +/** + * 包括声网和腾讯云的回调 + */ +interface IRTCEngineHandler extends BaseAgoraHandlerInterface { + + void onUserSubStreamAvailable(int userId, boolean available); + + void onSpeedTest(TRTCCloudDef.TRTCSpeedTestResult currentResult, int finishedCount, int totalCount); + + void onRecvSEIMsg(int userId, byte[] data); + + void onSetMixTranscodingConfig(int err, String errMsg); + + void onConnectOtherRoom(int userID, int err, String errMsg); + + void onDisConnectOtherRoom(int err, String errMsg); +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/RoomIdHelper.java b/core/src/main/java/com/chwl/core/manager/trtc/RoomIdHelper.java new file mode 100644 index 0000000..a2f1e0a --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/RoomIdHelper.java @@ -0,0 +1,16 @@ +package com.chwl.core.manager.trtc; + +import com.chwl.core.utils.StringFormatUtils; + +public class RoomIdHelper { + /** + * trtr的房间id只能是int! + * @param roomId + * @param uid + * @return + */ + public static int getRoomId(String roomId, int uid) { + int intRoomId = StringFormatUtils.toInt(roomId, 0); + return intRoomId == 0 ? uid : intRoomId; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/SDKConfig.java b/core/src/main/java/com/chwl/core/manager/trtc/SDKConfig.java new file mode 100644 index 0000000..784b89f --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/SDKConfig.java @@ -0,0 +1,34 @@ +package com.chwl.core.manager.trtc; + + +public class SDKConfig { + /** + * 声网appid,需要替换为尽自己账号下的声网appid + */ + public static String AGORA_APPID = ""; + /** + * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。 + *

+ * 进入腾讯云云通信[控制台](https://console.cloud.tencent.com/avc) 创建应用,即可看到 SDKAppId, + * 它是腾讯云用于区分客户的唯一标识。 + */ +// public static int TX_SDKAPPID = 1400823228;// + + /** + * 腾讯云 bizid和appid + * 腾讯云的bizid https://console.cloud.tencent.com/rav 点击【应用】【帐号信息】在【直播信息】中可以看到bizid和appid, 分别填到下面这两个符号 + */ + public static int TX_BIZID = 0;// + public static int TX_APPID = 0;// + + /** + * 混流播放地址,请填写您的播放地址 + */ + public static String TX_PLAYDOMAIN = ""; + /** + * 表示房间号是否为整型值 + * 0:表示房间号为字符串房间号,不能直接转换为整型,如:"111_222","namme1" + * 1:表示房间号为整型房间号,如:"111","123" + */ + public static int TX_CHANNELNAME_INT = 1; +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/TRTCEffectManager.java b/core/src/main/java/com/chwl/core/manager/trtc/TRTCEffectManager.java new file mode 100644 index 0000000..43c8142 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/TRTCEffectManager.java @@ -0,0 +1,178 @@ +package com.chwl.core.manager.trtc; + +import com.tencent.liteav.audio.TXAudioEffectManager; +import com.tencent.trtc.TRTCCloud; + +import java.util.HashSet; +import java.util.Set; + +import io.agora.rtc2.IAudioEffectManager; + + +/** + * 音效的控制类 + */ +public class TRTCEffectManager implements IAudioEffectManager { + // SDK 核心类 + private TRTCCloud mTRTCCloud; + private double mEffectsVolume; + private Set mEffectIdSet; + private TXAudioEffectManager.TXMusicPlayObserver mMusicPlayObserver; + + public TRTCEffectManager(TRTCCloud trtcCloud) { + mTRTCCloud = trtcCloud; + mEffectIdSet = new HashSet<>(); + } + + public void destroy() { + stopAllAudioEffects(); + } + + /** + * ==================================音效面板控制================================== + */ + private void playAudioEffect(int effectId, String path, int count, boolean publish, double volume) { + if (mTRTCCloud != null) { + TXAudioEffectManager.AudioMusicParam audioMusicParam = new TXAudioEffectManager.AudioMusicParam(effectId, path); + audioMusicParam.loopCount = count; + audioMusicParam.publish = publish; + audioMusicParam.isShortFile = true; + if (mMusicPlayObserver != null) { + mTRTCCloud.getAudioEffectManager().setMusicObserver(effectId, mMusicPlayObserver); + } + mTRTCCloud.getAudioEffectManager().startPlayMusic(audioMusicParam); + mEffectIdSet.add(effectId); + } + } + + private void stopAudioEffect(int effectId) { + if (mTRTCCloud != null) { + mTRTCCloud.getAudioEffectManager().stopPlayMusic(effectId); + mEffectIdSet.remove(effectId); + } + } + + private void setAudioEffectVolume(int effectId, int gain) { + if (mTRTCCloud != null) { + mTRTCCloud.getAudioEffectManager().setMusicPublishVolume(effectId, gain); + mTRTCCloud.getAudioEffectManager().setMusicPlayoutVolume(effectId, gain); + } + } + + private void stopAllAudioEffects() { + if (mTRTCCloud != null) { + for (int i : mEffectIdSet) { + mTRTCCloud.getAudioEffectManager().stopPlayMusic(i); + } + mEffectIdSet.clear(); + } + } + + private void setAllAudioEffectsVolume(int gain) { + mEffectsVolume = gain; + if (mTRTCCloud != null) { + mTRTCCloud.getAudioEffectManager().setAllMusicVolume(gain); + } + } + + @Override + public double getEffectsVolume() { + return mEffectsVolume; + } + + @Override + public int setEffectsVolume(double volume) { + setAllAudioEffectsVolume((int) volume); + return 0; + } + + @Override + public int setVolumeOfEffect(int soundId, double volume) { + setAudioEffectVolume(soundId, (int) volume); + return 0; + } + + @Override + public int playEffect(int soundId, String filePath, int loop, double pitch, double pan, double gain) { + playAudioEffect(soundId, filePath, loop, true, gain); + return 0; + } + + @Override + public int playEffect(int soundId, String filePath, int loopCount, double pitch, double pan, double gain, boolean publish) { + playAudioEffect(soundId, filePath, loopCount, publish, gain); + return 0; + } + + @Override + public int playEffect(int soundId, String filePath, int loopCount, double pitch, double pan, double gain, boolean publish, int startPos) { + return 0; + } + + @Override + public int stopEffect(int soundId) { + stopAudioEffect(soundId); + return 0; + } + + @Override + public int stopAllEffects() { + stopAllAudioEffects(); + return 0; + } + + @Override + public int preloadEffect(int soundId, String filePath) { + return 0; + } + + @Override + public int preloadEffect(int soundId, String filePath, int startPos) { + return 0; + } + + @Override + public int unloadEffect(int soundId) { + return 0; + } + + @Override + public int pauseEffect(int soundId) { + if (mTRTCCloud != null) { + mTRTCCloud.getAudioEffectManager().pausePlayMusic(soundId); + } + return 0; + } + + @Override + public int pauseAllEffects() { + if (mTRTCCloud != null) { + for (int i : mEffectIdSet) { + mTRTCCloud.getAudioEffectManager().pausePlayMusic(i); + } + } + return 0; + } + + @Override + public int resumeEffect(int soundId) { + if (mTRTCCloud != null) { + mTRTCCloud.getAudioEffectManager().resumePlayMusic(soundId); + } + return 0; + } + + @Override + public int resumeAllEffects() { + if (mTRTCCloud != null) { + for (int i : mEffectIdSet) { + mTRTCCloud.getAudioEffectManager().resumePlayMusic(i); + } + } + return 0; + } + + public void setMusicObserver(TXAudioEffectManager.TXMusicPlayObserver observer) { + mMusicPlayObserver = observer; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/TRTCEngineAdapter.java b/core/src/main/java/com/chwl/core/manager/trtc/TRTCEngineAdapter.java new file mode 100644 index 0000000..0afbe85 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/TRTCEngineAdapter.java @@ -0,0 +1,2479 @@ +package com.chwl.core.manager.trtc; + +import static com.tencent.trtc.TRTCCloudDef.TRTCRoleAnchor; +import static com.tencent.trtc.TRTCCloudDef.TRTCRoleAudience; +import static com.tencent.trtc.TRTCCloudDef.TRTC_APP_SCENE_LIVE; +import static com.tencent.trtc.TRTCCloudDef.TRTC_APP_SCENE_VIDEOCALL; +import static com.tencent.trtc.TRTCCloudDef.TRTC_LOG_LEVEL_DEBUG; +import static com.tencent.trtc.TRTCCloudDef.TRTC_LOG_LEVEL_ERROR; +import static com.tencent.trtc.TRTCCloudDef.TRTC_LOG_LEVEL_FATAL; +import static com.tencent.trtc.TRTCCloudDef.TRTC_LOG_LEVEL_INFO; +import static com.tencent.trtc.TRTCCloudDef.TRTC_LOG_LEVEL_NULL; +import static com.tencent.trtc.TRTCCloudDef.TRTC_LOG_LEVEL_WARN; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_I420; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_NV21; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_TEXTURE_EXTERNAL_OES; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_UNKNOWN; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_QOS_PREFERENCE_CLEAR; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_QOS_PREFERENCE_SMOOTH; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_RESOLUTION_320_240; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG; +import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_SMALL; +import static com.tencent.trtc.TRTCCloudDef.VIDEO_QOS_CONTROL_SERVER; +import static io.agora.rtc2.Constants.AUDIO_ROUTE_DEFAULT; +import static io.agora.rtc2.Constants.AUDIO_ROUTE_EARPIECE; +import static io.agora.rtc2.Constants.AUDIO_ROUTE_SPEAKERPHONE; +import static io.agora.rtc2.Constants.CHANNEL_PROFILE_COMMUNICATION; +import static io.agora.rtc2.Constants.CHANNEL_PROFILE_LIVE_BROADCASTING; +import static io.agora.rtc2.Constants.CLIENT_ROLE_AUDIENCE; +import static io.agora.rtc2.Constants.CLIENT_ROLE_BROADCASTER; +import static io.agora.rtc2.Constants.ERR_ADM_STOP_PLAYOUT; +import static io.agora.rtc2.Constants.ERR_BITRATE_LIMIT; +import static io.agora.rtc2.Constants.ERR_CONNECTION_INTERRUPTED; +import static io.agora.rtc2.Constants.ERR_CONNECTION_LOST; +import static io.agora.rtc2.Constants.ERR_FAILED; +import static io.agora.rtc2.Constants.ERR_INVALID_APP_ID; +import static io.agora.rtc2.Constants.ERR_INVALID_CHANNEL_NAME; +import static io.agora.rtc2.Constants.ERR_JOIN_CHANNEL_REJECTED; +import static io.agora.rtc2.Constants.ERR_OK; +import static io.agora.rtc2.Constants.ERR_SIZE_TOO_LARGE; +import static io.agora.rtc2.Constants.ERR_TOO_MANY_DATA_STREAMS; +import static io.agora.rtc2.Constants.ERR_VDM_CAMERA_NOT_AUTHORIZED; +import static io.agora.rtc2.Constants.LOG_FILTER_CRITICAL; +import static io.agora.rtc2.Constants.LOG_FILTER_DEBUG; +import static io.agora.rtc2.Constants.LOG_FILTER_ERROR; +import static io.agora.rtc2.Constants.LOG_FILTER_INFO; +import static io.agora.rtc2.Constants.LOG_FILTER_OFF; +import static io.agora.rtc2.Constants.LOG_FILTER_WARNING; +import static io.agora.rtc2.Constants.REMOTE_VIDEO_STATE_REASON_INTERNAL; +import static io.agora.rtc2.Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_MUTED; +import static io.agora.rtc2.Constants.REMOTE_VIDEO_STATE_REASON_REMOTE_UNMUTED; +import static io.agora.rtc2.Constants.REMOTE_VIDEO_STATE_STARTING; +import static io.agora.rtc2.Constants.REMOTE_VIDEO_STATE_STOPPED; +import static io.agora.rtc2.Constants.VIDEO_STREAM_HIGH; +import static io.agora.rtc2.Constants.VIDEO_STREAM_LOW; +import static io.agora.rtc2.Constants.WARN_INVALID_VIEW; +import static io.agora.rtc2.video.CameraCapturerConfiguration.CAMERA_DIRECTION.CAMERA_FRONT; +import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_ADAPTIVE; +import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_LANDSCAPE; +import static io.agora.rtc2.video.VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.SurfaceView; + +import com.tencent.liteav.audio.TXAudioEffectManager; +import com.tencent.liteav.device.TXDeviceManager; +import com.tencent.rtmp.TXLivePlayer; +import com.tencent.rtmp.ui.TXCloudVideoView; +import com.tencent.trtc.TRTCCloud; +import com.tencent.trtc.TRTCCloudDef; +import com.tencent.trtc.TRTCCloudListener; +import com.tencent.trtc.TRTCStatistics; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.utils.LogUtils; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import io.agora.rtc2.IAudioEffectManager; +import io.agora.rtc2.IAudioFrameObserver; +import io.agora.rtc2.IMetadataObserver; +import io.agora.rtc2.IRtcEngineEventHandler; +import io.agora.rtc2.live.LiveTranscoding; +import io.agora.rtc2.video.AgoraImage; +import io.agora.rtc2.video.AgoraVideoFrame; +import io.agora.rtc2.video.BeautyOptions; +import io.agora.rtc2.video.CameraCapturerConfiguration; +import io.agora.rtc2.video.ChannelMediaRelayConfiguration; +import io.agora.rtc2.video.VideoCanvas; +import io.agora.rtc2.video.VideoEncoderConfiguration; +import io.agora.rtc2.video.WatermarkOptions; + +/** + * TRTC适配层 + */ +public class TRTCEngineAdapter extends BaseAdapterImpl { + public static final int ERR_NULL = 0; + public static final int ERR_CAMERA_START_FAIL = -1301; ///< 打开摄像头失败,例如在 Windows 或 Mac 设备,摄像头的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 + public static final int ERR_CAMERA_NOT_AUTHORIZED = -1314; ///< 摄像头设备未授权,通常在移动设备出现,可能是权限被用户拒绝了 + public static final int ERR_MIC_START_FAIL = -1302; ///< 打开麦克风失败,例如在 Windows 或 Mac 设备,麦克风的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 + public static final int ERR_MIC_STOP_FAIL = -1320; ///< 停止麦克风失败 + public static final int ERR_SPEAKER_START_FAIL = -1321; ///< 打开扬声器失败,例如在 Windows 或 Mac 设备,扬声器的配置程序(驱动程序)异常,禁用后重新启用设备,或者重启机器,或者更新配置程序 + public static final int ERR_SPEAKER_STOP_FAIL = -1323; ///< 停止扬声器失败 + public static final int ERR_ROOM_ENTER_FAIL = -3301; ///< 进入房间失败 [例如 token 过期等原因,server 错误码梳理中,待细化] + public static final int ERR_ROOM_ID_INVALID = -3318; ///< 进房参数 roomId 错误 + public static final int ERR_SDK_APPID_INVALID = -3317; ///< 进房参数 sdkAppId 错误 + public static final int ERR_PLAY_LIVE_STREAM_NET_DISCONNECT = -2301; ///< 直播,网络断连,且经多次重连抢救无效,可以放弃治疗,更多重试请自行重启播放 + private final static String TAG = TRTCEngineAdapter.class.getSimpleName(); + private static final int MAX_USER_VOLUME_CONUT = 10; + private static TRTCEngineAdapter sInstance = null; + private final int MAX_SEND_STREAM_CNT = 5; + private IRTCEngineHandler TRTCEngineAdapterListener; + private TRTCCloud trtcCloud; + private TRTCCloudDef.TRTCParams mTRTCParams; + private TXLivePlayer mLivePlayer; + private boolean bDefaultMuteAllRemoteVideoStreams = false; + private boolean bDefaultMuteAllRemoteAudioStreams = false; + private long joinRoomTime = 0; + private HashMap userVoiceVolumeSum = new HashMap(); + private int userVoiceVolumeCnt = 0; + private IRtcEngineEventHandler.RtcStats lastStats = new IRtcEngineEventHandler.RtcStats(); + private int TRTCAppId; + private Map remoteVideoAvaibleCnt = new HashMap(); + private Map remoteAudioAvaibleCnt = new HashMap(); + private int onUserVideoAvailableCnt = 0; + private int lastVideoBitrate = 0; + private int userRole = TRTCRoleAudience; + private ArrayList users = new ArrayList<>(); + private String sUid; //用来记录自己的UID; + private boolean setLiveTransCodingFlag = false; + private LiveTranscoding currentTranscodingConfig = new LiveTranscoding(); + private final TRTCCloudListener TRTCEventHandler = new TRTCCloudListener() { + @Override + public void onWarning(int warningCode, String warningMsg, Bundle extraInfo) { + TRTCEngineAdapterListener.onWarning(warningCode); + } + + @Override + public void onError(int errCode, String errMsg, Bundle extraInfo) { + LogUtils.d(TAG, " errCode:" + errCode + " errMsg:" + errMsg); + int tmpErrCode; + switch (errCode) { + case ERR_NULL: + tmpErrCode = ERR_OK; + break; + case ERR_ROOM_ENTER_FAIL: + tmpErrCode = ERR_JOIN_CHANNEL_REJECTED; + break; + case ERR_SDK_APPID_INVALID: + tmpErrCode = ERR_INVALID_APP_ID; + break; + case ERR_ROOM_ID_INVALID: + tmpErrCode = ERR_INVALID_CHANNEL_NAME; + break; + case ERR_MIC_START_FAIL: + case ERR_SPEAKER_START_FAIL: + tmpErrCode = ERR_CONNECTION_INTERRUPTED; + break; + case ERR_CAMERA_START_FAIL: + tmpErrCode = ERR_VDM_CAMERA_NOT_AUTHORIZED; + break; + case ERR_PLAY_LIVE_STREAM_NET_DISCONNECT: + tmpErrCode = ERR_CONNECTION_INTERRUPTED; + break; + case ERR_MIC_STOP_FAIL: + case ERR_SPEAKER_STOP_FAIL: + tmpErrCode = ERR_ADM_STOP_PLAYOUT; + break; + case ERR_CAMERA_NOT_AUTHORIZED: + tmpErrCode = ERR_VDM_CAMERA_NOT_AUTHORIZED; + break; + default: + tmpErrCode = ERR_FAILED; + break; + } + TRTCEngineAdapterListener.onError(tmpErrCode); + } + + @Override + public void onUserVideoAvailable(final String uid, final boolean available) { + LogUtils.d(TAG, " uid:" + uid + " available:" + available); + try { + Integer cnt = remoteVideoAvaibleCnt.get(uid); + if (cnt == null) { + cnt = 0; + } + cnt++; + remoteVideoAvaibleCnt.remove(uid); + remoteVideoAvaibleCnt.put(uid, cnt); + if (cnt == 1) { + TRTCEngineAdapterListener.onFirstRemoteVideoDecoded(Integer.parseInt(uid), 0, 0, 0); + TRTCEngineAdapterListener.onRemoteVideoStateChanged(Integer.parseInt(uid), REMOTE_VIDEO_STATE_STARTING, REMOTE_VIDEO_STATE_REASON_REMOTE_UNMUTED, 0); + } else { + TRTCEngineAdapterListener.onRemoteVideoStateChanged(Integer.parseInt(uid), REMOTE_VIDEO_STATE_STOPPED, REMOTE_VIDEO_STATE_REASON_REMOTE_MUTED, 0); + TRTCEngineAdapterListener.onUserMuteVideo(Integer.parseInt(uid), !available); + } + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + uid); + return; + } + } + + @Override + public void onFirstVideoFrame(String userId, int streamType, int width, int height) { + LogUtils.d(TAG, " uid:" + userId + " streamType:" + streamType + " width:" + width + " height:" + height); + int elapsed = (int) (System.currentTimeMillis() - joinRoomTime); + try { + if (userId != null) { + TRTCEngineAdapterListener.onFirstRemoteVideoFrame(Integer.parseInt(userId), width, height, elapsed); + TRTCEngineAdapterListener.onRemoteVideoStateChanged(Integer.parseInt(userId), REMOTE_VIDEO_STATE_STARTING, REMOTE_VIDEO_STATE_REASON_INTERNAL, elapsed); + } else { + TRTCEngineAdapterListener.onFirstLocalVideoFrame(width, height, elapsed); + } + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + } + + @Override + public void onFirstAudioFrame(String userId) { + LogUtils.d(TAG, " uid:" + userId); + int elapsed = (int) (System.currentTimeMillis() - joinRoomTime); + try { + if (userId != null) { + TRTCEngineAdapterListener.onFirstRemoteAudioFrame(Integer.parseInt(userId), elapsed); + } + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + } + + @Override + public void onRemoteUserEnterRoom(String userId) { + LogUtils.d(TAG, " uid:" + userId); + int elapsed = (int) (System.currentTimeMillis() - joinRoomTime); + try { + users.add(userId); + TRTCEngineAdapterListener.onUserJoined(Integer.parseInt(userId), elapsed); + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + if (setLiveTransCodingFlag) { + sInstance.setLiveTranscoding(currentTranscodingConfig); + } + } + + @Override + public void onRemoteUserLeaveRoom(String userId, int reason) { + LogUtils.d(TAG, " uid:" + userId + " reason:" + reason); + try { + TRTCEngineAdapterListener.onUserOffline(Integer.parseInt(userId), reason); + users.remove(userId); + remoteVideoAvaibleCnt.remove(userId); + remoteAudioAvaibleCnt.remove(userId); + if (setLiveTransCodingFlag) { + sInstance.setLiveTranscoding(currentTranscodingConfig); + } + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + } + + @Override + public void onEnterRoom(long elapsed) { + LogUtils.d(TAG, " elapsed:" + elapsed); + joinRoomTime = System.currentTimeMillis(); + try { + String channelName = ""; + if (0xFFFFFFFF == mTRTCParams.roomId && !TextUtils.isEmpty(mTRTCParams.businessInfo)) { + JSONObject channel = null; + try { + channel = new JSONObject(mTRTCParams.businessInfo); + channelName = channel.getString("strGroupId"); + } catch (JSONException e) { + LogUtils.d(TAG, "onEnterRoom parse json error: " + mTRTCParams.businessInfo); + e.printStackTrace(); + } + } + if (TextUtils.isEmpty(channelName)) { + channelName = String.valueOf(mTRTCParams.roomId); + } + TRTCEngineAdapterListener.onJoinChannelSuccess(channelName, Integer.parseInt(mTRTCParams.userId), (int) elapsed); + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + mTRTCParams.userId); + return; + } + } + + @Override + public void onExitRoom(int reason) { + LogUtils.d(TAG, " reason:" + reason); + TRTCEngineAdapterListener.onLeaveChannel(lastStats); + } + + @Override + public void onSwitchRole(int errCode, String errMsg) { + LogUtils.d(TAG, "errCode=" + errCode + " errMsg=" + errMsg); + TRTCEngineAdapterListener.onClientRoleChanged( + userRole == TRTCRoleAnchor ? CLIENT_ROLE_AUDIENCE : CLIENT_ROLE_BROADCASTER, + userRole == TRTCRoleAnchor ? CLIENT_ROLE_BROADCASTER : CLIENT_ROLE_AUDIENCE); + } + + @Override + public void onUserVoiceVolume(ArrayList userVolumes, int totalVolume) { + int userCount = userVolumes.size(); + int validUserConut = 0; + if (userCount > 0) { + IRtcEngineEventHandler.AudioVolumeInfo[] speakers = new IRtcEngineEventHandler.AudioVolumeInfo[userCount]; + for (int i = 0; i < userCount; i++) { + String userId = userVolumes.get(i).userId; + if (!TextUtils.isEmpty(userId)) { + validUserConut++; + speakers[i] = new IRtcEngineEventHandler.AudioVolumeInfo(); + speakers[i].uid = Integer.valueOf(userId); + speakers[i].volume = userVolumes.get(i).volume; + Integer tmpUid = speakers[i].uid; + Integer tmpVolume = speakers[i].volume; + if (userVoiceVolumeSum.containsKey(tmpUid)) { + Integer tmpVolumeSum = userVoiceVolumeSum.get(tmpUid); + Integer tmpCurVolumeSum = tmpVolumeSum + tmpVolume; + userVoiceVolumeSum.put(tmpUid, tmpCurVolumeSum); + } else { + userVoiceVolumeSum.put(tmpUid, tmpVolume); + } + } + } + if (validUserConut > 0) { + TRTCEngineAdapterListener.onAudioVolumeIndication(speakers, totalVolume); + } + + userVoiceVolumeCnt++; + if (userVoiceVolumeCnt >= MAX_USER_VOLUME_CONUT) { + Integer firstVolumeSum = 0; + Integer firstVolumeUid = 0; + Integer secondVolumeSum = 0; + for (Map.Entry entry : userVoiceVolumeSum.entrySet()) { + if (entry.getValue() > firstVolumeSum) { + firstVolumeSum = entry.getValue(); + firstVolumeUid = entry.getKey(); + } + } + for (Map.Entry entry : userVoiceVolumeSum.entrySet()) { + if (entry.getKey() != firstVolumeUid && entry.getValue() > secondVolumeSum) { + secondVolumeSum = entry.getValue(); + } + } + if (firstVolumeSum > secondVolumeSum * 2) { + TRTCEngineAdapterListener.onActiveSpeaker(firstVolumeUid); + userVoiceVolumeCnt = 0; + userVoiceVolumeSum.clear(); + } + } + } + } + + @Override + public void onUserAudioAvailable(String userId, boolean available) { + LogUtils.d(TAG, " userId:" + userId + " available:" + available); + try { + Integer cnt = remoteVideoAvaibleCnt.get(userId); + if (cnt == null) { + cnt = 0; + } + cnt++; + remoteVideoAvaibleCnt.remove(userId); + remoteVideoAvaibleCnt.put(userId, cnt); + if (cnt == 1) { + int elapsed = (int) (System.currentTimeMillis() - joinRoomTime); + TRTCEngineAdapterListener.onFirstRemoteAudioDecoded(Integer.parseInt(userId), elapsed); + } else { + TRTCEngineAdapterListener.onUserMuteAudio(Integer.parseInt(userId), available); + } + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + } + + + @Override + public void onCameraDidReady() { + TRTCEngineAdapterListener.onCameraReady(); + } + + + public void onApiCallExecuted(int error, String api, String result) { + LogUtils.d(TAG, " error:" + error + "api:" + api + " result:" + result); + TRTCEngineAdapterListener.onApiCallExecuted(error, api, result); + } + + @Override + public void onNetworkQuality(TRTCCloudDef.TRTCQuality localQuality, ArrayList remoteQuality) { +// LogUtils.d(TAG, " userId:" + localQuality.userId + " localQuality " + localQuality.quality); + for (TRTCCloudDef.TRTCQuality qualityInfo : remoteQuality) { + try { + TRTCEngineAdapterListener.onNetworkQuality(Integer.parseInt(qualityInfo.userId), localQuality.quality, qualityInfo.quality); + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + qualityInfo.userId); + return; + } + } + } + + @Override + public void onStatistics(TRTCStatistics statics) { + int totalLocalAudioBitrate = 0; + int totalRemoteAudioBitrate = 0; + int totalLocalVideoBitrate = 0; + int totalRemoteVideoBitrate = 0; + int localsize = statics.localArray.size(); + int remotesize = statics.remoteArray.size(); + + IRtcEngineEventHandler.RtcStats stats = new IRtcEngineEventHandler.RtcStats(); + IRtcEngineEventHandler.LocalVideoStats localVideoStats = new IRtcEngineEventHandler.LocalVideoStats(); + IRtcEngineEventHandler.RemoteVideoStats remoteVideoStats = new IRtcEngineEventHandler.RemoteVideoStats(); + + for (int i = 0; i < localsize; i++) { + totalLocalAudioBitrate += statics.localArray.get(i).audioBitrate; + totalLocalVideoBitrate += statics.localArray.get(i).videoBitrate; + } + for (int i = 0; i < remotesize; i++) { + totalRemoteAudioBitrate += statics.remoteArray.get(i).audioBitrate; + totalRemoteVideoBitrate += statics.remoteArray.get(i).videoBitrate; + } + + stats.cpuAppUsage = statics.appCpu; + stats.cpuTotalUsage = statics.systemCpu; + stats.lastmileDelay = statics.rtt; + stats.rxAudioKBitRate = totalRemoteAudioBitrate; + stats.txAudioKBitRate = totalLocalAudioBitrate; + stats.rxVideoKBitRate = totalRemoteVideoBitrate; + stats.txVideoKBitRate = totalLocalVideoBitrate; + stats.txKBitRate = totalLocalAudioBitrate + totalLocalVideoBitrate; + stats.rxKBitRate = totalRemoteAudioBitrate + totalRemoteVideoBitrate; + stats.rxBytes = (int) statics.receiveBytes; + stats.txBytes = (int) statics.sendBytes; + stats.totalDuration = (int) (System.currentTimeMillis() - joinRoomTime) / 1000; + stats.users = remotesize + 1; + + localVideoStats.encodedFrameWidth = statics.localArray.get(0).width; + localVideoStats.encodedFrameHeight = statics.localArray.get(0).height; + localVideoStats.sentBitrate = totalLocalVideoBitrate; + localVideoStats.sentFrameRate = statics.localArray.get(0).frameRate; + + lastStats = stats; + + TRTCEngineAdapterListener.onRtcStats(stats); + TRTCEngineAdapterListener.onLocalVideoStats(localVideoStats); + try { + for (int i = 0; i < remotesize; i++) { + remoteVideoStats.uid = Integer.parseInt(statics.remoteArray.get(i).userId); + remoteVideoStats.width = statics.remoteArray.get(i).width; + remoteVideoStats.height = statics.remoteArray.get(i).height; + remoteVideoStats.receivedBitrate = statics.remoteArray.get(i).videoBitrate; + remoteVideoStats.rendererOutputFrameRate = statics.remoteArray.get(i).frameRate; + switch (statics.remoteArray.get(i).streamType) { + case TRTC_VIDEO_STREAM_TYPE_BIG: + remoteVideoStats.rxStreamType = VIDEO_STREAM_HIGH; + break; + case TRTC_VIDEO_STREAM_TYPE_SMALL: + remoteVideoStats.rxStreamType = VIDEO_STREAM_LOW; + break; + default: + remoteVideoStats.rxStreamType = VIDEO_STREAM_HIGH; + break; + } + TRTCEngineAdapterListener.onRemoteVideoStats(remoteVideoStats); + // 适配接口 onAudioQuality + TRTCEngineAdapterListener.onAudioQuality(Integer.parseInt(sUid), getNetworkQuality(statics.rtt, statics.downLoss), (short) statics.rtt, (short) statics.downLoss); + } + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:"); + return; + } + } + + private int getNetworkQuality(int rtt, int loss) { + if (loss > 50 || rtt > 500) { + return TRTCCloudDef.TRTC_QUALITY_Vbad; + } else if (loss > 30 || rtt > 350) { + return TRTCCloudDef.TRTC_QUALITY_Bad; + } else if (loss > 20 || rtt > 200) { + return TRTCCloudDef.TRTC_QUALITY_Poor; + } else if (loss > 10 || rtt > 100) { + return TRTCCloudDef.TRTC_QUALITY_Good; + } else if (loss >= 0 || rtt >= 0) { + return TRTCCloudDef.TRTC_QUALITY_Excellent; + } + return TRTCCloudDef.TRTC_QUALITY_UNKNOWN; + } + + @Override + public void onRecvCustomCmdMsg(String userId, int cmdID, int seq, byte[] message) { + LogUtils.d(TAG, " userId:" + userId + " cmdID:" + cmdID + " seq:" + seq); + try { + TRTCEngineAdapterListener.onStreamMessage(Integer.parseInt(userId), cmdID, message); + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + } + + @Override + public void onMissCustomCmdMsg(String userId, int cmdID, int errCode, int missed) { + LogUtils.d(TAG, " userId:" + userId + " cmdID:" + cmdID + " errCode:" + errCode + " missed:" + missed); + try { + TRTCEngineAdapterListener.onStreamMessageError(Integer.parseInt(userId), cmdID, errCode, missed, 0); + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userId); + return; + } + } + + @Override + public void onStartPublishCDNStream(int err, String errMsg) { + LogUtils.d(TAG, " err:" + err + " errMsg:" + errMsg); + TRTCEngineAdapterListener.onStreamPublished("", err); + } + + @Override + public void onAudioRouteChanged(int newRoute, int oldRoute) { + LogUtils.d(TAG, " newRoute:" + newRoute + " oldRoute:" + oldRoute); + int route; + if (newRoute == TRTCCloudDef.TRTC_AUDIO_ROUTE_SPEAKER) { + route = AUDIO_ROUTE_SPEAKERPHONE; + } else if (newRoute == TRTCCloudDef.TRTC_AUDIO_ROUTE_EARPIECE) { + route = AUDIO_ROUTE_EARPIECE; + } else { + route = AUDIO_ROUTE_DEFAULT; + } + TRTCEngineAdapterListener.onAudioRouteChanged(route); + } + + @Override + public void onConnectionLost() { + LogUtils.d(TAG, "TRTC net status:" + new Exception().getStackTrace()[0].getMethodName()); + TRTCEngineAdapterListener.onError(ERR_CONNECTION_LOST); + TRTCEngineAdapterListener.onConnectionInterrupted(); + } + + @Override + public void onTryToReconnect() { + LogUtils.d(TAG, "TRTC net status:" + new Exception().getStackTrace()[0].getMethodName()); + } + + @Override + public void onConnectionRecovery() { + LogUtils.d(TAG, "TRTC net status:" + new Exception().getStackTrace()[0].getMethodName()); + } + //以后几个回调函数为TRTC独有 + + /** + public void onUserSubStreamAvailable(String userId, boolean available){ + TRTCEngineAdapterListener.onUserSubStreamAvailable(Integer.parseInt(userId),available); + } + + public void onSpeedTest(TRTCCloudDef.TRTCSpeedTestResult currentResult, int finishedCount, int totalCount){ + TRTCEngineAdapterListener.onSpeedTest(currentResult,finishedCount,totalCount); + } + + public void onRecvSEIMsg(String userId, byte [] data){ + TRTCEngineAdapterListener.onRecvSEIMsg(Integer.parseInt(userId),data); + } + + public void onSetMixTranscodingConfig(int err, String errMsg){ + TRTCEngineAdapterListener.onSetMixTranscodingConfig(err,errMsg); + } + **/ + + @Override + public void onConnectOtherRoom(final String userID, final int err, final String errMsg) { + LogUtils.d(TAG, " userID:" + userID + " err:" + err + " errMsg:" + errMsg); + try { + TRTCEngineAdapterListener.onConnectOtherRoom(Integer.parseInt(userID), err, errMsg); + } catch (NumberFormatException e) { + LogUtils.d(TAG, "uid is not Integer type uid:" + userID); + return; + } + } + + @Override + public void onDisConnectOtherRoom(final int err, final String errMsg) { + LogUtils.d(TAG, " err:" + err + " errMsg:" + errMsg); + TRTCEngineAdapterListener.onDisConnectOtherRoom(err, errMsg); + } + + @Override + public void onAudioEffectFinished(int effectId, int code) { + // TRTCEngineAdapterListener.onAudioEffectFinished(effectId); + } + }; + private TRTCEffectManager sTRTCEffectManager; + private int mBGMId; + private int mMusicPlayoutVolume = 100; + private int mMusicPublishVolume = 100; + private boolean dataStreamReliable = false; + private boolean dataStreamOrdered = false; + private Map remoteVideoMap = new HashMap(); + private TXCloudVideoView localVideoView = null; + private boolean isStartPreview = false; + private int bgmProcess = 0; + private int bgmDuration = 0; + private String mBgmFilePath = ""; + private boolean bgmisLoop = false; + private int curBgmcycle = 0; + private int totalBgmcycle = 0; + + private boolean pushmode = false; + private int externalAudioSampleRate = 0; + private int externalAudioChannels = 0; + private boolean bSetExternalAudioSource = false; + private boolean speakerphoneEnableFlag = true; + private boolean enableAudioFlag = true; + private boolean enableVideoFlag = true; + private int curSendStreamCnt = 0; + private long lastSecondSendStreamTime = 0; + private long sendStreamSizeInSecond = 0; + private int appScene = TRTC_APP_SCENE_VIDEOCALL; + private int localVideoRenderBufferType; + private Map remoteVideoRenderBufferTypes = new HashMap(); + private boolean enableExternalVideo = false; + private boolean externalVideoUseTexture = false; + private VideoEncoderConfiguration videoEncoderConfiguration = new VideoEncoderConfiguration(); + private boolean bBigVideoParamSet = false; + private boolean bShouldSetSmallVideo = false; + private boolean bEnableDualMode = false; + private boolean mUseFontCamera = true; + + public TRTCEngineAdapter(Context context, String appId, IRTCEngineHandler listener) { + trtcCloud = TRTCCloud.sharedInstance(context); + mLivePlayer = new TXLivePlayer(context); + TRTCEngineAdapterListener = listener; + trtcCloud.setListener(TRTCEventHandler); + sTRTCEffectManager = new TRTCEffectManager(trtcCloud); + sTRTCEffectManager.setMusicObserver(new TXAudioEffectManager.TXMusicPlayObserver() { + @Override + public void onStart(int id, int errCode) { + } + + @Override + public void onPlayProgress(int id, long curPtsMS, long durationMS) { + } + + @Override + public void onComplete(int id, int errCode) { + TRTCEngineAdapterListener.onAudioEffectFinished(id); + } + }); + TRTCAppId = Integer.parseInt(appId); + } + + public static TRTCEngineAdapter create(Context context, String appId, IRTCEngineHandler listener) { + LogUtils.d(TAG, " appId:" + appId); + if (sInstance == null) { + sInstance = new TRTCEngineAdapter(context, appId, listener); + } + return sInstance; + } + + public static void destroy() { + if (sInstance != null) { + sInstance.unInit(); + } + sInstance = null; + } + + public static SurfaceView CreateRendererView(Context context) { + return new SurfaceView(context); + } + + public static String getSDKVersion() { + return TRTCCloud.getSDKVersion(); + } + +// public static String getErrorDescription(int errorCode) { +// String errorInfo = "no error"; +// switch (errorCode) { +// case TXLiteAVCode.ERR_NULL: +// errorInfo = "no error"; +// break; +// case TXLiteAVCode.ERR_ROOM_ENTER_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_01); +// break; +// case TXLiteAVCode.ERR_ENTER_ROOM_PARAM_NULL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_02); +// break; +// case TXLiteAVCode.ERR_SDK_APPID_INVALID: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_03); +// break; +// case TXLiteAVCode.ERR_ROOM_ID_INVALID: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_04); +// break; +// case TXLiteAVCode.ERR_USER_ID_INVALID: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_05); +// break; +// case TXLiteAVCode.ERR_USER_SIG_INVALID: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_06); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_ENTER_ROOM_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_07); +// break; +// case TXLiteAVCode.ERR_SERVER_INFO_SERVICE_SUSPENDED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_08); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_QUIT_ROOM_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_09); +// break; +// case TXLiteAVCode.ERR_CAMERA_START_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_010); +// break; +// case TXLiteAVCode.ERR_CAMERA_NOT_AUTHORIZED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_011); +// break; +// case TXLiteAVCode.ERR_CAMERA_SET_PARAM_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_012); +// break; +// case TXLiteAVCode.ERR_CAMERA_OCCUPY: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_013); +// break; +// case TXLiteAVCode.ERR_MIC_START_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_014); +// break; +// case TXLiteAVCode.ERR_MIC_NOT_AUTHORIZED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_015); +// break; +// case TXLiteAVCode.ERR_MIC_SET_PARAM_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_016); +// break; +// case TXLiteAVCode.ERR_MIC_OCCUPY: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_017); +// break; +// case TXLiteAVCode.ERR_MIC_STOP_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_018); +// break; +// case TXLiteAVCode.ERR_SPEAKER_START_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_019); +// break; +// case TXLiteAVCode.ERR_SPEAKER_SET_PARAM_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_020); +// break; +// case TXLiteAVCode.ERR_SPEAKER_STOP_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_021); +// break; +// case TXLiteAVCode.ERR_SCREEN_CAPTURE_START_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_022); +// break; +// case TXLiteAVCode.ERR_SCREEN_CAPTURE_UNSURPORT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_023); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_NO_PRIVILEDGE_PUSH_SUB_VIDEO: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_024); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_ANOTHER_USER_PUSH_SUB_VIDEO: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_025); +// break; +// case TXLiteAVCode.ERR_VIDEO_ENCODE_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_026); +// break; +// case TXLiteAVCode.ERR_UNSUPPORTED_RESOLUTION: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_027); +// break; +// case TXLiteAVCode.ERR_AUDIO_ENCODE_FAIL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_028); +// break; +// case TXLiteAVCode.ERR_UNSUPPORTED_SAMPLERATE: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_029); +// break; +// case TXLiteAVCode.ERR_PIXEL_FORMAT_UNSUPPORTED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_030); +// break; +// case TXLiteAVCode.ERR_BUFFER_TYPE_UNSUPPORTED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_031); +// break; +// case TXLiteAVCode.ERR_PUBLISH_CDN_STREAM_REQUEST_TIME_OUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_032); +// break; +// case TXLiteAVCode.ERR_CLOUD_MIX_TRANSCODING_REQUEST_TIME_OUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_033); +// break; +// case TXLiteAVCode.ERR_PUBLISH_CDN_STREAM_SERVER_FAILED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_034); +// break; +// case TXLiteAVCode.ERR_CLOUD_MIX_TRANSCODING_SERVER_FAILED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_035); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_START_PUBLISHING_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_036); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_START_PUBLISHING_ERROR: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_037); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_STOP_PUBLISHING_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_038); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_STOP_PUBLISHING_ERROR: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_039); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_CONN_ROOM_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_040); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_DISCONN_ROOM_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_041); +// break; +// case TXLiteAVCode.ERR_ROOM_REQUEST_CONN_ROOM_INVALID_PARAM: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_042); +// break; +// case TXLiteAVCode.ERR_CONNECT_OTHER_ROOM_AS_AUDIENCE: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_043); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_NOT_SUPPORT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_044); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_NUM: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_045); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_REACH_MAX_RETRY_TIMES: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_046); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_REQ_TIMEOUT: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_047); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_REQ: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_048); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_NO_SIG: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_049); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_DECRYPT_SIG: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_050); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_NO_KEY: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_051); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_PARSE_SIG: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_052); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_INVALID_SIG_TIME: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_053); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_SIG_GROUPID: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_054); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_NOT_CONNED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_055); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_USER_NOT_CONNED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_056); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_FAILED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_057); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_CANCEL_FAILED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_058); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_CONNED_ROOM_NOT_EXIST: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_059); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_CONNED_REACH_MAX_ROOM: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_060); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_NOT_EXIST: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_061); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_DELETED: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_062); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_CONNED_USER_FULL: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_063); +// break; +// case TXLiteAVCode.ERR_SERVER_CENTER_CONN_ROOM_INVALID_SEQ: +// errorInfo = ResUtil.getString(R.string.manager_trtc_trtcengineadapter_064); +// break; +// } +// return errorInfo; +// } + + public void unInit() { + if (mLivePlayer != null) { + mLivePlayer.stopPlay(true); + mLivePlayer.setPlayerView(null); + } + sTRTCEffectManager.destroy(); + trtcCloud.setListener(null); + TRTCCloud.destroySharedInstance(); + sTRTCEffectManager = null; + } + + @Override + public int setChannelProfile(int profile) { + if (profile == CHANNEL_PROFILE_COMMUNICATION) { + appScene = TRTC_APP_SCENE_VIDEOCALL; + } else if (profile == CHANNEL_PROFILE_LIVE_BROADCASTING) { + appScene = TRTC_APP_SCENE_LIVE; + } + return 0; + } + + @Override + public int setClientRole(int role) { + if (role == CLIENT_ROLE_BROADCASTER) { + userRole = TRTCRoleAnchor; + if (!TRtcEngineManager.get().isMute) { + trtcCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_MUSIC); + } + } else if (role == CLIENT_ROLE_AUDIENCE) { + userRole = TRTCRoleAudience; + trtcCloud.stopLocalAudio(); + } + trtcCloud.switchRole(userRole); + return 0; + } + + @Override + public int joinChannel(String token, String channelName, String optionalInfo, int uid) { + mTRTCParams = new TRTCCloudDef.TRTCParams(); + mTRTCParams.userSig = token; + mTRTCParams.userId = String.valueOf(uid); + mTRTCParams.sdkAppId = TRTCAppId; + mTRTCParams.role = userRole; + //由于新注册的云信的roomId超过了Integer.MAX_VALUE,所以超过的使用我们自己的的房间uid当做trtc的roomId + mTRTCParams.roomId = RoomIdHelper.getRoomId(channelName, (int) AvRoomDataManager.get().getRoomUid()); + sUid = String.valueOf(uid); + users.add(sUid); + trtcCloud.enterRoom(mTRTCParams, appScene); + return 0; + } + + @Override + public int switchChannel(String token, String channelName) { + String user = sUid; + leaveChannel(); + joinChannel(token, channelName, null, Integer.valueOf(user)); + return 0; + } + + @Override + public int leaveChannel() { + trtcCloud.exitRoom(); + sUid = ""; + speakerphoneEnableFlag = true; + dataStreamReliable = false; + dataStreamOrdered = false; + remoteVideoMap.clear(); + localVideoView = null; + bgmProcess = 0; + bgmDuration = 0; + pushmode = false; + curSendStreamCnt = 0; + userVoiceVolumeSum.clear(); + userVoiceVolumeCnt = 0; + enableAudioFlag = true; + enableVideoFlag = true; + lastSecondSendStreamTime = 0; + sendStreamSizeInSecond = 0; + enableExternalVideo = false; + onUserVideoAvailableCnt = 0; + externalVideoUseTexture = false; + remoteVideoAvaibleCnt.clear(); + users.clear(); + setLiveTransCodingFlag = false; + isStartPreview = false; + bSetExternalAudioSource = false; + bDefaultMuteAllRemoteVideoStreams = false; + bDefaultMuteAllRemoteAudioStreams = false; + bBigVideoParamSet = false; + bShouldSetSmallVideo = false; + bEnableDualMode = false; + return 0; + } + + @Override + public int enableWebSdkInteroperability(boolean enabled) { + return 0; + } + + @Override + public int enableAudio() { + enableAudioFlag = true; + return 0; + } + + @Override + public int disableAudio() { + enableAudioFlag = false; + return 0; + } + + @Override + public int enableLocalAudio(boolean enabled) { + if (!enableAudioFlag) { + return -1; + } + if (enabled) { + trtcCloud.getDeviceManager().setSystemVolumeType(TXDeviceManager.TXSystemVolumeType.TXSystemVolumeTypeMedia); + trtcCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_MUSIC); + } else { + trtcCloud.stopLocalAudio(); + } + return 0; + } + + @Override + public int adjustRecordingSignalVolume(int volume) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.getAudioEffectManager().setVoiceCaptureVolume(volume); + return 0; + } + + @Override + public int adjustPlaybackSignalVolume(int volume) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setAudioProfile(int profile, int scenario) { + if (!enableAudioFlag) { + return -1; + } + switch (profile) { + case 1: + trtcCloud.setAudioQuality(TRTCCloudDef.TRTC_AUDIO_QUALITY_SPEECH); + break; + case 2: + trtcCloud.setAudioQuality(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT); + break; + case 3: + case 4: + trtcCloud.setAudioQuality(TRTCCloudDef.TRTC_AUDIO_QUALITY_MUSIC); + break; + } + return 0; + } + + @Override + public int setHighQualityAudioParameters(boolean fullband, boolean stereo, boolean fullBitrate) { + return 0; + } + + @Override + public int enableAudioVolumeIndication(int interval, int smooth, boolean report_vad) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.enableAudioVolumeEvaluation(interval); + return 0; + } + + @Override + public int muteLocalAudioStream(boolean muted) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.muteLocalAudio(muted); + return 0; + } + + @Override + public int muteRemoteAudioStream(int uid, boolean muted) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.muteRemoteAudio(String.valueOf(uid), muted); + return 0; + } + + @Override + public int muteAllRemoteAudioStreams(boolean muted) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.muteAllRemoteAudio(muted); + return 0; + } + + @Override + public int setDefaultMuteAllRemoteAudioStreams(boolean muted) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setDefaultAudioRoutetoSpeakerphone(boolean defaultToSpeaker) { + if (!enableAudioFlag) { + return -1; + } + if (defaultToSpeaker) { + trtcCloud.setAudioRoute(TRTCCloudDef.TRTC_AUDIO_ROUTE_SPEAKER); + } else { + trtcCloud.setAudioRoute(TRTCCloudDef.TRTC_AUDIO_ROUTE_EARPIECE); + } + speakerphoneEnableFlag = defaultToSpeaker; + return 0; + } + + @Override + public int setEnableSpeakerphone(boolean enabled) { + if (!enableAudioFlag) { + return -1; + } + if (enabled) { + trtcCloud.setAudioRoute(TRTCCloudDef.TRTC_AUDIO_ROUTE_SPEAKER); + } else { + trtcCloud.setAudioRoute(TRTCCloudDef.TRTC_AUDIO_ROUTE_EARPIECE); + } + speakerphoneEnableFlag = enabled; + return 0; + } + + @Override + public boolean isSpeakerphoneEnabled() { + return speakerphoneEnableFlag; + } + + @Override + public int enableInEarMonitoring(boolean enabled) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.getAudioEffectManager().enableVoiceEarMonitor(enabled); + return 0; + } + + @Override + public int setInEarMonitoringVolume(int volume) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.getAudioEffectManager().setVoiceEarMonitorVolume(volume); + return 0; + } + + @Override + public int setLocalVoicePitch(double pitch) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setLocalVoiceEqualization(int bandFrequency, int bandGain) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setLocalVoiceReverb(int reverbKey, int value) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + + @Override + public int enableSoundPositionIndication(boolean enabled) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setRemoteVoicePosition(int uid, double pan, double gain) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int startAudioMixing(String filePath, boolean loopback, boolean replace, int cycle) { + if (!enableAudioFlag) { + return -1; + } + mBgmFilePath = filePath; + if (cycle == -1 || cycle == 0) { + bgmisLoop = true; + } else { + bgmisLoop = false; + } + curBgmcycle = 1; + totalBgmcycle = cycle; + sTRTCEffectManager.stopEffect(mBGMId); + mBGMId++; + sTRTCEffectManager.playEffect(mBGMId, filePath, 0, 0, 0, 0, true); + return 0; + } + + @Override + public int stopAudioMixing() { + if (!enableAudioFlag) { + return -1; + } + bgmProcess = 0; + bgmDuration = 0; + mBgmFilePath = ""; + bgmisLoop = false; + totalBgmcycle = 0; + sTRTCEffectManager.stopEffect(mBGMId); + return 0; + } + + @Override + public int pauseAudioMixing() { + if (!enableAudioFlag) { + return -1; + } + sTRTCEffectManager.pauseEffect(mBGMId); + return 0; + } + + @Override + public int resumeAudioMixing() { + if (!enableAudioFlag) { + return -1; + } + sTRTCEffectManager.resumeEffect(mBGMId); + return 0; + } + + @Override + public int adjustAudioMixingVolume(int volume) { + if (!enableAudioFlag) { + return -1; + } + sTRTCEffectManager.setEffectsVolume(volume); + return 0; + } + + @Override + public int adjustAudioMixingPlayoutVolume(int volume) { + if (!enableAudioFlag) { + return -1; + } + sTRTCEffectManager.setVolumeOfEffect(mBGMId, volume); + mMusicPlayoutVolume = volume; + return 0; + } + + @Override + public int adjustAudioMixingPublishVolume(int volume) { + if (!enableAudioFlag) { + return -1; + } + sTRTCEffectManager.setVolumeOfEffect(mBGMId, volume); + mMusicPublishVolume = volume; + return 0; + } + + @Override + public int getAudioMixingPlayoutVolume() { + if (!enableAudioFlag) { + return -1; + } + return mMusicPlayoutVolume; + } + + @Override + public int getAudioMixingPublishVolume() { + if (!enableAudioFlag) { + return -1; + } + return mMusicPublishVolume; + } + + @Override + public int getAudioMixingDuration() { + if (!enableAudioFlag) { + return -1; + } + return (int) trtcCloud.getAudioEffectManager().getMusicDurationInMS(mBgmFilePath); + } + + @Override + public int getAudioMixingCurrentPosition() { + if (!enableAudioFlag) { + return -1; + } + return (int) trtcCloud.getAudioEffectManager().getMusicCurrentPosInMS(mBGMId); + } + + @Override + public int setAudioMixingPosition(int pos) { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.getAudioEffectManager().seekMusicToPosInMS(mBGMId, pos); + return 0; + } + + @Override + public IAudioEffectManager getAudioEffectManager() { + return sTRTCEffectManager; + } + + @Override + public int startAudioRecording(String filePath, int quality) { + if (!enableAudioFlag) { + return -1; + } + TRTCCloudDef.TRTCAudioRecordingParams audioRecordingParams = new TRTCCloudDef.TRTCAudioRecordingParams(); + audioRecordingParams.filePath = filePath; + trtcCloud.startAudioRecording(audioRecordingParams); + return 0; + } + + @Override + public int startAudioRecording(String filePath, int sampleRate, int quality) { + startAudioRecording(filePath, quality); + return 0; + } + + @Override + public int stopAudioRecording() { + if (!enableAudioFlag) { + return -1; + } + trtcCloud.stopAudioRecording(); + return 0; + } + + @Override + public int enableVideo() { + enableVideoFlag = true; + return 0; + } + + @Override + public int disableVideo() { + enableVideoFlag = false; + return 0; + } + + @Override + public int setVideoProfile(int profile, boolean swapWidthAndHeight) { + return 0; + } + + @Override + public int setVideoQualityParameters(boolean preferFrameRateOverImageQuality) { + LogUtils.d(TAG, " preferFrameRateOverImageQuality:" + preferFrameRateOverImageQuality); + if (!enableVideoFlag) { + return -1; + } + TRTCCloudDef.TRTCNetworkQosParam param = new TRTCCloudDef.TRTCNetworkQosParam(); + if (preferFrameRateOverImageQuality) { + param.preference = TRTC_VIDEO_QOS_PREFERENCE_SMOOTH; + } else { + param.preference = TRTC_VIDEO_QOS_PREFERENCE_CLEAR; + } + param.controlMode = VIDEO_QOS_CONTROL_SERVER; + trtcCloud.setNetworkQosParam(param); + return 0; + } + + @Override + public int setVideoProfile(int width, int height, int frameRate, int bitrate) { + LogUtils.d(TAG, " width:" + width + " height:" + height + " frameRate:" + frameRate + " bitrate:" + bitrate); + if (!enableVideoFlag) { + return -1; + } + JSONObject jsonFuncParam = new JSONObject(); + JSONObject jsonParam = new JSONObject(); + + try { + jsonParam.put("videoWidth", width); + jsonParam.put("videoHeight", height); + jsonParam.put("videoFps", frameRate); + jsonParam.put("videoBitrate", bitrate); + jsonParam.put("streamType", 0); + + jsonFuncParam.put("api", "setVideoEncodeParamEx"); + jsonFuncParam.put("params", jsonParam); + + } catch (JSONException e) { + LogUtils.d(TAG, "setVideoProfile err :JSONException"); + return -1; + } + videoEncoderConfiguration.orientationMode = ORIENTATION_MODE_ADAPTIVE; + videoEncoderConfiguration.dimensions.width = width; + videoEncoderConfiguration.dimensions.height = height; + videoEncoderConfiguration.frameRate = frameRate; + videoEncoderConfiguration.bitrate = bitrate; + trtcCloud.callExperimentalAPI(jsonFuncParam.toString()); + bBigVideoParamSet = true; + return 0; + } + + @Override + public int setVideoEncoderConfiguration(VideoEncoderConfiguration config) { + LogUtils.d(TAG, " config:" + config + " width:" + config.dimensions.width + " height:" + config.dimensions.height + + " fps:" + config.frameRate + " bitrate:" + config.bitrate + " orientationMode:" + config.orientationMode); + if (!enableVideoFlag) { + return -1; + } + int adjustWidth = config.dimensions.width; + int adjustHeight = config.dimensions.height; + TRTCCloudDef.TRTCVideoEncParam param = new TRTCCloudDef.TRTCVideoEncParam(); + param.videoBitrate = config.bitrate; + param.videoFps = config.frameRate; + switch (config.orientationMode) { + case ORIENTATION_MODE_ADAPTIVE: + break; + case ORIENTATION_MODE_FIXED_LANDSCAPE: + param.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; + break; + case ORIENTATION_MODE_FIXED_PORTRAIT: + param.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT; + break; + default: + break; + } + JSONObject jsonFuncParam = new JSONObject(); + JSONObject jsonParam = new JSONObject(); + int tmpBitrate = config.bitrate; + if (0 == tmpBitrate) { + tmpBitrate = lastVideoBitrate; + } + if (0 != tmpBitrate) { + lastVideoBitrate = tmpBitrate; + } + + if (config.orientationMode == ORIENTATION_MODE_FIXED_PORTRAIT) { + if (config.dimensions.width > config.dimensions.height) { + adjustWidth = config.dimensions.height; + adjustHeight = config.dimensions.width; + } + } + if (config.orientationMode == ORIENTATION_MODE_FIXED_LANDSCAPE) { + if (config.dimensions.width < config.dimensions.height) { + adjustWidth = config.dimensions.height; + adjustHeight = config.dimensions.width; + } + } + try { + jsonParam.put("videoWidth", adjustWidth); + jsonParam.put("videoHeight", adjustHeight); + jsonParam.put("videoFps", config.frameRate); + jsonParam.put("videoBitrate", tmpBitrate); + jsonParam.put("streamType", 0); + + jsonFuncParam.put("api", "setVideoEncodeParamEx"); + jsonFuncParam.put("params", jsonParam); + + } catch (JSONException e) { + LogUtils.d(TAG, "setVideoEncoderConfiguration err :JSONException"); + return -1; + } + videoEncoderConfiguration.orientationMode = config.orientationMode; + videoEncoderConfiguration.dimensions.width = adjustWidth; + videoEncoderConfiguration.dimensions.height = adjustHeight; + videoEncoderConfiguration.frameRate = config.frameRate; + videoEncoderConfiguration.bitrate = config.bitrate; + trtcCloud.callExperimentalAPI(jsonFuncParam.toString()); + bBigVideoParamSet = true; + if (bShouldSetSmallVideo) { + enableDualStreamMode(bEnableDualMode); + } + + return 0; + } + + @Override + public int setCameraCapturerConfiguration(CameraCapturerConfiguration config) { + mUseFontCamera = (config.cameraDirection == CAMERA_FRONT); + return 0; + } + + @Override + public int setupLocalVideo(VideoCanvas local) { + LogUtils.d(TAG, " local:" + local); + if (!enableVideoFlag) { + return -1; + } + if (null == local.view) { + TRTCEngineAdapterListener.onError(WARN_INVALID_VIEW); + return -1; + } + localVideoView = new TXCloudVideoView(local.view.getContext()); + isStartPreview = true; + this.startPreview(); + + return 0; + } + + @Override + public int setupRemoteVideo(VideoCanvas remote) { + LogUtils.d(TAG, " remote:" + remote); + if (!enableVideoFlag) { + return -1; + } + if (remote == null) { + trtcCloud.stopAllRemoteView(); + return 0; + } + if (null == remote.view) { + remoteVideoMap.remove(remote.uid); + return -1; + } + remoteVideoMap.put(remote.uid, new TXCloudVideoView(remote.view.getContext())); + trtcCloud.startRemoteView(String.valueOf(remote.uid), new TXCloudVideoView(remote.view.getContext())); + return 0; + } + + @Override + public int setLocalRenderMode(int mode) { + LogUtils.d(TAG, " mode:" + mode); + if (!enableVideoFlag) { + return -1; + } + switch (mode) { + case VideoCanvas.RENDER_MODE_HIDDEN: + trtcCloud.setLocalViewFillMode(TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL); + break; + case VideoCanvas.RENDER_MODE_FIT: + trtcCloud.setLocalViewFillMode(TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT); + break; + default: + trtcCloud.setLocalViewFillMode(TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL); + break; + } + return 0; + } + + @Override + public int setRemoteRenderMode(int uid, int mode) { + LogUtils.d(TAG, " uid:" + uid + " mode:" + mode); + if (!enableVideoFlag) { + return -1; + } + switch (mode) { + case VideoCanvas.RENDER_MODE_HIDDEN: + trtcCloud.setRemoteViewFillMode(String.valueOf(uid), TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL); + break; + case VideoCanvas.RENDER_MODE_FIT: + trtcCloud.setRemoteViewFillMode(String.valueOf(uid), TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FIT); + break; + default: + trtcCloud.setRemoteViewFillMode(String.valueOf(uid), TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL); + break; + } + return 0; + } + + @Override + public int startPreview() { + if (!enableVideoFlag) { + return -1; + } + trtcCloud.startLocalPreview(mUseFontCamera, localVideoView); + return 0; + } + + @Override + public int stopPreview() { + if (!enableVideoFlag) { + return -1; + } + trtcCloud.stopLocalPreview(); + isStartPreview = false; + return 0; + } + + @Override + public int enableLocalVideo(boolean enabled) { + LogUtils.d(TAG, " enabled:" + enabled); + if (!enableVideoFlag) { + return -1; + } + if (enabled) { + trtcCloud.startLocalPreview(true, localVideoView); + } else { + trtcCloud.stopLocalPreview(); + } + return 0; + } + + @Override + public int muteLocalVideoStream(boolean muted) { + LogUtils.d(TAG, " muted:" + muted); + if (!enableVideoFlag) { + return -1; + } + trtcCloud.muteLocalVideo(muted); + return 0; + } + + @Override + public int muteRemoteVideoStream(int uid, boolean muted) { + LogUtils.d(TAG, " uid:" + uid + " muted:" + muted); + if (!enableVideoFlag) { + return -1; + } + trtcCloud.muteRemoteVideoStream(String.valueOf(uid), muted); + return 0; + } + + @Override + public int muteAllRemoteVideoStreams(boolean muted) { + LogUtils.d(TAG, " muted:" + muted); + if (!enableVideoFlag) { + return -1; + } + trtcCloud.muteAllRemoteVideoStreams(muted); + return 0; + } + + @Override + public int setDefaultMuteAllRemoteVideoStreams(boolean muted) { + LogUtils.d(TAG, " muted:" + muted); + if (!enableVideoFlag) { + return -1; + } + return 0; + } + + @Override + public int setBeautyEffectOptions(boolean enabled, BeautyOptions options) { + LogUtils.d(TAG, " enabled:" + enabled + " smoothnessLevel:" + options.smoothnessLevel + " lighteningLevel:" + options.lighteningLevel + " rednessLevel:" + options.rednessLevel); + if (!enableVideoFlag) { + return -1; + } + int style; + if (options.lighteningContrastLevel == 1) { + style = TRTCCloudDef.TRTC_BEAUTY_STYLE_NATURE; + } else { + style = TRTCCloudDef.TRTC_BEAUTY_STYLE_SMOOTH; + } + if (enabled) { + int trtcSmoothnessLevel = (int) Math.round(options.smoothnessLevel * 0.9); + int trtcLighteningLevel = (int) Math.round(options.lighteningLevel * 0.9); + int trtcRednessLevel = (int) Math.round(options.rednessLevel * 0.9); + if (trtcSmoothnessLevel > 9) { + trtcSmoothnessLevel = 9; + } + if (trtcSmoothnessLevel > 9) { + trtcSmoothnessLevel = 9; + } + if (trtcRednessLevel > 9) { + trtcRednessLevel = 9; + } + ; + trtcCloud.setBeautyStyle(style, trtcSmoothnessLevel, trtcLighteningLevel, trtcRednessLevel); + } else { + trtcCloud.setBeautyStyle(TRTCCloudDef.TRTC_BEAUTY_STYLE_NATURE, 0, 0, 0); + } + return 0; + } + + @Override + public int setLocalVideoMirrorMode(int mode) { + LogUtils.d(TAG, " mode:" + mode); + if (!enableVideoFlag) { + return -1; + } + trtcCloud.setLocalViewMirror(mode); + return 0; + } + + @Override + public int switchCamera() { + if (!enableVideoFlag && !isStartPreview) { + LogUtils.d(TAG, "switchCamera error enableVideoFlag:" + enableVideoFlag + " isStartPreview:" + isStartPreview); + } + trtcCloud.switchCamera(); + return 0; + } + + @Override + public boolean isCameraZoomSupported() { + return trtcCloud.isCameraZoomSupported(); + } + + @Override + public boolean isCameraTorchSupported() { + return trtcCloud.isCameraTorchSupported(); + } + + @Override + public boolean isCameraFocusSupported() { + return trtcCloud.isCameraFocusPositionInPreviewSupported(); + } + + @Override + public boolean isCameraExposurePositionSupported() { + return false; + } + + @Override + public boolean isCameraAutoFocusFaceModeSupported() { + return trtcCloud.isCameraAutoFocusFaceModeSupported(); + } + + @Override + public int setCameraZoomFactor(float factor) { + if (!enableVideoFlag) { + return -1; + } + trtcCloud.setZoom((int) factor); + return 0; + } + + @Override + public float getCameraMaxZoomFactor() { + return 5; + } + + @Override + public int setCameraFocusPositionInPreview(float positionX, float positionY) { + if (!enableVideoFlag) { + return -1; + } + trtcCloud.setFocusPosition((int) positionX, (int) positionY); + return 0; + } + + @Override + public int setCameraExposurePosition(float positionXinView, float positionYinView) { + LogUtils.d(TAG, " positionXinView:" + positionXinView + " positionYinView:" + positionYinView); + if (!enableVideoFlag) { + return -1; + } + trtcCloud.setFocusPosition((int) positionXinView, (int) positionYinView); + return 0; + } + + @Override + public int setCameraTorchOn(boolean isOn) { + LogUtils.d(TAG, " isOn:" + isOn); + if (!enableVideoFlag) { + return -1; + } + trtcCloud.enableTorch(isOn); + return 0; + } + + @Override + public int setCameraAutoFocusFaceModeEnabled(boolean enabled) { + LogUtils.d(TAG, " enabled:" + enabled); + if (!enableVideoFlag) { + return -1; + } + return 0; + } + + @Override + public String getCallId() { + return null; + } + + + @Override + public void setExternalVideoSource(boolean enable, boolean useTexture, boolean pushMode) { + LogUtils.d(TAG, " enable:" + enable + " useTexture:" + useTexture + " pushMode:" + pushMode); + enableExternalVideo = enable; + externalVideoUseTexture = useTexture; + this.pushmode = pushMode; + trtcCloud.enableCustomVideoCapture(enable); + } + + @Override + public boolean pushExternalVideoFrame(AgoraVideoFrame videoFrame) { + LogUtils.d(TAG, " videoFrame:" + videoFrame); + if (!enableVideoFlag || !enableExternalVideo) { + return false; + } + if (pushmode) { + TRTCCloudDef.TRTCVideoFrame frame = new TRTCCloudDef.TRTCVideoFrame(); + switch (videoFrame.format) { + case AgoraVideoFrame.FORMAT_I420: + frame.pixelFormat = TRTC_VIDEO_PIXEL_FORMAT_I420; + break; + case AgoraVideoFrame.FORMAT_NV21: + frame.pixelFormat = TRTC_VIDEO_PIXEL_FORMAT_NV21; + break; + case AgoraVideoFrame.FORMAT_TEXTURE_2D: + frame.pixelFormat = TRTC_VIDEO_PIXEL_FORMAT_Texture_2D; + break; + case AgoraVideoFrame.FORMAT_TEXTURE_OES: + frame.pixelFormat = TRTC_VIDEO_PIXEL_FORMAT_TEXTURE_EXTERNAL_OES; + break; + case AgoraVideoFrame.FORMAT_RGBA: + frame.pixelFormat = TRTC_VIDEO_PIXEL_FORMAT_UNKNOWN; + break; + default: + frame.pixelFormat = TRTC_VIDEO_PIXEL_FORMAT_UNKNOWN; + break; + } + + /** + switch(videoFrame.bufferType){ + case AgoraVideoFrame.BUFFER_TYPE_BUFFER: + frame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_BUFFER; + break; + case AgoraVideoFrame.BUFFER_TYPE_ARRAY: + frame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_ARRAY; + break; + case AgoraVideoFrame.BUFFER_TYPE_TEXTURE: + frame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE; + break; + default: + frame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_UNKNOWN; + break; + }**/ + if (externalVideoUseTexture) { + frame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE; + } else { + frame.bufferType = TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_BYTE_ARRAY; + } + frame.data = videoFrame.buf; + //frame.buffer = videoFrame.byteBuffer; + frame.width = videoFrame.stride; + frame.height = videoFrame.height; + frame.timestamp = videoFrame.timeStamp; + frame.rotation = videoFrame.rotation; + frame.texture.textureId = videoFrame.textureID; + frame.texture.eglContext10 = videoFrame.eglContext10; + frame.texture.eglContext14 = videoFrame.eglContext14; + trtcCloud.sendCustomVideoData(frame); + } else { + return false; + } + + return true; + } + + @Override + public boolean isTextureEncodeSupported() { + return true; + } + + + + @Override + @Unsupport + public int setExternalAudioSink(boolean enabled, int sampleRate, int channels) { + return 0; + } + + @Override + @Unsupport + public int pullPlaybackAudioFrame(byte[] data, int lengthInByte) { + return 0; + } + + @Override + public int setExternalAudioSource(boolean enabled, int sampleRate, int channels) { + LogUtils.d(TAG, " enabled:" + enabled + " sampleRate:" + sampleRate + " channels:" + channels); + if (!enableAudioFlag) { + return -1; + } + if (sampleRate != 48000) { + LogUtils.d(TAG, "setExternalAudioSource unsupport sampleRate: " + sampleRate); + return -1; + } + externalAudioSampleRate = sampleRate; + externalAudioSampleRate = channels; + trtcCloud.enableCustomAudioCapture(enabled); + bSetExternalAudioSource = true; + return 0; + } + + @Override + public int pushExternalAudioFrame(byte[] data, long timeStamp) { + LogUtils.d(TAG, " timeStamp:" + timeStamp); + if (!enableAudioFlag || !bSetExternalAudioSource) { + LogUtils.d(TAG, "pushExternalAudioFrame error: enableAudioFlag:" + enableAudioFlag + " bSetExternalAudioSource:" + bSetExternalAudioSource); + return -1; + } + TRTCCloudDef.TRTCAudioFrame frame = new TRTCCloudDef.TRTCAudioFrame(); + frame.data = data; + frame.timestamp = timeStamp; + frame.channel = externalAudioChannels; + frame.sampleRate = externalAudioSampleRate; + trtcCloud.sendCustomAudioData(frame); + return 0; + } + + @Override + public int registerAudioFrameObserver(IAudioFrameObserver observer) { + if (!enableAudioFlag) { + return -1; + } + TRTCCloudListener.TRTCAudioFrameListener listener = new TRTCCloudListener.TRTCAudioFrameListener() { + + @Override + public void onCapturedAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) { + + } + + @Override + public void onLocalProcessedAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) { + + } + + @Override + public void onRemoteUserAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame, String s) { + + } + + @Override + public void onMixedPlayAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) { + + } + + @Override + public void onMixedAllAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) { + + } + + @Override + public void onVoiceEarMonitorAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) { + + } + + }; + trtcCloud.setAudioFrameListener(listener); + return 0; + } + + @Override + public int setRecordingAudioFrameParameters(int sampleRate, int channel, int mode, int samplesPerCall) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setPlaybackAudioFrameParameters(int sampleRate, int channel, int mode, int samplesPerCall) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + @Override + public int setMixedAudioFrameParameters(int sampleRate, int samplesPerCall) { + if (!enableAudioFlag) { + return -1; + } + return 0; + } + + /** + * 坐标可能需要重新适配 + * + * @param watermark + * @return + */ + @Override + public int addVideoWatermark(AgoraImage watermark) { + if (!enableVideoFlag) { + return -1; + } + Bitmap bitmap = null; + + int resolutionWidth = videoEncoderConfiguration.dimensions.width; + int resolutionHeight = videoEncoderConfiguration.dimensions.height; + try { + URL url = new URL(watermark.url); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(5000); + connection.setRequestMethod("GET"); + if (connection.getResponseCode() == 200) { + InputStream in = connection.getInputStream(); + bitmap = BitmapFactory.decodeStream(in); + } + } catch (IOException e) { + e.printStackTrace(); + } + trtcCloud.setWatermark(bitmap, TRTC_VIDEO_STREAM_TYPE_BIG, + watermark.x / (float) resolutionWidth, + watermark.y / (float) resolutionHeight, + watermark.width / (float) resolutionWidth); + return 0; + } + + @Override + public int addVideoWatermark(String watermarkUrl, WatermarkOptions options) { + int resolutionWidth = videoEncoderConfiguration.dimensions.width; + int resolutionHeight = videoEncoderConfiguration.dimensions.height; + int decodeWidth; + int decodeHeight; + float width; + float x; + float y; + if (videoEncoderConfiguration.orientationMode == ORIENTATION_MODE_FIXED_PORTRAIT) { + decodeWidth = options.positionInPortraitMode.width; + decodeHeight = options.positionInPortraitMode.height; + width = options.positionInPortraitMode.width / (float) resolutionWidth; + x = options.positionInPortraitMode.x / (float) resolutionWidth; + y = options.positionInPortraitMode.y / (float) resolutionHeight; + } else { + decodeWidth = options.positionInLandscapeMode.width; + decodeHeight = options.positionInLandscapeMode.height; + width = options.positionInLandscapeMode.width / (float) resolutionWidth; + x = options.positionInLandscapeMode.x / (float) resolutionWidth; + y = options.positionInLandscapeMode.y / (float) resolutionHeight; + } + Bitmap bitmap = TRTCUtils.getBitmap(watermarkUrl, decodeWidth, decodeHeight); + trtcCloud.setWatermark(bitmap, TRTC_VIDEO_STREAM_TYPE_BIG, x, y, width); + + return 0; + } + + @Override + public int clearVideoWatermarks() { + if (!enableVideoFlag) { + return -1; + } + trtcCloud.setWatermark(null, TRTC_VIDEO_STREAM_TYPE_BIG, 0, 0, 0); + return 0; + } + + @Override + public int enableDualStreamMode(boolean enable) { + LogUtils.d(TAG, " enable:" + enable); + TRTCCloudDef.TRTCVideoEncParam smallVideoEncParam = new TRTCCloudDef.TRTCVideoEncParam(); + smallVideoEncParam.videoResolution = TRTC_VIDEO_RESOLUTION_320_240; + smallVideoEncParam.videoResolutionMode = TRTC_VIDEO_RESOLUTION_MODE_LANDSCAPE; + smallVideoEncParam.videoFps = 20; + smallVideoEncParam.videoBitrate = 250; + trtcCloud.enableEncSmallVideoStream(enable, smallVideoEncParam); + bEnableDualMode = enable; + if (enable) { + if (bBigVideoParamSet) { + JSONObject jsonFuncParam = new JSONObject(); + JSONObject jsonParam = new JSONObject(); + + try { + jsonParam.put("videoWidth", videoEncoderConfiguration.dimensions.width / 2); + jsonParam.put("videoHeight", videoEncoderConfiguration.dimensions.height / 2); + jsonParam.put("videoFps", videoEncoderConfiguration.frameRate); + jsonParam.put("videoBitrate", videoEncoderConfiguration.bitrate / 2); + jsonParam.put("streamType", 1); + + jsonFuncParam.put("api", "setVideoEncodeParamEx"); + jsonFuncParam.put("params", jsonParam); + + } catch (JSONException e) { + LogUtils.d(TAG, "enableDualStreamMode err :JSONException"); + return -1; + } + trtcCloud.callExperimentalAPI(jsonFuncParam.toString()); + } else { + bShouldSetSmallVideo = true; + } + } + return 0; + } + + @Override + public int setRemoteVideoStreamType(int uid, int streamType) { + LogUtils.d(TAG, " uid:" + uid + " streamType:" + streamType); + int tmpStreamType = TRTC_VIDEO_STREAM_TYPE_BIG;////VIDEO_STREAM_HIGH = 0 + if (1 == streamType) { + tmpStreamType = TRTC_VIDEO_STREAM_TYPE_SMALL;////VIDEO_STREAM_LOW = 1 + } + trtcCloud.setRemoteVideoStreamType(String.valueOf(uid), streamType); + return 0; + } + + @Override + public int setRemoteDefaultVideoStreamType(int streamType) { + LogUtils.d(TAG, " streamType:" + streamType); + int tmpStreamType = TRTC_VIDEO_STREAM_TYPE_BIG;//VIDEO_STREAM_HIGH = 0 + if (1 == streamType) { + tmpStreamType = TRTC_VIDEO_STREAM_TYPE_SMALL;//VIDEO_STREAM_LOW = 1 + } + trtcCloud.setPriorRemoteVideoStreamType(streamType); + return 0; + } + + @Override + public int addPublishStreamUrl(String url, boolean transcodingEnabled) { + LogUtils.d(TAG, " url:" + url + " transcodingEnabled:" + transcodingEnabled); + TRTCCloudDef.TRTCPublishCDNParam param = new TRTCCloudDef.TRTCPublishCDNParam(); + param.appId = SDKConfig.TX_APPID; + param.bizId = SDKConfig.TX_BIZID; + param.url = url; + trtcCloud.stopPublishCDNStream(); + trtcCloud.startPublishCDNStream(param); + return 0; + } + + @Override + public int removePublishStreamUrl(String url) { + LogUtils.d(TAG, " url:" + url); + trtcCloud.stopPublishCDNStream(); + return 0; + } + + @Override + public int setLiveTranscoding(LiveTranscoding transcoding) { + ; + setLiveTransCodingFlag = true; + currentTranscodingConfig = transcoding; + TRTCCloudDef.TRTCTranscodingConfig config = new TRTCCloudDef.TRTCTranscodingConfig(); + ArrayList mixUsers = new ArrayList(); + config.mixUsers = new ArrayList(); + config.appId = SDKConfig.TX_APPID; + config.bizId = SDKConfig.TX_BIZID; + config.videoWidth = transcoding.width; + config.videoHeight = transcoding.height; + config.videoBitrate = transcoding.videoBitrate; + config.videoFramerate = transcoding.videoFramerate; + config.videoGOP = (int) Math.floor(transcoding.videoGop / transcoding.videoFramerate); + if (config.videoGOP < 1) { + config.videoGOP = 1; + } + if (config.videoGOP > 10) { + config.videoGOP = 10; + } + mixUsers.clear(); + for (LiveTranscoding.TranscodingUser user : transcoding.getUsers()) { + if (users.contains(user.uid)) { + TRTCCloudDef.TRTCMixUser trtcUser = new TRTCCloudDef.TRTCMixUser(); + trtcUser.userId = String.valueOf(user.uid); + trtcUser.zOrder = user.zOrder; + trtcUser.x = user.x; + trtcUser.y = user.y; + trtcUser.width = user.width; + trtcUser.height = user.height; + mixUsers.add(trtcUser); + } + } + config.mixUsers = mixUsers; + config.audioSampleRate = LiveTranscoding.AudioSampleRateType.getValue(transcoding.audioSampleRate); + config.audioBitrate = transcoding.audioBitrate; + config.audioChannels = transcoding.audioChannels; + trtcCloud.setMixTranscodingConfig(config); + return 0; + } + + @Override + public int createDataStream(boolean reliable, boolean ordered) { + LogUtils.d(TAG, "reliable:" + reliable + " ordered:" + ordered); + dataStreamReliable = reliable; + dataStreamOrdered = ordered; + curSendStreamCnt++; + if (curSendStreamCnt > MAX_SEND_STREAM_CNT) { + TRTCEngineAdapterListener.onError(ERR_TOO_MANY_DATA_STREAMS); + } + return curSendStreamCnt; + } + + @Override + public int sendStreamMessage(int cmdID, byte[] data) { + LogUtils.d(TAG, "cmdID:" + cmdID); + sendStreamSizeInSecond += data.length; + if (0 == lastSecondSendStreamTime) { + lastSecondSendStreamTime = System.currentTimeMillis(); + + } else { + long timeDelta = System.currentTimeMillis() - lastSecondSendStreamTime; + if (timeDelta > 1000) { + + if (sendStreamSizeInSecond * 1000 / timeDelta > 8) { + TRTCEngineAdapterListener.onError(ERR_BITRATE_LIMIT); + lastSecondSendStreamTime = System.currentTimeMillis(); + sendStreamSizeInSecond = 0; + } + } + } + if (data.length > 1024) { + TRTCEngineAdapterListener.onError(ERR_SIZE_TOO_LARGE); + return -1; + } + trtcCloud.sendCustomCmdMsg(cmdID, data, dataStreamReliable, dataStreamOrdered); + return 0; + } + + + @Override + public int setLogFile(String filePath) { + LogUtils.d(TAG, " filePath:" + filePath); + TRTCCloud.setLogDirPath(filePath); + return 0; + } + + @Override + public int setLogFilter(int filter) { + LogUtils.d(TAG, " filter:" + filter); + int logFilter = TRTC_LOG_LEVEL_DEBUG; + switch (filter) { + case LOG_FILTER_OFF: + logFilter = TRTC_LOG_LEVEL_NULL; + break; + case LOG_FILTER_DEBUG: + logFilter = TRTC_LOG_LEVEL_DEBUG; + break; + case LOG_FILTER_INFO: + logFilter = TRTC_LOG_LEVEL_INFO; + break; + case LOG_FILTER_WARNING: + logFilter = TRTC_LOG_LEVEL_WARN; + break; + case LOG_FILTER_ERROR: + logFilter = TRTC_LOG_LEVEL_ERROR; + break; + case LOG_FILTER_CRITICAL: + logFilter = TRTC_LOG_LEVEL_FATAL; + break; + default: + + break; + } + TRTCCloud.setLogLevel(logFilter); + return 0; + } + + @Override + public int setLogFileSize(int fileSizeInKBytes) { + LogUtils.d(TAG, " fileSizeInKBytes:" + fileSizeInKBytes); + return 0; + } + + @Override + @Unsupport + public void addHandler(IRtcEngineEventHandler handler) { + + } + + @Override + @Unsupport + public void removeHandler(IRtcEngineEventHandler handler) { + + } + + @Override + public int registerMediaMetadataObserver(IMetadataObserver observer, int type) { + return 0; + } + + @Override + public int startChannelMediaRelay(ChannelMediaRelayConfiguration channelMediaRelayConfiguration) { + return 0; + } + + @Override + public int stopChannelMediaRelay() { + return 0; + } + + @Override + public int updateChannelMediaRelay(ChannelMediaRelayConfiguration channelMediaRelayConfiguration) { + return 0; + } + + @Override + public int startDumpVideoReceiveTrack(int uid) { + return 0; + } + + @Override + public int stopDumpVideoReceiveTrack() { + return 0; + } + + + //TODO:没有匹配到的函数 + @Override + public void setNetworkQosParam(TRTCCloudDef.TRTCNetworkQosParam param) { + trtcCloud.setNetworkQosParam(param); + } + + @Override + public void showDebugView(int showType) { + trtcCloud.showDebugView(showType); + } + + @Override + public void setDebugViewMargin(int userId, TRTCCloud.TRTCViewMargin margin) { + trtcCloud.setDebugViewMargin(String.valueOf(userId), margin); + } + + @Override + public void startRemoteSubStreamView(int userId, TXCloudVideoView view) { + trtcCloud.startRemoteSubStreamView(String.valueOf(userId), view); + } + + @Override + public void stopRemoteSubStreamView(int userId) { + trtcCloud.stopRemoteSubStreamView(String.valueOf(userId)); + } + + @Override + public void setRemoteSubStreamViewFillMode(int userId, int mode) { + trtcCloud.setRemoteSubStreamViewFillMode(String.valueOf(userId), mode); + } + + @Override + public void setEyeScaleLevel(int eyeScaleLevel) { + + trtcCloud.setEyeScaleLevel(eyeScaleLevel); + } + + @Override + public void setFaceSlimLevel(int faceScaleLevel) { + + trtcCloud.setFaceSlimLevel(faceScaleLevel); + } + + @Override + public void setFaceVLevel(int faceVLevel) { + + trtcCloud.setFaceVLevel(faceVLevel); + } + + @Override + public void setFaceShortLevel(int faceShortlevel) { + trtcCloud.setFaceShortLevel(faceShortlevel); + } + + @Override + public void setChinLevel(int chinLevel) { + trtcCloud.setChinLevel(chinLevel); + } + + @Override + public void setNoseSlimLevel(int noseSlimLevel) { + trtcCloud.setNoseSlimLevel(noseSlimLevel); + } + + @Override + public boolean setGreenScreenFile(String file) { + return trtcCloud.setGreenScreenFile(file); + } + + @Override + public void selectMotionTmpl(String motionPath) { + trtcCloud.selectMotionTmpl(motionPath); + } + + @Override + public void setMotionMute(boolean motionMute) { + trtcCloud.setMotionMute(motionMute); + } + + @Override + public void setFilter(Bitmap image) { + trtcCloud.setFilter(image); + } + + @Override + public void setFilterConcentration(float concentration) { + trtcCloud.setFilterConcentration(concentration); + } + + @Override + public void setLocalViewRotation(int rotation) { + trtcCloud.setLocalViewRotation(rotation); + } + + @Override + public void setVideoEncoderMirror(boolean mirror) { + trtcCloud.setVideoEncoderMirror(mirror); + } + + @Override + public void setGSensorMode(int mode) { + trtcCloud.setGSensorMode(mode); + } + + @Override + public void ConnectOtherRoom(String param) { + trtcCloud.ConnectOtherRoom(param); + } + + @Override + public void DisconnectOtherRoom() { + trtcCloud.DisconnectOtherRoom(); + } + + @Override + public void setMixTranscodingConfig(TRTCCloudDef.TRTCTranscodingConfig config) { + trtcCloud.setMixTranscodingConfig(config); + } + + @Override + public void startCdnPlayerWithUrl(String url, TXCloudVideoView view) { +// if (mLivePlayer != null) { +// mLivePlayer.setPlayerView(view); +// mLivePlayer.setRenderRotation(TXLiveConstants.RENDER_ROTATION_PORTRAIT); +// mLivePlayer.setRenderMode(TXLiveConstants.RENDER_MODE_ADJUST_RESOLUTION); +// mLivePlayer.startPlay(url, PLAY_TYPE_LIVE_FLV); +// } + } + + @Override + public void stopCdnPlayer() { + if (mLivePlayer != null) { + mLivePlayer.stopPlay(true); + mLivePlayer.setPlayerView(null); + } + } + + private int checkEncoderConfiguration(int inputWidth, int inputHeight) { + + boolean needAdjust = false; + int adjustWidth = videoEncoderConfiguration.dimensions.width; + int adjustHeight = videoEncoderConfiguration.dimensions.height; + if (videoEncoderConfiguration.orientationMode == ORIENTATION_MODE_ADAPTIVE) { + if (videoEncoderConfiguration.dimensions.width > videoEncoderConfiguration.dimensions.height && inputWidth < inputHeight) { + adjustWidth = videoEncoderConfiguration.dimensions.height; + adjustHeight = videoEncoderConfiguration.dimensions.width; + needAdjust = true; + } + } + if (videoEncoderConfiguration.orientationMode == ORIENTATION_MODE_FIXED_PORTRAIT) { + if (videoEncoderConfiguration.dimensions.width > videoEncoderConfiguration.dimensions.height) { + adjustWidth = videoEncoderConfiguration.dimensions.height; + adjustHeight = videoEncoderConfiguration.dimensions.width; + needAdjust = true; + } + } + if (videoEncoderConfiguration.orientationMode == ORIENTATION_MODE_FIXED_LANDSCAPE) { + if (videoEncoderConfiguration.dimensions.width < videoEncoderConfiguration.dimensions.height) { + adjustWidth = videoEncoderConfiguration.dimensions.height; + adjustHeight = videoEncoderConfiguration.dimensions.width; + needAdjust = true; + } + } + LogUtils.d(TAG, " inputWidth:" + inputWidth + " inputHeight:" + inputHeight + " needAdjust:" + needAdjust + " adjustWidth:" + adjustWidth + " adjustHeight:" + adjustHeight); + if (needAdjust) { + JSONObject jsonFuncParam = new JSONObject(); + JSONObject jsonParam = new JSONObject(); + + try { + jsonParam.put("videoWidth", adjustWidth); + jsonParam.put("videoHeight", adjustHeight); + jsonParam.put("videoFps", videoEncoderConfiguration.frameRate); + jsonParam.put("videoBitrate", videoEncoderConfiguration.bitrate); + jsonParam.put("streamType", 0); + + jsonFuncParam.put("api", "setVideoEncodeParamEx"); + jsonFuncParam.put("params", jsonParam); + + } catch (JSONException e) { + LogUtils.d(TAG, "setVideoEncodeParamEx err :JSONException"); + return -1; + } + videoEncoderConfiguration.dimensions.width = adjustWidth; + videoEncoderConfiguration.dimensions.height = adjustHeight; + LogUtils.d(TAG, "call callExperimentalAPI to set video encoder param."); + trtcCloud.callExperimentalAPI(jsonFuncParam.toString()); + } + return 0; + } + +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/TRTCUtils.java b/core/src/main/java/com/chwl/core/manager/trtc/TRTCUtils.java new file mode 100644 index 0000000..e77fdb6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/TRTCUtils.java @@ -0,0 +1,58 @@ +package com.chwl.core.manager.trtc; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +public class TRTCUtils { + + private static boolean isSpace(final String s) { + if (s == null) return true; + for (int i = 0, len = s.length(); i < len; ++i) { + if (!Character.isWhitespace(s.charAt(i))) { + return false; + } + } + return true; + } + + /** + * Return bitmap. + * + * @param filePath The path of file. + * @param maxWidth The maximum width. + * @param maxHeight The maximum height. + * @return bitmap + */ + public static Bitmap getBitmap(final String filePath, final int maxWidth, final int maxHeight) { + if (isSpace(filePath)) return null; + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(filePath, options); + options.inSampleSize = calculateInSampleSize(options, maxWidth, maxHeight); + options.inJustDecodeBounds = false; + return BitmapFactory.decodeFile(filePath, options); + } + + + /** + * Return the sample size. + * + * @param options The options. + * @param maxWidth The maximum width. + * @param maxHeight The maximum height. + * @return the sample size + */ + private static int calculateInSampleSize(final BitmapFactory.Options options, + final int maxWidth, + final int maxHeight) { + int height = options.outHeight; + int width = options.outWidth; + int inSampleSize = 1; + while (height > maxHeight || width > maxWidth) { + height >>= 1; + width >>= 1; + inSampleSize <<= 1; + } + return inSampleSize; + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineEventHandler.java b/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineEventHandler.java new file mode 100644 index 0000000..c8d74bc --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineEventHandler.java @@ -0,0 +1,441 @@ +package com.chwl.core.manager.trtc; + +import android.graphics.Rect; +import android.os.Message; + +import com.orhanobut.logger.Logger; +import com.tencent.trtc.TRTCCloudDef; +import com.chwl.core.R; +import com.chwl.core.im.custom.bean.RoomPkBean; +import com.chwl.core.manager.AudioEngineManager; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.manager.agora.RtcEngineHandler; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +import io.agora.rtc2.Constants; +import io.agora.rtc2.IRtcEngineEventHandler; + + +/** + * @author by 梁馨 on 2020/9/14. + */ +public class TRtcEngineEventHandler implements IRTCEngineHandler { + + public static String TAG = TRtcEngineEventHandler.class.getSimpleName(); + + @Override + public void onWarning(int warn) { + + } + + @Override + public void onError(int err) { + Logger.t(TAG).d("onError" + err); +// CrashReport.postCatchedException(new Throwable(ResUtil.getString(R.string.manager_trtc_trtcengineeventhandler_01)+err+" roomId="+AvRoomDataManager.get().getRoomId())); + switch (err) { + case 1107: { + SingleToastUtil.showToast(ResUtil.getString(R.string.manager_trtc_trtcengineeventhandler_02)); + break; + } + default: { + break; + } + } + + } + + @Override + public void onJoinChannelSuccess(String channel, int uid, int elapsed) { + Logger.t(TAG).d("onJoinChannelSuccess" + channel + "uid:" + uid); + //声网进入频道成功日志 + TRtcEngineManager manager = TRtcEngineManager.get(); + if (manager != null) { + Message message = manager.mRtcEngineHandler.obtainMessage(); + message.what = RtcEngineHandler.notifyJoinAvRoom; + manager.mRtcEngineHandler.sendMessage(message); + manager.uid = uid; + } + + } + + + @Override + public void onRejoinChannelSuccess(String channel, int uid, int elapsed) { + } + + @Override + public void onLeaveChannel(IRtcEngineEventHandler.RtcStats stats) { + Logger.t(TAG).d("onLeaveChannel"); + } + + @Override + public void onUserJoined(int uid, int elapsed) { + } + + @Override + public void onUserOffline(int uid, int reason) { + + } + + @Override + public void onConnectionStateChanged(int state, int reason) { + + } + + @Override + public void onActiveSpeaker(int uid) { + } + + @Override + public void onLastmileQuality(int quality) { + if (quality >= 3) { + IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_BAD) + ); + } + } + + @Override + public void onLastmileProbeResult(IRtcEngineEventHandler.LastmileProbeResult result) { + + } + + + @Override + public void onNetworkQuality(int uid, int txQuality, int rxQuality) { + + } + + @Override + public void onLocalVideoStats(IRtcEngineEventHandler.LocalVideoStats stats) { + + } + + @Override + public void onRemoteVideoStats(IRtcEngineEventHandler.RemoteVideoStats stats) { + + } + + @Override + public void onLocalAudioStats(IRtcEngineEventHandler.LocalAudioStats stats) { + + } + + @Override + public void onConnectionInterrupted() { + IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE)); + } + + @Override + public void onAudioQuality(int uid, int quality, short delay, short lost) { + + } + + @Override + public void onApiCallExecuted(int error, String api, String result) { + + } + + @Override + public void onTokenPrivilegeWillExpire(String token) { + + } + + @Override + public void onRequestToken() { + + } + + @Override + public void onMicrophoneEnabled(boolean enabled) { + + } + + @Override + public void onConnectionLost() { + IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE)); + } + + /** + * 用户音量提示回调。 + * + * @param speakers + * @param totalVolume + */ + @Override + public void onAudioVolumeIndication(IRtcEngineEventHandler.AudioVolumeInfo[] speakers, int totalVolume) { + TRtcEngineManager manager = TRtcEngineManager.get(); + Message message = manager.mRtcEngineHandler.obtainMessage(); + message.what = RtcEngineHandler.onAudioVolumeIndication; + message.obj = speakers; + manager.mRtcEngineHandler.sendMessage(message); + } + + @Override + public void onUserMuteAudio(int uid, boolean muted) { + TRtcEngineManager manager = TRtcEngineManager.get(); + if (muted) { + Message message = manager.mRtcEngineHandler.obtainMessage(); + message.what = RtcEngineHandler.onUserMuteAudio; + message.obj = uid; + manager.mRtcEngineHandler.sendMessage(message); + } + } + + @Override + public void onUserMuteVideo(int uid, boolean muted) { + + } + + @Override + public void onUserEnableVideo(int uid, boolean enabled) { + + } + + @Override + public void onUserEnableLocalVideo(int uid, boolean enabled) { + + } + + @Override + public void onVideoSizeChanged(int uid, int width, int height, int rotation) { + + } + + @Override + public void onClientRoleChanged(int oldRole, int newRole) { + //角色切换 麦克风切换 + if (newRole == Constants.CLIENT_ROLE_BROADCASTER) { + TRtcEngineManager.get().setMute(TRtcEngineManager.get().isMute); + if (AvRoomDataManager.get().isRoomOwner() && + AvRoomDataManager.get().isSingleRoom() && + AvRoomDataManager.get().isOpenAnotherPKMode()) { + RoomPkBean pkBean = AvRoomDataManager.get().roomPkLiveData.getValue(); + if (pkBean != null) { + AudioEngineManager.get().connectOtherRoom(String.valueOf(pkBean.getARoomId()), pkBean.getAUid()); + } + } + } + } + + @Override + public void onLocalUserRegistered(int uid, String userAccount) { + + } + + @Override + public void onUserInfoUpdated(int uid, io.agora.rtc2.UserInfo userInfo) { + + } + + @Override + public void onAudioMixingFinished() {//伴奏播放已结束回调 + + } + + @Override + public void onAudioEffectFinished(int soundId) { + IMNetEaseManager.get().getChatRoomEventObservable().onNext( + new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED) + ); + } + + @Override + public void onLocalAudioStateChanged(int state, int error) { + + } + + @Override + public void onLocalVideoStateChanged(int localVideoState, int error) { + + } + + @Override + public void onRtmpStreamingStateChanged(String url, int state, int errCode) { + + } + + @Override + public void onStreamPublished(String url, int error) { + + } + + @Override + public void onStreamUnpublished(String url) { + + } + + @Override + public void onTranscodingUpdated() { + + } + + @Override + public void onStreamInjectedStatus(String url, int uid, int status) { + + } + + @Override + public void onStreamMessage(int uid, int streamId, byte[] data) { + + } + + @Override + public void onStreamMessageError(int uid, int streamId, int error, int missed, int cached) { + + } + + @Override + public void onMediaEngineLoadSuccess() { + + } + + @Override + public void onMediaEngineStartCallSuccess() { + + } + + @Override + public void onFirstLocalAudioFrame(int i) { + } + + @Override + public void onFirstRemoteAudioFrame(int uid, int elapsed) { + + } + + @Override + public void onFirstRemoteAudioDecoded(int uid, int elapsed) { + + } + + @Override + public void onVideoStopped() { + + } + + @Override + public void onFirstLocalVideoFrame(int width, int height, int elapsed) { + + } + + @Override + public void onFirstRemoteVideoDecoded(int uid, int width, int height, int elapsed) { + + } + + @Override + public void onFirstRemoteVideoFrame(int uid, int width, int height, int elapsed) { + + } + + @Override + public void onRemoteAudioStateChanged(int i, int i1, int i2, int i3) { + } + + @Override + public void onRemoteVideoStateChanged(int uid, int state, int reason, int elapsed) { + + } + + @Override + public void onChannelMediaRelayStateChanged(int state, int code) { + + } + + @Override + public void onChannelMediaRelayEvent(int code) { + + } + + @Override + public void onLocalPublishFallbackToAudioOnly(boolean isFallbackOrRecover) { + + } + + @Override + public void onRemoteSubscribeFallbackToAudioOnly(int uid, boolean isFallbackOrRecover) { + + } + + @Override + public void onAudioRouteChanged(int routing) { + + } + + @Override + public void onCameraReady() { + + } + + @Override + public void onCameraFocusAreaChanged(Rect rect) { + + } + + @Override + public void onCameraExposureAreaChanged(Rect rect) { + + } + + @Override + public void onRtcStats(IRtcEngineEventHandler.RtcStats stats) { + + } + + @Override + public void onRemoteAudioStats(IRtcEngineEventHandler.RemoteAudioStats remoteAudioStats) { + Logger.t(TAG).d("onRemoteAudioStats uid%d", remoteAudioStats.uid); + long uid = (long) remoteAudioStats.uid; + // 如果麦上没有这个人,不接收这个人的声音 + TRtcEngineManager.get().setRemoteMute(uid, !AvRoomDataManager.get().checkIsOnMicByAccount(uid + "")); + + } + + @Override + public void onRemoteAudioTransportStats(int uid, int delay, int lost, int rxKBitRate) { + + } + + @Override + public void onRemoteVideoTransportStats(int uid, int delay, int lost, int rxKBitRate) { + + } + + @Override + public void onAudioMixingStateChanged(int state, int errorCode) { + + } + + @Override + public void onUserSubStreamAvailable(int userId, boolean available) { + + } + + @Override + public void onSpeedTest(TRTCCloudDef.TRTCSpeedTestResult currentResult, int finishedCount, int totalCount) { + + } + + @Override + public void onRecvSEIMsg(int userId, byte[] data) { + + } + + @Override + public void onSetMixTranscodingConfig(int err, String errMsg) { + + } + + @Override + public void onConnectOtherRoom(int userID, int err, String errMsg) { + + } + + @Override + public void onDisConnectOtherRoom(int err, String errMsg) { + + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineHandler.java b/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineHandler.java new file mode 100644 index 0000000..ad06444 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineHandler.java @@ -0,0 +1,89 @@ +package com.chwl.core.manager.trtc; + +import static io.agora.rtc2.Constants.AUDIO_RECORDING_QUALITY_LOW; + +import android.os.Environment; +import android.os.Handler; +import android.os.Message; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.manager.AudioEngineManager; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.library.common.file.FileHelper; +import com.chwl.library.utils.config.BasicConfig; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +import io.agora.rtc2.Constants; +import io.agora.rtc2.IRtcEngineEventHandler; + +/** + * @author by 梁馨 on 2020/9/14. + */ + + +public class TRtcEngineHandler extends Handler { + + public static int notifyJoinAvRoom = 0; + public static int onAudioVolumeIndication = 1; + public static int onUserMuteAudio = 2; + + @Override + public void handleMessage(@NotNull Message msg) { + super.handleMessage(msg); + TRtcEngineManager rtcEngineManager = TRtcEngineManager.get(); + if (rtcEngineManager == null) return; + if (msg.what == notifyJoinAvRoom) { + if (!rtcEngineManager.inRoom) { + //IMNetEaseManager.get().joinAvRoom(); + } + rtcEngineManager.inRoom = true; + if (rtcEngineManager.needRecord && rtcEngineManager.mRtcEngine != null) { + rtcEngineManager.mRtcEngine.startAudioRecording(FileHelper.getRootFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + + File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName() + + "/audio/" + System.currentTimeMillis() + ".aac", AUDIO_RECORDING_QUALITY_LOW); + } + + } else if (msg.what == onAudioVolumeIndication) {//onAudioVolumeIndication 说话声音音量提示回调 + IRtcEngineEventHandler.AudioVolumeInfo[] speakers = (IRtcEngineEventHandler.AudioVolumeInfo[]) msg.obj; + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + if (rtcEngineManager.speakQueueMembersPosition.size() > 0) { + rtcEngineManager.speakQueueMembersPosition.clear(); + } + if (speakers == null || speakers.length == 0) return; + for (IRtcEngineEventHandler.AudioVolumeInfo speaker : speakers) { + // 0 代表的是房主,其他代表的是uid + long uid = speaker.uid == 0 ? rtcEngineManager.uid : speaker.uid; + int micPosition = AvRoomDataManager.get().getMicPosition(uid); + // 如果是房主的话,并且房主的mic位置没有的啊,则把房主的位置设置为-1(兼容ios轻聊房光晕) + if (uid == AvRoomDataManager.get().mCurrentRoomInfo.getUid() && + AvRoomDataManager.get().mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_LIGHT_CHAT + && micPosition == Integer.MIN_VALUE) { + micPosition = -1; + } + if (micPosition == Integer.MIN_VALUE && + uid == AuthModel.get().getCurrentUid()) { + // 如果麦上没有自己,并且自己在说话,要把自己变成听众 + AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE); + } else if (micPosition == Integer.MIN_VALUE && + uid != AuthModel.get().getCurrentUid() && + !(AvRoomDataManager.get().isSingleRoom() && AvRoomDataManager.get().isOpenAnotherPKMode())) { + // 如果麦上没有这个人,要把他静音 + AudioEngineManager.get().setRemoteMute(uid, true); + } + if (micPosition == Integer.MIN_VALUE || speaker.volume == 0) continue; + rtcEngineManager.speakQueueMembersPosition.add(micPosition); + } + IMNetEaseManager.get().getChatRoomEventObservable().onNext( + new RoomEvent().setEvent(RoomEvent.SPEAK_STATE_CHANGE) + .setMicPositionList(rtcEngineManager.speakQueueMembersPosition) + ); + } + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineManager.java b/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineManager.java new file mode 100644 index 0000000..5277ab5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/TRtcEngineManager.java @@ -0,0 +1,298 @@ +package com.chwl.core.manager.trtc; + +import static io.agora.rtc2.Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY; +import static io.agora.rtc2.Constants.AUDIO_PROFILE_MUSIC_STANDARD; +import static io.agora.rtc2.Constants.AUDIO_SCENARIO_GAME_STREAMING; + +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.chwl.core.SdkConfig; +import com.orhanobut.logger.Logger; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.BaseEngine; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.model.PlayerModel; +import com.chwl.library.utils.config.BasicConfig; + +import io.agora.rtc2.Constants; + + +/** + * @author by 梁馨 on 2020/9/14. + */ +public class TRtcEngineManager extends BaseEngine { + public static String TAG = TRtcEngineManager.class.getSimpleName(); + @NonNull + public final Handler mRtcEngineHandler = new TRtcEngineHandler(); + @NonNull + public final TRtcEngineEventHandler mEngineEventHandler = new TRtcEngineEventHandler(); + @Nullable + public TRTCEngineAdapter mRtcEngine; + + private TRtcEngineManager() { + super(); + } + + public static TRtcEngineManager get() { + return TRtcEngineManager.Helper.INSTANCE; + } + + @Override + public void enterChannel(long channelId, long uid) { + Logger.t(TAG).d("enterChannel channelId:%d", channelId); + if (mRtcEngine == null) { + try { + InitInfo initInfo = InitialModel.get().getCacheInitInfo(); + if (initInfo != null && initInfo.getTrtcAppId() != null) { + mRtcEngine = TRTCEngineAdapter.create(BasicConfig.INSTANCE.getAppContext(), initInfo.getTrtcAppId(), mEngineEventHandler); + } else { + mRtcEngine = TRTCEngineAdapter.create(BasicConfig.INSTANCE.getAppContext(), SdkConfig.INSTANCE.getTXAppId(), mEngineEventHandler); + } + } catch (Exception e) { + throw new RuntimeException( + "NEED TO check rtc sdk init fatal error\n" + Log.getStackTraceString(e)); + } + //设置频道模式为直播 + mRtcEngine.disableVideo(); + mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING); + mRtcEngine.setAudioProfile(AUDIO_PROFILE_MUSIC_HIGH_QUALITY, AUDIO_SCENARIO_GAME_STREAMING); + mRtcEngine.enableAudioVolumeIndication(600, 3, false); + mRtcEngine.setDefaultAudioRoutetoSpeakerphone(true); + mRtcEngine.setExternalVideoSource(true, false, true); + } + mRtcEngine.joinChannel(AvRoomDataManager.get().trtcSig, String.valueOf(channelId), null, (int) uid); + } + + @Override + public int stopAudioMixing() { + Logger.t(TAG).d("stopAudioMixing "); + if (mRtcEngine != null && isMusicPlaying) { + int result = mRtcEngine.stopAudioMixing(); + isMusicPlaying = false; + return result; + } + return -1; + } + + @Override + public void resetChannel() { + Logger.t(TAG).d("resetChannel "); + + if (mRtcEngine != null) { + stopAudioMixing(); + mRtcEngine.leaveChannel(); + mRtcEngine = null; + } + mRtcEngineHandler.removeCallbacksAndMessages(null); + } + + @Override + public void reEnterChannel(long channelId, long uid) { + enterChannel(channelId, uid); + setRemoteMute(isRemoteMute); + setMute(isMute); + } + + @Override + public synchronized void leaveChannel() { + Logger.t(TAG).d("leaveChannel "); + setRemoteMute(false); + setMute(false); + if (mRtcEngine != null) { + stopAudioMixing(); + mRtcEngine.leaveChannel(); + mRtcEngine = null; + TRTCEngineAdapter.destroy(); + } + mRtcEngineHandler.removeCallbacksAndMessages(null); + isMute = false; + isRemoteMute = false; + needRecord = false; + inRoom = false; + isAudienceRole = false; + } + + @Override + public void setRemoteMute(boolean mute) { + Logger.t(TAG).d("setRemoteMute mute=" + mute); + if (mRtcEngine != null) { + int result = mRtcEngine.muteAllRemoteAudioStreams(mute); + if (result == 0) { + isRemoteMute = mute; + } + } + } + + @Override + public boolean isEnableLoopBack() { + return false; + } + + @Override + public void connectOtherRoom(String roomId, long userUid) { + if (mRtcEngine != null) { + mRtcEngine.ConnectOtherRoom( + String.format( + "{\"strRoomId\":\"%s\",\"userId\":\"%s\"}", + RoomIdHelper.getRoomId(roomId, (int) userUid), + userUid) + ); + } + } + + @Override + public void disconnectOtherRoom() { + if (mRtcEngine != null) { + mRtcEngine.DisconnectOtherRoom(); + } + } + + @Override + public void setRemoteMute(long uid, boolean mute) { + Logger.t(TAG).d("setRemoteMute uid:%s mute:%s", uid, mute); + //调用这个方法会影导致muteAllRemoteAudioStreams(true)失效! + if (mRtcEngine != null && !isRemoteMute) { + mRtcEngine.muteRemoteAudioStream((int) uid, mute); + } + } + + @Override + public void stopLocalAudio() { + if(mRtcEngine != null) { + mRtcEngine.enableLocalAudio(false); + } + } + + @Override + public boolean setRole(int role) { + Logger.t(TAG).d("setRole role=" + role + ",isAudienceRole:" + isAudienceRole); + + if (mRtcEngine != null) { + mRtcEngine.setClientRole(role); + isAudienceRole = role == Constants.CLIENT_ROLE_AUDIENCE; + } + return true; + } + + @Override + public void setMute(boolean mute) { + Logger.t(TAG).d("setMute bool:" + mute); + if (mRtcEngine == null) { + return; + } + mRtcEngine.muteLocalAudioStream(mute); + isMute = mute; + } + + @Override + public void adjustAudioMixingVolume(int volume) { + Logger.t(TAG).d("adjustAudioMixingVolume" + volume); + + if (mRtcEngine != null) { + mRtcEngine.adjustAudioMixingVolume(volume); + } + } + + @Override + public void adjustRecordingSignalVolume(int volume) { + Logger.t(TAG).d("adjustRecordingSignalVolume volume=" + volume); + + if (mRtcEngine != null) { + mRtcEngine.adjustRecordingSignalVolume(volume); + } + } + + @Override + public int resumeAudioMixing() { + Logger.t(TAG).d("resumeAudioMixing"); + + if (mRtcEngine == null) { + return -1; + } + + int currentPosition = mRtcEngine.getAudioMixingCurrentPosition(); + int result = 0; + if (currentPosition > 0) { + result = mRtcEngine.resumeAudioMixing(); + } else { + LocalMusicBean current = PlayerModel.get().getCurrent(); + startAudioMixing(current.getLocalUri(), false, 0); + } + + isMusicPlaying = true; + return result; + } + + @Override + public int pauseAudioMixing() { + Logger.t(TAG).d("pauseAudioMixing"); + if (mRtcEngine == null) { + return -1; + } + int result = mRtcEngine.pauseAudioMixing(); + isMusicPlaying = false; + return result; + } + + @Override + public int startAudioMixing(String filePath, boolean loopback, int cycle) { + //trtc的0才是单次循环,1是播放两次!!! + if (cycle == 1) cycle = 0; + Logger.t(TAG).d("startAudioMixing filePath=" + filePath + " loopback=" + loopback + " cycle=" + cycle); + if (mRtcEngine == null || TextUtils.isEmpty(filePath)) { + return -1; + } + mRtcEngine.stopAudioMixing(); + int result; + try { + result = mRtcEngine.startAudioMixing(filePath, loopback, false, cycle); + } catch (Exception e) { + return -1; + } + isMusicPlaying = true; + + return result; + } + + //新方法还没有翻译 还没有验证 + @Override + public int getAudioMixingCurrentPosition() { + + if (mRtcEngine == null) { + return -1; + } + int currentPosition = mRtcEngine.getAudioMixingCurrentPosition(); + + Logger.t(TAG).d("getAudioMixingCurrentPosition() returned: " + currentPosition); + return currentPosition; + } + + @Override + public int getAudioMixingDuration() { + if (mRtcEngine == null) { + return -1; + } + return mRtcEngine.getAudioMixingDuration(); + } + + @Override + public void setChatRoomOnlineStatus(boolean status) { + + } + + @Override + public void setASMRMode(boolean enable) { + + } + + private static final class Helper { + private static final TRtcEngineManager INSTANCE = new TRtcEngineManager(); + } +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/Unsupport.java b/core/src/main/java/com/chwl/core/manager/trtc/Unsupport.java new file mode 100644 index 0000000..9fbb174 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/Unsupport.java @@ -0,0 +1,8 @@ +package com.chwl.core.manager.trtc; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Unsupport { +} diff --git a/core/src/main/java/com/chwl/core/manager/trtc/Version.java b/core/src/main/java/com/chwl/core/manager/trtc/Version.java new file mode 100644 index 0000000..0867c95 --- /dev/null +++ b/core/src/main/java/com/chwl/core/manager/trtc/Version.java @@ -0,0 +1,10 @@ +package com.chwl.core.manager.trtc; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.SOURCE) +public @interface Version { + String agora() default ""; + String trtc() default ""; +} diff --git a/core/src/main/java/com/chwl/core/market_verify/IMarketVerifyModel.java b/core/src/main/java/com/chwl/core/market_verify/IMarketVerifyModel.java new file mode 100644 index 0000000..4f8f9db --- /dev/null +++ b/core/src/main/java/com/chwl/core/market_verify/IMarketVerifyModel.java @@ -0,0 +1,31 @@ +package com.chwl.core.market_verify; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.LoginTipsInfo; + +import io.reactivex.Single; + +public interface IMarketVerifyModel extends IModel { + /** + * 当前版本当前渠道的市场是否正常审核中 + * @return + */ + boolean isMarketChecking(); + + /** + * 从服务器获取当前市场审核状态 + * @param uid + * @return + */ + Single loadVersionConfigFromServer(String uid); + + void setMarketChecking(boolean isMarketChecking); + + /** + * 从服务器登录界面的提示语 + * @return + */ + Single loadLoginTip(); + + void refreshApi(); +} diff --git a/core/src/main/java/com/chwl/core/market_verify/MarketVerifyModel.java b/core/src/main/java/com/chwl/core/market_verify/MarketVerifyModel.java new file mode 100644 index 0000000..f2e480b --- /dev/null +++ b/core/src/main/java/com/chwl/core/market_verify/MarketVerifyModel.java @@ -0,0 +1,131 @@ +package com.chwl.core.market_verify; + +import com.chwl.core.auth.event.LoginEvent; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.LoginTipsInfo; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.market_verify.bean.VersionConfig; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public class MarketVerifyModel extends BaseModel implements IMarketVerifyModel{ + //如果是oppo 市场,默认审核状态 + private final String[] reviewMarkets = new String[]{"oppo"}; + + private volatile boolean isMarketChecking = false; + private Api api; + + private MarketVerifyModel() { + api = RxNet.create(Api.class); + EventBus.getDefault().register(this); + + //如果是oppo 市场,默认审核状态 + /* String channel = AppMetaDataUtil.getChannelID(); + for (String reviewMarket : reviewMarkets) { + if (reviewMarket.equals(channel)) { + setMarketChecking(true); + break; + } + }*/ + } + @Override + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static IMarketVerifyModel get() { + return InstanceHolder.instance; + } + + private final static class InstanceHolder { + private final static IMarketVerifyModel instance = new MarketVerifyModel(); + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogin(LoginEvent event){ + } + + @Override + public void setMarketChecking(boolean isMarketChecking) { + this.isMarketChecking = isMarketChecking; + } + /** + * 当前版本当前渠道的市场是否正常审核中 + * @return + */ + @Override + public boolean isMarketChecking() { + return isMarketChecking; + } + + /** + * 从服务器获取当前市场审核状态 + * @param uid + * @return + */ + @Override + public Single loadVersionConfigFromServer(String uid){ + return api.loadVersionConfig( + uid + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()){ + if (null != response.getData() + && response.getData().getStatus() == VersionConfig.STATUS_MARKET_CHECKING){ + isMarketChecking = true; + }else { + isMarketChecking = false; + } + return Single.just(isMarketChecking); + }else { + isMarketChecking = false; + return Single.error(new Throwable(response.getMessage())); + } + } + }); + } + + /** + * 从服务器登录界面的提示语 + * @return + */ + @Override + public Single loadLoginTip(){ + return api.loadLoginTip().compose(RxHelper.handleSchAndExce()).compose(RxHelper.handleBeanData()); + } + + + private interface Api { + + /** + * 获取版本审核配置 + * @return + */ + @GET("/version/get") + Single> loadVersionConfig(@Query("uid") String uid); + + /** + * 获取登录提示 + * @return + */ + @GET("/version/get/tips") + Single> loadLoginTip(); + } +} diff --git a/core/src/main/java/com/chwl/core/market_verify/bean/VersionConfig.java b/core/src/main/java/com/chwl/core/market_verify/bean/VersionConfig.java new file mode 100644 index 0000000..2a91e3d --- /dev/null +++ b/core/src/main/java/com/chwl/core/market_verify/bean/VersionConfig.java @@ -0,0 +1,24 @@ +package com.chwl.core.market_verify.bean; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/7/30 + */ +@Data +public class VersionConfig { + + public static final int STATUS_ONLINE = 1; + public final static int STATUS_MARKET_CHECKING = 2; + public static final int STATUS_FORCE_UPDATE = 3; + public static final int STATUS_RECOMMEND_UPDATE = 4; + public static final int STATUS_DELETED = 5; + + //状态(1:线上版本,2:审核中版本,3:强制更新版本,4:建议更新版本,5:已删除版本) + private int status; + private String versionDesc;//描述信息 + + +} diff --git a/core/src/main/java/com/chwl/core/market_verify/event/MarketVerifyUpdateEvent.java b/core/src/main/java/com/chwl/core/market_verify/event/MarketVerifyUpdateEvent.java new file mode 100644 index 0000000..8505e64 --- /dev/null +++ b/core/src/main/java/com/chwl/core/market_verify/event/MarketVerifyUpdateEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.market_verify.event; + +public class MarketVerifyUpdateEvent { +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/SimpleAnimationListener.java b/core/src/main/java/com/chwl/core/monsterhunting/SimpleAnimationListener.java new file mode 100644 index 0000000..4bebaff --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/SimpleAnimationListener.java @@ -0,0 +1,24 @@ +package com.chwl.core.monsterhunting; + +import android.view.animation.Animation; + +/** + * Created by MadisonRong on 01/04/2018. + */ + +public class SimpleAnimationListener implements Animation.AnimationListener { + @Override + public void onAnimationStart(Animation animation) { + + } + + @Override + public void onAnimationEnd(Animation animation) { + + } + + @Override + public void onAnimationRepeat(Animation animation) { + + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackInfo.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackInfo.java new file mode 100644 index 0000000..27d53c0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackInfo.java @@ -0,0 +1,292 @@ +package com.chwl.core.monsterhunting.bean; + +/** + * Created by MadisonRong on 31/03/2018. + */ + +public class MonsterAttackInfo { + + /** + * 用户id(魔法师 uid) + */ + protected String uid; + + /** + * 用户头像(魔法师头像链接) + */ + protected String avatar; + + /** + * 用户昵称(魔法师昵称) + */ + protected String nick; + + /** + * 怪兽 id + */ + protected String monsterId; + + /** + * 怪兽名字 + */ + protected String monsterName; + + /** + * 怪兽总血量 + */ + protected String monsterTotalBlood; + + /** + * 怪兽残余血量 + */ + protected String monsterRemainBlood; + + /** + * 怪兽状态 + * @see MonsterInfo#MONSTER_STATUS_WILL_APPEAR + * @see MonsterInfo#MONSTER_STATUS_DID_APPEAR + * @see MonsterInfo#MONSTER_STATUS_DID_DEAD + * @see MonsterInfo#MONSTER_STATUS_DID_LEAVE + */ + protected String monsterStatus; + + /** + * 魔法 id + */ + protected String magicId; + + /** + * 伤害值 + */ + protected int impactValue; + + /** + * 距离消失时间毫秒数 + */ + protected String remainMills; + + /** + * 是否播放特效 + */ + protected String playEffect; + + protected String magicIcon; + + protected int sequence; + + protected int beforeDisappearSeconds; + + public MonsterAttackInfo(String uid, String avatar, String nick, String monsterId, String monsterName, String monsterTotalBlood, String monsterRemainBlood, String monsterStatus, String magicId, int impactValue, String remainMills, String playEffect) { + } + + public MonsterAttackInfo(String uid, String avatar, String nick, String monsterId, String monsterName, String monsterTotalBlood, String monsterRemainBlood, String monsterStatus, String magicId, int impactValue, String remainMills, String playEffect, String magicIcon, int sequence, int beforeDisappearSeconds) { + this.uid = uid; + this.avatar = avatar; + this.nick = nick; + this.monsterId = monsterId; + this.monsterName = monsterName; + this.monsterTotalBlood = monsterTotalBlood; + this.monsterRemainBlood = monsterRemainBlood; + this.monsterStatus = monsterStatus; + this.magicId = magicId; + this.impactValue = impactValue; + this.remainMills = remainMills; + this.playEffect = playEffect; + this.magicIcon = magicIcon; + this.sequence = sequence; + this.beforeDisappearSeconds = beforeDisappearSeconds; + } + + public MonsterAttackInfo() { + + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getMonsterId() { + return monsterId; + } + + public void setMonsterId(String monsterId) { + this.monsterId = monsterId; + } + + public String getMonsterName() { + return monsterName; + } + + public void setMonsterName(String monsterName) { + this.monsterName = monsterName; + } + + public String getMonsterTotalBlood() { + return monsterTotalBlood; + } + + public void setMonsterTotalBlood(String monsterTotalBlood) { + this.monsterTotalBlood = monsterTotalBlood; + } + + public String getMonsterRemainBlood() { + return monsterRemainBlood; + } + + public void setMonsterRemainBlood(String monsterRemainBlood) { + this.monsterRemainBlood = monsterRemainBlood; + } + + public String getMonsterStatus() { + return monsterStatus; + } + + public void setMonsterStatus(String monsterStatus) { + this.monsterStatus = monsterStatus; + } + + public String getMagicId() { + return magicId; + } + + public void setMagicId(String magicId) { + this.magicId = magicId; + } + + public int getImpactValue() { + return impactValue; + } + + public void setImpactValue(int impactValue) { + this.impactValue = impactValue; + } + + public String getRemainMills() { + return remainMills; + } + + public void setRemainMills(String remainMills) { + this.remainMills = remainMills; + } + + public String getPlayEffect() { + return playEffect; + } + + public void setPlayEffect(String playEffect) { + this.playEffect = playEffect; + } + + public String getMagicIcon() { + return magicIcon; + } + + public void setMagicIcon(String magicIcon) { + this.magicIcon = magicIcon; + } + + public int getSequence() { + return sequence; + } + + public void setSequence(int sequence) { + this.sequence = sequence; + } + + public int getBeforeDisappearSeconds() { + return beforeDisappearSeconds; + } + + public void setBeforeDisappearSeconds(int beforeDisappearSeconds) { + this.beforeDisappearSeconds = beforeDisappearSeconds; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MonsterAttackInfo)) return false; + + MonsterAttackInfo that = (MonsterAttackInfo) o; + + if (getImpactValue() != that.getImpactValue()) return false; + if (getUid() != null ? !getUid().equals(that.getUid()) : that.getUid() != null) + return false; + if (getAvatar() != null ? !getAvatar().equals(that.getAvatar()) : that.getAvatar() != null) + return false; + if (getNick() != null ? !getNick().equals(that.getNick()) : that.getNick() != null) + return false; + if (getMonsterId() != null ? !getMonsterId().equals(that.getMonsterId()) : that.getMonsterId() != null) + return false; + if (getMonsterName() != null ? !getMonsterName().equals(that.getMonsterName()) : that.getMonsterName() != null) + return false; + if (getMonsterTotalBlood() != null ? !getMonsterTotalBlood().equals(that.getMonsterTotalBlood()) : that.getMonsterTotalBlood() != null) + return false; + if (getMonsterRemainBlood() != null ? !getMonsterRemainBlood().equals(that.getMonsterRemainBlood()) : that.getMonsterRemainBlood() != null) + return false; + if (getMonsterStatus() != null ? !getMonsterStatus().equals(that.getMonsterStatus()) : that.getMonsterStatus() != null) + return false; + if (getMagicId() != null ? !getMagicId().equals(that.getMagicId()) : that.getMagicId() != null) + return false; + if (getRemainMills() != null ? !getRemainMills().equals(that.getRemainMills()) : that.getRemainMills() != null) + return false; + return getPlayEffect() != null ? getPlayEffect().equals(that.getPlayEffect()) : that.getPlayEffect() == null; + } + + @Override + public int hashCode() { + int result = getUid() != null ? getUid().hashCode() : 0; + result = 31 * result + (getAvatar() != null ? getAvatar().hashCode() : 0); + result = 31 * result + (getNick() != null ? getNick().hashCode() : 0); + result = 31 * result + (getMonsterId() != null ? getMonsterId().hashCode() : 0); + result = 31 * result + (getMonsterName() != null ? getMonsterName().hashCode() : 0); + result = 31 * result + (getMonsterTotalBlood() != null ? getMonsterTotalBlood().hashCode() : 0); + result = 31 * result + (getMonsterRemainBlood() != null ? getMonsterRemainBlood().hashCode() : 0); + result = 31 * result + (getMonsterStatus() != null ? getMonsterStatus().hashCode() : 0); + result = 31 * result + (getMagicId() != null ? getMagicId().hashCode() : 0); + result = 31 * result + getImpactValue(); + result = 31 * result + (getRemainMills() != null ? getRemainMills().hashCode() : 0); + result = 31 * result + (getPlayEffect() != null ? getPlayEffect().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "MonsterAttackInfo{" + + "uid='" + uid + '\'' + + ", avatar='" + avatar + '\'' + + ", nick='" + nick + '\'' + + ", monsterId='" + monsterId + '\'' + + ", monsterName='" + monsterName + '\'' + + ", monsterTotalBlood='" + monsterTotalBlood + '\'' + + ", monsterRemainBlood='" + monsterRemainBlood + '\'' + + ", monsterStatus='" + monsterStatus + '\'' + + ", magicId='" + magicId + '\'' + + ", impactValue=" + impactValue + + ", remainMills='" + remainMills + '\'' + + ", playEffect='" + playEffect + '\'' + + ", magicIcon='" + magicIcon + '\'' + + ", sequence=" + sequence + + ", beforeDisappearSeconds=" + beforeDisappearSeconds + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackReceiveInfo.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackReceiveInfo.java new file mode 100644 index 0000000..f7f03cc --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterAttackReceiveInfo.java @@ -0,0 +1,34 @@ +package com.chwl.core.monsterhunting.bean; + +/** + * Created by MadisonRong on 01/04/2018. + */ + +public class MonsterAttackReceiveInfo extends MonsterAttackInfo { + + public MonsterAttackReceiveInfo() { + super(); + } + + public MonsterAttackReceiveInfo(String uid, String avatar, String nick, String monsterId, String monsterName, String monsterTotalBlood, String monsterRemainBlood, String monsterStatus, String magicId, int impactValue, String remainMills, String playEffect, String magicIcon, int sequence, int beforeDisappearSeconds) { + super(uid, avatar, nick, monsterId, monsterName, monsterTotalBlood, monsterRemainBlood, monsterStatus, magicId, impactValue, remainMills, playEffect, magicIcon, sequence, beforeDisappearSeconds); + } + + @Override + public String toString() { + return "MonsterAttackReceiveInfo{" + + "uid='" + uid + '\'' + + ", avatar='" + avatar + '\'' + + ", nick='" + nick + '\'' + + ", monsterId='" + monsterId + '\'' + + ", monsterName='" + monsterName + '\'' + + ", monsterTotalBlood='" + monsterTotalBlood + '\'' + + ", monsterRemainBlood='" + monsterRemainBlood + '\'' + + ", monsterStatus='" + monsterStatus + '\'' + + ", magicId='" + magicId + '\'' + + ", impactValue='" + impactValue + '\'' + + ", remainMills='" + remainMills + '\'' + + ", playEffect='" + playEffect + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterDataBean.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterDataBean.java new file mode 100644 index 0000000..fbcd177 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterDataBean.java @@ -0,0 +1,345 @@ +package com.chwl.core.monsterhunting.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.Serializable; + +public class MonsterDataBean implements Serializable, Parcelable { + /** + * appearDuration : 1200 + * appearRoomUid : 91288 + * appearSvg : https://image.zhongjialx.com/FlA63Rmw5CInHnJzWHkAXKoAk6OK?imageslim + * appearTime : 1522638323000 + * attackSvg : https://image.zhongjialx.com/FpiHd4HMFgEKnrxto9yQpkUoSNxe?imageslim + * beforeAppearSeconds : 0 + * beforeDisappearSeconds : 0 + * defeatSvg : https://image.zhongjialx.com/Fmg5EuDwbTiGthM1SjEXoCtHjF5e?imageslim + * disappearTime : 1522639523000 + * escapeSvg : https://image.zhongjialx.com/Fvpz9ZdwngZ9sKXm_leOxxfIZlRB?imageslim + * hallNotifyBg : https://image.zhongjialx.com/Fu6pOIzYRBSeTPeCpKkkxMXLGdSb?imageslim + * hallNotifyClockImg : https://image.zhongjialx.com/Fu3tXK9klbKOzFW0WsrW3LvcxDky?imageslim + * monsterId : 22 + * monsterImg : https://image.zhongjialx.com/Fqaqt-S0L6gAEDLRUH8TsZBvNAIx?imageslim + * monsterName : 胡巴 + * monsterStatus : 3 + * normalSvg : https://image.zhongjialx.com/FrLbNe21dsepSLTZvfoRHxquJwrn?imageslim + * notifyMessage : 怪兽来了快跑啊快跑啊快跑啊 + * remainBlood : 0 + * roomNotifyBg : https://image.zhongjialx.com/FqaYiYQ2QeFm53BW8BXAZjEoe7pm?imageslim + * roomNotifyClockImg : https://image.zhongjialx.com/FgPUN5S6Qm8CiyI-BYlBmYEjX0V5?imageslim + * serverTime : 1522753311041 + * totalBlood : 10000 + */ + + protected int appearDuration; + protected int appearRoomUid; + protected String appearSvg; + protected long appearTime; + protected String attackSvg; + protected long beforeAppearSeconds; + protected long beforeDisappearSeconds; + protected String defeatSvg; + protected long disappearTime; + protected String escapeSvg; + protected String hallNotifyBg; + protected String hallNotifyClockImg; + protected int monsterId; + protected String monsterImg; + protected String monsterName; + protected int monsterStatus; + protected String normalSvg; + protected String notifyMessage; + protected int remainBlood; + protected String roomNotifyBg; + protected String roomNotifyClockImg; + protected long serverTime; + protected int totalBlood; + + public MonsterDataBean() { + } + + protected MonsterDataBean(Parcel in) { + appearDuration = in.readInt(); + appearRoomUid = in.readInt(); + appearSvg = in.readString(); + appearTime = in.readLong(); + attackSvg = in.readString(); + beforeAppearSeconds = in.readInt(); + beforeDisappearSeconds = in.readInt(); + defeatSvg = in.readString(); + disappearTime = in.readLong(); + escapeSvg = in.readString(); + hallNotifyBg = in.readString(); + hallNotifyClockImg = in.readString(); + monsterId = in.readInt(); + monsterImg = in.readString(); + monsterName = in.readString(); + monsterStatus = in.readInt(); + normalSvg = in.readString(); + notifyMessage = in.readString(); + remainBlood = in.readInt(); + roomNotifyBg = in.readString(); + roomNotifyClockImg = in.readString(); + serverTime = in.readLong(); + totalBlood = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public MonsterDataBean createFromParcel(Parcel in) { + return new MonsterDataBean(in); + } + + @Override + public MonsterDataBean[] newArray(int size) { + return new MonsterDataBean[size]; + } + }; + + public int getAppearDuration() { + return appearDuration; + } + + public void setAppearDuration(int appearDuration) { + this.appearDuration = appearDuration; + } + + public int getAppearRoomUid() { + return appearRoomUid; + } + + public void setAppearRoomUid(int appearRoomUid) { + this.appearRoomUid = appearRoomUid; + } + + public String getAppearSvg() { + return appearSvg; + } + + public void setAppearSvg(String appearSvg) { + this.appearSvg = appearSvg; + } + + public long getAppearTime() { + return appearTime; + } + + public void setAppearTime(long appearTime) { + this.appearTime = appearTime; + } + + public String getAttackSvg() { + return attackSvg; + } + + public void setAttackSvg(String attackSvg) { + this.attackSvg = attackSvg; + } + + + public long getBeforeAppearSeconds() { + return beforeAppearSeconds; + } + + public void setBeforeAppearSeconds(long beforeAppearSeconds) { + this.beforeAppearSeconds = beforeAppearSeconds; + } + + public long getBeforeDisappearSeconds() { + return beforeDisappearSeconds; + } + + public void setBeforeDisappearSeconds(long beforeDisappearSeconds) { + this.beforeDisappearSeconds = beforeDisappearSeconds; + } + + public String getDefeatSvg() { + return defeatSvg; + } + + public void setDefeatSvg(String defeatSvg) { + this.defeatSvg = defeatSvg; + } + + public long getDisappearTime() { + return disappearTime; + } + + public void setDisappearTime(long disappearTime) { + this.disappearTime = disappearTime; + } + + public String getEscapeSvg() { + return escapeSvg; + } + + public void setEscapeSvg(String escapeSvg) { + this.escapeSvg = escapeSvg; + } + + public String getHallNotifyBg() { + return hallNotifyBg; + } + + public void setHallNotifyBg(String hallNotifyBg) { + this.hallNotifyBg = hallNotifyBg; + } + + public String getHallNotifyClockImg() { + return hallNotifyClockImg; + } + + public void setHallNotifyClockImg(String hallNotifyClockImg) { + this.hallNotifyClockImg = hallNotifyClockImg; + } + + public int getMonsterId() { + return monsterId; + } + + public void setMonsterId(int monsterId) { + this.monsterId = monsterId; + } + + public String getMonsterImg() { + return monsterImg; + } + + public void setMonsterImg(String monsterImg) { + this.monsterImg = monsterImg; + } + + public String getMonsterName() { + return monsterName; + } + + public void setMonsterName(String monsterName) { + this.monsterName = monsterName; + } + + public int getMonsterStatus() { + return monsterStatus; + } + + public void setMonsterStatus(int monsterStatus) { + this.monsterStatus = monsterStatus; + } + + public String getNormalSvg() { + return normalSvg; + } + + public void setNormalSvg(String normalSvg) { + this.normalSvg = normalSvg; + } + + public String getNotifyMessage() { + return notifyMessage; + } + + public void setNotifyMessage(String notifyMessage) { + this.notifyMessage = notifyMessage; + } + + public int getRemainBlood() { + return remainBlood; + } + + public void setRemainBlood(int remainBlood) { + this.remainBlood = remainBlood; + } + + public String getRoomNotifyBg() { + return roomNotifyBg; + } + + public void setRoomNotifyBg(String roomNotifyBg) { + this.roomNotifyBg = roomNotifyBg; + } + + public String getRoomNotifyClockImg() { + return roomNotifyClockImg; + } + + public void setRoomNotifyClockImg(String roomNotifyClockImg) { + this.roomNotifyClockImg = roomNotifyClockImg; + } + + public long getServerTime() { + return serverTime; + } + + public void setServerTime(long serverTime) { + this.serverTime = serverTime; + } + + public int getTotalBlood() { + return totalBlood; + } + + public void setTotalBlood(int totalBlood) { + this.totalBlood = totalBlood; + } + + @Override + public String toString() { + return "DataBean{" + + "appearDuration=" + appearDuration + + ", appearRoomUid=" + appearRoomUid + + ", appearSvg='" + appearSvg + '\'' + + ", appearTime=" + appearTime + + ", attackSvg='" + attackSvg + '\'' + + ", beforeAppearSeconds=" + beforeAppearSeconds + + ", beforeDisappearSeconds=" + beforeDisappearSeconds + + ", defeatSvg='" + defeatSvg + '\'' + + ", disappearTime=" + disappearTime + + ", escapeSvg='" + escapeSvg + '\'' + + ", hallNotifyBg='" + hallNotifyBg + '\'' + + ", hallNotifyClockImg='" + hallNotifyClockImg + '\'' + + ", monsterId=" + monsterId + + ", monsterImg='" + monsterImg + '\'' + + ", monsterName='" + monsterName + '\'' + + ", monsterStatus=" + monsterStatus + + ", normalSvg='" + normalSvg + '\'' + + ", notifyMessage='" + notifyMessage + '\'' + + ", remainBlood=" + remainBlood + + ", roomNotifyBg='" + roomNotifyBg + '\'' + + ", roomNotifyClockImg='" + roomNotifyClockImg + '\'' + + ", serverTime=" + serverTime + + ", totalBlood=" + totalBlood + + '}'; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(appearDuration); + dest.writeInt(appearRoomUid); + dest.writeString(appearSvg); + dest.writeLong(appearTime); + dest.writeString(attackSvg); + dest.writeLong(beforeAppearSeconds); + dest.writeLong(beforeDisappearSeconds); + dest.writeString(defeatSvg); + dest.writeLong(disappearTime); + dest.writeString(escapeSvg); + dest.writeString(hallNotifyBg); + dest.writeString(hallNotifyClockImg); + dest.writeInt(monsterId); + dest.writeString(monsterImg); + dest.writeString(monsterName); + dest.writeInt(monsterStatus); + dest.writeString(normalSvg); + dest.writeString(notifyMessage); + dest.writeInt(remainBlood); + dest.writeString(roomNotifyBg); + dest.writeString(roomNotifyClockImg); + dest.writeLong(serverTime); + dest.writeInt(totalBlood); + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterEvent.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterEvent.java new file mode 100644 index 0000000..80ecd70 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterEvent.java @@ -0,0 +1,104 @@ +package com.chwl.core.monsterhunting.bean; + +/** + * Created by MadisonRong on 03/04/2018. + */ + +public class MonsterEvent { + + public static final int ANIMATION_LOADED = 1; + + public static final int MONSTER_APPEAR_ANIMATION_FINISHED = 2; + + public static final int MONSTER_LOTTERY_ANIMATION_FINISHED = 3; + + public static final int MONSTER_ATTACK_ANIMATION_FINISHED = 4; + + public static final int MONSTER_DEFAT_ANIMATION_START = 27; + + public static final int MONSTER_DEFEAT_ANIMATION_FINISHED = 5; + + public static final int MONSTER_HUNTING_TIME_OUT = 6; + + public static final int MONSTER_LAYOUT_SHOW_IN_ANIMATION_START = 7; + + public static final int MONSTER_LAYOUT_SHOW_IN_ANIMATION_FINISHED = 8; + + public static final int MONSTER_LAYOUT_SHOW_OUT_ANIMATION_START = 9; + + public static final int MONSTER_LAYOUT_SHOW_OUT_ANIMATION_FINISHED = 10; + + public static final int MONSTER_INFO_LAYOUT_SHOW_IN_ANIMATION_START = 11; + + public static final int MONSTER_INFO_LAYOUT_SHOW_IN_ANIMATION_FINISHED = 12; + + public static final int MONSTER_INFO_LAYOUT_SHOW_OUT_ANIMATION_START = 13; + + public static final int MONSTER_INFO_LAYOUT_SHOW_OUT_ANIMATION_FINISHED = 14; + + public static final int MONSTER_MAGIC_LAYOUT_SHOW_IN_ANIMATION_START = 15; + + public static final int MONSTER_MAGIC_LAYOUT_SHOW_IN_ANIMATION_FINISHED = 16; + + public static final int MONSTER_MAGIC_LAYOUT_SHOW_OUT_ANIMATION_START = 17; + + public static final int MONSTER_MAGIC_LAYOUT_SHOW_OUT_ANIMATION_FINISHED = 18; + + public static final int MONSTER_COUNT_DOWN_SHOW_IN_ANIMATION_START = 19; + + public static final int MONSTER_COUNT_DOWN_SHOW_IN_ANIMATION_FINISHED = 20; + + public static final int MONSTER_COUNT_DOWN_SHOW_OUT_ANIMATION_START = 21; + + public static final int MONSTER_COUNT_DOWN_SHOW_OUT_ANIMATION_FINISHED = 22; + + public static final int MONSTER_CLOSE_SHOW_IN_ANIMATION_START = 23; + + public static final int MONSTER_CLOSE_SHOW_IN_ANIMATION_FINISHED = 24; + + public static final int MONSTER_CLOSE_SHOW_OUT_ANIMATION_START = 25; + + public static final int MONSTER_CLOSE_SHOW_OUT_ANIMATION_FINISHED = 26; + + public static final int MONSTER_IMPACT_SHOW_OUT_ANIMATION_START = 28; + + public static final int MONSTER_IMPACT_SHOW_OUT_ANIMATION_FINISHED = 29; + + public static final int TYPE_BROADCAST = 0; + public static final int TYPE_ALREADY_FINISHED = 1; + + private int event; + + private int type; + + private MonsterDataBean dataBean; + + public MonsterEvent() { + } + + public MonsterEvent(int event) { + this.event = event; + } + + public int getEvent() { + return event; + } + + public MonsterEvent setType(int type) { + this.type = type; + return this; + } + + public int getType() { + return type; + } + + public MonsterDataBean getDataBean() { + return dataBean; + } + + public MonsterEvent setDataBean(MonsterDataBean dataBean) { + this.dataBean = dataBean; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHunter.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHunter.java new file mode 100644 index 0000000..4ac601e --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHunter.java @@ -0,0 +1,111 @@ +package com.chwl.core.monsterhunting.bean; + +/** + * Created by MadisonRong on 02/04/2018. + */ + +public class MonsterHunter { + + private String uid; + + private String erbanNo; + + private String avatar; + + private String nick; + + /** + * 总伤害值 + */ + private String hurt; + + public MonsterHunter() { + } + + public MonsterHunter(String uid, String erbanNo, String avatar, String nick, String hurt) { + this.uid = uid; + this.erbanNo = erbanNo; + this.avatar = avatar; + this.nick = nick; + this.hurt = hurt; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getErbanNo() { + return erbanNo; + } + + public void setErbanNo(String erbanNo) { + this.erbanNo = erbanNo; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getHurt() { + return hurt; + } + + public void setHurt(String hurt) { + this.hurt = hurt; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MonsterHunter)) return false; + + MonsterHunter that = (MonsterHunter) o; + + if (getUid() != null ? !getUid().equals(that.getUid()) : that.getUid() != null) + return false; + if (getErbanNo() != null ? !getErbanNo().equals(that.getErbanNo()) : that.getErbanNo() != null) + return false; + if (getAvatar() != null ? !getAvatar().equals(that.getAvatar()) : that.getAvatar() != null) + return false; + if (getNick() != null ? !getNick().equals(that.getNick()) : that.getNick() != null) + return false; + return getHurt() != null ? getHurt().equals(that.getHurt()) : that.getHurt() == null; + } + + @Override + public int hashCode() { + int result = getUid() != null ? getUid().hashCode() : 0; + result = 31 * result + (getErbanNo() != null ? getErbanNo().hashCode() : 0); + result = 31 * result + (getAvatar() != null ? getAvatar().hashCode() : 0); + result = 31 * result + (getNick() != null ? getNick().hashCode() : 0); + result = 31 * result + (getHurt() != null ? getHurt().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "MonsterHunter{" + + "uid='" + uid + '\'' + + ", erbanNo='" + erbanNo + '\'' + + ", avatar='" + avatar + '\'' + + ", nick='" + nick + '\'' + + ", hurt='" + hurt + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingResult.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingResult.java new file mode 100644 index 0000000..9d30a2e --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingResult.java @@ -0,0 +1,91 @@ +package com.chwl.core.monsterhunting.bean; + +import java.util.List; + +/** + * Created by MadisonRong on 02/04/2018. + */ + +public class MonsterHuntingResult { + + private MonsterHunter luckyDog; + + private List awards; + + private List ranking; + + private MonsterDataBean monster; + + public MonsterHuntingResult() { + } + + public MonsterHuntingResult(MonsterHunter luckyDog, List awards, List ranking) { + this.luckyDog = luckyDog; + this.awards = awards; + this.ranking = ranking; + } + + public MonsterHunter getLuckyDog() { + return luckyDog; + } + + public void setLuckyDog(MonsterHunter luckyDog) { + this.luckyDog = luckyDog; + } + + public List getAwards() { + return awards; + } + + public void setAwards(List awards) { + this.awards = awards; + } + + public List getRanking() { + return ranking; + } + + public void setRanking(List ranking) { + this.ranking = ranking; + } + + public MonsterDataBean getMonster() { + return monster; + } + + public void setMonster(MonsterDataBean monster) { + this.monster = monster; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MonsterHuntingResult)) return false; + + MonsterHuntingResult that = (MonsterHuntingResult) o; + + if (getLuckyDog() != null ? !getLuckyDog().equals(that.getLuckyDog()) : that.getLuckyDog() != null) + return false; + if (getAwards() != null ? !getAwards().equals(that.getAwards()) : that.getAwards() != null) + return false; + return getRanking() != null ? getRanking().equals(that.getRanking()) : that.getRanking() == null; + } + + @Override + public int hashCode() { + int result = getLuckyDog() != null ? getLuckyDog().hashCode() : 0; + result = 31 * result + (getAwards() != null ? getAwards().hashCode() : 0); + result = 31 * result + (getRanking() != null ? getRanking().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "MonsterHuntingResult{" + + "luckyDog=" + luckyDog + + ", awards=" + awards + + ", ranking=" + ranking + + ", monster=" + monster + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingReward.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingReward.java new file mode 100644 index 0000000..0ed958d --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterHuntingReward.java @@ -0,0 +1,158 @@ +package com.chwl.core.monsterhunting.bean; + +/** + * Created by MadisonRong on 02/04/2018. + */ + +public class MonsterHuntingReward { + + public static final int REWARD_GOLD = 1; + public static final int REWARD_ACCOUNT = 2; + public static final int REWARD_CAR = 3; + public static final int REWARD_PHYSICAL = 4; + + private String prodId; + + /** + * 奖品类型 + * @see #REWARD_GOLD 钻石 + * @see #REWARD_ACCOUNT 靓号 + * @see #REWARD_CAR 座驾 + * @see #REWARD_PHYSICAL 实物 + */ + private String prodType; + + private String prodName; + + private String prodValue; + + private int expireDays; + + private String prodImage; + + private String monsterId; + + public MonsterHuntingReward() { + } + + public MonsterHuntingReward(String prodId, String prodType, String prodName, String prodValue, String prodImage, String monsterId) { + this.prodId = prodId; + this.prodType = prodType; + this.prodName = prodName; + this.prodValue = prodValue; + this.prodImage = prodImage; + this.monsterId = monsterId; + } + + public MonsterHuntingReward(String prodId, String prodType, String prodName, String prodValue, int expireDays, String prodImage, String monsterId) { + this.prodId = prodId; + this.prodType = prodType; + this.prodName = prodName; + this.prodValue = prodValue; + this.expireDays = expireDays; + this.prodImage = prodImage; + this.monsterId = monsterId; + } + + public String getProdId() { + return prodId; + } + + public void setProdId(String prodId) { + this.prodId = prodId; + } + + public String getProdType() { + return prodType; + } + + public void setProdType(String prodType) { + this.prodType = prodType; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public String getProdValue() { + return prodValue; + } + + public void setProdValue(String prodValue) { + this.prodValue = prodValue; + } + + public String getProdImage() { + return prodImage; + } + + public void setProdImage(String prodImage) { + this.prodImage = prodImage; + } + + public String getMonsterId() { + return monsterId; + } + + public void setMonsterId(String monsterId) { + this.monsterId = monsterId; + } + + public int getExpireDays() { + return expireDays; + } + + public void setExpireDays(int expireDays) { + this.expireDays = expireDays; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MonsterHuntingReward)) return false; + + MonsterHuntingReward that = (MonsterHuntingReward) o; + + if (getExpireDays() != that.getExpireDays()) return false; + if (getProdId() != null ? !getProdId().equals(that.getProdId()) : that.getProdId() != null) + return false; + if (getProdType() != null ? !getProdType().equals(that.getProdType()) : that.getProdType() != null) + return false; + if (getProdName() != null ? !getProdName().equals(that.getProdName()) : that.getProdName() != null) + return false; + if (getProdValue() != null ? !getProdValue().equals(that.getProdValue()) : that.getProdValue() != null) + return false; + if (getProdImage() != null ? !getProdImage().equals(that.getProdImage()) : that.getProdImage() != null) + return false; + return getMonsterId() != null ? getMonsterId().equals(that.getMonsterId()) : that.getMonsterId() == null; + } + + @Override + public int hashCode() { + int result = getProdId() != null ? getProdId().hashCode() : 0; + result = 31 * result + (getProdType() != null ? getProdType().hashCode() : 0); + result = 31 * result + (getProdName() != null ? getProdName().hashCode() : 0); + result = 31 * result + (getProdValue() != null ? getProdValue().hashCode() : 0); + result = 31 * result + getExpireDays(); + result = 31 * result + (getProdImage() != null ? getProdImage().hashCode() : 0); + result = 31 * result + (getMonsterId() != null ? getMonsterId().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "MonsterHuntingReward{" + + "prodId='" + prodId + '\'' + + ", prodType='" + prodType + '\'' + + ", prodName='" + prodName + '\'' + + ", prodValue='" + prodValue + '\'' + + ", expireDays=" + expireDays + + ", prodImage='" + prodImage + '\'' + + ", monsterId='" + monsterId + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInfo.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInfo.java new file mode 100644 index 0000000..de11569 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInfo.java @@ -0,0 +1,39 @@ +package com.chwl.core.monsterhunting.bean; + +import android.os.Parcel; + +/** + * Created by MadisonRong on 30/03/2018. + */ + +public class MonsterInfo extends MonsterDataBean { + /** + * 未开始 (即将出现) + */ + public static final int MONSTER_STATUS_WILL_APPEAR = 1; + + /** + * 开始 (已出现) + */ + public static final int MONSTER_STATUS_DID_APPEAR = 2; + + /** + * 怪兽死亡 (怪兽被打败) + */ + public static final int MONSTER_STATUS_DID_DEAD = 3; + + /** + * 离开 (怪兽已逃走) + */ + public static final int MONSTER_STATUS_DID_LEAVE = 4; + + /** + * 结果 + */ + public static final int MONSTER_RESULT_SHOWN = 5; + + + protected MonsterInfo(Parcel in) { + super(in); + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInitInfo.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInitInfo.java new file mode 100644 index 0000000..8329b96 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterInitInfo.java @@ -0,0 +1,56 @@ +package com.chwl.core.monsterhunting.bean; + +import java.io.Serializable; + +/** + * Created by huangmeng1 on 2018/4/2. + */ + +public class MonsterInitInfo implements Serializable { + private String monsterId; + private String monsterName; + private String appearRoom ; + private String appearTime; + + public String getMonsterId() { + return monsterId; + } + + public void setMonsterId(String monsterId) { + this.monsterId = monsterId; + } + + public String getMonsterName() { + return monsterName; + } + + public void setMonsterName(String monsterName) { + this.monsterName = monsterName; + } + + public String getAppearRoom() { + return appearRoom; + } + + public void setAppearRoom(String appearRoom) { + this.appearRoom = appearRoom; + } + + public String getAppearTime() { + return appearTime; + } + + public void setAppearTime(String appearTime) { + this.appearTime = appearTime; + } + + @Override + public String toString() { + return "MonsterInitInfo{" + + "monsterId='" + monsterId + '\'' + + ", monsterName='" + monsterName + '\'' + + ", appearRoom='" + appearRoom + '\'' + + ", appearTime='" + appearTime + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterListInfo.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterListInfo.java new file mode 100644 index 0000000..ab73fa0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterListInfo.java @@ -0,0 +1,171 @@ +package com.chwl.core.monsterhunting.bean; + +/** + * Created by huangmeng1 on 2018/4/2. + */ + +public class MonsterListInfo { + /** + * monsterId : 1 + * monsterName : 年兽 + * monsterStatus : 1 + * appearRoom : 9081 + * totalBlood : 1000000 + * remainBlood : 100000 + * appearSvg : xxx + * normalSvg : xxx + * attackSvg : xxx + * defeatSvg : xxx + * escapeSvg : xxx + * hallNotifyBg : xxx + * roomNotifyBg : xxx + * appearTime : 1522481721280 + * appearDuration : 180 + * disappearTime : 1522481809842 + */ + + private int monsterId; + private String monsterName; + private int monsterStatus; + private int appearRoom; + private int totalBlood; + private int remainBlood; + private String appearSvg; + private String normalSvg; + private String attackSvg; + private String defeatSvg; + private String escapeSvg; + private String hallNotifyBg; + private String roomNotifyBg; + private long appearTime; + private int appearDuration; + private long disappearTime; + + public int getMonsterId() { + return monsterId; + } + + public void setMonsterId(int monsterId) { + this.monsterId = monsterId; + } + + public String getMonsterName() { + return monsterName; + } + + public void setMonsterName(String monsterName) { + this.monsterName = monsterName; + } + + public int getMonsterStatus() { + return monsterStatus; + } + + public void setMonsterStatus(int monsterStatus) { + this.monsterStatus = monsterStatus; + } + + public int getAppearRoom() { + return appearRoom; + } + + public void setAppearRoom(int appearRoom) { + this.appearRoom = appearRoom; + } + + public int getTotalBlood() { + return totalBlood; + } + + public void setTotalBlood(int totalBlood) { + this.totalBlood = totalBlood; + } + + public int getRemainBlood() { + return remainBlood; + } + + public void setRemainBlood(int remainBlood) { + this.remainBlood = remainBlood; + } + + public String getAppearSvg() { + return appearSvg; + } + + public void setAppearSvg(String appearSvg) { + this.appearSvg = appearSvg; + } + + public String getNormalSvg() { + return normalSvg; + } + + public void setNormalSvg(String normalSvg) { + this.normalSvg = normalSvg; + } + + public String getAttackSvg() { + return attackSvg; + } + + public void setAttackSvg(String attackSvg) { + this.attackSvg = attackSvg; + } + + public String getDefeatSvg() { + return defeatSvg; + } + + public void setDefeatSvg(String defeatSvg) { + this.defeatSvg = defeatSvg; + } + + public String getEscapeSvg() { + return escapeSvg; + } + + public void setEscapeSvg(String escapeSvg) { + this.escapeSvg = escapeSvg; + } + + public String getHallNotifyBg() { + return hallNotifyBg; + } + + public void setHallNotifyBg(String hallNotifyBg) { + this.hallNotifyBg = hallNotifyBg; + } + + public String getRoomNotifyBg() { + return roomNotifyBg; + } + + public void setRoomNotifyBg(String roomNotifyBg) { + this.roomNotifyBg = roomNotifyBg; + } + + public long getAppearTime() { + return appearTime; + } + + public void setAppearTime(long appearTime) { + this.appearTime = appearTime; + } + + public int getAppearDuration() { + return appearDuration; + } + + public void setAppearDuration(int appearDuration) { + this.appearDuration = appearDuration; + } + + public long getDisappearTime() { + return disappearTime; + } + + public void setDisappearTime(long disappearTime) { + this.disappearTime = disappearTime; + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterProtocol.java b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterProtocol.java new file mode 100644 index 0000000..41d3e3b --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/bean/MonsterProtocol.java @@ -0,0 +1,12 @@ +package com.chwl.core.monsterhunting.bean; + +import com.chwl.core.bean.BaseProtocol; + +/** + * Created by huangmeng1 on 2018/4/2. + */ + +public class MonsterProtocol extends BaseProtocol { + + +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/manager/MonsterDataManager.java b/core/src/main/java/com/chwl/core/monsterhunting/manager/MonsterDataManager.java new file mode 100644 index 0000000..70dfcc9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/manager/MonsterDataManager.java @@ -0,0 +1,57 @@ +package com.chwl.core.monsterhunting.manager; + +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.monsterhunting.bean.MonsterInfo; +import com.chwl.core.monsterhunting.bean.MonsterInitInfo; + +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + +/** + * Created by huangmeng1 on 2018/4/2. + */ + +public class MonsterDataManager { + + private static MonsterDataManager mInstance; + + public static MonsterDataManager get() { + if (mInstance == null) { + synchronized (MonsterDataManager.class) { + if (mInstance == null) { + mInstance = new MonsterDataManager(); + } + } + } + return mInstance; + } + + private List list; + + private volatile Map monsterInfoMap = new Hashtable<>(); + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + private MonsterInfo monsterInfo; + + public MonsterInfo getMonsterInfo(long roomUid) { + return monsterInfoMap.get(roomUid); + } + + public void setMonsterInfo(long roomUid, MonsterInfo monsterInfo) { + monsterInfoMap.put(roomUid, monsterInfo); + } + + public MonsterInfo getCurrentRoomMonsterInfo() { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) return null; + long roomUid = AvRoomDataManager.get().mCurrentRoomInfo.getUid(); + return getMonsterInfo(roomUid); + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/model/IMonsterHuntingModel.java b/core/src/main/java/com/chwl/core/monsterhunting/model/IMonsterHuntingModel.java new file mode 100644 index 0000000..f825a9b --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/model/IMonsterHuntingModel.java @@ -0,0 +1,38 @@ +package com.chwl.core.monsterhunting.model; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.monsterhunting.bean.MonsterAttackInfo; +import com.chwl.core.monsterhunting.bean.MonsterHuntingResult; +import com.chwl.core.monsterhunting.bean.MonsterInfo; + +import io.reactivex.Single; + +public interface IMonsterHuntingModel extends IModel { + + Single> attackMonster(String monsterId,String roomUid,String magicId); + + Single> getRoomMonsterList(); + + Single> getRoomMonsterHuntingResult(String monsterId) ; + + /** + * 发送云信自定义信息(打怪兽) + * + * @param monsterAttackReceiveInfo - + * @return - + */ + Single sendMonsterHuntingMagicMessage(MonsterAttackInfo monsterAttackReceiveInfo); + + void onSendMonsterAttackMessageSuccess(ChatRoomMessage msg); + + /** + * 获取怪兽列表 + * @param roomId + * @param ticket + * @return + */ + void getMonsterList(String roomId, String ticket); + +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/model/MonsterHuntingModel.java b/core/src/main/java/com/chwl/core/monsterhunting/model/MonsterHuntingModel.java new file mode 100644 index 0000000..0386b73 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/model/MonsterHuntingModel.java @@ -0,0 +1,478 @@ +package com.chwl.core.monsterhunting.model; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_MONSTER_HUNTING; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_NOTI_SUB_GAME_END; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_NOTI_SUB_GAME_RESULT; + +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.monsterhunting.bean.MonsterDataBean; +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.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.model.BroadcastMessage; +import com.orhanobut.logger.Logger; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.BaseProtocol; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.MonsterAttackAttachment; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.monsterhunting.bean.MonsterAttackInfo; +import com.chwl.core.monsterhunting.bean.MonsterHuntingResult; +import com.chwl.core.monsterhunting.bean.MonsterInfo; +import com.chwl.core.monsterhunting.bean.MonsterProtocol; +import com.chwl.core.monsterhunting.rxevent.MonsterUpdateEvent; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.rxbus.RxBusHelper; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by MadisonRong on 29/03/2018. + */ + +public class MonsterHuntingModel extends BaseModel implements IMonsterHuntingModel { + private final static String TAG = MonsterHuntingModel.class.getSimpleName(); + private Api api; + private UiHandler handler = new UiHandler(this); + private List magicQueue; + private final static List monsterList = new LinkedList<>(); + private volatile static CountDownTimer countDownTimer;//这里不写成static 出现正在倒计时,但是null == countDownTimer 判读为 true?? + + private volatile static IMonsterHuntingModel instance; + + public static IMonsterHuntingModel get() { + if (instance == null) { + synchronized (MonsterHuntingModel.class) { + if (instance == null) { + instance = new MonsterHuntingModel(); + } + } + } + return instance; + } + + private MonsterHuntingModel() { + api = RxNet.create(Api.class); + magicQueue = new ArrayList<>(); + registerMonsterBroadcastMessage(); + } + + @Override + public Single> attackMonster(String monsterId, + String roomUid, + String magicId) { + String ticket = AuthModel.get().getTicket(); + long uid = AuthModel.get().getCurrentUid(); + return api.attackMonster(String.valueOf(uid), monsterId, roomUid, magicId, ticket) + .compose(new Transformer<>()); + } + + @Override + public Single> getRoomMonsterList() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new Throwable(ResUtil.getString(R.string.monsterhunting_model_monsterhuntingmodel_01))); + String ticket = AuthModel.get().getTicket(); + return api.getRoomMonsterList(String.valueOf(roomInfo.getUid()), ticket) + .compose(new Transformer<>()); + } + + @Override + public Single> getRoomMonsterHuntingResult(String monsterId) { + String ticket = AuthModel.get().getTicket(); + return api.getRoomMonsterHuntingResult(monsterId, ticket) + .compose(new Transformer<>()); + } + + + /** + * 发送云信自定义信息(打怪兽) + * + * @param monsterAttackReceiveInfo - + * @return - + */ + @Override + public Single sendMonsterHuntingMagicMessage(MonsterAttackInfo monsterAttackReceiveInfo) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null || monsterAttackReceiveInfo == null) + return Single.error(new Throwable(ResUtil.getString(R.string.monsterhunting_model_monsterhuntingmodel_02))); + long myUid = AuthModel.get().getCurrentUid(); + MonsterAttackAttachment monsterAttackAttachment = new MonsterAttackAttachment(); + monsterAttackAttachment.setUid(String.valueOf(myUid)); + monsterAttackAttachment.setMonsterAttackInfo(monsterAttackReceiveInfo); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + monsterAttackAttachment + ); + return IMNetEaseManager.get().sendChatRoomMessage(message, false); + } + + @Override + public void onSendMonsterAttackMessageSuccess(ChatRoomMessage msg) { + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING) { + magicQueue.add(attachment); + if (magicQueue.size() == 1) { + handler.sendEmptyMessageDelayed(0, 150); + } + } + } + } + + private void parseChatRoomAttachment(CustomAttachment attachment) { + if (attachment.getFirst() != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING) return; + if (attachment.getSecond() == CustomAttachment.CUSTOM_NOTI_SUB_GAME_ATTACK) { + MonsterAttackAttachment monsterAttackAttachment = (MonsterAttackAttachment) attachment; + IMNetEaseManager.get().getChatRoomEventObservable().onNext(new RoomEvent() + .setEvent(RoomEvent.MONSTER_HUNTING) + .setMonsterAttackReceiveInfo(monsterAttackAttachment.getMonsterAttackReceiveInfo())); + } + } + + private static class UiHandler extends Handler { + WeakReference mReference; + + UiHandler(MonsterHuntingModel monsterHuntingModel) { + mReference = new WeakReference<>(monsterHuntingModel); + } + + @Override + public void handleMessage(Message msg) { + MonsterHuntingModel monsterHuntingModel = mReference.get(); + if (monsterHuntingModel == null) return; + super.handleMessage(msg); + if (monsterHuntingModel.magicQueue.size() > 0) { + CustomAttachment attachment = monsterHuntingModel.magicQueue.remove(0); + if (attachment != null) + monsterHuntingModel.parseChatRoomAttachment(attachment); + } + + if (monsterHuntingModel.magicQueue.size() > 0) { + sendEmptyMessageDelayed(0, 150); + } + } + } + + + /** + * 获取怪兽列表 + * @param roomId + * @param ticket + * @return + */ + @Override + public void getMonsterList(String roomId, String ticket){ + monsterList.clear(); + api.getMonsterList(roomId, ticket).compose(new Transformer<>()) + .subscribe(new Consumer>>() { + @Override + public void accept(ServiceResult> listServiceResult) throws Exception { + List data = listServiceResult.getData(); + if (!ListUtils.isListEmpty(data)) { + for (int i = 0; i < data.size(); i++) { + MonsterDataBean monsterInfos = data.get(i); + if (monsterInfos.getBeforeAppearSeconds() <= 180) { + refreshMonster(monsterInfos); + } + } + + } + } + }); + } + + + /** + * 有怪兽就刷新怪兽,没有怪兽就添加怪兽 + * @param data + * @return + */ + private void refreshMonster(MonsterDataBean data) { + boolean isFindMonster = false; + int size = monsterList.size(); + for (int i = 0; i < size; i++) { + MonsterDataBean monsterInfos = monsterList.get(i); + if (monsterInfos.getMonsterId() == data.getMonsterId()){ + isFindMonster = true; + monsterList.set(i, data); + break; + } + } + if (!isFindMonster){ + monsterList.add(data); + } + RxBusHelper.post(new MonsterUpdateEvent(monsterList)); + startCountTime(); + } + + /** + * 怪兽倒计时 + */ + private void startCountTime(){ + if (null == countDownTimer){ +// Logger.e("countDownTimer new one~~~" + "\n model->" + instance.toString()); + countDownTimer = new CountDownTimer(5 * 60 * 1000, 1000) { + @Override + public void onTick(long millisUntilFinished) { +// Logger.e("onTick thread ->" + Thread.currentThread().getName() +// +"\n countDownTimer->" +countDownTimer.toString() +// + "\n model->" + instance.toString()); + + boolean isNeedUpdate = false; + int size = monsterList.size(); + for (int i = 0; i < size; i++) { + MonsterDataBean monsterInfos = monsterList.get(i); + if (monsterInfos.getBeforeAppearSeconds() > 0){ + monsterInfos.setBeforeAppearSeconds(monsterInfos.getBeforeAppearSeconds() - 1); + isNeedUpdate = true; + } +// if (monsterInfos.getBeforeDisappearSeconds() > 0){ +// monsterInfos.setBeforeDisappearSeconds(monsterInfos.getBeforeDisappearSeconds() - 1); +// isNeedUpdate = true; +// } + } + if (isNeedUpdate) { +// Logger.e(TAG,"countDownTimer->" + countDownTimer.toString()+"monsterList.size->" + monsterList.size() +// + "\n model->" + instance.toString()); + RxBusHelper.post(new MonsterUpdateEvent(monsterList)); + } + } + + @Override + public void onFinish() { + countDownTimer = null; +// Logger.e("countDownTimer finish ~~~"); + //计时结束后还有怪兽时间不为0 重新开始计时 + boolean isNeedCountTime = false; + int size = monsterList.size(); + for (int i = 0; i < size; i++) { + MonsterDataBean monsterInfos = monsterList.get(i); +// if (monsterInfos.getBeforeAppearSeconds() > 0 || monsterInfos.getBeforeDisappearSeconds() > 0 ){ + if (monsterInfos.getBeforeAppearSeconds() > 0 ){ + isNeedCountTime = true; + } + } + if (isNeedCountTime) { + startCountTime(); + } + } + }; + countDownTimer.start(); + } + } + + + /** + * 注册云信全服广播接收器 + */ + private void registerMonsterBroadcastMessage() { + NIMSDK.getMsgServiceObserve().observeBroadcastMessage((Observer) broadcastMessage -> { + if (broadcastMessage != null) { + String contentStr = broadcastMessage.getContent(); + Logger.i(ResUtil.getString(R.string.monsterhunting_model_monsterhuntingmodel_03) + contentStr); + if (TextUtils.isEmpty(contentStr)) return; + JSONObject jsonObject = JSON.parseObject(contentStr); + if (jsonObject == null) return; + if (jsonObject.containsKey("body")) { + String body = jsonObject.getString("body"); + if (TextUtils.isEmpty(body)) return; + onReceivedNimBroadcastMessage(body); + } + } + }, true); + } + + /** + * 处理怪兽广播消息 + * @param body + */ + private void onReceivedNimBroadcastMessage(String body) { + LogUtil.e("mylog", ResUtil.getString(R.string.monsterhunting_model_monsterhuntingmodel_04) + body); + BaseProtocol baseProtocol; + try { + baseProtocol = JSON.parseObject(body, BaseProtocol.class); + } catch (Exception e) { + baseProtocol = null; + } + + if (baseProtocol == null) return; + if (baseProtocol.getFirst() == CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING) { + MonsterProtocol monsterProtocol; + MonsterDataBean data; + switch (baseProtocol.getSecond()) { + case CUSTOM_MSG_SUB_TYPE_MONSTER_HUNTING: + monsterProtocol = JSON.parseObject(body, MonsterProtocol.class); + data = monsterProtocol.getData(); + //列表存在这个怪兽就刷新,没有就添加 + refreshMonster(data); + break; + case CUSTOM_NOTI_SUB_GAME_END: + // 对于 172, 只处理怪兽逃跑的情况 + monsterProtocol = JSON.parseObject(body, MonsterProtocol.class); + data = monsterProtocol.getData(); + Log.e(TAG, String.format("hotFragment: first: %s, second: %s", + String.valueOf(baseProtocol.getFirst()), String.valueOf(baseProtocol.getSecond()))); + Log.e(TAG, String.format("hotFragment: status: %s, notifyMessage: %s", + data.getMonsterStatus(), data.getNotifyMessage())); + switch (data.getMonsterStatus()) { + case MonsterInfo.MONSTER_STATUS_DID_LEAVE: + + refreshMonster(data); + // 保留 10 秒 + Single.just(data).delay(10, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(data1 -> { + //移除怪兽 + int size = monsterList.size(); + for (int i = 0; i < size; i++) { + MonsterDataBean monsterInfos = monsterList.get(i); + if (monsterInfos.getMonsterId() == data1.getMonsterId()){ + monsterList.remove(i); + RxBusHelper.post(new MonsterUpdateEvent(monsterList)); + break; + } + } + }); + + break; + default: + + } + break; + case CUSTOM_NOTI_SUB_GAME_RESULT: + // 对于 173, 由于结构体不一样,需要先取出 monster 实体,再更新到 adapter 里 + MonsterHuntingResult result = JSON.parseObject( + JSON.toJSONString(baseProtocol.getData()), MonsterHuntingResult.class); + Log.e(TAG, String.format("hotFragment: first: %s, second: %s", + String.valueOf(baseProtocol.getFirst()), String.valueOf(baseProtocol.getSecond()))); + if (result.getMonster() != null) { + Log.e(TAG, String.format("hotFragment: status: %s, notifyMessage: %s", + result.getMonster().getMonsterStatus(), result.getMonster().getNotifyMessage())); + switch (result.getMonster().getMonsterStatus()) { + case MonsterInfo.MONSTER_STATUS_DID_DEAD: + + refreshMonster(result.getMonster()); + + // 保留 30 秒,并且点击可以跳转到排行榜 H5 页面 + Single.just(result.getMonster()).delay(30,TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + @Override + public void accept(MonsterDataBean data) throws Exception { + //移除怪兽 + int size = monsterList.size(); + for (int i = 0; i < size; i++) { + MonsterDataBean monsterInfos = monsterList.get(i); + if (monsterInfos.getMonsterId() == data.getMonsterId()){ + monsterList.remove(i); + RxBusHelper.post(new MonsterUpdateEvent(monsterList)); + break; + } + } + } + }); + break; + } + } + break; + case CustomAttachment.CUSTOM_MESS_TAROT: + + break; + default: + break; + + } + + } + + } + + private interface Api { + /** + * 攻击怪兽 + * @param uid 魔法师UID + * @param monsterId 怪兽 id + * @param roomUid 房间用户 id + * @param magicId 魔法 id + * @param ticket 授权码 + */ + @POST("/v1/monster/attack") + @FormUrlEncoded + Single> attackMonster(@Field("uid") String uid, + @Field("monsterId") String monsterId, + @Field("roomUid") String roomUid, + @Field("magicId") String magicId, + @Field("ticket") String ticket); + + /** + * 查询未出现/已出现怪兽接口 + * @param roomUid 房主的用户 id + * @param ticket 授权码 + */ + @GET("/v1/monster/ongoing") + Single> getRoomMonsterList( + @Query("roomUid") String roomUid, @Query("ticket") String ticket); + + /** + * 查询打爆怪兽抽奖结果接口 + * @param monsterId 怪兽 id + * @param ticket 授权码 + */ + @GET("/v1/monster/draw/result") + Single> getRoomMonsterHuntingResult( + @Query("monsterId") String monsterId, @Query("ticket") String ticket); + + /** + * 查询怪兽接口 + * @param monsterIds 怪兽 id 数组,用逗号隔开 + * @param ticket 授权码 + */ + @GET("/v1/monster/query") + Single> queryMonstersInfo( + @Query("monsterIds") String[] monsterIds, @Query("ticket") String ticket); + + /** + * 获取怪兽数据 + * @param roomId + * @param ticket + * @return + */ + @GET("v1/monster/list") + Single>> getMonsterList(@Query("roomId") String roomId, + @Query("ticket") String ticket); + } +} diff --git a/core/src/main/java/com/chwl/core/monsterhunting/rxevent/MonsterUpdateEvent.java b/core/src/main/java/com/chwl/core/monsterhunting/rxevent/MonsterUpdateEvent.java new file mode 100644 index 0000000..0fe6ff4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/monsterhunting/rxevent/MonsterUpdateEvent.java @@ -0,0 +1,23 @@ +package com.chwl.core.monsterhunting.rxevent; + +import com.chwl.core.monsterhunting.bean.MonsterDataBean; +import com.chwl.core.monsterhunting.bean.MonsterProtocol; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/4/25 + */ +@Data +public class MonsterUpdateEvent implements Serializable { + private List monsterList ; + + public MonsterUpdateEvent(List monsterList) { + this.monsterList = monsterList; + } +} diff --git a/core/src/main/java/com/chwl/core/msg/ImsgClient.java b/core/src/main/java/com/chwl/core/msg/ImsgClient.java new file mode 100644 index 0000000..52b41d6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/ImsgClient.java @@ -0,0 +1,13 @@ +package com.chwl.core.msg; + +import com.chwl.library.coremanager.ICoreClient; + +/** + * Created by zhouxiangfeng on 2017/3/11. + */ + +public interface ImsgClient extends ICoreClient{ + public static final String METHOD_ON_GET_MSG = "onGetMsg"; + + void onGetMsg(); +} diff --git a/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgLayout.java b/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgLayout.java new file mode 100644 index 0000000..ce86665 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgLayout.java @@ -0,0 +1,20 @@ +package com.chwl.core.msg.sys; + +import androidx.annotation.Keep; + +import com.chwl.core.msg.sys.bean.ErbanSysMsgComponent; + +import java.util.List; + +import lombok.Data; + +/** + * Created by MadisonRong on 21/06/2018. + */ +@Keep +@Data +public class ErbanSysMsgLayout { + private ErbanSysMsgComponent title; + private ErbanSysMsgComponent time; + private List contents; +} diff --git a/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgModel.java b/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgModel.java new file mode 100644 index 0000000..362193b --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgModel.java @@ -0,0 +1,38 @@ +package com.chwl.core.msg.sys; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.msg.sys.bean.ApproveMsgInfo; + +import java.util.Map; + +import io.reactivex.Single; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Query; +import retrofit2.http.QueryMap; +import retrofit2.http.Url; + +/** + * Created by MadisonRong on 26/06/2018. + */ + +public class ErbanSysMsgModel { + + public interface Api { + + /** + * 系统消息里审批类内容使用 + * @param url 随实体一起返回的 URL + * @param type 审批操作,0表示拒绝,1表示同意 + * @param approverUid 操作者 UID(当前用户 UID) + * @return + */ + @POST + @Headers({"need_update_url:false"}) + public Single> requestUrl(@Url String url, + @Query("type") int type, + @Query("uid") String approverUid, + @QueryMap Map params); + + } +} diff --git a/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgParamKey.java b/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgParamKey.java new file mode 100644 index 0000000..15b5923 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sys/ErbanSysMsgParamKey.java @@ -0,0 +1,13 @@ +package com.chwl.core.msg.sys; + +/** + * Created by MadisonRong on 05/07/2018. + */ + +public class ErbanSysMsgParamKey { + + public static final String ACTION_TYPE = "actionType"; + public static final String FAMILY_ID = "familyId"; + public static final String INVITE_ID = "inviteId"; + public static final String WORLD_ID = "worldId"; +} diff --git a/core/src/main/java/com/chwl/core/msg/sys/bean/ApproveMsgInfo.java b/core/src/main/java/com/chwl/core/msg/sys/bean/ApproveMsgInfo.java new file mode 100644 index 0000000..68fd684 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sys/bean/ApproveMsgInfo.java @@ -0,0 +1,19 @@ +package com.chwl.core.msg.sys.bean; + +import lombok.Data; + +/** + * Created by MadisonRong on 04/07/2018. + */ +@Data +public class ApproveMsgInfo { + + /** + * 返回的消息的处理结果 2拒绝 3同意 4过期 + */ + private int status; + + private String approverUid; + + private String approverNick; +} diff --git a/core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgComponent.java b/core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgComponent.java new file mode 100644 index 0000000..9c44dc5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgComponent.java @@ -0,0 +1,19 @@ +package com.chwl.core.msg.sys.bean; + +import androidx.annotation.Keep; + +import lombok.Data; + +/** + * Created by MadisonRong on 21/06/2018. + */ +@Keep +@Data +public class ErbanSysMsgComponent { + private String content; + private float fontSize; + private String fontColor; + private boolean fontBold; + private int routerType; + private int routerValue; +} diff --git a/core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgInfo.java b/core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgInfo.java new file mode 100644 index 0000000..a8e2bd6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sys/bean/ErbanSysMsgInfo.java @@ -0,0 +1,86 @@ +package com.chwl.core.msg.sys.bean; + +import androidx.annotation.Keep; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; + +/** + * Created by MadisonRong on 21/06/2018. + */ +@Keep +@Data +public class ErbanSysMsgInfo implements Serializable{ + + /** + * 未处理 + */ + public static final int STATE_UNTREATED = 1; + + /** + * 已同意 + */ + public static final int STATE_AGREE = 2; + + /** + * 已拒绝 + */ + public static final int STATE_REFUSED = 3; + + /** + * 已过期 + */ + public static final int STATE_OUT_DATE = 4; + + /** + * 消息已过期 + */ + public static final int MSG_HAS_EXPIRED = 7005; + + /** + * 你被该家族拒绝 + */ + public static final int FAMILY_HAS_REJECTED = 7003; + + /** + * 你已经加入了该家族 + */ + public static final int FAMILY_HAS_JOINED = 70002; + + private String url; + private int state; + private int routerType; + private int routerValue; + private Map params; + private String layout; + + public static Map convertToMap(ErbanSysMsgInfo sysMsgInfo) { + Map localExtension = new HashMap<>(); + localExtension.put("url", sysMsgInfo.getUrl()); + localExtension.put("state", sysMsgInfo.getState()); + localExtension.put("routerType", sysMsgInfo.getRouterType()); + localExtension.put("routerValue", sysMsgInfo.getRouterValue()); + localExtension.put("layout", sysMsgInfo.getLayout()); + localExtension.put("params",new Gson().toJson(sysMsgInfo.getParams())); + return localExtension; + } + + public static ErbanSysMsgInfo convertMapToObject(Map localExtension) { + ErbanSysMsgInfo sysMsgInfo = new ErbanSysMsgInfo(); + if (localExtension != null) { + sysMsgInfo.setUrl(String.valueOf(localExtension.get("url"))); + sysMsgInfo.setState((Integer) localExtension.get("state")); + sysMsgInfo.setRouterType((Integer) localExtension.get("routerType")); + sysMsgInfo.setRouterValue((Integer) localExtension.get("routerValue")); + sysMsgInfo.setLayout((String) localExtension.get("layout")); + sysMsgInfo.setParams(new Gson().fromJson((String) localExtension.get("params"), new TypeToken>(){}.getType())); + } + return sysMsgInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/msg/sysv2/ErbanSysMsgV2Layout.java b/core/src/main/java/com/chwl/core/msg/sysv2/ErbanSysMsgV2Layout.java new file mode 100644 index 0000000..dd1a4d7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sysv2/ErbanSysMsgV2Layout.java @@ -0,0 +1,18 @@ +package com.chwl.core.msg.sysv2; + + +import com.chwl.core.msg.sysv2.bean.ErbanSysMsgV2Component; + +import java.util.List; + +import lombok.Data; + +/** + * Created by lvzebiao on 2020/3/28. + */ +@Data +public class ErbanSysMsgV2Layout { + private ErbanSysMsgV2Component title; + private ErbanSysMsgV2Component time; + private List contents; +} diff --git a/core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Component.java b/core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Component.java new file mode 100644 index 0000000..222138f --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Component.java @@ -0,0 +1,16 @@ +package com.chwl.core.msg.sysv2.bean; + +import lombok.Data; + +/** + * Created by lvzebiao on 2020/3/28. + */ +@Data +public class ErbanSysMsgV2Component { + private String content; + private float fontSize; + private String fontColor; + private boolean fontBold; + private int routerType; + private String routerValue; +} diff --git a/core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Info.java b/core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Info.java new file mode 100644 index 0000000..33d449f --- /dev/null +++ b/core/src/main/java/com/chwl/core/msg/sysv2/bean/ErbanSysMsgV2Info.java @@ -0,0 +1,88 @@ +package com.chwl.core.msg.sysv2.bean; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; + +/** + * 以前23的协议,照搬一套 + * Created by lvzebiao on 28/03/2020. + */ +@Data +public class ErbanSysMsgV2Info implements Serializable{ + + /** + * 未处理 + */ + public static final int STATE_UNTREATED = 1; + + /** + * 已同意 + */ + public static final int STATE_AGREE = 2; + + /** + * 已拒绝 + */ + public static final int STATE_REFUSED = 3; + + /** + * 已过期 + */ + public static final int STATE_OUT_DATE = 4; + + /** + * 消息已过期 + */ + public static final int MSG_HAS_EXPIRED = 7005; + + /** + * 你被该家族拒绝 + */ + public static final int FAMILY_HAS_REJECTED = 7003; + + /** + * 你已经加入了该家族 + */ + public static final int FAMILY_HAS_JOINED = 70002; + + private String url; + private int state; + private int routerType; + private String routerValue; + private Map params; + private String layout; + + public static Map convertToMap(ErbanSysMsgV2Info sysMsgInfo) { + if (sysMsgInfo == null) { + return null; + } + Map localExtension = new HashMap<>(); + localExtension.put("url", sysMsgInfo.getUrl()); + localExtension.put("state", sysMsgInfo.getState()); + localExtension.put("routerType", sysMsgInfo.getRouterType()); + localExtension.put("routerValue", sysMsgInfo.getRouterValue()); + localExtension.put("layout", sysMsgInfo.getLayout()); + localExtension.put("params",new Gson().toJson(sysMsgInfo.getParams())); + return localExtension; + } + + public static ErbanSysMsgV2Info convertMapToObject(Map localExtension) { + if (localExtension != null) { + ErbanSysMsgV2Info sysMsgInfo = new ErbanSysMsgV2Info(); + sysMsgInfo.setUrl(String.valueOf(localExtension.get("url"))); + sysMsgInfo.setState((Integer) localExtension.get("state")); + sysMsgInfo.setRouterType((Integer) localExtension.get("routerType")); + sysMsgInfo.setRouterValue((String) localExtension.get("routerValue")); + sysMsgInfo.setLayout((String) localExtension.get("layout")); + sysMsgInfo.setParams(new Gson().fromJson((String) localExtension.get("params"), new TypeToken>(){}.getType())); + return sysMsgInfo; + } + return null; + } +} diff --git a/core/src/main/java/com/chwl/core/newbie/bean/NewbieHelloInfo.java b/core/src/main/java/com/chwl/core/newbie/bean/NewbieHelloInfo.java new file mode 100644 index 0000000..cf16f1a --- /dev/null +++ b/core/src/main/java/com/chwl/core/newbie/bean/NewbieHelloInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.newbie.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class NewbieHelloInfo implements Serializable { + public String nick; + public String avatar; + public int gender; + public String message; + public long inRoomUid; + public String uid; +} diff --git a/core/src/main/java/com/chwl/core/newbie/event/NewbieHelloDialogEvent.java b/core/src/main/java/com/chwl/core/newbie/event/NewbieHelloDialogEvent.java new file mode 100644 index 0000000..98cdd27 --- /dev/null +++ b/core/src/main/java/com/chwl/core/newbie/event/NewbieHelloDialogEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.newbie.event; + +import com.chwl.core.newbie.bean.NewbieHelloInfo; + +import lombok.Data; + +@Data +public class NewbieHelloDialogEvent { + + NewbieHelloInfo helloInfo; + + public NewbieHelloDialogEvent(NewbieHelloInfo helloInfo) { + this.helloInfo = helloInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/noble/NobleConfig.txt b/core/src/main/java/com/chwl/core/noble/NobleConfig.txt new file mode 100644 index 0000000..f972f05 --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/NobleConfig.txt @@ -0,0 +1,71 @@ +{ + "1":{ + "level":1, + "badge":["badge_1_1","badge_1_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_1_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_1_1.png"], + "open_effect":["banner_1_1"], + "banner":["banner_1_1"] + }, + "2":{ + "level":2, + "badge":["badge_2_1","badge_2_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_2_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_2_1.png"], + "open_effect":["banner_2_1"], + "banner":["banner_2_1"] + }, + "3":{ + "level":3, + "badge":["badge_3_1","badge_3_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_3_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_3_1.png"], + "open_effect":["https://image.zhongjialx.com/svga/Noble_OpenEffect_3_1.svga"], + "banner":["banner_3_1"] + }, + "4":{ + "level":4, + "badge":["badge_4_1","badge_4_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_4_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_4_1.png"], + "open_effect":["https://image.zhongjialx.com/svga/Noble_OpenEffect_4_1.svga"], + "banner":["banner_4_1"], + "headwear":["headwear_4_1"], + "bubble":["bubble_4_1.9"] + }, + "5":{ + "level":5, + "badge":["badge_5_1","badge_5_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_5_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_5_1.png"], + "open_effect":["https://image.zhongjialx.com/svga/Noble_OpenEffect_5_1.svga"], + "banner":["banner_5_1"], + "headwear":["headwear_5_1"], + "halo":["#9E64F9"], + "bubble":["bubble_5_1.9"] + + }, + "6":{ + "level":6, + "badge":["badge_6_1","badge_6_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_6_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_6_1.png"], + "open_effect":["https://image.zhongjialx.com/svga/Noble_OpenEffect_6_1.svga"], + "banner":["banner_6_1"], + "headwear":["headwear_6_1"], + "halo":["#E43B57"], + "bubble":["bubble_6_1.9"] + }, + "7":{ + "level":7, + "badge":["badge_7_1","badge_7_2"], + "cardbg":["https://image.zhongjialx.com/cardbg/cardbg_7_1.png"], + "zonebg":["https://image.zhongjialx.com/zonebg/zonebg_7_1.png"], + "open_effect":["https://image.zhongjialx.com/svga/Noble_OpenEffect_7_1.svga"], + "banner":["banner_7_1"], + "headwear":["headwear_7_1"], + "halo":["#FF9622"], + "bubble":["bubble_7_1.9"], + "recommend":["https://image.zhongjialx.com/recommend.png"] + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/noble/NobleDataManager.java b/core/src/main/java/com/chwl/core/noble/NobleDataManager.java new file mode 100644 index 0000000..a914df0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/NobleDataManager.java @@ -0,0 +1,434 @@ +package com.chwl.core.noble; + +import android.text.TextUtils; +import android.util.Log; + +import androidx.collection.LongSparseArray; + +import com.chwl.core.noble.bean.NobleConfig; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.noble.bean.NobleRight; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.chwl.core.DemoCache; +import com.chwl.core.R; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.initial.bean.NobleResourceComponent; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.config.BasicConfig; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Action; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import okhttp3.ResponseBody; +import retrofit2.http.GET; +import retrofit2.http.Headers; +import retrofit2.http.Query; +import retrofit2.http.Url; + +/** + * 贵族数据 + * + * @author xiaoyu + * @date 2018/1/8 + */ + +public class NobleDataManager { + private static final String TAG = "NobleDataManager"; + private static NobleDataManager mInstance; + + /** + * 贵族根目录 + */ + private File nobleRootDir; + private File nobleZipPath; + private File userLevelPath; + private String onlinePicRootDir; + private String offlinePicRootDir; + + private LongSparseArray mNobleInfoMap; + + + private NobleDataManager() { + // data/data/{包名}/files/noble/{xxx.zip} + // data/data/{包名}/files/noble/{onlineVersion} + // data/data/{包名}/files/noble/{onlineVersion}/{资源图片的名称} + nobleRootDir = new File(BasicConfig.INSTANCE.getAppContext().getFilesDir() + "/noble"); + nobleZipPath = new File(nobleRootDir.getAbsolutePath() + "/noble.zip"); + userLevelPath = new File(BasicConfig.INSTANCE.getAppContext().getExternalCacheDir(), "http"); + if (!nobleRootDir.exists()) { + nobleRootDir.mkdirs(); + } + // 本地的贵族版本 + offlineVersion = DemoCache.readNobleVersion(); + // 本地的贵族资源的路径 + setPicRootDirectory(offlineVersion, false); + // 本地的贵族权限 + mOfflineNobleRights = DemoCache.readNobleRights(); + // 本地的所有贵族能用的所有值 + mOfflineConfigs = DemoCache.readNobleConfigs(); + } + + public static NobleDataManager get() { + if (mInstance == null) { + synchronized (NobleDataManager.class) { + if (mInstance == null) { + mInstance = new NobleDataManager(); + } + } + } + return mInstance; + } + + /** + * 在线的所有贵族的特权信息 + */ + private Map mOnlineNobleRights; + /** + * 在线的贵族所有资源的配置 + */ + private Map mOnlineConfigs; + /** + * 本地的所有贵族的特权信息 + */ + private Map mOfflineNobleRights; + /** + * 本地的贵族所有资源的配置 + */ + private Map mOfflineConfigs; + private String onlineVersion; + private String offlineVersion; + + public int getNobleCounts() { + Map usableNobleRight = getUsableNobleRight(); + if (usableNobleRight == null) return 0; + return usableNobleRight.size(); + } + + private String getUsableResourceRootPath() { + if (TextUtils.isEmpty(onlinePicRootDir)) { + if (!TextUtils.isEmpty(offlinePicRootDir)) return offlinePicRootDir; + else InitialModel.get().init(true); + return null; + } + return onlinePicRootDir; + } + + public Map getAllNobleRight() { + return getUsableNobleRight(); + } + + public Map getAllNobleConfig() { + return getUsableNobleConfig(); + } + + private Map getUsableNobleRight() { + if (mOnlineNobleRights == null) { +// InitModel.get().init(true); + InitialModel.get().init(true); + if (mOfflineNobleRights != null) return mOfflineNobleRights; + return null; + } + return mOnlineNobleRights; + } + + private Map getUsableNobleConfig() { + if (mOnlineConfigs == null) { +// InitModel.get().init(true); + InitialModel.get().init(true); + if (mOfflineConfigs != null) return mOfflineConfigs; + return null; + } + return mOnlineConfigs; + } + + public NobleRight getNobleRight(int level) { + Map usableNobleRight = getUsableNobleRight(); + if (usableNobleRight == null) return null; + return usableNobleRight.get(String.valueOf(level)); + } + + public NobleConfig getNobleConfig(int level) { + Map usableNobleConfig = getUsableNobleConfig(); + if (usableNobleConfig == null) return null; + return usableNobleConfig.get(String.valueOf(level)); + } + + public String getResourcePath() { + String usableResourceRootPath = getUsableResourceRootPath(); + if (TextUtils.isEmpty(usableResourceRootPath)) return null; + return usableResourceRootPath; + } + + public void setOnlineConfigs(NobleResourceComponent data) { + if (data != null && data.getVersion() != 0) { + onlineVersion = String.valueOf(data.getVersion()); + DemoCache.saveNobleVersion(String.valueOf(onlineVersion)); + } + if (data != null && !TextUtils.isEmpty(data.getResourceConfig())) { + mOnlineConfigs = new Gson().fromJson(data.getResourceConfig(), + new TypeToken>() { + }.getType()); + DemoCache.saveNobleConfigs(data.getResourceConfig()); + } + // 下载对应的贵族资源 + if (data != null && !TextUtils.isEmpty(data.getZipUrl())) { + downloadNobleZip(data.getZipUrl()); + } + } + + public void setOnlineRights(List rights) { + if (ListUtils.isListEmpty(rights)) return; + if (mOnlineNobleRights == null) mOnlineNobleRights = new HashMap<>(rights.size()); + for (NobleRight right : rights) { + mOnlineNobleRights.put(String.valueOf(right.getId()), right); + } + DemoCache.saveNobleRights(new Gson().toJson(mOnlineNobleRights)); + } + + private boolean isRequesting = false; + + private void downloadNobleZip(final String url) { + if (TextUtils.isEmpty(url)) return; + if (isRequesting) return; + isRequesting = true; + RxNet.create(Api.class).downloadFile(url).subscribeOn(Schedulers.io()) + .doFinally(new Action() { + @Override + public void run() throws Exception { + isRequesting = false; + } + }).flatMap(new Function>() { + @Override + public SingleSource apply(ResponseBody responseBody) throws Exception { + InputStream inputStream = responseBody.byteStream(); + if (inputStream == null) + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_noble_nobledatamanager_01))); + if (nobleZipPath.exists()) { + // 删除旧的zip包 + nobleZipPath.delete(); + } else { + // 创建其父目录 + if (!nobleZipPath.getParentFile().exists()) { + nobleZipPath.getParentFile().mkdirs(); + } + } + OutputStream fileOutputStream = new FileOutputStream(nobleZipPath); + byte[] bytes = new byte[1024]; + int read; + while ((read = inputStream.read(bytes, 0, bytes.length)) != -1) { + fileOutputStream.write(bytes, 0, read); + } + fileOutputStream.flush(); + fileOutputStream.close(); + inputStream.close(); + // 解压缩是否成功 + return Single.just(unzipNobleZipFile()); + } + }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer() { + @Override + public void accept(Boolean aBoolean) throws Exception { + if (!aBoolean) return; + IMNetEaseManager.get().getChatRoomEventObservable() + .onNext(new RoomEvent().setEvent(RoomEvent.ON_NOBLE_CAN_USE)); + } + }); + + } + + + /** + * 寻找对应的表情包图片的根目录,如果没有则设置一个默认的 + */ + private void setPicRootDirectory(String version, boolean isOnline) { + if (TextUtils.isEmpty(version) || + nobleRootDir == null) { + return; + } + File picRootDirectory = null; + File tmp = new File(nobleRootDir.getAbsolutePath() + "/" + version); + if (!tmp.exists()) { + return; + } else { + File[] files = tmp.listFiles(); + if (files.length == 1 && files[0].list().length > 0) { + // 压缩包里面有根目录的情况 + picRootDirectory = files[0]; + Log.e(TAG, "files[0]: " + files[0].getAbsolutePath()); + } else if (files.length > 1) { + // 压缩包里面没有根目录的情况 + picRootDirectory = tmp; + Log.e(TAG, "tmp: " + tmp.getAbsolutePath()); + } + } + // 如果没有找到,设置一个默认的 + if (picRootDirectory == null) { + picRootDirectory = new File(nobleRootDir.getAbsolutePath() + "/" + version + "/resources"); + Log.e(TAG, "default: " + picRootDirectory.getAbsolutePath()); + } + + // 设置贵族资源的根目录 + if (isOnline) onlinePicRootDir = picRootDirectory.getAbsolutePath(); + else offlinePicRootDir = picRootDirectory.getAbsolutePath(); + } + + + /** + * 解压缩对应版本的zip包,并且告知FaceInfo的根目录 + */ + private boolean unzipNobleZipFile() { + // 如果zip包不存在 + if (!nobleZipPath.exists() || TextUtils.isEmpty(onlineVersion)) { + return false; + } + long startTime = System.currentTimeMillis(); + try { + ZipInputStream zis = new ZipInputStream(new FileInputStream(nobleZipPath)); + BufferedInputStream bis = new BufferedInputStream(zis); + //输出路径(文件夹目录) + String parent = nobleRootDir.getAbsolutePath() + "/" + onlineVersion; + String parentPre = new File(parent).getCanonicalPath(); + File file; + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + Log.e(TAG, "entry.getName(): " + entry.getName() + " isDir: " + entry.isDirectory()); + if (entry.isDirectory()) { + // 如果有对应的路径名字的文件,则删除,重建一个目录 + file = new File(parent, entry.getName()); + if (file.exists() && file.isFile()) { + boolean b = file.delete(); + if (b) { + file.mkdirs(); + } + } + continue; + } + file = new File(parent, entry.getName()); + if (!file.getCanonicalPath().startsWith(parentPre)) { + throw new SecurityException(); + } + if (!file.exists()) { + (new File(file.getParent())).mkdirs(); + } else if (file.exists() && file.isFile() && file.length() > 0) { + continue; + } + FileOutputStream out = new FileOutputStream(file); + BufferedOutputStream bos = new BufferedOutputStream(out); + int b; + while ((b = bis.read()) != -1) { + bos.write(b); + } + bos.close(); + out.close(); + } + bis.close(); + zis.close(); + } catch (Exception e) { + Log.e(TAG, "", e); + return false; + } + long endTime = System.currentTimeMillis(); + Log.e(TAG, "total time: " + (endTime - startTime)); + setPicRootDirectory(onlineVersion, true); + return true; + } + + + public NobleInfo getNobleByUid(String uid) { + if (TextUtils.isEmpty(uid)) return null; + return getNobleByUid(Long.valueOf(uid)); + } + + public NobleInfo getNobleByUid(final long uid) { + NobleInfo nobleInfo = null; + if (!isMapEmpty(mNobleInfoMap)) { + nobleInfo = mNobleInfoMap.get(uid); + } + return nobleInfo; + } + + public Single getNobleByUidFromService(String uid) { + return getNobleByUidFromService(Long.valueOf(uid)); + } + + public Single getNobleByUidFromService(final long uid) { + return RxNet.create(Api.class).getNobleByUid(uid) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .map(new Function, NobleInfo>() { + @Override + public NobleInfo apply(ServiceResult nobleInfoServiceResult) throws Exception { + if (nobleInfoServiceResult != null + && nobleInfoServiceResult.isSuccess() + && nobleInfoServiceResult.getData() != null) { + if (mNobleInfoMap == null) + mNobleInfoMap = new LongSparseArray<>(); + NobleInfo data = nobleInfoServiceResult.getData(); + mNobleInfoMap.put(uid, data); + return data; + } + return null; + } + }) + .observeOn(AndroidSchedulers.mainThread()); + } + + + private boolean isMapEmpty(LongSparseArray nobleInfoMap) { + return nobleInfoMap == null || nobleInfoMap.size() == 0; + } + + public Single downloadFile(String url) { + return RxNet.create(Api.class) + .downloadFile(url) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public File getUserLevelPath() { + return userLevelPath; + } + + private interface Api { + /** + * 下载对应的贵族资源 / 等级文件 + * + * @param url - + * @return - + */ + @GET() + @Headers({"need_update_url:false"}) + Single downloadFile(@Url String url); + + /** + * 根据用户uid获取用户贵族信息 + * + * @param uid 用户uid + * @return 贵族信息 + */ + @GET("noble/users/get") + Single> getNobleByUid(@Query("uid") long uid); + } +} diff --git a/core/src/main/java/com/chwl/core/noble/NobleResourceType.java b/core/src/main/java/com/chwl/core/noble/NobleResourceType.java new file mode 100644 index 0000000..64d881c --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/NobleResourceType.java @@ -0,0 +1,33 @@ +package com.chwl.core.noble; + +/** + * 所有资源的类型 + * + * @author xiaoyu + * @date 2018/1/10 + */ + +public interface NobleResourceType { + int INVALID = -1; + /** 本地资源的id */ + int IDS = 1; + /** 大图片的url */ + int URLS = 2; + /** 本地颜色 */ + int COLORS = 3; + /** 网络的svga资源 */ + int SVGAS = 4; + /** 本地的.9图片资源 */ + int NINE_PATCH = 5; + String KEY_LEVEL = "level"; + String KEY_BADGE = "badge"; + String KEY_HEAD_WEAR = "headwear"; + String KEY_CARD_BG = "cardbg"; + String KEY_ZONE_BG = "zonebg"; + String KEY_OPEN_EFFECT = "open_effect"; + String KEY_BANNER = "banner"; + String KEY_BUBBLE = "bubble"; + String KEY_HALO = "halo"; + String KEY_RECOMMEND = "recommend"; + String KEY_ENTER_HIDE = "enterHide"; +} diff --git a/core/src/main/java/com/chwl/core/noble/NobleUtil.java b/core/src/main/java/com/chwl/core/noble/NobleUtil.java new file mode 100644 index 0000000..3c91b09 --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/NobleUtil.java @@ -0,0 +1,876 @@ +package com.chwl.core.noble; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.NinePatch; +import android.graphics.Rect; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.NinePatchDrawable; +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; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.target.ViewTarget; +import com.bumptech.glide.request.transition.Transition; +import com.chwl.core.noble.bean.NobleConfig; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.noble.bean.NobleRight; +import com.chwl.core.room.queue.bean.MicMemberInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.ExtensionUtil; +import com.chwl.core.utils.ImageSplitter; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.config.BasicConfig; +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 java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +/** + * @author xiaoyu + * @date 2018/1/10 + */ + +public class NobleUtil { + /** + * 获取本地的资源的路径 + * + * @param name - + * @return - + */ + public static String getLocalResourcePath(String name) { + String resourcePath = NobleDataManager.get().getResourcePath(); + if (TextUtils.isEmpty(resourcePath) || TextUtils.isEmpty(name)) return ""; + int resourceType = getResourceType(name); + String targetPath = ""; + if (resourceType == NobleResourceType.IDS) { + targetPath = resourcePath + File.separator + name + ".png"; + } + return targetPath; + } + + public static String getNobleLevel(ChatRoomMessage chatRoomMessage) { + if (chatRoomMessage == null) return null; + String account = ""; + try { + account = ExtensionUtil.getAccount(chatRoomMessage); + } catch (NullPointerException e) { + account = ""; + } + if (TextUtils.isEmpty(account)) return null; + Map map = ExtensionUtil.getExtension(chatRoomMessage, account); + if (map == null) return null; + return getLevel(map.get(NobleResourceType.KEY_LEVEL)); + } + + public static void loadResource(String name, final ImageView imageView, int defaultResId) { + String resourcePath = NobleDataManager.get().getResourcePath(); + if (TextUtils.isEmpty(resourcePath) || TextUtils.isEmpty(name)) return; + int resourceType = getResourceType(name); + String targetPath = ""; + if (resourceType == NobleResourceType.URLS) { + targetPath = name; + } else if (resourceType == NobleResourceType.IDS) { + targetPath = resourcePath + File.separator + name + ".png"; + } else if (resourceType == NobleResourceType.COLORS) { + // TODO: 2018/1/12 + return; + } + imageView.setScaleType(ImageView.ScaleType.FIT_XY); + + Context context = imageView.getContext(); + if (context != null) { + if (context instanceof FragmentActivity) { + if (((FragmentActivity) context).isDestroyed()) { + return; + } + + } else if (context instanceof Activity) { + if (((Activity) context).isDestroyed()) { + return; + } + } + } else { + return; + } + + GlideApp.with(context) + .load(targetPath) + .diskCacheStrategy(DiskCacheStrategy.DATA) + .placeholder(defaultResId) + .dontTransform() + .into(imageView); + } + + public static void loadResource(String name, final ImageView imageView) { + loadResource(name, imageView, 0); + } + + public static void loadHeadWears(String url, ImageView imageView) { + imageView.setTag(url); + imageView.setImageDrawable(null); + 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) { + if (url.equals(imageView.getTag())) { + imageView.setImageDrawable(null); + } + return false; + } + + @Override + public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if (url.equals(imageView.getTag())) { + List split = ImageSplitter.splits(url, resource); + AnimationDrawable animationDrawable = new AnimationDrawable(); + for (int i = 0; i < split.size(); i++) { + animationDrawable.addFrame(split.get(i), 200); + } + imageView.post(() -> { + imageView.setImageDrawable(animationDrawable); + animationDrawable.setOneShot(false); + animationDrawable.start(); + }); + + } + return false; + } + }).submit(); + } + + @Deprecated() + public static void loadHeadWear(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) { + e.printStackTrace(); + return false; + } + + @Override + public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if (resource == null) return false; + List split = ImageSplitter.split(resource); + + + + imageView.post(() -> { + if (OtherExtKt.isVerify(split)) { + 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(); + } else { + imageView.setImageBitmap(resource); + } + }); + + return false; + } + }).submit(); + } + + /** + * 用于坑位加载头饰 + * 引入keyId和keyValue是为了解决异步加载,造成坑位头饰加载错误的问题 + */ + public static void loadHeadWear(String url, ImageView imageView, int keyId, String keyValue) { + 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) { + if (imageView.getTag(keyId) == null) { + return false; + } + if (!imageView.getTag(keyId).equals(keyValue)) { + //坑位已经变动,不需要设置图片 + return false; + } + imageView.setImageDrawable(null); + return false; + } + + @Override + public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if (resource == null) return false; + + if (imageView.getTag(keyId) == null) { + return false; + } + if (!imageView.getTag(keyId).equals(keyValue)) { + //坑位已经变动,不需要设置图片 + return false; + } + List split = ImageSplitter.split(resource); + imageView.post(() -> { + if (OtherExtKt.isVerify(split)) { + 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(); + } else { + imageView.setImageBitmap(resource); + } + }); + + return false; + } + }).submit(); + } + + public static int getNobleRightItemCounts(int level) { + NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); + if (nobleRight == null) return 0; + Field[] fields = NobleRight.class.getDeclaredFields(); + int counts = 0; + try { + for (Field field : fields) { + field.setAccessible(true); + Object o = field.get(nobleRight); + if (!(o.getClass().equals(byte.class)) && !(o.getClass().equals(Byte.class))) + continue; + byte b = (byte) o; + if (b > 0) counts++; + } + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + return counts; + } + + public static int getResourceType(String value) { + return TextUtils.isEmpty(value) ? NobleResourceType.INVALID : + value.toLowerCase().endsWith(".svga") ? NobleResourceType.SVGAS : + value.toLowerCase().startsWith("http") ? NobleResourceType.URLS : + value.startsWith("#") ? NobleResourceType.COLORS : + value.toLowerCase().startsWith("bubble") ? NobleResourceType.NINE_PATCH : NobleResourceType.IDS; + } + + public static int getColor(String value) { + if (TextUtils.isEmpty(value) || + getResourceType(value) != NobleResourceType.COLORS) + return Color.argb(255, 255, 255, 255); + Integer rColor = 255; + Integer gColor = 255; + Integer bColor = 255; + try { + rColor = Integer.valueOf(value.substring(1, 3), 16); + gColor = Integer.valueOf(value.substring(3, 5), 16); + bColor = Integer.valueOf(value.substring(5, 7), 16); + } catch (Exception e) { + e.printStackTrace(); + } + return Color.argb(255, rColor, gColor, bColor); + } + + /** + * 补全贵族字段的信息 + * 贵族的banner + * 贵族的openEffect + * + * @param userInfo - + * @return - + */ + public static UserInfo setCompletedNobleInfo(UserInfo userInfo) { + if (userInfo.getNobleUsers() == null) return userInfo; + NobleInfo nobleInfo = userInfo.getNobleUsers(); + NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(nobleInfo.getLevel()); + if (nobleConfig == null) return userInfo; + if (TextUtils.isEmpty(nobleInfo.getBanner())) { + // 如果banner信息为空,则补全 + List banner = nobleConfig.getBanner(); + if (!ListUtils.isListEmpty(banner)) { + nobleInfo.setBanner(banner.get(0)); + } + } + if (TextUtils.isEmpty(nobleInfo.getOpenEffect())) { + // 如果openEffect信息为空,则补全 + List openEffect = nobleConfig.getOpenEffect(); + if (!ListUtils.isListEmpty(openEffect)) { + nobleInfo.setOpenEffect(openEffect.get(0)); + } + } + userInfo.setNobleInfo(nobleInfo); + return userInfo; + } + + + public static String getBadgeByLevel(int level) { + NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); + if (nobleConfig == null) return ""; + return getBiggerBadge(nobleConfig.getBadge(), level); + } + + /** + * 根据贵族等级获取对应的banner(进场横幅)背景 + * + * @param level + * @return + */ + public static String getBannerByLevel(int level) { + NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); + if (nobleConfig == null || ListUtils.isListEmpty(nobleConfig.getBanner())) return ""; + return nobleConfig.getBanner().get(0); + } + + public static String getOpenEffectByLevel(int level) { + NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); + if (nobleConfig == null) return null; + List openEffect = nobleConfig.getOpenEffect(); + if (ListUtils.isListEmpty(openEffect)) return null; + return openEffect.get(0); + } + + private static String getBiggerBadge(List names, int level) { + if (ListUtils.isListEmpty(names)) return ""; + if (level == 1) return names.get(1); + if (level == 2) return names.get(1); + if (level == 3) return names.get(1); + if (level == 4) return names.get(1); + if (level == 5) return names.get(1); + if (level == 6) return names.get(1); + if (level == 7) return names.get(1); + return names.get(0); + } + + public static String getSmallBadgeByLevel(int level) { + NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); + if (nobleConfig == null) return ""; + return getSmallBadge(nobleConfig.getBadge(), level); + } + + private static String getSmallBadge(List names, int level) { + if (ListUtils.isListEmpty(names)) return ""; + if (level == 1) return names.get(0); + if (level == 2) return names.get(0); + if (level == 3) return names.get(0); + if (level == 4) return names.get(0); + if (level == 5) return names.get(0); + if (level == 6) return names.get(0); + if (level == 7) return names.get(0); + return names.get(0); + } + + public static void loadResource(final Context context, String name, View view) { + String resourcePath = NobleDataManager.get().getResourcePath(); + if (TextUtils.isEmpty(resourcePath) || TextUtils.isEmpty(name)) return; + int resourceType = getResourceType(name); + String targetPath = ""; + if (resourceType == NobleResourceType.URLS) { + targetPath = name; + } else if (resourceType == NobleResourceType.NINE_PATCH) { + targetPath = resourcePath + File.separator + name + "_android.png"; + File file = new File(targetPath); + if (!file.exists()) { + targetPath = resourcePath + File.separator + name + ".png"; + file = new File(targetPath); + if (!file.exists()) return; + } + } else if (resourceType == NobleResourceType.IDS) { + targetPath = resourcePath + File.separator + name + ".png"; + } else if (resourceType == NobleResourceType.COLORS) { + // TODO: 2018/1/12 + return; + } + + // .9图片处理 + if (resourceType == NobleResourceType.NINE_PATCH) { + Bitmap bitmap = null; + try { + bitmap = BitmapFactory.decodeStream(new FileInputStream(targetPath)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + byte[] chunk = bitmap.getNinePatchChunk(); + boolean result = NinePatch.isNinePatchChunk(chunk); + if (result && chunk != null) { + final float scale = context.getResources().getDisplayMetrics().density; + int width = (int) (8 * scale + 0.5f); + int height = bitmap.getHeight() / 3; + NinePatchDrawable patchy = new NinePatchDrawable(context.getResources(), + bitmap, chunk, new Rect(width, height, width, height), null); + view.setBackground(patchy); + } else { + view.setBackground(new BitmapDrawable(context.getResources(), bitmap)); + } + } else { + GlideApp.with(view.getContext()) + .load(targetPath) + .diskCacheStrategy(DiskCacheStrategy.DATA) + .dontTransform() + .into(new ViewTarget(view) { + @Override + public void onResourceReady( + Drawable resource, Transition transition) { + view.setBackground(resource); + } + }); + } + } + + public static Object getResource(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 map.get(type); + } + + public static Object getResource(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 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); + } + + /** + * 该等级是否有权限做这个操作 / 获取这个资源 + * + * @return - + */ + private static boolean hasRightToDo(String type, int level) { + if (level <= 0 || TextUtils.isEmpty(type)) return false; + NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); + if (nobleRight == null) return false; + boolean hasRight; + switch (type) { + case NobleResourceType.KEY_HALO: + hasRight = nobleRight.isMicHalo(); + break; + case NobleResourceType.KEY_HEAD_WEAR: + hasRight = nobleRight.isMicDecorate(); + break; + case NobleResourceType.KEY_BUBBLE: + hasRight = nobleRight.isChatBubble(); + break; + case NobleResourceType.KEY_BADGE: + hasRight = nobleRight.isUserMedal() || nobleRight.isRoomMedal() || + nobleRight.isScreenMedal(); + break; + case NobleResourceType.KEY_BANNER: + hasRight = nobleRight.isEnterNotice(); + break; + case NobleResourceType.KEY_OPEN_EFFECT: + hasRight = nobleRight.isOpenEffect(); + break; + case NobleResourceType.KEY_CARD_BG: + case NobleResourceType.KEY_ZONE_BG: + hasRight = true; + break; + default: + hasRight = true; + } + 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 房间的用户信息 + * @return 是否有权限去获取这个资源 + */ + private static boolean hasRightToDo(String type, ChatRoomMember chatRoomMember) { + if (TextUtils.isEmpty(type) || chatRoomMember == null) return false; + int level = getLevel(chatRoomMember); + if (level == 0) return false; + return hasRightToDo(type, level); + } + + /** + * 获取某个聊天室成员的贵族等级 + * + * @param chatRoomMember 某个聊天室成员 + * @return - + */ + private static int getLevel(ChatRoomMember 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; + } + + /** + * 获取某个聊天室成员的贵族等级 + * + * @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) { + return (String) level; + } else if (level instanceof Integer) { + return String.valueOf(level); + } + return null; + } + + + public static String getResource(String type, ChatRoomMessage chatRoomMessage) { + if (chatRoomMessage == null) return ""; + String account; + try { + account = ExtensionUtil.getAccount(chatRoomMessage); + } catch (NullPointerException e) { + account = ""; + } + + if (TextUtils.isEmpty(account)) return ""; + return getResource(type, chatRoomMessage, account); + } + + public static String getResource(String type, ChatRoomMessage chatRoomMessage, String account) { + if (chatRoomMessage == null || TextUtils.isEmpty(account) || TextUtils.isEmpty(type)) + return ""; + Map map = ExtensionUtil.getExtension(chatRoomMessage, account); + if (map == null) return ""; + Object o1 = map.get(type); + if (o1 == null) return ""; + if (map.get(type) instanceof Integer || map.get(type) instanceof Long || + map.get(type) instanceof Float || map.get(type) instanceof Double) { + return String.valueOf(o1); + } + if (o1 instanceof Boolean) { + if ((Boolean) o1) { + return "1"; + } else { + return "0"; + } + } + 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(); + } + + /** + * 获取用户经验等级的图片 + * 获取用户魅力等级的图片 + * + * @return - + */ + public static String getLevel(String type, ChatRoomMember chatRoomMember) { + Map extension = getExtension(chatRoomMember); + if (extension == null) return ""; + if (extension.get(type) == null) return ""; + return extension.get(type).toString(); + } + + + /** + * 获取用户座驾名称 + * + * @return - + */ + public static String getCarName(String type, ChatRoomMessage chatRoomMessage) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null || extension.get(type) == null) return ""; + return extension.get(type).toString(); + } + + /** + * 获取用户经验等级的图片 + * 获取用户魅力等级的图片 + * + * @return - + */ + public static String getLevel(String type, ChatRoomMessage chatRoomMessage) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null || extension.get(type) == null) return ""; + return extension.get(type).toString(); + } + + public static String getNamePlate(String type, ChatRoomMessage chatRoomMessage) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null || extension.get(type) == null) return ""; + return extension.get(type).toString(); + } + + /** + * 是否为官方 + * + * @return - + */ + public static boolean getIsOfficial(String type, ChatRoomMessage chatRoomMessage) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null) return false; + // 默认判断 ext 里面的 is_official 是否为 true + // 兼容 iOS 要加入对 def_user 的类型是否正确 + if (extension.get(type) == null) { + return getIsDefUser(UserInfo.DEF_USER, chatRoomMessage); + } else { + return (boolean) extension.get(type); + } + } + + public static boolean getIsDefUser(String type, ChatRoomMessage chatRoomMessage) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null || extension.get(type) == null) return false; + + int subType = (int) extension.get(type); + return subType == UserInfo.USER_TYPE_OFFICIAL; + } + + /** + * 是否为新人 + * + * @return - + */ + public static boolean getIsNewUser(String type, ChatRoomMessage chatRoomMessage, String acooount) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, acooount); + if (extension == null || extension.get(type) == null) return false; + return (boolean) extension.get(type); + } + + /** + * 是否为新人 + * + * @return - + */ + public static boolean getIsNewUser(String type, ChatRoomMessage chatRoomMessage) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null || extension.get(type) == null) return false; + return (boolean) extension.get(type); + } + + /** + * 获取用户经验等级的图片 + * 获取用户魅力等级的图片 + * + * @return - + */ + public static String getLevel(String type, ChatRoomMessage chatRoomMessage, String account) { + Map extension = ExtensionUtil.getExtension(chatRoomMessage, account); + if (extension == null || extension.get(type) == null) return ""; + return extension.get(type).toString(); + } + + /** + * 获取这个聊天室成员的ext字段 + * + * @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()) + || chatRoomMember.getExtension() == null + || (o = chatRoomMember.getExtension().get(chatRoomMember.getAccount())) == null) + return null; + return (Map) o; + } + + public static Drawable getDrawable(Context context, String name) { + String resourcePath = NobleDataManager.get().getResourcePath(); + if (TextUtils.isEmpty(resourcePath) || TextUtils.isEmpty(name)) return null; + int resourceType = getResourceType(name); + String targetPath = ""; + if (resourceType == NobleResourceType.URLS) { + targetPath = name; + } else if (resourceType == NobleResourceType.IDS) { + targetPath = resourcePath + File.separator + name + ".png"; + } + Bitmap bitmap = null; + try { + bitmap = BitmapFactory.decodeStream(new FileInputStream(targetPath)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return new BitmapDrawable(context.getResources(), bitmap); + } + + /** + * 获取贵族的名字 + * + * @param level 贵族的等级 + * @return 贵族的名字 + */ + public static String getNobleName(int level) { + NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); + if (nobleRight == null) return ""; + return nobleRight.getName(); + } + + /** + * 获取贵族的名字 + * + * @param level 贵族的等级 + * @return 贵族的名字 + */ + public static String getNobleName(String level) { + if (TextUtils.isEmpty(level)) return ""; + NobleRight nobleRight = NobleDataManager.get().getNobleRight(Integer.valueOf(level)); + if (nobleRight == null) return ""; + return nobleRight.getName(); + } + + /** + * 判断该等级的贵族能否被踢下麦 + * + * @param level -等级 + * @return 结果 + */ + public static boolean canKickMicroOrNot(int level) { + NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); + if (nobleRight == null) return true; + boolean prevent = nobleRight.isPrevent(); + return !prevent; + } + + /** + * 能不能被踢下麦 + * + * @param level - + * @return - + */ + public static boolean canKickMicroOrNot(String level) { + if (TextUtils.isEmpty(level)) return true; + NobleRight nobleRight = NobleDataManager.get().getNobleRight(Integer.valueOf(level)); + if (nobleRight == null) return true; + boolean prevent = nobleRight.isPrevent(); + return !prevent; + } + + public static boolean needShowSvgaOpenEffect(int level) { + NobleConfig nobleConfig = NobleDataManager.get().getNobleConfig(level); + if (nobleConfig == null) return false; + List openEffect = nobleConfig.getOpenEffect(); + if (ListUtils.isListEmpty(openEffect)) return false; + String effect = openEffect.get(0); + // 是本地的横幅,则展示到公屏上(不是横幅飘过的动效) + return effect.toLowerCase().endsWith(".svga"); + + } + + + /** + * 该等级的贵族是否有进场欢迎 + * + * @param level 贵族等级 + * @return - + */ + public static boolean canShowEnterRoomWelcome(int level) { + if (level <= 0) return false; + NobleRight nobleRight = NobleDataManager.get().getNobleRight(level); + if (nobleRight == null) return false; + return nobleRight.isEnterNotice(); + } + +} diff --git a/core/src/main/java/com/chwl/core/noble/bean/AllServiceGiftProtocol.java b/core/src/main/java/com/chwl/core/noble/bean/AllServiceGiftProtocol.java new file mode 100644 index 0000000..5b2215e --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/bean/AllServiceGiftProtocol.java @@ -0,0 +1,255 @@ +package com.chwl.core.noble.bean; + +import androidx.annotation.Keep; + +import com.chwl.core.bean.BaseProtocol; +import com.chwl.core.bean.I18N; + +/** + * Created by MadisonRong on 09/04/2018. + */ + +@Keep +public class AllServiceGiftProtocol extends BaseProtocol { + + @Keep + public static class DataBean { + /** + * sendUserNick : 分么 + * giftId : 1106 + * giftName : 福星高照 + * giftNum : 1 + * recvUserNick : 分么 + * recvUserUid : 91257 + * sendUserUid : 91257 + * roomTitle : 分么的房间 + * recvUserAvatar : https://image.zhongjialx.com/FsP5jVzi-y826xN0PKgVpciwRzlH?imageslim + * giftUrl : https://image.zhongjialx.com/Fvo_kBM_keRYMzqxIPEJhsoSPyAM?imageslim + * roomErbanNo : 3585963 + * sendUserAvatar : https://image.zhongjialx.com/FsP5jVzi-y826xN0PKgVpciwRzlH?imageslim + */ + + private String sendUserNick; + private int giftId; + private String giftName; + private I18N i18nGiftNameMap; + private int giftNum; + private String recvUserNick; + private long recvUserUid; + private long sendUserUid; + private String recvUserAvatar; + private String giftUrl; + private String sendUserAvatar; + private float notifyStaySecond; + private long roomErbanNo; + private boolean isSkipRoom; + private boolean isFullScreen; + private boolean isSendMsg; + private String msg; + private long roomUid; + private String roomTitle; + private String levelNum; + private int bgLevel=1; + private boolean isHomeShow; + + private long partitionId; + + public long getPartitionId() { + return partitionId; + } + + public void setPartitionId(long partitionId) { + this.partitionId = partitionId; + } + + public String getSendUserNick() { + return sendUserNick; + } + + public void setSendUserNick(String sendUserNick) { + this.sendUserNick = sendUserNick; + } + + public int getGiftId() { + return giftId; + } + + public void setGiftId(int giftId) { + this.giftId = giftId; + } + + public String getGiftName() { + return I18N.getFirstOrDefault(i18nGiftNameMap, giftName); + } + + public int getGiftNum() { + return giftNum; + } + + public void setGiftNum(int giftNum) { + this.giftNum = giftNum; + } + + public String getRecvUserNick() { + return recvUserNick; + } + + public void setRecvUserNick(String recvUserNick) { + this.recvUserNick = recvUserNick; + } + + public long getRecvUserUid() { + return recvUserUid; + } + + public void setRecvUserUid(long recvUserUid) { + this.recvUserUid = recvUserUid; + } + + public long getSendUserUid() { + return sendUserUid; + } + + public void setSendUserUid(long sendUserUid) { + this.sendUserUid = sendUserUid; + } + + public String getRecvUserAvatar() { + return recvUserAvatar; + } + + public void setRecvUserAvatar(String recvUserAvatar) { + this.recvUserAvatar = recvUserAvatar; + } + + public String getGiftUrl() { + return giftUrl; + } + + public void setGiftUrl(String giftUrl) { + this.giftUrl = giftUrl; + } + + public String getSendUserAvatar() { + return sendUserAvatar; + } + + public void setSendUserAvatar(String sendUserAvatar) { + this.sendUserAvatar = sendUserAvatar; + } + + public float getNotifyStaySecond() { + return notifyStaySecond; + } + + public void setNotifyStaySecond(float notifyStaySecond) { + this.notifyStaySecond = notifyStaySecond; + } + + public long getRoomErbanNo() { + return roomErbanNo; + } + + public void setRoomErbanNo(long roomErbanNo) { + this.roomErbanNo = roomErbanNo; + } + + public boolean isSkipRoom() { + return isSkipRoom; + } + + public void setSkipRoom(boolean skipRoom) { + isSkipRoom = skipRoom; + } + + public boolean isFullScreen() { + return isFullScreen; + } + + public void setFullScreen(boolean fullScreen) { + isFullScreen = fullScreen; + } + + public boolean isSendMsg() { + return isSendMsg; + } + + public void setSendMsg(boolean sendMsg) { + isSendMsg = sendMsg; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public long getRoomUid() { + return roomUid; + } + + public void setRoomUid(long roomUid) { + this.roomUid = roomUid; + } + + public String getRoomTitle() { + return roomTitle; + } + + public void setRoomTitle(String roomTitle) { + this.roomTitle = roomTitle; + } + + public String getLevelNum() { + return levelNum; + } + + public int getBgLevel() { + return bgLevel; + } + + public void setBgLevel(int bgLevel) { + this.bgLevel = bgLevel; + } + + public void setLevelNum(String levelNum) { + this.levelNum = levelNum; + } + + public boolean isHomeShow() { + return isHomeShow; + } + + public void setHomeShow(boolean homeShow) { + isHomeShow = homeShow; + } + + @Override + public String toString() { + return "DataBean{" + + "sendUserNick='" + sendUserNick + '\'' + + ", giftId=" + giftId + + ", giftName='" + giftName + '\'' + + ", giftNum=" + giftNum + + ", recvUserNick='" + recvUserNick + '\'' + + ", recvUserUid=" + recvUserUid + + ", sendUserUid=" + sendUserUid + + ", recvUserAvatar='" + recvUserAvatar + '\'' + + ", giftUrl='" + giftUrl + '\'' + + ", sendUserAvatar='" + sendUserAvatar + '\'' + + ", notifyStaySecond=" + notifyStaySecond + + ", roomErbanNo=" + roomErbanNo + + ", isSkipRoom=" + isSkipRoom + + ", isFullScreen=" + isFullScreen + + ", isSendMsg=" + isSendMsg + + ", msg='" + msg + '\'' + + ", roomUid=" + roomUid + + ", roomTitle='" + roomTitle + '\'' + + ", levelNum='" + levelNum + '\'' + + ", isHomeShow='" + isHomeShow + '\'' + + '}'; + } + } +} diff --git a/core/src/main/java/com/chwl/core/noble/bean/NobleConfig.java b/core/src/main/java/com/chwl/core/noble/bean/NobleConfig.java new file mode 100644 index 0000000..d19d457 --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/bean/NobleConfig.java @@ -0,0 +1,117 @@ +package com.chwl.core.noble.bean; + +import com.chwl.core.noble.NobleResourceType; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.List; + +/** + * 当个贵族能用的所有资源的所有值 + * + * @author xiaoyu + * @date 2018/1/8 + */ + +public class NobleConfig implements Serializable { + @SerializedName(NobleResourceType.KEY_LEVEL) + private String level; + @SerializedName(NobleResourceType.KEY_BADGE) + private List badge; + @SerializedName(NobleResourceType.KEY_CARD_BG) + private List cardBg; + @SerializedName(NobleResourceType.KEY_ZONE_BG) + private List zoneBg; + @SerializedName(NobleResourceType.KEY_OPEN_EFFECT) + private List openEffect; + @SerializedName(NobleResourceType.KEY_BANNER) + private List banner; + @SerializedName(NobleResourceType.KEY_HEAD_WEAR) + private List headWear; + @SerializedName(NobleResourceType.KEY_HALO) + private List halo; + @SerializedName(NobleResourceType.KEY_BUBBLE) + private List bubble; + @SerializedName(NobleResourceType.KEY_RECOMMEND) + private List recommend; + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public List getBadge() { + return badge; + } + + public void setBadge(List badge) { + this.badge = badge; + } + + public List getCardBg() { + return cardBg; + } + + public void setCardBg(List cardBg) { + this.cardBg = cardBg; + } + + public List getZoneBg() { + return zoneBg; + } + + public void setZoneBg(List zoneBg) { + this.zoneBg = zoneBg; + } + + public List getOpenEffect() { + return openEffect; + } + + public void setOpenEffect(List openEffect) { + this.openEffect = openEffect; + } + + public List getBanner() { + return banner; + } + + public void setBanner(List banner) { + this.banner = banner; + } + + public List getHeadWear() { + return headWear; + } + + public void setHeadWear(List headWear) { + this.headWear = headWear; + } + + public List getHalo() { + return halo; + } + + public void setHalo(List halo) { + this.halo = halo; + } + + public List getBubble() { + return bubble; + } + + public void setBubble(List bubble) { + this.bubble = bubble; + } + + public List getRecommend() { + return recommend; + } + + public void setRecommend(List recommend) { + this.recommend = recommend; + } +} diff --git a/core/src/main/java/com/chwl/core/noble/bean/NobleInfo.java b/core/src/main/java/com/chwl/core/noble/bean/NobleInfo.java new file mode 100644 index 0000000..32dec30 --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/bean/NobleInfo.java @@ -0,0 +1,239 @@ +package com.chwl.core.noble.bean; + +import android.text.TextUtils; + +import com.chwl.core.noble.NobleResourceType; +import com.chwl.core.noble.NobleUtil; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import io.realm.annotations.PrimaryKey; + +/** + * 当前贵族的所有信息,是UserInfo里面的一个字段 + * + * @author xiaoyu + * @date 2018/1/10 + */ + +public class NobleInfo implements Serializable { + @PrimaryKey + @SerializedName(value = "nobleId", alternate = {NobleResourceType.KEY_LEVEL, "id"}) + private int level; + private String badge; + @SerializedName(value = "micDecorate", alternate = {NobleResourceType.KEY_HEAD_WEAR}) + private String headWear; + @SerializedName(NobleResourceType.KEY_CARD_BG) + private String cardBg; + @SerializedName(NobleResourceType.KEY_ZONE_BG) + private String zoneBg; + @SerializedName(NobleResourceType.KEY_OPEN_EFFECT) + private String openEffect; + private String banner; + @SerializedName(value = "chatBubble", alternate = {NobleResourceType.KEY_BUBBLE}) + private String bubble; + @SerializedName(value = "micHalo") + private String halo; + @SerializedName(value = "roomBackground") + private String roomBg; + private long expire; + @SerializedName("enterHide") + private int enterHide; + @SerializedName("rankHide") + private int rankHide; + @SerializedName("goodNum") + private int goodNum; + /** 剩余推荐次数 */ + @SerializedName("recomCount") + private int recomCount; + /** 贵族的名字 */ + @SerializedName(value = "nobleName", alternate = {"name"}) + private String name; + + public NobleInfo() { + } + + public NobleInfo(Map map) { + Object levelObj = map.get(NobleResourceType.KEY_LEVEL); + if (levelObj instanceof Integer) { + this.level = (int) levelObj; + } else if (levelObj instanceof String) { + this.level = Integer.valueOf((String) levelObj); + } + this.badge = (String) map.get(NobleResourceType.KEY_BADGE); + this.bubble = (String) map.get(NobleResourceType.KEY_BUBBLE); + this.headWear = (String) map.get(NobleResourceType.KEY_HEAD_WEAR); + this.openEffect = (String) map.get(NobleResourceType.KEY_OPEN_EFFECT); + this.banner = (String) map.get(NobleResourceType.KEY_BANNER); + this.halo = (String) map.get(NobleResourceType.KEY_HALO); + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getBadge() { + return badge; + } + + public void setBadge(String badge) { + this.badge = badge; + } + + public String getHeadWear() { + return headWear; + } + + public void setHeadWear(String headWear) { + this.headWear = headWear; + } + + public String getCardBg() { + return cardBg; + } + + public void setCardBg(String cardBg) { + this.cardBg = cardBg; + } + + public String getZoneBg() { + return zoneBg; + } + + public void setZoneBg(String zoneBg) { + this.zoneBg = zoneBg; + } + + public String getOpenEffect() { + return openEffect; + } + + public void setOpenEffect(String openEffect) { + this.openEffect = openEffect; + } + + public String getBanner() { + return banner; + } + + public void setBanner(String banner) { + this.banner = banner; + } + + public String getBubble() { + return bubble; + } + + public void setBubble(String bubble) { + this.bubble = bubble; + } + + public String getHalo() { + return halo; + } + + public void setHalo(String halo) { + this.halo = halo; + } + + public String getRoomBg() { + return roomBg; + } + + public void setRoomBg(String roomBg) { + this.roomBg = roomBg; + } + + public int getItemCounts() { + return NobleUtil.getNobleRightItemCounts(level); + } + + public long getExpire() { + return expire; + } + + public void setExpire(long expire) { + this.expire = expire; + } + + public boolean isNobleEnterHide() { + return enterHide > 0; + } + + @SerializedName("") + public void setEnterHide(int enterHide) { + this.enterHide = enterHide; + } + + public void setEnterHide(boolean enterHide) { + this.enterHide = enterHide ? 1 : 0; + } + + public boolean isNobleRankHide() { + return rankHide > 0; + } + + public void setRankHide(int rankHide) { + this.rankHide = rankHide; + } + + public void setRankHide(boolean rankHide) { + this.rankHide = rankHide ? 1 : 0; + } + + public int getGoodNum() { + return goodNum; + } + + public void setGoodNum(int goodNum) { + this.goodNum = goodNum; + } + + public int getRecomCount() { + return recomCount; + } + + public void setRecomCount(int recomCount) { + this.recomCount = recomCount; + } + + public int getEnterHide() { + return enterHide; + } + + public int getRankHide() { + return rankHide; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map toMap(Map map) { + if (map==null){ + map = new HashMap<>(8); + } + map.put(NobleResourceType.KEY_LEVEL, String.valueOf(level)); + map.put(NobleResourceType.KEY_BADGE, badge); + map.put(NobleResourceType.KEY_BUBBLE, bubble); + map.put(NobleResourceType.KEY_HEAD_WEAR, headWear); + String openEffect = TextUtils.isEmpty(this.openEffect) ? NobleUtil.getOpenEffectByLevel(level) : this.openEffect; + map.put(NobleResourceType.KEY_OPEN_EFFECT, openEffect); + String banner = TextUtils.isEmpty(this.banner) ? NobleUtil.getBannerByLevel(level) : this.banner; + map.put(NobleResourceType.KEY_BANNER, banner); + map.put(NobleResourceType.KEY_HALO, halo); + map.put(NobleResourceType.KEY_ENTER_HIDE, enterHide); + return map; + } +} diff --git a/core/src/main/java/com/chwl/core/noble/bean/NobleProtocol.java b/core/src/main/java/com/chwl/core/noble/bean/NobleProtocol.java new file mode 100644 index 0000000..3f3e00d --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/bean/NobleProtocol.java @@ -0,0 +1,100 @@ +package com.chwl.core.noble.bean; + +import com.chwl.core.bean.BaseProtocol; + +/** + *

贵族协议

+ * + * @author jiahui + * @date 2018/1/20 + */ +public class NobleProtocol extends BaseProtocol { + + public static class DataBean { + /** + * nick : zoey7 + * uid : 90677 + * nobleInfo : {"id":7,"name":ResUtil.getString(R.string.xchat_android_core_noble_nobleprotocol_01),"openGold":1200000,"renewGold":1000000,"openReturn":1000000,"renewReturn":1100000,"screenMedal":1,"roomMedal":1,"userMedal":1,"userPage":1,"openEffect":2,"openNotice":2,"nobleGift":1,"specialFace":1,"enterNotice":1,"roomBackground":1,"micDecorate":1,"micHalo":1,"chatBubble":1,"enterHide":1,"rankHide":1,"specialService":1,"goodNum":4,"prevent":1,"recomRoom":3,"status":1} + * avatar : https://image.zhongjialx.com/Fn3z0MacrwoMe259bf2gw-MUi4JQ?imageslim + * type : 1 + */ + + private String nick; + private long uid; + private String avatar; + private int type; + private long roomErbanNo; + private String roomTitle; + private NobleInfo nobleInfo; + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public long getRoomErbanNo() { + return roomErbanNo; + } + + public void setRoomErbanNo(long roomErbanNo) { + this.roomErbanNo = roomErbanNo; + } + + public String getRoomTitle() { + return roomTitle; + } + + public void setRoomTitle(String roomTitle) { + this.roomTitle = roomTitle; + } + + public NobleInfo getNobleInfo() { + return nobleInfo; + } + + public void setNobleInfo(NobleInfo nobleInfo) { + this.nobleInfo = nobleInfo; + } + + @Override + public String toString() { + return "DataBean{" + + "nick='" + nick + '\'' + + ", uid=" + uid + + ", avatar='" + avatar + '\'' + + ", type=" + type + + ", roomErbanNo=" + roomErbanNo + + ", roomTitle='" + roomTitle + '\'' + + ", nobleInfo=" + nobleInfo + + '}'; + } + } + +} diff --git a/core/src/main/java/com/chwl/core/noble/bean/NobleRight.java b/core/src/main/java/com/chwl/core/noble/bean/NobleRight.java new file mode 100644 index 0000000..d498136 --- /dev/null +++ b/core/src/main/java/com/chwl/core/noble/bean/NobleRight.java @@ -0,0 +1,313 @@ +package com.chwl.core.noble.bean; + +import java.io.Serializable; + +/** + * 对应某等级贵族的所有特权 + * + * @author xiaoyu + * @date 2018/1/8 + */ + +public class NobleRight implements Serializable { + /** + * 贵族的等级 + */ + private int id; + /** + * 贵族的名字 + */ + private String name; + /** + * 开通的钻石 + */ + private int openGold; + /** + * 续费贵族的钻石 + */ + private int renewGold; + /** + * 开通返还的钻石 + */ + private int openReturn; + /** + * 续费返回的钻石 + */ + private int renewReturn; + /** + * 公屏勋章 + */ + private byte screenMedal; + /** + * 房间小卡片勋章 + */ + private byte roomMedal; + /** + * 个人中心勋章 + */ + private byte userMedal; + /** + * 个人主页 + */ + private byte userPage; + /** + * 开通特效 + */ + private byte openEffect; + /** + * 开通全局通知 + */ + private byte openNotice; + /** + * 是否可以发贵族礼物 + */ + private byte nobleGift; + /** + * 是否可以发贵族表情 + */ + private byte spacialFace; + /** + * 进房间欢迎 + */ + private byte enterNotice; + /** + * 房间背景 + */ + private byte roomBackground; + /** + * 头饰 + */ + private byte micDecorate; + /** + * 麦上光晕 + */ + private byte micHalo; + /** + * 聊天室气泡 + */ + private byte chatBubble; + /** + * 进房间隐身 + */ + private byte enterHide; + /** + * 排行榜隐身 + */ + private byte rankHide; + /** + * 专属服务 + */ + private byte specialService; + /** + * 靓号 + */ + private byte goodNum; + /** + * 防被踢下麦 / 防禁麦 + */ + private byte prevent; + /** + * 推荐房间 + */ + private byte recomRoom; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getOpenGold() { + return openGold; + } + + public void setOpenGold(int openGold) { + this.openGold = openGold; + } + + public int getRenewGold() { + return renewGold; + } + + public void setRenewGold(int renewGold) { + this.renewGold = renewGold; + } + + public int getOpenReturn() { + return openReturn; + } + + public void setOpenReturn(int openReturn) { + this.openReturn = openReturn; + } + + public int getRenewReturn() { + return renewReturn; + } + + public void setRenewReturn(int renewReturn) { + this.renewReturn = renewReturn; + } + + public boolean isScreenMedal() { + return screenMedal >= 1; + } + + public void setScreenMedal(byte screenMedal) { + this.screenMedal = screenMedal; + } + + public boolean isRoomMedal() { + return roomMedal >= 1; + } + + public void setRoomMedal(byte roomMedal) { + this.roomMedal = roomMedal; + } + + public boolean isUserMedal() { + return userMedal >= 1; + } + + public void setUserMedal(byte userMedal) { + this.userMedal = userMedal; + } + + public boolean isUserPage() { + return userPage >= 1; + } + + public void setUserPage(byte userPage) { + this.userPage = userPage; + } + + public boolean isOpenEffect() { + return openEffect >= 1; + } + + public void setOpenEffect(byte openEffect) { + this.openEffect = openEffect; + } + + public boolean isOpenNotice() { + return openNotice >= 1; + } + + public void setOpenNotice(byte openNotice) { + this.openNotice = openNotice; + } + + public boolean isNobleGift() { + return nobleGift >= 1; + } + + public void setNobleGift(byte nobleGift) { + this.nobleGift = nobleGift; + } + + public boolean isSpacialFace() { + return spacialFace >= 1; + } + + public void setSpacialFace(byte spacialFace) { + this.spacialFace = spacialFace; + } + + public boolean isEnterNotice() { + return enterNotice >= 1; + } + + public void setEnterNotice(byte enterNotice) { + this.enterNotice = enterNotice; + } + + public boolean isRoomBackground() { + return roomBackground >= 1; + } + + public void setRoomBackground(byte roomBackground) { + this.roomBackground = roomBackground; + } + + public boolean isMicDecorate() { + return micDecorate >= 1; + } + + public void setMicDecorate(byte micDecorate) { + this.micDecorate = micDecorate; + } + + public boolean isMicHalo() { + return micHalo >= 1; + } + + public void setMicHalo(byte micHalo) { + this.micHalo = micHalo; + } + + public boolean isChatBubble() { + return chatBubble >= 1; + } + + public void setChatBubble(byte chatBubble) { + this.chatBubble = chatBubble; + } + + public boolean isEnterHide() { + return enterHide >= 1; + } + + public void setEnterHide(byte enterHide) { + this.enterHide = enterHide; + } + + public boolean isRankHide() { + return rankHide >= 1; + } + + public void setRankHide(byte rankHide) { + this.rankHide = rankHide; + } + + public boolean isSpecialService() { + return specialService >= 1; + } + + public void setSpecialService(byte specialService) { + this.specialService = specialService; + } + + public boolean isGoodNum() { + return goodNum >= 1; + } + + public void setGoodNum(byte goodNum) { + this.goodNum = goodNum; + } + + public boolean isPrevent() { + return prevent >= 1; + } + + public void setPrevent(byte prevent) { + this.prevent = prevent; + } + + public boolean isRecomRoom() { + return recomRoom >= 1; + } + + public void setRecomRoom(byte recomRoom) { + this.recomRoom = recomRoom; + } +} diff --git a/core/src/main/java/com/chwl/core/patriarch/bean/LimitNotice.java b/core/src/main/java/com/chwl/core/patriarch/bean/LimitNotice.java new file mode 100644 index 0000000..1fb0de1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/patriarch/bean/LimitNotice.java @@ -0,0 +1,17 @@ +package com.chwl.core.patriarch.bean; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/8/7 + */ +@Setter +@Getter +public class LimitNotice implements Serializable { + + private String msg; + +} diff --git a/core/src/main/java/com/chwl/core/patriarch/event/CloseMinRoomEvent.java b/core/src/main/java/com/chwl/core/patriarch/event/CloseMinRoomEvent.java new file mode 100644 index 0000000..a17be64 --- /dev/null +++ b/core/src/main/java/com/chwl/core/patriarch/event/CloseMinRoomEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.patriarch.event; + +/** + * 关闭最小化房间(如果房间存在的话) + * create by lvzebiao @2019/8/20 + */ +public class CloseMinRoomEvent { +} diff --git a/core/src/main/java/com/chwl/core/patriarch/event/ImPushMsgPmLimitTimeEvent.java b/core/src/main/java/com/chwl/core/patriarch/event/ImPushMsgPmLimitTimeEvent.java new file mode 100644 index 0000000..85dc757 --- /dev/null +++ b/core/src/main/java/com/chwl/core/patriarch/event/ImPushMsgPmLimitTimeEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.patriarch.event; + +import com.chwl.core.base.BaseBusEvent; + +/** + * im推送消息 青少年模式禁止进房事件通知 + * create by lvzebiao @2019/8/8 + */ +public class ImPushMsgPmLimitTimeEvent extends BaseBusEvent { + + public ImPushMsgPmLimitTimeEvent(String data) { + super(data); + } + +} diff --git a/core/src/main/java/com/chwl/core/patriarch/event/PmDismissAllLimitDialogEvent.java b/core/src/main/java/com/chwl/core/patriarch/event/PmDismissAllLimitDialogEvent.java new file mode 100644 index 0000000..a9a5e45 --- /dev/null +++ b/core/src/main/java/com/chwl/core/patriarch/event/PmDismissAllLimitDialogEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.patriarch.event; + +/** + * 因为有可能存在,多个限制时长弹窗的存在, + * 所以操作后,发消息,dismiss掉其他弹窗 + * create by lvzebiao @2019/8/9 + */ +public class PmDismissAllLimitDialogEvent { +} diff --git a/core/src/main/java/com/chwl/core/patriarch/exception/PmRoomLimitException.java b/core/src/main/java/com/chwl/core/patriarch/exception/PmRoomLimitException.java new file mode 100644 index 0000000..c6946d1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/patriarch/exception/PmRoomLimitException.java @@ -0,0 +1,17 @@ +package com.chwl.core.patriarch.exception; + + +import com.chwl.core.base.BaseErrorException; + +/** + * 青少年模式 限制进房/开房 + * create by lvzebiao @2019/8/7 + */ +public class PmRoomLimitException extends BaseErrorException { + + public final static int ERROR_CODE = 30000; + + public PmRoomLimitException(String msg) { + super(msg); + } +} diff --git a/core/src/main/java/com/chwl/core/pay/GoldGiveModel.java b/core/src/main/java/com/chwl/core/pay/GoldGiveModel.java new file mode 100644 index 0000000..c147e85 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/GoldGiveModel.java @@ -0,0 +1,62 @@ +package com.chwl.core.pay; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.pay.bean.GiveInfo; +import com.chwl.core.pay.event.SendGoldSuccessEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * create by lvzebiao @2019/12/1 + */ +public class GoldGiveModel extends BaseModel implements IGoldGiveModel{ + + private final Api api = RxNet.create(Api.class); + + @Override + public Single> getGiveItemList() { + return api.apiGoldSendList() + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single giveGold(long targetUid, int goldNum, String paymentPwd) { + return api.apiGoldSend(AuthModel.get().getCurrentUid(), targetUid, goldNum, paymentPwd) + .compose(RxHelper.handleCommon()) + .doOnSuccess(s -> { + EventBus.getDefault().post(new SendGoldSuccessEvent(s)); + PayModel.get().getWalletInfo(AuthModel.get().getCurrentUid()) + .subscribe(); + }); + } + + private interface Api { + /** + * + */ + @GET("gold/sendList") + Single>> apiGoldSendList(); + + /** + * + */ + @POST("gold/send") + Single> apiGoldSend(@Query("uid") long uid, + @Query("targetUid") long targetUid, + @Query("goldNum") int goldNum, + @Query("paymentPwd") String paymentPwd); + } + +} diff --git a/core/src/main/java/com/chwl/core/pay/IGoldGiveModel.java b/core/src/main/java/com/chwl/core/pay/IGoldGiveModel.java new file mode 100644 index 0000000..9b8a156 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/IGoldGiveModel.java @@ -0,0 +1,18 @@ +package com.chwl.core.pay; + +import com.chwl.core.pay.bean.GiveInfo; + +import java.util.List; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2019/12/1 + */ +public interface IGoldGiveModel { + + Single> getGiveItemList(); + + Single giveGold(long targetUid, int goldNum, String paymentPwd); + +} diff --git a/core/src/main/java/com/chwl/core/pay/IPayModel.java b/core/src/main/java/com/chwl/core/pay/IPayModel.java new file mode 100644 index 0000000..c3ac96a --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/IPayModel.java @@ -0,0 +1,84 @@ +package com.chwl.core.pay; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bean.response.result.ChargeListResult; +import com.chwl.core.pay.bean.ChargeBean; +import com.chwl.core.pay.bean.PayRecordId; +import com.chwl.core.pay.bean.WalletInfo; + +import java.util.List; + +import io.reactivex.Single; + +/** + * 访问网络 的方法 + * Created by zhouxiangfeng on 2017/6/19. + */ + +public interface IPayModel extends IModel { + void refreshWalletInfo(boolean isNotice); + + WalletInfo getCurrentWalletInfo(); + + void minusGold(float price); + + void setCurrentWalletInfo(WalletInfo walletInfo); + + // 查询钱包的方法,需要加权限ticket + Single getWalletInfo(long uid, String cache); + + Single getWalletInfo(long uid); + + Single getWalletInfo(); + /* + 获取充值产品列表 + 1,facebook + 2,line公众号充值 + 3,苹果充值 + */ + + Single getChargeList(int channelType, long uid); + + Single> getVipList(); + + /** + * 修改支付密码时候,绑定手机时候获取手机验证码 + * + * @param mobile + * @param checkExists + * @param uid + * @param ticket + * @param type + * @return + */ + Single> getCode(String mobile, + boolean checkExists, + long uid, + String ticket, + String type); + + /** + * 修改支付密码时候,发送到后台验证手机号与手机验证码是否匹配 + * + * @param mobile + * @param code + * @return + */ + Single verifyCode(String phoneAreaCode, String mobile, String code); + Single verifyCodeEmail(String emailAddress, String code); + + void setFirstChargeSuccess(boolean firstChargeSuccess); + + + Single verifyOrder(String chargeRecordId, + String googlePlayProdId, + String packageName, + String purchaseToken); + + Single placeOrder(String googlePlayProdId); + + Single getChargeContact(); + + Single giveGold(long toUid, String goldNum, String password); +} diff --git a/core/src/main/java/com/chwl/core/pay/PayModel.java b/core/src/main/java/com/chwl/core/pay/PayModel.java new file mode 100644 index 0000000..57ac45d --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/PayModel.java @@ -0,0 +1,455 @@ +package com.chwl.core.pay; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ACCOUNT; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.R; +import com.chwl.core.XConstants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bean.response.result.ChargeListResult; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.pay.bean.ChargeBean; +import com.chwl.core.pay.bean.PayRecordId; +import com.chwl.core.pay.bean.WalletInfo; +import com.chwl.core.pay.event.ChargeCustomNotificationEvent; +import com.chwl.core.pay.event.FirstRechargeEvent; +import com.chwl.core.pay.event.GetWalletInfoEvent; +import com.chwl.core.pay.event.UpdateWalletInfoEvent; +import com.chwl.core.user.event.LoginUserInfoUpdateEvent; +import com.chwl.core.utils.net.IgnoreException; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.codec.DESUtils; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * 实现网络的方法 + * Created by zhouxiangfeng on 2017/6/19. + */ + +public class PayModel extends BaseModel implements IPayModel { + public static final String TAG = "PayModel"; + public static final String CACHE_STRATEGY_NO_CACHE = "no-cache"; + public static final String CACHE_STRATEGY_MAX_STALE = "max-stale"; + + /** + * 充值时,金额过大,需要先实名认证 + */ + public static final int NOT_REAL_NAME_BEFORE_CHARGING = 10108; + + /** + * 封控, 限制充值 + */ + public static final int RECHARGE_LIMIT = 50000; + + protected WalletInfo walletInfo = new WalletInfo(); + + private boolean firstChargeSuccess = false; + + protected Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final PayModel INSTANCE = new PayModel(); + } + + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static PayModel get() { + return Helper.INSTANCE; + } + + protected PayModel() { + EventBus.getDefault().register(this); + } + + @Override + public void refreshWalletInfo(boolean isNotice) { + getMyRemoteWalletInfo().subscribe(info -> { + if (isNotice) { + EventBus.getDefault().post(new UpdateWalletInfoEvent()); + } + }); + } + + @Override + public WalletInfo getCurrentWalletInfo() { + return walletInfo; + } + + @Override + public void minusGold(float price) { + if (walletInfo != null) { + double gold = walletInfo.getDiamondNum(); + if (walletInfo.getDiamondNum() > 0 && walletInfo.getDiamondNum() >= price) { + walletInfo.setDiamondNum(gold - price); + EventBus.getDefault().post(new UpdateWalletInfoEvent()); + } + } + } + + @Override + public void setCurrentWalletInfo(WalletInfo walletInfo) { + this.walletInfo = walletInfo; + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoginEvent(LoginUserInfoUpdateEvent event) { + getWalletInfo(AuthModel.get().getCurrentUid(), CACHE_STRATEGY_NO_CACHE).subscribe(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onReceivedCustomNotification(ChargeCustomNotificationEvent event) { + JSONObject attachment = event.getAttachment(); + int headType = attachment.getIntValue("first"); + int subType = attachment.getIntValue("second"); + //LogUtil.print(attachment.toJSONString()); + if (headType > 0 && subType > 0) { + if (headType == CUSTOM_MSG_HEADER_TYPE_ACCOUNT) { + JSONObject jsonObject = (JSONObject) attachment.get("data"); + if (jsonObject == null) return; + WalletInfo walletInfo = new WalletInfo(); + walletInfo.setUid(jsonObject.getLong("uid")); + walletInfo.setDepositNum(jsonObject.getIntValue("depositNum")); + walletInfo.setDiamondNum(jsonObject.getLong("diamonds")); + walletInfo.setGoldNum(jsonObject.getIntValue("golds")); + walletInfo.setCrystals(jsonObject.getDoubleValue("crystals")); + walletInfo.nobleGoldNum = jsonObject.getDoubleValue("nobleGoldNum"); + walletInfo.chargeGoldNum = jsonObject.getDoubleValue("chargeGoldNum"); + if (jsonObject.containsKey("canGoldSendGift")) { + walletInfo.canGoldSendGift = jsonObject.getBoolean("canGoldSendGift"); + } + this.walletInfo = walletInfo; + // 兼容新版 + setWalletInfo(walletInfo); + IMNetEaseManager.get().getChatRoomEventObservable().onNext( + new RoomEvent().setEvent(RoomEvent.WALLET_UPDATE).setWalletInfo(walletInfo)); + EventBus.getDefault().post(new UpdateWalletInfoEvent()); + } + } + } + + //获取钱包信息 + @Override + public Single getWalletInfo(long uid, String cache) { + return api.getMyWallet( + uid, + AuthModel.get().getTicket(), + cache + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + .doOnSuccess(info -> { + walletInfo = info; + EventBus.getDefault().post(new GetWalletInfoEvent()); + }); + + } + + @Override + public Single getWalletInfo(long uid) { + return getWalletInfo(uid, CACHE_STRATEGY_NO_CACHE); + } + + //获取钱包信息 + @Override + public Single getWalletInfo() { + return api.getMyWallet() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + .doOnSuccess(info -> { + walletInfo = info; + EventBus.getDefault().post(new GetWalletInfoEvent()); + }); + + } + + @Override + public Single getChargeList(int channelType, long uid) { + return api.getChargeList( + String.valueOf(channelType), uid + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single> getVipList() { + return api.getVipList("2") + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 修改支付密码时候,绑定手机时候获取手机验证码 + * + * @param mobile + * @param checkExists + * @param uid + * @param ticket + * @param type + * @return + */ + @Override + public Single> getCode(String mobile, + boolean checkExists, + long uid, + String ticket, + String type) { + return api.getCode(DESUtils.DESAndBase64(mobile), checkExists, uid, ticket, type) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 修改支付密码时候,发送到后台验证手机号与手机验证码是否匹配 + * + * @param mobile + * @param code + * @return + */ + @Override + public Single verifyCode(String phoneAreaCode, String mobile, + String code) { + return api.verifyCode(phoneAreaCode, DESUtils.DESAndBase64(mobile), code) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_pay_paymodel_01)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single verifyCodeEmail(String emailAddress, String code) { + return api.verifyCodeEmail(DESUtils.DESAndBase64(emailAddress), code) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_pay_paymodel_01)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + public Single getMyRemoteWalletInfo() { + long uid = AuthModel.get().getCurrentUid(); + return getWalletInfo(uid, CACHE_STRATEGY_NO_CACHE) + .doOnSuccess(new Consumer() { + @Override + public void accept(WalletInfo info) throws Exception { + compatOtherWalletInfo(info); + PayModel.this.walletInfo = info; + } + }); + } + + /** + * 主要是为了兼容旧版的walletInfo + * + * @param walletInfo - + */ + public void setWalletInfo(WalletInfo walletInfo) { + this.walletInfo = walletInfo; + } + + /** + * 用来兼容本地的其他扣钱逻辑(PayCore)的本地缓存 + */ + private void compatOtherWalletInfo(WalletInfo walletInfo) { + // TODO: 2018/3/19 兼容旧版的支付逻辑 + setCurrentWalletInfo(walletInfo); + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onFirstRechargeEvent(FirstRechargeEvent event) { + setFirstChargeSuccess(true); + } + + @Override + public void setFirstChargeSuccess(boolean firstChargeSuccess) { + this.firstChargeSuccess = firstChargeSuccess; + } + + @Override + public Single verifyOrder(String chargeRecordId, + String googlePlayProdId, + String packageName, + String purchaseToken) { + return api.verifyOrder(chargeRecordId, googlePlayProdId, packageName, purchaseToken) + .compose(RxHelper.handleException()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(result.getData() == null ? "" : result.getData()); + } + if (result.getCode() == XConstants.CODE_IGNORE_TOAST) { + return Single.error(new IgnoreException(ResUtil.getString(R.string.xchat_android_core_pay_paymodel_03))); + } + return Single.error(new Throwable(result.getMessage())); + }) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single placeOrder(String googlePlayProdId) { + return api.placeOrder(googlePlayProdId) + .compose(RxHelper.handleCommon()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getChargeContact() { + return api.getChargeContact() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + + @Override + public Single giveGold(long toUid, String goldNum, String password) { + return api.giveGold(toUid, goldNum, password) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + public interface Api { + + /** + * 钻石转赠 + * + * @return + */ + @FormUrlEncoded + @POST("/user/diamond/give") + Single> giveGold(@Field("toUid") long toUid, + @Field("diamondNum") String diamondNum, + @Field("payPwd") String payPwd); + + /** + * 获取钱包 + * + * @param uid + * @param cacheStrategy 取值: + * {@link #CACHE_STRATEGY_NO_CACHE}: 强制刷新缓存 + * {@link #CACHE_STRATEGY_MAX_STALE} :直接从缓存里取出来 + * @return + */ + @GET("/purse/query") + Single> getMyWallet(@Query("uid") long uid, + @Query("ticket") String ticket, + @Header("Cache-Control") String cacheStrategy); + + /** + * 获取钱包 + * + * @return + */ + @GET("/purse/query") + Single> getMyWallet(); + + /** + * 获取充值产品列表 + * + * @param channelType + * @return + */ + @GET("/chargeprod/listV2") + Single> getChargeList(@Query("channelType") String channelType, + @Query("pub_uid") long pub_uid); + + + /** + * 修改支付密码时候,绑定手机时候获取手机验证码 + * + * @param mobile + * @param checkExists + * @param uid + * @param ticket + * @param type + * @return + */ + @POST("sms/getCode") + Single> getCode(@Query("mobile") String mobile, + @Query("checkExists") boolean checkExists, + @Query("uid") long uid, + @Query("ticket") String ticket, + @Query("type") String type); + + /** + * 修改支付密码时候,发送到后台验证手机号与手机验证码是否匹配 + * + * @param mobile + * @param code + * @return + */ + @GET("sms/verify") + Single> verifyCode(@Query("phoneAreaCode") String phoneAreaCode, + @Query("mobile") String mobile, + @Query("code") String code); + /** + * 验证邮箱 + */ + @POST("email/verify") + Single> verifyCodeEmail(@Query("emailAddress") String emailAddress, @Query("code") String code); + + @GET("/charge/guide/contact") + Single> getChargeContact(); + + /** + * 验证googlePlay订单 + * + * @return + */ + @FormUrlEncoded + @POST("/googlePlayBilling/verifyOrder") + Single> verifyOrder(@Field("chargeRecordId") String chargeRecordId, + @Field("googlePlayProdId") String googlePlayProdId, + @Field("packageName") String packageName, + @Field("purchaseToken") String purchaseToken); + + /** + * googlePlay预下单 + * + * @return + */ + @FormUrlEncoded + @POST("/googlePlayBilling/placeOrder") + Single> placeOrder(@Field("chargeProdId") String chargeProdId); + + + @GET("/chargeprod/getVipList") + Single>> getVipList(@Query("type") String type); + } + +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/Banner.kt b/core/src/main/java/com/chwl/core/pay/bean/Banner.kt new file mode 100644 index 0000000..a65ceb4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/Banner.kt @@ -0,0 +1,6 @@ +package com.chwl.core.pay.bean + +data class Banner( + val bannerUrl: String, + val linkUrl: String +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/pay/bean/ChargeBannerInfo.kt b/core/src/main/java/com/chwl/core/pay/bean/ChargeBannerInfo.kt new file mode 100644 index 0000000..cd629cb --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/ChargeBannerInfo.kt @@ -0,0 +1,6 @@ +package com.chwl.core.pay.bean + +data class ChargeBannerInfo( + val banners: List, + val isBanner: Boolean +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/pay/bean/ChargeBean.java b/core/src/main/java/com/chwl/core/pay/bean/ChargeBean.java new file mode 100644 index 0000000..7961ea7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/ChargeBean.java @@ -0,0 +1,123 @@ +package com.chwl.core.pay.bean; + +import com.example.module_base.support.billing.IProductDetails; + +import java.io.Serializable; + +/** + * Created by zhouxiangfeng on 2017/6/19. + */ + +public class ChargeBean implements Serializable{ + + /* + channelType:1google2公众号充值3苹果充值 + "chargeProdId": 1, //充值产品ID + "prodName": ResUtil.getString(R.string.pay_bean_chargebean_01), //产品显示名称 + "money": 6, //产品价格(单位:元) + "giftGoldNum": 20, //赠送钻石数量 + "channel": "wx" //充值渠道 + + */ + public String chargeProdId; + public String prodName; + public double money; + public int giftGoldNum; + public long chargeGoldNum; + public int channel; + public String prodDesc; + private IProductDetails mProductDetails; + + public boolean isSelected; + + + public ChargeBean(int money) { + this.money = money; + } + + public String getChargeProdId() { + return chargeProdId; + } + + public void setChargeProdId(String chargeProdId) { + this.chargeProdId = chargeProdId; + } + + public String getProdName() { + return prodName; + } + + public void setProdName(String prodName) { + this.prodName = prodName; + } + + public double getMoney() { + return money; + } + + public void setMoney(double money) { + this.money = money; + } + + public int getGiftGoldNum() { + return giftGoldNum; + } + + public void setGiftGoldNum(int giftGoldNum) { + this.giftGoldNum = giftGoldNum; + } + + public int getChannel() { + return channel; + } + + public void setChannel(int channel) { + this.channel = channel; + } + + public String getProdDesc() { + return prodDesc; + } + + public void setProdDesc(String prodDesc) { + this.prodDesc = prodDesc; + } + + public long getChargeGoldNum() { + return chargeGoldNum; + } + + public void setChargeGoldNum(long chargeGoldNum) { + this.chargeGoldNum = chargeGoldNum; + } + + public IProductDetails getProductDetails() { + return mProductDetails; + } + + public void setProductDetails(IProductDetails productDetails) { + this.mProductDetails = productDetails; + } + + public boolean isSelected() { + return isSelected; + } + + public void setSelected(boolean selected) { + isSelected = selected; + } + + @Override + public String toString() { + return "ChargeBean{" + + "chargeProdId='" + chargeProdId + '\'' + + ", prodName='" + prodName + '\'' + + ", money=" + money + + ", giftGoldNum=" + giftGoldNum + + ", channel=" + channel + + ", prodDesc='" + prodDesc + '\'' + + ", productDetails=" + mProductDetails + + ", isSelected=" + isSelected + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/ChargeChannelInfo.kt b/core/src/main/java/com/chwl/core/pay/bean/ChargeChannelInfo.kt new file mode 100644 index 0000000..fdc9d56 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/ChargeChannelInfo.kt @@ -0,0 +1,5 @@ +package com.chwl.core.pay.bean + +data class ChargeChannelInfo( + val isNative: Boolean +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/pay/bean/FirstChargeGoods.java b/core/src/main/java/com/chwl/core/pay/bean/FirstChargeGoods.java new file mode 100644 index 0000000..787e6b8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/FirstChargeGoods.java @@ -0,0 +1,22 @@ +package com.chwl.core.pay.bean; + + +import com.example.module_base.support.billing.IProductDetails; + +import java.util.ArrayList; + +import lombok.Data; + +@Data +public class FirstChargeGoods { + public FirstChargeGoods() { + } + private Double chargeMoney; + private String chargeProdDesc; + private String chargeProdId; + private String chargeProdTitle; + private ArrayList firstChargeRewardList; + private String giveMoney; + private boolean finishCharge; + private IProductDetails productDetails; +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/FirstChargeReward.java b/core/src/main/java/com/chwl/core/pay/bean/FirstChargeReward.java new file mode 100644 index 0000000..6797b93 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/FirstChargeReward.java @@ -0,0 +1,67 @@ +package com.chwl.core.pay.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import lombok.Data; + +@Data +public class FirstChargeReward implements Parcelable, MultiItemEntity { + + public FirstChargeReward() { + } + + public static final int ONE = 1; + public static final int TWO_LEFT = 2; + public static final int TWO_RIGHT = 3; + public static final int THREE = 4; + public static final int TWO_LEFT_SMALL = 5; + public static final int TWO_RIGHT_SMALL = 6; + public static final int SEVEN = 7; + + private String showPir; + private String showText; + private String showTime; + private int type; + + protected FirstChargeReward(Parcel in) { + showPir = in.readString(); + showText = in.readString(); + showTime = in.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(showPir); + dest.writeString(showText); + dest.writeString(showTime); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public FirstChargeReward createFromParcel(Parcel in) { + return new FirstChargeReward(in); + } + + @Override + public FirstChargeReward[] newArray(int size) { + return new FirstChargeReward[size]; + } + }; + + public void setItemType(int type) { + this.type = type; + } + + @Override + public int getItemType() { + return type; + } +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/GiveGoldResult.java b/core/src/main/java/com/chwl/core/pay/bean/GiveGoldResult.java new file mode 100644 index 0000000..9521e0e --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/GiveGoldResult.java @@ -0,0 +1,13 @@ +package com.chwl.core.pay.bean; + +import lombok.Data; + +/** + * create by lvzebiao @2019/12/1 + */ +@Data +public class GiveGoldResult { + + private int goldNum; + +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/GiveInfo.java b/core/src/main/java/com/chwl/core/pay/bean/GiveInfo.java new file mode 100644 index 0000000..8f7da55 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/GiveInfo.java @@ -0,0 +1,18 @@ +package com.chwl.core.pay.bean; + +import lombok.Data; + +/** + * 钻石赠送的每一项 + * create by lvzebiao @2019/12/1 + */ +@Data +public class GiveInfo { + + private String goldProdName; + + private int goldNum; + + private boolean selected; + +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/NewUserChargeInfo.java b/core/src/main/java/com/chwl/core/pay/bean/NewUserChargeInfo.java new file mode 100644 index 0000000..3fed27e --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/NewUserChargeInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.pay.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class NewUserChargeInfo { + private long limitEndTime; + private List limitFirstChargeTaskList; + public NewUserChargeInfo() { + } +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/PayRecordId.java b/core/src/main/java/com/chwl/core/pay/bean/PayRecordId.java new file mode 100644 index 0000000..a6e1d37 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/PayRecordId.java @@ -0,0 +1,14 @@ +package com.chwl.core.pay.bean; + +public class PayRecordId { + + private String recordId; + + public String getRecordId() { + return recordId; + } + + public void setRecordId(String recordId) { + this.recordId = recordId; + } +} diff --git a/core/src/main/java/com/chwl/core/pay/bean/WalletInfo.java b/core/src/main/java/com/chwl/core/pay/bean/WalletInfo.java new file mode 100644 index 0000000..585d5f8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/bean/WalletInfo.java @@ -0,0 +1,181 @@ +package com.chwl.core.pay.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * 钻石实体 + * + * @author Administrator + * @date 2017/7/20 0020 + */ + +public class WalletInfo implements Parcelable { + public long uid; + /** /** + * 金币,暂时没用到 用的地方H5的 + */ + public double golds; + /** 钻石数量 */ + public double diamonds; + /** 预扣款(押金) */ + public double depositNum; + public int amount; + /** 普通的钻石 */ + public double chargeGoldNum; + /** 贵族钻石 */ + public double nobleGoldNum; + /** + * true 显示钻石转赠 false 隐藏钻石转赠 + */ + private boolean sendGold; + /** + * 水晶,暂时没用到 用的地方H5的 + */ + private double crystals; + + /** 可转赠的钻石 */ + private double canGiveGoldNum; + /** 1:默认line,2:默认facebook */ + private int defaultPay; + /** + * 是否可以在送礼时合并使用金币 + */ + public boolean canGoldSendGift; + + public WalletInfo() { + } + + + protected WalletInfo(Parcel in) { + uid = in.readLong(); + golds = in.readDouble(); + diamonds = in.readDouble(); + depositNum = in.readDouble(); + amount = in.readInt(); + chargeGoldNum = in.readDouble(); + nobleGoldNum = in.readDouble(); + canGiveGoldNum = in.readDouble(); + defaultPay = in.readInt(); + canGoldSendGift = in.readInt() == 1; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(uid); + dest.writeDouble(golds); + dest.writeDouble(diamonds); + dest.writeDouble(depositNum); + dest.writeInt(amount); + dest.writeDouble(chargeGoldNum); + dest.writeDouble(nobleGoldNum); + dest.writeDouble(canGiveGoldNum); + dest.writeInt(defaultPay); + dest.writeInt(canGoldSendGift ? 1 : 0); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WalletInfo createFromParcel(Parcel in) { + return new WalletInfo(in); + } + + @Override + public WalletInfo[] newArray(int size) { + return new WalletInfo[size]; + } + }; + + public double getDiamondNum() { + return diamonds; + } + + public void setDiamondNum(double diamondNum) { + this.diamonds = diamondNum; + } + + + public long getUid() { + return uid; + } + + public int getDefaultPay() { + return defaultPay; + } + + public void setDefaultPay(int defaultPay) { + this.defaultPay = defaultPay; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public double getGoldNum() { + return golds; + } + + public void setGoldNum(double goldNum) { + this.golds = goldNum; + } + + public double getDepositNum() { + return depositNum; + } + + public void setDepositNum(int depositNum) { + this.depositNum = depositNum; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public double getCanGiveGoldNum() { + return canGiveGoldNum; + } + + public void setCanGiveGoldNum(double canGiveGoldNum) { + this.canGiveGoldNum = canGiveGoldNum; + } + + + + @Override + public String toString() { + return "WalletInfo{" + + "uid=" + uid + + ", goldNum=" + golds + + ", diamondNum=" + diamonds + + ", depositNum=" + depositNum + + ", canGiveGoldNum=" + canGiveGoldNum + + ", amount=" + amount + + ", defaultPay=" + defaultPay + + '}'; + } + + public boolean isSendGold() { + return sendGold; + } + + public void setSendGold(boolean sendGold) { + this.sendGold = sendGold; + } + + public double isCrystals() { + return crystals; + } + + public void setCrystals(double crystals) { + this.crystals = crystals; + } +} diff --git a/core/src/main/java/com/chwl/core/pay/event/ChargeCustomNotificationEvent.java b/core/src/main/java/com/chwl/core/pay/event/ChargeCustomNotificationEvent.java new file mode 100644 index 0000000..254bd90 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/ChargeCustomNotificationEvent.java @@ -0,0 +1,21 @@ +package com.chwl.core.pay.event; + + +import com.alibaba.fastjson2.JSONObject; + +import lombok.Data; + +@Data +public class ChargeCustomNotificationEvent { + + private JSONObject attachment; + + public JSONObject getAttachment() { + return attachment; + } + + public ChargeCustomNotificationEvent setAttachment(JSONObject attachment) { + this.attachment = attachment; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/pay/event/FirstChargeEvent.java b/core/src/main/java/com/chwl/core/pay/event/FirstChargeEvent.java new file mode 100644 index 0000000..b329a9e --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/FirstChargeEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.pay.event; + + +import com.chwl.core.pay.bean.FirstChargeReward; + +import java.util.ArrayList; + +import lombok.Data; + +@Data +public class FirstChargeEvent { + private String chargeProdTitle; + private ArrayList firstChargeRewardList; +} diff --git a/core/src/main/java/com/chwl/core/pay/event/FirstRechargeEvent.java b/core/src/main/java/com/chwl/core/pay/event/FirstRechargeEvent.java new file mode 100644 index 0000000..3ac5a90 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/FirstRechargeEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.pay.event; + +/** + * create by lvzebiao @2020/3/23 + */ +public class FirstRechargeEvent { +} diff --git a/core/src/main/java/com/chwl/core/pay/event/GetWalletInfoEvent.java b/core/src/main/java/com/chwl/core/pay/event/GetWalletInfoEvent.java new file mode 100644 index 0000000..bc6614e --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/GetWalletInfoEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.pay.event; + +/** + * create by lvzebiao on 2018/8/29 + */ +public class GetWalletInfoEvent { +} diff --git a/core/src/main/java/com/chwl/core/pay/event/NewUserChargeEvent.java b/core/src/main/java/com/chwl/core/pay/event/NewUserChargeEvent.java new file mode 100644 index 0000000..3804781 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/NewUserChargeEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.pay.event; + + +import com.chwl.core.pay.bean.FirstChargeReward; + +import java.util.ArrayList; + +import lombok.Data; + +@Data +public class NewUserChargeEvent { + private String chargeProdTitle; + private ArrayList firstChargeRewardList; +} diff --git a/core/src/main/java/com/chwl/core/pay/event/SendGoldSuccessEvent.java b/core/src/main/java/com/chwl/core/pay/event/SendGoldSuccessEvent.java new file mode 100644 index 0000000..8bce117 --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/SendGoldSuccessEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.pay.event; + +import com.chwl.core.base.BaseBusEvent; + +/** + * 赠送钻石成功的事件 + * create by lvzebiao @2019/12/1 + */ +public class SendGoldSuccessEvent extends BaseBusEvent { + + public SendGoldSuccessEvent(Integer data) { + super(data); + } +} diff --git a/core/src/main/java/com/chwl/core/pay/event/UpdateWalletInfoEvent.java b/core/src/main/java/com/chwl/core/pay/event/UpdateWalletInfoEvent.java new file mode 100644 index 0000000..fa8ebdc --- /dev/null +++ b/core/src/main/java/com/chwl/core/pay/event/UpdateWalletInfoEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.pay.event; + +/** + * create by lvzebiao on 2018/8/29 + */ +public class UpdateWalletInfoEvent { +} diff --git a/core/src/main/java/com/chwl/core/praise/IPraiseModel.java b/core/src/main/java/com/chwl/core/praise/IPraiseModel.java new file mode 100644 index 0000000..d32735e --- /dev/null +++ b/core/src/main/java/com/chwl/core/praise/IPraiseModel.java @@ -0,0 +1,35 @@ +package com.chwl.core.praise; + +import com.chwl.core.base.IModel; + +import io.reactivex.Single; + +/** + * Created by zhouxiangfeng on 2017/5/18. + */ + +public interface IPraiseModel extends IModel { + + /** + * uid:点赞人uid,必填 + * likedUId:被点赞人uid,必填 + * type:喜欢操作类型,1是喜欢,2是取消喜欢,必填 + * ticket:必填 + * 如果双方为相互喜欢,业务方像网易云发送直接加好友请求,双方直接成为好友。 + * 详见: + */ + Single praise(long likedUid, boolean isPraise); + + //取消和点赞合并一个方法 + //Single cancelPraise(long cancelUid); + + Single deleteLike(long deletedUid); + + Single getAllFans(long uid, int pageSize, int pageNo); + + + Single isPraised(long uid, long isLikeUid); + + boolean isPraised(long isLikeUid); + +} diff --git a/core/src/main/java/com/chwl/core/praise/PraiseModel.java b/core/src/main/java/com/chwl/core/praise/PraiseModel.java new file mode 100644 index 0000000..4cd2be9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/praise/PraiseModel.java @@ -0,0 +1,306 @@ +package com.chwl.core.praise; + +import android.annotation.SuppressLint; +import android.util.LongSparseArray; + +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bean.response.result.BooleanResult; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.RoomTipAttachment; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.praise.event.IsLikedEvent; +import com.chwl.core.praise.event.PraiseEvent; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by zhouxiangfeng on 2017/5/18. + */ + +public class PraiseModel extends BaseModel implements IPraiseModel { + private final LongSparseArray praiseCache = new LongSparseArray<>(); + private Api api = RxNet.create(Api.class); + + private PraiseModel() { + + } + + public static PraiseModel get() { + return Helper.INSTANCE; + } + + /** + * 1点赞,2取消 + */ + @Override + public Single praise(final long likedUid, final boolean isPraise) { + return api.praise( + AuthModel.get().getTicket(), + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(isPraise ? 1 : 2), + likedUid + "" + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(isPraise ? ResUtil.getString(R.string.xchat_android_core_praise_praisemodel_01) : ResUtil.getString(R.string.xchat_android_core_praise_praisemodel_02)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(new Consumer() { + @Override + public void accept(String s) throws Exception { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && roomInfo.getUid() == likedUid && isPraise) { + PraiseModel.this.sendAttentionRoomTipMsg(likedUid); + } + + praiseCache.put(likedUid, isPraise); + UserModel.get().updateCurrentUserInfo().subscribe(); + EventBus.getDefault().post(new PraiseEvent(isPraise, likedUid)); + } + }) + .doOnError(throwable -> { + EventBus.getDefault().post(new PraiseEvent(likedUid, throwable.getMessage())); + }); + + } + + /** + * 收藏房间成功 + * + * @param targetUid + */ + @SuppressLint("CheckResult") + public void setFollowRoomSuccessRoomTip(long targetUid) { + if (!AvRoomDataManager.get().isFirstFollow) return; + AvRoomDataManager.get().isFirstFollow = false; + UserModel.get().getUserInfo(targetUid).subscribe(new Consumer() { + @Override + public void accept(UserInfo userInfo) throws Exception { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && userInfo != null) { + UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); + if (myUserInfo == null) { + return; + } + RoomTipAttachment roomTipAttachment = + new RoomTipAttachment(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FOLLOW_ROOM, + CustomAttachment.CUSTOM_MSG_SUB_TYPE_FOLLOW_ROOM_SUCCESS); + roomTipAttachment.setUid(myUserInfo.getUid()); + roomTipAttachment.setNick(myUserInfo.getNick()); + roomTipAttachment.setTargetUid(targetUid); + roomTipAttachment.setTargetNick(userInfo.getNick()); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + // 自定义消息 + roomTipAttachment + ); + + IMNetEaseManager.get().sendChatRoomMessage(message, true) + .subscribe(chatRoomMessage -> { + if (chatRoomMessage == null) return; + // 更新自己公屏的信息 + IMNetEaseManager.get().addMessagesImmediately(chatRoomMessage); + }); + } + } + }); + } + + /** + * 此方法在耳伴client找不到调用 + */ + @Override + public Single deleteLike(final long deletedUid) { + return api.deleteLike( + AuthModel.get().getTicket(), + String.valueOf(AuthModel.get().getCurrentUid()), + deletedUid + "" + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_praise_praisemodel_03)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + /** + * 无调用 + */ + @Override + public Single getAllFans(long uid, int pageSize, int pageNo) { + return api.getAllFans( + String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(pageSize), + String.valueOf(pageNo) + ) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + @Override + public Single isPraised(long uid, final long isLikeUid) { +// http:// www.daxiaomao.com /fans/islike?uid=90001&isLikeUid=900002 + + return api.isLike( + String.valueOf(uid), + String.valueOf(isLikeUid) + ) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(new Consumer() { + @Override + public void accept(Boolean aBoolean) throws Exception { + EventBus.getDefault().post(new IsLikedEvent(aBoolean, isLikeUid)); + praiseCache.put(isLikeUid, aBoolean); + } + }); + + } + + @Override + public boolean isPraised(long isLikeUid) { + return praiseCache.get(isLikeUid,false); + } + + @SuppressLint("CheckResult") + private void sendAttentionRoomTipMsg(long targetUid) { + //如果关注的人不是房主,不显示公屏提示。 + if (!AvRoomDataManager.get().isRoomOwner(targetUid)) return; + //如果是超管关注,也不显示公屏 + if (SuperAdminUtil.isSuperAdmin()) { + return; + } + UserModel.get().getUserInfo(targetUid).subscribe(new Consumer() { + @Override + public void accept(UserInfo userInfo) throws Exception { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo != null && userInfo != null) { + UserInfo myUserInfo = UserModel.get().getCacheLoginUserInfo(); + + RoomTipAttachment roomTipAttachment = + new RoomTipAttachment(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP, + CustomAttachment.CUSTOM_MSG_SUB_TYPE_ROOM_TIP_ATTENTION_ROOM_OWNER); + roomTipAttachment.setUid(myUserInfo.getUid()); + roomTipAttachment.setNick(myUserInfo.getNick()); + roomTipAttachment.setTargetUid(targetUid); + roomTipAttachment.setTargetNick(userInfo.getNick()); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + // 自定义消息 + roomTipAttachment + ); + + IMNetEaseManager.get().sendChatRoomMessage(message, true) + .subscribe(chatRoomMessage -> { + if (chatRoomMessage == null) return; + // 更新自己公屏的信息 + IMNetEaseManager.get().addMessagesImmediately(chatRoomMessage); + }); + } + } + }); + + } + + interface Api { + + /** + * 点赞 + * + * @param ticket + * @param uid + * @param type + * @param likedUid + * @return + */ + @POST("/fans/like") + Single> praise(@Query("ticket") String ticket, + @Query("uid") String uid, + @Query("type") String type, + @Query("likedUid") String likedUid); + + + /** + * @param ticket + * @param uid + * @param likedUid + * @return + */ + @POST("/fans/fdelete") + Single> deleteLike(@Query("ticket") String ticket, + @Query("uid") String uid, + @Query("likedUid") String likedUid); + + + /** + * @param uid + * @param pageSize + * @param pageNo + * @return + */ + @POST("/fans/following") + Single> getAllFans(@Query("uid") String uid, + @Query("pageSize") String pageSize, + @Query("pageNo") String pageNo); + + + /** + * @param uid + * @param isLikeUid + * @return + */ + @GET("/fans/islike") + Single isLike(@Query("uid") String uid, + @Query("isLikeUid") String isLikeUid); + + } + + private static final class Helper { + public static final PraiseModel INSTANCE = new PraiseModel(); + } +} diff --git a/core/src/main/java/com/chwl/core/praise/event/IsLikedEvent.java b/core/src/main/java/com/chwl/core/praise/event/IsLikedEvent.java new file mode 100644 index 0000000..11ee241 --- /dev/null +++ b/core/src/main/java/com/chwl/core/praise/event/IsLikedEvent.java @@ -0,0 +1,17 @@ +package com.chwl.core.praise.event; + +/** + * create by lvzebiao on 2018/9/3 + */ +public class IsLikedEvent { + + public boolean isLiked; + + public long uid; + + public IsLikedEvent(boolean isLiked, long uid) { + this.isLiked = isLiked; + this.uid = uid; + } + +} diff --git a/core/src/main/java/com/chwl/core/praise/event/PraiseEvent.java b/core/src/main/java/com/chwl/core/praise/event/PraiseEvent.java new file mode 100644 index 0000000..be87924 --- /dev/null +++ b/core/src/main/java/com/chwl/core/praise/event/PraiseEvent.java @@ -0,0 +1,31 @@ +package com.chwl.core.praise.event; + +import lombok.Data; + +/** + * create by lvzebiao on 2018/9/4 + */ +@Data +public class PraiseEvent { + + private boolean praise; + + private boolean failed; + + private String error; + + private long likedUid; + + public PraiseEvent(boolean praise, long likedUid) { + this.praise = praise; + this.failed = false; + this.likedUid = likedUid; + } + + public PraiseEvent(long likedUid, String error) { + this.likedUid = likedUid; + this.failed = true; + this.error = error; + } + +} diff --git a/core/src/main/java/com/chwl/core/radish/IRadishModel.java b/core/src/main/java/com/chwl/core/radish/IRadishModel.java new file mode 100644 index 0000000..872c080 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/IRadishModel.java @@ -0,0 +1,15 @@ +package com.chwl.core.radish; + +import com.chwl.core.base.IModel; + +import io.reactivex.Single; + +public interface IRadishModel extends IModel { + Single getRadishRecord(int page, int pageSize, long date, byte type); + + Single updateRadishWallet(); + + RadishWalletInfo getRadishWalletInfo(); + + void minusRadish(int consumeNum); +} diff --git a/core/src/main/java/com/chwl/core/radish/RadishModel.java b/core/src/main/java/com/chwl/core/radish/RadishModel.java new file mode 100644 index 0000000..9c7cfb9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/RadishModel.java @@ -0,0 +1,115 @@ +package com.chwl.core.radish; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.pay.PayModel; +import com.chwl.core.radish.event.RadishWalletInfoUpdateEvent; +import com.chwl.core.user.event.LoadLoginUserInfoEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.google.gson.Gson; +import com.google.gson.JsonElement; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public class RadishModel extends BaseModel implements IRadishModel { + private RadishModel.Api api = RxNet.create(RadishModel.Api.class); + + private static final class Helper { + public static final RadishModel INSTANCE = new RadishModel(); + } + public void refreshApi() { + api = RxNet.create(Api.class); + } + public static RadishModel get() { + return Helper.INSTANCE; + } + + private RadishModel() { + EventBus.getDefault().register(this); + } + + /** + * 萝卜钱包 + */ + private RadishWalletInfo radishWalletInfo; + + @Override + public Single getRadishRecord(int page, int pageSize, long date, byte type) { + return api.getRadishRecord(AuthModel.get().getCurrentUid(), page, pageSize, date, type) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + String json = new Gson().toJson(stringServiceResult); + RadishRecordResult result = new Gson().fromJson(json, RadishRecordResult.class); + return Single.just(result); + } + }) + .compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single updateRadishWallet() { + return api.getWallet(AuthModel.get().getCurrentUid(), "1") + .compose(RxHelper.handleCommon()) + .doOnSuccess(info -> { + radishWalletInfo = info; + EventBus.getDefault().post(new RadishWalletInfoUpdateEvent()); + }); + } + + @Override + public RadishWalletInfo getRadishWalletInfo() { + if (radishWalletInfo == null) { + radishWalletInfo = new RadishWalletInfo(); + updateRadishWallet().subscribe(); + } + return radishWalletInfo; + } + + @Override + public void minusRadish(int consumeNum) { + if (radishWalletInfo == null) { + return; + } + long afterNum = radishWalletInfo.getAmount() - consumeNum; + if (afterNum < 0) { + afterNum = 0; + } + radishWalletInfo.setAmount(afterNum); + EventBus.getDefault().post(new RadishWalletInfoUpdateEvent()); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoadLoginUserInfoEvent(LoadLoginUserInfoEvent event) { + PayModel.get().getWalletInfo(); + } + + interface Api { + /** + * @param type 1:赠送 2:收入 + */ + @GET("radish/bill/record/get") + Single> getRadishRecord(@Query("uid") long uid, + @Query("page") int page, + @Query("pageSize") int pageSize, + @Query("date") long date, + @Query("type") byte type); + + /** + * @param currencyType 1:萝卜 + */ + @GET("/wallet/get") + Single> getWallet(@Query("uid") long uid, + @Query("currencyType") String currencyType); + } +} diff --git a/core/src/main/java/com/chwl/core/radish/RadishRecordResult.java b/core/src/main/java/com/chwl/core/radish/RadishRecordResult.java new file mode 100644 index 0000000..74ed6f6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/RadishRecordResult.java @@ -0,0 +1,7 @@ +package com.chwl.core.radish; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bills.bean.RadishRecordListInfo; + +public class RadishRecordResult extends ServiceResult { +} diff --git a/core/src/main/java/com/chwl/core/radish/RadishWalletInfo.java b/core/src/main/java/com/chwl/core/radish/RadishWalletInfo.java new file mode 100644 index 0000000..e7ae242 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/RadishWalletInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.radish; + +import lombok.Data; + +@Data +public class RadishWalletInfo { + private long uid; + private long amount; + private byte currencyType; // 1:萝卜 + private byte useStaus; // 0:冻结 1:正常 +} diff --git a/core/src/main/java/com/chwl/core/radish/event/RadishWalletInfoUpdateEvent.java b/core/src/main/java/com/chwl/core/radish/event/RadishWalletInfoUpdateEvent.java new file mode 100644 index 0000000..139b284 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/event/RadishWalletInfoUpdateEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.radish.event; + +/** + * 萝卜钱包变更 + * create by lvzebiao @2019/3/25 + */ +public class RadishWalletInfoUpdateEvent { +} diff --git a/core/src/main/java/com/chwl/core/radish/event/ReceivePrizeEvent.java b/core/src/main/java/com/chwl/core/radish/event/ReceivePrizeEvent.java new file mode 100644 index 0000000..d1b1cee --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/event/ReceivePrizeEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.radish.event; + +/** + * 领取奖励事件 + * create by lvzebiao @2019/3/28 + */ +public class ReceivePrizeEvent { +} diff --git a/core/src/main/java/com/chwl/core/radish/event/SignInSuccessEvent.java b/core/src/main/java/com/chwl/core/radish/event/SignInSuccessEvent.java new file mode 100644 index 0000000..00e1f7d --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/event/SignInSuccessEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.radish.event; + +/** + * 签到成功 + * create by lvzebiao @2019/3/26 + */ +public class SignInSuccessEvent { +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/ISignInModel.java b/core/src/main/java/com/chwl/core/radish/signin/ISignInModel.java new file mode 100644 index 0000000..4c24782 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/ISignInModel.java @@ -0,0 +1,52 @@ +package com.chwl.core.radish.signin; + +import com.chwl.core.radish.signin.bean.DrawNoticeInfo; +import com.chwl.core.radish.signin.bean.ReceiveTotalRewardInfo; +import com.chwl.core.radish.signin.bean.ReplenishSignInfo; +import com.chwl.core.radish.signin.bean.RewardNoticeInfo; +import com.chwl.core.radish.signin.bean.SignDetailInfo; +import com.chwl.core.radish.signin.bean.SignDrawInfo; +import com.chwl.core.radish.signin.bean.SignInfo; + +import java.util.List; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2019/3/14 + */ +public interface ISignInModel { + + Single sign(); + + Single signDetail(); + + Single signDraw(); + + Single signRemind(); + + Single> drawNotice(); + + Single> getRewardTotalNotice(); + + Single> getRewardTodayNotice(); + + Single getShareImage(int shareType, String day, String reward); + + Single receiveTotalReward(long configId); + + void signShare(); + + Single insertSignDay(int signDay); + + /** + * 获取补签信息 + */ + Single getReplenishSignInfo(int signDay); + + /** + * 补签 + */ + Single replenishSign(int signDay); + +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/SignInModel.java b/core/src/main/java/com/chwl/core/radish/signin/SignInModel.java new file mode 100644 index 0000000..cdf5c59 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/SignInModel.java @@ -0,0 +1,233 @@ +package com.chwl.core.radish.signin; + +import android.util.Log; + +import com.chwl.core.BuildConfig; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.radish.event.SignInSuccessEvent; +import com.chwl.core.radish.signin.bean.DrawNoticeInfo; +import com.chwl.core.radish.signin.bean.ReceiveTotalRewardInfo; +import com.chwl.core.radish.signin.bean.ReplenishSignInfo; +import com.chwl.core.radish.signin.bean.RewardNoticeInfo; +import com.chwl.core.radish.signin.bean.SignDetailInfo; +import com.chwl.core.radish.signin.bean.SignDrawInfo; +import com.chwl.core.radish.signin.bean.SignInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.List; + +import javax.annotation.Nullable; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * create by lvzebiao @2019/3/14 + */ +public class SignInModel extends BaseModel implements ISignInModel { + public static final int SHARE_TYPE_NORMAL = 1; + public static final int SHARE_TYPE_REWARD = 2; + public static final int SHARE_TYPE_DRAW_GOLD = 3; + + private final SignInModel.Api api = RxNet.create(SignInModel.Api.class); + + /** + * 签到 + */ + @Override + public Single sign() { + return api.sign(AuthModel.get().getCurrentUid()).compose(RxHelper.handleCommon()) + .doOnSuccess(integer -> EventBus.getDefault().post(new SignInSuccessEvent())); + } + + /** + * 签到详情 + */ + @Override + public Single signDetail() { + return api.signDetail(AuthModel.get().getCurrentUid()).compose(RxHelper.handleCommon()); + } + + /** + * 瓜分钻石 + */ + @Override + public Single signDraw() { + return api.signDraw(AuthModel.get().getCurrentUid()).compose(RxHelper.handleCommon()); + } + + /** + * 签到提醒开关 + */ + @Override + public Single signRemind() { + return api.signRemind(AuthModel.get().getCurrentUid()).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + return Single.just(objectServiceResult.isSuccess()); + } + }).compose(RxHelper.handleSchAndExce()); + } + + /** + * 瓜分钻石通知栏 + */ + @Override + public Single> drawNotice() { + return api.drawNotice().compose(RxHelper.handleCommon()); + } + + /** + * 累积签到奖励预告 + */ + @Override + public Single> getRewardTotalNotice() { + return api.getRewardTotalNotice(AuthModel.get().getCurrentUid()).compose(RxHelper.handleCommon()); + } + + /** + * 每日签到奖励预告 + */ + @Override + public Single> getRewardTodayNotice() { + return api.getRewardTodayNotice(AuthModel.get().getCurrentUid()).compose(RxHelper.handleCommon()); + } + + /** + * 获取签到分享图片 + * + * @param shareType 1普通,2领取礼物,3瓜分钻石 + */ + @Override + public Single getShareImage(int shareType, @Nullable String day, @Nullable String reward) { + return api.getShareImage(AuthModel.get().getCurrentUid(), shareType, day, reward).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) + return Single.just(stringServiceResult.getData()); + else + return Single.error(new Throwable(ResUtil.getString(R.string.radish_signin_signinmodel_01))); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single receiveTotalReward(long configId) { + return api.receiveTotalReward(AuthModel.get().getCurrentUid(), configId).compose(RxHelper.handleCommon()); + } + + @Override + public void signShare() { + api.signShare(AuthModel.get().getCurrentUid()).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult.isSuccess()) { + Log.i(ResUtil.getString(R.string.radish_signin_signinmodel_02), "ok"); + } else + Log.i(ResUtil.getString(R.string.radish_signin_signinmodel_03), "Error"); + return null; + } + }).compose(RxHelper.handleSchAndExce()).subscribe(); + } + + @Override + public Single insertSignDay(int signDay) { + if (BuildConfig.DEBUG) { + return api.insertSignRecord(AuthModel.get().getCurrentUid(), signDay).compose(RxHelper.handleCommon()); + } + return null; + } + + /** + * 获取补签信息 + */ + @Override + public Single getReplenishSignInfo(int signDay) { + return api.getReplenishSignInfo(AuthModel.get().getCurrentUid(), signDay) + .compose(RxHelper.handleCommon()); + } + + /** + * 补签 + */ + @Override + public Single replenishSign(int signDay) { + return api.replenishSign(AuthModel.get().getCurrentUid(), signDay) + .compose(RxHelper.handleGoods()) + .compose(RxHelper.handleCommon()) + .doOnSuccess(signInfo -> { + + } + ); + + } + + interface Api { + + @POST("/sign/sign") + Single> sign(@Query("uid") long uid); + + @POST("/sign/signDetail") + Single> signDetail(@Query("uid") long uid); + + @POST("/sign/draw") + Single> signDraw(@Query("uid") long uid); + + @POST("/sign/remind") + Single> signRemind(@Query("operUid") long operUid); + + @POST("/sign/drawNotice") + Single>> drawNotice(); + + @POST("/sign/rewardTotalNotice") + Single>> getRewardTotalNotice(@Query("uid") long uid); + + /** + * 每日签到奖励预告 + */ + @POST("/sign/rewardTodayNotice") + Single>> getRewardTodayNotice(@Query("uid") long uid); + + @GET("/sign/getShareImage") + Single> getShareImage(@Query("uid") long uid, + @Query("shareType") int shareType, + @Query("day") String day, + @Query("reward") String reward); + + @POST("/sign/receiveTotalReward") + Single> receiveTotalReward(@Query("uid") long uid, @Query("configId") long configId); + + @POST("/sign/signShare") + Single> signShare(@Query("uid") long uid); + + @GET("/sign/insertSignRecord") + Single> insertSignRecord(@Query("uid") long uid, @Query("signDay") int signDay); + + /** + * 补签信息 + */ + @GET("/sign/replenish/info") + Single> getReplenishSignInfo(@Query("uid") long uid, + @Query("signDay") int signDay); + + /** + * 补签 + */ + @POST("/sign/replenish") + Single> replenishSign(@Query("uid") long uid, + @Query("signDay") int signDay); + + } + +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/DrawNoticeInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/DrawNoticeInfo.java new file mode 100644 index 0000000..d188df5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/DrawNoticeInfo.java @@ -0,0 +1,9 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +@Data +public class DrawNoticeInfo { + private String erbanNo; + private int goldNum; //瓜分的钻石数 +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/ImNotice.java b/core/src/main/java/com/chwl/core/radish/signin/bean/ImNotice.java new file mode 100644 index 0000000..e07ad58 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/ImNotice.java @@ -0,0 +1,18 @@ +package com.chwl.core.radish.signin.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 提醒,{@link com.chwl.core.im.custom.bean.OpenSignInAttachment} + * create by lvzebiao @2019/3/20 + */ +@Data +public class ImNotice implements Serializable { + + private String title; + + private String content; + +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/ReceiveTotalRewardInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/ReceiveTotalRewardInfo.java new file mode 100644 index 0000000..8e70077 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/ReceiveTotalRewardInfo.java @@ -0,0 +1,19 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +@Data +public class ReceiveTotalRewardInfo { + /** + * prizeName : 天马 + * num : 1 + * prizeDays : 7 + */ + + private String prizeName; + private String prizePic; + private int num; + private String prizeDays; // 奖励时间,附带单位,空不展示 + private int signDays; // 累计可领取的签到天数 + private String showText; +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/ReplenishSignInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/ReplenishSignInfo.java new file mode 100644 index 0000000..d8764b2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/ReplenishSignInfo.java @@ -0,0 +1,22 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +/** + * 补签信息 + * create by lvzebiao @2019/4/28 + */ +@Data +public class ReplenishSignInfo { + + public final static int TYPE_SHARE = 1; + public final static int TYPE_RADISH = 2; + + /** + * 类型,1:分享,2,支付萝卜 + */ + private int type; + + private int price; + +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/Reward.java b/core/src/main/java/com/chwl/core/radish/signin/bean/Reward.java new file mode 100644 index 0000000..15d4647 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/Reward.java @@ -0,0 +1,13 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +/** + * 奖品 + * create by lvzebiao @2019/3/20 + */ +@Data +public class Reward { + + +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/RewardNoticeInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/RewardNoticeInfo.java new file mode 100644 index 0000000..565385a --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/RewardNoticeInfo.java @@ -0,0 +1,45 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +@Data +public class RewardNoticeInfo { + + /** + * 正常签到 + */ + public final static int TYPE_SIGN_NORMAL = 1; + + /** + * 补签 + */ + public final static int TYPE_SIGN_REPLENISH = 2; + + /** + * signRewardConfigId : 32 + * signRewardName : 水晶*3 + * signDays : 1 + * icon : https://image.zhongjialx.com/FinYc2LoTH6oGcHSEVASO2mJHYPG?imageslim + * isReceive : 0 + */ + + private long signRewardConfigId; // 奖励配置id + private String signRewardName; // 奖品名称 + private int signDays; // (/sign/rewardTotalNotice)累积签到天数 / (/sign/rewardTodayNotice)第几天签到 + private String icon; // 奖品图片 + private int isReceive; // 是否领取(0未领取,1已领取) + + /** + * 是否可以补签 + */ + private boolean canReplenishSign; + + /** + * 补签类型,1正常签到,2补签 + */ + private int signType; + + public boolean getReceive() { + return isReceive == 1; + } +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/SignDetailInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/SignDetailInfo.java new file mode 100644 index 0000000..461747b --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/SignDetailInfo.java @@ -0,0 +1,62 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +@Data +public class SignDetailInfo { + + /** + * 不能瓜分 + */ + public static final int FLAG_DRAW_GOLD_UN_OPEN = 0; + + /** + * 能瓜分,但是还没瓜分 + */ + public static final int FLAG_DRAW_GOLD_OPEN_UN_DRAW = 1; + /** + * 已经瓜分 + */ + public static final int FLAG_DRAW_GOLD_OPEN_DRAW = 2; + /** + * isSignRemind : 0 + * isSign : 1 + * isDrawGold : 0 + * showGoldNum : 100025 + * totalDay : 5 + * drawGoldDate : 2019-04-21 + */ + + private int isSignRemind; // 是否开启签到提醒(0未开启,1已开启) + private int isSign; // 今天是否已签到(0未签到,1已签到) + private int isDrawGold; // 是否开启瓜分钻石按钮(0不开启,1开启未瓜分,2开启已瓜分) + private int drawGoldNum; // 瓜分到的钻石数(当isDrawGold不为2时,此字段为空) + private int showGoldNum; // 展示奖池金额数 + private int totalDay; //累积签到n天 + private String drawGoldDate; // 瓜分钻石时间 + private String signPrizeName; // 今天签到获取的奖品名 + private int signPrizeNum; // 今日签到获取的奖品数量 + private int todaySignDay; // 第n天签到 + + private boolean needSignDialog;//ture则显示弹框 + private String prizeDays; + private String showText; + + /** + * ture的话,表示用户满足补签条件 + */ + private boolean canReplenishSign; + + public boolean getSignRemind() { + return isSignRemind == 1; + } + + public boolean getDrawGold() { + return isDrawGold == 1; + } + + public boolean isSign() { + return isSign == 1; + } + +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/SignDrawInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/SignDrawInfo.java new file mode 100644 index 0000000..85a64ab --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/SignDrawInfo.java @@ -0,0 +1,26 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +@Data +public class SignDrawInfo { + /** + * id : 16 + * uid : 908993 + * roundId : 1 + * round : 1 + * goldNum : 1 + * goldPoolId : 36 + * level : 1 + * createTime : 1553491658366 + */ + + private long id; + private long uid; + private long roundId; // 当前轮数id + private long round; // 当前轮数 + private long goldNum; // 瓜分的钻石数 + private long goldPoolId; // 瓜分到的奖池奖品id + private int level; // 瓜分到的奖品等级 + private long createTime; +} diff --git a/core/src/main/java/com/chwl/core/radish/signin/bean/SignInfo.java b/core/src/main/java/com/chwl/core/radish/signin/bean/SignInfo.java new file mode 100644 index 0000000..ac5f537 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/signin/bean/SignInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.radish.signin.bean; + +import lombok.Data; + +@Data +public class SignInfo { + private long signGoldNum; + + private String prizeName; + /** + * 第几次补签 + */ + private int replenishSignNum; +} diff --git a/core/src/main/java/com/chwl/core/radish/task/ITaskModel.java b/core/src/main/java/com/chwl/core/radish/task/ITaskModel.java new file mode 100644 index 0000000..eef2f54 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/task/ITaskModel.java @@ -0,0 +1,38 @@ +package com.chwl.core.radish.task; + +import com.chwl.core.radish.task.bean.CheckNewUserTaskInfo; +import com.chwl.core.radish.task.bean.TaskInfo; + +import java.util.List; + +import io.reactivex.Single; + +/** + * 任务 接口类 + * create by lvzebiao @2019/3/26 + */ +public interface ITaskModel { + + /** + * 获取任务列表 + */ + Single> getTaskList(); + + Single> getAchievementTaskList(); + + /** + * 领取奖励 + * + * @param configId + * @return + */ + Single receivePrice(long configId, int prizeType); + + /** + * 查询用户是否可以领取新人有礼 + * + * @param uid uid + */ + Single checkNewUserTask(long uid); + +} diff --git a/core/src/main/java/com/chwl/core/radish/task/TaskModel.java b/core/src/main/java/com/chwl/core/radish/task/TaskModel.java new file mode 100644 index 0000000..343b2ee --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/task/TaskModel.java @@ -0,0 +1,112 @@ +package com.chwl.core.radish.task; + +import com.google.gson.JsonElement; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.radish.RadishModel; +import com.chwl.core.radish.event.ReceivePrizeEvent; +import com.chwl.core.radish.task.bean.CheckNewUserTaskInfo; +import com.chwl.core.radish.task.bean.PrizeType; +import com.chwl.core.radish.task.bean.TaskInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * 任务 不需要常驻内存的model,不用单例 + * create by lvzebiao @2019/3/26 + */ +public class TaskModel extends BaseModel implements ITaskModel { + + private final Api api = RxNet.create(Api.class); + + /** + * 获取任务列表 + */ + @Override + public Single> getTaskList() { + return api.requestTaskList(AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single> getAchievementTaskList() { + return api.requestAchievementTaskList(AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + /** + * 领取奖励 + * + * @param configId + * @return + */ + @Override + public Single receivePrice(long configId, int prizeType) { + return api.receivePrice(AuthModel.get().getCurrentUid(), configId) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + EventBus.getDefault().post(new ReceivePrizeEvent()); + if (prizeType == PrizeType.RADISH) { + RadishModel.get().updateRadishWallet().subscribe(); + } + return Single.just(ResUtil.getString(R.string.radish_task_taskmodel_01)); + } + return Single.error(RxHelper.createThrowable(result)); + }); + } + + @Override + public Single checkNewUserTask(long uid) { + return api.checkNewUserTask(uid) + .compose(RxHelper.handleCommon(CheckNewUserTaskInfo::new)); + } + + private interface Api { + + /** + * 任务列表 + */ + @POST("/mission/list") + Single>> requestTaskList(@Query("uid") long uid); + + /** + * 成就任务列表 + */ + @POST("/mission/achievement/list") + Single>> requestAchievementTaskList(@Query("uid") long uid); + + /** + * 领取奖励 + * + * @param uid + * @param configId 任务id + * @return + */ + @POST("/mission/receive") + Single> receivePrice(@Query("uid") long uid, + @Query("configId") long configId); + + + /** + * 查询用户是否可以领取新人有礼 + * + * @param uid uid + */ + @GET("/mission/check/new/user") + Single> checkNewUserTask(@Query("uid") long uid); + } +} diff --git a/core/src/main/java/com/chwl/core/radish/task/bean/CheckNewUserTaskInfo.java b/core/src/main/java/com/chwl/core/radish/task/bean/CheckNewUserTaskInfo.java new file mode 100644 index 0000000..50e4ae9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/task/bean/CheckNewUserTaskInfo.java @@ -0,0 +1,9 @@ +package com.chwl.core.radish.task.bean; + +import lombok.Data; + +@Data +public class CheckNewUserTaskInfo { + private boolean hasNewUser;// 是否可以领取新人礼物 + private long configId;// 可以领取新人礼物的任务配置id +} diff --git a/core/src/main/java/com/chwl/core/radish/task/bean/PrizeAnim.java b/core/src/main/java/com/chwl/core/radish/task/bean/PrizeAnim.java new file mode 100644 index 0000000..681ecc0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/task/bean/PrizeAnim.java @@ -0,0 +1,65 @@ +package com.chwl.core.radish.task.bean; + +import com.chwl.core.R; +import com.chwl.core.radish.signin.bean.ReceiveTotalRewardInfo; +import com.chwl.core.radish.signin.bean.SignDrawInfo; +import com.chwl.library.utils.ResUtil; + +import lombok.Data; + +/** + * create by lvzebiao @2019/3/27 + */ +@Data +public class PrizeAnim { + + private String prizePic; + + private int prizeNum; + /** + * 奖品字符串,比如 萝卜x8 + */ + private String prizeName; + + private String tips; + + /** + * 天数,传回接口,用于分享 + */ + private int signDays; + private String prizeDays; + + public static PrizeAnim formatTaskInfo(TaskInfo taskInfo) { + PrizeAnim prizeAnim = new PrizeAnim(); + prizeAnim.setPrizeName(taskInfo.getPrizeStr()); + prizeAnim.setPrizeNum(taskInfo.getPrizeNum()); + prizeAnim.setPrizePic(taskInfo.getPrizePic()); + prizeAnim.setTips(taskInfo.getTips()); + return prizeAnim; + } + + public static PrizeAnim formatReceiveTotalRewardInfo(ReceiveTotalRewardInfo info) { + PrizeAnim prizeAnim = new PrizeAnim(); + prizeAnim.setPrizePic(info.getPrizePic()); + prizeAnim.setPrizeName(info.getShowText()); + prizeAnim.setSignDays(info.getSignDays()); + prizeAnim.setPrizeDays(info.getPrizeDays()); + prizeAnim.setPrizeNum(info.getNum()); + return prizeAnim; + } + + public static PrizeAnim formatDrawGold(SignDrawInfo signDrawInfo) { + PrizeAnim prizeAnim = new PrizeAnim(); + prizeAnim.setPrizeName(ResUtil.getString(R.string.task_bean_prizeanim_01) + signDrawInfo.getGoldNum()); + prizeAnim.setSignDays(28); + return prizeAnim; + } + + public String getPrizeName() { + if (prizeName == null) { + prizeName = ""; + } + return prizeName; + } + +} diff --git a/core/src/main/java/com/chwl/core/radish/task/bean/PrizeType.java b/core/src/main/java/com/chwl/core/radish/task/bean/PrizeType.java new file mode 100644 index 0000000..63bce92 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/task/bean/PrizeType.java @@ -0,0 +1,12 @@ +package com.chwl.core.radish.task.bean; + +/** + * create by lvzebiao @2019/3/29 + */ +public interface PrizeType { + /** + * 萝卜 + */ + int RADISH = 12; + +} diff --git a/core/src/main/java/com/chwl/core/radish/task/bean/TaskInfo.java b/core/src/main/java/com/chwl/core/radish/task/bean/TaskInfo.java new file mode 100644 index 0000000..8d89355 --- /dev/null +++ b/core/src/main/java/com/chwl/core/radish/task/bean/TaskInfo.java @@ -0,0 +1,104 @@ +package com.chwl.core.radish.task.bean; + +import lombok.Data; + +/** + * 任务bean + * create by lvzebiao @2019/3/26 + */ +@Data +public class TaskInfo { + + /** + * 未完成 + */ + public final static int STATUS_UN_FINISH = 0; + + /** + * 已完成未领取 + */ + public final static int STATUS_FINISHED_NOT_RECEIVE = 1; + + /** + * 已完成已领取 + */ + public final static int STATUS_HAS_RECEIVED = 2; + + /** + * 跳app页面 + */ + public final static int SHIP_TYPE_APP = 1; + /** + * 跳任务页面 + */ + public final static int SHIP_TYPE_TASK = 2; + + /** + * configId : 1 + * name : 每日签到 + * current : 0 + * target : 1 + * description : 瓜分百万钻石 + * status : 0 + * skipType : 1 + * routerType : 26 + */ + + private long configId; + private String name; + private int current; + private int target; + private String description; + /** + * 状态:0.未完成;1.已完成未领取;2.已完成已领取 + */ + private int status; + private int skipType; + private int routerType; + + private String prizeName; + /** + * 奖励的奖品数 + */ + private int prizeNum; + + private String routerValue; + + /** + * 奖品icon + */ + private String prizeIcon; + + /** + * 奖品大图 + */ + private String prizePic; + + /** + * 领取的时候,领取成功提示 + */ + private String tips; + + /** + * 1的话表示改任务支持 + */ + private int support; + + /** + * 奖品类型{@link PrizeType} + */ + private int prizeType; + + /** + * 任务奖励描述 + */ + private String prizeStr; + /** + * 步骤说明图片 + */ + private String stepPic; + + public boolean isSupport() { + return support == 1; + } +} diff --git a/core/src/main/java/com/chwl/core/realm/IRealmCore.java b/core/src/main/java/com/chwl/core/realm/IRealmCore.java new file mode 100644 index 0000000..a6c4ef4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/realm/IRealmCore.java @@ -0,0 +1,13 @@ +package com.chwl.core.realm; + +import com.chwl.library.coremanager.IBaseCore; + +import io.realm.Realm; + +/** + * Created by chenran on 2017/7/25. + */ + +public interface IRealmCore extends IBaseCore { + Realm getRealm(); +} diff --git a/core/src/main/java/com/chwl/core/recall/IRecallModel.java b/core/src/main/java/com/chwl/core/recall/IRecallModel.java new file mode 100644 index 0000000..517bde5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/recall/IRecallModel.java @@ -0,0 +1,14 @@ +package com.chwl.core.recall; + +import com.chwl.core.base.IModel; +import com.chwl.core.recall.bean.CheckLostUserInfo; + +import io.reactivex.Single; + +public interface IRecallModel extends IModel { + + // 查询是否是回归状态 + Single checkLostUser(long uid); + // 接收回归礼物 + void goBack(String uid, String inviteCode); +} diff --git a/core/src/main/java/com/chwl/core/recall/RecallModel.java b/core/src/main/java/com/chwl/core/recall/RecallModel.java new file mode 100644 index 0000000..c54d116 --- /dev/null +++ b/core/src/main/java/com/chwl/core/recall/RecallModel.java @@ -0,0 +1,96 @@ +package com.chwl.core.recall; + +import com.chwl.core.R; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bean.response.result.CheckLostUserResult; +import com.chwl.core.recall.bean.CheckLostUserInfo; +import com.chwl.core.recall.bean.GoBackInfo; +import com.chwl.core.recall.event.CheckLostUserEvent; +import com.chwl.core.recall.event.GoBackEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class RecallModel extends BaseModel implements IRecallModel { + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final RecallModel INSTANCE = new RecallModel(); + } + + public static RecallModel get() { + return RecallModel.Helper.INSTANCE; + } + + private RecallModel() { + } + + @Override + public Single checkLostUser(long uid) { + return api.checkLostUser(uid) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(checkLostUserInfo -> { + EventBus.getDefault().post(new CheckLostUserEvent(checkLostUserInfo)); + }) + .doOnError(throwable -> { + EventBus.getDefault().post(new CheckLostUserEvent(throwable.getMessage())); + }); + } + + @Override + public void goBack(String uid, String inviteCode) { + api.goback(uid, inviteCode) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer>() { + @Override + public void accept(ServiceResult goBackInfoServiceResult) throws Exception { + int code = goBackInfoServiceResult.getCode(); + if (200 == code) { + GoBackInfo goBackInfo = new GoBackInfo(); + goBackInfo.setMessage(ResUtil.getString(R.string.xchat_android_core_recall_recallmodel_01)); + EventBus.getDefault().post(new GoBackEvent(goBackInfo)); + + } else if (8005 == code || 8006 == code || 8008 == code) { + // 8005 该活动仅回归的老用户可参与哦 + // 8006 你已收下回归礼啦! + // 8008 同一设备只可参与一次哦! + GoBackInfo goBackInfo = new GoBackInfo(); + goBackInfo.setMessage(goBackInfoServiceResult.getMessage()); + EventBus.getDefault().post(new GoBackEvent(goBackInfo)); + + } else { + // 8007 邀请码错误! + EventBus.getDefault().post(new GoBackEvent(goBackInfoServiceResult.getMessage())); + } + } + }); + } + + interface Api{ + /** + * 收礼 + */ + @POST("/user/goback") + Single> goback(@Query("uid") String uid, @Query("inviteCode") String inviteCode); + + + /** + * 查询状态 + */ + @GET("/user/checkLostUser") + Single checkLostUser(@Query("uid") long uid); + } +} diff --git a/core/src/main/java/com/chwl/core/recall/bean/CheckLostUserInfo.java b/core/src/main/java/com/chwl/core/recall/bean/CheckLostUserInfo.java new file mode 100644 index 0000000..f39ae80 --- /dev/null +++ b/core/src/main/java/com/chwl/core/recall/bean/CheckLostUserInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.recall.bean; + +import java.io.Serializable; + +public class CheckLostUserInfo implements Serializable { + + /** 是否领取过礼物 */ + private boolean isClaimedAward; + /** 是否属于流失用户 */ + private boolean isLostUser; + + public boolean isClaimedAward() { + return isClaimedAward; + } + + public boolean isLostUser() { + return isLostUser; + } + + public void setClaimedAward(boolean claimedAward) { + isClaimedAward = claimedAward; + } + + public void setLostUser(boolean lostUser) { + isLostUser = lostUser; + } +} diff --git a/core/src/main/java/com/chwl/core/recall/bean/GoBackInfo.java b/core/src/main/java/com/chwl/core/recall/bean/GoBackInfo.java new file mode 100644 index 0000000..c8ea7bc --- /dev/null +++ b/core/src/main/java/com/chwl/core/recall/bean/GoBackInfo.java @@ -0,0 +1,24 @@ +package com.chwl.core.recall.bean; + +import java.io.Serializable; + +public class GoBackInfo implements Serializable { +// private String code; + private String message; +// +// public String getCode() { +// return code; +// } +// + public String getMessage() { + return message; + } +// +// public void setCode(String code) { +// this.code = code; +// } +// + public void setMessage(String message) { + this.message = message; + } +} diff --git a/core/src/main/java/com/chwl/core/recall/event/CheckLostUserEvent.java b/core/src/main/java/com/chwl/core/recall/event/CheckLostUserEvent.java new file mode 100644 index 0000000..0173cfe --- /dev/null +++ b/core/src/main/java/com/chwl/core/recall/event/CheckLostUserEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.recall.event; + +import com.chwl.core.base.BaseDataEvent; +import com.chwl.core.recall.bean.CheckLostUserInfo; + +public class CheckLostUserEvent extends BaseDataEvent { + + public CheckLostUserEvent(CheckLostUserInfo checkLostUserInfo){ super(checkLostUserInfo); } + public CheckLostUserEvent(String error){ super(error); } +} diff --git a/core/src/main/java/com/chwl/core/recall/event/GoBackEvent.java b/core/src/main/java/com/chwl/core/recall/event/GoBackEvent.java new file mode 100644 index 0000000..09950a4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/recall/event/GoBackEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.recall.event; + +import com.chwl.core.base.BaseDataEvent; +import com.chwl.core.recall.bean.GoBackInfo; + +public class GoBackEvent extends BaseDataEvent { + + public GoBackEvent(GoBackInfo goBackInfo) { + super(goBackInfo); + } + + public GoBackEvent(String error) { + super(error); + } +} diff --git a/core/src/main/java/com/chwl/core/redPacket/bean/ActionDialogInfo.java b/core/src/main/java/com/chwl/core/redPacket/bean/ActionDialogInfo.java new file mode 100644 index 0000000..850cda4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redPacket/bean/ActionDialogInfo.java @@ -0,0 +1,48 @@ +package com.chwl.core.redPacket.bean; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by ${Seven} on 2017/9/26. + */ +@Setter +@Getter +public class ActionDialogInfo implements Serializable { + /* "actId":1, + "actName":ResUtil.getString(R.string.redpacket_bean_actiondialoginfo_01), + "alertWin":true, + "alertWinPic":"https://nos.netease.com/nim/NDI3OTA4NQ==/bmltYV83OTIxMjk1MTZfMTUwNTgxMDAyNTQ5NV8zNDZhNTFkYS04YTQwLTQ0NDktYWZlMi00Y2QzNWQ4MTc2M2Q", + "alertWinLoc":1, + "skipType":1, + "actAlertVersion":"1.0.0"*/ + private String actId; + private String actName; + private boolean alertWin; + private String alertWinPic; + private String imageType; + + public String getImageType() { + return imageType; + } + + public void setImageType(String imageType) { + this.imageType = imageType; + } + + private String alertWinLoc; + private String skipType; + private String skipUrl; + private String actAlertVersion; + /**1-全屏,2-半屏,默认值是1*/ + private int showType; + /**入口位置,1-右下角,2-左上角*/ + private int entrancePosition; + + public boolean isDialogWeb() { + return showType == 2; + } + +} diff --git a/core/src/main/java/com/chwl/core/redPacket/bean/RedDrawListInfo.java b/core/src/main/java/com/chwl/core/redPacket/bean/RedDrawListInfo.java new file mode 100644 index 0000000..f5ca32c --- /dev/null +++ b/core/src/main/java/com/chwl/core/redPacket/bean/RedDrawListInfo.java @@ -0,0 +1,66 @@ +package com.chwl.core.redPacket.bean; + +import java.io.Serializable; + +/** + * Created by chenran on 2017/12/4. + */ + +public class RedDrawListInfo implements Serializable{ + private long uid; + private String nick; + private String avatar; + private int packetNum; + private long createTime; + + @Override + public String toString() { + return "RedDrawListInfo{" + + "uid=" + uid + + ", nick='" + nick + '\'' + + ", avatar='" + avatar + '\'' + + ", packetNum=" + packetNum + + ", createTime=" + createTime + + '}'; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getPacketNum() { + return packetNum; + } + + public void setPacketNum(int packetNum) { + this.packetNum = packetNum; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } +} diff --git a/core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfo.java b/core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfo.java new file mode 100644 index 0000000..d42d994 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfo.java @@ -0,0 +1,71 @@ +package com.chwl.core.redPacket.bean; + +import java.io.Serializable; + +/** + * Created by ${Seven} on 2017/9/20. + */ + +public class RedPacketInfo implements Serializable { + /* uid 90019 + shareCount 21 分享个数 + packetNum 30.23 红包金额 + packetCount 10 红包个数 + registerCout 12 邀请人数 + chargeBonus 87.21 分成奖励 + */ + private long uid; + private int shareCount; + private double packetNum; + private int packetCount; + private int registerCout; + private double chargeBonus; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public int getShareCount() { + return shareCount; + } + + public void setShareCount(int shareCount) { + this.shareCount = shareCount; + } + + public double getPacketNum() { + return packetNum; + } + + public void setPacketNum(double packetNum) { + this.packetNum = packetNum; + } + + public int getPacketCount() { + return packetCount; + } + + public void setPacketCount(int packetCount) { + this.packetCount = packetCount; + } + + public int getRegisterCout() { + return registerCout; + } + + public void setRegisterCout(int registerCout) { + this.registerCout = registerCout; + } + + public double getChargeBonus() { + return chargeBonus; + } + + public void setChargeBonus(double chargeBonus) { + this.chargeBonus = chargeBonus; + } +} diff --git a/core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfoV2.java b/core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfoV2.java new file mode 100644 index 0000000..aaacebf --- /dev/null +++ b/core/src/main/java/com/chwl/core/redPacket/bean/RedPacketInfoV2.java @@ -0,0 +1,59 @@ +package com.chwl.core.redPacket.bean; + +import java.io.Serializable; + +/** + * Created by chenran on 2017/10/4. + */ + +public class RedPacketInfoV2 implements Serializable{ + private int type; + + private long uid; + + private double packetNum; + + private boolean needAlert; + + private String packetName; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public double getPacketNum() { + return packetNum; + } + + public void setPacketNum(double packetNum) { + this.packetNum = packetNum; + } + + public boolean isNeedAlert() { + return needAlert; + } + + public void setNeedAlert(boolean needAlert) { + this.needAlert = needAlert; + } + + public String getPacketName() { + return packetName; + } + + public void setPacketName(String packetName) { + this.packetName = packetName; + } +} diff --git a/core/src/main/java/com/chwl/core/redPacket/bean/ShareRedBagInfo.java b/core/src/main/java/com/chwl/core/redPacket/bean/ShareRedBagInfo.java new file mode 100644 index 0000000..c56d0d2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redPacket/bean/ShareRedBagInfo.java @@ -0,0 +1,28 @@ +package com.chwl.core.redPacket.bean; + +import java.io.Serializable; + +/** + * Created by Seven on 2017/9/26. + */ + +public class ShareRedBagInfo implements Serializable { + private double packetNum; + private long createTime; + + public double getPacketNum() { + return packetNum; + } + + public void setPacketNum(double packetNum) { + this.packetNum = packetNum; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } +} diff --git a/core/src/main/java/com/chwl/core/redPacket/event/GetRedInfoEvent.java b/core/src/main/java/com/chwl/core/redPacket/event/GetRedInfoEvent.java new file mode 100644 index 0000000..df084c8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redPacket/event/GetRedInfoEvent.java @@ -0,0 +1,17 @@ +package com.chwl.core.redPacket.event; + +import com.chwl.core.base.BaseDataEvent; +import com.chwl.core.redPacket.bean.RedPacketInfo; + +/** + * create by lvzebiao on 2018/9/5 + */ +public class GetRedInfoEvent extends BaseDataEvent { + public GetRedInfoEvent(RedPacketInfo data) { + super(data); + } + + public GetRedInfoEvent(String error) { + super(error); + } +} diff --git a/core/src/main/java/com/chwl/core/redpackage/RedPackageModel.kt b/core/src/main/java/com/chwl/core/redpackage/RedPackageModel.kt new file mode 100644 index 0000000..8b2d954 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/RedPackageModel.kt @@ -0,0 +1,150 @@ +package com.chwl.core.redpackage + + +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.redpackage.bean.RedEnvelopeVO +import com.chwl.core.redpackage.bean.RedPackageData +import com.chwl.core.redpackage.bean.RedPackageInfo +import com.chwl.core.redpackage.bean.RedPackageNotifyInfo +import com.chwl.core.utils.net.handleBeanData +import com.chwl.core.utils.net.handleStringData +import com.chwl.core.utils.net.io2main +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Observable +import io.reactivex.Single +import retrofit2.http.* + +object RedPackageModel { + + + private val api: Api + + init { + api = RxNet.create(Api::class.java) + } + + fun sendRedPackage( + goldNum: Long, message: String?, num: Long, roomUId: String, type: Int, + kind: Int, validityType: Int, password: String + ): Single { + return api.sendRedPackage( + goldNum, + message, + num, + roomUId, + type, + kind, + validityType, + password + ) + .io2main() + .handleStringData() + } + + fun openRedPackage(redEnvelopeId: Long): Single { + return api.openRedPackage(redEnvelopeId) + .io2main() + .handleBeanData() + } + + fun getRedPackage(id: Long): Observable { + return api.getRedPackageData(id) + .io2main() + .handleBeanData() + .toObservable() + } + + /** + * 获取房间最新可用红包 + */ + fun getLatestRoomRedPackage(uid: Long): Observable { + return api.getRedPackage(true, uid) + .io2main() + .handleBeanData() + .toObservable().map { + if (it.isEmpty()) { + throw NullPointerException("No RedPackage") + } + val item = it.last() + RedPackageNotifyInfo( + redEnvelopeId = item.id, + redEnvelopeType = item.type, + redEnvelopeMessage = item.message, + sendUserAvatar = item.userVO?.avatar ?: "", + sendUserNick = item.userVO?.nick ?: "", + roomUid = item.roomUId, + roomTitle = "", + kind = item.kind, + beginTime = item.beginTime, + redEnvelopeNum = it.size.toLong(), + validityType = item.validityType, + endTime = item.endTime + ) + } + } + + fun setRedPackageSwitch(roomUid: Long): Single { + return api.setRedPackageSwitch(roomUid) + .io2main() + .handleBeanData() + } + + private interface Api { + + /** + * 发红包 + * + * @return + */ + @FormUrlEncoded + @POST("/red-envelope") + fun sendRedPackage( + @Field("goldNum") goldNum: Long, + @Field("message") message: String?, + @Field("num") num: Long, + @Field("roomUId") roomUId: String, + @Field("type") type: Int, + @Field("kind") kind: Int, + @Field("validityType") validityType: Int, + @Field("password") password: String + ): Single> + + /** + * 开红包 + * + * @return + */ + @FormUrlEncoded + @POST("/red-envelope/open") + fun openRedPackage(@Field("redEnvelopeId") redEnvelopeId: Long): Single> + + + /** + * 当前可以领取的红包 + * + * @return + */ + @GET("/room/red-envelop") + fun getRedPackage( + @Query("isShowKind") isShowKind: Boolean, + @Query("uid") uid: Long + ): Single>> + + /** + * 获取红包详情 + */ + @GET("/red-envelope/get") + fun getRedPackageData( + @Query("redEnvelopeId") redEnvelopeId: Long, + ): Single> + + + /** + * 房间全服红包开关 + */ + @POST("/red-envelope/switch/{roomUid}") + fun setRedPackageSwitch(@Path("roomUid") uid: Long): Single> + } + +} + diff --git a/core/src/main/java/com/chwl/core/redpackage/RedPackageType.kt b/core/src/main/java/com/chwl/core/redpackage/RedPackageType.kt new file mode 100644 index 0000000..42abad9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/RedPackageType.kt @@ -0,0 +1,6 @@ +package com.chwl.core.redpackage + +const val ROOM_DIAMOND = 1 +const val ROOM_GIFT = 3 +const val ALL_DIAMOND = 2 +const val ALL_GIFT = 4 diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeGiftItemVO.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeGiftItemVO.kt new file mode 100644 index 0000000..d9f97f7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeGiftItemVO.kt @@ -0,0 +1,9 @@ +package com.chwl.core.redpackage.bean + +import com.chwl.core.gift.bean.GiftInfo + + +data class RedEnvelopeGiftItemVO( + var giftNum: Int = 0, + var giftVo: GiftInfo? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeItemVO.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeItemVO.kt new file mode 100644 index 0000000..144cf0f --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeItemVO.kt @@ -0,0 +1,11 @@ +package com.chwl.core.redpackage.bean + +import com.chwl.core.community.UserVo + + +class RedEnvelopeItemVO( + var amount: String, + var createTime: Long = 0, + var redEnvelopeGiftItemVOs: List? = null, + var userVO: UserVo +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeRoomMsg.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeRoomMsg.kt new file mode 100644 index 0000000..b56fc5b --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeRoomMsg.kt @@ -0,0 +1,40 @@ +package com.chwl.core.redpackage.bean + +import java.io.Serializable + +/** + * 开红包发送公屏信息 + */ +data class RedEnvelopeRoomMsg( + + /** + * 开红包者 uid + */ + var openRedEnvelopeId: String = "", + + /** + * 开红包者昵称 + */ + var openRedEnvelopeUserNick: String = "", + + /** + * 红包类型 + */ + var redEnvelopeType: Int = 0, + + /** + * 红包金额 + */ + var amount: Double = 0.0, + + /** + * 红包主人 uid + */ + var redEnvelopeMasterId: Long = 0, + + /** + * 红包主人昵称 + */ + var redEnvelopeMasterNick: String = "" + +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeState.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeState.kt new file mode 100644 index 0000000..2ce5bda --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeState.kt @@ -0,0 +1,23 @@ +package com.chwl.core.redpackage.bean + +/** + * 红包状态 + */ +interface RedEnvelopeState { + companion object { + /** + * ING(1, “开抢中”) + * TIME_OUT(2, “过时”) + * REMAIN_ZERO(3, “抢光了”) + * SUCCESS(4, “抢到了”) + * WILL(5, “将要开始”) + * TIME_OUT_BACK(6, “超时已退还”) + */ + const val ING = 1 + const val TIME_OUT = 2 + const val REMAIN_ZERO = 3 + const val SUCCESS = 4 + const val WILL = 5 + const val TIME_OUT_BACK = 6 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeVO.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeVO.kt new file mode 100644 index 0000000..61331c7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedEnvelopeVO.kt @@ -0,0 +1,35 @@ +package com.chwl.core.redpackage.bean + +import com.chwl.core.community.UserVo + + +data class RedEnvelopeVO( + var beginTime: Long = 0, + var createTime: Long = 0, + var endTime: Long = 0, + var id: String, + var message: String, + var redEnvelopeAmount: Double = 0.0, + var roomUId: Long = 0, + /** + * 红包类型 1:房间水晶红包 2:全服水晶红包 3:房间礼物红包 4:全服礼物红包 + */ + var type: Int = 0, + var updateTime: Long = 0, + var userId: Long = 0, + var totalNum: Long = 0, + var pickNum: Long = 0, + var userVO: UserVo? = null, + /** + * 红包种类 0 旧版本 1 无门槛红包 2 关注红包 3 分享红包 4 弹幕红包 + */ + var kind: Int = 0, + /** + * 生效类型 0 立即生效 1 限时生效 + */ + var validityType: Int = 0, + /** + * 红包状态 1 开抢中 2 过时 3 抢光了 4 抢到了 5 将要开始 6 超时已退还 + */ + var state: Int? +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageData.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageData.kt new file mode 100644 index 0000000..2338e7a --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageData.kt @@ -0,0 +1,36 @@ +package com.chwl.core.redpackage.bean + +import java.io.Serializable + + +/** + * Created by Max on 2023/10/24 16:37 + * Desc:红包数据 + **/ +data class RedPackageData( + val amount: Double?, + val avatar: String?, + val beginTime: Long?, + val commissionAmount: Long?, + val createTime: Long?, + val duration: Long?, + val endTime: Long?, + val finish: Boolean?, + val id: Long?, + val kind: Int?, + val message: String?, + val nick: String?, + val num: Long?, + val originalAmount: Long?, + val position: String?, + val roomTitle: String?, + val roomUid: Long?, + //红包状态 1 开抢中 2 过时 3 抢光了 4 抢到了 5 将要开始 6 超时已退还 + val state: Int?, + val type: String?, + val updateTime: Long?, + val userId: Long?, + val validityType: Int?, + // 结果 + val result: RedPackageInfo? +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageInfo.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageInfo.kt new file mode 100644 index 0000000..d1bdc02 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageInfo.kt @@ -0,0 +1,20 @@ +package com.chwl.core.redpackage.bean + + +data class RedPackageInfo( + var redEnvelopeItemVOs: List? = null, + var redEnvelopeVO: RedEnvelopeVO? = null, + + /** + * ING(1, “开抢中”) + * TIME_OUT(2, “过时”) + * REMAIN_ZERO(3, “抢光了”) + * SUCCESS(4, “抢到了”) + * WILL(5, “将要开始”) + * TIME_OUT_BACK(6, “超时已退还”) + */ + var redEnvelopeState: Int = 0, + + // 领取金额 + var currentUserAmount: Double? +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageLuckyBag.java b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageLuckyBag.java new file mode 100644 index 0000000..d6b70de --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageLuckyBag.java @@ -0,0 +1,16 @@ +package com.chwl.core.redpackage.bean; + +import lombok.Data; + +@Data +public class RedPackageLuckyBag { + public long roomUid; + public long redEnvelopeId ; + public int redEnvelopeNum ; + public String redEnvelopeType ; + public String sendUserAvatar; + public String sendUserNick; + public long beginTime; + public int countDownSecond; + +} diff --git a/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageNotifyInfo.kt b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageNotifyInfo.kt new file mode 100644 index 0000000..2bebca3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/redpackage/bean/RedPackageNotifyInfo.kt @@ -0,0 +1,65 @@ +package com.chwl.core.redpackage.bean + +import java.io.Serializable + +data class RedPackageNotifyInfo( + + /** + * 红包 id + */ + var redEnvelopeId: String = "", + + /** + * 红包类型 1:房间水晶红包 2:全服水晶红包 3:房间礼物红包 4:全服礼物红包 + */ + var redEnvelopeType: Int = 0, + + /** + * 红包消息 + */ + var redEnvelopeMessage: String = "", + + /** + * 红包发送者头像 + */ + var sendUserAvatar: String = "", + + /** + * 红包发送者昵称 + */ + var sendUserNick: String = "", + /** + * 房间uid + */ + var roomUid: Long = 0, + + /** + * 房间名称 + */ + var roomTitle: String = "", + + /** + * 红包种类 0 旧版本 1 无门槛红包 2 关注红包 3 分享红包 4 弹幕红包 + */ + var kind: Int = 0, + + /** + * 红包可领取时间 + */ + var beginTime: Long = 0, + + /** + * 红包数量 + */ + var redEnvelopeNum: Long = 0, + + /** + * 生效类型 0 立即生效 1 限时生效 + */ + var validityType: Int?, + + /** + * 失效时间(毫秒) + */ + var endTime: Long? + ) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/CpBindUnbindEvent.java b/core/src/main/java/com/chwl/core/relation/cp/CpBindUnbindEvent.java new file mode 100644 index 0000000..cc4bd29 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/CpBindUnbindEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.relation.cp; + +public class CpBindUnbindEvent { +} diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteDetailEntity.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteDetailEntity.kt new file mode 100644 index 0000000..196cc88 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteDetailEntity.kt @@ -0,0 +1,20 @@ +package com.chwl.core.relation.cp.bean + +data class CpInviteDetailEntity( + val acceptAvatar: String? = "", + val acceptGender: Int = 1, + val acceptNick: String = "", + val acceptUid: Long = 0, + val cpId: Int = 0, + val declaration: String = "", + val inviteAvatar: String? = null, + val inviteGender: Int = 1, + val inviteNick: String = "", + val inviteUid: Long = 0, + val propsId: Int = 0, + val propsImg: String = "", + val propsName: String = "", + val propsPrice: Double = 0.0, + val recommenTxtList: List? = null, + val replyExpireTime: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteInfo.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteInfo.kt new file mode 100644 index 0000000..26b0a38 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/CpInviteInfo.kt @@ -0,0 +1,27 @@ +package com.chwl.core.relation.cp.bean + +data class CpInviteMessage( + val msg: String = "", + val routerType: Int = 0, + val popInfo: String = "", + val title: String = "" +) + +data class CpInviteInfo( + val cpId: Int, + val replyExpireTime: Int = 0, + val inviteUid: Long = 0, + val inviteAvatar: String = "", + val inviteNick: String = "", + val inviteGender: Int = 0, + val acceptUid: Long = 0, + val acceptAvatar: String = "", + val acceptNick: String = "", + val acceptGender: Int = 0, + val propsId: Int = 0, + val propsName: String = "", + val propsImg: String = "", + val propsPrice: Double=0.0, + val recommenTxtList: List? = null, + val declaration: String = "" +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/CpInvitePageEntity.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/CpInvitePageEntity.kt new file mode 100644 index 0000000..1abe79c --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/CpInvitePageEntity.kt @@ -0,0 +1,23 @@ +package com.chwl.core.relation.cp.bean + +/** + * 邀请CP弹窗信息 + * + * /user/couple/cpInvitePage 获取组CP邀请弹窗页面所需信息 + */ +data class CpInvitePageEntity( + val acceptAvatar: String?, + val acceptGender: Int=0,//1-男2-女 + val acceptNick: String="", + val acceptUid: Long=0, + val inviteAvatar: String?, + val inviteGender: Int=0, + val inviteNick: String="", + val inviteUid: Long=0, + val propsId: Int=0, + val propsImg: String="", + val propsName: String="", + val propsPrice: Double=0.0, + val recommenTxtList:List?=null, + val recommenTxt:String="" +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/CpMpApplyListEntity.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/CpMpApplyListEntity.kt new file mode 100644 index 0000000..ddd7d43 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/CpMpApplyListEntity.kt @@ -0,0 +1,16 @@ +package com.chwl.core.relation.cp.bean + +/** + * + * 铭牌申请记录 + * + */ +data class CpMpApplyListEntity( + val applyTime: String?, + val auditType: Int=0,//0、待审核,1、审核不通过,2、审核通过 + val iconPic: String="", + val mpId: Int=0, + val mpName: String="", + val mpTxt: String="", + val noPassReason: String="" +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/CpRelation.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/CpRelation.kt new file mode 100644 index 0000000..63f6ab4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/CpRelation.kt @@ -0,0 +1,26 @@ +package com.chwl.core.relation.cp.bean + +data class CpRelation( + /** + * + */ + val cpId: Long = 0,// cp记录id + //邀请人 + val uid: Long = 0,//邀请人uid + val nick: String = "",//邀请人 + val gender: Int = 0,//1-男2-女 //邀请人 + val avatar: String = "",//邀请人 + //被邀请人 + val cpUid: Long = 0,// + val cpNick: String = "", + val cpGender: Int = 0, + val cpAvatar: String = "", + + + var cpLevel: Int = 0, + val declaration: String = "",//cp关系誓言 + val cpKeepDuration: String = "", + val cpBackImg: String = "", + val waitUnbound: Boolean = false,//CP状态 true 解绑中 + val unboundUid: Long = 0//解绑发起人UID +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/CpTaskEntity.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/CpTaskEntity.kt new file mode 100644 index 0000000..6c61246 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/CpTaskEntity.kt @@ -0,0 +1,33 @@ +package com.chwl.core.relation.cp.bean + +data class CpTaskEntity( + val avatar: String = "", + val cpAvatar: String = "", + val cpBackImg: String = "", + val cpGender: Int = 0, + val cpKeepDuration: String = "", + val cpLevel: Int = 0, + val cpNextLevelSecretVal: Int = 0,//cp下一等级所需亲密值 + val cpNick: String = "", + val cpSecretVal: Int = 0,//cp亲密值 + val cpUid: Long = 0, + val dailyTask: List? = null,//日任务列表 + val declaration: String = "",//cp关系誓言 + val gender: Int = 0,//1-男2-女 + val isDamp: Boolean = false,//是否衰减标志:true-是,false-否 + val levelPercent: String = "",//cp当前等级到下一等级亲密值百分比(0~1间的小数) + val nick: String = "", + val totalTask: List? = null,// 累计任务列表 + val uid: Long = 0, + val waitUnbound: Boolean = false,//CP状态 true 解绑中 + val unBoundUid: Long = 0//解绑发起人UID +) + +data class Task( + val currentVal: Int = 0,//当前值 + val isComplete: Boolean = false, + val taskDesc: String = "", + val taskNeedVal: Int = 0,//任务所需值 + val taskSecretDesc: String = "",//任务亲密值描述 + val taskType: Int = 0//任务类型:1-私聊,2-同一房间时长,3-送礼,4-陪伴 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/UserCpLevelMpEntity.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/UserCpLevelMpEntity.kt new file mode 100644 index 0000000..3f481cb --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/UserCpLevelMpEntity.kt @@ -0,0 +1,13 @@ +package com.chwl.core.relation.cp.bean + +data class UserCpLevelMpRootEntity( + val haveCp: Boolean = false, + val mpDtoList: List? = null +) + +data class UserCpLevelMpEntity( + val iconPic: String = "", + val isHave: Boolean = false,//是否已经申请过:true-是,false-否 + val mpId: Int = 0, + val mpName: String = "" +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/relation/cp/bean/UserCpListEntity.kt b/core/src/main/java/com/chwl/core/relation/cp/bean/UserCpListEntity.kt new file mode 100644 index 0000000..80765b4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/relation/cp/bean/UserCpListEntity.kt @@ -0,0 +1,25 @@ +package com.chwl.core.relation.cp.bean + +data class UserCpListEntity( + val acceptUid: Long = 0, + val acceptUserAvatar: String = "", + val acceptUserNick: String = "", + val acceptUserSex: Int = 0,//1-男 2女 + val createTime: Long = 0, + val declaration: String = "",//关系誓言 + val cpId: Int = 0,//邀请记录id + val replyExpireTime: Int = 0, + val acceptTime: Long = 0, + val inviteUid: Long = 0,//邀请人uid + val inviteUserAvatar: String = "",//邀请方头像 + val inviteUserNick: String = "", + val inviteUserSex: Int = 0, + val levelSeq: Int = 0,//CP等级 + val propsId: Int = 0, + val propsImg: String = "", + val propsName: String = "", + val propsPrice: Double = 0.0, + val state: Int = 0,//状态:1-邀请中,2-CP中,3-拒绝,4-解绑中,5-解绑完成 6 已过期 + val unboundUid: Int = 0,//解绑人 + val updateTime: Long = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/retry/ImRetryManager.java b/core/src/main/java/com/chwl/core/retry/ImRetryManager.java new file mode 100644 index 0000000..c71837f --- /dev/null +++ b/core/src/main/java/com/chwl/core/retry/ImRetryManager.java @@ -0,0 +1,70 @@ +package com.chwl.core.retry; + +import android.util.Log; + +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.R; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; + +/** + * 云信消息重发的一个管理 + * Created by lvzebiao on 2020/2/19. + */ + +public class ImRetryManager { + + private final static String LOG_TAG = "MessageRetry"; + + /** + * 最多的重试次数 + */ + public static final int MAX_RETRY_COUNT = 3; + /** + * 重试间隔固定,ms + */ + public static final long RETRY_DISTANCE_TIME = 30 * 1000; + + public static Single sendRoomGiftMsg(ChatRoomMessage message) { + RetryChatRoomMessage retryChatRoomMessage = new RetryChatRoomMessage(); + retryChatRoomMessage.setMessage(message); + retryChatRoomMessage.setRetryCount(0); + return IMNetEaseManager.get().sendChatRoomMessageWithRetry(retryChatRoomMessage, + MAX_RETRY_COUNT, RETRY_DISTANCE_TIME, new ReconnectListener() { + @Override + public void onFailed(int failedCount, String error) { + ImRetryManager.log("failed count:" + failedCount + ", error:" + error); + if (failedCount == 1) { + //首次失败,加埋点 + String log = ResUtil.getString(R.string.xchat_android_core_retry_imretrymanager_01) + error; + ImRetryManager.log(log); + } else if (failedCount == MAX_RETRY_COUNT + 1) { + String log = ResUtil.getString(R.string.xchat_android_core_retry_imretrymanager_02) + error; + ImRetryManager.log(log); + } + } + }) + .doOnSuccess(param -> { + ImRetryManager.log("success and connect count:" + param.getRetryCount()); + if (param.getRetryCount() > 1) { + String log = ResUtil.getString(R.string.xchat_android_core_retry_imretrymanager_03) + (param.getRetryCount() - 1); + ImRetryManager.log(log); + } + }) + .doOnError(throwable -> { + ImRetryManager.log("final result:" + throwable.getMessage()); + }); + } + + public static void log(String log) { + LogUtil.e(LOG_TAG, log); + } + + public static void logIde(String log) { + Log.e(LOG_TAG, log); + } + +} diff --git a/core/src/main/java/com/chwl/core/retry/ReconnectListener.java b/core/src/main/java/com/chwl/core/retry/ReconnectListener.java new file mode 100644 index 0000000..0547bc4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/retry/ReconnectListener.java @@ -0,0 +1,15 @@ +package com.chwl.core.retry; + +/** + * 重发的回调,暂时引入是为了埋点 + * Created by @lvzebiao on 2020/2/20. + */ + +public interface ReconnectListener { + /** + * 失败的回调 + * @param failedCount 标识第几次失败 + */ + void onFailed(int failedCount, String error); + +} diff --git a/core/src/main/java/com/chwl/core/retry/RetryChatRoomMessage.java b/core/src/main/java/com/chwl/core/retry/RetryChatRoomMessage.java new file mode 100644 index 0000000..28e7831 --- /dev/null +++ b/core/src/main/java/com/chwl/core/retry/RetryChatRoomMessage.java @@ -0,0 +1,20 @@ +package com.chwl.core.retry; + +import androidx.annotation.Keep; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; + +import lombok.Getter; +import lombok.Setter; + +/** + * + * Created by @lvzebiao on 2020/2/20. + */ +@Keep +@Setter +@Getter +public class RetryChatRoomMessage { + private ChatRoomMessage message; + private int retryCount; +} diff --git a/core/src/main/java/com/chwl/core/room/IRoomCoreClient.java b/core/src/main/java/com/chwl/core/room/IRoomCoreClient.java new file mode 100644 index 0000000..5d10dc3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/IRoomCoreClient.java @@ -0,0 +1,93 @@ +package com.chwl.core.room; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.SearchRoomInfo; +import com.chwl.core.room.queue.bean.RoomConsumeInfo; +import com.chwl.library.coremanager.ICoreClient; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public interface IRoomCoreClient extends ICoreClient { + public static final String METHOD_ON_OPEN_ROOM = "onOpenRoom"; + public static final String METHOD_ON_OPEN_ROOM_FAIL = "onOpenRoomFail"; + public static final String METHOD_ON_ALREADY_OPENED_ROOM= "onAlreadyOpenedRoom"; + + public static final String METHOD_ON_ENTER= "onEnter"; + public static final String METHOD_ON_ENTER_FAIL = "onEnterFail"; + + public static final String METHOD_ON_QUIT_ROOM = "onQuitRoom"; + + public static final String METHOD_ON_BE_KICK_OUT= "onBeKickOut"; + + public static final String METHOD_ON_GET_ROOM_INFO = "onGetRoomInfo"; + public static final String METHOD_ON_GET_ROOM_INFO_FAIL = "onGetRoomInfoFail"; + + public static final String METHOD_ON_UPDATE_ROOM_INFO = "onUpdateRoomInfo"; + public static final String METHOD_ON_UPDATE_ROOM_INFO_FAIL = "onUpdateRoomInfoFail"; + + public static final String METHOD_ON_CURRENT_ROOM_INFO_UPDATE = "onCurrentRoomInfoUpdate"; + + public static final String METHOD_ON_CLOSE_ROOM_INFO = "onCloseRoomInfo"; + public static final String METHOD_ON_CLOSE_ROOM_INFO_FAIL = "onCloseRoomInfoFail"; + + public static final String METHOD_ON_GET_ROOM_CONSUME_LIST = "onGetRoomConsumeList"; + public static final String METHOD_ON_GET_ROOM_CONSUME_LIST_FAIL = "onGetRoomConsumeListFail"; + + public static final String METHOD_ON_SEARCH_ROOM = "onSearchRoom"; + public static final String METHOD_ON_SEARCH_ROOM_FAIL = "onSearchRoomFail"; + + public static final String METHOD_ON_CURRENT_ROOM_RECEIVE_NEW_MSG = "onCurrentRoomReceiveNewMsg"; + + public static final String METHOD_ON_GET_USER_ROOM = "onGetUserRoom"; + public static final String METHOD_ON_GET_USER_ROOM_FAIL = "onGetUserRoomFail"; + public static final String METHOD_ON_USER_ROOM_IN = "onUserRoomIn"; + public static final String METHOD_ON_USER_ROOM_OUT = "onUserRoomOut"; + + String METHOD_ROOM_GET_TAG = "onRoomGetTag"; + String METHOD_ROOM_GET_TAG_ERROR = "onRoomGetTagFail"; + + void onOpenRoom(RoomInfo roomInfo); + void onOpenRoomFail(String error); + void onAlreadyOpenedRoom(); + + void onEnter(RoomInfo roomInfo); + void onEnterFail(int code, String error); + + void onQuitRoom(RoomInfo roomInfo); + + void onBeKickOut(ChatRoomKickOutEvent.ChatRoomKickOutReason reason); + + void onUpdateRoomInfo(RoomInfo roomInfo); + void onUpdateRoomInfoFail(String error); + + void onCurrentRoomInfoUpdate(RoomInfo roomInfo); + + void onGetRoomInfo(RoomInfo roomInfo); + void onGetRoomInfoFail(String error); + + void onRequestCurrentRoomInfo(RoomInfo roomInfo); + void onRequestCurrentRoomInfoFail(String error); + + void onCloseRoomInfo(); + void onCloseRoomInfoFail(String error); + + void onGetRoomConsumeList(List roomConsumeInfos); + void onGetRoomConsumeListFail(String msg); + + void onSearchRoom(List homeRooms); + void onSearchRoomFail(String msg); + + void onCurrentRoomRecieveNewMsg(ChatRoomMessage chatRoomMessage, boolean needClear); + + void onGetUserRoom(RoomInfo roomInfo); + void onGetUserRoomFail(String msg); + + void onUserRoomIn(); + void onUserRoomOut(); +} diff --git a/core/src/main/java/com/chwl/core/room/activitytimer/ActivityTimerEvent.java b/core/src/main/java/com/chwl/core/room/activitytimer/ActivityTimerEvent.java new file mode 100644 index 0000000..903e20f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/activitytimer/ActivityTimerEvent.java @@ -0,0 +1,12 @@ +package com.chwl.core.room.activitytimer; + +import com.chwl.core.base.BaseBusEvent; + +/** + * create by lvzebiao @2020/2/24 + */ +public class ActivityTimerEvent extends BaseBusEvent { + public ActivityTimerEvent(TimerBean data) { + super(data); + } +} diff --git a/core/src/main/java/com/chwl/core/room/activitytimer/TimerBean.java b/core/src/main/java/com/chwl/core/room/activitytimer/TimerBean.java new file mode 100644 index 0000000..eeb20f2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/activitytimer/TimerBean.java @@ -0,0 +1,22 @@ +package com.chwl.core.room.activitytimer; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/**暴走倒计时的消息尸体 + * create by lvzebiao @2020/2/24 + */ +@Keep +@Setter +@Getter +public class TimerBean implements Serializable { + + private long limitTime; + + private long runawayTime; + +} diff --git a/core/src/main/java/com/chwl/core/room/anotherroompk/RoomPKModel.kt b/core/src/main/java/com/chwl/core/room/anotherroompk/RoomPKModel.kt new file mode 100644 index 0000000..7a26ca0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/anotherroompk/RoomPKModel.kt @@ -0,0 +1,153 @@ +package com.chwl.core.room.anotherroompk + +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.im.custom.bean.RoomPkBean +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Single +import retrofit2.http.* + +object RoomPKModel { + private val api: Api + + init { + api = RxNet.create(Api::class.java) + } + + /** + * 发起挑战 + * + * @param acceptUid 必传:接受方房主uid + * @param duration 时长:分钟 + * @param inviteUid 必传:发起方房主uid + * @param operateUid 操作人uid + * @param playDesc 玩法 + * + * @return + */ + fun initiateRoomPK( + acceptUid: Long, + duration: Int, + inviteUid: Long, + operateUid: Long, + playDesc: String? + ): Single { + return api.initiateRoomPK(acceptUid, duration, inviteUid, operateUid, playDesc) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + /** + * 接受/拒绝挑战 + * + * @param isAccept true 接受PK + * @param roomUid roomUid + * @param roundId roundId + * + * @return + */ + fun acceptRoomPK( + isAccept: Boolean, + roomUid: Long, + roundId: String + ): Single { + return api.acceptRoomPK(isAccept, roomUid, roundId) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + /** + * 跨房pk/牌照房搜索 + * + * @param erbanNo erbanNo,空则获取全部牌照房 + * @param roomUid roomUid + * @param pageNum pageNum + * @param pageSize pageSize + * + * @return + */ + fun searchPermitRoom( + erbanNo: String?, + roomUid: Long?, + pageNum: Int, + pageSize: Int + ): Single> { + return api.searchPermitRoom(erbanNo,roomUid, pageNum, pageSize) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleBeanData()) + } + + /** + * 跨房pk/牌照房搜索 + * + * @param roomUid roomUid + * + * @return + */ + fun getRoomPKData( + roomUid: Long + ): Single { + return api.getRoomPKData(roomUid) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleBeanData()) + } + + private interface Api { + /** + * 发起挑战 + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/initiateChallenge") + fun initiateRoomPK( + @Field("acceptUid") acceptUid: Long, + @Field("duration") duration: Int, + @Field("inviteUid") inviteUid: Long, + @Field("operateUid") operateUid: Long, + @Field("playDesc") playDesc: String? + ): Single> + + /** + * 接受/拒绝挑战 + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/replyChallenge") + fun acceptRoomPK( + @Field("isAccept") isAccept: Boolean, + @Field("roomUid") roomUid: Long, + @Field("roundId") roundId: String + ): Single> + + /** + * + * 跨房pk/牌照房搜索 + * + * @return + */ + @GET("/search/permitRoom") + fun searchPermitRoom( + @Query("erbanNo") erbanNo: String?, + @Query("roomUid") roomUid: Long?, + @Query("pageNum") pageNum: Int, + @Query("pageSize") pageSize: Int + ): Single>> + + /** + * + * 获取PK数据 + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/getCrossPkData") + fun getRoomPKData( + @Field("roomUid") roomUid: Long? + ): Single> + + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/anotherroompk/ShowGiftDialogEvent.java b/core/src/main/java/com/chwl/core/room/anotherroompk/ShowGiftDialogEvent.java new file mode 100644 index 0000000..576d0b3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/anotherroompk/ShowGiftDialogEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.room.anotherroompk; + +public class ShowGiftDialogEvent { + private int giftId; + + public int getGiftId() { + return giftId; + } + + public ShowGiftDialogEvent setGiftId(int giftId) { + this.giftId = giftId; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/room/anotherroompk/ShowUserInfoDialogEvent.java b/core/src/main/java/com/chwl/core/room/anotherroompk/ShowUserInfoDialogEvent.java new file mode 100644 index 0000000..00b412f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/anotherroompk/ShowUserInfoDialogEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.room.anotherroompk; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ShowUserInfoDialogEvent { + private String uid; +} diff --git a/core/src/main/java/com/chwl/core/room/anotherroompk/SimpleRoomInfo.kt b/core/src/main/java/com/chwl/core/room/anotherroompk/SimpleRoomInfo.kt new file mode 100644 index 0000000..4eff82f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/anotherroompk/SimpleRoomInfo.kt @@ -0,0 +1,16 @@ +package com.chwl.core.room.anotherroompk + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +data class SimpleRoomInfo( + val title: String? = null, + val nick: String? = null, + val roomUid: Long = 0L, + val erbanNo: Long = 0L, + val avatar: String? = null, + val crossPking: Boolean = false, + val valid:Boolean = false, + var checked: Boolean = false +) : Serializable diff --git a/core/src/main/java/com/chwl/core/room/anotherroompk/SingleRoomPKModel.kt b/core/src/main/java/com/chwl/core/room/anotherroompk/SingleRoomPKModel.kt new file mode 100644 index 0000000..87f33a9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/anotherroompk/SingleRoomPKModel.kt @@ -0,0 +1,202 @@ +package com.chwl.core.room.anotherroompk + +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.core.utils.net.RxHelper +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Single +import retrofit2.http.* + +object SingleRoomPKModel { + private val api: Api + + init { + api = RxNet.create(Api::class.java) + } + + /** + * 发起挑战 + * + * @param acceptUid 必传:接受方房主uid + * @param duration 时长:分钟 + * @param inviteUid 必传:发起方房主uid + * @param operateUid 操作人uid + * @param playDesc 玩法 + * + * @return + */ + fun initiateRoomPK( + acceptUid: Long, + duration: Int, + inviteUid: Long, + operateUid: Long, + playDesc: String? + ): Single { + return api.initiateRoomPK(acceptUid, duration, inviteUid, operateUid, 2, playDesc) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + /** + * 接受/拒绝挑战 + * + * @param isAccept true 接受PK + * @param roomUid roomUid + * @param roundId roundId + * + * @return + */ + fun acceptRoomPK( + isAccept: Boolean, + roomUid: Long, + roundId: String + ): Single { + return api.acceptRoomPK(isAccept, roomUid, roundId) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + /** + * 跨房pk/牌照房搜索 + * + * @param erbanNo erbanNo,空则获取全部牌照房 + * @param roomUid roomUid + * @param pageNum pageNum + * @param pageSize pageSize + * + * @return + */ + fun searchPermitRoom( + erbanNo: String?, + roomUid: Long?, + pageNum: Int, + pageSize: Int + ): Single> { + return api.searchPermitRoom(erbanNo, roomUid, pageNum, pageSize) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleBeanData()) + } + + + /** + * 结束跨房PK + * + * @param roundId roundId + * + * @return + */ + fun endSingleRoomPk( + roundId: String + ): Single { + return api.endSingleRoomPk(roundId) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + /** + * 获取个播PK规则说明 + * + * @return + */ + fun getSingleRoomPkRule(): Single { + return api.getSingleRoomPkRule(AvRoomDataManager.get().roomUid) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + /** + * 对方麦位屏蔽 + * + * @return + */ + fun muteSingleRoomPkOtherMic(roundId: String, micStatus: Int): Single { + return api.muteSingleRoomPkOtherMic(AvRoomDataManager.get().roomUid, roundId, micStatus) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleStringData()) + } + + private interface Api { + /** + * 发起挑战 + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/initiateChallenge") + fun initiateRoomPK( + @Field("acceptUid") acceptUid: Long, + @Field("duration") duration: Int, + @Field("inviteUid") inviteUid: Long, + @Field("operateUid") operateUid: Long, + @Field("pkType") pkType: Int, + @Field("playDesc") playDesc: String? + ): Single> + + /** + * 接受/拒绝挑战 + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/replyChallenge") + fun acceptRoomPK( + @Field("isAccept") isAccept: Boolean, + @Field("roomUid") roomUid: Long, + @Field("roundId") roundId: String + ): Single> + + /** + * + * 跨房pk/牌照房搜索 + * + * @return + */ + @GET("/search/singleRoom") + fun searchPermitRoom( + @Query("erbanNo") erbanNo: String?, + @Query("roomUid") roomUid: Long?, + @Query("pageNum") pageNum: Int, + @Query("pageSize") pageSize: Int + ): Single>> + + + /** + * + * 结束跨房PK + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/endSingleRoomPk") + fun endSingleRoomPk( + @Field("roundId") roundId: String? + ): Single> + + /** + *获取个播PK规则说明 + * + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/getSingleRoomPkRule") + fun getSingleRoomPkRule( + @Field("roomUid") roomUid: Long? + ): Single> + + /** + *对方麦位屏蔽 + * + * + * @return + */ + @FormUrlEncoded + @POST("/crossroompkround/otherMic") + fun muteSingleRoomPkOtherMic( + @Field("roomUid") roomUid: Long?, + @Field("roundId") roundId: String, + @Field("micStatus") micStatus: Int + ): Single> + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/auction/IAuctionCore.java b/core/src/main/java/com/chwl/core/room/auction/IAuctionCore.java new file mode 100644 index 0000000..7a40375 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/auction/IAuctionCore.java @@ -0,0 +1,59 @@ +package com.chwl.core.room.auction; + +import com.chwl.core.room.auction.bean.AuctionInfo; +import com.chwl.library.coremanager.IBaseCore; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public interface IAuctionCore extends IBaseCore { + AuctionInfo getCurrentAuctionInfo(); + + /** + * 房主开始竞拍 + * uid: 必填房主uid + * ticket:必填 + * auctUid:被拍卖声优UID,必填 + * auctMoney:拍卖起拍价,必填 + * servDura:服务时长,本期需求直接写死30(分钟) + * minRaiseMoney:最低竞拍报价 + * auctDesc:竞拍描述,选填 + */ + void auctionStart(long uid, long auctUid, int auctMoney, int servDura, int minRaiseMoney, String auctDesc); + + /** + * 用户参与竞拍报价 + * uid: 必填房主uid + * ticket:必填 + * auctUid:参与人id + * auctId:拍卖单ID + * type:用户竞拍动作,1加价,2出价(自行填写价格) + * money:金额 + * + * @return + */ + void auctionUp(long uid, long auctUid, String auctId, int type, int money); + + /** + * 房主结束竞拍 + * uid: 必填房主uid + * ticket:必填 + * auctId:当前拍卖单ID + */ + void finishAuction(long uid, String auctId); + + /** + * 获取周竞拍榜 + * + * @param roomUid + */ + void requestWeekAuctionList(long roomUid); + + /** + * 获取总竞拍榜 + * + * @param roomUid + */ + void requestTotalAuctionList(long roomUid); +} diff --git a/core/src/main/java/com/chwl/core/room/auction/IAuctionCoreClient.java b/core/src/main/java/com/chwl/core/room/auction/IAuctionCoreClient.java new file mode 100644 index 0000000..9658c2f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/auction/IAuctionCoreClient.java @@ -0,0 +1,36 @@ +package com.chwl.core.room.auction; + +import com.chwl.core.room.auction.bean.AuctionInfo; +import com.chwl.core.room.auction.bean.AuctionListUserInfo; +import com.chwl.library.coremanager.ICoreClient; + +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public interface IAuctionCoreClient extends ICoreClient { + + public static final String METHOD_ON_CURRENT_AUCTION_INFO_UPDATE = "onCurrentAuctionInfoUpdate"; + public static final String METHOD_ON_AUCTION_START = "onAuctionStart"; + public static final String METHOD_ON_AUCTION_FINISH = "onAuctionFinish"; + public static final String METHOD_ON_AUCTION_UPDATE = "onAuctionUpdate"; + public static final String METHOD_ON_AUCTION_UP = "onAuctionUp"; + public static final String METHOD_ON_AUCTION_UP_FAIL = "onAuctionUpFail"; + public static final String METHOD_ON_REQUEST_WEEK_AUCTION_LIST = "onRequestWeekAuctionList"; + public static final String METHOD_ON_REQUEST_WEEK_AUCTION_LIST_FAIL = "onRequestWeekAuctionListFail"; + public static final String METHOD_ON_REQUEST_TOTAL_AUCTION_LIST = "onRequestTotalAuctionList"; + public static final String METHOD_ON_REQUEST_TOTAL_AUCTION_LIST_FAIL = "onRequestTotalAuctionListFail"; + + void onAuctionUp(); + void onAuctionUpFail(int code); + void onCurrentAuctionInfoUpdate(AuctionInfo auctionInfo); + void onAuctionStart(AuctionInfo auctionInfo); + void onAuctionFinish(AuctionInfo auctionInfo); + void onAuctionUpdate(AuctionInfo auctionInfo); + void onRequestWeekAuctionList(List auctionListUserInfos); + void onRequestWeekAuctionListFail(String msg); + void onRequestTotalAuctionList(List auctionListUserInfos); + void onRequestTotalAuctionListFail(String msg); +} diff --git a/core/src/main/java/com/chwl/core/room/auction/bean/AuctionInfo.java b/core/src/main/java/com/chwl/core/room/auction/bean/AuctionInfo.java new file mode 100644 index 0000000..7e6997f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/auction/bean/AuctionInfo.java @@ -0,0 +1,143 @@ +package com.chwl.core.room.auction.bean; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class AuctionInfo implements Serializable { + +// "auctId":"f3c1cf4da8f048e6865429217756271e", +// "uid":900170, +// "auctUid":900177, +// "auctMoney":4, +// "servDura":30, +// "minRaiseMoney":10, +// "curMaxMoney":4, +// "auctDesc":ResUtil.getString(R.string.auction_bean_auctioninfo_01), +// "curStatus":1, +// "createTime":"Jun 21, 2017 9:52:57 PM" + + + private String auctId; + + private long uid; + + private long auctUid; + + private int auctMoney; + + private int servDura; + + private int minRaiseMoney; + + private long curMaxUid; + + private int curMaxMoney; + + private String auctDesc; + + private long createTime; + + private int curStatus; + + private List rivals; + + public long getCurMaxUid() { + return curMaxUid; + } + + public void setCurMaxUid(long curMaxUid) { + this.curMaxUid = curMaxUid; + } + + public int getCurStatus() { + return curStatus; + } + + public void setCurStatus(int curStatus) { + this.curStatus = curStatus; + } + + public List getRivals() { + return rivals; + } + + public void setRivals(List rivals) { + this.rivals = rivals; + } + + public String getAuctId() { + return auctId; + } + + public void setAuctId(String auctId) { + this.auctId = auctId; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public long getAuctUid() { + return auctUid; + } + + public void setAuctUid(long auctUid) { + this.auctUid = auctUid; + } + + public int getAuctMoney() { + return auctMoney; + } + + public void setAuctMoney(int auctMoney) { + this.auctMoney = auctMoney; + } + + public int getServDura() { + return servDura; + } + + public void setServDura(int servDura) { + this.servDura = servDura; + } + + public int getMinRaiseMoney() { + return minRaiseMoney; + } + + public void setMinRaiseMoney(int minRaiseMoney) { + this.minRaiseMoney = minRaiseMoney; + } + + public int getCurMaxMoney() { + return curMaxMoney; + } + + public void setCurMaxMoney(int curMaxMoney) { + this.curMaxMoney = curMaxMoney; + } + + public String getAuctDesc() { + return auctDesc; + } + + public void setAuctDesc(String auctDesc) { + this.auctDesc = auctDesc; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } +} diff --git a/core/src/main/java/com/chwl/core/room/auction/bean/AuctionListUserInfo.java b/core/src/main/java/com/chwl/core/room/auction/bean/AuctionListUserInfo.java new file mode 100644 index 0000000..d97a04d --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/auction/bean/AuctionListUserInfo.java @@ -0,0 +1,73 @@ +package com.chwl.core.room.auction.bean; + +import java.io.Serializable; + +/** + * Created by chenran on 2017/8/9. + */ + +public class AuctionListUserInfo implements Serializable{ + private long uid; + private long prodId; + private int price; + private int gender; + private long createTime; + private String nick; + private String avatar; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public long getProdId() { + return prodId; + } + + public void setProdId(long prodId) { + this.prodId = prodId; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } +} diff --git a/core/src/main/java/com/chwl/core/room/auction/bean/AuctionUser.java b/core/src/main/java/com/chwl/core/room/auction/bean/AuctionUser.java new file mode 100644 index 0000000..14fea2d --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/auction/bean/AuctionUser.java @@ -0,0 +1,54 @@ +package com.chwl.core.room.auction.bean; + +import java.io.Serializable; + +/** + * Created by zhouxiangfeng on 2017/5/28. + */ + +public class AuctionUser implements Serializable { + + private String rivalId; + private String auctId; + private long uid; + private int auctMoney; + + public AuctionUser(String rivalId, String auctId, long uid, int auctMoney) { + this.rivalId = rivalId; + this.auctId = auctId; + this.uid = uid; + this.auctMoney = auctMoney; + } + + public String getRivalId() { + return rivalId; + } + + public void setRivalId(String rivalId) { + this.rivalId = rivalId; + } + + public String getAuctId() { + return auctId; + } + + public void setAuctId(String auctId) { + this.auctId = auctId; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public int getAuctMoney() { + return auctMoney; + } + + public void setAuctMoney(int auctMoney) { + this.auctMoney = auctMoney; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/AnchorInfo.kt b/core/src/main/java/com/chwl/core/room/bean/AnchorInfo.kt new file mode 100644 index 0000000..adf9694 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/AnchorInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.room.bean + +import com.chwl.core.user.bean.UserInfoSkillEntity + +data class AnchorInfo( + val absCardPics: List? = null, + val avatar: String = "", + val erbanNo: Int = 0, + val gender: Int = 0, + val nick: String = "", + val userDesc: String? = null, + val uid: Long = 0, + val roomUid: Long? = 0, + val voiceCard: UserInfoSkillEntity? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/BoxSwitchVo.java b/core/src/main/java/com/chwl/core/room/bean/BoxSwitchVo.java new file mode 100644 index 0000000..2bcb700 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/BoxSwitchVo.java @@ -0,0 +1,92 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.Serializable; + +public class BoxSwitchVo implements Parcelable, Serializable { + /**宝箱开关*/ + private boolean openBoxSwitch; + /**梦幻许愿池开关*/ + private boolean diamondBoxSwitch; + /**许愿池图标*/ + private String openBoxIcon; + /**梦幻许愿池开启时间*/ + private String diamondBoxOpenTime; + + public boolean isOpenBoxSwitch() { + return openBoxSwitch; + } + + public void setOpenBoxSwitch(boolean openBoxSwitch) { + this.openBoxSwitch = openBoxSwitch; + } + + public boolean isDiamondBoxSwitch() { + return diamondBoxSwitch; + } + + public void setDiamondBoxSwitch(boolean diamondBoxSwitch) { + this.diamondBoxSwitch = diamondBoxSwitch; + } + + public String getOpenBoxIcon() { + return openBoxIcon; + } + + public void setOpenBoxIcon(String openBoxIcon) { + this.openBoxIcon = openBoxIcon; + } + + public String getDiamondBoxOpenTime() { + return diamondBoxOpenTime; + } + + public void setDiamondBoxOpenTime(String diamondBoxOpenTime) { + this.diamondBoxOpenTime = diamondBoxOpenTime; + } + + protected BoxSwitchVo(Parcel in) { + openBoxSwitch = in.readByte() != 0; + diamondBoxSwitch = in.readByte() != 0; + openBoxIcon = in.readString(); + diamondBoxOpenTime = in.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte((byte) (openBoxSwitch ? 1 : 0)); + dest.writeByte((byte) (diamondBoxSwitch ? 1 : 0)); + dest.writeString(openBoxIcon); + dest.writeString(diamondBoxOpenTime); + } + + public static final Creator CREATOR = new Creator() { + @Override + public BoxSwitchVo createFromParcel(Parcel in) { + return new BoxSwitchVo(in); + } + + @Override + public BoxSwitchVo[] newArray(int size) { + return new BoxSwitchVo[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + + @Override + public String toString() { + return "BoxInfo{" + + "openBoxSwitch=" + openBoxSwitch + + ", diamondBoxSwitch=" + diamondBoxSwitch + + ", openBoxIcon='" + openBoxIcon + '\'' + + ", diamondBoxOpenTime='" + diamondBoxOpenTime + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/BroadcastInfo.kt b/core/src/main/java/com/chwl/core/room/bean/BroadcastInfo.kt new file mode 100644 index 0000000..33a6a4c --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/BroadcastInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.room.bean + +data class BroadcastInfo( + val availableTimes: Long = 0, + val maxWords: Int = 0, + val minWords: Int = 0, + val recommends: List? = null, + val total: Int = 0, + val minutes:Int =0, + val seconds: Long = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/CpListItem.java b/core/src/main/java/com/chwl/core/room/bean/CpListItem.java new file mode 100644 index 0000000..ebc73a5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/CpListItem.java @@ -0,0 +1,17 @@ +package com.chwl.core.room.bean; + +public class CpListItem { + public String uid; + public String cpLevel; + public String maxCpLevel; + public String cpDay; + public String cpAvatar; + public String cpNick; + public String cpUid; + public String currentExp; + public String startExp; //起始值 + public String endExp; + public String avatar; + public String nick; + public String cancelGoldNum; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/DatingAllNotifyInfo.kt b/core/src/main/java/com/chwl/core/room/bean/DatingAllNotifyInfo.kt new file mode 100644 index 0000000..9d24f19 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/DatingAllNotifyInfo.kt @@ -0,0 +1,45 @@ +package com.chwl.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, + + val sweetWords: String +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/DatingNotifyInfo.kt b/core/src/main/java/com/chwl/core/room/bean/DatingNotifyInfo.kt new file mode 100644 index 0000000..6b597a0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/DatingNotifyInfo.kt @@ -0,0 +1,52 @@ +package com.chwl.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/chwl/core/room/bean/DragonBarInfo.java b/core/src/main/java/com/chwl/core/room/bean/DragonBarInfo.java new file mode 100644 index 0000000..a2e2aa7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/DragonBarInfo.java @@ -0,0 +1,32 @@ +package com.chwl.core.room.bean; + +/** + * Created by huangmeng1 on 2018/7/12. + */ + +public class DragonBarInfo { + + /** + * isGen : false + * value : 1, 3, 3 + */ + + private boolean isGen; + private String value; + + public boolean isIsGen() { + return isGen; + } + + public void setIsGen(boolean isGen) { + this.isGen = isGen; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/FaceBean.java b/core/src/main/java/com/chwl/core/room/bean/FaceBean.java new file mode 100644 index 0000000..025eb84 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/FaceBean.java @@ -0,0 +1,8 @@ +package com.chwl.core.room.bean; + +public class FaceBean { + public String faceIndex; + public String faceUrl; + public int seqNo; + public int showTimes; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/FaceEntity.java b/core/src/main/java/com/chwl/core/room/bean/FaceEntity.java new file mode 100644 index 0000000..84f899c --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/FaceEntity.java @@ -0,0 +1,11 @@ +package com.chwl.core.room.bean; + +import java.util.List; + +public class FaceEntity { + public int tabId; + public int tabSeq; + public String tabUrl; + public int useVip; + public List faceNewVoList; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/FaceTabBean.java b/core/src/main/java/com/chwl/core/room/bean/FaceTabBean.java new file mode 100644 index 0000000..191d78a --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/FaceTabBean.java @@ -0,0 +1,22 @@ +package com.chwl.core.room.bean; + +public class FaceTabBean { + public int id = -1; + public int icon = -1; + public String tabUrl=""; + public FaceEntity faceEntity; + + public FaceTabBean() { + } + + public FaceTabBean(int id, int icon) { + this.id = id; + this.icon = icon; + } + + public FaceTabBean(int id, String tabUrl, FaceEntity faceEntity) { + this.id = id; + this.tabUrl = tabUrl; + this.faceEntity = faceEntity; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/FindLoveSwitchVo.java b/core/src/main/java/com/chwl/core/room/bean/FindLoveSwitchVo.java new file mode 100644 index 0000000..b5e0996 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/FindLoveSwitchVo.java @@ -0,0 +1,87 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.Serializable; + +public class FindLoveSwitchVo implements Parcelable, Serializable { + private boolean open; + private int openLevel; + private int sendMsgLevel; + private double price; + + public boolean isOpen() { + return open; + } + + public void setOpen(boolean open) { + this.open = open; + } + + public int getOpenLevel() { + return openLevel; + } + + public void setOpenLevel(int openLevel) { + this.openLevel = openLevel; + } + + public int getSendMsgLevel() { + return sendMsgLevel; + } + + public void setSendMsgLevel(int sendMsgLevel) { + this.sendMsgLevel = sendMsgLevel; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + protected FindLoveSwitchVo(Parcel in) { + open = in.readByte() != 0; + openLevel = in.readInt(); + sendMsgLevel = in.readInt(); + price = in.readDouble(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte((byte) (open ? 1 : 0)); + dest.writeInt(openLevel); + dest.writeInt(sendMsgLevel); + dest.writeDouble(price); + } + + public static final Creator CREATOR = new Creator() { + @Override + public FindLoveSwitchVo createFromParcel(Parcel in) { + return new FindLoveSwitchVo(in); + } + + @Override + public FindLoveSwitchVo[] newArray(int size) { + return new FindLoveSwitchVo[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public String toString() { + return "BoxInfo{" + + "open=" + open + + ", openLevel=" + openLevel + + ", sendMsgLevel='" + sendMsgLevel + '\'' + + ", price='" + price + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/HomeLiveTopInfo.kt b/core/src/main/java/com/chwl/core/room/bean/HomeLiveTopInfo.kt new file mode 100644 index 0000000..f07e83c --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/HomeLiveTopInfo.kt @@ -0,0 +1,14 @@ +package com.chwl.core.room.bean + +data class HomeLiveTopInfo( + val onceLookStatus: Boolean = false, + val singleRoomList: List = listOf() +) { + data class SingleRoom( + val avatar: String = "", + val isRecommend: Boolean = false, + val title: String = "", + val uid: Long = 0, + val erbanNo: String = "" + ) +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/LeaveModeAttachment.java b/core/src/main/java/com/chwl/core/room/bean/LeaveModeAttachment.java new file mode 100644 index 0000000..7401c35 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/LeaveModeAttachment.java @@ -0,0 +1,44 @@ +package com.chwl.core.room.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; + +public class LeaveModeAttachment extends CustomAttachment { + + public String nick; + public int gender; + public String avatar; + + public LeaveModeAttachment() { + super(CustomAttachment.CUSTOM_MSG_LEAVE_MODE, CustomAttachment.CUSTOM_MSG_LEAVE_MODE_NOTICE); + } + + @Override + protected JSONObject packData() { + JSONObject jsonObject = new JSONObject(); + if (nick != null) { + jsonObject.put("nick", nick); + } + jsonObject.put("gender", gender); + if (avatar != null) { + jsonObject.put("avatar", avatar); + } + return jsonObject; + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + if (data != null) { + if (data.containsKey("nick")) { + nick = data.getString("nick"); + } + if (data.containsKey("gender")) { + gender = data.getIntValue("gender"); + } + if (data.containsKey("avatar")) { + avatar = data.getString("avatar"); + } + } + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/MeCenterInfo.kt b/core/src/main/java/com/chwl/core/room/bean/MeCenterInfo.kt new file mode 100644 index 0000000..9bcfcbb --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/MeCenterInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.room.bean + +data class MeCenterInfo( + val icon: Int? = null, + val centerCode: String? = null, + val centerBadge: String? = null, + val centerId: Int? = null, + var centerName: String? = null, + val centerPic: String? = null, + val androidCenterPic: String? = null, + val centerSeq: Int? = null, + val centerStatus: Int? = null, + val centerUrl: String? = null, + val skipType: Int? = null, +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/OnlineChatMember.java b/core/src/main/java/com/chwl/core/room/bean/OnlineChatMember.java new file mode 100644 index 0000000..85b04c0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/OnlineChatMember.java @@ -0,0 +1,121 @@ +package com.chwl.core.room.bean; + +import androidx.annotation.NonNull; + +import com.chad.library.adapter.base.entity.MultiItemEntity; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.chwl.core.noble.NobleResourceType; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + *

在线用户列表,包装 {@link ChatRoomMember}

+ * + * @author jiahui + * @date 2017/12/20 + */ +public class OnlineChatMember implements MultiItemEntity, Comparable { + + public static final int NOBLE = 1; + public static final int NORMAL = 4; + public ChatRoomMember chatRoomMember; + public boolean isOnMic; + public boolean isAdmin; + public boolean isRoomOwer; + + public OnlineChatMember(ChatRoomMember chatRoomMember) { + this.chatRoomMember = chatRoomMember; + } + + public OnlineChatMember(ChatRoomMember chatRoomMember, boolean isOnMic, boolean isAdmin, + boolean isRoomOwer) { + this.chatRoomMember = chatRoomMember; + this.isOnMic = isOnMic; + this.isAdmin = isAdmin; + this.isRoomOwer = isRoomOwer; + } + + public static List coverToOnlineChatMember(List oldList, List newList) { + HashSet treeSet = new HashSet<>(); + if (!ListUtils.isListEmpty(oldList)) { + List list = new ArrayList<>(oldList.size()); + for (ChatRoomMember chatRoomMember : oldList) { + list.add(new OnlineChatMember(chatRoomMember)); + } + treeSet.addAll(list); + } + if (!ListUtils.isListEmpty(newList)) { + List list = new ArrayList<>(newList.size()); + for (ChatRoomMember chatRoomMember : newList) { + list.add(new OnlineChatMember(chatRoomMember)); + } + treeSet.addAll(list); + } + ArrayList list = new ArrayList<>(treeSet); + Collections.sort(list); + return list; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof OnlineChatMember)) return false; + + OnlineChatMember that = (OnlineChatMember) o; + return !(chatRoomMember == null || that.chatRoomMember == null) + && Objects.equals(chatRoomMember.getAccount(), that.chatRoomMember.getAccount()); + } + + @Override + public int hashCode() { + return chatRoomMember.getAccount().hashCode(); + } + + @Override + public int compareTo(@NonNull OnlineChatMember o) { + if (chatRoomMember == null) return 1; + if (o.chatRoomMember == null) return -1; + return (int) (o.chatRoomMember.getEnterTime() - chatRoomMember.getEnterTime()); + } + + @Override + public int getItemType() { + Object isEnterHide = NobleUtil.getResource(NobleResourceType.KEY_ENTER_HIDE, chatRoomMember); + if ((isEnterHide instanceof Boolean && (Boolean) isEnterHide) + || (isEnterHide instanceof String) && ((String) isEnterHide).equals("1")) { + return NOBLE; + } + return NORMAL; + } + + /** + * 判断是否为官方 + * + * @return + */ + public boolean isOfficial() { + Map extension = chatRoomMember.getExtension(); + if (extension == null) return false; + Map memberExtension = (Map) extension.get(chatRoomMember.getAccount()); + if (memberExtension == null) return false; + if (memberExtension.get(UserInfo.IS_OFFICIAL) == null) { + if (memberExtension.get(UserInfo.DEF_USER) == null) { + return false; + } else { + int userType = (int) memberExtension.get(UserInfo.DEF_USER); + return userType == UserInfo.USER_TYPE_OFFICIAL; + } + } else { + return (boolean) memberExtension.get(UserInfo.IS_OFFICIAL); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RightBottomIconConfig.java b/core/src/main/java/com/chwl/core/room/bean/RightBottomIconConfig.java new file mode 100644 index 0000000..96d9f35 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RightBottomIconConfig.java @@ -0,0 +1,102 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.Serializable; + +public class RightBottomIconConfig implements Parcelable, Serializable { + + int skipType; + private String skipUrl; + + private String icon2Url; + + private String icon1Url; + + private String reserve; + + protected RightBottomIconConfig(Parcel in) { + skipType = in.readInt(); + skipUrl = in.readString(); + icon2Url = in.readString(); + icon1Url = in.readString(); + reserve = in.readString(); + } + + @Override + public String toString() { + return "RightBottomIconConfig{" + + "skipType=" + skipType + + ", skipUrl='" + skipUrl + '\'' + + ", icon2Url='" + icon2Url + '\'' + + ", icon1Url='" + icon1Url + '\'' + + ", reserve='" + reserve + '\'' + + '}'; + } + + public void setIcon1Url(String icon1Url) { + this.icon1Url = icon1Url; + } + + public void setIcon2Url(String icon2Url) { + this.icon2Url = icon2Url; + } + + public void setReserve(String reserve) { + this.reserve = reserve; + } + + public void setSkipType(int skipType) { + this.skipType = skipType; + } + + public void setSkipUrl(String skipUrl) { + this.skipUrl = skipUrl; + } + public int getSkipType() { + return skipType; + } + + public String getIcon1Url() { + return icon1Url; + } + + public String getIcon2Url() { + return icon2Url; + } + + public String getReserve() { + return reserve; + } + + public String getSkipUrl() { + return skipUrl; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(skipType); + dest.writeString(skipUrl); + dest.writeString(icon2Url); + dest.writeString(icon1Url); + dest.writeString(reserve); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public RightBottomIconConfig createFromParcel(Parcel in) { + return new RightBottomIconConfig(in); + } + + @Override + public RightBottomIconConfig[] newArray(int size) { + return new RightBottomIconConfig[size]; + } + }; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomAudioSdkType.java b/core/src/main/java/com/chwl/core/room/bean/RoomAudioSdkType.java new file mode 100644 index 0000000..fede9e0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomAudioSdkType.java @@ -0,0 +1,10 @@ +package com.chwl.core.room.bean; + +/** + *房间语音SDK类型 + */ +public interface RoomAudioSdkType { + String SHENGWANG = "shengwang"; //声网 + String TRTC = "trtc"; //trtc + +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomBoomInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomBoomInfo.java new file mode 100644 index 0000000..e94c29e --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomBoomInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.room.bean; + +import com.chwl.core.gift.bean.BoomMsgAwardBean; + +import java.util.List; + +public class RoomBoomInfo { + public int level; + public int goldNum; + public int speed; + public String vapUrl; + public String Pic; + public List roomBoomSignVoList; + public List prizes; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomBoomInfoSign.java b/core/src/main/java/com/chwl/core/room/bean/RoomBoomInfoSign.java new file mode 100644 index 0000000..dfb5079 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomBoomInfoSign.java @@ -0,0 +1,10 @@ +package com.chwl.core.room.bean; + +public class RoomBoomInfoSign { + public long drawTime; + public String vapUrl; + public String pic; + public String countDownVapUrl; + public String endVapUrl; + public int level; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomContributeDataInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomContributeDataInfo.java new file mode 100644 index 0000000..702219b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomContributeDataInfo.java @@ -0,0 +1,149 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.ArrayList; + +/** + * Created by MadisonRong on 25/04/2018. + */ + +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; + private ArrayList dayRankings; + private ArrayList weekRankings; + private ArrayList totalRankings; + private ArrayList rankings; + + public RoomContributeDataInfo() { + } + + public RoomContributeDataInfo(RoomContributeRoomInfo room, ArrayList dayRankings, ArrayList weekRankings, ArrayList totalRankings) { + this.room = room; + this.dayRankings = dayRankings; + this.weekRankings = weekRankings; + this.totalRankings = totalRankings; + } + + public RoomContributeDataInfo(RoomContributeRoomInfo room, ArrayList rankings) { + this.room = room; + this.rankings = rankings; + } + + public RoomContributeRoomInfo getRoom() { + return room; + } + + public void setRoom(RoomContributeRoomInfo room) { + this.room = room; + } + + public ArrayList getDayRankings() { + return dayRankings; + } + + public void setDayRankings(ArrayList dayRankings) { + this.dayRankings = dayRankings; + } + + public ArrayList getWeekRankings() { + return weekRankings; + } + + public void setWeekRankings(ArrayList weekRankings) { + this.weekRankings = weekRankings; + } + + public ArrayList getTotalRankings() { + return totalRankings; + } + + public void setTotalRankings(ArrayList totalRankings) { + this.totalRankings = totalRankings; + } + + public ArrayList getRankings() { + return rankings; + } + + public void setRankings(ArrayList rankings) { + this.rankings = rankings; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RoomContributeDataInfo)) return false; + + RoomContributeDataInfo that = (RoomContributeDataInfo) o; + + if (getRoom() != null ? !getRoom().equals(that.getRoom()) : that.getRoom() != null) + return false; + if (getDayRankings() != null ? !getDayRankings().equals(that.getDayRankings()) : that.getDayRankings() != null) + return false; + if (getWeekRankings() != null ? !getWeekRankings().equals(that.getWeekRankings()) : that.getWeekRankings() != null) + return false; + return getTotalRankings() != null ? getTotalRankings().equals(that.getTotalRankings()) : that.getTotalRankings() == null; + } + + @Override + public int hashCode() { + int result = getRoom() != null ? getRoom().hashCode() : 0; + result = 31 * result + (getDayRankings() != null ? getDayRankings().hashCode() : 0); + result = 31 * result + (getWeekRankings() != null ? getWeekRankings().hashCode() : 0); + result = 31 * result + (getTotalRankings() != null ? getTotalRankings().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "RoomContributeDataInfo{" + + "room=" + room + + ", dayRankings=" + dayRankings + + ", weekRankings=" + weekRankings + + ", totalRankings=" + totalRankings + + ", rankings=" + rankings + + '}'; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(this.room, flags); + dest.writeTypedList(this.dayRankings); + dest.writeTypedList(this.weekRankings); + dest.writeTypedList(this.totalRankings); + dest.writeTypedList(this.rankings); + } + + protected RoomContributeDataInfo(Parcel in) { + this.room = in.readParcelable(RoomContributeRoomInfo.class.getClassLoader()); + this.dayRankings = in.createTypedArrayList(RoomContributeUserInfo.CREATOR); + this.weekRankings = in.createTypedArrayList(RoomContributeUserInfo.CREATOR); + this.totalRankings = in.createTypedArrayList(RoomContributeUserInfo.CREATOR); + this.rankings = in.createTypedArrayList(RoomContributeUserInfo.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RoomContributeDataInfo createFromParcel(Parcel source) { + return new RoomContributeDataInfo(source); + } + + @Override + public RoomContributeDataInfo[] newArray(int size) { + return new RoomContributeDataInfo[size]; + } + }; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomContributeRoomInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomContributeRoomInfo.java new file mode 100644 index 0000000..b2386a1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomContributeRoomInfo.java @@ -0,0 +1,130 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by MadisonRong on 25/04/2018. + */ + +public class RoomContributeRoomInfo implements Parcelable { + + /** + * nick : 不适合说爱的年纪 + * uid : 91288 + * erbanNo : 4909539 + * avatar : https://image.zhongjialx.com/FgPmgG7D6YmFMCT0nhjuAeGFWXmZ?imageslim + */ + + private String nick; + private int uid; + private int erbanNo; + private String avatar; + + public RoomContributeRoomInfo() { + } + + public RoomContributeRoomInfo(String nick, int uid, int erbanNo, String avatar) { + this.nick = nick; + this.uid = uid; + this.erbanNo = erbanNo; + this.avatar = avatar; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RoomContributeRoomInfo)) return false; + + RoomContributeRoomInfo that = (RoomContributeRoomInfo) o; + + if (getUid() != that.getUid()) return false; + if (getErbanNo() != that.getErbanNo()) return false; + if (getNick() != null ? !getNick().equals(that.getNick()) : that.getNick() != null) + return false; + return getAvatar() != null ? getAvatar().equals(that.getAvatar()) : that.getAvatar() == null; + } + + @Override + public int hashCode() { + int result = getNick() != null ? getNick().hashCode() : 0; + result = 31 * result + getUid(); + result = 31 * result + getErbanNo(); + result = 31 * result + (getAvatar() != null ? getAvatar().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "RoomContributeRoomInfo{" + + "nick='" + nick + '\'' + + ", uid=" + uid + + ", erbanNo=" + erbanNo + + ", avatar='" + avatar + '\'' + + '}'; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.nick); + dest.writeInt(this.uid); + dest.writeInt(this.erbanNo); + dest.writeString(this.avatar); + } + + protected RoomContributeRoomInfo(Parcel in) { + this.nick = in.readString(); + this.uid = in.readInt(); + this.erbanNo = in.readInt(); + this.avatar = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RoomContributeRoomInfo createFromParcel(Parcel source) { + return new RoomContributeRoomInfo(source); + } + + @Override + public RoomContributeRoomInfo[] newArray(int size) { + return new RoomContributeRoomInfo[size]; + } + }; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomContributeUserInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomContributeUserInfo.java new file mode 100644 index 0000000..f449477 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomContributeUserInfo.java @@ -0,0 +1,352 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import lombok.Getter; + +/** + * Created by MadisonRong on 25/04/2018. + */ + +public class RoomContributeUserInfo implements Parcelable, MultiItemEntity { + /**房间排行榜,前三位用格子布局*/ + public final static int TYPE_GRID = 1; + + /** + * uid : 90005 + * erbanNo : + * nick : 吴sam + * avatar : https://nos.netease.com/nim/NDI3OTA4NQ==/bmltYV83OTIxMjk1MTZfMTUwNTgxMDAyNTQ5NV9mNjI1ZGIxZC05OGE0LTRhMjItODQ2Yi0wMDBlZjg3NDdlNjA= + * gender : 1 + * experSeq : 49 + * experUrl : https://image.zhongjialx.com/ul_49.png + * charmSeq : 12 + * charmUrl : https://image.zhongjialx.com/ml_12.png + * nobleId : 109 + * nobleName : 伯爵 + * badge : badge_6_2 + * micDecorate : headwear_6_1 + * goldAmount : 999 + * hide : false + * ranking : 1 + */ + + private int uid; + private int erbanNo; + private String nick; + private String avatar; + private int gender; + private int experSeq; + private String experUrl; + private int charmSeq; + private String charmUrl; + private int nobleId; + private String nobleName; + private String badge; + private String micDecorate; + private int goldAmount; + private boolean hide; + private int ranking; + + private int itemType; + /**排行榜如果不足3位,添加虚位以待的时候,设置为ture*/ + @Getter + private boolean emptyBean; + + public RoomContributeUserInfo(boolean emptyBean) { + this.emptyBean = emptyBean; + } + + public RoomContributeUserInfo() { + + } + + public RoomContributeUserInfo(int uid, int erbanNo, String nick, String avatar, int gender, int experSeq, String experUrl, int charmSeq, String charmUrl, int nobleId, String nobleName, String badge, String micDecorate, int goldAmount, boolean hide, int ranking) { + this.uid = uid; + this.erbanNo = erbanNo; + this.nick = nick; + this.avatar = avatar; + this.gender = gender; + this.experSeq = experSeq; + this.experUrl = experUrl; + this.charmSeq = charmSeq; + this.charmUrl = charmUrl; + this.nobleId = nobleId; + this.nobleName = nobleName; + this.badge = badge; + this.micDecorate = micDecorate; + this.goldAmount = goldAmount; + this.hide = hide; + this.ranking = ranking; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getExperSeq() { + return experSeq; + } + + public void setExperSeq(int experSeq) { + this.experSeq = experSeq; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public int getCharmSeq() { + return charmSeq; + } + + public void setCharmSeq(int charmSeq) { + this.charmSeq = charmSeq; + } + + public String getCharmUrl() { + return charmUrl; + } + + public void setCharmUrl(String charmUrl) { + this.charmUrl = charmUrl; + } + + public int getNobleId() { + return nobleId; + } + + public void setNobleId(int nobleId) { + this.nobleId = nobleId; + } + + public String getNobleName() { + return nobleName; + } + + public void setNobleName(String nobleName) { + this.nobleName = nobleName; + } + + public String getBadge() { + return badge; + } + + public void setBadge(String badge) { + this.badge = badge; + } + + public String getMicDecorate() { + return micDecorate; + } + + public void setMicDecorate(String micDecorate) { + this.micDecorate = micDecorate; + } + + public int getGoldAmount() { + return goldAmount; + } + + public void setGoldAmount(int goldAmount) { + this.goldAmount = goldAmount; + } + + public int getRanking() { + return ranking; + } + + public void setRanking(int ranking) { + this.ranking = ranking; + } + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public boolean isHide() { + return hide; + } + + public void setHide(boolean hide) { + this.hide = hide; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RoomContributeUserInfo)) return false; + + RoomContributeUserInfo that = (RoomContributeUserInfo) o; + + if (getUid() != that.getUid()) return false; + if (getErbanNo() != that.getErbanNo()) return false; + if (getGender() != that.getGender()) return false; + if (getExperSeq() != that.getExperSeq()) return false; + if (getCharmSeq() != that.getCharmSeq()) return false; + if (getNobleId() != that.getNobleId()) return false; + if (getGoldAmount() != that.getGoldAmount()) return false; + if (isHide() != that.isHide()) return false; + if (getRanking() != that.getRanking()) return false; + if (getNick() != null ? !getNick().equals(that.getNick()) : that.getNick() != null) + return false; + if (getAvatar() != null ? !getAvatar().equals(that.getAvatar()) : that.getAvatar() != null) + return false; + if (getExperUrl() != null ? !getExperUrl().equals(that.getExperUrl()) : that.getExperUrl() != null) + return false; + if (getCharmUrl() != null ? !getCharmUrl().equals(that.getCharmUrl()) : that.getCharmUrl() != null) + return false; + if (getNobleName() != null ? !getNobleName().equals(that.getNobleName()) : that.getNobleName() != null) + return false; + if (getBadge() != null ? !getBadge().equals(that.getBadge()) : that.getBadge() != null) + return false; + return getMicDecorate() != null ? getMicDecorate().equals(that.getMicDecorate()) : that.getMicDecorate() == null; + } + + @Override + public int hashCode() { + int result = getUid(); + result = 31 * result + getErbanNo(); + result = 31 * result + (getNick() != null ? getNick().hashCode() : 0); + result = 31 * result + (getAvatar() != null ? getAvatar().hashCode() : 0); + result = 31 * result + getGender(); + result = 31 * result + getExperSeq(); + result = 31 * result + (getExperUrl() != null ? getExperUrl().hashCode() : 0); + result = 31 * result + getCharmSeq(); + result = 31 * result + (getCharmUrl() != null ? getCharmUrl().hashCode() : 0); + result = 31 * result + getNobleId(); + result = 31 * result + (getNobleName() != null ? getNobleName().hashCode() : 0); + result = 31 * result + (getBadge() != null ? getBadge().hashCode() : 0); + result = 31 * result + (getMicDecorate() != null ? getMicDecorate().hashCode() : 0); + result = 31 * result + getGoldAmount(); + result = 31 * result + (isHide() ? 1 : 0); + result = 31 * result + getRanking(); + return result; + } + + @Override + public String toString() { + return "RoomContributeUserInfo{" + + "uid=" + uid + + ", erbanNo=" + erbanNo + + ", nick='" + nick + '\'' + + ", avatar='" + avatar + '\'' + + ", gender=" + gender + + ", experSeq=" + experSeq + + ", experUrl='" + experUrl + '\'' + + ", charmSeq=" + charmSeq + + ", charmUrl='" + charmUrl + '\'' + + ", nobleId=" + nobleId + + ", nobleName='" + nobleName + '\'' + + ", badge='" + badge + '\'' + + ", micDecorate='" + micDecorate + '\'' + + ", goldAmount=" + goldAmount + + ", hide=" + hide + + ", ranking=" + ranking + + '}'; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(this.uid); + dest.writeInt(this.erbanNo); + dest.writeString(this.nick); + dest.writeString(this.avatar); + dest.writeInt(this.gender); + dest.writeInt(this.experSeq); + dest.writeString(this.experUrl); + dest.writeInt(this.charmSeq); + dest.writeString(this.charmUrl); + dest.writeInt(this.nobleId); + dest.writeString(this.nobleName); + dest.writeString(this.badge); + dest.writeString(this.micDecorate); + dest.writeInt(this.goldAmount); + dest.writeByte(this.hide ? (byte) 1 : (byte) 0); + dest.writeInt(this.ranking); + } + + protected RoomContributeUserInfo(Parcel in) { + this.uid = in.readInt(); + this.erbanNo = in.readInt(); + this.nick = in.readString(); + this.avatar = in.readString(); + this.gender = in.readInt(); + this.experSeq = in.readInt(); + this.experUrl = in.readString(); + this.charmSeq = in.readInt(); + this.charmUrl = in.readString(); + this.nobleId = in.readInt(); + this.nobleName = in.readString(); + this.badge = in.readString(); + this.micDecorate = in.readString(); + this.goldAmount = in.readInt(); + this.hide = in.readByte() != 0; + this.ranking = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RoomContributeUserInfo createFromParcel(Parcel source) { + return new RoomContributeUserInfo(source); + } + + @Override + public RoomContributeUserInfo[] newArray(int size) { + return new RoomContributeUserInfo[size]; + } + }; + + @Override + public int getItemType() { + return itemType; + } + + public void setItemType(int itemType) { + this.itemType = itemType; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomIcon.kt b/core/src/main/java/com/chwl/core/room/bean/RoomIcon.kt new file mode 100644 index 0000000..54ceac0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomIcon.kt @@ -0,0 +1,67 @@ +package com.chwl.core.room.bean + +import androidx.annotation.Keep +import com.chwl.core.bean.IRouterData + +/** + * Created by Max on 2024/2/20 11:49 + * Desc:房间资源位 + **/ +@Keep +data class RoomIcon( + val code: String? = null, + val createTime: String? = null, + val endTime: String? = null, + val icon: String? = null, + val id: Long? = null, + val isEnabled: Int? = null, + val isManual: Int? = null, + val name: String? = null, + val ruleValue: String? = null, + val seqNo: Int? = null, + // showType 1 全屏 2 半屏 + val showType: Int? = null, + val skipContent: String? = null, + // skipType 0 无 1 native 2 房间内 3 H5 + val skipType: Int? = null, + val startTime: String? = null, + val type: Int? = null, + val updateTime: String? = null, + val url: String? = null, + // 标记(本地自己加的,部分业务需要) + var tag: String? = null +) : IRouterData { + + companion object { + const val TAG_GAMEPLAY = "GAMEPLAY" + } + + fun isFirstCharge(): Boolean = code == "FIRST_CHARGE" + fun isSeizeTreasure(): Boolean = code == "SEIZE_TREASURE" + fun isFindLove(): Boolean = code == "FIND_LOVE" + fun isJoyPlay(): Boolean = code == "JOYPLAY" + fun isLeadercc(): Boolean = code == "LEADERCC" + fun isNauticalAdventure(): Boolean = code == "NAUTICAL_ADVENTURE" + fun isBaiShunGame() = code == "BAISHUN" + + override fun getSkipUri(): String? { + return skipContent + } + + override fun getSkipType(): Int { + return skipType ?: 0 + } + + override fun getRouterType(): String? { + return null + } + + override fun getRouterValue(): String? { + return null + } + + @Keep + class RuleValueBean { + val RESERVE: String? = null + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomInfo.java new file mode 100644 index 0000000..b13c006 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomInfo.java @@ -0,0 +1,640 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; +import lombok.ToString; + + +/** + * @author zhouxiangfeng + * @date 2017/5/24 + */ +@Data +@ToString +public class RoomInfo implements Parcelable,Serializable { + public static final int ROOMTYPE_DEFAULT = -1;//使用服务器的房间类型 + public static final int ROOMTYPE_AUCTION = 1;//竞拍房间 + public static final int ROOMTYPE_LIGHT_CHAT = 2;//轻聊房 + public static final int ROOMTYPE_HOME_PARTY = 3;//轰趴房 + public static final int ROOMTYPE_CP = 5;//陪伴房 + public static final int ROOM_TYPE_SINGLE = 6;//个播房 + public static final int ROOMTYPE_GAME = 7;//游戏房 + public static final int ROOMTYPE_PARTY = 8;//聚会房 10 + public static final int ROOMTYPE_REVELRY = 9;//狂欢房 15 + public static final int ROOMTYPE_19_ROOM = 19;//19麦位房间 19 + public static final int ROOMTYPE_20_ROOM = 20;//20麦位房间 20 + + public static final String DATING_STATE_FLOW = "1";//嘉宾交流 + public static final String DATING_STATE_SELECT = "2";//心动选人 + public static final String DATING_STATE_PUBLISH = "3";//公布心动 + + private long uid; + + /** + * 官方账号与非官方账号 + */ + private int officeUser; + + private long roomId; + + private long roomUid; + + public String title; + //头像 + private String avatar; + private int type; + private int oldType; + + /** 房间主题 */ + private String roomDesc; + private String backPic; + + private List speakTemplate; + + /** + * 房间是否开启,是否正在直播 + */ + private boolean valid; + + /** + * 1:房主在房间,2 :房主不在房间 + */ + private int operatorStatus; + // 是否开启礼物动画 + private boolean hasAnimationEffect; + // 1:低 2:高 + private int audioQuality; + // true为关闭 false为开启 + private boolean isCloseScreen; + /** + * 是否需要打开全服红包 true为开启 false为关闭 + */ + public boolean serverRedEnvelopeSwitch; + + // 是否有桌球游戏 + public boolean hasDragonGame; + + private String meetingName; + +// private long openTime; + + public String roomPwd; + + private String sortName; + + private String roomTag; + /** 主题类型id */ + public int tagId; + public String tagPict; + /** 房间在线人数 (会减去超管的人数)*/ + public int onlineNum; + /** + * 是否是皇帝推荐的 + */ + private byte isRecom; + + private boolean isRoomFans; + + /** + * 房间相册 + */ + private boolean hasRoomAlbum; + + private BackgroundBean background; + //是否有ktv权限的意思 + public boolean hasKTVPriv; + //房间是否打开了ktv + public boolean isOpenKTV; + + public boolean isOpenGame; + + public BoxSwitchVo boxSwitchVo; + + public FindLoveSwitchVo findLoveDrawSwitchVo; + + public SeizeTreasureSwitchVo seizeTreasureSwitchVo; + + private String singingMusicName; + // 限制类型 + public static final String LOCK = "lock";//密码可进 + public static final String IS_FRIEND = "isFriend";//密码可进 + public static final String IS_INVITE = "isInvite";//密码可进 + private String limitType; + + private String introduction; + + /** + * {@link RoomModeType} + */ + private int roomModeType; + private int isPermitRoom; // 1:牌照房, 3:新秀房,其他:普通房 + + /** + * 是否为房间纯净模式 + */ + private boolean isPureMode; + + /** + * 是否关闭抽奖 + */ + private boolean closeBox; + + /** + * 离开模式 + */ + private boolean leaveMode; + public String nick; + public int gender; + + private long worldId; // >0:语音派对房 + + private boolean showPkBeginTime; + private long pkBeginTime; + + // 总流水 + private double serialValue; + + private String roomLevelIcon; //房间等级icon + + private int usedMicSkinId; // 正在使用的麦位皮肤id + private int usedMicEffectId; // 正在使用的麦位光圈特效id + + public RightBottomIconConfig rightBottomIconConfig; + + protected RoomInfo(Parcel in) { + uid = in.readLong(); + officeUser = in.readInt(); + roomId = in.readLong(); + roomUid = in.readLong(); + title = in.readString(); + avatar = in.readString(); + type = in.readInt(); + roomDesc = in.readString(); + backPic = in.readString(); + speakTemplate = in.createStringArrayList(); + valid = in.readByte() != 0; + operatorStatus = in.readInt(); + hasAnimationEffect = in.readByte() != 0; + audioQuality = in.readInt(); + isCloseScreen = in.readByte() != 0; + serverRedEnvelopeSwitch = in.readByte() != 0; + hasDragonGame = in.readByte() != 0; + meetingName = in.readString(); + roomPwd = in.readString(); + roomTag = in.readString(); + sortName = in.readString(); + tagId = in.readInt(); + tagPict = in.readString(); + onlineNum = in.readInt(); + isRecom = in.readByte(); + isRoomFans = in.readByte() != 0; + background = in.readParcelable(BackgroundBean.class.getClassLoader()); + hasKTVPriv = in.readByte() != 0; + isOpenKTV = in.readByte() != 0; + isOpenGame = in.readByte() != 0; + boxSwitchVo = in.readParcelable(BoxSwitchVo.class.getClassLoader()); + rightBottomIconConfig = in.readParcelable(RightBottomIconConfig.class.getClassLoader()); + findLoveDrawSwitchVo = in.readParcelable(FindLoveSwitchVo.class.getClassLoader()); + singingMusicName = in.readString(); + limitType = in.readString(); + introduction = in.readString(); + roomModeType = in.readInt(); + isPermitRoom = in.readInt(); + isPureMode = in.readByte() != 0; + closeBox = in.readByte() != 0; + leaveMode = in.readByte() != 0; + nick = in.readString(); + gender = in.readInt(); + worldId = in.readLong(); + showPkBeginTime = in.readByte() != 0; + pkBeginTime = in.readLong(); + showGiftValue = in.readByte() != 0; + hideFlag = in.readInt(); + closeScreenFlag = in.readInt(); + redEnvelopeOpen = in.readByte() != 0; + redEnvelopeType = in.readInt(); + blindDateState = in.readString(); + blindDateVipUid = in.readLong(); + canOpenBlindDate = in.readByte() != 0; + audioSdkType = in.readString(); + trtcSig = in.readString(); + isReselect = in.readByte() != 0; + mgId = in.readLong(); + mgName = in.readString(); + mgMicNum = in.readInt(); + clearScreenTime = in.readLong(); + serialValue = in.readDouble(); + oldType = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(uid); + dest.writeInt(officeUser); + dest.writeLong(roomId); + dest.writeLong(roomUid); + dest.writeString(title); + dest.writeString(avatar); + dest.writeInt(type); + dest.writeString(roomDesc); + dest.writeString(backPic); + dest.writeStringList(speakTemplate); + dest.writeByte((byte) (valid ? 1 : 0)); + dest.writeInt(operatorStatus); + dest.writeByte((byte) (hasAnimationEffect ? 1 : 0)); + dest.writeInt(audioQuality); + dest.writeByte((byte) (isCloseScreen ? 1 : 0)); + dest.writeByte((byte) (serverRedEnvelopeSwitch ? 1 : 0)); + dest.writeByte((byte) (hasDragonGame ? 1 : 0)); + dest.writeString(meetingName); + dest.writeString(roomPwd); + dest.writeString(roomTag); + dest.writeString(sortName); + dest.writeInt(tagId); + dest.writeString(tagPict); + dest.writeInt(onlineNum); + dest.writeByte(isRecom); + dest.writeByte((byte) (isRoomFans ? 1 : 0)); + dest.writeParcelable(background, flags); + dest.writeByte((byte) (hasKTVPriv ? 1 : 0)); + dest.writeByte((byte) (isOpenKTV ? 1 : 0)); + dest.writeByte((byte) (isOpenGame ? 1 : 0)); + dest.writeParcelable(boxSwitchVo, flags); + dest.writeParcelable(rightBottomIconConfig, flags); + dest.writeParcelable(findLoveDrawSwitchVo, flags); + dest.writeString(singingMusicName); + dest.writeString(limitType); + dest.writeString(introduction); + dest.writeInt(roomModeType); + dest.writeInt(isPermitRoom); + dest.writeByte((byte) (isPureMode ? 1 : 0)); + dest.writeByte((byte) (closeBox ? 1 : 0)); + dest.writeByte((byte) (leaveMode ? 1 : 0)); + dest.writeString(nick); + dest.writeInt(gender); + dest.writeLong(worldId); + dest.writeByte((byte) (showPkBeginTime ? 1 : 0)); + dest.writeLong(pkBeginTime); + dest.writeByte((byte) (showGiftValue ? 1 : 0)); + dest.writeInt(hideFlag); + dest.writeInt(closeScreenFlag); + dest.writeByte((byte) (redEnvelopeOpen ? 1 : 0)); + dest.writeInt(redEnvelopeType); + dest.writeString(blindDateState); + dest.writeLong(blindDateVipUid); + dest.writeByte((byte) (canOpenBlindDate ? 1 : 0)); + dest.writeString(audioSdkType); + dest.writeString(trtcSig); + dest.writeByte((byte) (isReselect ? 1 : 0)); + dest.writeLong(mgId); + dest.writeString(mgName); + dest.writeInt(mgMicNum); + dest.writeLong(clearScreenTime); + dest.writeDouble(serialValue); + dest.writeInt(oldType); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public RoomInfo createFromParcel(Parcel in) { + return new RoomInfo(in); + } + + @Override + public RoomInfo[] newArray(int size) { + return new RoomInfo[size]; + } + }; + + /** + * 获取房间类型,目前是用于统计 + */ + public String getRoomTypeLable() { + if (isPermitRoom == 1) { + return ResUtil.getString(R.string.room_bean_roominfo_01); + } else if (isPermitRoom == 3) { + return ResUtil.getString(R.string.room_bean_roominfo_02); + } + return ResUtil.getString(R.string.room_bean_roominfo_03); + } + + /** + * 是否开启礼物值,目前ktv房,cp房,都不支持 + */ + private boolean showGiftValue; + + /** + * 0.不隐藏; 1.全局+排行榜 + */ + private int hideFlag; + + /** + * 公屏操作人:0.房主或管理员;1.超管 + */ + private int closeScreenFlag; + + @Deprecated(since = "2.2.0版本起,建议用redEnvelopeType判断即可") + private boolean redEnvelopeOpen; + /** + * 发送红包权限:0 无、1 厅内红包、2 全服红包、3 厅内红包+全服红包 + */ + private int redEnvelopeType; + + /** + * COMMUNICATING(1, ResUtil.getString(R.string.room_bean_roominfo_04)), + * PICK(2, ResUtil.getString(R.string.room_bean_roominfo_05)), + * PUBLISH(3, ResUtil.getString(R.string.room_bean_roominfo_06)), + * FINISH(4, ResUtil.getString(R.string.room_bean_roominfo_07)), + */ + private String blindDateState = ""; + + private long blindDateVipUid; + + private boolean canOpenBlindDate; + + /** + * {@link RoomAudioSdkType} + */ + private String audioSdkType; + + private String trtcSig; + + private boolean isReselect; + + private long mgId; + + private String mgName; + + private int mgMicNum; + + private long clearScreenTime; +// /** +// * 房间角标 +// */ +// private String badge; + + + public RoomInfo() { + } + + + public static class BackgroundBean implements Parcelable{ + /** + * id : 4 + * name : 背景名称ABC + * icon : https://img.letusmix.com/FsJNkwyHjY6yw0O2MD-1TYxlRTPq?imageslim + * pic : https://img.letusmix.com/FsJNkwyHjY6yw0O2MD-1TYxlRTPq?imageslim + * originalPrice : 11 + * price : 11 + * renewPrice : 1 + * effect : https://img.letusmix.com/FsJNkwyHjY6yw0O2MD-1TYxlRTPq?imageslim + * labelType : 0 + * limitDesc : 这是限定描述 + * days : 11 + * isFree : true + * used : true + * enable : 1 + * status : 1 + * uid : 90004921 + */ + + private int id; + private String name; + private String icon; + private String pic; + private int originalPrice; + private int price; + private int renewPrice; + private String effect; + private int labelType; + private String limitDesc; + private int days; + private boolean isFree; + private boolean used; + private int enable; + private int status; + private int uid; + + + protected BackgroundBean(Parcel in) { + id = in.readInt(); + name = in.readString(); + icon = in.readString(); + pic = in.readString(); + originalPrice = in.readInt(); + price = in.readInt(); + renewPrice = in.readInt(); + effect = in.readString(); + labelType = in.readInt(); + limitDesc = in.readString(); + days = in.readInt(); + isFree = in.readByte() != 0; + used = in.readByte() != 0; + enable = in.readInt(); + status = in.readInt(); + uid = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(id); + dest.writeString(name); + dest.writeString(icon); + dest.writeString(pic); + dest.writeInt(originalPrice); + dest.writeInt(price); + dest.writeInt(renewPrice); + dest.writeString(effect); + dest.writeInt(labelType); + dest.writeString(limitDesc); + dest.writeInt(days); + dest.writeByte((byte) (isFree ? 1 : 0)); + dest.writeByte((byte) (used ? 1 : 0)); + dest.writeInt(enable); + dest.writeInt(status); + dest.writeInt(uid); + } + + public static final Creator CREATOR = new Creator() { + @Override + public BackgroundBean createFromParcel(Parcel in) { + return new BackgroundBean(in); + } + + @Override + public BackgroundBean[] newArray(int size) { + return new BackgroundBean[size]; + } + }; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public int getOriginalPrice() { + return originalPrice; + } + + public void setOriginalPrice(int originalPrice) { + this.originalPrice = originalPrice; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getRenewPrice() { + return renewPrice; + } + + public void setRenewPrice(int renewPrice) { + this.renewPrice = renewPrice; + } + + public String getEffect() { + return effect; + } + + public void setEffect(String effect) { + this.effect = effect; + } + + public int getLabelType() { + return labelType; + } + + public void setLabelType(int labelType) { + this.labelType = labelType; + } + + public String getLimitDesc() { + return limitDesc; + } + + public void setLimitDesc(String limitDesc) { + this.limitDesc = limitDesc; + } + + public int getDays() { + return days; + } + + public void setDays(int days) { + this.days = days; + } + + public boolean isIsFree() { + return isFree; + } + + public void setIsFree(boolean isFree) { + this.isFree = isFree; + } + + public boolean isUsed() { + return used; + } + + public void setUsed(boolean used) { + this.used = used; + } + + public int getEnable() { + return enable; + } + + public void setEnable(int enable) { + this.enable = enable; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public String toString() { + return "BackgroundBean{" + + "id=" + id + + ", name='" + name + '\'' + + ", icon='" + icon + '\'' + + ", pic='" + pic + '\'' + + ", originalPrice=" + originalPrice + + ", price=" + price + + ", renewPrice=" + renewPrice + + ", effect='" + effect + '\'' + + ", labelType=" + labelType + + ", limitDesc='" + limitDesc + '\'' + + ", days=" + days + + ", isFree=" + isFree + + ", used=" + used + + ", enable=" + enable + + ", status=" + status + + ", uid=" + uid + + '}'; + } + } + + +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomInviteFansInfo.kt b/core/src/main/java/com/chwl/core/room/bean/RoomInviteFansInfo.kt new file mode 100644 index 0000000..8619a2e --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomInviteFansInfo.kt @@ -0,0 +1,8 @@ +package com.chwl.core.room.bean + + +data class RoomInviteFansInfo( + var inviteTimes: Int = 0,//剩余邀请次数 + var inviteInterval:Long = 0,//邀请需要等待多少秒 + var fansNum:Int = 0//粉丝数 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomListResult.java b/core/src/main/java/com/chwl/core/room/bean/RoomListResult.java new file mode 100644 index 0000000..7192980 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomListResult.java @@ -0,0 +1,12 @@ +package com.chwl.core.room.bean; + +import com.chwl.core.bean.response.ServiceResult; + +import java.util.List; + +/** + * Created by Administrator on 2017/7/8 0008. + */ + +public class RoomListResult extends ServiceResult> { +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomMessageViewNoticeInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomMessageViewNoticeInfo.java new file mode 100644 index 0000000..77a6c7f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomMessageViewNoticeInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.room.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class RoomMessageViewNoticeInfo implements Serializable { + + private String tips; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomModeType.java b/core/src/main/java/com/chwl/core/room/bean/RoomModeType.java new file mode 100644 index 0000000..f3b7d18 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomModeType.java @@ -0,0 +1,12 @@ +package com.chwl.core.room.bean; + +/** + * 房间各种模式的设定 + */ +public interface RoomModeType { + int NORMAL_MODE = 0; //普通模式 + int OPEN_MICRO_MODE = 1; //开启排麦模式 + int OPEN_PK_MODE = 3;//开启PK模式 + int OPEN_DATING_MODE = 5;//开启相亲模式 + int OPEN_ANOTHER_PK_MODE = 7;//开启跨房PK模式 +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomOnlineUserBean.kt b/core/src/main/java/com/chwl/core/room/bean/RoomOnlineUserBean.kt new file mode 100644 index 0000000..1a91fbe --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomOnlineUserBean.kt @@ -0,0 +1,25 @@ +package com.chwl.core.room.bean + +import androidx.annotation.Keep +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.chwl.core.user.bean.UserInfo + +@Keep +data class RoomOnlineUserBean( + // MANAGER:管理员 + val memberType: String? = null +) : UserInfo(), MultiItemEntity { + + companion object { + const val NOBLE = 1 + const val NORMAL = 0 + } + + override fun getItemType(): Int { + return if (isEnterHide) { + NOBLE + } else { + NORMAL + } + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourDataInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourDataInfo.java new file mode 100644 index 0000000..f6cd9c4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourDataInfo.java @@ -0,0 +1,29 @@ +package com.chwl.core.room.bean; + +import java.util.List; + +public class RoomRankHalfHourDataInfo { + /** + * rankVoList : [{"uid":91000421,"erbanNo":3750376,"avatar":"https://img.letusmix.com/Fmr7_3dgWV9xmAQcb1vjaGd3CTis?imageslim","nick":ResUtil.getString(R.string.room_bean_roomrankhalfhourdatainfo_01),"gender":1,"totalNum":93089,"nobleId":0,"experUrl":"https://img.letusmix.com/ul_1.png","charmUrl":"https://img.letusmix.com/new_ml_1.png"},{"uid":91000351,"erbanNo":7308007,"avatar":"https://img.letusmix.com/FgHdNZFlQlYto3GqQ3G2P5iTSVrN?imageslim","nick":ResUtil.getString(R.string.room_bean_roomrankhalfhourdatainfo_02),"gender":2,"totalNum":87816,"nobleId":0,"experUrl":"https://img.letusmix.com/ul_1.png","charmUrl":"https://img.letusmix.com/new_ml_1.png"},{"uid":91000422,"erbanNo":5340822,"avatar":"https://img.letusmix.com/FjfvKFtzTL4UHMnZ2ff-_iqUmzh7?imageslim","nick":ResUtil.getString(R.string.room_bean_roomrankhalfhourdatainfo_03),"gender":1,"totalNum":78277,"nobleId":0,"experUrl":"https://img.letusmix.com/ul_1.png","charmUrl":"https://img.letusmix.com/new_ml_1.png"}] + * me : {"erbanNo":6301503,"avatar":"https://img.letusmix.com/Fn7E3LWYJqETTkGZ4c8WZiDmweng?imageslim","nick":ResUtil.getString(R.string.room_bean_roomrankhalfhourdatainfo_04),"gender":1,"totalNum":0,"seqNo":0,"nobleId":0,"experSeq":4,"experUrl":"https://img.letusmix.com/ul_4.png","charmSeq":21,"charmUrl":"https://img.letusmix.com/new_ml_21.png"} + */ + + private RoomRankHalfHourMeInfo me; + private List rankVoList; + + public RoomRankHalfHourMeInfo getMe() { + return me; + } + + public void setMe(RoomRankHalfHourMeInfo me) { + this.me = me; + } + + public List getRankVoList() { + return rankVoList; + } + + public void setRankVoList(List rankVoList) { + this.rankVoList = rankVoList; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourMeInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourMeInfo.java new file mode 100644 index 0000000..7c0a1c4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourMeInfo.java @@ -0,0 +1,129 @@ +package com.chwl.core.room.bean; + +public class RoomRankHalfHourMeInfo { + + /** + * erbanNo : 6301503 + * avatar : https://img.letusmix.com/Fn7E3LWYJqETTkGZ4c8WZiDmweng?imageslim + * nick : abc123😄!?呃呃呃 + * gender : 1 + * totalNum : 0 + * seqNo : 0 + * nobleId : 0 + * experSeq : 4 + * experUrl : https://img.letusmix.com/ul_4.png + * charmSeq : 21 + * charmUrl : https://img.letusmix.com/new_ml_21.png + */ + + private int erbanNo; + private String avatar; + private String nick; + private int gender; + /** 未上榜,分值是当前流水;上榜,分值是与上一名的差值 */ + private int totalNum; + /** 排名,0标识未上榜 */ + private int seqNo; + private int nobleId; + private int experSeq; + private String experUrl; + private int charmSeq; + private String charmUrl; + private String roomTitle; + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public int getTotalNum() { + return totalNum; + } + + public void setTotalNum(int totalNum) { + this.totalNum = totalNum; + } + + public int getSeqNo() { + return seqNo; + } + + public void setSeqNo(int seqNo) { + this.seqNo = seqNo; + } + + public int getNobleId() { + return nobleId; + } + + public void setNobleId(int nobleId) { + this.nobleId = nobleId; + } + + public int getExperSeq() { + return experSeq; + } + + public void setExperSeq(int experSeq) { + this.experSeq = experSeq; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public int getCharmSeq() { + return charmSeq; + } + + public void setCharmSeq(int charmSeq) { + this.charmSeq = charmSeq; + } + + public String getCharmUrl() { + return charmUrl; + } + + public void setCharmUrl(String charmUrl) { + this.charmUrl = charmUrl; + } + + public String getRoomTitle() { + return roomTitle; + } + + public void setRoomTitle(String roomTitle) { + this.roomTitle = roomTitle; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourRankInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourRankInfo.java new file mode 100644 index 0000000..6c0e86c --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomRankHalfHourRankInfo.java @@ -0,0 +1,116 @@ +package com.chwl.core.room.bean; + +public class RoomRankHalfHourRankInfo { + + /** + * uid : 91000421 + * erbanNo : 3750376 + * avatar : https://img.letusmix.com/Fmr7_3dgWV9xmAQcb1vjaGd3CTis?imageslim + * nick : 短发情长 + * gender : 1 + * totalNum : 93089 + * nobleId : 0 + * experUrl : https://img.letusmix.com/ul_1.png + * charmUrl : https://img.letusmix.com/new_ml_1.png + */ + + private long uid; + private long erbanNo; + private String avatar; + private String nick; + private int gender; + private int totalNum; + private int nobleId; + private String experUrl; + private String charmUrl; + private int seqNo; + private String roomTitle; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public long getErbanNo() { + return erbanNo; + } + + public void setErbanNo(long erbanNo) { + this.erbanNo = erbanNo; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public int getTotalNum() { + return totalNum; + } + + public void setTotalNum(int totalNum) { + this.totalNum = totalNum; + } + + public int getNobleId() { + return nobleId; + } + + public void setNobleId(int nobleId) { + this.nobleId = nobleId; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public String getCharmUrl() { + return charmUrl; + } + + public void setCharmUrl(String charmUrl) { + this.charmUrl = charmUrl; + } + + public int getSeqNo() { + return seqNo; + } + + public void setSeqNo(int seqNo) { + this.seqNo = seqNo; + } + + public String getRoomTitle() { + return roomTitle; + } + + public void setRoomTitle(String roomTitle) { + this.roomTitle = roomTitle; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomRankMultiItem.java b/core/src/main/java/com/chwl/core/room/bean/RoomRankMultiItem.java new file mode 100644 index 0000000..35e33c4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomRankMultiItem.java @@ -0,0 +1,28 @@ +package com.chwl.core.room.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +public class RoomRankMultiItem implements MultiItemEntity { + /**房间排行榜,第4开始用横向线性布局*/ + public final static int TYPE_LINEAR = 2; + public final static int TYPE_EMPTY = 3; + private int itemType; + private Object data; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + @Override + public int getItemType() { + return itemType; + } + + public void setItemType(int itemType) { + this.itemType = itemType; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomResult.java b/core/src/main/java/com/chwl/core/room/bean/RoomResult.java new file mode 100644 index 0000000..5031738 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomResult.java @@ -0,0 +1,11 @@ +package com.chwl.core.room.bean; + +import com.chwl.core.bean.response.ServiceResult; + +/** + * Created by zhouxiangfeng on 2017/5/4. + */ + +public class RoomResult extends ServiceResult { + +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomSettingTabInfo.java b/core/src/main/java/com/chwl/core/room/bean/RoomSettingTabInfo.java new file mode 100644 index 0000000..e25c128 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomSettingTabInfo.java @@ -0,0 +1,121 @@ +package com.chwl.core.room.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +/** + *

tab 标签数据

+ * + * @author Administrator + * @date 2017/11/21 + */ +@Data +public class RoomSettingTabInfo implements Parcelable { + + /** + * id : 8 + * name : 聊天 + * pict : https://image.zhongjialx.com/tag%E8%81%8A%E5%A4%A9.png + * seq : 3 + * type : 1 + * status : true + * istop : true + * createTime : 1511155717000 + */ + + private int id; + private String name; + private String pict; + private String icon; + private int seq; + private int type; + private boolean status; + private boolean istop; + private long createTime; + + public RoomSettingTabInfo(int id, String name) { + this.id = id; + this.name = name; + } + + public RoomSettingTabInfo(int id, String name, String icon) { + this(id, name); + this.icon=icon; + } + + + protected RoomSettingTabInfo(Parcel in) { + id = in.readInt(); + name = in.readString(); + pict = in.readString(); + seq = in.readInt(); + type = in.readInt(); + status = in.readByte() != 0; + istop = in.readByte() != 0; + createTime = in.readLong(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(id); + dest.writeString(name); + dest.writeString(pict); + dest.writeInt(seq); + dest.writeInt(type); + dest.writeByte((byte) (status ? 1 : 0)); + dest.writeByte((byte) (istop ? 1 : 0)); + dest.writeLong(createTime); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public RoomSettingTabInfo createFromParcel(Parcel in) { + return new RoomSettingTabInfo(in); + } + + @Override + public RoomSettingTabInfo[] newArray(int size) { + return new RoomSettingTabInfo[size]; + } + }; + + + + public static List getMsTabDefaultList() { + List tabInfoList = new ArrayList<>(); + tabInfoList.add(new RoomSettingTabInfo(14, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_01),"https://img.letusmix.com/xinxiu_tag_icon.png")); + tabInfoList.add(new RoomSettingTabInfo(16, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_02),"https://img.letusmix.com/xiehou_tag_icon.png")); + tabInfoList.add(new RoomSettingTabInfo(12, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_03),"https://img.letusmix.com/jiaoyou_tag_icon.png")); + tabInfoList.add(new RoomSettingTabInfo(13, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_04),"https://img.letusmix.com/yule_tag_icon.png")); + tabInfoList.add(new RoomSettingTabInfo(11, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_05),"https://img.letusmix.com/yinyue_tag_icon.png")); + tabInfoList.add(new RoomSettingTabInfo(5, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_06),"https://img.letusmix.com/diantai_tag_icon.png")); + return tabInfoList; + } + + + public static List getTabCheckVersion() { + List tabInfoList = new ArrayList<>(); + tabInfoList.add(new RoomSettingTabInfo(16, ResUtil.getString(R.string.room_bean_roomsettingtabinfo_07),"https://img.letusmix.com/xiehou_tag_icon.png")); + return tabInfoList; + } + + @Override + public String toString() { + return "TabInfo{" + + "name='" + name + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/RoomWelcomeConfig.java b/core/src/main/java/com/chwl/core/room/bean/RoomWelcomeConfig.java new file mode 100644 index 0000000..78bd382 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/RoomWelcomeConfig.java @@ -0,0 +1,20 @@ +package com.chwl.core.room.bean; + +import lombok.Data; + +/** + * create by lvzebiao @2020/3/18 + */ +@Data +public class RoomWelcomeConfig { + + /** + * toUid 是否为当前用户的粉丝 + */ + private boolean isFans; + /** + * 欢迎语,${nick}为昵称占位符 + */ + private String msg; + +} diff --git a/core/src/main/java/com/chwl/core/room/bean/SearchRoomInfo.java b/core/src/main/java/com/chwl/core/room/bean/SearchRoomInfo.java new file mode 100644 index 0000000..05cc09a --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/SearchRoomInfo.java @@ -0,0 +1,168 @@ +package com.chwl.core.room.bean; + +import android.graphics.Color; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; + +import com.chad.library.adapter.base.entity.MultiItemEntity; +import com.chwl.core.home.bean.BannerInfo; +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; + +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * @author zhouxiangfeng + * @date 2017/5/17 + */ +@EqualsAndHashCode(callSuper = false) +@Data +public class SearchRoomInfo extends RoomInfo implements Parcelable, MultiItemEntity { + + public static final int BANNER = 1; + public static final int NORMAL = 2; + + + //性别 1:男 2:女 0 :未知 +// private int gender; +// +// private String nick; + //1普通账号,2官方账号,3机器账号 + private int defUser; + + private long erbanNo; + + //角标相关的 + public String badge; + + private long birth; + + //Cp + private int cpState; + + /** + * 是否是靓号,1:靓号 + */ + public boolean hasPrettyErbanNo; + public NobleInfo nobleUsers; + public UserLevelVo userLevelVo; + private ArrayList bannerInfos; + public boolean newUser; + + private int hallBtnStatus;//0不显示,4可邀请,5待通过,6通过申请 + private int hallRecordId;//当hallBtnStatus=6时返回申请记录Id + private long hallMessageUid;//联系人id + + public SearchRoomInfo() { + } + + + protected SearchRoomInfo(Parcel in) { + super(in); +// gender = in.readInt(); +// nick = in.readString(); + defUser = in.readInt(); + erbanNo = in.readLong(); + badge = in.readString(); + cpState = in.readInt(); + hasPrettyErbanNo = in.readByte() != 0; + + bannerInfos = in.createTypedArrayList(BannerInfo.CREATOR); + + hallBtnStatus = in.readInt(); + hallRecordId = in.readInt(); + hallMessageUid = in.readLong(); + } + + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); +// dest.writeInt(gender); +// dest.writeString(nick); + dest.writeInt(defUser); + dest.writeLong(erbanNo); + dest.writeString(badge); + dest.writeInt(cpState); + dest.writeByte((byte) (hasPrettyErbanNo ? 1 : 0)); + + dest.writeTypedList(bannerInfos); + + dest.writeInt(hallBtnStatus); + dest.writeInt(hallRecordId); + dest.writeLong(hallMessageUid); + } + + public String getNick() { + return TextUtils.isEmpty(nick) ? "" : nick; + } + + + public int getCpState() { + return cpState; + } + + /** + * 判断是否为官方账号 + * + * @return + */ + public boolean isOfficial() { + return getDefUser() == UserInfo.USER_TYPE_OFFICIAL; + } + + /** + * 靓号变色 + * + * @param defColor 非靓号颜色 + */ + public SpannableString getNick(int defColor) { + if (TextUtils.isEmpty(nick)) + return new SpannableString(""); + + SpannableString spannableString = new SpannableString(nick); + + if (hasPrettyErbanNo) { + ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#EB5335")); + spannableString.setSpan(colorSpan, 0, nick.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + ForegroundColorSpan colorSpan = new ForegroundColorSpan(defColor); + spannableString.setSpan(colorSpan, 0, nick.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + + return spannableString; + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public SearchRoomInfo createFromParcel(Parcel in) { + return new SearchRoomInfo(in); + } + + @Override + public SearchRoomInfo[] newArray(int size) { + return new SearchRoomInfo[size]; + } + }; + + @Override + public int getItemType() { + return ListUtils.isListEmpty(bannerInfos) ? NORMAL : BANNER; + } + +} diff --git a/core/src/main/java/com/chwl/core/room/bean/SeizeTreasureSwitchVo.kt b/core/src/main/java/com/chwl/core/room/bean/SeizeTreasureSwitchVo.kt new file mode 100644 index 0000000..db005ea --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/SeizeTreasureSwitchVo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.room.bean + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import java.io.Serializable + +@Parcelize +data class SeizeTreasureSwitchVo( + val price: Int +): Serializable, Parcelable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/ShowUserInfoDialog.java b/core/src/main/java/com/chwl/core/room/bean/ShowUserInfoDialog.java new file mode 100644 index 0000000..e821613 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/ShowUserInfoDialog.java @@ -0,0 +1,20 @@ +package com.chwl.core.room.bean; + +/** + * Created by huangmeng1 on 2018/8/6. + */ + +public class ShowUserInfoDialog { + //随意来的标记,标记除坑上的其他地方点击弹用户卡片 + public static final int MARK = -2; + //房间排行榜点击不要送礼物 + public static final int RANK_CLICK = -3; + + public String acount; + public int micPosition; + + public ShowUserInfoDialog(String acount, int micPosition) { + this.acount = acount; + this.micPosition = micPosition; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/SimplePartyRoomInfo.java b/core/src/main/java/com/chwl/core/room/bean/SimplePartyRoomInfo.java new file mode 100644 index 0000000..9b60485 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/SimplePartyRoomInfo.java @@ -0,0 +1,10 @@ +package com.chwl.core.room.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class SimplePartyRoomInfo implements Serializable{ + private long uid; +} diff --git a/core/src/main/java/com/chwl/core/room/bean/SingleRoomSortInfo.kt b/core/src/main/java/com/chwl/core/room/bean/SingleRoomSortInfo.kt new file mode 100644 index 0000000..cec60c9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/SingleRoomSortInfo.kt @@ -0,0 +1,6 @@ +package com.chwl.core.room.bean + +data class SingleRoomSortInfo( + val id: Long? = 0, + val sortName: String = "", +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/bean/UpMic.java b/core/src/main/java/com/chwl/core/room/bean/UpMic.java new file mode 100644 index 0000000..5031b7f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/UpMic.java @@ -0,0 +1,13 @@ +package com.chwl.core.room.bean; + +/** + * Created by huangmeng1 on 2018/7/27. + */ + +public class UpMic { + public String acount; + + public UpMic(String acount) { + this.acount = acount; + } +} diff --git a/core/src/main/java/com/chwl/core/room/bean/WelcomeInfo.java b/core/src/main/java/com/chwl/core/room/bean/WelcomeInfo.java new file mode 100644 index 0000000..094b267 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/bean/WelcomeInfo.java @@ -0,0 +1,80 @@ +package com.chwl.core.room.bean; + +import android.text.TextUtils; + +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import lombok.Getter; +import lombok.Setter; + +/** + * 公屏欢迎语 + * Created by lvzebiao on 2020/3/17. + */ +@Setter +@Getter +public class WelcomeInfo { + + + /** + * 被欢迎人Uid + */ + private long targetUid; + /** + * 被欢迎人昵称 + */ + private String targetNick; + /** + * 欢迎语 + */ + private String content; + /** + * 用于标识 被欢迎人是否关注过 麦上用户 + */ + private boolean isFans; + /** + * true 表示需要显示已关注按钮 + */ + private boolean showAttentedBtn; + + private boolean connecting; + + private static final String NICK_FLAG = "${nick}"; + + public String getLastConent() { + String lastContent = null; + try { + if (!TextUtils.isEmpty(content) && content.contains(NICK_FLAG)) { + lastContent = content.substring(0, content.indexOf(NICK_FLAG)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + if (TextUtils.isEmpty(lastContent)) { + lastContent = ResUtil.getString(R.string.room_bean_welcomeinfo_01); + } + LogUtil.print("lastContent:" + lastContent); + return lastContent; + } + + + + public String getNextContent() { + String nextContent = null; + try { + if (!TextUtils.isEmpty(content) && content.contains(NICK_FLAG)) { + nextContent = content.substring(content.indexOf(NICK_FLAG) + NICK_FLAG.length()); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + if (nextContent == null) { + nextContent = ""; + } + LogUtil.print("nextContent:" + nextContent); + return nextContent; + } + +} diff --git a/core/src/main/java/com/chwl/core/room/core/RoomDataService.kt b/core/src/main/java/com/chwl/core/room/core/RoomDataService.kt new file mode 100644 index 0000000..4b081a6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/core/RoomDataService.kt @@ -0,0 +1,55 @@ +package com.chwl.core.room.core + +import com.chwl.core.support.room.RoomContext +import com.chwl.core.support.room.RoomService +import java.util.concurrent.ConcurrentHashMap + +/** + * Created by Max on 2023/10/26 12:36 + * Desc:房间数据服务 + **/ +class RoomDataService : RoomService() { + + /** + * 数据存储器 + */ + private val dataMap: ConcurrentHashMap = ConcurrentHashMap() + + /** + * 获取数据 + */ + fun getData(key: String): Any? { + return dataMap.get(key) + } + + /** + * 获取数据 + * @param key + */ + fun getData(key: String, factory: (() -> Any)): Any { + val data = dataMap.get(key) + return if (data != null) { + data + } else { + val newData = factory.invoke() + dataMap.put(key, newData) + newData + } + } + + /** + * 设置数据 + */ + fun putData(key: String, data: Any?) { + if (data == null) { + dataMap.remove(key) + } else { + dataMap.put(key, data) + } + } + + override fun onStop(context: RoomContext) { + super.onStop(context) + dataMap.clear() + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/dragonball/DragonBallModel.java b/core/src/main/java/com/chwl/core/room/dragonball/DragonBallModel.java new file mode 100644 index 0000000..6441bc1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/dragonball/DragonBallModel.java @@ -0,0 +1,84 @@ +package com.chwl.core.room.dragonball; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.bean.DragonBarInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class DragonBallModel extends BaseModel implements IDragonBallModel { + + private Api api; + + private DragonBallModel() { + api = RxNet.create(Api.class); + } + + public static IDragonBallModel get() { + return DragonBallModelHelper.instance; + } + + private static class DragonBallModelHelper { + private static DragonBallModel instance = new DragonBallModel(); + } + + @Override + public Single getDragonBar() { + return api.getDragonBar(String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId())) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single clearDragonBar() { + return api.clearDragonBar(String.valueOf(AuthModel.get().getCurrentUid()), + String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId())) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.room_dragonball_dragonballmodel_01)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + private interface Api { + + /** + * 获取桌球 + * + * @param uid + * @param roomUid + * @return + */ + @POST("dragonBall/gen") + Single> getDragonBar(@Query("uid") String uid, + @Query("roomUid") String roomUid); + + /** + * 清除桌球 + * + * @param uid + * @param roomUid + * @return + */ + @POST("dragonBall/clear") + Single> clearDragonBar(@Query("uid") String uid, + @Query("roomUid") String roomUid); + } +} diff --git a/core/src/main/java/com/chwl/core/room/dragonball/IDragonBallModel.java b/core/src/main/java/com/chwl/core/room/dragonball/IDragonBallModel.java new file mode 100644 index 0000000..0c71c55 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/dragonball/IDragonBallModel.java @@ -0,0 +1,21 @@ +package com.chwl.core.room.dragonball; + +import com.chwl.core.base.IModel; +import com.chwl.core.room.bean.DragonBarInfo; + +import io.reactivex.Single; + +public interface IDragonBallModel extends IModel { + + /** + * 获取桌球 + * @return + */ + Single getDragonBar(); + + /** + * 清除桌球 + * @return + */ + Single clearDragonBar(); +} diff --git a/core/src/main/java/com/chwl/core/room/event/DatingSelectUserEvent.java b/core/src/main/java/com/chwl/core/room/event/DatingSelectUserEvent.java new file mode 100644 index 0000000..9b26a59 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/DatingSelectUserEvent.java @@ -0,0 +1,26 @@ +package com.chwl.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/chwl/core/room/event/EixtCountDownEvent.java b/core/src/main/java/com/chwl/core/room/event/EixtCountDownEvent.java new file mode 100644 index 0000000..50499d8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/EixtCountDownEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.event; + +public class EixtCountDownEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/event/FaceIsReadyEvent.java b/core/src/main/java/com/chwl/core/room/event/FaceIsReadyEvent.java new file mode 100644 index 0000000..f29057b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/FaceIsReadyEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.event; + +public class FaceIsReadyEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/event/FinishAvRoomEvent.java b/core/src/main/java/com/chwl/core/room/event/FinishAvRoomEvent.java new file mode 100644 index 0000000..fae597e --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/FinishAvRoomEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.event; + +public class FinishAvRoomEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/event/MessageSizeEvent.java b/core/src/main/java/com/chwl/core/room/event/MessageSizeEvent.java new file mode 100644 index 0000000..4401869 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/MessageSizeEvent.java @@ -0,0 +1,19 @@ +package com.chwl.core.room.event; + +import java.io.Serializable; + +public class MessageSizeEvent implements Serializable { + private int size; + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public MessageSizeEvent(int size) { + this.size = size; + } +} diff --git a/core/src/main/java/com/chwl/core/room/event/ReceiveFaceEvent.java b/core/src/main/java/com/chwl/core/room/event/ReceiveFaceEvent.java new file mode 100644 index 0000000..8e28bd4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/ReceiveFaceEvent.java @@ -0,0 +1,16 @@ +package com.chwl.core.room.event; + +import com.chwl.core.room.face.FaceReceiveInfo; + +import java.util.List; + +import lombok.Data; + +@Data +public class ReceiveFaceEvent { + private List faceReceiveInfos; + public ReceiveFaceEvent(List faceReceiveInfos) { + this.faceReceiveInfos = faceReceiveInfos; + } + +} diff --git a/core/src/main/java/com/chwl/core/room/event/RoomAtEvent.java b/core/src/main/java/com/chwl/core/room/event/RoomAtEvent.java new file mode 100644 index 0000000..5d398ad --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/RoomAtEvent.java @@ -0,0 +1,11 @@ +package com.chwl.core.room.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class RoomAtEvent { + private String account; + private String name; +} diff --git a/core/src/main/java/com/chwl/core/room/event/RoomClearScreenEvent.java b/core/src/main/java/com/chwl/core/room/event/RoomClearScreenEvent.java new file mode 100644 index 0000000..b0b63d3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/RoomClearScreenEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.event; + +public class RoomClearScreenEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/event/RoomExitEvent.java b/core/src/main/java/com/chwl/core/room/event/RoomExitEvent.java new file mode 100644 index 0000000..3bcbb56 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/RoomExitEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.room.event; + +import lombok.Data; + +@Data +public class RoomExitEvent { + +} diff --git a/core/src/main/java/com/chwl/core/room/event/RoomInfoEvent.java b/core/src/main/java/com/chwl/core/room/event/RoomInfoEvent.java new file mode 100644 index 0000000..aae610b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/RoomInfoEvent.java @@ -0,0 +1,19 @@ +package com.chwl.core.room.event; + +import com.chwl.core.room.bean.RoomInfo; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class RoomInfoEvent { + + /** + * 已知取值: + * @see com.chwl.core.Constants#PAGE_TYPE_MAIN_FRAGMENT + */ + private int pageType; + + private RoomInfo roomInfo; +} diff --git a/core/src/main/java/com/chwl/core/room/event/RoomShieldEvent.java b/core/src/main/java/com/chwl/core/room/event/RoomShieldEvent.java new file mode 100644 index 0000000..001e606 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/RoomShieldEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.room.event; + +import lombok.Data; + +@Data +public class RoomShieldEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/event/RoomTaskTipsEvent.java b/core/src/main/java/com/chwl/core/room/event/RoomTaskTipsEvent.java new file mode 100644 index 0000000..e9c4015 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/RoomTaskTipsEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.room.event; + +import lombok.Data; + +@Data +public class RoomTaskTipsEvent { + private String taskCompleteMsg; + private String taskUrl; +} diff --git a/core/src/main/java/com/chwl/core/room/event/SwitchRoomEvent.java b/core/src/main/java/com/chwl/core/room/event/SwitchRoomEvent.java new file mode 100644 index 0000000..fe2fe80 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/event/SwitchRoomEvent.java @@ -0,0 +1,12 @@ +package com.chwl.core.room.event; + +import com.chwl.core.room.bean.RoomInfo; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class SwitchRoomEvent { + private RoomInfo roomInfo; +} diff --git a/core/src/main/java/com/chwl/core/room/exception/AntiSpamHitException.java b/core/src/main/java/com/chwl/core/room/exception/AntiSpamHitException.java new file mode 100644 index 0000000..a27e973 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/exception/AntiSpamHitException.java @@ -0,0 +1,8 @@ +package com.chwl.core.room.exception; + +public class AntiSpamHitException extends Exception { + + public AntiSpamHitException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java b/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java new file mode 100644 index 0000000..ac361a0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/DynamicFaceModel.java @@ -0,0 +1,749 @@ +package com.chwl.core.room.face; + +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FACE; +import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_TYPE_FACE_SEND; + +import android.annotation.SuppressLint; +import android.text.TextUtils; +import android.util.SparseArray; + +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.chwl.core.DemoCache; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.gift.bean.SimpleVipInfo; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.FaceAttachment; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.core.interceptor.NoParamsInterceptor; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.event.FaceIsReadyEvent; +import com.chwl.core.room.event.ReceiveFaceEvent; +import com.chwl.core.room.queue.bean.MicMemberInfo; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.LogUtils; +import com.chwl.core.utils.myutil.MyUriUtils; +import com.chwl.core.vip.bean.UserVipInfo; +import com.chwl.library.common.glide.GlideUtils; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.NetworkUtils; +import com.chwl.library.utils.codec.DESUtils; +import com.chwl.library.utils.codec.MD5Utils; +import com.chwl.library.utils.config.BasicConfig; +import com.google.gson.Gson; +import com.netease.nim.uikit.common.util.string.StringUtil; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.orhanobut.logger.Logger; + +import org.greenrobot.eventbus.EventBus; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.BiConsumer; +import io.reactivex.functions.Consumer; +import okhttp3.ResponseBody; +import retrofit2.http.GET; +import retrofit2.http.Headers; +import retrofit2.http.Streaming; +import retrofit2.http.Url; + +public class DynamicFaceModel extends BaseModel implements IDynamicFaceModel { + + private volatile static IDynamicFaceModel instance; + /** + * 服务器中json + */ + private FaceListInfo onlineFacesList; + /** + * 本地的保存的json + */ + private FaceListInfo offlineFaceList; + /** + * 表情包根目录 + */ + private File facesRootDir; + private File facesZipPath; + private boolean isShowingFace; + private boolean isRequestingZip; + + private DynamicFaceModel() { + } + + public static IDynamicFaceModel get() { + if (instance == null) { + synchronized (DynamicFaceModel.class) { + if (instance == null) { + instance = new DynamicFaceModel(); + } + } + } + return instance; + } + + /** + * 生成随机数 + * + * @param resultCount-- + * @param faceInfo-- + * @return -- + */ + public static List generateRandomNumber(int resultCount, FaceInfo faceInfo) { + // 结果的数量,1/2/3/4/5 + // 生成随机数结果下标 + int resultStartPos = faceInfo.getResultIndexStart(); + int resultEndPos = faceInfo.getResultIndexEnd(); + List resultIndexes = new ArrayList<>(); + int random; + Random r = new Random(); + while (resultIndexes.size() < resultCount) { + random = resultStartPos + r.nextInt(resultEndPos - resultStartPos + 1); + // 不可以重复,需要去重 + if (faceInfo.getRepeat() == FaceInfo.RESULT_CAN_NOT_REPEAT) { + if (!resultIndexes.contains(random)) { + resultIndexes.add(random); + } + } else { + // 可以重复,直接加进去 + resultIndexes.add(random); + } + } + return resultIndexes; + } + + /** + * 初始化 + */ + @Override + public void init() { + String offlineEncryptString = DemoCache.readFaceList(); + try { + String faceString = DESUtils.DESAndBase64Decrypt(offlineEncryptString); + offlineFaceList = new Gson().fromJson(faceString, FaceListInfo.class); + } catch (Exception e) { + e.printStackTrace(); + } + // data/data/{包名}/files/faces/ + // data/data/{包名}/files/faces/{version} + // data/data/{包名}/files/faces/{version}/{表情拼音} + // data/data/{包名}/files/faces/{version}/{表情拼音}/表情图片 + facesRootDir = new File(BasicConfig.INSTANCE.getAppContext().getFilesDir() + "/faces"); + facesZipPath = new File(facesRootDir.getAbsolutePath() + "/face.zip"); + if (!facesRootDir.exists()) { + facesRootDir.mkdirs(); + } + // 写进离线的faceInfoList中的图片根目录 + setPicRootDirectoryIntoFaceInfo(offlineFaceList); + } + + @Override + public boolean isShowingFace() { + return isShowingFace; + } + + @SuppressLint("CheckResult") + @Override + public void sendAllFace(FaceInfo faceInfo) { + if (!usable()) return; + // 如果是贵族表情,则要判断能不能发 + if (!canUseNobleFaceOrNot(faceInfo)) return; + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + UserModel.get().getUserInfo(roomInfo.getUid()).subscribe(new Consumer() { + @Override + public void accept(UserInfo userInfo) throws Exception { + // 聊天室所有麦上的人,包括自己 + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + List faceReceiveInfos = new ArrayList<>(); + for (int i = 0; i < mMicQueueMemberMap.size(); i++) { + MicMemberInfo mChatRoomMember = mMicQueueMemberMap.get(mMicQueueMemberMap.keyAt(i)).mChatRoomMember; + if (mChatRoomMember == null || + TextUtils.isEmpty(mChatRoomMember.getNick()) || + TextUtils.isEmpty(mChatRoomMember.getAccount())) continue; + FaceReceiveInfo faceReceiveInfo = new FaceReceiveInfo(); + faceReceiveInfo.setFaceId(faceInfo.getId()); + faceReceiveInfo.setNick(mChatRoomMember.getNick()); + faceReceiveInfo.setUid(Long.valueOf(mChatRoomMember.getAccount())); + faceReceiveInfo.setResultIndexes(generateRandomNumber(1, faceInfo)); + faceReceiveInfos.add(faceReceiveInfo); + } + + FaceAttachment faceAttachment = new FaceAttachment(CUSTOM_MSG_HEADER_TYPE_FACE, CUSTOM_MSG_SUB_TYPE_FACE_SEND); + faceAttachment.setUid(userInfo.getUid()); + faceAttachment.setFaceReceiveInfos(faceReceiveInfos); + + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + // 自定义消息 + faceAttachment + ); + IMNetEaseManager.get().sendChatRoomMessage(message, false) + .subscribe(new BiConsumer() { + @Override + public void accept(ChatRoomMessage chatRoomMessage, + Throwable throwable) throws Exception { + if (chatRoomMessage != null) { + onSendRoomMessageSuccess(chatRoomMessage); + } + } + }); + } + }); + + } + + @Override + public FaceInfo getPlayTogetherFace() { + // TODO: 2017/12/7 以后改成把对应的表情配置放到json的最后面,或者用字段区分出来 + if (!checkFaceCanUseOrNot(onlineFacesList)) { + // 没有最新的online json,或者没有最新的zip包 + getOnlineFaceJsonOrZip(); + } + // 找到对应的骰子表情信息 + return findFaceInfoById(17); + } + + private boolean usable() { + // 如果没有网络,return + return NetworkUtils.isNetworkAvailable(getContext()); + } + + @Override + public void sendFace(FaceInfo faceInfo) { + if (!usable()) return; + // 如果是贵族表情,则要判断能不能发 + if (!canUseNobleFaceOrNot(faceInfo)) return; + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) return; + // 普通表情 + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + List faceReceiveInfos = new ArrayList<>(); + FaceReceiveInfo faceReceiveInfo = new FaceReceiveInfo(); + faceReceiveInfo.setNick(userInfo.getNick()); + faceReceiveInfo.setFaceId(faceInfo.getId()); + faceReceiveInfo.setUid(userInfo.getUid()); + faceReceiveInfo.setSvgaURL(faceInfo.svgaUrl); + + // 运气表情 + if (faceInfo.getResultCount() > 0) { + faceReceiveInfo.setResultIndexes(generateRandomNumber(faceInfo.getResultCount(), faceInfo)); + } + faceReceiveInfos.add(faceReceiveInfo); + + // 发送云信信息给所有人 + FaceAttachment faceAttachment = new FaceAttachment(CUSTOM_MSG_HEADER_TYPE_FACE, CUSTOM_MSG_SUB_TYPE_FACE_SEND); + faceAttachment.setUid(userInfo.getUid()); + faceAttachment.setFaceReceiveInfos(faceReceiveInfos); + + final ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + roomInfo.getRoomId() + "", + // 自定义消息 + faceAttachment + ); + IMNetEaseManager.get().sendChatRoomMessage(message, false) + .subscribe(new BiConsumer() { + @Override + public void accept(ChatRoomMessage chatRoomMessage, + Throwable throwable) throws Exception { + if (chatRoomMessage != null) { + onSendRoomMessageSuccess(chatRoomMessage); + } + } + }); + } + + /** + * 收到其他手机发送过来的表情信息 + * + * @param chatRoomMessageList-- + */ + @SuppressLint("CheckResult") + @Override + public void onReceiveChatRoomMessages(List chatRoomMessageList) { + if (chatRoomMessageList == null || chatRoomMessageList.size() <= 0) { + return; + } + for (ChatRoomMessage msg : chatRoomMessageList) { + if (msg.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) msg.getAttachment(); + // 显示表情到对应的地方 + parseAttachment(attachment); + if (attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_FACE) { + FaceAttachment faceAttachment = (FaceAttachment) attachment; + List faceReceiveInfos = faceAttachment.getFaceReceiveInfos(); + if (ListUtils.isListEmpty(faceReceiveInfos)) continue; + FaceReceiveInfo faceReceiveInfo = faceReceiveInfos.get(0); + FaceInfo faceInfo = findFaceInfoById(faceReceiveInfo.getFaceId()); + if (faceInfo != null) { + if (faceReceiveInfo.getResultIndexes() != null && faceReceiveInfo.getResultIndexes().size() > 0) { + Single.just(msg).delay(3000, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BiConsumer() { + @Override + public void accept(ChatRoomMessage chatRoomMessage, Throwable throwable) throws Exception { + isShowingFace = false; + if (throwable != null) { + return; + } + IMNetEaseManager.get().addMessagesImmediately(chatRoomMessage); + } + }); + } + } + } + } + } + + } + + /** + * 自己发送云信自定义消息(表情信息)成功后的回调 + * + * @param message-- + */ + @SuppressLint("CheckResult") + private void onSendRoomMessageSuccess(ChatRoomMessage message) { + if (message.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) message.getAttachment(); + // 显示表情在对应的位置 + parseAttachment(attachment); + if (attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_FACE) { + FaceAttachment faceAttachment = (FaceAttachment) attachment; + List faceReceiveInfos = faceAttachment.getFaceReceiveInfos(); + FaceReceiveInfo faceReceiveInfo = faceReceiveInfos.get(0); + FaceInfo faceInfo = findFaceInfoById(faceReceiveInfo.getFaceId()); + // 3s时间后,显示表情的公屏信息 + if (faceInfo != null) { + if (faceReceiveInfo.getResultIndexes() != null && faceReceiveInfo.getResultIndexes().size() > 0) { + Single.just(message).delay(3000, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BiConsumer() { + @Override + public void accept(ChatRoomMessage chatRoomMessage, Throwable throwable) throws Exception { + isShowingFace = false; + if (throwable != null) { + return; + } + IMNetEaseManager.get().addMessagesImmediately(chatRoomMessage); + } + }); + } + } + } + } + } + + private void parseAttachment(CustomAttachment attachment) { + if (attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_FACE) { + FaceAttachment faceAttachment = (FaceAttachment) attachment; + List faceReceiveInfos = faceAttachment.getFaceReceiveInfos(); + if (faceReceiveInfos != null && faceReceiveInfos.size() > 0) { + // 显示动画 + Logger.e("face receive infos results: " + faceReceiveInfos); + EventBus.getDefault().post(new ReceiveFaceEvent(faceReceiveInfos)); + + for (int i = 0; i < faceReceiveInfos.size(); i++) { + FaceReceiveInfo faceReceiveInfo1 = faceReceiveInfos.get(i); + + //getFaceReceiveInfoPublisher().onNext(faceReceiveInfo1); + + FaceInfo faceInfo1 = findFaceInfoById(faceReceiveInfo1.getFaceId()); + if (faceInfo1 != null) { + long myUid = AuthModel.get().getCurrentUid(); + if (myUid == faceReceiveInfo1.getUid() && + faceReceiveInfo1.getResultIndexes() != null && + faceReceiveInfo1.getResultIndexes().size() > 0) { + isShowingFace = true; + } + } + } + } + } + } + + /** + * 能不能发该表情 + * + * @param faceInfo - + * @return - + */ + @Override + public boolean canUseNobleFaceOrNot(FaceInfo faceInfo) { + if (faceInfo == null) return false; + long currentUid = AuthModel.get().getCurrentUid(); + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + + if (currentUid == 0 || userInfo == null) { + return false; + } + SimpleVipInfo simpleVipInfo = faceInfo.getFaceVipInfo(); + if (simpleVipInfo == null || simpleVipInfo.getVipLevel() == 0) return true; + + UserVipInfo userVipInfo = userInfo.getUserVipInfoVO(); + int level = userVipInfo == null ? 0 : userVipInfo.getVipLevel(); + return level >= simpleVipInfo.getVipLevel(); + } + + @Override + public List getFaceInfos() { + // 有最新的online json,也有最新的zip包,返回 + if (checkFaceCanUseOrNot(onlineFacesList)) { + // 如果有对应的zip包,判断需不需要解压对应的zip包 + File faceRoot = new File(facesRootDir.getAbsolutePath() + + "/" + onlineFacesList.getVersion()); + if (!faceRoot.exists() || + faceRoot.list().length <= 0) { + unzipFaceZipFile(onlineFacesList); + } else { + // 如果有对应的zip包,并且已经解压了,则设置图片的根目录到FaceInfo中 + setPicRootDirectoryIntoFaceInfo(onlineFacesList); + } + return onlineFacesList.getFaces(); + } + // 没有重新请求最新的json,还有对应的zip包 + getOnlineFaceJsonOrZip(); + + // 判断现在能不能显示离线的json和对应的表情 + if (checkFaceCanUseOrNot(offlineFaceList)) { + // 有离线的json,并且有对应的zip包,才返回显示出列表 + return offlineFaceList.getFaces(); + } + return null; + } + + @Override + public List getVIPFaceInfos() { + if (onlineFacesList != null) return onlineFacesList.getVipFaces(); + if (offlineFaceList != null) return offlineFaceList.getVipFaces(); + return null; + } + + private boolean checkFaceCanUseOrNot(FaceListInfo faceListInfo) { + // 有没有对应的json + boolean hasJson = checkFaceListInfoValid(faceListInfo); + // 有没有json对应的zip包 + boolean hasZip = (hasJson && + hasFacesZipPacket(faceListInfo.getZipMd5())); + return (hasJson && hasZip); + } + + private boolean checkFaceListInfoValid(FaceListInfo faceListInfo) { + // 检查对应的faceListInfo是不是合法 + return (faceListInfo != null && + faceListInfo.getFaces() != null && + faceListInfo.getFaces().size() > 0); + } + + @Override + public FaceInfo findFaceInfoById(int faceId) { + FaceListInfo found = null; + if (checkFaceListInfoValid(onlineFacesList)) { + found = onlineFacesList; + } else if (checkFaceListInfoValid(offlineFaceList)) { + found = offlineFaceList; + } + if (found == null) { + return null; + } + FaceInfo faceInfo = findFaceInfoById(found.getFaces(), faceId); + if (faceInfo == null) { + faceInfo = findFaceInfoById(found.getVipFaces(), faceId); + } + return faceInfo; + } + + private FaceInfo findFaceInfoById(List faces, int faceId) { + if (ListUtils.isListEmpty(faces)) return null; + FaceInfo faceInfo = null; + for (FaceInfo face : faces) { + if (face.getId() == faceId) { + faceInfo = face; + break; + } + } + return faceInfo; + } + + /********************************************* 动态表情与服务器同步相关 *********************************************************/ + + + @SuppressLint("CheckResult") + @Override + public void getOnlineFaceJsonOrZip() { + // 如果获取不了在线表情json,表明app初始化失败 + if (onlineFacesList == null) { + //FIXME: 2018/9/10 这里应该是独立的接口同步表情数据,不应该弄到初始化接口去,同時也不要放到初始化模块去 + InitialModel.get().loadInitInfo().subscribe(new Consumer() { + @Override + public void accept(InitInfo initInfo) throws Exception { + onReceiveOnlineFaceJson(initInfo.getFaceJson().getJson()); + } + }); + + } else if (!hasFacesZipPacket(onlineFacesList.getZipMd5())) { + // 有在线json,但是没有对应的表情包 + getOnlineFaceZipFile(); + } + } + + @Override + public void onReceiveOnlineFaceJson(String encrypt) { + if (StringUtil.isEmpty(encrypt)) { + return; + } + // 保证facesRootDir存在 + if (!facesRootDir.exists()) { + facesRootDir.mkdirs(); + } + FaceListInfo faceListInfo = null; + try { + String encryptStr = DESUtils.DESAndBase64Decrypt(encrypt); + faceListInfo = new Gson().fromJson(encryptStr, FaceListInfo.class); + } catch (Exception e) { + e.printStackTrace(); + } + onlineFacesList = faceListInfo; + DemoCache.saveFaceList(encrypt); + // 没有服务器对应版本的表情zip包 + // 检测当前表情版本是否落后 + boolean versionOutDated = (offlineFaceList != null && + offlineFaceList.getVersion() < onlineFacesList.getVersion()); + if (versionOutDated || + !hasFacesZipPacket(onlineFacesList.getZipMd5())) { + // 获取对应版本的表情zip包 + getOnlineFaceZipFile(); + } else { + // 如果有对应的zip包,判断需不需要解压对应的zip包 + File faceRoot = new File(facesRootDir.getAbsolutePath() + + "/" + onlineFacesList.getVersion()); + if (!faceRoot.exists() || + faceRoot.list().length <= 0) { + unzipFaceZipFile(onlineFacesList); + } else { + // 如果有对应的zip包,并且已经解压了,则设置图片的根目录到FaceInfo中 + setPicRootDirectoryIntoFaceInfo(onlineFacesList); + } + } + } + + private boolean hasFacesZipPacket(String zipMd5) { + boolean has = false; + File zip = new File(facesRootDir.getAbsolutePath() + "/face.zip"); + // 检测是否有对应version的zip表情 + try { + long time = System.currentTimeMillis(); + String md5 = MD5Utils.getFileMD5String(zip); + Logger.d("zip", md5 + " time: " + (System.currentTimeMillis() - time)); + if (zipMd5.equalsIgnoreCase(md5)) { + has = true; + } + } catch (Exception e) { + e.printStackTrace(); + } + Logger.d("has zip packet", has + ""); + return has; + } + + /** + * 寻找对应的表情包图片的根目录,如果没有则设置一个默认的 + * + * @param faceListInfo-- + */ + private void setPicRootDirectoryIntoFaceInfo(FaceListInfo faceListInfo) { + if (faceListInfo == null || + facesRootDir == null) { + return; + } + File picRootDirectory = null; + File tmp = new File(facesRootDir.getAbsolutePath() + "/" + faceListInfo.getVersion()); + if (!tmp.exists()) { + return; + } else { + File[] files = tmp.listFiles(); + if (files.length == 1 && files[0].list().length > 0) { + // 压缩包里面有根目录的情况 + picRootDirectory = files[0]; + Logger.e("files[0]: " + files[0].getAbsolutePath()); + } else if (files.length > 1) { + // 压缩包里面没有根目录的情况 + picRootDirectory = tmp; + Logger.d("tmp: " + tmp.getAbsolutePath()); + } + } + // 如果没有找到,设置一个默认的 + if (picRootDirectory == null) { + picRootDirectory = new File(facesRootDir.getAbsolutePath() + "/" + faceListInfo.getVersion() + "/face"); + Logger.e("default: " + picRootDirectory.getAbsolutePath()); + } + FaceInfo.PICTURES_ROOT_DIRECTORY = picRootDirectory.getAbsolutePath(); + + } + + /** + * 获取在吸纳表情资源压缩文件 + */ + @Override + public void getOnlineFaceZipFile() { + if (isRequestingZip) return; + isRequestingZip = true; + Logger.e("getOnlineFaceZipFile", "start getting zip file"); + + + if (facesZipPath.exists()) { + // 删除旧的zip包 + facesZipPath.delete(); + } else { + // 创建其父目录 + if (!facesZipPath.getParentFile().exists()) { + facesZipPath.getParentFile().mkdirs(); + } + } + + + String url = onlineFacesList.getZipUrl(); + + + GlideUtils.instance().downloadFromUrl2(getContext(), url, new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + Logger.d("face.zip download onLoadFailed"); + return true; + } + @Override + public boolean onResourceReady(File resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if (resource != null) { + MyUriUtils.INSTANCE.copyFile(resource,new File(facesRootDir,"face.zip")); + Logger.d("face.zip download end" + "response dir: " + facesRootDir.getAbsolutePath()); + unzipFaceZipFile(onlineFacesList); + isRequestingZip = false; + } + return true; + } + }); + +// DownloadTask task = new DownloadTask.Builder(url, facesRootDir) +// .setFilename("face.zip") +// .setMinIntervalMillisCallbackProcess(1000) +// .setPassIfAlreadyCompleted(true) +// .build(); +// +// task.enqueue(new DownloadListener2() { +// @Override +// public void taskStart(@NonNull DownloadTask task) { +// Logger.d("face.zip download start"); +// } +// +// @Override +// public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause) { +// Logger.d("face.zip download end" + "response dir: " + facesRootDir.getAbsolutePath()); +// unzipFaceZipFile(onlineFacesList); +// isRequestingZip = false; +// } +// }); + } + + /** + * 解压缩对应版本的zip包,并且告知FaceInfo的根目录 + * + * @param faceListInfo-- + */ + private void unzipFaceZipFile(FaceListInfo faceListInfo) { + new Thread(() -> { + try { + // 如果zip包不存在,或者说zip包的md5值不一样则返回 + if (!facesZipPath.exists() || faceListInfo == null || + !faceListInfo.getZipMd5().equalsIgnoreCase(MD5Utils.getFileMD5String(facesZipPath))) { + return; + } + } catch (Exception e) { + e.printStackTrace(); + } + long startTime = System.currentTimeMillis(); + try { + ZipInputStream zis = new ZipInputStream(new FileInputStream(facesZipPath)); + BufferedInputStream bis = new BufferedInputStream(zis); + //输出路径(文件夹目录) + String parent = facesRootDir.getAbsolutePath() + "/" + faceListInfo.getVersion(); + String parentPre = new File(parent).getCanonicalPath(); + File file; + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + if (entry.isDirectory()) { + // 如果有对应的路径名字的文件,则删除,重建一个目录 + file = new File(parent, entry.getName()); + if (file.exists() && file.isFile()) { + boolean b = file.delete(); + if (b) { + file.mkdirs(); + } + } + continue; + } + file = new File(parent, entry.getName()); + if (!file.getCanonicalPath().startsWith(parentPre)) { + throw new SecurityException(); + } + if (!file.exists()) { + (new File(file.getParent())).mkdirs(); + } else if (file.exists() && file.isFile() && file.length() > 0) { + continue; + } + FileOutputStream out = new FileOutputStream(file); + BufferedOutputStream bos = new BufferedOutputStream(out); + int b; + while ((b = bis.read()) != -1) { + bos.write(b); + } + bos.close(); + out.close(); + } + bis.close(); + zis.close(); + } catch (Exception e) { + e.printStackTrace(); + } + long endTime = System.currentTimeMillis(); + LogUtils.d("unzipFaceZipFileTime=" + (endTime - startTime)); + // 更新对应的faceInfoList中的图片根目录 + setPicRootDirectoryIntoFaceInfo(faceListInfo); + // 如果有dialog.可以显示出对应的数据 + EventBus.getDefault().post(new FaceIsReadyEvent()); + }).start(); + } + + private interface Api { + @GET + @Streaming + @Headers({ + NoParamsInterceptor.NO_PARAMS_HEADER, + "need_update_url:false" + }) + Single downloadFaceResource(@Url String url); + } + +} diff --git a/core/src/main/java/com/chwl/core/room/face/FaceInfo.java b/core/src/main/java/com/chwl/core/room/face/FaceInfo.java new file mode 100644 index 0000000..11a1e8f --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/FaceInfo.java @@ -0,0 +1,361 @@ +package com.chwl.core.room.face; + +import androidx.annotation.Keep; + +import com.chwl.core.gift.bean.SimpleVipInfo; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +/** + * @author xiaoyu + */ +@Keep +public class FaceInfo implements Serializable { + + /** + * 结果不能重复(默认) + */ + public static final int RESULT_CAN_NOT_REPEAT = 0; + /** + * 结果可以重复 + */ + public static final int RESULT_CAN_REPEAT = 1; + /** + * 显示类型--结果图片只有一张 + */ + public static final int DISPLAY_TYPE_ONE_PIC = 0; + /** + * 显示类型--连贯显示 + */ + public static final int DISPLAY_TYPE_FLOW = 1; + /** + * 显示类型--重叠显示 + */ + public static final int DISPLAY_TYPE_OVERLAY = 2; + /** + * 显示类型--并排排列 + */ + public static final int DISPLAY_TYPE_ABREAST = 3; + /** + * 表情类型--正常表情,需要在表情面板显示 + */ + public static final int TYPE_FACE_NORMAL = 1; + /** + * 表情类型--功能表情,不需要再表情面板显示 + */ + public static final int TYPE_FACE_FUNCTIONAL = 2; + /** + * 表情类型--一起玩的表情,不需要再表情面板显示 + */ + public static final int TYPE_FACE_PLAY_TOGETHER = 3; + + public static String PICTURES_ROOT_DIRECTORY = ""; + /** + * 表情的id + */ + private int id; + /** + * 表情的中文名字 + */ + @SerializedName(value = "name") + private String CNName; + /** + * 表情的拼音 + */ + @SerializedName(value = "pinyin") + private String ENName; + /** + * 表情的总图片数量 + */ + @SerializedName(value = "imageCount") + private int totalImageCount; + /** + * 表情的封面图片的index + */ + @SerializedName(value = "iconPos") + private int iconImageIndex; + /** + * 表情的开始的index + */ + @SerializedName(value = "animStartPos") + private int animationIndexStart; + /** + * 表情的结束的index + */ + @SerializedName(value = "animEndPos") + private int animationIndexEnd; + /** + * 表情的展示的总的时间 + */ + @SerializedName(value = "animDuration") + private int animationDuration; + /** + * 表情结束时候展示结束图片的个数 + */ + @SerializedName(value = "resultCount") + private int resultCount; + /** + * 表情帧动画结束时候结果图片是否互斥 1--不互斥(可以重复) 0--互斥(不可以重复,默认选项) + */ + @SerializedName(value = "canResultRepeat") + private int repeat; + + ////////自定义的属性和方法/////////// + /** + * 表情帧动画展示的次数 + */ + @SerializedName(value = "animRepeatCount") + private int repeatCount; + /** + * 表情帧动画展示结束,结果图片的开始index + */ + @SerializedName(value = "resultStartPos") + private int resultIndexStart; + /** + * 表情帧动画展示结束,结果图片的结束index + */ + @SerializedName(value = "resultEndPos") + private int resultIndexEnd; + /** + * 表情帧动画展示结束,结果图片展示的时间 + */ + @SerializedName(value = "resultDuration") + private int resultDuration; + /** + * 结果图片排列的类型 + * 0--只有一张图片 + * 1--紧凑排列 + * 2--重叠排列 + * 3--并排排列 + * ... + * 注意,只有resultCount大于0,才需要比较这个(默认是0) + */ + @SerializedName(value = "displayType") + private int displayType; + /** + * 是否是贵族表情 + */ + private boolean isNobleFace; + /** + * 可用贵族的等级 + */ + @SerializedName("nobleId") + private int nobleId; + /** + * 表情类型 + * 1--正常表情,需要在表情面板显示 + * 2--功能表情不需要在表情面板显示 + * 3--类似一起玩的表情使用 + */ + private int faceType; + /** + * 是否需要隐藏 + * true--表示审核中需要隐藏的表情 + * false--表示审核中不需要隐藏的表情 + */ + private boolean isLuckFace; + + private SimpleVipInfo faceVipInfo; + + public String svgaUrl; + public String pic; + + /** + * 我们要拼接的是: + * picturesRootDirectory/{表情名字}/表情图片 + * 通过iconImageIndex获取封面 + * + * @return 自己拼接的local的path + */ + public String getFacePath(int pos) { + return PICTURES_ROOT_DIRECTORY + "/" + getENName() + "_" + getId() + "/" + getENName() + "_" + getId() + "_" + pos + ".png"; + } + /////////////////////////////////// + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCNName() { + return CNName; + } + + public void setCNName(String CNName) { + this.CNName = CNName; + } + + public String getENName() { + return ENName; + } + + public void setENName(String ENName) { + this.ENName = ENName; + } + + public int getTotalImageCount() { + return totalImageCount; + } + + public void setTotalImageCount(int totalImageCount) { + this.totalImageCount = totalImageCount; + } + + public int getIconImageIndex() { + return iconImageIndex; + } + + public void setIconImageIndex(int iconImageIndex) { + this.iconImageIndex = iconImageIndex; + } + + public int getAnimationIndexStart() { + return animationIndexStart; + } + + public void setAnimationIndexStart(int animationIndexStart) { + this.animationIndexStart = animationIndexStart; + } + + public int getAnimationIndexEnd() { + return animationIndexEnd; + } + + public void setAnimationIndexEnd(int animationIndexEnd) { + this.animationIndexEnd = animationIndexEnd; + } + + public int getAnimationDuration() { + return animationDuration; + } + + public void setAnimationDuration(int animationDuration) { + this.animationDuration = animationDuration; + } + + public int getResultCount() { + return resultCount; + } + + public void setResultCount(int resultCount) { + this.resultCount = resultCount; + } + + public int getRepeat() { + return repeat; + } + + public void setRepeat(int repeat) { + this.repeat = repeat; + } + + public int getRepeatCount() { + return repeatCount; + } + + public void setRepeatCount(int repeatCount) { + this.repeatCount = repeatCount; + } + + public int getResultIndexStart() { + return resultIndexStart; + } + + public void setResultIndexStart(int resultIndexStart) { + this.resultIndexStart = resultIndexStart; + } + + public int getResultIndexEnd() { + return resultIndexEnd; + } + + public void setResultIndexEnd(int resultIndexEnd) { + this.resultIndexEnd = resultIndexEnd; + } + + public int getResultDuration() { + return resultDuration; + } + + public void setResultDuration(int resultDuration) { + this.resultDuration = resultDuration; + } + + public int getDisplayType() { + return displayType; + } + + public void setDisplayType(int displayType) { + this.displayType = displayType; + } + + public boolean isNobleFace() { + return isNobleFace; + } + + public void setNobleFace(boolean nobleFace) { + isNobleFace = nobleFace; + } + + public int getNobleId() { + return nobleId; + } + + public void setNobleId(int nobleId) { + this.nobleId = nobleId; + } + + public int getFaceType() { + return faceType; + } + + public void setFaceType(int faceType) { + this.faceType = faceType; + } + + public boolean isLuckFace() { + return isLuckFace; + } + + public void setLuckFace(boolean luckFace) { + isLuckFace = luckFace; + } + + public SimpleVipInfo getFaceVipInfo() { + return faceVipInfo; + } + + public void setFaceVipInfo(SimpleVipInfo faceVipInfo) { + this.faceVipInfo = faceVipInfo; + } + + @Override + public String toString() { + return "FaceInfo{" + + "id=" + id + + ", CNName='" + CNName + '\'' + + ", ENName='" + ENName + '\'' + + ", totalImageCount=" + totalImageCount + + ", iconImageIndex=" + iconImageIndex + + ", animationIndexStart=" + animationIndexStart + + ", animationIndexEnd=" + animationIndexEnd + + ", animationDuration=" + animationDuration + + ", resultCount=" + resultCount + + ", repeat=" + repeat + + ", repeatCount=" + repeatCount + + ", resultIndexStart=" + resultIndexStart + + ", resultIndexEnd=" + resultIndexEnd + + ", resultDuration=" + resultDuration + + ", displayType=" + displayType + + ", isNobleFace=" + isNobleFace + + ", nobleId=" + nobleId + + ", faceType=" + faceType + + ", isLuckFace=" + isLuckFace + + ", picturesRootDirectory='" + PICTURES_ROOT_DIRECTORY + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/room/face/FaceListInfo.java b/core/src/main/java/com/chwl/core/room/face/FaceListInfo.java new file mode 100644 index 0000000..767a534 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/FaceListInfo.java @@ -0,0 +1,72 @@ +package com.chwl.core.room.face; + + +import androidx.annotation.Keep; + +import java.io.Serializable; +import java.util.List; + +/** + * @author xiaoyu + * @date 2017/12/8 + */ + +@Keep +public class FaceListInfo implements Serializable { + private List faces; + private List vipFaces; + private int version; + private String zipMd5; + private String zipUrl; + + public List getFaces() { + return faces; + } + + public void setFaces(List faces) { + this.faces = faces; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public String getZipMd5() { + return zipMd5.toLowerCase(); + } + + public void setZipMd5(String zipMd5) { + this.zipMd5 = zipMd5; + } + + public String getZipUrl() { + return zipUrl; + } + + public void setZipUrl(String zipUrl) { + this.zipUrl = zipUrl; + } + + public List getVipFaces() { + return vipFaces; + } + + public void setVipFaces(List vipFaces) { + this.vipFaces = vipFaces; + } + + @Override + public String toString() { + return "FaceListInfo{" + + "faces=" + faces + + ", vipFaces=" + vipFaces + + ", version=" + version + + ", zipMd5='" + zipMd5 + '\'' + + ", zipUrl='" + zipUrl + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/room/face/FaceReceiveInfo.java b/core/src/main/java/com/chwl/core/room/face/FaceReceiveInfo.java new file mode 100644 index 0000000..81a5f45 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/FaceReceiveInfo.java @@ -0,0 +1,72 @@ +package com.chwl.core.room.face; + +import androidx.annotation.Keep; + +import java.io.Serializable; +import java.util.List; + +/** + * @author chenran + * @date 2017/9/12 + * 房间里面其中一个人发运气表情,其他人通过云信收到对应的运气表情的java bean + */ + +@Keep +public class FaceReceiveInfo implements Serializable { + private long uid; + private String nick; + private int faceId; + private List resultIndexes; + private String svgaURL; //区分svga + + public String getSvgaURL() { + return svgaURL; + } + + public void setSvgaURL(String svgaURL) { + this.svgaURL = svgaURL; + } + + public List getResultIndexes() { + return resultIndexes; + } + + public void setResultIndexes(List resultIndexes) { + this.resultIndexes = resultIndexes; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public int getFaceId() { + return faceId; + } + + public void setFaceId(int faceId) { + this.faceId = faceId; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + @Override + public String toString() { + return "FaceReceiveInfo{" + + "uid=" + uid + + ", nick='" + nick + '\'' + + ", faceId=" + faceId + + ", resultIndexes=" + resultIndexes + + ", svgaURL='" + svgaURL + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/room/face/IDynamicFaceModel.java b/core/src/main/java/com/chwl/core/room/face/IDynamicFaceModel.java new file mode 100644 index 0000000..76f14f8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/IDynamicFaceModel.java @@ -0,0 +1,92 @@ +package com.chwl.core.room.face; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.base.IModel; + +import java.util.List; + +public interface IDynamicFaceModel extends IModel { + /** + * 全麦按钮出发 + * + * @return -- + */ + FaceInfo getPlayTogetherFace(); + + /** + * 发表情展示给其他人看 + * + * @param faceInfo 要显示的表情信息 + */ + void sendFace(FaceInfo faceInfo); + + /** + * 房主发送运气表情给所有用户 + * + * @param faceInfo--发送全麦运气的表情 + */ + void sendAllFace(FaceInfo faceInfo); + + /** + * 根据对应的表情的id找到对应的FaceInfo + * + * @param faceId-- faceInfo的id + * @return 对应id的faceInfo + */ + FaceInfo findFaceInfoById(int faceId); + + /** + * @return 打开表情的dialog, 获得所有的表情信息 + */ + List getFaceInfos(); + + /** + * @return 打开表情的dialog, 获得所有的表情信息 + */ + List getVIPFaceInfos(); + + void init(); + + /** + * 当前有没有在显示表情 + * + * @return boolean + */ + boolean isShowingFace(); + + + + /** + * 获取服务端表情的json + */ + void getOnlineFaceJsonOrZip(); + + /** + * 初始化成功后获取对应的表情列表 + * + * @param encrypt -- + */ + void onReceiveOnlineFaceJson(String encrypt); + + /** + * 返回对应版本的表情的zip包 + */ + void getOnlineFaceZipFile(); + + /** + * 收到来自其他客户端的表情 + * + * @param chatRoomMessageList - + */ + void onReceiveChatRoomMessages(List chatRoomMessageList); + + /** + * 当前用户能不能用贵族表情 + * + * @param faceInfo - + * @return - + */ + boolean canUseNobleFaceOrNot(FaceInfo faceInfo); + + +} diff --git a/core/src/main/java/com/chwl/core/room/face/IFaceCore.java b/core/src/main/java/com/chwl/core/room/face/IFaceCore.java new file mode 100644 index 0000000..5ecce39 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/IFaceCore.java @@ -0,0 +1,91 @@ +package com.chwl.core.room.face; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.library.coremanager.IBaseCore; + +import java.util.List; + +/** + * @author chenran + * @date 2017/9/9 + */ + +public interface IFaceCore extends IBaseCore { + /** + * 全麦按钮出发 + * + * @return -- + */ + FaceInfo getPlayTogetherFace(); + + /** + * 发表情展示给其他人看 + * + * @param faceInfo 要显示的表情信息 + */ + void sendFace(FaceInfo faceInfo); + + /** + * 房主发送运气表情给所有用户 + * + * @param faceInfo--发送全麦运气的表情 + */ + void sendAllFace(FaceInfo faceInfo); + + /** + * 根据对应的表情的id找到对应的FaceInfo + * + * @param faceId-- faceInfo的id + * @return 对应id的faceInfo + */ + FaceInfo findFaceInfoById(int faceId); + + /** + * @return 打开表情的dialog, 获得所有的表情信息 + */ + List getFaceInfos(); + + /** + * 当前有没有在显示表情 + * + * @return boolean + */ + boolean isShowingFace(); + + //////////////2017/11/29 Android 2.3.0的新需求/////////////// + + /** + * 获取服务端表情的json + */ + void getOnlineFaceJsonOrZip(); + + /** + * 初始化成功后获取对应的表情列表 + * + * @param encrypt -- + */ + void onReceiveOnlineFaceJson(String encrypt); + + /** + * 返回对应版本的表情的zip包 + */ + void getOnlineFaceZipFile(); + + /** + * 收到来自其他客户端的表情 + * + * @param chatRoomMessageList - + */ + void onReceiveChatRoomMessages(List chatRoomMessageList); + + /** + * 当前用户能不能用贵族表情 + * + * @param faceInfo - + * @return - + */ + boolean canUseNobleFaceOrNot(FaceInfo faceInfo); + + void removeMessage(); +// Observable> getChatRoomMsgFlowable(); +} diff --git a/core/src/main/java/com/chwl/core/room/face/IFaceCoreClient.java b/core/src/main/java/com/chwl/core/room/face/IFaceCoreClient.java new file mode 100644 index 0000000..ae168fd --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/IFaceCoreClient.java @@ -0,0 +1,23 @@ +package com.chwl.core.room.face; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.library.coremanager.ICoreClient; + +import java.util.List; + +/** + * @author chenran + * @date 2017/9/9 + */ + +public interface IFaceCoreClient extends ICoreClient { + String METHOD_ON_RECEIVE_FACE = "onReceiveFace"; + String METHOD_ON_NOTI_FACE = "onNotiFace"; + String METHOD_ON_UNZIP_SUCCESS = "onUnzipSuccess"; + + void onNotiFace(ChatRoomMessage chatRoomMessage); + + void onReceiveFace(List faceReceiveInfos); + + void onUnzipSuccess(); +} diff --git a/core/src/main/java/com/chwl/core/room/face/SvgaFaceManager.kt b/core/src/main/java/com/chwl/core/room/face/SvgaFaceManager.kt new file mode 100644 index 0000000..5796a33 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/SvgaFaceManager.kt @@ -0,0 +1,53 @@ +package com.chwl.core.room.face + +import android.content.Context +import android.os.Environment +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.chwl.core.utils.myutil.MyUriUtils.copyFile +import com.chwl.library.common.glide.GlideUtils.Companion.instance +import com.orhanobut.logger.Logger +import java.io.File + +object SvgaFaceManager { + + + private val zipUrl = "https://molistar-1320554189.cos.ap-hongkong.myqcloud.com/TestFace.zip" + + fun getFacePath(context: Context, type: String): File { + // 优先用官方API + return context.getExternalFilesDir(type) ?: File(Environment.getExternalStorageDirectory(), "Android/data/${context.packageName}/files/$type") + } + + fun loadFaceZip(context: Context) { + + instance().downloadFromUrl2(context, zipUrl, object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any, + target: Target, + isFirstResource: Boolean + ): Boolean { + Logger.d("face.zip download onLoadFailed") + return true + } + + override fun onResourceReady( + resource: File?, + model: Any, + target: Target, + dataSource: DataSource, + isFirstResource: Boolean + ): Boolean { + if (resource != null) { + copyFile(resource, File(getFacePath(context,"download/face"), "face.zip")) + + } + return true + } + }) + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/face/ZipDownloader.kt b/core/src/main/java/com/chwl/core/room/face/ZipDownloader.kt new file mode 100644 index 0000000..90c5c47 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/face/ZipDownloader.kt @@ -0,0 +1,77 @@ +package com.chwl.core.room.face + +import android.content.Context +import com.chwl.library.common.util.doLog +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.File +import java.io.IOException +import java.util.zip.ZipFile + +// 添加依赖:implementation 'com.squareup.okhttp3:okhttp:4.10.0' +object ZipDownloader { + + private val okHttpClient = OkHttpClient() + + /** + * 下载并解压ZIP到沙盒目录 + * @param context Context + * @param zipUrl ZIP文件URL + * @param targetSubDir 目标子目录(如 "download/face") + */ + suspend fun downloadAndUnzip( + context: Context, + zipUrl: String, + targetSubDir: String + ): Boolean = withContext(Dispatchers.IO) { + try { + "表情包 开始下载 表情包".doLog() + // 1. 获取沙盒目标目录(无需权限) + val targetDir = File(context.getExternalFilesDir(null), targetSubDir).apply { + if (!exists()) mkdirs() + } + + // 2. 创建临时ZIP文件(放在cache目录) + val tempZipFile = File(context.externalCacheDir, "temp_${System.currentTimeMillis()}.zip") + + // 3. 使用OkHttp下载 + val request = Request.Builder().url(zipUrl).build() + okHttpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) throw IOException("下载失败: ${response.code}") + response.body?.byteStream()?.use { input -> + tempZipFile.outputStream().use { output -> + input.copyTo(output) + } + } + } + + "表情包 开始解压 表情包".doLog() + // 4. 解压ZIP(使用Android内置ZipFile) + ZipFile(tempZipFile).use { zip -> + zip.entries().iterator().forEach { entry -> + if (!entry.isDirectory) { + val outputFile = File(targetDir, entry.name).apply { + parentFile?.mkdirs() // 确保父目录存在 + } + zip.getInputStream(entry).use { input -> + outputFile.outputStream().use { output -> + input.copyTo(output) + } + } + } + } + } + + // 5. 清理临时文件 + tempZipFile.delete() + + true // 返回成功 + } catch (e: Exception) { + "表情包 下载失败 ${e.message}".doLog() + e.printStackTrace() + false // 返回失败 + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/game/GameModel.kt b/core/src/main/java/com/chwl/core/room/game/GameModel.kt new file mode 100644 index 0000000..a5583e0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/game/GameModel.kt @@ -0,0 +1,105 @@ +package com.chwl.core.room.game + +import com.chwl.core.auth.AuthModel +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.game_team.GameTeamRecordBean +import com.chwl.core.home.bean.CollectionRoomInfo +import com.chwl.core.room.game.bean.GameCodeInfo +import com.chwl.core.room.game.bean.GameInfo +import com.chwl.core.utils.net.RxHelper +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Single +import retrofit2.http.* + +object GameModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + fun getGameCode(): Single { + return api.getGameCode(AuthModel.get().currentUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()) + } + + fun getGameList(roomUid: Long?): Single> { + if (roomUid == null) { + return api.getGameList() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()) + } else { + return api.getGameList(roomUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()) + } + } + + suspend fun startGameTeam(gameId: Long, gameUid: Long, inning: Long, uid: Long): Any? = + launchRequest { + api.startGameTeam(gameId, gameUid, inning, uid) + } + + suspend fun getGameTeamRecordList( + type: Int, + pageNum: Int, + pageSize: Int, + uid: Long + ): List? = + launchRequest { + api.getGameTeamRecordList(type, uid, pageNum, pageSize) + } + + private interface Api { + + /** + * @return + */ + @POST("/miniGame/record/miniGameList") + fun getGameList( + ): Single>> + + /** + * @param uid + * @return + */ + @FormUrlEncoded + @POST("/miniGame/record/miniGameList") + fun getGameList( + @Field("roomUid") uid: Long + ): Single>> + + /** + * + * + * @param uid + * @return + */ + @FormUrlEncoded + @POST("/miniGame/getCode") + fun getGameCode( + @Field("uid") uid: Long + ): Single> + + /** + * 发起游戏组队 + */ + @FormUrlEncoded + @POST("/gamePartnerOrder/submit") + suspend fun startGameTeam( + @Field("gameId") gameId: Long, + @Field("gameUid") gameUid: Long, + @Field("inning") inning: Long, + @Field("uid") uid: Long + ): ServiceResult + + @GET("/gamePartnerOrder/record") + suspend fun getGameTeamRecordList( + @Query("searchType") type: Int, + @Query("uid") uid: Long, + @Query("currSize") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/game/GameStatus.java b/core/src/main/java/com/chwl/core/room/game/GameStatus.java new file mode 100644 index 0000000..feb65cf --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/game/GameStatus.java @@ -0,0 +1,8 @@ +package com.chwl.core.room.game; + +public interface GameStatus { + int STATUS_NOT_JOIN = 0; + int STATUS_NOT_READY = 1; + int STATUS_READY = 2; + int STATUS_PLAYING = 3; +} diff --git a/core/src/main/java/com/chwl/core/room/game/bean/BaiShunGameConfig.kt b/core/src/main/java/com/chwl/core/room/game/bean/BaiShunGameConfig.kt new file mode 100644 index 0000000..d052b6b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/game/bean/BaiShunGameConfig.kt @@ -0,0 +1,53 @@ +package com.chwl.core.room.game.bean + +import androidx.annotation.Keep +import com.chwl.core.auth.AuthModel +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.library.language.LanguageHelper +import java.io.Serializable + +@Keep +class BaiShunGameConfig : Serializable { + val appChannel: String? = null + val appId: Long? = null + var userId: String? = null + val code: String? = null + var roomId: String? = null + + // 游戏场景 2:半屏(秀场) 3: 全屏(游戏场) + val gameMode: String? = null + var language: String? = null + val gameConfig: Config? = null + val gsp: Int? = null + var showType: Int? = null + + val appKey : String?=null + val gameId : Int?=null + + @Keep + class Config : Serializable { + val sceneMode: Int? = null + + //货币图标(外⽹可访问 URL,60*60 ⼤⼩) + val currencyIcon: String? = null + } + + fun reloadDynamicParams() { + roomId = AvRoomDataManager.get().roomUid.toString() + userId = AuthModel.get().currentUid.toString() + language = when (LanguageHelper.getCurrentLanguageType()) { + LanguageHelper.AR -> { + "7" + } + + LanguageHelper.ZH -> { + "1" + } + + else -> { + "2" + } + } + + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/game/bean/GameCfg.kt b/core/src/main/java/com/chwl/core/room/game/bean/GameCfg.kt new file mode 100644 index 0000000..f71fc91 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/game/bean/GameCfg.kt @@ -0,0 +1,115 @@ +package com.chwl.core.room.game.bean + +/*** + * + * + */ +data class GameCfg( + val gameMode: Int = 1, + val ui: Ui = Ui() +) { + data class Ui( + val cancel_join_btn: CancelJoinBtn = CancelJoinBtn(), + val cancel_ready_btn: CancelReadyBtn = CancelReadyBtn(), + val gameSettle: GameSettle = GameSettle(), + val game_help_btn: GameHelpBtn = GameHelpBtn(), + val game_setting_btn: GameSettingBtn = GameSettingBtn(), + val join_btn: JoinBtn = JoinBtn(), + val level: Level = Level(), + val lobby_game_setting: LobbyGameSetting = LobbyGameSetting(), + val lobby_help_btn: LobbyHelpBtn = LobbyHelpBtn(), + val lobby_player_captain_icon: LobbyPlayerCaptainIcon = LobbyPlayerCaptainIcon(), + val lobby_player_kickout_icon: LobbyPlayerKickoutIcon = LobbyPlayerKickoutIcon(), + val lobby_players: LobbyPlayers = LobbyPlayers(), + val lobby_rule: LobbyRule = LobbyRule(), + val lobby_setting_btn: LobbySettingBtn = LobbySettingBtn(), + val ping: Ping = Ping(), + val ready_btn: ReadyBtn = ReadyBtn(), + val share_btn: ShareBtn = ShareBtn(), + val start_btn: StartBtn = StartBtn(), + val version: Version = Version() + ) { + data class CancelJoinBtn( + val custom: Boolean = false, + val hide: Boolean = false + ) + + data class CancelReadyBtn( + val custom: Boolean = false, + val hide: Boolean = false + ) + + data class GameSettle( + val hide: Boolean = false + ) + + data class GameHelpBtn( + val hide: Boolean = false + ) + + data class GameSettingBtn( + val hide: Boolean = false + ) + + data class JoinBtn( + val custom: Boolean = true, + val hide: Boolean = false + ) + + data class Level( + val hide: Boolean = true + ) + + data class LobbyGameSetting( + val hide: Boolean = false + ) + + data class LobbyHelpBtn( + val hide: Boolean = false + ) + + data class LobbyPlayerCaptainIcon( + val hide: Boolean = false + ) + + data class LobbyPlayerKickoutIcon( + val hide: Boolean = false + ) + + data class LobbyPlayers( + val custom: Boolean = true, + val hide: Boolean = false + ) + + data class LobbyRule( + val hide: Boolean = true + ) + + data class LobbySettingBtn( + val hide: Boolean = false + ) + + data class Ping( + val hide: Boolean = false + ) + + data class ReadyBtn( + val custom: Boolean = false, + val hide: Boolean = false + ) + + data class ShareBtn( + val custom: Boolean = false, + val hide: Boolean = true + ) + + data class StartBtn( + val custom: Boolean = false, + val hide: Boolean = false + ) + + data class Version( + val hide: Boolean = false + ) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/game/bean/GameCodeInfo.kt b/core/src/main/java/com/chwl/core/room/game/bean/GameCodeInfo.kt new file mode 100644 index 0000000..e9777d7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/game/bean/GameCodeInfo.kt @@ -0,0 +1,6 @@ +package com.chwl.core.room.game.bean + +data class GameCodeInfo( + val code: String, + val expireDate: Long +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/game/bean/GameInfo.java b/core/src/main/java/com/chwl/core/room/game/bean/GameInfo.java new file mode 100644 index 0000000..f9cbb4a --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/game/bean/GameInfo.java @@ -0,0 +1,56 @@ +package com.chwl.core.room.game.bean; + +public class GameInfo { + + public boolean isShow; + public String mgId=""; + public String name=""; + public String pic=""; + public String pic2=""; + public String remark=""; + public int seq; + public int showType; + public boolean isSelect; + public String skipContent=""; + public String ruleValue=""; + public boolean isStandardRoom;// 本地自己维护的,为了区分普通房 + public String code=""; + + + public boolean isStandardRoom() { + return this.isStandardRoom; + } + + + public boolean isFirstCharge() { + return code.equals("FIRST_CHARGE"); + } + + public boolean isSeizeTreasure() { + return code.equals("SEIZE_TREASURE"); + } + + public boolean isFindLove() { + return code.equals("FIND_LOVE"); + + }public boolean isJoyPlay() { + return code.equals("JOYPLAY"); + } + + public boolean isLeadercc() { + return code.equals("LEADERCC"); + } + + public boolean isNauticalAdventure() { + return code.equals("NAUTICAL_ADVENTURE"); + } + + public boolean isBaiShunGame() { + return code.equals("BAISHUN"); + } + + public boolean isLuckyBag() { + return code.equals("LUCKY_BAG"); + } + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/GiftValueModel.java b/core/src/main/java/com/chwl/core/room/giftvalue/GiftValueModel.java new file mode 100644 index 0000000..26e9cf9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/GiftValueModel.java @@ -0,0 +1,147 @@ +package com.chwl.core.room.giftvalue; + +import com.google.gson.JsonElement; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.JavaUtil; + +import io.reactivex.Single; +import retrofit2.http.DELETE; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + + +/** + * create by lvzebiao @2019/4/12 + */ +public class GiftValueModel extends BaseModel implements IGiftValueModel { + + /** + * 这个值,用于标识版本号,每次比较,取大值 + */ + private long currentTimeVersion; + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final GiftValueModel INSTANCE = new GiftValueModel(); + } + + public static GiftValueModel get() { + return Helper.INSTANCE; + } + + /** + * 开关礼物值 + * + * @param isOpen ture为开启 + */ + @Override + public Single openGiftValue(boolean isOpen) { + long roomUid = AvRoomDataManager.get().getRoomUid(); + Single> single; + if (isOpen) { + single = api.open(roomUid); + } else { + single = api.close(roomUid); + } + return single.compose(RxHelper.handleIgnoreData()); + } + + /** + * 上麦 更新缓存 + */ + @Override + public Single upMic(long micUid, int position) { + return api.upMic(AvRoomDataManager.get().getRoomUid(), + micUid, position,AvRoomDataManager.get().isShowGiftValue()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 下麦 更新缓存 + */ + @Override + public Single downMic(int position, String downMicUid) { + return api.downMic(AvRoomDataManager.get().getRoomUid(), + JavaUtil.str2long(downMicUid), position) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single getAll() { + return api.getAll(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleCommon()); + } + + /** + * 清除礼物值 + */ + @Override + public Single clearSingleMicValue(long micUid) { + return api.clearSingleMicValue(AvRoomDataManager.get().getRoomUid(), micUid) + .compose(RxHelper.handleCommon()); + } + + @Override + public long getCurrentTimeVersion() { + return currentTimeVersion; + } + + @Override + public void setCurrentTimeVersion(long currentTimeVersion) { + this.currentTimeVersion = currentTimeVersion; + } + + interface Api { + + @FormUrlEncoded + @POST("/room/gift/value/open") + Single> open(@Field("roomUid") long roomUid); + + @FormUrlEncoded + @POST("/room/gift/value/close") + Single> close(@Field("roomUid") long roomUid); + + /** + * 上麦,通知缓存变更 + */ + @FormUrlEncoded + @POST("/room/gift/value/up/mic") + Single> upMic(@Field("roomUid") long roomUid, + @Field("micUid") long micUid, + @Field("position") int position, + @Field("showGiftValue") boolean showGiftValue); + + /** + * 下麦,通知缓存变更 + */ + @FormUrlEncoded + @POST("/room/gift/value/down/mic") + Single> downMic(@Field("roomUid") long roomUid, + @Field("micUid") long micUid, + @Field("position") int position); + + /** + * 获取房间所有麦序用户礼物值 + */ + @GET("/room/gift/value/get") + Single> getAll(@Query("roomUid") long roomUid); + + /** + * 清除礼物值 + */ + @DELETE("/room/gift/value/clean") + Single> clearSingleMicValue(@Query("roomUid") long roomUid, + @Query("micUid") long micUid); + + } +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/IGiftValueModel.java b/core/src/main/java/com/chwl/core/room/giftvalue/IGiftValueModel.java new file mode 100644 index 0000000..b155c21 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/IGiftValueModel.java @@ -0,0 +1,41 @@ +package com.chwl.core.room.giftvalue; + +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; + +import io.reactivex.Single; + +/** + * 麦上礼物值 + * create by lvzebiao @2019/4/12 + */ +public interface IGiftValueModel { + + /** + * 开关礼物值 + * + * @param isOpen ture为开启 + */ + Single openGiftValue(boolean isOpen); + + /** + * 上麦 更新缓存 + */ + Single upMic(long micUid, int position); + + /** + * 下麦 更新缓存 + */ + Single downMic(int position, String downMicUid); + + long getCurrentTimeVersion(); + + void setCurrentTimeVersion(long currentTimeVersion); + + Single getAll(); + + /** + * 清除礼物值 + */ + Single clearSingleMicValue(long micUid); + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueCommonUpdate.java b/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueCommonUpdate.java new file mode 100644 index 0000000..f2b16ba --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueCommonUpdate.java @@ -0,0 +1,112 @@ +package com.chwl.core.room.giftvalue.bean; + +import com.chwl.core.gift.GiftModel; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.bean.LuckyBagGifts; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; + +import lombok.Data; + +/** + * 魔法礼物 普通礼物的一个通用转化 + * create by lvzebiao @2019/4/26 + */ +@Data +public class GiftValueCommonUpdate { + + private boolean isGoldGift; + + private RoomGiftValue roomGiftValue; + + public static GiftValueCommonUpdate transformMagic(RoomGiftValue magicGiftValue) { + if (magicGiftValue == null) { + return null; + } + GiftValueCommonUpdate giftValueCommonUpdate = new GiftValueCommonUpdate(); + giftValueCommonUpdate.setGoldGift(true); + RoomGiftValue roomGiftValue = new RoomGiftValue(); + roomGiftValue.setGiftValueVos(magicGiftValue.getGiftValueVos()); + roomGiftValue.setCurrentTime(magicGiftValue.getCurrentTime()); + giftValueCommonUpdate.setRoomGiftValue(roomGiftValue); + return giftValueCommonUpdate; + } + + public static GiftValueCommonUpdate transformGift(GiftReceiveInfo giftReceiveInfo) { + if (giftReceiveInfo == null) { + return null; + } + GiftValueCommonUpdate giftValueCommonUpdate = new GiftValueCommonUpdate(); + GiftInfo gift = giftReceiveInfo.getGift(); + if (gift == null) { + gift = GiftModel.get().findGiftInfoById(giftReceiveInfo.getGiftId()); + } + if (gift != null) { + giftValueCommonUpdate.setGoldGift(gift.getConsumeType() == GiftInfo.CONSUME_TYPE_GOLD || gift.getConsumeType() == GiftInfo.CONSUME_TYPE_FREE_GIFT); + } + RoomGiftValue roomGiftValue = new RoomGiftValue(); + roomGiftValue.setGiftValueVos(giftReceiveInfo.getGiftValueVos()); + roomGiftValue.setCurrentTime(giftReceiveInfo.getCurrentTime()); + giftValueCommonUpdate.setRoomGiftValue(roomGiftValue); + return giftValueCommonUpdate; + } + + public static GiftValueCommonUpdate transformGift(MultiGiftReceiveInfo multiGiftReceiveInfo) { + if (multiGiftReceiveInfo == null) { + return null; + } + GiftValueCommonUpdate giftValueCommonUpdate = new GiftValueCommonUpdate(); + GiftInfo gift = multiGiftReceiveInfo.getGift(); + if (gift == null) { + gift = GiftModel.get().findGiftInfoById(multiGiftReceiveInfo.getGiftId()); + } + if (gift != null) { + giftValueCommonUpdate.setGoldGift(gift.getConsumeType() == GiftInfo.CONSUME_TYPE_GOLD || gift.getConsumeType() == GiftInfo.CONSUME_TYPE_FREE_GIFT); + } + RoomGiftValue roomGiftValue = new RoomGiftValue(); + roomGiftValue.setGiftValueVos(multiGiftReceiveInfo.getGiftValueVos()); + roomGiftValue.setCurrentTime(multiGiftReceiveInfo.getCurrentTime()); + giftValueCommonUpdate.setRoomGiftValue(roomGiftValue); + return giftValueCommonUpdate; + } + + public static GiftValueCommonUpdate transformGift(GiftMultiReceiverInfo giftMultiReceiverInfo) { + if (giftMultiReceiverInfo == null) { + return null; + } + GiftValueCommonUpdate giftValueCommonUpdate = new GiftValueCommonUpdate(); + GiftInfo gift = giftMultiReceiverInfo.getGift(); + if (gift == null) { + gift = GiftModel.get().findGiftInfoById(giftMultiReceiverInfo.getGiftId()); + } + if (gift != null) { + giftValueCommonUpdate.setGoldGift(gift.getConsumeType() == GiftInfo.CONSUME_TYPE_GOLD || gift.getConsumeType() == GiftInfo.CONSUME_TYPE_FREE_GIFT); + } + RoomGiftValue roomGiftValue = new RoomGiftValue(); + roomGiftValue.setGiftValueVos(giftMultiReceiverInfo.getGiftValueVos()); + roomGiftValue.setCurrentTime(giftMultiReceiverInfo.getCurrentTime()); + giftValueCommonUpdate.setRoomGiftValue(roomGiftValue); + return giftValueCommonUpdate; + } + + public static GiftValueCommonUpdate transformGift(LuckyBagGifts multiLuckyGiftReceiveInfo) { + if (multiLuckyGiftReceiveInfo == null) { + return null; + } + GiftValueCommonUpdate giftValueCommonUpdate = new GiftValueCommonUpdate(); + GiftInfo gift = multiLuckyGiftReceiveInfo.getDisplayGift().get(0); + if (gift == null) { + gift = GiftModel.get().findGiftInfoById(multiLuckyGiftReceiveInfo.getGiftId()); + } + if (gift != null) { + giftValueCommonUpdate.setGoldGift(gift.getConsumeType() == GiftInfo.CONSUME_TYPE_GOLD || gift.getConsumeType() == GiftInfo.CONSUME_TYPE_FREE_GIFT); + } + RoomGiftValue roomGiftValue = new RoomGiftValue(); + roomGiftValue.setGiftValueVos(multiLuckyGiftReceiveInfo.getGiftValueVos()); + roomGiftValue.setCurrentTime(multiLuckyGiftReceiveInfo.getCurrentTime()); + giftValueCommonUpdate.setRoomGiftValue(roomGiftValue); + return giftValueCommonUpdate; + } + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueData.java b/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueData.java new file mode 100644 index 0000000..47b639c --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueData.java @@ -0,0 +1,88 @@ +package com.chwl.core.room.giftvalue.bean; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; + +import com.chwl.core.manager.AvRoomDataManager; + +import lombok.Data; + +/** + * create by lvzebiao @2019/4/4 + */ +@Data +public class GiftValueData { + + private Observer showObserver; + + private Observer valueObserver; + + private Observer headWearObserver; + + private MutableLiveData ldValue = new MutableLiveData<>(); + + private MutableLiveData ldShow = new MutableLiveData<>(); + + private MutableLiveData ldHeadWear = new MutableLiveData<>(); + + public GiftValueData() { + ldValue.setValue(0L); + ldShow.setValue(AvRoomDataManager.get().isShowGiftValue()); + ldHeadWear.setValue(0); + } + + public void removeObserver() { + if (showObserver != null) { + ldShow.removeObserver(showObserver); + showObserver = null; + } + if (valueObserver != null) { + ldValue.removeObserver(valueObserver); + valueObserver = null; + } + if (headWearObserver != null) { + ldHeadWear.removeObserver(headWearObserver); + headWearObserver = null; + } + } + + public void updateValue(long newValue) { + if (ldValue == null) { + ldValue = new MutableLiveData<>(); + } + if (ldValue.getValue() == null) { + ldValue.setValue(0L); + return; + } + if (newValue != ldValue.getValue()) { + ldValue.setValue(newValue); + } + } + + public void updateShow(boolean show) { + if (ldShow == null) { + ldShow = new MutableLiveData<>(); + } + if (ldShow.getValue() == null) { + ldShow.setValue(show); + return; + } + if (ldShow.getValue() != show) { + ldShow.setValue(show); + } + } + + public void updateHeadWear(int type) { + if (ldHeadWear == null) { + ldHeadWear = new MutableLiveData<>(); + } + if (ldHeadWear.getValue() == null) { + ldHeadWear.setValue(type); + return; + } + if (ldHeadWear.getValue() != type) { + ldHeadWear.setValue(type); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueNetData.java b/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueNetData.java new file mode 100644 index 0000000..d08a463 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/bean/GiftValueNetData.java @@ -0,0 +1,11 @@ +package com.chwl.core.room.giftvalue.bean; + +import lombok.Data; + +/** + * 礼物值的网络数据 + * create by lvzebiao @2019/4/12 + */ +@Data +public class GiftValueNetData { +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/bean/IndexGiftValue.java b/core/src/main/java/com/chwl/core/room/giftvalue/bean/IndexGiftValue.java new file mode 100644 index 0000000..b973065 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/bean/IndexGiftValue.java @@ -0,0 +1,18 @@ +package com.chwl.core.room.giftvalue.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 礼物值 + * create by lvzebiao @2019/4/12 + */ +@Data +public class IndexGiftValue implements Serializable { + + private long uid; + + private long giftValue; + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/bean/RoomGiftValue.java b/core/src/main/java/com/chwl/core/room/giftvalue/bean/RoomGiftValue.java new file mode 100644 index 0000000..8a6b367 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/bean/RoomGiftValue.java @@ -0,0 +1,22 @@ +package com.chwl.core.room.giftvalue.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * 房间礼物值信息 + * 此文件被魔法礼物自定义消息继承,改动慎重 + * create by lvzebiao @2019/4/15 + */ +@Getter +@Setter +public class RoomGiftValue implements Serializable { + + private long currentTime; + + private List giftValueVos; + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueFormat.java b/core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueFormat.java new file mode 100644 index 0000000..e256810 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueFormat.java @@ -0,0 +1,21 @@ +package com.chwl.core.room.giftvalue.helper; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +/** + * create by lvzebiao @2019/4/12 + */ +public class GiftValueFormat { + + public static String longToString(long value) { + if (value < 100 * 10000L) { + return String.valueOf(value); + } + if (value >= 10000 * 10000) { + return ResUtil.getString(R.string.giftvalue_helper_giftvalueformat_01); + } + long wanValue = value / 10000L; + return wanValue + ResUtil.getString(R.string.giftvalue_helper_giftvalueformat_02); + } + +} diff --git a/core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueMrg.java b/core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueMrg.java new file mode 100644 index 0000000..0e0d28d --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/giftvalue/helper/GiftValueMrg.java @@ -0,0 +1,525 @@ +package com.chwl.core.room.giftvalue.helper; + +import android.annotation.SuppressLint; +import android.os.Handler; +import android.text.TextUtils; +import android.util.LongSparseArray; +import android.util.SparseArray; + +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.orhanobut.logger.Logger; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.im.custom.bean.RoomGiftValueAttachment; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.room.giftvalue.GiftValueModel; +import com.chwl.core.room.giftvalue.bean.GiftValueCommonUpdate; +import com.chwl.core.room.giftvalue.bean.GiftValueData; +import com.chwl.core.room.giftvalue.bean.IndexGiftValue; +import com.chwl.core.room.giftvalue.bean.RoomGiftValue; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.utils.JavaUtil; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.TreeMap; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; + +/** + * 礼物值的管理单独出来 + * create by lvzebiao @2019/4/12 + */ +public class GiftValueMrg { + + private static final class Helper { + public static final GiftValueMrg INSTANCE = new GiftValueMrg(); + } + + /** + * 用于标记重连的时刻,防止接口连续调用 + */ + private long reConnectTimeFlag = 0; + + public static GiftValueMrg get() { + return Helper.INSTANCE; + } + + public void clearObsever() { + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (mMicQueueMemberMap == null) { + return; + } + //清除所有观察者 + for (int i = 0; i < mMicQueueMemberMap.size(); i++) { + RoomQueueInfo info = mMicQueueMemberMap.valueAt(i); + if (info == null || info.giftValueData == null) { + continue; + } + info.giftValueData.removeObserver(); + info.giftValueData.updateValue(0L); + info.giftValueData.updateHeadWear(0); + } + } + + /** + * 开关礼物值的,处理数据,映射到View展示 + */ + public void openOrCloseGiftValue() { + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (mMicQueueMemberMap == null) { + return; + } + int size = mMicQueueMemberMap.size(); + boolean showGiftValue = AvRoomDataManager.get().isShowGiftValue(); + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo != null && roomQueueInfo.giftValueData != null) { + roomQueueInfo.giftValueData.getLdShow().setValue(showGiftValue); + //每次开关礼物值,都清除礼物值 + roomQueueInfo.giftValueData.getLdValue().setValue(0L); + roomQueueInfo.giftValueData.getLdHeadWear().setValue(0); + } + } + } + + + public void updateMicQueueCharm(GiftValueCommonUpdate giftValueCommonUpdate) { + if (giftValueCommonUpdate == null) { + return; + } + if (!AvRoomDataManager.get().isShowGiftValue()) { + return; + } + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (mMicQueueMemberMap == null) { + return; + } + if (!giftValueCommonUpdate.isGoldGift()) { + //不是钻石礼物就返回 + return; + } + RoomGiftValue roomGiftValue = giftValueCommonUpdate.getRoomGiftValue(); + if (roomGiftValue == null || ListUtils.isListEmpty(roomGiftValue.getGiftValueVos())) { + return; + } + if (roomGiftValue.getCurrentTime() >= GiftValueModel.get().getCurrentTimeVersion()) { + GiftValueModel.get().setCurrentTimeVersion(roomGiftValue.getCurrentTime()); + } else { + return; + } + + updateAllMicGiftValue(roomGiftValue.getGiftValueVos()); + + } + + /** + * 更新房间礼物值 + * + * @param roomGiftValue + * @param considerTime 是否需要考虑缓存时间 + */ + public void updateRoomGiftValue(RoomGiftValue roomGiftValue, boolean considerTime) { + if (roomGiftValue == null) { + return; + } + if (considerTime) { + if (roomGiftValue.getCurrentTime() > GiftValueModel.get().getCurrentTimeVersion()) { + GiftValueModel.get().setCurrentTimeVersion(roomGiftValue.getCurrentTime()); + } else { + //缓存版本过低,忽略 + return; + } + } else { + GiftValueModel.get().setCurrentTimeVersion(roomGiftValue.getCurrentTime()); + } + updateAllMicGiftValueByMsg(roomGiftValue); + } + + public void updateAllMicGiftValueByMsg(RoomGiftValue roomGiftValue) { + if (roomGiftValue == null) { + return; + } + List giftValueVos = roomGiftValue.getGiftValueVos(); + if (ListUtils.isListEmpty(giftValueVos)) { + return; + } + SparseArray array = AvRoomDataManager.get().mMicQueueMemberMap; + + if (array == null) { + return; + } + GiftValueModel.get().setCurrentTimeVersion(roomGiftValue.getCurrentTime()); + LongSparseArray giftValueArray = new LongSparseArray<>(); + for (IndexGiftValue index : giftValueVos) { + giftValueArray.put(index.getUid(), index.getGiftValue()); + } + + LongSparseArray arrayAllMicList = new LongSparseArray<>(); + Map map = new TreeMap<>(); + //遍历麦序,将礼物值填入麦序信息中 + for (int i = 0; i < array.size(); i++) { + RoomQueueInfo roomQueueInfo = array.valueAt(i); + int key = array.keyAt(i); + if (roomQueueInfo != null) { + if (roomQueueInfo.mChatRoomMember != null) { + long micUid = JavaUtil.str2long(roomQueueInfo.mChatRoomMember.getAccount()); + if (roomQueueInfo.giftValueData == null) { + roomQueueInfo.giftValueData = new GiftValueData(); + } + long value = giftValueArray.get(micUid, -1L); + if (value >= 0) { + roomQueueInfo.giftValueData.updateValue(value); + } + if (roomQueueInfo.giftValueData.getLdValue().getValue()!=null && roomQueueInfo.giftValueData.getLdValue().getValue() > 0){ + map.put(micUid, roomQueueInfo.giftValueData.getLdValue().getValue());// + } + } else if (key == -1 && AvRoomDataManager.get().isLeaveMode()) { // 离开模式礼物值变化 + long micUid = AvRoomDataManager.get().getRoomUid(); + if (roomQueueInfo.giftValueData == null) { + roomQueueInfo.giftValueData = new GiftValueData(); + } + long value = giftValueArray.get(micUid, -1L); + if (value >= 0) { + roomQueueInfo.giftValueData.updateValue(value); + } + } + } + } + +//这里将map.entrySet()转换成list + List> arraySortGiftValue = new ArrayList<>(map.entrySet()); + //然后通过比较器来实现排序 + //升序排序 + Collections.sort(arraySortGiftValue, (o1, o2) -> o1.getValue().compareTo(o2.getValue())); + + if (arraySortGiftValue.size() <= 0)return; + for(Map.Entry mapping:arraySortGiftValue){ + arrayAllMicList.put(mapping.getKey(),mapping.getValue()); + } + if (arraySortGiftValue.size() <= 0)return; + if (arraySortGiftValue.size() == 1){ + Map.Entry maxEntry = arraySortGiftValue.get(0); + long maxUid = maxEntry.getKey(); + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,maxUid,maxUid); + }else if (arraySortGiftValue.size() == 2){ + Map.Entry minEntry = arraySortGiftValue.get(0); + Map.Entry maxEntry = arraySortGiftValue.get(1); + long minUid = minEntry.getKey(); + long maxUid = maxEntry.getKey(); + if (minEntry.getValue().equals(maxEntry.getValue())){ + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,0L,0L); + }else { + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,minUid,maxUid); + } + } else { + Map.Entry minEntry = arraySortGiftValue.get(0); + Map.Entry minSecondEntry = arraySortGiftValue.get(1); + Map.Entry maxEntry = arraySortGiftValue.get(arraySortGiftValue.size() -1); + Map.Entry maxSecondEntry = arraySortGiftValue.get(arraySortGiftValue.size() -2); + long minUid = minEntry.getKey(); + long maxUid = maxEntry.getKey(); + if (minEntry.getValue().equals(minSecondEntry.getValue()) && maxEntry.getValue().equals(maxSecondEntry.getValue())){ + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,0L,0L); + } else if (minEntry.getValue().equals(minSecondEntry.getValue()) && !maxEntry.getValue().equals(maxSecondEntry.getValue())){ + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,0L,maxUid); + } else if (maxEntry.getValue().equals(maxSecondEntry.getValue()) && !minEntry.getValue().equals(minSecondEntry.getValue())){ + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,minUid,0L); + } else { + updateHeadWear(arraySortGiftValue,array,arrayAllMicList,minUid,maxUid); + } + } + } + + private void updateHeadWear(List> arraySortGiftValue,SparseArray array,LongSparseArray arrayAllMicList, long minUid,long maxUid){ + for (int i = 0; i < array.size(); i++) { + RoomQueueInfo roomQueueInfo = array.valueAt(i); + if (roomQueueInfo != null && roomQueueInfo.giftValueData != null) { + GiftValueData giftValueData = roomQueueInfo.giftValueData; + //麦位信息为空不显示头饰 + if (roomQueueInfo.mChatRoomMember != null) { + //排序列表大于一并且麦位account等于最低魅力值account + if (arraySortGiftValue.size() > 1 && roomQueueInfo.mChatRoomMember.getAccount().equals(String.valueOf(minUid))){ + long minValue = arrayAllMicList.get(minUid, -1L); + if (minValue > 0){ + giftValueData.updateHeadWear(1); + }else { + giftValueData.updateHeadWear(0); + } + } else if (roomQueueInfo.mChatRoomMember.getAccount().equals(String.valueOf(maxUid))){ + long maxValue = arrayAllMicList.get(maxUid, -1L); + if (maxValue > 0){ + giftValueData.updateHeadWear(2); + } else { + giftValueData.updateHeadWear(0); + } + } else { + giftValueData.updateHeadWear(0); + } + }else { + giftValueData.updateHeadWear(0); + } + } + } + } + + private void updateAllMicGiftValue(List list) { + if (ListUtils.isListEmpty(list)) { + return; + } + LongSparseArray array = new LongSparseArray<>(); + for (IndexGiftValue index : list) { + array.put(index.getUid(), index.getGiftValue()); + } + //遍历麦序 + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (mMicQueueMemberMap == null) { + return; + } + + LongSparseArray arrayAllMicList = new LongSparseArray<>(); + Map map = new TreeMap<>(); + for (int i = 0; i < mMicQueueMemberMap.size(); i++) { + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.valueAt(i); + int key = mMicQueueMemberMap.keyAt(i); + //判断麦上有没有人 + //没人礼物值肯定是0 + if (roomQueueInfo != null && roomQueueInfo.giftValueData != null) { + GiftValueData giftValueData = roomQueueInfo.giftValueData; + if (roomQueueInfo.mChatRoomMember != null) { + long micUid = JavaUtil.str2long(roomQueueInfo.mChatRoomMember.getAccount()); + long newValue = array.get(micUid, -1L); + if (newValue >= 0){ + giftValueData.updateValue(newValue); + } + if (roomQueueInfo.giftValueData.getLdValue().getValue()!=null && roomQueueInfo.giftValueData.getLdValue().getValue() > 0){ + map.put(micUid, roomQueueInfo.giftValueData.getLdValue().getValue());// + } + } else { + if (AvRoomDataManager.get().isLeaveMode() && key == -1) { // 离开模式礼物值变化 + long micUid = AvRoomDataManager.get().getRoomUid(); + long newValue = array.get(micUid, -1L); + if (newValue >= 0){ + giftValueData.updateValue(newValue); + } + } else{ + giftValueData.updateValue(0); + } + } + } + } + + //这里将map.entrySet()转换成list + List> arraySortGiftValue = new ArrayList<>(map.entrySet()); + //然后通过比较器来实现排序 + //升序排序 + Collections.sort(arraySortGiftValue, (o1, o2) -> o1.getValue().compareTo(o2.getValue())); + + if (arraySortGiftValue.size() <= 0)return; + for(Map.Entry mapping:arraySortGiftValue){ + arrayAllMicList.put(mapping.getKey(),mapping.getValue()); + } + if (arraySortGiftValue.size() <= 0)return; + if (arraySortGiftValue.size() == 1){ + Map.Entry maxEntry = arraySortGiftValue.get(0); + long maxUid = maxEntry.getKey(); + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,maxUid,maxUid); + }else if (arraySortGiftValue.size() == 2){ + Map.Entry minEntry = arraySortGiftValue.get(0); + Map.Entry maxEntry = arraySortGiftValue.get(1); + long minUid = minEntry.getKey(); + long maxUid = maxEntry.getKey(); + if (minEntry.getValue().equals(maxEntry.getValue())){ + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,0L,0L); + }else { + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,minUid,maxUid); + } + } else { + Map.Entry minEntry = arraySortGiftValue.get(0); + Map.Entry minSecondEntry = arraySortGiftValue.get(1); + Map.Entry maxEntry = arraySortGiftValue.get(arraySortGiftValue.size() -1); + Map.Entry maxSecondEntry = arraySortGiftValue.get(arraySortGiftValue.size() -2); + long minUid = minEntry.getKey(); + long maxUid = maxEntry.getKey(); + if (minEntry.getValue().equals(minSecondEntry.getValue()) && maxEntry.getValue().equals(maxSecondEntry.getValue())){ + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,0L,0L); + } else if (minEntry.getValue().equals(minSecondEntry.getValue()) && !maxEntry.getValue().equals(maxSecondEntry.getValue())){ + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,0L,maxUid); + } else if (maxEntry.getValue().equals(maxSecondEntry.getValue()) && !minEntry.getValue().equals(minSecondEntry.getValue())){ + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,minUid,0L); + } else { + updateHeadWear(arraySortGiftValue,mMicQueueMemberMap,arrayAllMicList,minUid,maxUid); + } + } + } + + + public void handleDownMic(int micPosition, String account) { + if (!AvRoomDataManager.get().isShowGiftValue()) { + return; + } + updateByPos(micPosition, 0L); + } + + public void requestDownMic(int micPosition, String downMicUid) { + if (!AvRoomDataManager.get().isShowGiftValue()) { + return; + } + + if (!TextUtils.isEmpty(downMicUid)) { + GiftValueModel.get().downMic(micPosition, downMicUid).subscribe(); + } + } + + /** + * 上麦 + * @param micPosition + * @param upMicUid + */ + public void requestUpMic(int micPosition, String upMicUid) { + if (!TextUtils.isEmpty(upMicUid)) { + GiftValueModel.get().upMic(JavaUtil.str2long(upMicUid), micPosition) .subscribe(new DontWarnObserver() { + @Override + public void acceptThrowable(RoomGiftValue values, Throwable throwable) { + super.acceptThrowable(values, throwable); + sendRoomGiftValueMsg(values); + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + updateAllMicGiftValueByMsg(values); + } + }, 1200); + } + }); + } + } + + public void updateByPos(int micPosition, long newValue) { + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + if (mMicQueueMemberMap == null) { + return; + } + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(micPosition); + if (roomQueueInfo != null && roomQueueInfo.giftValueData != null) { + roomQueueInfo.giftValueData.updateValue(newValue); + roomQueueInfo.giftValueData.updateHeadWear((int) newValue); + } + } + + /** + * 挤下麦的情况 + */ + public void handleDownCrowdedMic(int micPosition, String account) { + if (!AvRoomDataManager.get().isShowGiftValue()) { + return; + } + if (Objects.equals(account, String.valueOf(AuthModel.get().getCurrentUid()))) { + GiftValueModel.get().downMic(micPosition, String.valueOf(AuthModel.get().getCurrentUid())).subscribe(); + } + } + + public void updateRoomGiftValue(boolean isNeedSendRoomMsg) { + if (!AvRoomDataManager.get().isShowGiftValue()) { + return; + } + GiftValueModel.get().getAll() + .doOnSuccess(roomGiftValue -> { + if (!isNeedSendRoomMsg) { + return; + } + sendRoomGiftValueMsg(roomGiftValue); + }) + .subscribe(new DontWarnObserver() { + @Override + public void acceptThrowable(RoomGiftValue roomGiftValue, Throwable throwable) { + super.acceptThrowable(roomGiftValue, throwable); + updateAllMicGiftValueByMsg(roomGiftValue); + } + }); + } + + /** + * 发房间礼物值的同步消息 + * + * @param roomGiftValue 礼物值 + */ + public void sendRoomGiftValueMsg(RoomGiftValue roomGiftValue) { + if (!AvRoomDataManager.get().isShowGiftValue()) { + return; + } + RoomGiftValueAttachment attachment = new RoomGiftValueAttachment(); + attachment.setRoomGiftValue(roomGiftValue); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(AvRoomDataManager.get().getRoomId()), + attachment); + IMNetEaseManager.get().sendChatRoomMessage(message, new CallBack() { + @Override + public void onSuccess(ChatRoomMessage data) { + } + + @Override + public void onFail(int code, String error) { + Logger.e("onFail, " + code + ", " + error); + } + }); + } + + @SuppressLint("CheckResult") + public void handleReconnect(boolean isNeedNoticeOthers) { + long currTime = System.currentTimeMillis(); + if (currTime - reConnectTimeFlag < 5 * 1000) { + return; + } + reConnectTimeFlag = currTime; + //延迟5s再访问,等上下麦完成后,再调用接口 + //noinspection ResultOfMethodCallIgnored + Single.timer(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + @Override + public void accept(Long aLong) throws Exception { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return; + } + GiftValueModel.get().getAll() + .subscribe(new DontWarnObserver() { + @Override + public void acceptThrowable(RoomGiftValue roomGiftValue, Throwable throwable) { + super.acceptThrowable(roomGiftValue, throwable); + updateAllMicGiftValueByMsg(roomGiftValue); + if (!isNeedNoticeOthers) { + return; + } + //通知房间其他人 + RoomGiftValueAttachment attachment = new RoomGiftValueAttachment(); + attachment.setRoomGiftValue(roomGiftValue); + ChatRoomMessage message = ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(AvRoomDataManager.get().getRoomId()), + attachment); + IMNetEaseManager.get().sendChatRoomMessage(message, new CallBack() { + @Override + public void onSuccess(ChatRoomMessage data) { + } + + @Override + public void onFail(int code, String error) { + } + }); + } + }); + } + }); + + } + +} diff --git a/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java b/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java new file mode 100644 index 0000000..af1a2f1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/AvRoomModel.java @@ -0,0 +1,748 @@ +package com.chwl.core.room.model; + +import android.annotation.SuppressLint; +import android.text.TextUtils; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.car.bean.CarInfo; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.home.bean.HomeRoomInfo; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.patriarch.exception.PmRoomLimitException; +import com.chwl.core.room.activitytimer.ActivityTimerEvent; +import com.chwl.core.room.activitytimer.TimerBean; +import com.chwl.core.room.bean.BroadcastInfo; +import com.chwl.core.room.bean.RoomIcon; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomResult; +import com.chwl.core.room.bean.RoomWelcomeConfig; +import com.chwl.core.room.bean.SearchRoomInfo; +import com.chwl.core.room.bean.SimplePartyRoomInfo; +import com.chwl.core.room.event.RoomInfoEvent; +import com.chwl.core.room.giftvalue.helper.GiftValueMrg; +import com.chwl.core.room.model.inteface.IAvRoomModel; +import com.chwl.core.room.pk.model.PkModel; +import com.chwl.core.super_admin.bean.KickOutExtBean; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.FirstChargeInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.utils.JavaUtil; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.netease.nimlib.sdk.AbortableFuture; +import com.netease.nimlib.sdk.NIMChatRoomSDK; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.RequestCallbackWrapper; +import com.netease.nimlib.sdk.ResponseCode; +import com.netease.nimlib.sdk.chatroom.ChatRoomService; +import com.netease.nimlib.sdk.chatroom.constant.MemberQueryType; +import com.netease.nimlib.sdk.chatroom.constant.MemberType; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomData; +import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum; +import com.orhanobut.logger.Logger; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +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.functions.Consumer; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.schedulers.Schedulers; + +/** + *

房间网络数据操作

+ * + * @author jiahui + * @date 2017/12/11 + */ +public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { + + private static volatile AvRoomModel instance; + + private AvRoomModel() { + } + + public static AvRoomModel get() { + if (instance == null) { + synchronized (AvRoomModel.class) { + if (instance == null) { + instance = new AvRoomModel(); + } + } + } + return instance; + } + + private Map toMap(Map map, String namePlateWord, String namePlatePic) { + if (map == null) { + map = new HashMap<>(); + } + map.put(UserInfo.NAMEPLATE_WORD, namePlateWord); + map.put(UserInfo.NAMEPLATE_PIC, namePlatePic); + + return map; + } + + + /** + * 进入云信聊天室 + * + * @param roomId + * @param retryCount 重试次数 + * @return + */ + @Override + public Observable enterRoom(final long roomId, final int retryCount, final int fromType, final String fromNick, final String fromUid) { + return Observable.create((ObservableOnSubscribe) e -> { + EnterChatRoomData enterChatRoomData = new EnterChatRoomData(String.valueOf(roomId)); + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo == null) { + e.onError(new Throwable("userInfo is null")); + return; + } + NobleInfo nobleInfo = userInfo.getNobleInfo(); + HeadWearInfo headWearInfo = userInfo.getUserHeadwear(); + UserLevelVo userLevelVo = userInfo.getUserLevelVo(); + CarInfo carInfo = userInfo.getCarInfo(); + Map map = new HashMap<>(1); + Map valueMap = userInfo.toMap(null, userInfo); + + valueMap.put("fromType", fromType); + valueMap.put("fromNick", fromNick); + valueMap.put("fromUid", fromUid); + + if (userLevelVo != null) { + valueMap = userLevelVo.toMap((nobleInfo != null && nobleInfo.getLevel() > 0) ? nobleInfo.toMap(valueMap) : valueMap); + valueMap.put("experLevelSeq", userLevelVo.getExperLevelSeq()); + } + if (carInfo != null) { + valueMap = carInfo.toMap(valueMap, carInfo); + } + + valueMap = toMap(valueMap, userInfo.getNameplateWord(), userInfo.getNameplatePic()); + + //多个判断,头饰不过期才传pic + if (headWearInfo != null && headWearInfo.getStatus() == HeadWearInfo.STATUS_IN_USED) { + valueMap = headWearInfo.toMap(valueMap); + } + + valueMap.put(SuperAdminUtil.PLATFORM_ROLE, userInfo.getPlatformRole()); + + if (valueMap.size() > 0) { + map.put(String.valueOf(userInfo.getUid()), valueMap); + } + if (map.size() > 0) + enterChatRoomData.setExtension(map); + + AbortableFuture enterChatRoomEx = + NIMChatRoomSDK.getChatRoomService().enterChatRoomEx(enterChatRoomData, retryCount); + enterChatRoomEx.setCallback(new RequestCallback() { + + @Override + public void onSuccess(EnterChatRoomResultData param) { + e.onNext(param); + e.onComplete(); + } + + @Override + public void onFailed(int code) { + e.onError(new Throwable(String.valueOf(code))); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + }).subscribeOn(Schedulers.computation()) + .unsubscribeOn(Schedulers.computation()); + } + + /** + * 离开聊天室(退出房间) + */ + @Override + public void quitRoom(String roomId) { + if (!TextUtils.isEmpty(roomId)) { + NIMChatRoomSDK.getChatRoomService().exitChatRoom(roomId); + AvRoomDataManager.get().release(); + } + } + + /** + * 退出房间 + */ + @SuppressLint("CheckResult") + @Override + public void exitRoom(CallBack callBack) { + RoomInfo currentRoom = AvRoomDataManager.get().mCurrentRoomInfo; + long uid = AuthModel.get().getCurrentUid(); + // 退出房间 这里要清理调退出房间的PK 队员 + PkModel.get().onTeamMemberExitRoom(String.valueOf(uid)); + + //退出房间的时候取消报名 + if (AvRoomDataManager.get().isQueuingMicro() && AvRoomDataManager.get().myIsInQueue) { + MicQueueModel.get().cancelApplyForQueuing().subscribe(); + } + if (AvRoomDataManager.get().isOpenPKMode() && AvRoomDataManager.get().myIsInQueue) { + PkModel.get().leavePKMicQueue().subscribe(); + } + if (AvRoomDataManager.get().isCpRoom() && AvRoomDataManager.get().isRoomOwner()) { + AvRoomModel.get().quitRoomForOurService(null); + } + //礼物值 + if (AvRoomDataManager.get().isShowGiftValue() && AvRoomDataManager.get().isOwnerOnMic()) { + int micPos = AvRoomDataManager.get().getMicPosition(AuthModel.get().getCurrentUid()); + GiftValueMrg.get().requestDownMic(micPos, String.valueOf(AuthModel.get().getCurrentUid())); + } + if (currentRoom == null) { + String errorMsg = ResUtil.getString(R.string.room_model_avroommodel_01); + callBack.onFail(0, errorMsg); + return; + } + + String roomId = String.valueOf(currentRoom.getRoomId()); + + if (currentRoom.getUid() == uid) { + //开房间统计事件结束 + Map attributes = new HashMap<>(2); + attributes.put("roomType", currentRoom.getType() + ""); + attributes.put("roomUid", currentRoom.getUid() + ""); + + //埋点统计用户上麦时长 + if (AvRoomDataManager.get().isOwnerOnMic()) { + Map attr = new HashMap<>(2); + attr.put("userUid", AuthModel.get().getCurrentUid() + ""); + attr.put("roomUid", currentRoom.getUid() + ""); + } + + } + //进入房间统计事件结束 + Map attributes = new HashMap<>(1); + attributes.put("roomUid", currentRoom.getUid() + ""); + + //发送退出房间事件 + IMNetEaseManager.get().getChatRoomEventObservable() + .onNext(new RoomEvent().setEvent(RoomEvent.ROOM_EXIT) + .setRoomInfo(currentRoom)); + + if (callBack != null) { + callBack.onSuccess(currentRoom); + } + quitUserRoomV2().subscribe(new DisposableObserver() { + @Override + public void onNext(String stringServiceResult) { + if (stringServiceResult != null) { + Logger.i(ResUtil.getString(R.string.room_model_avroommodel_05) + stringServiceResult); + } + } + + @Override + public void onError(Throwable e) { + Logger.i(ResUtil.getString(R.string.room_model_avroommodel_06) + e.getMessage()); + } + + @Override + public void onComplete() { + + } + }); + quitRoom(roomId); + } + + /** + * 通知服务端房间退出 + */ + @Override + public void quitRoomForOurService(CallBack callBack) { + quitRoomForOurService(AuthModel.get().getCurrentUid(), callBack); + } + + /** + * 通知服务端房间退出 + */ + @Override + public void quitRoomForOurService(long roomUid, CallBack callBack) { + String ticket = AuthModel.get().getTicket(); + execute(mRoomService.quiteRoomForOurService(String.valueOf(roomUid), ticket) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()), callBack); + } + + /** + * 告知服务端用户退出房间(贵族清除需要) + */ + @Override + public Observable> quitUserRoom() { + String uId = String.valueOf(AuthModel.get().getCurrentUid()); + String ticket = AuthModel.get().getTicket(); + String roomUid = String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId()); + return mRoomService.quitUserRoom(uId, ticket, roomUid) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 告知服务端用户退出房间(贵族清除需要) + */ + @Override + public Observable quitUserRoomV2() { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + long roomUid = AvRoomDataManager.get().mCurrentRoomInfo.getRoomId(); + String ticket = AuthModel.get().getTicket(); + return mRoomService.quitUserRoomV2(uid, roomUid, ticket) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.getCommonExceptionFunction()) + .flatMap(result -> { + if (result.isSuccess()) { + return Observable.just("quit room success"); + } + return Observable.error(RxHelper.createThrowable(result)); + }) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public void requestRoomInfoFromService(String uid, CallBack callBack) { + requestRoomInfoFromService(uid, 0, callBack); + } + + @Override + public Single requestRoomInfo(String uid) { + return mRoomService.getRoomInfo(uid, AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public Single requestRoomInfoByUser(String uid) { + return mRoomService.getRoomInfo(uid, JavaUtil.str2long(uid)) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public void requestRoomInfoFromService(String uid, int pageType, CallBack callBack) { + execute(mRoomService.getRoomInfo(uid, AuthModel.get().getCurrentUid()) + .timeout(10, TimeUnit.SECONDS) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .doOnSuccess(new Consumer() { + @Override + public void accept(RoomResult roomResult) throws Exception { + if (roomResult != null && roomResult.isSuccess() && roomResult.getData() != null) { + EventBus.getDefault().post(new RoomInfoEvent(pageType, roomResult.getData())); + } + } + }) + .observeOn(AndroidSchedulers.mainThread()), callBack); + } + + @Override + public Single> userRoomIn(String uid, long roomUid, int behaveType, int fromType, String inviteUid) { + return mRoomService.userRoomInV2(uid, AuthModel.get().getTicket(), + String.valueOf(roomUid), behaveType,fromType, inviteUid) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + @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, time, 200) + .setCallback(new RequestCallbackWrapper>() { + @Override + public void onResult(int i, List chatRoomMemberList, Throwable throwable) { + if (ListUtils.isListEmpty(chatRoomMemberList)) { + return; + } + + for (ChatRoomMember chatRoomMember : chatRoomMemberList) { + if (Objects.equals(chatRoomMember.getAccount(), String.valueOf(currentUid))) { + //自己 + AvRoomDataManager.get().mOwnerMember = chatRoomMember; + } + if (chatRoomMember.getMemberType() == MemberType.ADMIN) { + AvRoomDataManager.get().addAdminMember(chatRoomMember); + } + if (chatRoomMember.getMemberType() == MemberType.CREATOR) { + AvRoomDataManager.get().mRoomCreateMember = chatRoomMember; + } + if (chatRoomMember.isInBlackList()) { + AvRoomDataManager.get().addBlackMember(chatRoomMember); + } + } + AvRoomDataManager.get().mRoomFixedMemberList.addAll(chatRoomMemberList); + AvRoomDataManager.get().mRoomAllMemberList.addAll(chatRoomMemberList); + IMNetEaseManager.get().noticeManagerChange(); + int size = chatRoomMemberList.size(); + Logger.i(ResUtil.getString(R.string.room_model_avroommodel_07) + size); + if (size == 200) { + loadNormalChatMember(roomId, currentUid, chatRoomMemberList.get(size - 1).getUpdateTime()); + } else { + //先加载完固定成员,再加载游客 + loadGuestChatMember(roomId, 0); + } + } + }); + + } + + /** + * 该接口每次最多返回200个数据,做个分页加载 + * + * @param roomId 房间id + * @param time updateTime + */ + private void loadGuestChatMember(String roomId, long time) { + NIMChatRoomSDK.getChatRoomService() + .fetchRoomMembers(roomId, MemberQueryType.GUEST, time, 200) + .setCallback(new RequestCallbackWrapper>() { + @Override + public void onResult(int i, List chatRoomMemberList, Throwable throwable) { + if (ListUtils.isListEmpty(chatRoomMemberList)) { + return; + } + AvRoomDataManager.get().mRoomAllMemberList.addAll(chatRoomMemberList); + int size = chatRoomMemberList.size(); + Logger.i(ResUtil.getString(R.string.room_model_avroommodel_08) + size); + if (size == 200) { + loadGuestChatMember(roomId, chatRoomMemberList.get(size - 1).getUpdateTime()); + } + } + }); + } + + @Override + public Single>> roomSearch(String key, int type) { + return mRoomService.roomSearch(key, type) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single>> roomSearch(String key) { + return mRoomService.roomSearch(key) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getUserRoom(long uid) { + return mRoomService.getUserRoom(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()); + } + + + @Override + public Single> getLimitRoomInfo() { + return mRoomService.inRoomForParent(AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleRoomPmLimit()); + } + + + @Override + public Single requestRoomResult(String uid, int pageType) { + return mRoomService.getRoomInfo(uid, AuthModel.get().getCurrentUid()) + .timeout(60, TimeUnit.SECONDS) + .compose(RxHelper.handleSchAndExce()) + .doOnSuccess(roomResult -> { + if (roomResult != null && roomResult.isSuccess() && roomResult.getData() != null) { + EventBus.getDefault().post(new RoomInfoEvent(pageType, roomResult.getData())); + } + }) + .flatMap(roomResult -> { + if (roomResult.getCode() == PmRoomLimitException.ERROR_CODE) { + return Single.error(new PmRoomLimitException( + RxHelper.getValidMessage(roomResult))); + } + return Single.just(roomResult); + }); + } + + @Override + public Single requestRoomInfoV2(String uid, int pageType) { + return requestRoomResult(uid, pageType) + .compose(RxHelper.handleBeanData()); + } + + + /** + * 设置管理员/拉黑 + * 1: 设置为管理员;2:设置普通等级用户;-1:设为黑名单用户;-2:设为禁言用户 + */ + private Single setRole(long targetUid, int opt, boolean isSet, String notifyExt) { + return mRoomService.setChatRoomRole(AvRoomDataManager.get().getRoomUid(), + targetUid, opt, isSet, notifyExt) + .compose(RxHelper.handleIgnoreData()); + } + + /** + * 通知服务器 添加/ 移除管理员 + */ + public Single manageOpt(long uid, boolean isSet) { + return mRoomService.manageOpt(AvRoomDataManager.get().getRoomUid(), uid, isSet?1:2) + .compose(RxHelper.handleIgnoreData()); + } + + /** + * 超管拉黑 + * + * @param targetUid 被拉黑的uid + */ + @Override + public Single markBlack(long targetUid) { + KickOutExtBean bean = new KickOutExtBean(); + bean.setRole(1); + bean.setHandleUid(String.valueOf(AuthModel.get().getCurrentUid())); + return setRole(targetUid, -1, true, new Gson().toJson(bean)); + } + + /** + * 通过服务器接口移除拉黑 + * + * @param targetUid 被拉黑的uid + */ + @Override + public Single removeBlack(long targetUid) { + return setRole(targetUid, 1, false, null); + } + + @Override + public Single markManager(long targetUid, boolean isSet) { + return setRole(targetUid, 1, isSet, null); + } + + + @Override + public Single>> getPartyRoomList(long uid) { + return mRoomService.getPartyRoomList(uid).compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getRoomActTimer(long roomUid) { + return mRoomService.apiGetRoomActTimer(roomUid) + .compose(RxHelper.handleCommon()) + .doOnSuccess(timerBean -> EventBus.getDefault().post(new ActivityTimerEvent(timerBean))); + } + + @Override + public Single getWelcomeConfig(long toUid) { + 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()); + } + + @Override + public Single updateMicToken(String token) { + return mRoomService.updateMicToken(token) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getBroadcastConfig(int type) { + return mRoomService.getBroadcastConfig(type) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single sendRoomBroadcast(String msg, long roomId) { + return mRoomService.sendRoomBroadcast(msg, roomId) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single cleanScreen(long roomUid, long uid) { + return mRoomService.cleanScreen(roomUid, uid) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single> getRecommendRoomList(String roomId) { + return mRoomService.getRecommendRoomList(roomId) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getNextSingleRoomInfo() { + return mRoomService.getNextSingleRoomInfo(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getNewUserGift() { + return mRoomService.getNewUserGift(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getFirstCharge() { + return mRoomService.getFirstCharge(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single postFirstCharge() { + return mRoomService.postFirstCharge(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 公屏历史消息 + */ + @Override + public void loadMessageHistory(long startTime) { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + + if (roomInfo == null) return; + if (!roomInfo.isCloseScreen()) { + int count = 10; + InitInfo initInfo = InitialModel.get().getCacheInitInfo(); + if (initInfo != null) count = initInfo.getRoomMessageCount(); + int finalCount = count; + NIMClient.getService(ChatRoomService.class) + .pullMessageHistoryExType( + String.valueOf(roomInfo.getRoomId()), + startTime, + count, + startTime == 0 ? QueryDirectionEnum.QUERY_OLD : QueryDirectionEnum.QUERY_NEW, + new MsgTypeEnum[]{MsgTypeEnum.text, MsgTypeEnum.custom}) + .setCallback(new RequestCallbackWrapper>() { + @Override + public void onResult(int code, List result, Throwable exception) { + if (code == ResponseCode.RES_SUCCESS && result != null && result.size() > 0) { + // 过滤后的消息列表 + // TODO:过滤后消息数量大概率不符合预期展示数量,比如查到50条数据,经过筛选只有5条,但问了iOS目前只是简单这样处理,没有多次查询,所以暂且这样,保持一致。 + List newList = new ArrayList(); + for (int i = 0; i < result.size(); i++) { + ChatRoomMessage message = result.get(i); + if (message.getMsgType() == MsgTypeEnum.custom) { + MsgAttachment attachment = message.getAttachment(); + if (attachment instanceof CustomAttachment) { + // 找出相册消息 + if (((CustomAttachment) attachment).getFirst() == CustomAttachment.CUSTOM_MSG_ROOM_ALBUM) { + newList.add(message); + }else if (((CustomAttachment) attachment).getFirst() == CustomAttachment.ROOM_PIC_SCREEN_FIRST && ((CustomAttachment) attachment).getSecond() == CustomAttachment.ROOM_PIC_SCREEN_SECOND) { + newList.add(message); + } + } + } else { + // 普通text消息 + newList.add(message); + } + } + if (startTime != 0 && newList.size() >= finalCount) { + loadMessageHistory(0); + return; + } + if (startTime == 0) { + Collections.reverse(newList); + } + AvRoomDataManager.get().addChatRoomMessages(newList); + } + } + }); + } + } + + + /** + * 获取踢人列表 + * @return + */ + public Single> getKickList() { + return mRoomService.getKickList(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 踢人 + * @param uid + * @return + */ + public Single kickUser(long uid) { + return mRoomService.kickUser(AvRoomDataManager.get().getRoomUid(),uid) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + /** + * 获取房间玩法列表 + * + * @return + */ + public Single> getRoomGamePlayList() { + return mRoomService.getRoomGamePlay(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + +} diff --git a/core/src/main/java/com/chwl/core/room/model/HomePartyModel.java b/core/src/main/java/com/chwl/core/room/model/HomePartyModel.java new file mode 100644 index 0000000..55fe9e6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/HomePartyModel.java @@ -0,0 +1,316 @@ +package com.chwl.core.room.model; + +import android.text.TextUtils; +import android.util.SparseArray; + +import com.netease.nimlib.sdk.NIMChatRoomSDK; +import com.netease.nimlib.sdk.RequestCallbackWrapper; +import com.netease.nimlib.sdk.chatroom.constant.MemberQueryType; +import com.netease.nimlib.sdk.chatroom.constant.MemberType; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.orhanobut.logger.Logger; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.kick.KickModel; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.noble.NobleResourceType; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.room.model.inteface.IHomePartyModel; +import com.chwl.core.super_admin.util.SaAttachmentFactory; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.SingleToastUtil; + +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +/** + *

轟趴房model層:數據獲取

+ * + * @author jiahui + * @date 2017/12/8 + */ +public class HomePartyModel extends RoomBaseModel implements IHomePartyModel { + private final HomePartyService mHomePartyService; + + public HomePartyModel() { + mHomePartyService = RxNet.create(HomePartyService.class); + } + + /** + * 鎖坑 + */ + @Override + public Single lockMicroPhone(int micPosition, String roomUid, String ticker) { + return mHomePartyService.lockMicroPhone(micPosition, "1", roomUid, ticker, + AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon(() -> "")) + .doOnSuccess(s -> { + if (SuperAdminUtil.isSuperAdmin()) { + IMNetEaseManager.get() + .sendChatRoomMessage( + SaAttachmentFactory.createMuteOrLockChatRoomMessage( + micPosition, 2), false) + .doOnSuccess(chatRoomMessage -> + KickModel.get().onSendRoomMessageSuccess(chatRoomMessage)) + .subscribe(); + } + }); + } + + /** + * 釋放該麥坑的鎖 + * + * @param micPosition + */ + @Override + public Single unLockMicroPhone(int micPosition, String roomUid, String ticker) { + return mHomePartyService.lockMicroPhone(micPosition, "0", roomUid, ticker, + AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon(() -> "")); + } + + /** + * 更新麥序 + */ + @Override + public void updateMicQueue(final String roomId, final String key, String value) { + NIMChatRoomSDK.getChatRoomService() + .updateQueue(roomId, key, value) + .setCallback(new RequestCallbackWrapper() { + @Override + public void onResult(int i, Void aVoid, Throwable throwable) { + Logger.i("%1$s房間更新麥序%2$s成功", roomId, key); + } + }); + } + + + /** + * 獲取固定成員(創建者,管理員,普通用戶,受限用戶) + * + * @param roomId + * @param time + * @param limit + */ + @Override + public void loadNormalMembers(String roomId, long time, int limit, final CallBack> callback) { + NIMChatRoomSDK.getChatRoomService().fetchRoomMembers(roomId, MemberQueryType.NORMAL, time, limit) + .setCallback(new RequestCallbackWrapper>() { + @Override + public void onResult(int code, List result, Throwable exception) { + if (ListUtils.isListEmpty(result)) { + AvRoomDataManager.get().clearMembers(); + return; + } + AvRoomDataManager.get().mRoomFixedMemberList.addAll(result); + for (ChatRoomMember chatRoomMember : result) { + if (chatRoomMember == null) { + continue; + } + MemberType memberType = chatRoomMember.getMemberType(); + switch (memberType) { + case ADMIN: + AvRoomDataManager.get().addManagerMember(chatRoomMember); + break; + case CREATOR: + AvRoomDataManager.get().mRoomCreateMember = chatRoomMember; + break; + case NORMAL: + break; + case ANONYMOUS: + break; + default: + } + } + if (callback != null) { + callback.onSuccess(result); + } + } + }); + } + + /** + * 開麥 + * + * @param micPosition + * @param roomUid + */ + @Override + public Single openMicroPhone(int micPosition, long roomUid) { + return openOrCloseMicroPhone(micPosition, 0, roomUid, AuthModel.get().getTicket()); + } + + /** + * 閉麥 + * + * @param micPosition + * @param roomUid + */ + @Override + public Single closeMicroPhone(int micPosition, long roomUid) { + SparseArray mMicQueueMemberMap = AvRoomDataManager.get().mMicQueueMemberMap; + RoomQueueInfo roomQueueInfo = mMicQueueMemberMap.get(micPosition); + if (!SuperAdminUtil.isSuperAdmin() && roomQueueInfo != null) { + String resource = (String) NobleUtil.getResource(NobleResourceType.KEY_LEVEL, roomQueueInfo.mChatRoomMember); + if (!TextUtils.isEmpty(resource)) { + if (!NobleUtil.canKickMicroOrNot(Integer.valueOf(resource))) { + String tips = "不能禁麥" + NobleUtil.getNobleName(Integer.valueOf(resource)) + "陛下哦"; + SingleToastUtil.showToastShort(tips); + return Single.error(new Throwable(tips)); + } + } + } + return openOrCloseMicroPhone(micPosition, 1, roomUid, AuthModel.get().getTicket()); + } + + /** + * 開閉麥接口 + * + * @param micPosition + * @param state 1:閉麥,0:開麥 + * @param roomUid + * @param ticket + */ + @Override + public Single openOrCloseMicroPhone(int micPosition, int state, long roomUid, String ticket) { + return mHomePartyService.openMicroPhone(micPosition, state, roomUid, ticket, + AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon(() -> "")) + .doOnSuccess(s -> { + //如果是閉麥,並且是超管操作,需要發公屏 + if (state == 1 && SuperAdminUtil.isSuperAdmin()) { + IMNetEaseManager.get() + .sendChatRoomMessage( + SaAttachmentFactory.createMuteOrLockChatRoomMessage( + micPosition, 1), false) + .doOnSuccess(chatRoomMessage -> + KickModel.get().onSendRoomMessageSuccess(chatRoomMessage)) + .subscribe(); + } + }); + + } + + @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) + .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 state 1:鎖,0:不鎖 + * @param roomUid 房主或管理員id + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("room/mic/lockpos") + Single> lockMicroPhone(@Field("position") int micPosition, + @Field("state") String state, + @Field("roomUid") String roomUid, + @Field("ticket") String ticket, + @Field("uid") long uid); + + + /** + * 鎖麥,開麥操作 + * + * @param micPosition + * @param state 1:閉麥,0:開麥 + * @param roomUid + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("room/mic/lockmic") + Single> openMicroPhone(@Field("position") int micPosition, + @Field("state") int state, + @Field("roomUid") long roomUid, + @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); + + /** + * 相親開始下一步 + * + * @return + */ + @FormUrlEncoded + @POST("blind-date/state") + Single> datingNext(@Field("roomUserId") long roomUserId); + + /** + * 相親選人 + * + * @return + */ + @FormUrlEncoded + @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/chwl/core/room/model/HomePartyUserListModel.java b/core/src/main/java/com/chwl/core/room/model/HomePartyUserListModel.java new file mode 100644 index 0000000..0059622 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/HomePartyUserListModel.java @@ -0,0 +1,228 @@ +package com.chwl.core.room.model; + +import android.text.TextUtils; + +import androidx.annotation.NonNull; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.RoomOnlineUserBean; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.netease.nimlib.sdk.chatroom.constant.MemberType; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.orhanobut.logger.Logger; +import com.chwl.core.R; +import com.chwl.core.Constants; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.exception.ErrorThrowable; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.bean.OnlineChatMember; +import com.chwl.core.room.model.inteface.IHomePartyUserListModel; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + *

轰趴房用户列表网络处理

+ * + * @author jiahui + * @date 2017/12/8 + */ +public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyUserListModel { + + /** + * 分页获取房间成员:第一页包含队列成员,固定成员,游客50人,之后每一页获取游客50人 + * + * @param page 页数 + * @param time 固定成员列表用updateTime, + * 游客列表用进入enterTime, + * 填0会使用当前服务器最新时间开始查询,即第一页,单位毫秒 + */ + @Override + public Single> getOnLinePageMembers(final int page, long time, + final List oldList) { + if (page == Constants.PAGE_START) { + Single> onlineUserObservable = queryOnlineList(500); + Single> firstGuestObservable = queryGuestList(ROOM_MEMBER_SIZE, 0); + + return Single.zip(onlineUserObservable, firstGuestObservable, + this::getChatRoomMemberList) + .observeOn(AndroidSchedulers.mainThread()); + } else { + return queryGuestList(ROOM_MEMBER_SIZE, time) + .map(chatRoomMemberList -> { + if (!ListUtils.isListEmpty(chatRoomMemberList)) { + Logger.i(ResUtil.getString(R.string.room_model_homepartyuserlistmodel_01), page, chatRoomMemberList.size()); + List list = null; + if (!ListUtils.isListEmpty(oldList)) { + list = new ArrayList<>(); + for (OnlineChatMember temp : oldList) { + list.add(temp.chatRoomMember); + } + } + return getChatRoomMemberList(list, chatRoomMemberList); + } + return null; + }) + .observeOn(AndroidSchedulers.mainThread()); + } + } + + @NonNull + private List getChatRoomMemberList(List oldList, + List newList) { + long startTime = System.currentTimeMillis(); + + //处理耗时的循环 + + List allMemberList = OnlineChatMember.coverToOnlineChatMember(oldList, newList); + + List part1MemberList = new ArrayList<>(); + List managerMemberList = new ArrayList<>(); + List normalMemberList = new ArrayList<>(); + List onMicMemberList = new ArrayList<>(); + List guestMemberList = new ArrayList<>(); + + int size = AvRoomDataManager.get().mMicQueueMemberMap.size(); + boolean isRoomOwnerOnline = false; + ChatRoomMember chatRoomMember; + for (OnlineChatMember temp : allMemberList) { + chatRoomMember = temp.chatRoomMember; + if (chatRoomMember == null) continue; + String account = chatRoomMember.getAccount(); + MemberType memberType = chatRoomMember.getMemberType(); + //自己 + if (AvRoomDataManager.get().isOwner(account)) { + AvRoomDataManager.get().mOwnerMember = chatRoomMember; + } + //在麦上集合处理 + boolean isOnMic = false; + for (int i = 0; i < size; i++) { + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.valueAt(i); + if (roomQueueInfo.mChatRoomMember != null + && Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), account)) { + temp.isOnMic = true; + if (memberType == MemberType.CREATOR) { + isRoomOwnerOnline = true; + //房主在麦上 + temp.isRoomOwer = true; + onMicMemberList.add(0, temp); + } else if (memberType == MemberType.ADMIN) { + //管理员在麦上 + temp.isAdmin = true; + onMicMemberList.add(temp); + } else { + onMicMemberList.add(temp); + } + isOnMic = true; + } + } + if (isOnMic) continue; + + //处理不再麦上的 + if (memberType == MemberType.ADMIN) { + temp.isAdmin = true; + managerMemberList.add(temp); + } else if (memberType == MemberType.CREATOR) { + isRoomOwnerOnline = chatRoomMember.isOnline(); + AvRoomDataManager.get().mRoomCreateMember = chatRoomMember; + } else if (memberType == MemberType.NORMAL) { + normalMemberList.add(temp); + } else if (memberType == MemberType.GUEST) { + guestMemberList.add(temp); + } + } + + //房主 + if (isRoomOwnerOnline) { + if (AvRoomDataManager.get().mRoomCreateMember != null) { + if (!ListUtils.isListEmpty(onMicMemberList) + && !AvRoomDataManager.get().isRoomOwner(onMicMemberList.get(0).chatRoomMember.getAccount())) { + part1MemberList.add(0, new OnlineChatMember(AvRoomDataManager.get().mRoomCreateMember, + false, false, true)); + } else if (ListUtils.isListEmpty(onMicMemberList)) { + //处理麦上没有人的情况 + part1MemberList.add(0, new OnlineChatMember(AvRoomDataManager.get().mRoomCreateMember, + false, false, true)); + } + } + } + //上麦用户 + if (!ListUtils.isListEmpty(onMicMemberList)) { + part1MemberList.addAll(onMicMemberList); + } + //管理员 + if (!ListUtils.isListEmpty(managerMemberList)) { + part1MemberList.addAll(managerMemberList); + } + + //固定在线普通成员 + if (!ListUtils.isListEmpty(normalMemberList)) { + part1MemberList.addAll(normalMemberList); + } + + //添加游客 + if (!ListUtils.isListEmpty(guestMemberList)) { + part1MemberList.addAll(guestMemberList); + } + + Logger.i(ResUtil.getString(R.string.room_model_homepartyuserlistmodel_02) + (System.currentTimeMillis() - startTime)); + return part1MemberList; + } + + @Override + public Single> onMemberDownUpMic(final String account, + final boolean isUpMic, + final List dataList) { + if (TextUtils.isEmpty(account)) + return Single.error(new ErrorThrowable(ErrorThrowable.ACCOUNT_NULL_ERROR)); + return Single.create( + (SingleOnSubscribe>) e -> { + if (ListUtils.isListEmpty(dataList)) e.onSuccess(dataList); + int size = dataList.size(); + for (int i = 0; i < size; i++) { + OnlineChatMember onlineChatMember = dataList.get(i); + if (onlineChatMember.chatRoomMember != null + && Objects.equals(onlineChatMember.chatRoomMember.getAccount(), account)) { + onlineChatMember.isOnMic = isUpMic; + } + } + e.onSuccess(dataList); + }) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single> onUpdateMemberManager(final String account, + final boolean isRemoveManager, + final List dataList) { + return Single.create( + (SingleOnSubscribe>) e -> { + if (ListUtils.isListEmpty(dataList)) e.onSuccess(dataList); + int size = dataList.size(); + for (int i = 0; i < size; i++) { + OnlineChatMember onlineChatMember = dataList.get(i); + if (onlineChatMember.chatRoomMember != null + && Objects.equals(onlineChatMember.chatRoomMember.getAccount(), account)) { + onlineChatMember.isAdmin = !isRemoveManager; + } + } + e.onSuccess(dataList); + }) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } +} diff --git a/core/src/main/java/com/chwl/core/room/model/MicQueueModel.java b/core/src/main/java/com/chwl/core/room/model/MicQueueModel.java new file mode 100644 index 0000000..5316efc --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/MicQueueModel.java @@ -0,0 +1,215 @@ +package com.chwl.core.room.model; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.model.inteface.IMicQueueModel; +import com.chwl.core.room.queuing_mic.bean.RespQueuingMicListInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.DELETE; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * @author jack + * @Description + * @Date 2018/12/14 + */ +public class MicQueueModel extends BaseModel implements IMicQueueModel { + + private Api api; + + private static volatile IMicQueueModel instance; + + public static IMicQueueModel get() { + if (instance == null) { + synchronized (MicQueueModel.class) { + if (instance == null) { + instance = new MicQueueModel(); + } + } + } + return instance; + } + + private MicQueueModel() { + api = RxNet.create(Api.class); + } + + /** + * 获取麦序列表 + * + * @param roomUid + * @return + */ + @Override + public Single loadMicQueueList(long roomUid, int page, int pageSize) { + return api.queryQueueList( + roomUid, + AuthModel.get().getCurrentUid(), + page, + pageSize + ) + .flatMap(respQueuingMicListInfoServiceResult -> { + if (respQueuingMicListInfoServiceResult.isSuccess()) { + return Single.just(respQueuingMicListInfoServiceResult.getData()); + } + return Single.error(new Throwable(respQueuingMicListInfoServiceResult.getMessage())); + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 打开排麦模式 + * @param roomUid 房间 UID + * @return + */ + @Override + public Single openQueuingMicMode(long roomUid) { + return api.openQueuingMicMode(roomUid, AuthModel.get().getCurrentUid()) + .flatMap(stringServiceResult -> { + if (stringServiceResult.isSuccess()) { + if (stringServiceResult.getData() != null) { + return Single.just(stringServiceResult.getData()); + } else { + return Single.just(""); + } + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 关闭排麦模式 + * @param roomUid 房间 UID + * @return + */ + @Override + public Single closeQueuingMicMode(long roomUid) { + return api.closeQueuingMicMode(roomUid, AuthModel.get().getCurrentUid()) + .flatMap(stringServiceResult -> { + if (stringServiceResult.isSuccess()) { + if (stringServiceResult.getData() != null) { + return Single.just(stringServiceResult.getData()); + } else { + return Single.just(""); + } + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 报名排麦 + * @param openUid 报名者uid + * @return 新的排麦列表 + */ + @Override + public Single applyForQueuing(long roomUid, long openUid,int groupType) { + return api.applyForQueuing(roomUid, openUid,groupType) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 取消报名排麦 + * @param openUid 报名者uid + * @return 新的排麦列表 + */ + @Override + public Single cancelApplyForQueuing(long roomUid, long openUid) { + return api.cancelApplyForQueuing(roomUid, openUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single cancelApplyForQueuing() { + return cancelApplyForQueuing(AvRoomDataManager.get().getRoomUid(), + AuthModel.get().getCurrentUid()); + } + + private interface Api { + + /** + * 打开排麦模式 + * + * @param roomUid 房间 UID + * @param operUid 操作者的 UID (房主 or 管理员) + * @return + */ + @FormUrlEncoded + @POST("/room/queue/enable") + Single> openQueuingMicMode(@Field("roomUid") long roomUid, + @Field("operUid") long operUid); + + /** + * 关闭排麦模式 + * + * @param roomUid 房间 UID + * @param operUid 操作者的 UID (房主 or 管理员) + * @return + */ + @DELETE("/room/queue/enable") + Single> closeQueuingMicMode(@Query("roomUid") long roomUid, + @Query("operUid") long operUid); + + /** + * 获取排麦队列信息 + * + * @param roomUid 房间 UID + * @param operUid 操作者的 UID (房主 or 管理员) + * @return + */ + @GET("/room/queue/list") + Single> queryQueueList(@Query("roomUid") long roomUid, + @Query("operUid") long operUid, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 获取排麦队列长度 + * + * @param roomUid 房间 UID + * @return + */ + @GET("/room/queue/size") + Single> queryQueueSize(@Query("roomUid") long roomUid); + + /** + * 报名排麦 + * + * @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("groupType") int groupType); + + /** + * 取消报名排麦 + * + * @param roomUid 房间 UID + * @param operUid 操作者的 UID (房主 or 管理员) + * @return + */ + @DELETE("/room/queue") + Single> cancelApplyForQueuing(@Query("roomUid") long roomUid, + @Query("operUid") long operUid); + } +} diff --git a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java new file mode 100644 index 0000000..d5913ef --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java @@ -0,0 +1,1359 @@ +package com.chwl.core.room.model; + +import android.annotation.SuppressLint; +import android.text.TextUtils; +import android.util.SparseArray; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.RoomMicInfo; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.exception.ErrorThrowable; +import com.chwl.core.gift.bean.BoomInfo; +import com.chwl.core.gift.bean.GiftFreeInfo; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.home.bean.BannerInfo; +import com.chwl.core.home.bean.HomeRoomInfo; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.room.activitytimer.TimerBean; +import com.chwl.core.room.bean.BroadcastInfo; +import com.chwl.core.room.bean.RoomBoomInfo; +import com.chwl.core.room.bean.RoomIcon; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomOnlineUserBean; +import com.chwl.core.room.bean.RoomResult; +import com.chwl.core.room.bean.RoomSettingTabInfo; +import com.chwl.core.room.bean.RoomWelcomeConfig; +import com.chwl.core.room.bean.SearchRoomInfo; +import com.chwl.core.room.bean.SimplePartyRoomInfo; +import com.chwl.core.room.giftvalue.helper.GiftValueMrg; +import com.chwl.core.room.model.inteface.IRoomBaseModel; +import com.chwl.core.room.pk.bean.RoomPKInvitedUpMicMember; +import com.chwl.core.room.pk.model.PkModel; +import com.chwl.core.room.queue.bean.MicMemberInfo; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.BaseInfo; +import com.chwl.core.user.bean.FirstChargeInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.myutil.MyUtil; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.core.vip.bean.UserVipInfo; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.netease.nimlib.sdk.NIMChatRoomSDK; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.chatroom.ChatRoomService; +import com.netease.nimlib.sdk.chatroom.constant.MemberQueryType; +import com.netease.nimlib.sdk.chatroom.constant.MemberType; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomInfo; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.chatroom.model.MemberOption; +import com.netease.nimlib.sdk.util.Entry; +import com.orhanobut.logger.Logger; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + *

房间相关操作model

+ * + * @author jiahui + * @date 2017/12/19 + */ +public class RoomBaseModel extends BaseModel implements IRoomBaseModel { + + public static final int CODE_UPDATE_MIC = 110; + /** + * 一页房间人数 + */ + protected static final int ROOM_MEMBER_SIZE = 50; + protected final Api mRoomService; + + private Gson gson = new Gson(); + + public RoomBaseModel() { + mRoomService = RxNet.create(Api.class); + } + + /** + * 获取固定成员列表(操作在子线程,需要在主线程操作的自己转) + * + * @param limit 请求数量 + */ + @Override + public Single> queryNormalList(int limit) { + return fetchRoomMembers(MemberQueryType.NORMAL, 0, limit); + } + + /** + * 获取最新固定在线人数(操作在子线程,需要在主线程操作的自己转) + * + * @param limit 请求数量 + */ + @Override + public Single> queryOnlineList(int limit) { + return fetchRoomMembers(MemberQueryType.ONLINE_NORMAL, 0, limit); + } + + + /** + * 获取最新在线游客列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit 请求数量 + */ + @Override + public Single> queryGuestList(int limit) { + return queryGuestList(limit, 0); + } + + /** + * 获取在线游客列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit 获取数量大小 + * @param time 从当前时间开始查找 + */ + @Override + public Single> queryGuestList(int limit, long time) { + return fetchRoomMembers(MemberQueryType.GUEST, time, limit); + } + + protected Single> fetchRoomMembers(final MemberQueryType memberType, + final long time, final int limit) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR)); + return Single.create( + new SingleOnSubscribe>() { + @Override + public void subscribe(SingleEmitter> e) throws Exception { + NIMChatRoomSDK.getChatRoomService().fetchRoomMembers( + String.valueOf(roomInfo.getRoomId()), + memberType, + time, + limit + ) + .setCallback(new RequestCallback>() { + @Override + public void onSuccess(List param) { + e.onSuccess(param); + } + + @Override + public void onFailed(int code) { + e.onError(new Throwable(String.valueOf(code))); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + } + }) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()); + } + + /** + * 获取管理员列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit - + * @return -- + */ + @Override + public Single> queryManagerList(int limit) { + return queryNormalList(limit) + .map(new Function, List>() { + @Override + public List apply(List chatRoomMemberList) throws Exception { + List managerList = null; + if (!ListUtils.isListEmpty(chatRoomMemberList)) { + managerList = new ArrayList<>(); + for (ChatRoomMember chatRoomMember : chatRoomMemberList) { + if (chatRoomMember.getMemberType() == MemberType.ADMIN) { + managerList.add(chatRoomMember); + } + } + } + return managerList; + } + }); + } + + + /** + * 获取最新黑名单列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit 数量 + * @return + */ + @Override + public Single> queryBlackList(int limit) { + return queryNormalList(limit) + .map(new Function, List>() { + @Override + public List apply(List chatRoomMemberList) throws Exception { + List blackList = null; + if (!ListUtils.isListEmpty(chatRoomMemberList)) { + blackList = new ArrayList<>(); + for (ChatRoomMember chatRoomMember : chatRoomMemberList) { + if (chatRoomMember.isInBlackList()) { + blackList.add(chatRoomMember); + } + } + } + return blackList; + } + }); + } + + + /** + * 设置管理员 + * + * @param roomId + * @param account + * @param mark true:设置管理员 ,false:移除管理员 + */ + @Override + public void markManagerList(long roomId, String account, boolean mark, CallBack callBack) { + IMNetEaseManager.get().markManagerListBySdk(String.valueOf(roomId), account, mark, callBack); + } + + /** + * 拉黑房间成员 + * + * @param roomId + * @param account + * @param mark true:拉黑 ,false:取消拉黑 + * @param callBack + */ + @Override + public void markBlackList(long roomId, String account, boolean mark, CallBack callBack) { + IMNetEaseManager.get().markBlackListBySdk(String.valueOf(roomId), account, mark, callBack); + } + + @Override + public Single markMemberBlack(final String account, final boolean mark) { + final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR)); + return Single.create( + new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + NIMClient.getService(ChatRoomService.class).markChatRoomBlackList( + mark, + new MemberOption(String.valueOf(roomInfo), account) + ) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(ChatRoomMember param) { + e.onSuccess(param); + } + + @Override + public void onFailed(int code) { + e.onError(new Throwable(String.valueOf(code))); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + + } + }) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()); + + } + + protected Single checkRoomInfoNull() { + RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + if (roomInfo == null) + return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR)); + return Single.just(roomInfo); + } + + + /** + * 邀请上麦 + * + * @param micInfo 上麦用户基础信息,至少需要uid + * @param position position + * @return Single + */ + @Override + public Single inviteMicroPhone(BaseInfo micInfo, int position) { + return IMNetEaseManager.get().inviteMicroPhoneBySdk(micInfo, position); + } + + /** + * 如果需要上麦用户昵称相关的操作,使用{@link #inviteMicroPhone(BaseInfo, int)} + * 此方法昵称是空串 + */ + @Override + public Single inviteMicroPhone(long micUid, int position) { + BaseInfo info = new BaseInfo(micUid); + return IMNetEaseManager.get().inviteMicroPhoneBySdk(info, position); + } + + /** + * 上麦 + * + * @param micPosition + * @param uId + * @param roomId + * @param isInviteUpMic + * @param callBack + * @param teamId + */ + //xxx 上麦逻辑- 抱他上麦,主动上麦 ,排麦模式 , 资料卡上麦->自己上麦 走这里 ! + @SuppressLint("CheckResult") + @Override + public void upMicroPhone(final int micPosition, final String uId, final String roomId, boolean isInviteUpMic, final CallBack callBack, int teamId) { + OtherExtKt.doLog("上麦 micPosition = "+micPosition); + if (AvRoomDataManager.get().is19Room() && AvRoomDataManager.get().is19RoomBoosMicPos(micPosition)) { + //19麦房间的 boss ViewItemPos是7 , 云信上麦位是6 , 展示时是8号麦 + OtherExtKt.doLog("上麦 micPosition = "+micPosition+" 开始请求上麦接口"); + getRoomBossMicUp(AvRoomDataManager.get().getRoomUid(), Long.parseLong(uId),true) + .doOnSuccess(s -> { + OtherExtKt.doLog("上麦 micPosition = "+micPosition+" 开始请求上麦接口"+ "结果: 成功"); + doUpMicroPhone(micPosition, uId, roomId, isInviteUpMic, callBack, teamId); + }).doOnError(throwable -> { + OtherExtKt.doLog("上麦 micPosition = "+micPosition+" 开始请求上麦接口"+ "结果: 失败"); + if (throwable != null) { + OtherExtKt.doToast(throwable.getMessage()); + } + }).subscribe(); + } else { + doUpMicroPhone(micPosition, uId, roomId, isInviteUpMic, callBack, teamId); + } + + } + + /** + * 执行 : 上麦 + */ + private void doUpMicroPhone(final int micPosition, final String uId, final String roomId, boolean isInviteUpMic, final CallBack callBack, int teamId){ + MyUtil.INSTANCE.changeUpMicStatus(true); + queryRoomMicInfo(roomId) + .map(this::dealMicMemberFromIMNet) + .flatMap(this::dealMicChatRoomMemberFromIMNet) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(roomQueueInfoSparseArray -> { + RoomQueueInfo roomQueueInfo = roomQueueInfoSparseArray.get(micPosition); + if (roomQueueInfo == null) { + MyUtil.INSTANCE.changeUpMicStatus(false); + return; + } + MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; + final RoomMicInfo roomMicInfo = roomQueueInfo.mRoomMicInfo; + if (chatRoomMember != null) { + SingleToastUtil.showToast(ResUtil.getString(R.string.room_model_roombasemodel_01)); + callBack.onFail(CODE_UPDATE_MIC, ResUtil.getString(R.string.room_model_roombasemodel_02)); + MyUtil.INSTANCE.changeUpMicStatus(false); + return; + } + //坑上没人且没锁 + if (roomMicInfo != null && (!roomMicInfo.isMicLock() || AvRoomDataManager.get().isRoomOwner(uId) || AvRoomDataManager.get().isRoomAdmin(uId) || isInviteUpMic)) { + final UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo != null) { + userInfo.setGroupType(teamId); + CallBack callBackTmp = new CallBack() { + @Override + public void onSuccess(String data) { + callBack.onSuccess(data); + MyUtil.INSTANCE.changeUpMicStatus(false); + } + + @Override + public void onFail(int code, String error) { + callBack.onFail(code, error); + MyUtil.INSTANCE.changeUpMicStatus(false); + } + }; + + //tofix 在这里遍历一遍, 有可能在两个麦位上的情况,要下麦两次 + //先看下这个用户是否在麦上 + int onMicNum = AvRoomDataManager.get().isOnMicNum(String.valueOf(userInfo.getUid())); + OtherExtKt.doLog("上麦 上麦前的检查下麦 , 需要下麦的计数是 = "+onMicNum); + MyUtil.INSTANCE.setDownMicNum(0); + if (onMicNum > 0) { + for (int i = 0; i < onMicNum; i++) { + int position = AvRoomDataManager.get().getMicPosition(userInfo.getUid()); + //下麦 + downMicroPhone(position, new CallBack() { + @Override + public void onSuccess(String data) { + MyUtil.INSTANCE.setDownMicNum(MyUtil.INSTANCE.getDownMicNum()+1); + if (MyUtil.INSTANCE.getDownMicNum() == onMicNum) { + updateQueueEx(micPosition, roomId, callBackTmp, userInfo); + } + } + public void onFail(int code, String error) { + callBackTmp.onFail(-1, ResUtil.getString(R.string.room_model_roombasemodel_03)); + MyUtil.INSTANCE.changeUpMicStatus(false); + } + }); + } + } else { + updateQueueEx(micPosition, roomId, callBackTmp, userInfo); + } + } + } + + }) + .doOnError(throwable -> { + MyUtil.INSTANCE.changeUpMicStatus(false); + }) + .subscribe(); + } + + /** //tofix 双麦位问题 , chatRoomQueueChangeNotice 云信上麦回调前走了这里,导致出现双麦位 + * 处理网易云信坑位信息 + * 这里只有在这个坑位原来没人但是云信队列信息有人,才更新这个坑位,防止挤麦 + */ + private List dealMicMemberFromIMNet(List> entries) { + List accounts = new ArrayList<>(); + 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 && roomQueueInfo.mChatRoomMember == null) { + JsonObject valueJsonObj = jsonParser.parse(entry.value).getAsJsonObject(); + if (valueJsonObj != null) { + chatRoomMember = gson.fromJson(valueJsonObj, MicMemberInfo.class); + roomQueueInfo.mChatRoomMember = chatRoomMember; + } + AvRoomDataManager.get().mMicQueueMemberMap.put(Integer.parseInt(entry.key), roomQueueInfo); + } + } + } + return accounts; + } + + + /** + * 处理网易云信队列上人员的信息 + */ + private Observable> dealMicChatRoomMemberFromIMNet(List accounts) { + if (ListUtils.isListEmpty(accounts)) + return Observable.just(AvRoomDataManager.get().mMicQueueMemberMap); + return IMNetEaseManager.get().fetchRoomMembersByIds(accounts) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(chatRoomMembers -> { + for (ChatRoomMember chatRoomMember : chatRoomMembers) { + AvRoomDataManager.get().updateQueueChatRoomMemberExtension(AvRoomDataManager.get().mMicQueueMemberMap, chatRoomMember); + } + //accounts不为空则表示出现了本地队列信息和云信队列信息不一致的情况,更新队列信息后更新下相应的坑位信息 + + //updateMicView(); + + return Single.just(AvRoomDataManager.get().mMicQueueMemberMap); + }).toObservable(); + } + +// /** +// * 上麦 +// * +// * @param micPosition +// * @param uId 要上麦的用户id +// * @param roomId +// * @param callBack +// */ +// @SuppressLint("CheckResult") +// public void upAiMicroPhone(final int micPosition, final String uId, final String roomId, final CallBack callBack) { +// RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(micPosition); +// if (roomQueueInfo == null) { +// return; +// } +// MicMemberInfo chatRoomMember = roomQueueInfo.mChatRoomMember; +// final RoomMicInfo roomMicInfo = roomQueueInfo.mRoomMicInfo; +// +// //坑上没人且没锁 +// if (roomMicInfo != null +// && chatRoomMember == null) { +// UserModel.get().getUserInfo(JavaUtil.str2long(uId)) +// .subscribe(userInfo -> { +// if (userInfo != null) { +// //先看下这个用户是否在麦上 +// if (AvRoomDataManager.get().isOnMic(userInfo.getUid())) { +// int position = AvRoomDataManager.get().getMicPosition(userInfo.getUid()); +// //下麦 +// downMicroPhone(position, new CallBack() { +// @Override +// public void onSuccess(String data) { +// updateQueueEx(micPosition, roomId, callBack, userInfo); +// } +// +// @Override +// public void onFail(int code, String error) { +// if (callBack != null) { +// callBack.onFail(-1, ResUtil.getString(R.string.room_model_roombasemodel_04)); +// } +// } +// }); +// } else { +// updateQueueEx(micPosition, roomId, callBack, userInfo); +// } +// } +// }); +// } +// } + + /** + * 上麦 + * + * @param micPosition + * @param uId 要上麦的用户id + * @param roomId + * @param isInviteUpMic 是否是主动的 + * @param callBack + */ + @Override + public void upMicroPhone(final int micPosition, final String uId, final String roomId, + boolean isInviteUpMic, final CallBack callBack) { + upMicroPhone(micPosition, uId, roomId, isInviteUpMic, callBack, PkModel.get().getTeamIdInPKMemberList(String.valueOf(uId))); + } + + @Override + public Single updateOrUpMic(RoomPKInvitedUpMicMember roomPKInvitedUpMicMember) { + return Single.create(new SingleOnSubscribe() { + @Override + public void subscribe(SingleEmitter e) throws Exception { + if (AvRoomDataManager.get().isOnMic(roomPKInvitedUpMicMember.getUid())) { + //在麦上就更新信息 + //获取mic 信息 + RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.get(AvRoomDataManager.get().getMicPosition(roomPKInvitedUpMicMember.getUid())); + //更新自己队伍信息 + UserModel.get().getCacheLoginUserInfo().setGroupType(roomPKInvitedUpMicMember.getGroupType()); + updateQueueEx(roomPKInvitedUpMicMember.getPosition(), + String.valueOf(AvRoomDataManager.get().getRoomId()), + new CallBack() { + @Override + public void onSuccess(String data) { + e.onSuccess(data); + } + + @Override + public void onFail(int code, String error) { + e.onError(new Throwable("code:" + code + " error:" + error)); + } + }, UserModel.get().getCacheLoginUserInfo(), true); + + } else { + //不在麦上就去上麦 + upMicroPhone(roomPKInvitedUpMicMember.getPosition(), + roomPKInvitedUpMicMember.getUid(), + String.valueOf(AvRoomDataManager.get().getRoomId()), + true, + new CallBack() { + @Override + public void onSuccess(String data) { + //上麦成功 + GiftValueMrg.get().requestUpMic(roomPKInvitedUpMicMember.getPosition(), + roomPKInvitedUpMicMember.getUid()); + e.onSuccess(data); + } + + @Override + public void onFail(int code, String error) { + e.onError(new Throwable("code:" + code + " error:" + error)); + } + }, roomPKInvitedUpMicMember.getGroupType()); + } + + } + }) + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + public Single updateMyMicQueue(int micPosition, String roomId, UserInfo userInfo) { + return updateMyMicQueue(micPosition, roomId, userInfo, false); + } + + /** + * 更新我的麦序信息, + * + * @param micPosition + * @param roomId + * @param userInfo + * @return + */ + @Override + public Single updateMyMicQueue(int micPosition, String roomId, UserInfo userInfo, boolean isNoProhibitMic) { + if (userInfo.getUid() != AuthModel.get().getCurrentUid()) { + return Single.error(new Throwable(ResUtil.getString(R.string.room_model_roombasemodel_05))); + } + return Single.create((SingleOnSubscribe) e -> + updateQueueEx(micPosition, roomId, new CallBack<>() { + @Override + public void onSuccess(String param) { + Logger.e(ResUtil.getString(R.string.room_model_roombasemodel_06) + userInfo.getNick()); + e.onSuccess(ResUtil.getString(R.string.room_model_roombasemodel_07)); + } + + @Override + public void onFail(int code, String error) { + Logger.e(ResUtil.getString(R.string.room_model_roombasemodel_08) + code); + e.onError(new Throwable(ResUtil.getString(R.string.room_model_roombasemodel_09) + code)); + } + + }, userInfo, isNoProhibitMic)) + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()); + + } + + @Override + public void downMicroPhone(int micPosition, final CallBack callBack) { + IMNetEaseManager.get().downMicroPhoneBySdk(micPosition, callBack); + } + + protected void updateQueueEx(int micPosition, String roomId, final CallBack callBack, UserInfo userInfo) { + updateQueueEx(micPosition, roomId, callBack, userInfo, false); + } + + //xxx 填充麦位上的用户信息? + protected void updateQueueEx(int micPosition, String roomId, final CallBack callBack, UserInfo userInfo, boolean isNoProhibitMic) { + OtherExtKt.doLog(" 上麦 updateQueueEx() 填充麦位上的用户信息 pos="+micPosition +" isNoProhibitMic = "+isNoProhibitMic+" userInfo = "+ JSON.toJSONString(userInfo) + "/n"); + JSONObject contentJsonObj = new JSONObject(); + contentJsonObj.put("uid", String.valueOf(userInfo.getUid())); + contentJsonObj.put("nick", userInfo.getNick()); + contentJsonObj.put("avatar", userInfo.getAvatar()); + contentJsonObj.put("gender", userInfo.getGender()); + contentJsonObj.put("groupType", userInfo.getGroupType()); + contentJsonObj.put("gameStatus", userInfo.getGameStatus()); + HeadWearInfo headWearInfo = userInfo.getUserHeadwear(); + if (headWearInfo != null) { + String headWearUrl = headWearInfo.getEffect() != null ? headWearInfo.getEffect() : headWearInfo.getPic(); + if (!TextUtils.isEmpty(headWearUrl)) { + contentJsonObj.put("headWearUrl", headWearUrl); + } + contentJsonObj.put("headWearType", headWearInfo.getType()); + } + if (AvRoomDataManager.get().isDatingVip(userInfo.getUid())) { + contentJsonObj.put("vipMic", true); + } + + if (!TextUtils.isEmpty(userInfo.getMicNickColor())) { + contentJsonObj.put("micNickColor", userInfo.getMicNickColor()); + } + + if (!TextUtils.isEmpty(userInfo.getMicCircle())) { + contentJsonObj.put("micCircle", userInfo.getMicCircle()); + } + + UserVipInfo vipInfo = userInfo.getUserVipInfoVO(); + if (vipInfo != null && vipInfo.getPreventKick()) { + contentJsonObj.put("preventKick", true); + } + + contentJsonObj.put("isNoProhibitMic", isNoProhibitMic); + + NIMChatRoomSDK.getChatRoomService() + .updateQueueEx(roomId, String.valueOf(micPosition), contentJsonObj.toJSONString(), true) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(Void aVoid) { + if (callBack != null) { + callBack.onSuccess(ResUtil.getString(R.string.room_model_roombasemodel_010)); + } + } + + @Override + public void onFailed(int i) { + if (callBack != null) { + callBack.onFail(-1, ResUtil.getString(R.string.room_model_roombasemodel_011)); + } + } + + @Override + public void onException(Throwable throwable) { + if (callBack != null) { + callBack.onFail(-1, ResUtil.getString(R.string.room_model_roombasemodel_012)); + } + } + }); + } + + /** + * 获取房间队列信息 + * + * @param roomId + */ + @Override + public Observable>> queryRoomMicInfo(final String roomId) { + return Observable.create(new ObservableOnSubscribe>>() { + @Override + public void subscribe(ObservableEmitter>> e) throws Exception { + NIMChatRoomSDK.getChatRoomService().fetchQueue(roomId) + .setCallback(new RequestCallback>>() { + @Override + public void onSuccess(List> param) { + + e.onNext(param); + e.onComplete(); + } + + @Override + public void onFailed(int code) { + e.onError(new Throwable(String.valueOf(code))); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + } + }).subscribeOn(Schedulers.computation()) + .unsubscribeOn(Schedulers.computation()); + } + + /** + * 获取聊天室信息 + * + * @param roomId 聊天室id + * @return ChatRoomInfo 房间信息 + */ + @Override + public Observable startGetOnlineMemberNumberJob(final long roomId) { + return queryRoomInfo(roomId); + } + + /** + * 获取聊天室信息 + * + * @param roomId 聊天室id + * @return ChatRoomInfo 房间信息 + */ + public Observable queryRoomInfo(final long roomId) { + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter e) throws Exception { + NIMChatRoomSDK.getChatRoomService().fetchRoomInfo(String.valueOf(roomId)) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(ChatRoomInfo param) { + e.onNext(param); + e.onComplete(); + } + + @Override + public void onFailed(int code) { + e.onError(new Throwable(ResUtil.getString(R.string.room_model_roombasemodel_013) + code)); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + }); + } + }).subscribeOn(Schedulers.computation()) + .unsubscribeOn(Schedulers.computation()); + } + + /** + * 开房间 + * uid:必填 + * type:房间类型,1竞拍房,2悬赏房,必填 + * title:房间标题 + * roomDesc:房间描述 + * backPic:房间背景图 + * rewardId:当type为2时,必填如rewardId + */ + @Override + public Single openRoom(long uid, int type, String title, String roomDesc, + String backPic, String rewardId, long gameId) { + if (TextUtils.isEmpty(title)) { + return UserModel.get().getUserInfo(uid) + .flatMap(new Function>() { + @Override + public SingleSource apply(UserInfo userInfo) throws Exception { + String tmpTitle = String.format(ResUtil.getString(R.string.room_model_roombasemodel_014), userInfo.getNick()); + return mRoomService.openRoom(userInfo.getUid(), AuthModel.get().getTicket(), + type, tmpTitle, roomDesc, backPic, rewardId, gameId) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + }); + } + return mRoomService.openRoom(uid, AuthModel.get().getTicket(), + type, title, roomDesc, backPic, rewardId, gameId) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single closeScreen(long roomId, boolean isCloseScreen) { + return mRoomService.closeScreen(roomId, AuthModel.get().getCurrentUid(), isCloseScreen, + AuthModel.get().getTicket() + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public Single addIsomerism() { + return mRoomService.addIsomerism(AuthModel.get().getCurrentUid(), AvRoomDataManager.get().getRoomId()) + .compose(RxHelper.singleMainResult()); + } + + public Single removeIsomerism() { + return mRoomService.removeIsomerism(AuthModel.get().getCurrentUid(), AvRoomDataManager.get().getRoomId()) + .compose(RxHelper.singleMainResult()); + } + + public Single activityClickLog(String type, String actId) { + return mRoomService.activityClickLog(type, actId) + .compose(RxHelper.singleMainResult()); + } + + public Single> getRoomBanner() { + return mRoomService.getActionDialog("2", AvRoomDataManager.get().getRoomId()) + .singleOrError() + .compose(RxHelper.singleMainResult()); + } + + public Single> getRoomOnlineList(long roomUid) { + return mRoomService.getRoomOnlineList(roomUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public Single getRoomBoomInfo(long roomUid) { + return mRoomService.getRoomBoomInfo(roomUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public Single> getBoomInfo(long roomUid) { + return mRoomService.getBoomInfo(roomUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + public Single getRoomBossMicUp(long roomUid,long uid,boolean isUpMic) { + if (isUpMic) { + return mRoomService.getRoomBossMicUp(roomUid, uid) + .compose(RxHelper.handleIgnoreData()) + .compose(RxHelper.handleSchedulers()); + } else { + return Single.just("下麦 不用请求"); + } + + } + + public Single getCheckManagerNum(long roomUid,boolean isMark) { + if (!isMark) { + return Single.just("取消管理员 不用请求"); + } else { + return mRoomService.getCheckManagerNum(roomUid) + .compose(RxHelper.handleIgnoreData()) + .compose(RxHelper.handleSchedulers()); + } + + } + + public interface Api { + + /** + * 获取房间信息 + * + * @param uid + * @return + */ + @GET("/room/get") + Single getRoomInfo(@Query("uid") String uid, @Query("intoUid") long intoUid); + + /** + * @param key + * @return + */ + @GET("/search/room") + Single>> roomSearch(@Query("key") String key, @Query("type") int type); + + + /** + * @param key + * @return + */ + @GET("/search/room") + Single>> roomSearch(@Query("key") String key); + + /** + * 获取该Uid 所在的房间信息,如果不在房间 返回的房间实体uid==0,或者roomId == 0 + * + * @param uid + * @return + */ + @GET("/userroom/get") + Single getUserRoom(@Query("uid") String uid); + + + /** + * 房间标签列表 + * + * @param ticket + * @return + */ + @POST("/room/tag/all") + Single>> getRoomTagList(@Query("ticket") String ticket); + + /** + * @param uid + * @param ticket + * @param roomUid + * @return + */ + @POST("/userroom/in") + Single userRoomIn(@Query("uid") String uid, + @Query("ticket") String ticket, + @Query("roomUid") String roomUid); + + /** + * @param uid + * @param ticket + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("userroom/inV2") + Single> userRoomInV2(@Field("uid") String uid, + @Field("ticket") String ticket, + @Field("roomUid") String roomUid, + @Field("behaveType") int behaveType, + @Field("fromType") int fromType, + @Field("inviteUid") String inviteUid); + + /** + * 退出房间 + * + * @param uId + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("userroom/out") + Observable> quitUserRoom(@Field("uid") String uId, + @Field("ticket") String ticket, + @Field("roomUid") String roomUid); + + /** + * 退出房间 + * + * @param uId + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("userroom/outV2") + Observable> quitUserRoomV2(@Field("uid") String uId, + @Field("roomUid") long roomUid, + @Field("ticket") String ticket); + + /** + * 首页活动和房间公屏旁边的 icon + * + * @param type 1首页 2房间 + * @return + */ + @GET("/home/banner") + Observable>> getActionDialog(@Query("type") String type, @Query("roomId") long roomId); + + /** + * 通知我们自己服务器房间退出接口 + * + * @param uId + * @param ticket + * @return + */ + @FormUrlEncoded + @POST("room/close") + Observable> quiteRoomForOurService(@Field("uid") String uId, + @Field("ticket") String ticket); + + /** + * 开房间 + * uid:必填 + * type:房间类型,1竞拍房,2悬赏房,必填 + * title:房间标题 + * roomDesc:房间描述 + * backPic:房间背景图 + * rewardId:当type为2时,必填如rewardId + */ + @FormUrlEncoded + @POST("room/open") + Single openRoom(@Field("uid") long uid, + @Field("ticket") String ticket, + @Field("type") int type, + @Field("title") String title, + @Field("roomDesc") String roomDesc, + @Field("backPic") String backPic, + @Field("rewardId") String rewardId, + @Field("mgId") long mgId); + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param uid 用户id + * @param ticket + */ + @FormUrlEncoded + @POST("room/update") + Single> updateRoomInfo(@Field("title") String title, + @Field("roomDesc") String desc, + @Field("roomPwd") String pwd, + @Field("roomTag") String label, + @Field("tagId") int tagId, + @Field("uid") long uid, + @Field("ticket") String ticket, + @Field("hasAnimationEffect") boolean hasAnimationEffect, + @Field("audioQuality") int audioQuality); + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param uid 用户id + * @param ticket + */ + @FormUrlEncoded + @POST("room/updateByAdmin") + Single> updateByAdmin(@Field("roomUid") long roomUid, + @Field("title") String title, + @Field("roomDesc") String desc, + @Field("roomPwd") String pwd, + @Field("roomTag") String label, + @Field("tagId") int tagId, + @Field("uid") long uid, + @Field("ticket") String ticket, + @Field("hasAnimationEffect") boolean hasAnimationEffect, + @Field("audioQuality") int audioQuality); + + /** + * 关闭公屏 + * true是关闭公屏 + * + * @param uid - + * @return - + */ + @POST("room/setCloseScreen") + Single> closeScreen(@Query("roomId") long roomId, + @Query("uid") long uid, + @Query("isCloseScreen") boolean isCloseScreen, + @Query("ticket") String ticket); + + /** + * 添加进异性匹配池 + * + * @return - + */ + @FormUrlEncoded + @POST("room/addIsomerismPoolForRoom") + Single> addIsomerism(@Field("uid") long uid, @Field("roomId") long roomId); + + /** + * 移除异性匹配池 + * + * @return - + */ + @FormUrlEncoded + @POST("room/removeIsomerismPoolForRoom") + Single> removeIsomerism(@Field("uid") long uid, @Field("roomId") long roomId); + + /** + * 活动点击上报 + * type 1 首页 ,2 房间 + * + * @return - + */ + @FormUrlEncoded + @POST("charge/activity/visit/log") + Single> activityClickLog(@Field("type") String type, @Field("actId") String actId); + + /** + * 查询是否限制进房 + * + * @param uid - + * @return - + */ + @POST("room/inRoomForParent") + Single> inRoomForParent(@Query("uid") long uid); + + /** + * 设置聊天室角色, + * 用于拉黑用户 + * 设置管理员 + * + * @param roomUid - + * @param targetUid - + * @param opt 1: 设置为管理员;2:设置普通等级用户;-1:设为黑名单用户;-2:设为禁言用户 + * @return - + */ + @POST("super/set/chatroom/role") + Single> setChatRoomRole(@Query("roomUid") long roomUid, + @Query("targetUid") long targetUid, + @Query("opt") int opt, + @Query("isSet") boolean isSet, + @Query("notifyExt") String notifyExt); + + /** + * 通知服务器 添加/移除管理员 + * @param opt 1-添加 2-移除 + */ + @POST("roomrole/manageOpt") + Single> manageOpt(@Query("roomUid") long roomUid, + @Query("uid") long uid, + @Query("opt") int opt); + + /** + * 获取嗨聊房间列表 + * + * @param uid + * @return + */ + @GET("/room/chat/party/get") + Single>> getPartyRoomList(@Query("uid") long uid); + + /** + * 获取房间倒计时 + * + * @param roomUid 房主Uid + */ + @GET("/activities/draw/getRoomRunawayTime") + Single> apiGetRoomActTimer(@Query("roomUid") long roomUid); + + @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); + + /** + * 下麦接口 + * + * @return + */ + @FormUrlEncoded + @POST("/wujie/audio/updateMediaToken") + Single> updateMicToken(@Field("token") String token); + + /** + * 获取发送房间广播配置 + * + * @return + */ + @GET("/broad/getMsg") + Single> getBroadcastConfig(@Query("type") int type); + + /** + * 发送房间广播 + * + * @return + */ + @FormUrlEncoded + @POST("/broad/send") + Single> sendRoomBroadcast(@Field("msg") String msg, + @Field("roomId") long roomId); + + /** + * 清空房间公屏 + * + * @param roomUid 房间uid + * @param uid 操作人uid + * @return + */ + @FormUrlEncoded + @POST("/room/clear/history/recrod") + Single> cleanScreen(@Field("roomUid") long roomUid, + @Field("uid") long uid); + + /** + * 房内推荐房间列表 + * + * @return + */ + @GET("/roominsiderecommend/recommendRoomList") + Single>> getRecommendRoomList(@Query("roomId") String roomId); + + /** + * 获取个播随机下一个房间信息 + * + * @param roomUid + * @return + */ + @GET("/single/broadcast/room/page") + Single getNextSingleRoomInfo(@Query("roomUid") long roomUid); + + /** + * 获取新用户进房礼物 + * + * @param roomUid + * @return + */ + @GET("/gift/newUser/inRoom") + Single> getNewUserGift(@Query("roomUid") long roomUid); + + /** + * 获取新用户进房礼物 + * + * @return + */ + @GET("/roomFreeGift/get") + Single> getFreeFlower(); + + /** + * 获取首充弹窗 + * + * @param roomUid + * @return + */ + @GET("/roomFirstChargeWindow/get") + Single> getFirstCharge(@Query("roomUid") long roomUid); + + /** + * 更新首充弹窗显示 + * + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("/roomFirstChargeWindow/update") + Single> postFirstCharge(@Field("roomUid") long roomUid); + + /** + * 踢人 + * + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("/room/kick/") + Single> kickUser(@Field("roomUid") long roomUid, @Field("uid") long uid); + + /** + * 获取踢人列表 + * + * @param roomUid + * @return + */ + @GET("/room/kick/") + Single>> getKickList(@Query("roomUid") long roomUid); + + /** + * 获取房间玩法List + * + * @param roomUid + * @return + */ + @GET("/resource/gamePlay") + Single>> getRoomGamePlay(@Query("roomUid") long roomUid); + + /** + * 房间在线列表 + * @return + */ + @GET("/room/v2/online") + Single>> getRoomOnlineList(@Query("roomUid") long roomUid); + + /** + * Boom活动 进房获取 + */ + @GET("/room/boom/draw/info") + Single> getRoomBoomInfo(@Query("roomUid") long roomUid); + + @GET("/room/boom/level/info") + Single>> getBoomInfo(@Query("roomUid") long roomUid); + + + @GET("/room/bossMic/up") + Single> getRoomBossMicUp(@Query("roomUid") long roomUid,@Query("uid") long uid); + + + //是否还能设置房间管理员 + @FormUrlEncoded + @POST("/room/checkManageNum") + Single> getCheckManagerNum(@Field("roomUid") long roomUid); + + + + } + +} diff --git a/core/src/main/java/com/chwl/core/room/model/RoomCharmModel.java b/core/src/main/java/com/chwl/core/room/model/RoomCharmModel.java new file mode 100644 index 0000000..99fb3db --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomCharmModel.java @@ -0,0 +1,69 @@ +package com.chwl.core.room.model; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.RoomContributeDataInfo; +import com.chwl.core.room.model.inteface.IRoomCharmModel; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public class RoomCharmModel extends BaseModel implements IRoomCharmModel { + + private Api api; + private static class InstanceHolder { + public static IRoomCharmModel instance = new RoomCharmModel(); + } + + public static IRoomCharmModel get() { + return InstanceHolder.instance; + } + + private RoomCharmModel(){ + api = RxNet.create(Api.class); + } + + /** + * 房间魅力榜(单独取 日榜/周榜/总榜) + * @param roomId + * @param page + * @param pageSize + * @param type {@link RoomContributeDataInfo#TYPE_ROOM_DAY_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_WEEK_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_TOTAL_RANKING} + * @return + */ + @Override + public Single> getRoomCharmList(String roomId,int page,int pageSize, String type){ + return api.getSingleRoomContributeRanking( + roomId, + page, + pageSize, + type + ) + .compose(RxHelper.handleSchedulers()); + } + + private interface Api { + /** + * 房间魅力榜(单独取 日榜/周榜/总榜) + * @param uid 用户 UID + * @param page 页码 + * @param pageSize 页大小 + * @param type 榜单类型 + * {@link RoomContributeDataInfo#TYPE_ROOM_DAY_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_WEEK_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_TOTAL_RANKING} + */ + @GET("room/recive/rankings") + Single> getSingleRoomContributeRanking(@Query("roomUid") String uid, + @Query("page") int page, + @Query("pageSize") int pageSize, + @Query("type") String type); + } + + +} diff --git a/core/src/main/java/com/chwl/core/room/model/RoomContributeListModel.java b/core/src/main/java/com/chwl/core/room/model/RoomContributeListModel.java new file mode 100644 index 0000000..bb2a408 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomContributeListModel.java @@ -0,0 +1,92 @@ +package com.chwl.core.room.model; + +import com.chwl.core.R; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.bean.RoomContributeDataInfo; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.model.inteface.IRoomContributeListModel; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * 房间贡献榜操作 + * Created by MadisonRong on 25/04/2018. + */ +public class RoomContributeListModel extends BaseModel implements IRoomContributeListModel { + + private Api api; + + public RoomContributeListModel() { + this.api = RxNet.create(Api.class); + } + + /** + * 房间贡献榜概要 + */ + @Override + public Single> getRankingSummary() { + RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo; + long currentUid = mCurrentRoomInfo.getUid(); + return api.getRankingSummary(String.valueOf(currentUid)) + .compose(new Transformer<>()); + } + + /** + * 单独获取某种类型的房间贡献榜 + * @param page 页码 + * @param type 榜单类型 + * {@link RoomContributeDataInfo#TYPE_ROOM_DAY_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_WEEK_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_TOTAL_RANKING} + */ + @Override + public Single> getSingleRoomRanking(int page, String type) { + if (AvRoomDataManager.get().mCurrentRoomInfo == null){ + return Single.error(new Throwable(ResUtil.getString(R.string.room_model_roomcontributelistmodel_01))); + } + long currentUid = AvRoomDataManager.get().mCurrentRoomInfo.getUid(); + return api.getSingleRoomContributeRanking(String.valueOf(currentUid), page, 10, type) + .compose(RxHelper.handleSchedulers()); + } + + public static RoomContributeListModel get() { + return RoomContributeListModelHolder.instance; + } + + private static class RoomContributeListModelHolder { + public static RoomContributeListModel instance = new RoomContributeListModel(); + } + + interface Api { + + /** + * 房间贡献榜概要 + * @param uid 用户 UID + */ + @GET("/room/rankings/summary") + Single> getRankingSummary(@Query("roomUid") String uid); + + /** + * 房间贡献榜(单独取 日榜/周榜/总榜) + * @param uid 用户 UID + * @param page 页码 + * @param pageSize 页大小 + * @param type 榜单类型 + * {@link RoomContributeDataInfo#TYPE_ROOM_DAY_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_WEEK_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_TOTAL_RANKING} + */ + @GET("/room/rankings") + Single> getSingleRoomContributeRanking( + @Query("roomUid") String uid, @Query("page") int page, @Query("pageSize") int pageSize, + @Query("type") String type + ); + } +} diff --git a/core/src/main/java/com/chwl/core/room/model/RoomInviteFansModel.kt b/core/src/main/java/com/chwl/core/room/model/RoomInviteFansModel.kt new file mode 100644 index 0000000..70ee53b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomInviteFansModel.kt @@ -0,0 +1,54 @@ +package com.chwl.core.room.model + + + +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.room.bean.RoomInviteFansInfo +import com.chwl.core.utils.net.handleBeanData +import com.chwl.core.utils.net.io2main +import com.chwl.library.net.rxnet.RxNet +import io.reactivex.Single +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +object RoomInviteFansModel { + + + private val api: Api + + init { + api = RxNet.create(Api::class.java) + } + + fun setRoomInviteFans(roomUid: Long):Single { + return api.setRoomInviteFans(roomUid) + .io2main() + .handleBeanData() + } + + + fun getRoomInviteFans(roomUid: Long):Single { + return api.getRoomInviteFans(roomUid) + .io2main() + .handleBeanData() + } + + private interface Api { + + /** + * 房间邀请粉丝 + */ + @POST("/room/inviteFans") + fun setRoomInviteFans(@Query("roomUid") uid: Long): Single> + + /** + * 获取房间邀请粉丝 + */ + @GET("/room/inviteFans") + fun getRoomInviteFans(@Query("roomUid") uid: Long): Single> + } + + +} + diff --git a/core/src/main/java/com/chwl/core/room/model/RoomInviteModel.java b/core/src/main/java/com/chwl/core/room/model/RoomInviteModel.java new file mode 100644 index 0000000..c378106 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomInviteModel.java @@ -0,0 +1,53 @@ +package com.chwl.core.room.model; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.chwl.core.Constants; +import com.chwl.core.room.model.inteface.IRoomInviteModel; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.functions.BiFunction; + +/** + *

+ * + * @author jiahui + * @date 2017/12/21 + */ +public class RoomInviteModel extends RoomBaseModel implements IRoomInviteModel { + + /** + * 分页获取房间成员:第一页包含队列成员,固定成员,游客50人,之后每一页获取游客50人 + * + * @param page 页数 + * @param time 固定成员列表用updateTime, + * 游客列表用进入enterTime, + * 填0会使用当前服务器最新时间开始查询,即第一页,单位毫秒 + */ + @Override + public Single> getPageMembers(final int page, long time) { + Single> onlineUserObservable = queryOnlineList(500); + Single> firstGuestObservable = queryGuestList(ROOM_MEMBER_SIZE, 0); + if (page == Constants.PAGE_START) { + return Single.zip(onlineUserObservable, firstGuestObservable, + new BiFunction, List, List>() { + @Override + public List apply(List chatRoomMemberList, List chatRoomMemberList2) throws Exception { + List memberList = new ArrayList<>(); + if (!ListUtils.isListEmpty(chatRoomMemberList)) { + memberList.addAll(chatRoomMemberList); + } + if (!ListUtils.isListEmpty(chatRoomMemberList2)) { + memberList.addAll(chatRoomMemberList2); + } + return memberList; + } + }); + } else { + return queryGuestList(ROOM_MEMBER_SIZE, time); + } + } +} diff --git a/core/src/main/java/com/chwl/core/room/model/RoomRankModel.java b/core/src/main/java/com/chwl/core/room/model/RoomRankModel.java new file mode 100644 index 0000000..eaad4bc --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomRankModel.java @@ -0,0 +1,62 @@ +package com.chwl.core.room.model; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.RoomRankHalfHourDataInfo; +import com.chwl.core.room.model.inteface.IRoomRankModel; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public class RoomRankModel extends BaseModel implements IRoomRankModel { + private Api api; + + private static class InstanceHolder { + + public static IRoomRankModel instance = new RoomRankModel(); + } + + public static IRoomRankModel get() { + return InstanceHolder.instance; + } + + private RoomRankModel() { + api = RxNet.create(Api.class); + } + + @Override + public Single getRoomRankHalfHourList(long currentRoomUid) { + return api.getRoomRankHalfHourList(currentRoomUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } +// +// @Override +// public Single> getRoomRankWeekStarList(long uid) { +// return api.getRoomRankWeekStarList(uid) +// .compose(RxHelper.handleBeanData()) +// .compose(RxHelper.handleSchedulers()); +// } + + private interface Api { + + /** + * 房间半小时排行榜 + * + * @param currentRoomUid 房间的uid + */ + @GET("allrank/room/halfHour") + Single> getRoomRankHalfHourList(@Query("currentRoomUid") long currentRoomUid); + +// /** +// * 房间周星榜 +// * +// * @param uid 用户的uid +// */ +// @GET("weekStar/getRankListInRoom") +// Single>> getRoomRankWeekStarList(@Query("uid") long uid); + } +} diff --git a/core/src/main/java/com/chwl/core/room/model/RoomSettingModel.java b/core/src/main/java/com/chwl/core/room/model/RoomSettingModel.java new file mode 100644 index 0000000..0ab66c2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/RoomSettingModel.java @@ -0,0 +1,462 @@ +package com.chwl.core.room.model; + +import static com.chwl.core.utils.net.RxHelper.handleIgnoreData; + +import android.text.TextUtils; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.BaseMvpModel; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomSettingTabInfo; +import com.chwl.core.room.bean.SingleRoomSortInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.chwl.library.utils.ResUtil; +import com.google.gson.JsonElement; + +import java.util.List; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + *

房间设置

+ * + * @author jiahui + * @date 2017/12/15 + */ +public class RoomSettingModel extends BaseMvpModel { + private final RoomSettingService mRoomSettingService; + + public RoomSettingModel() { + mRoomSettingService = RxNet.create(RoomSettingService.class); + } + + public Single> requestTagAll(String ticket) { + return mRoomSettingService.requestTagAll(AvRoomDataManager.get().getRoomUid()) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.>getSingleCommonExceptionFunction()) + .flatMap(this.>getSingleFunction()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Single> requestSingleRoomSort() { + return mRoomSettingService.requestSingleRoomSort() + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleBeanData()); + } + + public Single invite(long uid, String uids) { + return mRoomSettingService.invite(uid, uids) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.room_model_roomsettingmodel_01)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + */ + public Single updateRoomInfo(String title, + String avatar, + String desc, + String introduction, + String pwd, + String label, + int tagId, + long uid, + String ticket, + boolean hasEffect, + int audio, + String limitType, + boolean isPureMode, + int type, + long gameId) { + return updateRoomInfo(title,avatar, desc, introduction, pwd, label, tagId, uid, ticket, hasEffect, audio, limitType, isPureMode, type, gameId, null); + } + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + */ + public Single updateRoomInfo(String title, + String avatar, + String desc, + String introduction, + String pwd, + String label, + int tagId, + long uid, + String ticket, + boolean hasEffect, + int audio, + String limitType, + boolean isPureMode, + int type, + long gameId, + Long singleRoomSortId) { + return mRoomSettingService.updateRoomInfo(title, avatar,desc, introduction, pwd, label, tagId, uid, hasEffect, audio, limitType, isPureMode, type, gameId, singleRoomSortId) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.getSingleCommonExceptionFunction()) + .flatMap(this.getSingleFunction()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(roomInfo -> { + if (!TextUtils.isEmpty(pwd) || !TextUtils.isEmpty(limitType)) { + AvRoomModel.get().removeIsomerism().subscribe(); + } + }); + } + public Single updateRoomInfoEx(RoomInfo roomInfo) { + return mRoomSettingService.updateRoomInfoEx( + roomInfo.getType(), + roomInfo.getUsedMicSkinId(), + roomInfo.getUsedMicEffectId(), + roomInfo.getRoomId(), + null, + null, + null, + null, + null, + null, + null, + null, + roomInfo.getUid(), + null, + null, + null, + null + ) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.getSingleCommonExceptionFunction()) + .flatMap(this.getSingleFunction()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnSuccess(roomInfoData -> { + + }); + } + + + /** + * 更新房间设置信息 - 主题背景 + */ + public Single updateRoomBackground(long uid, String backPic) { + return mRoomSettingService.updateRoomBackground(uid, backPic) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.getSingleCommonExceptionFunction()) + .flatMap(this.getSingleFunction()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + */ + public Single updateByAdmin(long roomUid, String title,String avatar, String desc, String introduction, String pwd, String label, + int tagId, long uid, String ticket, boolean hasEffect, int audio, boolean isPureMode) { + return mRoomSettingService.updateByAdmin(roomUid, title,avatar,desc, introduction, pwd, label, tagId, uid, hasEffect, audio, isPureMode) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .compose(handleIgnoreData()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新房间设置信息 + * 更新房间的纯净模式 + * for room admin(管理员) + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param isPureMode 是否开启纯净模式 + */ + public Single updateRoomPureMode(long roomUid, String title, String desc, + String introduction, String pwd, String label, + int tagId, boolean hasEffect, int audio, boolean isPureMode) { + return mRoomSettingService.updateRoomPureMode(roomUid, title, desc, introduction, pwd, label, + tagId, AuthModel.get().getCurrentUid(), hasEffect, audio, isPureMode) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.getSingleCommonExceptionFunction()) + .flatMap(this.getSingleFunction()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新房间设置信息 + * 更新房间的纯净模式 + * for room owner(房主) + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param isPureMode 是否开启纯净模式 + */ + public Single updateRoomPureModeForOwner(String title, String desc, + String introduction, String pwd, String label, + int tagId, boolean hasEffect, int audio, + String limitType, boolean isPureMode) { + return mRoomSettingService.updateRoomPureModeOwner(title, desc, introduction, pwd, label, + tagId, AuthModel.get().getCurrentUid(), hasEffect, audio, limitType, isPureMode) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .onErrorResumeNext(this.getSingleCommonExceptionFunction()) + .flatMap(this.getSingleFunction()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public void requestRoomInfoFromService(String uid, CallBack callBack) { + execute(mRoomSettingService.requestRoomInfoFromService(uid, AuthModel.get().getCurrentUid()) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()), callBack); + } + + /** + * @param roomUid 房主uid + */ + public Single leaveModeOpen(long roomUid) { + return mRoomSettingService.leaveModeOpen(roomUid, String.valueOf(AuthModel.get().getCurrentUid())).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.room_model_roomsettingmodel_02)); + } else + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }).compose(RxHelper.handleSchAndExce()); + + } + + /** + * @param roomUid 房主uid + */ + public Single leaveModeClose(long roomUid) { + return mRoomSettingService.leaveModeClose(roomUid).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.room_model_roomsettingmodel_03)); + } else + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }).compose(RxHelper.handleSchAndExce()); + + } + + public interface RoomSettingService { + + /** + * 请求所有的标签列表数据 + * 4.18更改接口,传房间uid + * + * @return + */ + @FormUrlEncoded + @POST("room/tag/v4/all") + Single>> requestTagAll(@Field("uid") long uid); + + /** + * @return + */ + @GET("single/broadcast/sort") + Single>> requestSingleRoomSort(); + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param uid 用户id + * @param limitType 房间限制类型 lock-上锁|isFriend-好友可进|isInvite-邀请可进 + */ + @FormUrlEncoded + @POST("room/update") + Single> updateRoomInfo(@Field("title") String title, + @Field("avatar") String avatar, + @Field("roomDesc") String desc, + @Field("introduction") String introduction, + @Field("roomPwd") String pwd, + @Field("roomTag") String label, + @Field("tagId") int tagId, + @Field("uid") long uid, + @Field("hasAnimationEffect") boolean hasAnimationEffect, + @Field("audioQuality") int audioQuality, + @Field("limitType") String limitType, + @Field("isPureMode") boolean isPureMode, + @Field("type") int type, + @Field("mgId") long gameId, + @Field("singleRoomSortId") Long singleRoomSortId); + @FormUrlEncoded + @POST("room/update") + Single> updateRoomInfoEx(@Field("type") Integer type, + @Field("usedMicSkinId") Integer usedMicSkinId, + @Field("usedMicEffectId") Integer usedMicEffectId, + + @Field("mgId") Long gameId, + @Field("singleRoomSortId") Long singleRoomSortId, + @Field("title") String title, + @Field("avatar") String avatar, + @Field("roomDesc") String desc, + @Field("introduction") String introduction, + @Field("roomPwd") String pwd, + @Field("roomTag") String label, + @Field("tagId") Integer tagId, + @Field("uid") Long uid, + @Field("hasAnimationEffect") Boolean hasAnimationEffect, + @Field("audioQuality") Integer audioQuality, + @Field("limitType") String limitType, + @Field("isPureMode") Boolean isPureMode + ); + + /** + * 更新房间设置信息 - 主题背景 + */ + @FormUrlEncoded + @POST("room/update") + Single> updateRoomBackground(@Field("uid") long uid, @Field("backPic") String backPic); + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param uid 用户id + */ + @FormUrlEncoded + @POST("room/updateByAdmin") + Single> updateByAdmin(@Field("roomUid") long roomUid, + @Field("title") String title, + @Field("avatar") String avatar, + @Field("roomDesc") String desc, + @Field("introduction") String introduction, + @Field("roomPwd") String pwd, + @Field("roomTag") String label, + @Field("tagId") int tagId, + @Field("uid") long uid, + @Field("hasAnimationEffect") boolean hasAnimationEffect, + @Field("audioQuality") int audioQuality, + @Field("isPureMode") boolean isPureMode); + + + /** + * 更新房间设置信息 + * MoliStar项目-打开关闭房间纯净模式-房主修改 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param uid 用户id + * @param limitType 房间限制类型 lock-上锁|isFriend-好友可进|isInvite-邀请可进 + * @param isPureMode 是否开启纯净模式 + */ + @FormUrlEncoded + @POST("room/update") + Single> updateRoomPureModeOwner(@Field("title") String title, @Field("roomDesc") String desc, + @Field("introduction") String introduction, + @Field("roomPwd") String pwd, @Field("roomTag") String label, + @Field("tagId") int tagId, @Field("uid") long uid, + @Field("hasAnimationEffect") boolean hasAnimationEffect, + @Field("audioQuality") int audioQuality, + @Field("limitType") String limitType, + @Field("isPureMode") boolean isPureMode); + + /** + * 更新房间设置信息 + * MoliStar项目-打开关闭房间纯净模式 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + * @param uid 用户id + * @param isPureMode 是否开启纯净模式 + */ + @FormUrlEncoded + @POST("room/updateByAdmin") + Single> updateRoomPureMode(@Field("roomUid") long roomUid, @Field("title") String title, + @Field("roomDesc") String desc, + @Field("introduction") String introduction, + @Field("roomPwd") String pwd, + @Field("roomTag") String label, @Field("tagId") int tagId, + @Field("uid") long uid, + @Field("hasAnimationEffect") boolean hasAnimationEffect, + @Field("audioQuality") int audioQuality, + @Field("isPureMode") boolean isPureMode); + + /** + * 请求服务端信息接口 + * + * @param uId + * @return + */ + @GET("room/get") + Observable> requestRoomInfoFromService(@Query("uid") String uId, @Query("intoUid") long intoUid); + + @FormUrlEncoded + @POST("room/invite") + Single> invite(@Field("roomUid") long roomUid, @Field("uids") String uids); + + @POST("room/leave/mode/open") + Single> leaveModeOpen(@Query("roomUid") long roomUid, @Query("uid") String uid); + + @POST("room/leave/mode/close") + Single> leaveModeClose(@Query("roomUid") long roomUid); + + } +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IAvRoomModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IAvRoomModel.java new file mode 100644 index 0000000..c160e30 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IAvRoomModel.java @@ -0,0 +1,192 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.home.bean.HomeRoomInfo; +import com.chwl.core.room.activitytimer.TimerBean; +import com.chwl.core.room.bean.BroadcastInfo; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomResult; +import com.chwl.core.room.bean.RoomWelcomeConfig; +import com.chwl.core.room.bean.SearchRoomInfo; +import com.chwl.core.room.bean.SimplePartyRoomInfo; +import com.chwl.core.user.bean.FirstChargeInfo; +import com.chwl.library.net.rxnet.callback.CallBack; +import com.google.gson.JsonElement; +import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData; + +import java.util.List; + +import io.reactivex.Observable; +import io.reactivex.Single; +import retrofit2.http.Field; + +public interface IAvRoomModel extends IModel { + + + /** + * 进入云信聊天室 + * + * @param roomId + * @param retryCount 重试次数 + * @return + */ + Observable enterRoom(final long roomId, final int retryCount, final int fromType, final String fromNick, final String fromUid); + + /** + * 离开聊天室(退出房间) + */ + void quitRoom(String roomId); + + /** + * 退出房间 + */ + void exitRoom(CallBack callBack); + + /** + * 通知服务端房间退出 + */ + void quitRoomForOurService(CallBack callBack); + + /** + * 通知服务端房间退出 + */ + void quitRoomForOurService(long roomUid, CallBack callBack); + + /** + * 告知服务端用户退出房间(贵族清除需要) + */ + Observable> quitUserRoom(); + + /** + * 告知服务端用户退出房间(贵族清除需要) + */ + Observable quitUserRoomV2(); + + /** + * 从我们的服务器中获取房间信息 + * + * @param uid + * @param callBack + */ + void requestRoomInfoFromService(String uid, CallBack callBack); + + Single requestRoomInfo(String uid); + + + /** + * 告知服务端用户进入房间(后端统计需要) + * + * @param uid + * @param roomUid + * @return + */ + Single> userRoomIn(String uid, long roomUid, int behaveType, int fromType, String inviteUid); + + void getNormalChatMember(String roomId, final long currentUid); + + /** + * 搜索房间 + */ + Single>> roomSearch(String key, int type); + + /** + * 获取某个用户的房间信息 + */ + Single getUserRoom(long uid); + + /** + * 判断用户是否限制进房 + * + * @return - + */ + Single> getLimitRoomInfo(); + + /** + * 请求房间信息,以single返回 + */ + Single requestRoomResult(String uid, int pageType); + + Single requestRoomInfoV2(String uid, int pageType); + + /** + * 通过服务器接口拉黑 + * + * @param targetUid 被拉黑的uid + */ + Single markBlack(long targetUid); + + /** + * 通过服务器接口设置为管理员 + * + * @param targetUid 被拉黑的uid + * @param isSet true 设置管理, false 取消管理 + */ + Single markManager(long targetUid, boolean isSet); + + /** + * 通过服务器接口移除拉黑 + * + * @param targetUid 被拉黑的uid + */ + Single removeBlack(long targetUid); + + /** + * 获取嗨聊房间列表 + */ + Single>> getPartyRoomList(long uid); + + Single getRoomActTimer(long roomUid); + + Single getWelcomeConfig(long toUid); + + /** + * 搜索房间 + */ + 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); + + Single updateMicToken(@Field("token") String token); + + Single getBroadcastConfig(int type); + + Single sendRoomBroadcast(String msg, long roomId); + + Single cleanScreen(long roomUid, long uid); + + Single> getRecommendRoomList(String roomId); + + Single getNextSingleRoomInfo(); + + Single getNewUserGift(); + + void loadMessageHistory(long startTime); + + Single getFirstCharge(); + + Single postFirstCharge(); + +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyModel.java new file mode 100644 index 0000000..dc774f2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyModel.java @@ -0,0 +1,72 @@ +package com.chwl.core.room.model.inteface; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.chwl.core.base.IModel; +import com.chwl.library.net.rxnet.callback.CallBack; + +import java.util.List; + +import io.reactivex.Single; + +public interface IHomePartyModel extends IModel { + + /** + * 锁坑 + */ + Single lockMicroPhone(int micPosition, String roomUid, String ticker); + + /** + * 释放该麦坑的锁 + * + * @param micPosition + */ + Single unLockMicroPhone(int micPosition, String roomUid, String ticker); + + /** + * 更新麦序 + */ + void updateMicQueue(final String roomId, final String key, String value); + + /** + * 获取固定成员(创建者,管理员,普通用户,受限用户) + * + * @param roomId + * @param time + * @param limit + */ + void loadNormalMembers(String roomId, long time, int limit, final CallBack> callback); + + /** + * 开麦 + * + * @param micPosition + * @param roomUid + */ + Single openMicroPhone(int micPosition, long roomUid); + + /** + * 闭麦 + * + * @param micPosition + * @param roomUid + */ + Single closeMicroPhone(int micPosition, long roomUid); + + /** + * 开闭麦接口 + * + * @param micPosition + * @param state 1:闭麦,0:开麦 + * @param roomUid + * @param ticket + */ + 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); +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyUserListModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyUserListModel.java new file mode 100644 index 0000000..9fc18ef --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IHomePartyUserListModel.java @@ -0,0 +1,30 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.base.IModel; +import com.chwl.core.room.bean.OnlineChatMember; + +import java.util.List; + +import io.reactivex.Single; + +public interface IHomePartyUserListModel extends IModel { + /** + * 分页获取房间成员:第一页包含队列成员,固定成员,游客50人,之后每一页获取游客50人 + * + * @param page 页数 + * @param time 固定成员列表用updateTime, + * 游客列表用进入enterTime, + * 填0会使用当前服务器最新时间开始查询,即第一页,单位毫秒 + */ + Single> getOnLinePageMembers(int page, long time, + List oldList); + +; + Single> onMemberDownUpMic(final String account, + final boolean isUpMic, + final List dataList); + + Single> onUpdateMemberManager(final String account, + final boolean isRemoveManager, + final List dataList); +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IMicQueueModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IMicQueueModel.java new file mode 100644 index 0000000..07783ca --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IMicQueueModel.java @@ -0,0 +1,55 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.room.queuing_mic.bean.RespQueuingMicListInfo; + +import io.reactivex.Single; + +/** + * @author jack + * @Description + * @Date 2018/12/14 + */ +public interface IMicQueueModel { + + /** + * 获取麦序列表 + * + * @param roomId + * @return + */ + Single loadMicQueueList(long roomId, int page, int pageSize); + + /** + * 打开排麦模式 + * @param roomUid 房间 UID + * @return + */ + Single openQueuingMicMode(long roomUid); + + /** + * 关闭排麦模式 + * @param roomUid 房间 UID + * @return + */ + Single closeQueuingMicMode(long roomUid); + + /** + * 报名排麦 + * @param openUid 报名者uid + * @return 新的排麦列表 + */ + Single applyForQueuing(long roomUid, long openUid,int groupType); + + /** + * 取消报名排麦 + * @param openUid 报名者uid + * @return 新的排麦列表 + */ + Single cancelApplyForQueuing(long roomUid, long openUid); + + /** + * 自己取消报名排麦 + * @return 新的排麦列表 + */ + Single cancelApplyForQueuing(); +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IRoomBaseModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomBaseModel.java new file mode 100644 index 0000000..0060ad4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomBaseModel.java @@ -0,0 +1,182 @@ +package com.chwl.core.room.model.inteface; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomInfo; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.util.Entry; +import com.chwl.core.base.IModel; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomResult; +import com.chwl.core.room.pk.bean.RoomPKInvitedUpMicMember; +import com.chwl.core.user.bean.BaseInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.library.net.rxnet.callback.CallBack; + +import java.util.List; + +import io.reactivex.Observable; +import io.reactivex.Single; + +public interface IRoomBaseModel extends IModel { + + + /** + * 获取固定成员列表(操作在子线程,需要在主线程操作的自己转) + * + * @param limit 请求数量 + */ + Single> queryNormalList(int limit); + + /** + * 获取最新固定在线人数(操作在子线程,需要在主线程操作的自己转) + * + * @param limit 请求数量 + */ + Single> queryOnlineList(int limit); + + + /** + * 获取最新在线游客列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit 请求数量 + */ + Single> queryGuestList(int limit); + + /** + * 获取在线游客列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit 获取数量大小 + * @param time 从当前时间开始查找 + */ + Single> queryGuestList(int limit, long time); + + /** + * 获取管理员列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit - + * @return -- + */ + Single> queryManagerList(int limit); + + + /** + * 获取最新黑名单列表 (操作在子线程,需要在主线程操作的自己转) + * + * @param limit 数量 + * @return + */ + Single> queryBlackList(int limit); + + /** + * 设置管理员 + * + * @param roomId + * @param account + * @param mark true:设置管理员 ,false:移除管理员 + */ + void markManagerList(long roomId, String account, boolean mark, CallBack callBack); + + /** + * 拉黑房间成员 + * + * @param roomId + * @param account + * @param mark true:拉黑 ,false:取消拉黑 + * @param callBack + */ + void markBlackList(long roomId, String account, boolean mark, CallBack callBack); + + Single markMemberBlack(final String account, final boolean mark); + + /** + * 邀请上麦 + * + * @param micUid 上麦用户uid + * @param position + * @return Single + */ + Single inviteMicroPhone(long micUid, int position); + + /** + * 邀请上麦,排麦模式下,需要昵称 + * + * @param micInfo 上麦用户基础信息,至少需要uid + * @param position + * @return Single + */ + Single inviteMicroPhone(BaseInfo micInfo, int position); + + void upMicroPhone(int micPosition, String uId, String roomId, + boolean isInviteUpMic, CallBack callBack, int teamId); + + /** + * 上麦 + * + * @param micPosition + * @param uId 要上麦的用户id + * @param roomId + * @param isInviteUpMic 是否是主动的 + * @param callBack + */ + void upMicroPhone(final int micPosition, final String uId, final String roomId, + boolean isInviteUpMic, final CallBack callBack); + + + /** + * 更新或者上麦,用于PK模式 + * + * @param roomPKInvitedUpMicMember + * @return + */ + Single updateOrUpMic(RoomPKInvitedUpMicMember roomPKInvitedUpMicMember); + + /** + * 更新我的麦序信息, + * + * @param micPosition + * @param roomId + * @param userInfo + * @return + */ + Single updateMyMicQueue(int micPosition, String roomId, UserInfo userInfo); + + Single updateMyMicQueue(int micPosition, String roomId, UserInfo userInfo, boolean isNoProhibitMic); + + void downMicroPhone(int micPosition, final CallBack callBack); + + /** + * 获取房间队列信息 + * + * @param roomId + */ + Observable>> queryRoomMicInfo(final String roomId); + + /** + * 获取聊天室信息 + * + * @param roomId 聊天室id + * @return ChatRoomInfo 房间信息 + */ + Observable startGetOnlineMemberNumberJob(final long roomId); + + /** + * 开房间 + * uid:必填 + * type:房间类型,1竞拍房,2悬赏房,必填 + * title:房间标题 + * roomDesc:房间描述 + * backPic:房间背景图 + * rewardId:当type为2时,必填如rewardId + */ + Single openRoom(long uid, int type, String title, String roomDesc, + String backPic, String rewardId, long gameId); + + /** + *关闭公屏 + * true是关闭公屏 + * + * @return - + */ + Single closeScreen(long roomId, boolean isCloseScreen); + +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IRoomCharmModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomCharmModel.java new file mode 100644 index 0000000..90a35f7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomCharmModel.java @@ -0,0 +1,21 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.RoomContributeDataInfo; + +import io.reactivex.Single; + +public interface IRoomCharmModel extends IModel { + /** + * 房间魅力榜(单独取 日榜/周榜/总榜) + * @param roomId + * @param page + * @param pageSize + * @param type {@link RoomContributeDataInfo#TYPE_ROOM_DAY_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_WEEK_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_TOTAL_RANKING} + * @return + */ + Single> getRoomCharmList(String roomId, int page, int pageSize, String type); +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IRoomContributeListModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomContributeListModel.java new file mode 100644 index 0000000..03c2ab8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomContributeListModel.java @@ -0,0 +1,25 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.bean.RoomContributeDataInfo; + +import io.reactivex.Single; + +public interface IRoomContributeListModel extends IModel { + + /** + * 房间贡献榜概要 + */ + public Single> getRankingSummary(); + + /** + * 单独获取某种类型的房间贡献榜 + * @param page 页码 + * @param type 榜单类型 + * {@link RoomContributeDataInfo#TYPE_ROOM_DAY_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_WEEK_RANKING} + * {@link RoomContributeDataInfo#TYPE_ROOM_TOTAL_RANKING} + */ + public Single> getSingleRoomRanking(int page, String type); +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IRoomInviteModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomInviteModel.java new file mode 100644 index 0000000..af1e2f3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomInviteModel.java @@ -0,0 +1,21 @@ +package com.chwl.core.room.model.inteface; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.chwl.core.base.IModel; + +import java.util.List; + +import io.reactivex.Single; + +public interface IRoomInviteModel extends IModel { + + /** + * 分页获取房间成员:第一页包含队列成员,固定成员,游客50人,之后每一页获取游客50人 + * + * @param page 页数 + * @param time 固定成员列表用updateTime, + * 游客列表用进入enterTime, + * 填0会使用当前服务器最新时间开始查询,即第一页,单位毫秒 + */ + public Single> getPageMembers(final int page, long time); +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IRoomRankModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomRankModel.java new file mode 100644 index 0000000..971d01a --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomRankModel.java @@ -0,0 +1,23 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.base.IModel; +import com.chwl.core.room.bean.RoomRankHalfHourDataInfo; + +import io.reactivex.Single; + +public interface IRoomRankModel extends IModel { + /** + * 房间半小时榜 + * + * @param currentRoomUid 房间的uid + */ + Single getRoomRankHalfHourList(long currentRoomUid); + +// /** +// * 房间周星榜 +// * +// * @param uid 用户的uid +// */ +// Single> getRoomRankWeekStarList(long uid); + +} diff --git a/core/src/main/java/com/chwl/core/room/model/inteface/IRoomSettingModel.java b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomSettingModel.java new file mode 100644 index 0000000..dd4298b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/model/inteface/IRoomSettingModel.java @@ -0,0 +1,41 @@ +package com.chwl.core.room.model.inteface; + +import com.chwl.core.base.IModel; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.room.bean.RoomSettingTabInfo; +import com.chwl.library.net.rxnet.callback.CallBack; + +import java.util.List; + +import io.reactivex.Single; + +public interface IRoomSettingModel extends IModel { + + Single> requestTagAll(String ticket); + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + */ + Single updateRoomInfo(String title, String desc, String pwd, String label, + int tagId, long uid, String ticket, boolean hasEffect, int audio); + + /** + * 更新房间设置信息 + * + * @param title + * @param desc + * @param pwd + * @param label 标签名字 + * @param tagId 标签id + */ + Single updateByAdmin(long roomUid, String title, String desc, String pwd, String label, + int tagId, long uid, String ticket, boolean hasEffect, int audio); + + void requestRoomInfoFromService(String uid, CallBack callBack); +} diff --git a/core/src/main/java/com/chwl/core/room/pk/attachment/RoomPkAttachment.java b/core/src/main/java/com/chwl/core/room/pk/attachment/RoomPkAttachment.java new file mode 100644 index 0000000..0bdf598 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/attachment/RoomPkAttachment.java @@ -0,0 +1,55 @@ +package com.chwl.core.room.pk.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.room.pk.bean.RoomPKInvitedUpMicMember; +import com.chwl.core.room.pk.bean.RoomPkData; + +import java.util.Map; + +public class RoomPkAttachment extends CustomAttachment { + + private RoomPkData roomPkData; + private Map roomPKInvitedUpMicMemberMap; + + public RoomPkAttachment(int second) { + super(CustomAttachment.CUSTOM_MESS_HEAD_ROOM_PK, second); + } + + @Override + protected void parseData(JSONObject data) { + if (second == CUSTOM_MESS_SUB_ROOM_PK_INVITE){ + this.roomPKInvitedUpMicMemberMap = new Gson().fromJson(data.toJSONString(), new TypeToken>() { + }.getType()); + }else { + this.roomPkData = new Gson().fromJson(data.toJSONString(), RoomPkData.class); + } + } + + @Override + protected JSONObject packData() { + if (second == CUSTOM_MESS_SUB_ROOM_PK_INVITE){ + return JSON.parseObject(new Gson().toJson(roomPKInvitedUpMicMemberMap)); + } + return JSON.parseObject(JSON.toJSONString(roomPkData)); + } + + public RoomPkData getRoomPkData() { + return roomPkData; + } + + public void setRoomPkData(RoomPkData roomPkData) { + this.roomPkData = roomPkData; + } + + public void setRoomPKInvitedUpMicMember(Map roomPKInvitedUpMicMemberMap) { + this.roomPKInvitedUpMicMemberMap = roomPKInvitedUpMicMemberMap; + } + + public Map getRoomPKInvitedUpMicMemberMap() { + return roomPKInvitedUpMicMemberMap; + } +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKMemberInfo.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKMemberInfo.java new file mode 100644 index 0000000..eae9d9d --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKMemberInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.room.pk.bean; + +import com.chwl.core.user.bean.UserInfo; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/8 + */ +@Data +public class PKMemberInfo { + private int teamId; + private UserInfo userInfo; +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKQueuingMicMemberInfo.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKQueuingMicMemberInfo.java new file mode 100644 index 0000000..732907b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKQueuingMicMemberInfo.java @@ -0,0 +1,24 @@ +package com.chwl.core.room.pk.bean; + +import lombok.Data; + +/** + * 排麦模式中返回的排麦队列里的用户数据 + */ +@Data +public class PKQueuingMicMemberInfo { + + // 排麦用户uid + private long uid; + // 排麦用户耳伴号 + private String erbanNo; + // 排麦用户昵称 + private String nick; + // 排麦用户头像 + private String avatar; + // 排麦用户性别 + private int gender; + //排麦用户组别 + private int groupType; + +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKRecordInfo.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKRecordInfo.java new file mode 100644 index 0000000..2cfb868 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKRecordInfo.java @@ -0,0 +1,27 @@ +package com.chwl.core.room.pk.bean; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/4 + */ +@Data +public class PKRecordInfo { + //pk订单id + private String pkId; + //PK的模式(1:个人模式;2.团队模式) + private int pkMode; + private int voteMode;//投票类型(1.按礼物价值;2.按送礼物人数) + private long duration;//pk时间 + private long createTime;//PK创建时间 + private long beginTime;//开始时间 + private long endTime; //结束时间 + private int result;// PK结果(1:蓝队;2:红队) + private List teams;//参与PK的队伍 + private String roomUid;//房间UID + private String operUid;//操作这Uid +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKRecordListInfo.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKRecordListInfo.java new file mode 100644 index 0000000..db476aa --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKRecordListInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.room.pk.bean; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/4 + */ +@Data +public class PKRecordListInfo { + private List records; + private int count; +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKRespQueuingMicListInfo.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKRespQueuingMicListInfo.java new file mode 100644 index 0000000..c04b961 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKRespQueuingMicListInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.room.pk.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class PKRespQueuingMicListInfo { + + // 返回排麦队列 + private List queue; + // 参与排麦人数 + private int count; + // 我的排麦位置 + private int myPos; +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKTeamInfo.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKTeamInfo.java new file mode 100644 index 0000000..07ff249 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKTeamInfo.java @@ -0,0 +1,38 @@ +package com.chwl.core.room.pk.bean; + +import com.chwl.core.user.bean.UserInfo; + +import java.util.List; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/4 + */ +@Data +public class PKTeamInfo { + public final static int TEAM_NONE = 0; + public final static int TEAM_RED = 2; + public final static int TEAM_BLUE = 1; + + private int team;// 队伍(1:蓝队;2:红队) + private long score;//队伍战斗值 + /** + * 队伍mvp + */ + private String mvp; + + /** + * 队伍守护者 + */ + private UserInfo protector; + /** + * 守护值 + */ + private long protecScore; + + private List teamMembers;//队员 + +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/PKTeamMember.java b/core/src/main/java/com/chwl/core/room/pk/bean/PKTeamMember.java new file mode 100644 index 0000000..0c82664 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/PKTeamMember.java @@ -0,0 +1,18 @@ +package com.chwl.core.room.pk.bean; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/4 + */ +@Data +public class PKTeamMember { + private String uid;//用户uid + private String erbanNo;// + private String nick;//昵称 + private int gender;//性别 + private String avatar;//头像 + private String userDesc;//个人简介 +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/RoomPKInvitedUpMicMember.java b/core/src/main/java/com/chwl/core/room/pk/bean/RoomPKInvitedUpMicMember.java new file mode 100644 index 0000000..1818bf7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/RoomPKInvitedUpMicMember.java @@ -0,0 +1,13 @@ +package com.chwl.core.room.pk.bean; + +import lombok.Data; + +@Data +public class RoomPKInvitedUpMicMember { + private String uid; + private String nick; + private int groupType; + private int position; + + +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/RoomPkData.java b/core/src/main/java/com/chwl/core/room/pk/bean/RoomPkData.java new file mode 100644 index 0000000..add6dbc --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/RoomPkData.java @@ -0,0 +1,126 @@ +package com.chwl.core.room.pk.bean; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import lombok.Data; + +@Data +public class RoomPkData { + + /** + * PK 模式, 个人模式 + */ + public static final int PK_MODE_SOLO = 1; + + /** + * PK 模式,团体模式 + */ + public static final int PK_MODE_TEAM = 2; + + /** + * 投票模式,按礼物价值总数 + */ + public static final int VOTE_MODE_GIFT = 1; + + /** + * 投票模式,按送礼物人数总和 + */ + public static final int VOTE_MODE_PERSON = 2; + + /** + * PK 结果,平局 + */ + public static final int PK_RESULT_DRAW = 0; + + + /** + * PK主键 + */ + private String pkId; + + /** + * PK的模式(1:个人模式;2.团队模式) + */ + private int pkMode; + + /** + * 投票类型(1.按礼物价值;2.按送礼物人数) + */ + private int voteMode; + + /** + * 创建PK的房间 + */ + private long roomUid; + + /** + * 创建PK的人 + */ + private long operUid; + + /** + * PK持续时间(单位:s) + */ + private long duration; + + /** + * PK开始时间 + */ + private long beginTime; + + /** + * PK结束时间(重新开始立即结束,否则为beginTime+duration) + */ + private long endTime; + + /** + * PK创建时间 + */ + private long createTime; + + /** + * 参与PK的队伍 + */ + private List teams; + + /** + * 胜利队伍的ID + * 0 -- 平局 + */ + private int result; + + /** + * 1:尚未开始 + */ + public static final int PK_STATUS_BEFORE_PK = 1; + /** + * 2:正在进行中 + */ + public static final int PK_STATUS_IN_PK = 2; + /** + * 3: 已经结束 + */ + public static final int PK_STATUS_AFTER_PK = 3; + /** + * 4: 提前结束PK + */ + public static final int PK_STATUS_TERMINAL_PK_BEFORE_END = 4; + + /** + * 当前pk 的状态 + */ + private int pkStatus; + + /** + * 当前pk 还有多久结束(秒) + */ + private long curPkTimeUntilEnd; + + /** + * 当前pk 送过礼物的用户Uid 去重后的集合 + */ + private Map>> sendGiftUids; + +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/request/CreatePKMember.java b/core/src/main/java/com/chwl/core/room/pk/bean/request/CreatePKMember.java new file mode 100644 index 0000000..0cf7d04 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/request/CreatePKMember.java @@ -0,0 +1,14 @@ +package com.chwl.core.room.pk.bean.request; + +import lombok.Data; + +/** + * @author jack + * @Description 参与PK的用户(排麦用户格式转化为json,排麦用户格式只需要设置type和uid,标识用户和所在队伍) + * @Date 2019/1/7 + */ +@Data +public class CreatePKMember { + private String uid; + private int type;//(1:蓝队;2:红队) +} diff --git a/core/src/main/java/com/chwl/core/room/pk/bean/response/RespPKData.java b/core/src/main/java/com/chwl/core/room/pk/bean/response/RespPKData.java new file mode 100644 index 0000000..1e8be71 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/bean/response/RespPKData.java @@ -0,0 +1,16 @@ +package com.chwl.core.room.pk.bean.response; + +import com.chwl.core.room.pk.bean.RoomPkData; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/9 + */ +@Data +public class RespPKData { + private long now; + private RoomPkData roomPK; +} diff --git a/core/src/main/java/com/chwl/core/room/pk/event/PKDataUpdateEvent.java b/core/src/main/java/com/chwl/core/room/pk/event/PKDataUpdateEvent.java new file mode 100644 index 0000000..4ec4586 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/event/PKDataUpdateEvent.java @@ -0,0 +1,22 @@ +package com.chwl.core.room.pk.event; + +/** + * @author jack + * @Description PK 相关数据更新的事件 + * @Date 2019/1/13 + */ +public class PKDataUpdateEvent { + public static int TYPE_RESULT = 1; + int type = 0; + + public PKDataUpdateEvent() { + } + + public PKDataUpdateEvent(int type) { + this.type = type; + } + + public int getType() { + return type; + } +} diff --git a/core/src/main/java/com/chwl/core/room/pk/event/PKStateEvent.java b/core/src/main/java/com/chwl/core/room/pk/event/PKStateEvent.java new file mode 100644 index 0000000..5da85c6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/event/PKStateEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.room.pk.event; + +import lombok.Data; + +@Data +public class PKStateEvent { + /** true:create, false:close */ + private boolean isCreate; +} diff --git a/core/src/main/java/com/chwl/core/room/pk/event/PKTimeFinishEvent.java b/core/src/main/java/com/chwl/core/room/pk/event/PKTimeFinishEvent.java new file mode 100644 index 0000000..955d5dc --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/event/PKTimeFinishEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.room.pk.event; + +/** + * @author jack + * @Description + * @Date 2019/1/8 + */ +public class PKTimeFinishEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/pk/event/PKTimeTickEvent.java b/core/src/main/java/com/chwl/core/room/pk/event/PKTimeTickEvent.java new file mode 100644 index 0000000..c5bd8ff --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/event/PKTimeTickEvent.java @@ -0,0 +1,17 @@ +package com.chwl.core.room.pk.event; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2019/1/8 + */ +@Data +public class PKTimeTickEvent { + private long tickTime; + + public PKTimeTickEvent(long tickTime) { + this.tickTime = tickTime; + } +} diff --git a/core/src/main/java/com/chwl/core/room/pk/model/IPkModel.java b/core/src/main/java/com/chwl/core/room/pk/model/IPkModel.java new file mode 100644 index 0000000..a91711b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/model/IPkModel.java @@ -0,0 +1,186 @@ +package com.chwl.core.room.pk.model; + +import androidx.annotation.Nullable; + +import com.chwl.core.base.IModel; +import com.chwl.core.room.pk.bean.PKMemberInfo; +import com.chwl.core.room.pk.bean.PKRecordListInfo; +import com.chwl.core.room.pk.bean.PKRespQueuingMicListInfo; +import com.chwl.core.room.pk.bean.PKTeamInfo; +import com.chwl.core.room.pk.bean.RoomPKInvitedUpMicMember; +import com.chwl.core.room.pk.bean.RoomPkData; +import com.chwl.core.user.bean.UserInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IPkModel extends IModel { + + PKTeamInfo findTeamByTeamId(int teamId); + + @Nullable + RoomPkData getCurPkInfo(); + + boolean isFighting(); + + List getPkMemberInfoList(); + + /** + * 开启pk模式 + * + * @return + */ + Single openPKMode(); + + /** + * 关闭pk模式 + * + * @return + */ + Single closePKMode(); + + /** + * 报名pk + * + * @param groupType {@link PKTeamInfo#TEAM_BLUE} + * {@link PKTeamInfo#TEAM_RED} + * @return + */ + Single joinPKMicQueue(int groupType); + + /** + * 取消报名pk + * + * @return + */ + Single leavePKMicQueue(); + + /** + * 获取pk排麦队列长度 + * + * @param roomUid + * @return + */ + Single loadPKMicQueueSize(long roomUid); + + /** + * 获取pk排麦队列信息 + * + * @param page + * @param pageSize + * @return + */ + Single loadPKMicQueueList(int page, + int pageSize); + + /** + * 获取pk记录 + * + * @param roomUid + * @param page + * @param pageSize + * @return + */ + Single loadPKRecordList(long roomUid, + int page, + int pageSize); + + /** + * 创建PK + * + * @param pkMode pk模式(1:团队,2:个人) + * @param voteMode 投票方式(1:礼物价值,2:送礼物人数) + * @param duration pk持续时间(以秒为单位) + * @param redTeamMembers + * @param blueTeamMembers + * @return + */ + Single createPK(int pkMode, + int voteMode, + long duration, + List redTeamMembers, + List blueTeamMembers); + + int getTeamIdInPKMemberList(String account); + + /** + * 开始PK + * + * @return + */ + Single beginPK(); + + /** + * GET + * 获取房间最近一次PK模式 + * + * @param roomUid + * @return + */ + Single loadPKDataByRoomId(long roomUid); + + /** + * 排麦列表抱上队伍 + * + * @param micMemberInfo + * @return + */ + Single inviteInTeam(List micMemberInfo); + + /** + * 添加进PK 列表 + * + * @param userInfo + * @param groupType + */ + void syncPkList(UserInfo userInfo, int groupType); + + /** + * 获取到云信过来的Pk 结果 + * + * @param roomPkData + */ + void onReceivePKCreate(RoomPkData roomPkData); + + /** + * 获取到云信过来的Pk 结果 + * + * @param roomPkData + */ + void onReceivePKResult(RoomPkData roomPkData); + + /** + * 获取到云信过来的PK开始消息 + * + * @param roomPkData + */ + void onReceivePKBegin(RoomPkData roomPkData); + + /** + * 再次PK + * + * @return + */ + Single toPKAgain(); + + /** + * PK队员退出房间 + * + * @param account + */ + void onTeamMemberExitRoom(String account); + + /** + * 查询PK结果 + * + * @param pkId + * @return + */ + Single loadPKDataById(String pkId); + + /** + * 收到PK关闭时候处理 + */ + void onClosePk(); +} diff --git a/core/src/main/java/com/chwl/core/room/pk/model/PkModel.java b/core/src/main/java/com/chwl/core/room/pk/model/PkModel.java new file mode 100644 index 0000000..c8cd2fa --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/pk/model/PkModel.java @@ -0,0 +1,1343 @@ +package com.chwl.core.room.pk.model; + +import android.annotation.SuppressLint; +import android.os.CountDownTimer; +import android.util.SparseArray; + +import androidx.annotation.Nullable; + +import com.chwl.core.gift.bean.GiftType; +import com.google.gson.Gson; +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.orhanobut.logger.Logger; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.RoomQueueInfo; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.GiftModel; +import com.chwl.core.gift.bean.GiftInfo; +import com.chwl.core.gift.bean.GiftList; +import com.chwl.core.gift.bean.GiftMultiReceiverInfo; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.bean.GiftReceiver; +import com.chwl.core.gift.bean.LuckyBagGifts; +import com.chwl.core.gift.bean.MultiGiftReceiveInfo; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.magic.MagicModel; +import com.chwl.core.magic.bean.MagicInfo; +import com.chwl.core.magic.bean.MagicReceivedInfo; +import com.chwl.core.magic.bean.MultiMagicReceivedInfo; +import com.chwl.core.manager.AudioEngineManager; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.room.model.AvRoomModel; +import com.chwl.core.room.pk.attachment.RoomPkAttachment; +import com.chwl.core.room.pk.bean.PKMemberInfo; +import com.chwl.core.room.pk.bean.PKRecordListInfo; +import com.chwl.core.room.pk.bean.PKRespQueuingMicListInfo; +import com.chwl.core.room.pk.bean.PKTeamInfo; +import com.chwl.core.room.pk.bean.PKTeamMember; +import com.chwl.core.room.pk.bean.RoomPKInvitedUpMicMember; +import com.chwl.core.room.pk.bean.RoomPkData; +import com.chwl.core.room.pk.bean.request.CreatePKMember; +import com.chwl.core.room.pk.bean.response.RespPKData; +import com.chwl.core.room.pk.event.PKDataUpdateEvent; +import com.chwl.core.room.pk.event.PKTimeFinishEvent; +import com.chwl.core.room.pk.event.PKTimeTickEvent; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; +import io.reactivex.SingleEmitter; +import io.reactivex.SingleObserver; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.BiConsumer; +import io.reactivex.functions.Function; +import retrofit2.http.DELETE; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class PkModel extends BaseModel implements IPkModel { + + public final static int TEAM_MAX_SIZE = 4; + + public final static int PK_MODE_TEAM = 1; + public final static int PK_MODE_PERSONAL = 2; + + public final static int PK_VOTE_MODE_GIFT_VALUE = RoomPkData.VOTE_MODE_GIFT; + public final static int PK_VOTE_MODE_PEOPLE_COUNT = RoomPkData.VOTE_MODE_PERSON; + + private Api api; + + private static volatile IPkModel instance; + + public static IPkModel get() { + if (instance == null) { + synchronized (PkModel.class) { + if (instance == null) { + instance = new PkModel(); + } + } + } + return instance; + } + + @SuppressLint("CheckResult") + private PkModel() { + api = RxNet.create(Api.class); + //PK模块需要礼物统计 + IMNetEaseManager.get().getChatRoomEventObservable() + .filter(roomEvent -> curPkInfo != null + && curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_IN_PK + && (RoomEvent.RECEIVE_NORMALE_GIFT == roomEvent.getEvent() + || RoomEvent.RECEIVE_MUTLT_NORMALEI_GIFT == roomEvent.getEvent() + || RoomEvent.RECEIVE_ALL_MIC__NORMALEI_GIFT == roomEvent.getEvent() + || RoomEvent.RECEIVED_SINGLE_MAGIC == roomEvent.getEvent() + || RoomEvent.RECEIVED_ALL_MIC_MAGIC == roomEvent.getEvent() + || RoomEvent.RECEIVE_LUCKY_GIFT == roomEvent.getEvent() + || RoomEvent.RECEIVE_MULTI_LUCKY_GIFT == roomEvent.getEvent() + || RoomEvent.RECEIVE_ALL_MIC_LUCKY_GIFT == roomEvent.getEvent())) + .subscribe(roomEvent -> { + int teamId = 0; + switch (roomEvent.getEvent()) { + case RoomEvent.RECEIVE_NORMALE_GIFT: + GiftReceiveInfo giftReceiveInfo = roomEvent.getGiftReceiveInfo(); + if (giftReceiveInfo == null || !isGoldGift(giftReceiveInfo.getGift())) { + //钻石礼物才算分数 + return; + } + if (giftReceiveInfo.getGift() != null && giftReceiveInfo.getGift().getGiftType() == GiftType.GIFT_TYPE_SUPER_LUCKY) { + // 超级幸运礼物不算分数 + return; + } + teamId = getTeamIdInPKMemberList(String.valueOf(giftReceiveInfo.getTargetUid())); + if (teamId != 0) { + if (curPkInfo.getVoteMode() == PK_VOTE_MODE_GIFT_VALUE) { + addTeamScoreByGiftValue(teamId, giftReceiveInfo.getGiftNum() * giftReceiveInfo.getGift().getGoldPrice()); + } else if (curPkInfo.getVoteMode() == PK_VOTE_MODE_PEOPLE_COUNT) { + addTeamScoreByPeopleCount(teamId, giftReceiveInfo.getUid(), giftReceiveInfo.getTargetUid()); + } + } + + break; + case RoomEvent.RECEIVE_MUTLT_NORMALEI_GIFT: + GiftMultiReceiverInfo giftMultiReceiverInfo = roomEvent.getGiftMultiReceiverInfo(); + if (giftMultiReceiverInfo == null || !isGoldGift(giftMultiReceiverInfo.getGift())) { + //钻石礼物才算分数 + return; + } + if (giftMultiReceiverInfo.getGift() != null && giftMultiReceiverInfo.getGift().getGiftType() == GiftType.GIFT_TYPE_SUPER_LUCKY) { + // 超级幸运礼物不算分数 + return; + } + for (GiftReceiver giftReceiver : giftMultiReceiverInfo.getTargetUsers()) { + teamId = getTeamIdInPKMemberList(String.valueOf(giftReceiver.getUid())); + if (teamId != 0) { + if (curPkInfo.getVoteMode() == PK_VOTE_MODE_GIFT_VALUE) { + addTeamScoreByGiftValue(teamId, giftMultiReceiverInfo.getGiftNum() * giftMultiReceiverInfo.getGift().getGoldPrice()); + } else if (curPkInfo.getVoteMode() == PK_VOTE_MODE_PEOPLE_COUNT) { + addTeamScoreByPeopleCount(teamId, giftMultiReceiverInfo.getUid(), giftReceiver.getUid()); + } + } + } + + break; + case RoomEvent.RECEIVE_ALL_MIC__NORMALEI_GIFT: + MultiGiftReceiveInfo multiReceiverInfo = roomEvent.getMultiGiftReceiveInfo(); + if (multiReceiverInfo == null || !isGoldGift(multiReceiverInfo.getGift())) { + //钻石礼物才算分数 + return; + } + if (multiReceiverInfo.getGift() != null && multiReceiverInfo.getGift().getGiftType() == GiftType.GIFT_TYPE_SUPER_LUCKY) { + // 超级幸运礼物不算分数 + return; + } + for (Long targetUid : multiReceiverInfo.getTargetUids()) { + teamId = getTeamIdInPKMemberList(String.valueOf(targetUid)); + if (teamId != 0) { + if (curPkInfo.getVoteMode() == PK_VOTE_MODE_GIFT_VALUE) { + addTeamScoreByGiftValue(teamId, multiReceiverInfo.getGiftNum() * multiReceiverInfo.getGift().getGoldPrice()); + } else if (curPkInfo.getVoteMode() == PK_VOTE_MODE_PEOPLE_COUNT) { + addTeamScoreByPeopleCount(teamId, multiReceiverInfo.getUid(), targetUid); + } + } + } + + break; + case RoomEvent.RECEIVED_SINGLE_MAGIC: + MagicReceivedInfo magicReceivedInfo = roomEvent.getMagicReceivedInfo(); + teamId = getTeamIdInPKMemberList(String.valueOf(magicReceivedInfo.getTargetUid())); + if (teamId != 0) { + if (curPkInfo.getVoteMode() == PK_VOTE_MODE_GIFT_VALUE) { + MagicInfo magicInfo = MagicModel.get().getMagicInfo(magicReceivedInfo.getMagicId()); + if (magicInfo != null) { + addTeamScoreByGiftValue(teamId, (int) (magicReceivedInfo.getNumber() * magicInfo.getPrice())); + } + } else if (curPkInfo.getVoteMode() == PK_VOTE_MODE_PEOPLE_COUNT) { + addTeamScoreByPeopleCount(teamId, magicReceivedInfo.getUid(), magicReceivedInfo.getTargetUid()); + } + } + + break; + case RoomEvent.RECEIVED_ALL_MIC_MAGIC: + MultiMagicReceivedInfo multiMagicReceivedInfo = roomEvent.getMultiMagicReceivedInfo(); + for (Long aLong : multiMagicReceivedInfo.getTargetUids()) { + teamId = getTeamIdInPKMemberList(String.valueOf(aLong)); + if (teamId != 0) { + if (curPkInfo.getVoteMode() == PK_VOTE_MODE_GIFT_VALUE) { + MagicInfo magicInfo = MagicModel.get().getMagicInfo(multiMagicReceivedInfo.getMagicId()); + if (magicInfo != null) { + addTeamScoreByGiftValue(teamId, (int) (multiMagicReceivedInfo.getNumber() * magicInfo.getPrice())); + } + } else if (curPkInfo.getVoteMode() == PK_VOTE_MODE_PEOPLE_COUNT) { + addTeamScoreByPeopleCount(teamId, multiMagicReceivedInfo.getUid(), aLong); + } + } + } + + break; + case RoomEvent.RECEIVE_LUCKY_GIFT: + case RoomEvent.RECEIVE_MULTI_LUCKY_GIFT: + case RoomEvent.RECEIVE_ALL_MIC_LUCKY_GIFT: + LuckyBagGifts luckyBagGifts = roomEvent.getLuckygiftMultiReceiverInfo(); + teamId = getTeamIdInPKMemberList(String.valueOf(luckyBagGifts.getTargetUid())); + if (teamId != 0) { + if (curPkInfo.getVoteMode() == PK_VOTE_MODE_GIFT_VALUE) { + int totalPrice = 0; + for (GiftList giftList : luckyBagGifts.getGiftList()) { + GiftInfo giftInfo = GiftModel.get().findGiftInfoById(giftList.getGiftId()); + if (giftInfo != null) { + totalPrice += giftList.getGiftNum() * giftInfo.getGoldPrice(); + } + } + addTeamScoreByGiftValue(teamId, totalPrice); + } else if (curPkInfo.getVoteMode() == PK_VOTE_MODE_PEOPLE_COUNT) { + addTeamScoreByPeopleCount(teamId, luckyBagGifts.getUid(), luckyBagGifts.getTargetUid()); + } + } + break; + } + }); + } + + /** + * 判断是否是钻石礼物 + * + * @param giftInfo + * @return + */ + private boolean isGoldGift(GiftInfo giftInfo) { + return giftInfo != null && (giftInfo.getConsumeType() == GiftInfo.CONSUME_TYPE_GOLD || giftInfo.getConsumeType() == GiftInfo.CONSUME_TYPE_FREE_GIFT); + } + + /** + * 根据人数统计 + * + * @param teamId + * @param uid 送礼物者 + * @param targetUid 收礼物者 + */ + private void addTeamScoreByPeopleCount(int teamId, long uid, long targetUid) { + PKTeamInfo pkTeamInfo = findTeamByTeamId(teamId); + if (pkTeamInfo == null) { + return; + } + //如果这个人不是这个队伍的,不算 + if (teamId != getTeamIdInPKMemberList(String.valueOf(targetUid))) { + return; + } + + Map> setMap = mapHashMap.get(teamId); + if (null == setMap) { + setMap = new HashMap<>(); + mapHashMap.put(teamId, setMap); + } + Set stringSet = setMap.get(targetUid); + if (null == stringSet) { + stringSet = new HashSet<>(); + setMap.put(targetUid, stringSet); + } + stringSet.add(uid); + + Iterator>> iterator = setMap.entrySet().iterator(); + long score = 0; + while (iterator.hasNext()) { + Map.Entry> next = iterator.next(); + score += next.getValue().size(); + } + pkTeamInfo.setScore(score); + EventBus.getDefault().post(new PKDataUpdateEvent()); + } + + /** + * 根据礼物价值统计 + * + * @param teamId + * @param value + */ + private void addTeamScoreByGiftValue(int teamId, int value) { + PKTeamInfo pkTeamInfo = findTeamByTeamId(teamId); + if (pkTeamInfo == null) { + return; + } + pkTeamInfo.setScore(pkTeamInfo.getScore() + value); + EventBus.getDefault().post(new PKDataUpdateEvent()); + } + + /** + * 查找队伍 + * + * @param teamId + * @return + */ + @Override + public PKTeamInfo findTeamByTeamId(int teamId) { + if (curPkInfo == null || curPkInfo.getTeams() == null) { + return null; + } + for (PKTeamInfo pkTeamInfo : curPkInfo.getTeams()) { + if (teamId == pkTeamInfo.getTeam()) { + return pkTeamInfo; + } + } + return null; + } + + private volatile RoomPkData curPkInfo; + private Map>> mapHashMap = new HashMap<>();//统计人数需要 + private List pkMemberInfoList = new ArrayList<>(); + private CountDownTimer countDownTimer; + + + private void setCurPkInfo(RoomPkData curPkInfo) { + this.curPkInfo = curPkInfo; + if (curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_BEFORE_PK || + curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_AFTER_PK) { + pkMemberInfoList.clear(); + //从麦序上获取同步队伍信息 + SparseArray micQueue = AvRoomDataManager.get().mMicQueueMemberMap; + for (int i = 0; i < micQueue.size(); i++) { + int key = micQueue.keyAt(i); + RoomQueueInfo roomQueueInfo = micQueue.get(key); + if (roomQueueInfo.mChatRoomMember != null && roomQueueInfo.mChatRoomMember.getGroupType() > 0) { + PKMemberInfo pkMemberInfo = new PKMemberInfo(); + pkMemberInfo.setTeamId(roomQueueInfo.mChatRoomMember.getGroupType()); + UserInfo userInfo = new UserInfo(); + 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.mChatRoomMember.getGender()); + pkMemberInfo.setUserInfo(userInfo); + pkMemberInfoList.add(pkMemberInfo); + } + + } + } else if (curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_IN_PK) { + //从同步队伍信息 + pkMemberInfoList.clear(); + for (PKTeamInfo pkTeamInfo : curPkInfo.getTeams()) { + for (PKTeamMember pkTeamMember : pkTeamInfo.getTeamMembers()) { + PKMemberInfo pkMemberInfo = new PKMemberInfo(); + pkMemberInfo.setTeamId(pkTeamInfo.getTeam()); + UserInfo userInfo = new UserInfo(); + userInfo.setGroupType(pkTeamInfo.getTeam()); + userInfo.setUid(Long.parseLong(pkTeamMember.getUid())); + userInfo.setNick(pkTeamMember.getNick()); + userInfo.setAvatar(pkTeamMember.getAvatar()); + userInfo.setGender(pkTeamMember.getGender()); + pkMemberInfo.setUserInfo(userInfo); + pkMemberInfoList.add(pkMemberInfo); + } + } + //倒计时 + startPKCountDownTime(); + } + + } + + @Nullable + @Override + public RoomPkData getCurPkInfo() { + return curPkInfo; + } + + @Override + public boolean isFighting() { + return curPkInfo != null && curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_IN_PK; + } + + @Override + public List getPkMemberInfoList() { + return pkMemberInfoList; + } + + + /** + * 合并加入pk 的麦上的人 + * + * @param joinPKMembers + * @param teamID + */ + private void mergeJoinPKUseList(List joinPKMembers, int teamID) { + Iterator iterator = pkMemberInfoList.iterator(); + while (iterator.hasNext()) { + PKMemberInfo createPKMember = iterator.next(); + if (createPKMember.getTeamId() != teamID) { + continue; + } + UserInfo userInfo = findUserInfoInTeam(createPKMember.getUserInfo().getUid(), joinPKMembers); + if (null == userInfo) { + createPKMember.setTeamId(PKTeamInfo.TEAM_NONE); + } else { + iterator.remove(); + } + } + for (int i = 0; i < joinPKMembers.size(); i++) { + PKMemberInfo createPKMember = new PKMemberInfo(); + createPKMember.setTeamId(teamID); + joinPKMembers.get(i).setGroupType(teamID); + createPKMember.setUserInfo(joinPKMembers.get(i)); + pkMemberInfoList.add(createPKMember); + } + } + + private UserInfo findUserInfoInTeam(long uid, List joinPKMembers) { + for (UserInfo joinPKMember : joinPKMembers) { + if (uid == joinPKMember.getUid()) { + return joinPKMember; + } + } + return null; + } + + /** + * 开启pk模式 + * + * @return + */ + @Override + public Single openPKMode() { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_01))); + } + if (AuthModel.get().getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_02))); + } + return api.openPKMode( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid() + ) + .flatMap(stringServiceResult -> { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.pk_model_pkmodel_03)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()) + ; + } + + /** + * 关闭pk模式 + * + * @return + */ + @Override + public Single closePKMode() { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_04))); + } + if (AuthModel.get().getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_05))); + } + return api.closePKMode( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid() + ) + .flatMap(stringServiceResult -> { + if (stringServiceResult.isSuccess()) { + //后台发自定义消息通知所有房间内的人关闭了pk + onClosePk(); + return Single.just(ResUtil.getString(R.string.pk_model_pkmodel_06)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()) + ; + } + + + /** + * 报名pk + * + * @param groupType {@link PKTeamInfo#TEAM_BLUE} + * {@link PKTeamInfo#TEAM_RED} + * @return + */ + @Override + public Single joinPKMicQueue(int groupType) { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_07))); + } + if (AuthModel.get().getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_08))); + } + + return api.joinPK( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid(), + groupType + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + + ; + } + + + /** + * 取消报名pk + * + * @return + */ + @Override + public Single leavePKMicQueue() { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_09))); + } + if (AuthModel.get().getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_010))); + } + return api.leavePK( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid() + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + ; + } + + /** + * 获取pk排麦队列长度 + * + * @param roomUid + * @return + */ + @Override + public Single loadPKMicQueueSize(long roomUid) { + return api.loadPKMicQueueSize(roomUid) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 获取pk排麦队列信息 + * + * @return + */ + @Override + public Single loadPKMicQueueList(int page, + int pageSize) { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_011))); + } + if (AuthModel.get().getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_012))); + } + + return api.loadPKMicQueueList( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid(), + page, + pageSize + ) + .flatMap(respQueuingMicListInfoServiceResult -> { + if (respQueuingMicListInfoServiceResult.isSuccess()) { + if (respQueuingMicListInfoServiceResult.getData() == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_013))); + } + return Single.just(respQueuingMicListInfoServiceResult.getData()); + } + return Single.error(new Throwable(respQueuingMicListInfoServiceResult.getMessage())); + }) + .compose(RxHelper.handleSchedulers()) + ; + } + + + /** + * 获取pk记录 + * + * @param roomUid + * @param page + * @param pageSize + * @return + */ + @Override + public Single loadPKRecordList(long roomUid, + int page, + int pageSize) { + return api.loadPKRecordList( + roomUid, + page, + pageSize + ) + .flatMap(pkRecordListInfoServiceResult -> { + if (pkRecordListInfoServiceResult.isSuccess()) { + return Single.just(pkRecordListInfoServiceResult.getData()); + } + return Single.error(new Throwable(pkRecordListInfoServiceResult.getMessage())); + }) + .compose(RxHelper.handleSchedulers()) + ; + } + + + /** + * 创建PK + * + * @param pkMode pk模式(1:团队,2:个人) + * @param voteMode 投票方式(1:礼物价值,2:送礼物人数) + * @param duration pk持续时间(以秒为单位) + * @param redTeamMembers + * @param blueTeamMembers + * @return + */ + @Override + public Single createPK(int pkMode, + int voteMode, + long duration, + List redTeamMembers, + List blueTeamMembers) { + + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_014))); + } + if (AuthModel.get().getCurrentUid() == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_015))); + } + + return api.createPK( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid(), + pkMode, + voteMode, + duration + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult result) throws Exception { + if (result.isSuccess()) { + mapHashMap.clear(); + curPkInfo = result.getData(); + curPkInfo.setCurPkTimeUntilEnd(curPkInfo.getDuration()); + //更新合并队伍信息,更新麦序 + mergeJoinPKUseList(redTeamMembers, PKTeamInfo.TEAM_RED); + mergeJoinPKUseList(blueTeamMembers, PKTeamInfo.TEAM_BLUE); + + + //后台发自定义消息通知所有房间内的人创建了pk,这里客户端不用发 + + + //发送给自定义消息 + List upMicMemberList = new ArrayList<>(); + for (PKMemberInfo pkMemberInfo : pkMemberInfoList) { + RoomPKInvitedUpMicMember roomPKInvitedUpMicMember = new RoomPKInvitedUpMicMember(); + roomPKInvitedUpMicMember.setGroupType(pkMemberInfo.getTeamId()); + roomPKInvitedUpMicMember.setUid(String.valueOf(pkMemberInfo.getUserInfo().getUid())); + roomPKInvitedUpMicMember.setNick(pkMemberInfo.getUserInfo().getNick()); + SparseArray micQueue = AvRoomDataManager.get().mMicQueueMemberMap; + //设置坑位的位置 + for (int i = 0; i < micQueue.size(); i++) { + int key = micQueue.keyAt(i); + RoomQueueInfo roomQueueInfo = micQueue.get(key); + if (roomQueueInfo.mChatRoomMember != null && + roomQueueInfo.mChatRoomMember.getAccount().equals(String.valueOf(pkMemberInfo.getUserInfo().getUid()))) { + roomPKInvitedUpMicMember.setPosition(key); + } + } + upMicMemberList.add(roomPKInvitedUpMicMember); + } + inviteInTeam(upMicMemberList).subscribe(new BiConsumer() { + @Override + public void accept(String s, Throwable throwable) throws Exception { + if (throwable != null) { +// Toast.makeText(getContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show(); + SingleToastUtil.showToastShort(throwable.getMessage()); + } + } + }); + + return Single.just(ResUtil.getString(R.string.pk_model_pkmodel_016)); + } + return Single.error(new Throwable(result.getMessage())); + } + }) + + ; + } + + /** + * 云信发自定义消息自己收不到的,这里如果pk 包含自己需要自己更新自己的麦序 + */ + private void updateMyMicQueue() { + PKMemberInfo pkMemberInfo = getSelfInPkList(); + if (pkMemberInfo == null) { + return; + } + //本地麦序 + SparseArray micQueue = AvRoomDataManager.get().mMicQueueMemberMap; + for (int i = 0; i < micQueue.size(); i++) { + int key = micQueue.keyAt(i); + RoomQueueInfo roomQueueInfo = micQueue.get(key); + if (null != roomQueueInfo.mChatRoomMember + && roomQueueInfo.mChatRoomMember.getAccount().equals(String.valueOf(pkMemberInfo.getUserInfo().getUid()))) { + roomQueueInfo.mChatRoomMember.setGroupType(getTeamIdInPKMemberList(roomQueueInfo.mChatRoomMember.getAccount())); + pkMemberInfo.getUserInfo().setGroupType(roomQueueInfo.mChatRoomMember.getGroupType()); + //改变麦状态 + AvRoomModel.get().updateMyMicQueue( + key, + String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId()), + pkMemberInfo.getUserInfo(), + !AudioEngineManager.get().isMute() + ) + .subscribe(); + } + } + } + + @Override + public int getTeamIdInPKMemberList(String account) { + for (PKMemberInfo pkMemberInfo : pkMemberInfoList) { + if (account.equals(String.valueOf(pkMemberInfo.getUserInfo().getUid()))) { + return pkMemberInfo.getTeamId(); + } + } + return PKTeamInfo.TEAM_NONE; + } + + private PKMemberInfo getSelfInPkList() { + return findInPkListByUid(AuthModel.get().getCurrentUid()); + } + + private PKMemberInfo findInPkListByUid(long uid) { + for (PKMemberInfo pkMemberInfo : pkMemberInfoList) { + if (uid == pkMemberInfo.getUserInfo().getUid()) { + return pkMemberInfo; + } + } + return null; + } + + + /** + * 开始PK + * + * @return + */ + @Override + public Single beginPK() { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_017))); + } + if (curPkInfo == null || curPkInfo.getPkStatus() != RoomPkData.PK_STATUS_BEFORE_PK) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_018))); + } + if (!isPKReadyToBegin()) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_019))); + } + + List createPKMembers = new ArrayList<>(); + for (PKMemberInfo pkMemberInfo : pkMemberInfoList) { + CreatePKMember createPKMember = new CreatePKMember(); + createPKMember.setUid(String.valueOf(pkMemberInfo.getUserInfo().getUid())); + createPKMember.setType(pkMemberInfo.getTeamId()); + createPKMembers.add(createPKMember); + } + + return api.beginPK( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + curPkInfo.getPkId(), + new Gson().toJson(createPKMembers) + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult response) throws Exception { + if (response.isSuccess()) { + //后台发自定义消息通知所有房间内的人开始了pk + + return Single.just(ResUtil.getString(R.string.pk_model_pkmodel_020)); + } + return Single.error(new Throwable(response.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + + abstract class PKCountDownTimer extends CountDownTimer { + + PKCountDownTimer(long millisInFuture) { + super(millisInFuture * 1000, 1000); + } + + } + + /** + * 判断pk 是否准备好 + * + * @return + */ + private boolean isPKReadyToBegin() { + //如果没有创建PK信息 + if (curPkInfo == null) { + return false; + } + //如果PK队伍小于2 + int teamId = -1; + int teamCount = 0; + for (PKMemberInfo pkMemberInfo : pkMemberInfoList) { + if (pkMemberInfo.getTeamId() != teamId) { + teamId = pkMemberInfo.getTeamId(); + teamCount++; + } + } + if (teamCount < 2) { + return false; + } + return true; + } + + + /** + * GET + * 获取房间最近一次PK模式 + * + * @param roomUid + * @return + */ + @Override + public Single loadPKDataByRoomId(long roomUid) { + return api.loadPKDataByRoomId( + roomUid + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult respPKDataServiceResult) throws Exception { + if (respPKDataServiceResult.isSuccess()) { + RoomPkData roomPkData = respPKDataServiceResult.getData().getRoomPK(); + if (roomPkData != null) { + long sec = (roomPkData.getEndTime() - respPKDataServiceResult.getData().getNow()) / 1000; + if (sec < 0) { + sec = 0; + } + roomPkData.setCurPkTimeUntilEnd(sec); + if (roomPkData.getSendGiftUids() != null + && roomPkData.getPkStatus() == RoomPkData.PK_STATUS_IN_PK) { + mapHashMap = roomPkData.getSendGiftUids(); + } else { + mapHashMap.clear(); + } + setCurPkInfo(roomPkData); + return Single.just(roomPkData); + } + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_021))); + } + return Single.error(new Throwable(respPKDataServiceResult.getMessage())); + } + }) + ; + } + + @Override + public Single inviteInTeam(List roomPKInvitedUpMicMember) { + return Single.create((SingleOnSubscribe) e -> { + //发送给自定义消息 + RoomPkAttachment roomPkAttachment = new RoomPkAttachment(CustomAttachment.CUSTOM_MESS_SUB_ROOM_PK_INVITE); + Map micMemberMap = new HashMap<>(); + for (RoomPKInvitedUpMicMember pkInvitedUpMicMember : roomPKInvitedUpMicMember) { + micMemberMap.put(pkInvitedUpMicMember.getUid(), pkInvitedUpMicMember); + } + roomPkAttachment.setRoomPKInvitedUpMicMember(micMemberMap); + ChatRoomMessage inviteToTeamMsg = ChatRoomMessageBuilder.createChatRoomCustomMessage( + // 聊天室id + AvRoomDataManager.get().mCurrentRoomInfo.getRoomId() + "", + //attachment + roomPkAttachment + ); + + e.onSuccess(inviteToTeamMsg); + }) + .flatMap(msg -> IMNetEaseManager.get().sendChatRoomMessage(msg, false)) + .flatMap((Function>) chatRoomMessage -> { + //添加公屏 + RoomPkAttachment roomPkAttachment = (RoomPkAttachment) chatRoomMessage.getAttachment(); + Map inviteMap = roomPkAttachment.getRoomPKInvitedUpMicMemberMap(); + Iterator> iterator = inviteMap.entrySet().iterator(); + RoomPKInvitedUpMicMember self = null; + boolean isInTeam = false; + while (iterator.hasNext()) { + RoomPKInvitedUpMicMember value = iterator.next().getValue(); + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(value.getUid())) { + self = value; + } + //已经在队伍里面的人就不显示进队伍 + if (PkModel.get().getTeamIdInPKMemberList(value.getUid()) > 0) { + continue; + } + if (value.getGroupType() != PKTeamInfo.TEAM_NONE) { + isInTeam = true; + } + } + if (isInTeam) { + IMNetEaseManager.get().addMessagesImmediately(chatRoomMessage); + } + + //如果是自己进队伍、出队伍,自己改变自己的麦序信息 + if (self != null) { + UserModel.get().getCacheLoginUserInfo().setGroupType(self.getGroupType()); + AvRoomModel.get().updateMyMicQueue( + self.getPosition(), + String.valueOf(AvRoomDataManager.get().mCurrentRoomInfo.getRoomId()), + UserModel.get().getCacheLoginUserInfo(), + !AudioEngineManager.get().isMute() + ) + .subscribe(); + } + return Single.just(ResUtil.getString(R.string.pk_model_pkmodel_022)); + }) + ; + } + + @Override + public void syncPkList(UserInfo userInfo, int groupType) { + PKMemberInfo createPKMember = findInPkListByUid(userInfo.getUid()); + if (groupType == PKTeamInfo.TEAM_NONE) { + for (int i = 0; i < pkMemberInfoList.size(); i++) { + if (pkMemberInfoList.get(i).getUserInfo().getUid() == userInfo.getUid()) { + pkMemberInfoList.remove(i); + break; + } + } + return; + } + if (createPKMember == null) { + createPKMember = new PKMemberInfo(); + createPKMember.setTeamId(groupType); + createPKMember.setUserInfo(userInfo); + pkMemberInfoList.add(createPKMember); + } else { + createPKMember.setTeamId(groupType); + createPKMember.setUserInfo(userInfo); + } + } + + @Override + public void onReceivePKCreate(RoomPkData roomPkData) { + roomPkData.setCurPkTimeUntilEnd(roomPkData.getDuration()); + setCurPkInfo(roomPkData); + if (countDownTimer != null) { + countDownTimer.cancel(); + countDownTimer = null; + } + } + + @Override + public void onReceivePKResult(RoomPkData roomPkData) { + //这里处理云信PK结果 + if (curPkInfo != null && + !curPkInfo.getPkId().equals(roomPkData.getPkId())) { + return; + } + + if (roomPkData.getPkStatus() != RoomPkData.PK_STATUS_TERMINAL_PK_BEFORE_END) { + //去掉队伍 + for (PKMemberInfo pkMemberInfo : pkMemberInfoList) { + pkMemberInfo.setTeamId(PKTeamInfo.TEAM_NONE); + } + updateMyMicQueue(); + pkMemberInfoList.clear(); + } + + //更新PKData + curPkInfo = roomPkData; + curPkInfo.setCurPkTimeUntilEnd(0); + EventBus.getDefault().post(new PKDataUpdateEvent(PKDataUpdateEvent.TYPE_RESULT)); + + //清除计分 + mapHashMap.clear(); + } + + @Override + public void onReceivePKBegin(RoomPkData roomPkData) { + if (curPkInfo != null && + !curPkInfo.getPkId().equals(roomPkData.getPkId())) { + return; + } + curPkInfo = roomPkData; + startPKCountDownTime(); + } + + /** + * 开启倒计时 + */ + private void startPKCountDownTime() { + if (countDownTimer != null) { + countDownTimer.cancel(); + countDownTimer = null; + } + //倒计时 + countDownTimer = new PKCountDownTimer(curPkInfo.getCurPkTimeUntilEnd()) { + + @Override + public void onTick(long millisUntilFinished) { + if (curPkInfo == null) { + this.cancel(); + countDownTimer = null; + return; + } + long sec = millisUntilFinished / 1000; + curPkInfo.setCurPkTimeUntilEnd(sec); + EventBus.getDefault().post(new PKTimeTickEvent(millisUntilFinished)); + + } + + @Override + public void onFinish() { + if (curPkInfo == null) { + this.cancel(); + countDownTimer = null; + return; + } + countDownTimer = null; + EventBus.getDefault().post(new PKTimeFinishEvent()); + // 这里修改pk 的状态,监听后台过来的pk 结果,如果5秒没收到结果,自己去拉取 + Single.timer(5, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(new Function>() { + @Override + public SingleSource apply(Long aLong) throws Exception { + if (curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_IN_PK) { + return loadPKDataById(curPkInfo.getPkId()); + } else { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_023))); + } + + } + }) + .subscribe(new SingleObserver() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onSuccess(RoomPkData roomPkData) { + onReceivePKResult(roomPkData); + } + + @Override + public void onError(Throwable e) { + Logger.d(e.getMessage()); + } + }); + + } + }; + countDownTimer.start(); + } + + + @Override + public Single toPKAgain() { + if (curPkInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_024))); + } + + if (curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_BEFORE_PK) { + if (!isPKReadyToBegin()) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_025))); + } + return beginPK(); + } else if (curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_IN_PK) { + return api.createPK( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid(), + curPkInfo.getPkMode(), + curPkInfo.getVoteMode(), + curPkInfo.getDuration() + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult result) throws Exception { + if (result.isSuccess()) { + mapHashMap.clear(); + curPkInfo = result.getData(); + return Single.just(ResUtil.getString(R.string.pk_model_pkmodel_026)); + } + return Single.error(new Throwable(result.getMessage())); + } + }); + } else { + if (!isPKReadyToBegin()) { + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_027))); + } + + return api.createPK( + AvRoomDataManager.get().mCurrentRoomInfo.getUid(), + AuthModel.get().getCurrentUid(), + curPkInfo.getPkMode(), + curPkInfo.getVoteMode(), + curPkInfo.getDuration() + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult result) throws Exception { + if (result.isSuccess()) { + mapHashMap.clear(); + curPkInfo = result.getData(); + return beginPK(); + } + return Single.error(new Throwable(result.getMessage())); + } + }); + } + } + + @Override + public void onTeamMemberExitRoom(String account) { + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(account)) { + pkMemberInfoList.clear(); + curPkInfo = null; + return; + } + + //PK中不要移除队伍 + if (curPkInfo == null || curPkInfo.getPkStatus() == RoomPkData.PK_STATUS_IN_PK) { + return; + } + UserInfo userInfo = new UserInfo(); + userInfo.setUid(Long.parseLong(account)); + syncPkList(userInfo, PKTeamInfo.TEAM_NONE); + + } + + + /** + * 查询PK结果 + * + * @param pkId + * @return + */ + @Override + public Single loadPKDataById(String pkId) { + return api.loadPKDataById( + pkId + ) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult respPKDataServiceResult) throws Exception { + if (respPKDataServiceResult.isSuccess()) { + RoomPkData roomPkData = respPKDataServiceResult.getData(); + if (roomPkData != null) { + roomPkData.setCurPkTimeUntilEnd(0); + curPkInfo = roomPkData; + return Single.just(roomPkData); + } + return Single.error(new Throwable(ResUtil.getString(R.string.pk_model_pkmodel_028))); + } + return Single.error(new Throwable(respPKDataServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 收到PK关闭时候处理 + */ + @Override + public void onClosePk() { + mapHashMap.clear(); + pkMemberInfoList.clear(); + curPkInfo = null; + EventBus.getDefault().post(new PKDataUpdateEvent()); + } + + + private interface Api { + + /** + * 开启pk模式 + * + * @param roomUid + * @param operUid + * @return + */ + @FormUrlEncoded + @POST("/room/pk/enable") + Single> openPKMode(@Field("roomUid") long roomUid, + @Field("operUid") long operUid); + + /** + * 关闭pk模式 + * + * @param roomUid + * @param operUid + * @return + */ + @DELETE("/room/pk/enable") + Single> closePKMode(@Query("roomUid") long roomUid, + @Query("operUid") long operUid); + + + /** + * 报名pk + * + * @param roomUid + * @param operUid + * @param groupType {@link PKTeamInfo#TEAM_BLUE} + * {@link PKTeamInfo#TEAM_RED} + * @return + */ + @FormUrlEncoded + @POST("/room/pk/join") + Single> joinPK(@Field("roomUid") long roomUid, + @Field("operUid") long operUid, + @Field("groupType") int groupType); + + + /** + * 取消报名pk + * + * @param roomUid + * @param operUid + * @return + */ + @DELETE("/room/pk/join") + Single> leavePK(@Query("roomUid") long roomUid, + @Query("operUid") long operUid); + + + /** + * 获取pk排麦队列长度 + * + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("/room/pk/queue/size") + Single> loadPKMicQueueSize(@Field("roomUid") long roomUid); + + + /** + * 获取pk排麦队列信息 + * + * @param roomUid + * @param operUid + * @param page + * @param pageSize + * @return + */ + @GET("/room/pk/queue/list") + Single> loadPKMicQueueList(@Query("roomUid") long roomUid, + @Query("operUid") long operUid, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 获取pk记录 + * + * @param roomUid + * @param page + * @param pageSize + * @return + */ + @GET("/room/pk/recored") + Single> loadPKRecordList(@Query("roomUid") long roomUid, + @Query("page") int page, + @Query("pageSize") int pageSize); + + + /** + * 创建PK + * + * @param roomUid 房间uid + * @param operUid 操作者uid + * @param pkMode pk模式(1:团队,2:个人) + * @param voteMode 投票方式(1:礼物价值,2:送礼物人数) + * @param duration pk持续时间(以秒为单位) + * @return + */ + @FormUrlEncoded + @POST("/room/pk/create") + Single> createPK(@Field("roomUid") long roomUid, + @Field("operUid") long operUid, + @Field("pkMode") int pkMode, + @Field("voteMode") int voteMode, + @Field("duration") long duration); + + + /** + * 开始pk + * + * @param roomUid 房间UID + * @param pkId pk唯一标识 + * @param joinUsers 参与PK的用户(排麦用户格式转化为json,排麦用户格式只需要设置type和uid,标识用户和所在队伍) + * @return + */ + @FormUrlEncoded + @POST("/room/pk/begin") + Single> beginPK(@Field("roomUid") long roomUid, + @Field("pkId") String pkId, + @Field("joinUsers") String joinUsers); + + /** + * GET + * 获取房间最近一次PK模式 + * + * @param roomUid + * @return + */ + @GET("/room/pk/get") + Single> loadPKDataByRoomId(@Query("roomUid") long roomUid); + + + /** + * 查询PK结果 + */ + @GET("/room/pk/query") + Single> loadPKDataById(@Query("pkId") String pkId); + } +} diff --git a/core/src/main/java/com/chwl/core/room/queue/bean/ConsumeInfo.java b/core/src/main/java/com/chwl/core/room/queue/bean/ConsumeInfo.java new file mode 100644 index 0000000..5dd29fb --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queue/bean/ConsumeInfo.java @@ -0,0 +1,205 @@ +package com.chwl.core.room.queue.bean; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by huangmeng1 on 2018/5/30. + */ + +public class ConsumeInfo implements Serializable{ + /** + * rankings : [{"uid":90006185,"erbanNo":8436523,"nick":ResUtil.getString(R.string.queue_bean_consumeinfo_01),"avatar":"https://img.letusmix.com/Fh66u_BgK8-LpuR4-NsfTs_10j-r?imageslim","gender":1,"experSeq":11,"experUrl":"https://img.letusmix.com/ul_11.png","charmSeq":21,"charmUrl":"https://img.letusmix.com/new_ml_21.png","goldAmount":71093,"ranking":1},{"uid":90004924,"erbanNo":2989034,"nick":ResUtil.getString(R.string.queue_bean_consumeinfo_02),"avatar":"https://img.letusmix.com/Fn4HdROur-Ku3mp_RpuZicnVfJRz?imageslim","gender":2,"experSeq":8,"experUrl":"https://img.letusmix.com/ul_8.png","charmSeq":12,"charmUrl":"https://img.letusmix.com/new_ml_12.png","goldAmount":240,"ranking":2},{"uid":90004930,"erbanNo":5249393,"nick":"。。。111111111111","avatar":"https://img.letusmix.com/Ft4vnfeGMzstNmrSG66sLllVp07I?imageslim","gender":1,"experSeq":11,"experUrl":"https://img.letusmix.com/ul_11.png","charmSeq":22,"charmUrl":"https://img.letusmix.com/new_ml_22.png","goldAmount":100,"ranking":3},{"uid":90004933,"erbanNo":5808063,"nick":ResUtil.getString(R.string.queue_bean_consumeinfo_03),"avatar":"https://img.letusmix.com/FqAYh68ZEdbBB5CsZX7rJGOK5IQ8?imageslim","gender":1,"experSeq":7,"experUrl":"https://img.letusmix.com/ul_7.png","charmSeq":9,"charmUrl":"https://img.letusmix.com/new_ml_9.png","goldAmount":91,"ranking":4},{"uid":90004922,"erbanNo":3339366,"nick":ResUtil.getString(R.string.queue_bean_consumeinfo_04),"avatar":"https://img.letusmix.com/FmHpCCqIxOoEFWFSBC9EfoHx60I3?imageslim","gender":1,"experSeq":11,"experUrl":"https://img.letusmix.com/ul_11.png","charmSeq":24,"charmUrl":"https://img.letusmix.com/new_ml_24.png","goldAmount":40,"ranking":5},{"uid":90004918,"erbanNo":2954406,"nick":"Craig","avatar":"https://img.letusmix.com/FitJYmCuazfptbEhcR21hTT5oozc?imageslim","gender":2,"experSeq":8,"experUrl":"https://img.letusmix.com/ul_8.png","charmSeq":21,"charmUrl":"https://img.letusmix.com/new_ml_21.png","goldAmount":37,"ranking":6},{"uid":90004925,"erbanNo":4293430,"nick":"ceshi1","avatar":"https://img.letusmix.com/Fhw3MDF1kotH93572AgQ9l9JUCAK?imageslim","gender":2,"experSeq":4,"experUrl":"https://img.letusmix.com/ul_4.png","charmSeq":20,"charmUrl":"https://img.letusmix.com/new_ml_20.png","goldAmount":1,"ranking":7},{"uid":90004920,"erbanNo":7165634,"nick":ResUtil.getString(R.string.queue_bean_consumeinfo_05),"avatar":"https://img.letusmix.com/FlVr5iykZQj2W65yzI5Bnb7NsxRo?imageslim","gender":2,"experSeq":1,"experUrl":"https://img.letusmix.com/ul_1.png","charmSeq":1,"charmUrl":"https://img.letusmix.com/new_ml_1.png","goldAmount":1,"ranking":8}] + * room : {"nick":ResUtil.getString(R.string.queue_bean_consumeinfo_06),"uid":90004928,"erbanNo":3398977,"avatar":"https://img.letusmix.com/FmlO8mlg86Y36LWiPiojfVkmmyO5?imageslim"} + */ + + private RoomBean room; + private List rankings; + + public RoomBean getRoom() { + return room; + } + + public void setRoom(RoomBean room) { + this.room = room; + } + + public List getRankings() { + return rankings; + } + + public void setRankings(List rankings) { + this.rankings = rankings; + } + + public static class RoomBean implements Serializable{ + /** + * nick : 🐬□诗涵 + * uid : 90004928 + * erbanNo : 3398977 + * avatar : https://img.letusmix.com/FmlO8mlg86Y36LWiPiojfVkmmyO5?imageslim + */ + + private String nick; + private int uid; + private int erbanNo; + private String avatar; + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + } + + public static class RankingsBean implements Serializable{ + /** + * uid : 90006185 + * erbanNo : 8436523 + * nick : 呆萌小熊猫 + * avatar : https://img.letusmix.com/Fh66u_BgK8-LpuR4-NsfTs_10j-r?imageslim + * gender : 1 + * experSeq : 11 + * experUrl : https://img.letusmix.com/ul_11.png + * charmSeq : 21 + * charmUrl : https://img.letusmix.com/new_ml_21.png + * goldAmount : 71093 + * ranking : 1 + */ + + private int uid; + private int erbanNo; + private String nick; + private String avatar; + private int gender; + private int experSeq; + private String experUrl; + private int charmSeq; + private String charmUrl; + private int goldAmount; + private int ranking; + private boolean hasPrettyNo; + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public int getExperSeq() { + return experSeq; + } + + public void setExperSeq(int experSeq) { + this.experSeq = experSeq; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public int getCharmSeq() { + return charmSeq; + } + + public void setCharmSeq(int charmSeq) { + this.charmSeq = charmSeq; + } + + public String getCharmUrl() { + return charmUrl; + } + + public void setCharmUrl(String charmUrl) { + this.charmUrl = charmUrl; + } + + public int getGoldAmount() { + return goldAmount; + } + + public void setGoldAmount(int goldAmount) { + this.goldAmount = goldAmount; + } + + public int getRanking() { + return ranking; + } + + public void setRanking(int ranking) { + this.ranking = ranking; + } + + public void setHasPrettyNo(boolean hasPrettyNo) { + this.hasPrettyNo = hasPrettyNo; + } + + public boolean isHasPrettyNo() { + return hasPrettyNo; + } + } +} diff --git a/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java new file mode 100644 index 0000000..71bf888 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java @@ -0,0 +1,93 @@ +package com.chwl.core.room.queue.bean; + +import com.google.gson.annotations.SerializedName; + +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") + private String account; + private String avatar; + private String nick; + private String micNickColor; + private String micCircle; + private String headWearUrl; + private int headWearType; + private boolean preventKick; + + /** + * 相亲模式使用 + */ + private String capUrl; + private int selectMicPosition; + //是否有选择心动对象 + private boolean hasSelectUser; + private boolean vipMic; + + /** + * GroupType_default = 0,//默认 + * GroupTyp_red = 1, //蓝队 + * GroupType_Blue = 2,//红队 + */ + private int groupType; + + /** + * 游戏模式使用 + * 0 未加入游戏 + * 1 加入游戏未准备 + * 2 加入游戏已准备 + * 3 游戏中... + */ + private int gameStatus; + + //非麦序队列字段 start + private Map extension; + private int micPosition; + private boolean isRoomOwnner; + private boolean isAllMember = false; + private int gender; + private boolean inPkMode = false; + private int teamId = 0; + private boolean isSelected = false; + //非麦序队列字段 end + + /** + * pk模式更新麦位信息, 默认开麦 + */ + private boolean isNoProhibitMic = false; + + public MicMemberInfo() { + + } + + public String getAccount() { + return account; + } + + public String getNick() { + return nick; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MicMemberInfo that = (MicMemberInfo) o; + return Objects.equals(account, that.account); + } + + @Override + public int hashCode() { + return Objects.hash(account); + } +} diff --git a/core/src/main/java/com/chwl/core/room/queue/bean/RoomConsumeInfo.java b/core/src/main/java/com/chwl/core/room/queue/bean/RoomConsumeInfo.java new file mode 100644 index 0000000..c7a266d --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queue/bean/RoomConsumeInfo.java @@ -0,0 +1,79 @@ +package com.chwl.core.room.queue.bean; + +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.noble.bean.NobleInfo; + +import java.io.Serializable; + +/** + * Created by chenran on 2017/10/2. + */ + +public class RoomConsumeInfo implements Serializable{ + private long uid; + private String nick; + private String avatar; + private int gender; + private long ctrbUid; + private long sumGold; + + public NobleInfo nobleUsers; + public UserLevelVo userLevelVo; + public boolean newUser; + + public boolean isNewUser() { + return newUser; + } + + public void setNewUser(boolean newUser) { + this.newUser = newUser; + } + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public long getCtrbUid() { + return ctrbUid; + } + + public void setCtrbUid(long ctrbUid) { + this.ctrbUid = ctrbUid; + } + + public long getSumGold() { + return sumGold; + } + + public void setSumGold(long sumGold) { + this.sumGold = sumGold; + } +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/attachment/QueuingMicAttachment.java b/core/src/main/java/com/chwl/core/room/queuing_mic/attachment/QueuingMicAttachment.java new file mode 100644 index 0000000..70a997b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/attachment/QueuingMicAttachment.java @@ -0,0 +1,30 @@ +package com.chwl.core.room.queuing_mic.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.room.queuing_mic.bean.QueuingMicInfo; + +public class QueuingMicAttachment extends CustomAttachment { + + private QueuingMicInfo queuingMicInfo; + + public QueuingMicAttachment(int second) { + super(CustomAttachment.CUSTOM_MSG_QUEUING_MIC, second); + } + + @Override + protected void parseData(JSONObject data) { + this.queuingMicInfo = new Gson().fromJson(data.toJSONString(), QueuingMicInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(queuingMicInfo)); + } + + public QueuingMicInfo getQueuingMicInfo() { + return queuingMicInfo; + } +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/bean/GroupType.java b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/GroupType.java new file mode 100644 index 0000000..70760a7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/GroupType.java @@ -0,0 +1,7 @@ +package com.chwl.core.room.queuing_mic.bean; + +public interface GroupType { + int NORMAL = 1; + int MALE = 1; + int FEMALE = 2; +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicInfo.java b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicInfo.java new file mode 100644 index 0000000..73abb2a --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicInfo.java @@ -0,0 +1,42 @@ +package com.chwl.core.room.queuing_mic.bean; + +import lombok.Data; + +@Data +public class QueuingMicInfo { + + /** + * 操作者 UID + */ + private String operatorUid; + + /** + * 操作者昵称 + */ + private String operatorNick; + + /** + * 被操作者 UID + */ + private String targetUid; + + /** + * 被操作者昵称 + */ + private String targetNick; + + /** + * 麦位 + */ + private String micPos; + + /** + * 在排麦列表中的位置 + */ + private int queueCount; + + /** + * 更新时间 + */ + private long updateTime; +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicMemeberInfo.java b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicMemeberInfo.java new file mode 100644 index 0000000..b95cd87 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/QueuingMicMemeberInfo.java @@ -0,0 +1,26 @@ +package com.chwl.core.room.queuing_mic.bean; + +import lombok.Data; + +/** + * 排麦模式中返回的排麦队列里的用户数据 + */ +@Data +public class QueuingMicMemeberInfo { + + // 排麦用户uid + private long uid; + // 排麦用户耳伴号 + private String erbanNo; + // 排麦用户昵称 + private String nick; + // 排麦用户头像 + private String avatar; + // 排麦用户性别 + private int gender; + + /** + * {@link GroupType} + */ + private int groupType; +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/bean/RespQueuingMicListInfo.java b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/RespQueuingMicListInfo.java new file mode 100644 index 0000000..27c99be --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/bean/RespQueuingMicListInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.room.queuing_mic.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class RespQueuingMicListInfo { + + // 返回排麦队列 + private List queue; + // 参与排麦人数 + private int count; + // 我的排麦位置 + private int myPos; +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/event/HasAnimationEffect.java b/core/src/main/java/com/chwl/core/room/queuing_mic/event/HasAnimationEffect.java new file mode 100644 index 0000000..2e8a4c1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/event/HasAnimationEffect.java @@ -0,0 +1,7 @@ +package com.chwl.core.room.queuing_mic.event; + +/** + * 房间内更新头部开关特效图标事件 + */ +public class HasAnimationEffect { +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicEmptyEvent.java b/core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicEmptyEvent.java new file mode 100644 index 0000000..b24de0d --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicEmptyEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.queuing_mic.event; + +public class QueuingMicEmptyEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicNotEmptyEvent.java b/core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicNotEmptyEvent.java new file mode 100644 index 0000000..9487a68 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/queuing_mic/event/QueuingMicNotEmptyEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.queuing_mic.event; + +public class QueuingMicNotEmptyEvent { +} diff --git a/core/src/main/java/com/chwl/core/room/recommendpos/IRecommendCardModel.java b/core/src/main/java/com/chwl/core/room/recommendpos/IRecommendCardModel.java new file mode 100644 index 0000000..40a46b3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/recommendpos/IRecommendCardModel.java @@ -0,0 +1,23 @@ +package com.chwl.core.room.recommendpos; + +import com.chwl.core.room.recommendpos.bean.RecommendCard; + +import java.util.List; + +import io.reactivex.Single; + +/** + * Created by lvzebiao on 2019/1/30. + */ + +public interface IRecommendCardModel { + + /** + * 我的推荐卡接口 + * + * @param status {@link com.chwl.core.room.recommendpos.bean.RcmdCardType} + * @return list + */ + Single> getBagList(int status, int page, int pageSize); + +} diff --git a/core/src/main/java/com/chwl/core/room/recommendpos/RecommendCardModel.java b/core/src/main/java/com/chwl/core/room/recommendpos/RecommendCardModel.java new file mode 100644 index 0000000..d39b45b --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/recommendpos/RecommendCardModel.java @@ -0,0 +1,57 @@ +package com.chwl.core.room.recommendpos; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.room.recommendpos.bean.RecommendCard; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by lvzebiao on 2019/1/30. + */ + +public class RecommendCardModel extends BaseModel implements IRecommendCardModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final RecommendCardModel INSTANCE = new RecommendCardModel(); + } + + public static RecommendCardModel get() { + return Helper.INSTANCE; + } + + /** + * 我的推荐卡接口 + * + * @param status {@link com.chwl.core.room.recommendpos.bean.RcmdCardType} + * @return list + */ + @Override + public Single> getBagList(int status, int page, int pageSize) { + return api.getBagList(AuthModel.get().getCurrentUid(), status, page, pageSize) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + private interface Api { + /** + * 我的推荐卡接口 + * + * @param status {@link com.chwl.core.room.recommendpos.bean.RcmdCardType} + */ + @POST("recommend/backpack") + Single>> getBagList(@Query("uid") long uid, + @Query("status") int status, + @Query("page") int page, + @Query("pageSize") int pageSize); + } +} diff --git a/core/src/main/java/com/chwl/core/room/recommendpos/bean/RcmdCardType.java b/core/src/main/java/com/chwl/core/room/recommendpos/bean/RcmdCardType.java new file mode 100644 index 0000000..90241f4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/recommendpos/bean/RcmdCardType.java @@ -0,0 +1,26 @@ +package com.chwl.core.room.recommendpos.bean; + +/** + * Created by lvzebiao on 2019/1/31. + */ + +public interface RcmdCardType { + String EXTRA_TYPE = "extra_type"; + + /** + * 未使用 + */ + int UN_USE = 1; + /** + * 使用中 + */ + int USING = 2; + /** + * 已使用 + */ + int HAS_USED = 3; + /** + * 已失效 + */ + int INVALID = 4; +} diff --git a/core/src/main/java/com/chwl/core/room/recommendpos/bean/RecommendCard.java b/core/src/main/java/com/chwl/core/room/recommendpos/bean/RecommendCard.java new file mode 100644 index 0000000..46e1e45 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/recommendpos/bean/RecommendCard.java @@ -0,0 +1,36 @@ +package com.chwl.core.room.recommendpos.bean; + +import lombok.Data; + +/** + * 房间推荐卡 + * Created by lvzebiao on 2019/1/30. + */ +@Data +public class RecommendCard { + + private String cardName; + + private int count; + /** + * 有效开始日期 + */ + private long validStartTime; + + private long validEndTime; + /** + * 使用开始时间 + */ + private long useStartTime; + + private long useEndTime; + /** + * {@link RcmdCardType} + */ + private int status; + /** + * 有效期 + */ + private int days; + +} diff --git a/core/src/main/java/com/chwl/core/room/treasure_box/bean/BoxRankingInfo.java b/core/src/main/java/com/chwl/core/room/treasure_box/bean/BoxRankingInfo.java new file mode 100644 index 0000000..ac7e461 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/treasure_box/bean/BoxRankingInfo.java @@ -0,0 +1,39 @@ +package com.chwl.core.room.treasure_box.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class BoxRankingInfo implements Serializable { + private List rankVos; + @Data + public static class RankVosBean { + /** + * uid : 935006 + * erbanNo : 2196791 + * nick : 大萌新 + * avatar : http://image.uat.zhongjialx.com/FiTvhD5nwpmGXyydsVEEC9fwCVUk?imageslim + * gender : 1 + * experSeq : 1 + * experUrl : https://image.zhongjialx.com/wealth_01.png + * charmSeq : 90 + * charmUrl : https://image.zhongjialx.com/charm_90.png + * amount : 10000 + * ranking : 1 + */ + + private int uid; + private int erbanNo; + private String nick; + private String avatar; + private int gender; + private int experSeq; + private String experUrl; + private int charmSeq; + private String charmUrl; + private int amount; + private int ranking; + } +} diff --git a/core/src/main/java/com/chwl/core/room/treasure_box/bean/TreasureRankingInfo.kt b/core/src/main/java/com/chwl/core/room/treasure_box/bean/TreasureRankingInfo.kt new file mode 100644 index 0000000..66574ca --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/treasure_box/bean/TreasureRankingInfo.kt @@ -0,0 +1,12 @@ +package com.chwl.core.room.treasure_box.bean + +import java.io.Serializable + +data class TreasureRankingInfo( + val uid: Int = 0, + val erbanNo: Int = 0, + val nick: String = "", + val avatar: String = "", + val diamonds: Int = 0, + val ranking: Int = 0 +): Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/room/treasure_box/event/RefreshBoxRankingEvent.java b/core/src/main/java/com/chwl/core/room/treasure_box/event/RefreshBoxRankingEvent.java new file mode 100644 index 0000000..da5a502 --- /dev/null +++ b/core/src/main/java/com/chwl/core/room/treasure_box/event/RefreshBoxRankingEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.room.treasure_box.event; + +public class RefreshBoxRankingEvent { +} diff --git a/core/src/main/java/com/chwl/core/set/bean/ShieldInfo.kt b/core/src/main/java/com/chwl/core/set/bean/ShieldInfo.kt new file mode 100644 index 0000000..7ca29d1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/set/bean/ShieldInfo.kt @@ -0,0 +1,14 @@ +package com.chwl.core.set.bean + +import lombok.Data + +@Data +data class ShieldInfo( + val uid: Long = 0, + val roomId: Long = 0, + val erbanNo: Long = 0, + val title: String? = null, + val avatar: String? = null, + val roomTag: String? = null, + val tagPict: String? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/set/model/SetModel.kt b/core/src/main/java/com/chwl/core/set/model/SetModel.kt new file mode 100644 index 0000000..4fd4bc9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/set/model/SetModel.kt @@ -0,0 +1,52 @@ +package com.chwl.core.set.model + +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.home.bean.* +import com.chwl.core.set.bean.ShieldInfo +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +object SetModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + + suspend fun getShieldRoom(pageNum: Int, pageSize: Int): List? = + launchRequest { + api.getShieldRoom(pageNum, pageSize) + } + + suspend fun setUnMask(roomUid: Long, type: Int): String? = + launchRequest { + api.setUnMask(roomUid, type) + } + + private interface Api { + + /** + * 屏蔽房间列表 + * @return + */ + @GET("/user/black/pageRoom") + suspend fun getShieldRoom( + @Query("pageNum") pageNum: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 解除屏蔽房间 + * @return + */ + @POST("/user/black/delete") + suspend fun setUnMask( + @Query("objId") roomUid: Long, + @Query("type") type: Int + ): ServiceResult + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/settings/ISettingsModel.java b/core/src/main/java/com/chwl/core/settings/ISettingsModel.java new file mode 100644 index 0000000..f5b51b6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/settings/ISettingsModel.java @@ -0,0 +1,40 @@ +package com.chwl.core.settings; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.settings.bean.SysAccount; +import com.chwl.core.user.bean.UserInfo; + +import io.reactivex.Single; + +public interface ISettingsModel extends IModel { + + /** + * 系统账号 + * @return + */ + SysAccount getLocalSysAccount(); + + void checkSysAccount(); + + /** + * + * @param uid + * @param showLocation 是否显示地理位置 + * @return + */ + Single> showLocation(long uid, boolean showLocation); + Single> showAge(long uid, boolean showAge); + Single> showMatchChat(long uid, boolean matchChat); + + Single getSysMsgNotify(); + + Single setSysMsgNotify(boolean sysMsgNotify); + + Single setAttentionMsgNotify(boolean attentionMsgNotify); + + Single getSysAccount(); + + Single interactiveMsgNotify(boolean interactiveMsgNotify); + +} diff --git a/core/src/main/java/com/chwl/core/settings/SettingsModel.java b/core/src/main/java/com/chwl/core/settings/SettingsModel.java new file mode 100644 index 0000000..f8dabe6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/settings/SettingsModel.java @@ -0,0 +1,186 @@ +package com.chwl.core.settings; + +import com.chwl.library.common.util.SPUtils; +import com.google.gson.JsonElement; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.friend.FriendService; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.settings.bean.SysAccount; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class SettingsModel implements ISettingsModel { + + private SysAccount sysAccount; + private static SettingsModel instance; + private final Api api; + + private SettingsModel() { + api = RxNet.create(Api.class); + } + + public static ISettingsModel get() { + if (instance == null) { + synchronized (SettingsModel.class) { + if (instance == null) { + instance = new SettingsModel(); + } + } + } + return instance; + } + + @Override + public SysAccount getLocalSysAccount() { + if (sysAccount == null) { + sysAccount = SPUtils.getParcelable("sys_account", SysAccount.class, new SysAccount()); + } + return sysAccount; + } + + @Override + public void checkSysAccount() { + SysAccount account = getLocalSysAccount(); + if (account == null || account.isEmpty()) { + Disposable d = getSysAccount().compose(RxHelper.handleSchedulers()).subscribe(sysAccount -> { + this.sysAccount = sysAccount; + SPUtils.putParcelable("sys_account", sysAccount); + }); + } + } + + @Override + public Single> showLocation(long uid, boolean showLocation) { + return api.showLocation(uid, showLocation); + } + + @Override + public Single> showAge(long uid, boolean showAge) { + return api.showAge(uid, showAge); + } + + @Override + public Single> showMatchChat(long uid, boolean matchChat) { + return api.showMatchChat(uid, matchChat); + } + + @Override + public Single getSysMsgNotify() { + return api.getSysMsgNotify(AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single setSysMsgNotify(boolean sysMsgNotify) { + return getSysAccount() + .flatMap((Function>) account -> + Single.zip( + setNotifyAccount(account.getSecretaryUid(), sysMsgNotify), + setNotifyAccount(account.getSystemMessageUid(), sysMsgNotify), + (aBoolean, aBoolean2) -> "") + ) + .flatMap((Function>) + s -> + api.apiSysMsgNotify(AuthModel.get().getCurrentUid(), sysMsgNotify) + .compose(RxHelper.handleIgnoreData())); + } + + @Override + public Single setAttentionMsgNotify(boolean attentionMsgNotify) { + return api.apiAttentionMsgNotify(AuthModel.get().getCurrentUid(), attentionMsgNotify) + .compose(RxHelper.handleIgnoreData()); + } + + private Single setNotifyAccount(String account, boolean notify) { + return Single.create((SingleOnSubscribe) e -> + NIMClient.getService(FriendService.class).setMessageNotify(account, notify) + .setCallback(new RequestCallback() { + @Override + public void onSuccess(Void param) { + e.onSuccess(notify); + } + + @Override + public void onFailed(int code) { + e.onError(new Throwable(ResUtil.getString(R.string.xchat_android_core_settings_settingsmodel_01) + code)); + } + + @Override + public void onException(Throwable exception) { + e.onError(exception); + } + })) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Single getSysAccount() { + return api.apiSysAccount() + .compose(RxHelper.handleCommon()); + } + + @Override + public Single interactiveMsgNotify(boolean interactiveMsgNotify) { + return api.interactiveMsgNotify(AuthModel.get().getCurrentUid(), interactiveMsgNotify) + .compose(RxHelper.handleIgnoreData()); + } + + private interface Api { + /** + * @param uid + * @param showLocation 是否显示地理位置 + * @return + */ + @POST("user/address/show") + @FormUrlEncoded + Single> showLocation(@Field("uid") long uid, @Field("showLocation") boolean showLocation); + + @POST("user/showAge") + Single> showAge(@Query("uid") long uid, @Query("showAge") boolean showAge); + + @POST("user/matchChat") + Single> showMatchChat(@Query("uid") long uid, @Query("matchChat") boolean matchChat); + + @GET("/user/msgNotify") + Single> getSysMsgNotify(@Query("uid") long uid); + + @POST("/user/sysMsgNotify") + Single> apiSysMsgNotify(@Query("uid") long uid, + @Query("sysMsgNotify") boolean sysMsgNotify); + + @FormUrlEncoded + @POST("/user/singleBroadcastMsgNotify") + Single> apiAttentionMsgNotify(@Field("uid") long uid, + @Field("msgNotify") boolean sysMsgNotify); + + /** + * 获得小秘书和系统通知uid + * + * @return + */ + @GET("client/prop") + Single> apiSysAccount(); + + @POST("user/interactiveMsgNotify") + Single> interactiveMsgNotify(@Query("uid") long uid, + @Query("interactiveMsgNotify") boolean interactiveMsgNotify); + + } +} diff --git a/core/src/main/java/com/chwl/core/settings/bean/SysAccount.java b/core/src/main/java/com/chwl/core/settings/bean/SysAccount.java new file mode 100644 index 0000000..bff1ad2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/settings/bean/SysAccount.java @@ -0,0 +1,67 @@ +package com.chwl.core.settings.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +import lombok.Data; + +/** + * 系统账号 + * create by lvzebiao @2019/12/25 + */ +@Data +public class SysAccount implements Parcelable { + /** + * 小秘书uid + */ + private String secretaryUid; + /** + * 系统消息uid + */ + private String systemMessageUid; + + /** + * 工会消息UID + */ + private String hallMessageUid; + + public SysAccount() { + + } + + public SysAccount(Parcel parcel) { + secretaryUid = parcel.readString(); + systemMessageUid = parcel.readString(); + hallMessageUid = parcel.readString(); + } + + public boolean isEmpty() { + return secretaryUid == null || systemMessageUid == null || hallMessageUid == null; + } + + public static final Creator CREATOR = new Creator() { + @Override + public SysAccount createFromParcel(Parcel in) { + return new SysAccount(in); + } + + @Override + public SysAccount[] newArray(int size) { + return new SysAccount[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel parcel, int i) { + parcel.writeString(secretaryUid); + parcel.writeString(systemMessageUid); + parcel.writeString(hallMessageUid); + } +} diff --git a/core/src/main/java/com/chwl/core/share/bean/InAppSharingFamilyInfo.java b/core/src/main/java/com/chwl/core/share/bean/InAppSharingFamilyInfo.java new file mode 100644 index 0000000..902530f --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/InAppSharingFamilyInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.share.bean; + +import com.chwl.core.family.bean.FamilyInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingFamilyInfo extends InAppSharingInfo { +} diff --git a/core/src/main/java/com/chwl/core/share/bean/InAppSharingInfo.java b/core/src/main/java/com/chwl/core/share/bean/InAppSharingInfo.java new file mode 100644 index 0000000..b96023e --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/InAppSharingInfo.java @@ -0,0 +1,19 @@ +package com.chwl.core.share.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@Data +public class InAppSharingInfo implements Serializable { + + private T info; + private String title; + private String avatar; + private String actionName; + private String routerValue; + private int routerType; +} diff --git a/core/src/main/java/com/chwl/core/share/bean/InAppSharingMiniWorldInfo.java b/core/src/main/java/com/chwl/core/share/bean/InAppSharingMiniWorldInfo.java new file mode 100644 index 0000000..232e381 --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/InAppSharingMiniWorldInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.share.bean; + +import com.chwl.core.miniworld.bean.MiniWorldDetailInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingMiniWorldInfo extends InAppSharingInfo { +} diff --git a/core/src/main/java/com/chwl/core/share/bean/InAppSharingRoomInfo.java b/core/src/main/java/com/chwl/core/share/bean/InAppSharingRoomInfo.java new file mode 100644 index 0000000..fd369c5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/InAppSharingRoomInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.share.bean; + +import com.chwl.core.room.bean.RoomInfo; + +import java.io.Serializable; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingRoomInfo extends InAppSharingInfo implements Serializable { +} diff --git a/core/src/main/java/com/chwl/core/share/bean/InAppSharingTeamInfo.java b/core/src/main/java/com/chwl/core/share/bean/InAppSharingTeamInfo.java new file mode 100644 index 0000000..edf7001 --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/InAppSharingTeamInfo.java @@ -0,0 +1,14 @@ +package com.chwl.core.share.bean; + +import com.chwl.core.team.bean.TeamInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Created by MadisonRong on 08/06/2018. + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class InAppSharingTeamInfo extends InAppSharingInfo { +} diff --git a/core/src/main/java/com/chwl/core/share/bean/SessionType.java b/core/src/main/java/com/chwl/core/share/bean/SessionType.java new file mode 100644 index 0000000..b5a6db8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/SessionType.java @@ -0,0 +1,36 @@ +package com.chwl.core.share.bean; + +import android.util.SparseArray; + +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; + +/** + * Created by MadisonRong on 08/06/2018. + */ + +public class SessionType { + + public static final int NONE = 0; + + public static final int P2P = 1; + + public static final int TEAM = 2; + + public static final int SYSTEM = 3; + + public static final int CHAT_ROOM = 4; + + private static SparseArray data = new SparseArray<>(); + + static { + data.put(NONE, SessionTypeEnum.None); + data.put(P2P, SessionTypeEnum.P2P); + data.put(TEAM, SessionTypeEnum.Team); + data.put(SYSTEM, SessionTypeEnum.System); + data.put(CHAT_ROOM, SessionTypeEnum.ChatRoom); + } + + public static SessionTypeEnum get(int sessionType) { + return data.get(sessionType); + } +} diff --git a/core/src/main/java/com/chwl/core/share/bean/ShareCommonInfo.java b/core/src/main/java/com/chwl/core/share/bean/ShareCommonInfo.java new file mode 100644 index 0000000..e0018ea --- /dev/null +++ b/core/src/main/java/com/chwl/core/share/bean/ShareCommonInfo.java @@ -0,0 +1,53 @@ +package com.chwl.core.share.bean; + + +import lombok.Getter; + +/** + * create by lvzebiao @2019/11/21 + */ +@Getter +public class ShareCommonInfo { + + private String title; + + private String content; + + private String imageUrl; + + private String siteUrl; + + public ShareCommonInfo setTitle(String title) { + this.title = title; + return this; + } + + public ShareCommonInfo setContent(String content) { + this.content = content; + return this; + } + + public ShareCommonInfo setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + return this; + } + + public ShareCommonInfo setSiteUrl(String siteUrl) { + this.siteUrl = siteUrl; + return this; + } + + public String getTitle() { + if (title == null) { + title = ""; + } + return title; + } + + public String getContent() { + if (content == null) { + content = ""; + } + return content; + } +} diff --git a/core/src/main/java/com/chwl/core/skill/entity/SkillNotifyEntity.kt b/core/src/main/java/com/chwl/core/skill/entity/SkillNotifyEntity.kt new file mode 100644 index 0000000..cee0ddc --- /dev/null +++ b/core/src/main/java/com/chwl/core/skill/entity/SkillNotifyEntity.kt @@ -0,0 +1,16 @@ +package com.chwl.core.skill.entity + +data class SkillNotifyEntity(val layout: LayoutBean) + +data class LayoutBean( + val title: ContentBean, + val time: ContentBean, + val contents: List +) + +data class ContentBean( + val content: String, + val fontSize: Int, + val fontColor: String, + val fontBold: Boolean +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/skill/entity/SkillPostServerEntity.kt b/core/src/main/java/com/chwl/core/skill/entity/SkillPostServerEntity.kt new file mode 100644 index 0000000..61e9b7b --- /dev/null +++ b/core/src/main/java/com/chwl/core/skill/entity/SkillPostServerEntity.kt @@ -0,0 +1,13 @@ +package com.chwl.core.skill.entity + +/** + * ...... + * (⊙o⊙)… + */ +data class SkillPostServerEntity( + val id: Int =-1, + val cardId: Int=-1, + var propRecordVo: List +) + +data class SKillValueEntity(var parentId: Int, var refPropVos:List) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/skill/entity/SkillPropertyEntity.kt b/core/src/main/java/com/chwl/core/skill/entity/SkillPropertyEntity.kt new file mode 100644 index 0000000..af63984 --- /dev/null +++ b/core/src/main/java/com/chwl/core/skill/entity/SkillPropertyEntity.kt @@ -0,0 +1,56 @@ +package com.chwl.core.skill.entity + +import com.google.gson.annotations.SerializedName + +data class SkillPropertyEntity( + val cardId: Int, + val name: String, + val icon: String, + val pic: String, + val type: Int, + val props: List +) { + @Transient + var isSelf = false//主态还是客态 + + @Transient + var isEdit = false//编辑还是展示 + + @Transient + var needBack = true + + @Transient + var needTitle = true + + @Transient + var haah = 1000 +} + +data class PropsEntity( + var id: Int, + var cardId: Int, + var propVal: String, + val state: Int, + val isMust: Int, + var propDictVos: List, + val checkLimitNum: Int +) { + fun parsePropToRecord(): PropRecordVoEntity = PropRecordVoEntity( + id, propVal, emptyList(), checkLimitNum, state, isMust + ) +} + +data class PropDictVo( +// 两个数据结构一致只是id的名字不一样 + @SerializedName("id") + var id: Int, + var propVal: String?,//输入 选项 时长 + val refIsOnlyCheck: Int//所有属性都有0-多选的选项/1表示此属性只能单选,互斥 +) { + @Transient + var isSelected = false + + fun parseToRecord(): PropRefEntity = PropRefEntity( + id, propVal, refIsOnlyCheck + ) +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/skill/entity/SkillRecordEntity.kt b/core/src/main/java/com/chwl/core/skill/entity/SkillRecordEntity.kt new file mode 100644 index 0000000..d35b958 --- /dev/null +++ b/core/src/main/java/com/chwl/core/skill/entity/SkillRecordEntity.kt @@ -0,0 +1,38 @@ +package com.chwl.core.skill.entity + +import com.google.gson.annotations.SerializedName + +data class SkillRecordEntity( + val cardId: Int, + val createTime: String?, + val icon: String, + val id: Int, + val name: String, + val pic: String, + val propRecordVo: List, + val type: Int,//技能卡类型 1游戏类 2才艺类 3声音秀 + val updateTime: String?, + @SerializedName("status") + val audioStatus:Int//声音秀审核状态 +) { + @Transient + var isSelf = false//主态还是客态 + + @Transient + var isEdit = false//编辑还是展示 +} + +data class PropRecordVoEntity( + val parentId: Int, + val parentVal: String, + var refPropVos: List,//技能卡关联子属性集合 + val checkLimitNum: Int,//技能卡多选数量限制 + val state: Int, + val isMust: Int +) + +data class PropRefEntity( + var propId: Int, + var propVal: String?,//输入 选项 时长 + val refIsOnlyCheck: Int = 0//所有属性都有0-多选的选项/1表示此属性只能单选,互斥 +) diff --git a/core/src/main/java/com/chwl/core/skill/entity/SkillTypeEntity.kt b/core/src/main/java/com/chwl/core/skill/entity/SkillTypeEntity.kt new file mode 100644 index 0000000..47783e3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/skill/entity/SkillTypeEntity.kt @@ -0,0 +1,3 @@ +package com.chwl.core.skill.entity + +data class SkillTypeEntity(val cardId: Int, val name: String, val icon: String) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/skill/event/SkillEvent.java b/core/src/main/java/com/chwl/core/skill/event/SkillEvent.java new file mode 100644 index 0000000..3aa8083 --- /dev/null +++ b/core/src/main/java/com/chwl/core/skill/event/SkillEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.skill.event; + + +public class SkillEvent { + + private int event; + + public static final int ADD = 1; + public static final int REMOVE = 2; + + public int getEvent() { + return event; + } + + public void setEvent(int event) { + this.event = event; + } +} diff --git a/core/src/main/java/com/chwl/core/sound/model/SoundModel.kt b/core/src/main/java/com/chwl/core/sound/model/SoundModel.kt new file mode 100644 index 0000000..d38bb8d --- /dev/null +++ b/core/src/main/java/com/chwl/core/sound/model/SoundModel.kt @@ -0,0 +1,45 @@ +package com.chwl.core.sound.model + +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.earn.bean.* +import com.chwl.core.home.bean.* +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.POST +import retrofit2.http.Query + +object SoundModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + suspend fun saveRecord(audioUrl: String, second: Int): String? = + launchRequest { + api.saveRecord(audioUrl, second) + } + + suspend fun deleteRecord(): String? = + launchRequest { + api.deleteRecord() + } + + private interface Api { + + /** + * @return + */ + @POST("/audioCard/save") + suspend fun saveRecord( + @Query("audioUrl") audioUrl: String, + @Query("second") second: Int + ): ServiceResult + + /** + * @return + */ + @POST("/audioCard/del") + suspend fun deleteRecord(): ServiceResult + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/statistic/StatLogKey.java b/core/src/main/java/com/chwl/core/statistic/StatLogKey.java new file mode 100644 index 0000000..982a3fa --- /dev/null +++ b/core/src/main/java/com/chwl/core/statistic/StatLogKey.java @@ -0,0 +1,28 @@ +package com.chwl.core.statistic; + +/** + *

+ * + * @author jiahui + * date 2018/3/2 + */ +public interface StatLogKey { + /** 事件类型 */ + String EVENT_TYPE = "event_type"; + + /** 被踢日志 */ + String EVENT_KICKED = "event_kicked"; + /** 主动踢日志 */ + String EVENT_KICK = "event_kick"; + + /** 被踢用户id */ + String USER_ID_KICKED = "uid"; + /** 主动踢用户id */ + String USER_ID_KICK = "handleUid"; + + String ROOM_ID = "room_id"; + + String Gift_channel = "Gift_channel"; + + String EVENT_ID = "event_id"; +} diff --git a/core/src/main/java/com/chwl/core/statistic/protocol/StatisticsProtocol.java b/core/src/main/java/com/chwl/core/statistic/protocol/StatisticsProtocol.java new file mode 100644 index 0000000..e3bed97 --- /dev/null +++ b/core/src/main/java/com/chwl/core/statistic/protocol/StatisticsProtocol.java @@ -0,0 +1,607 @@ +package com.chwl.core.statistic.protocol; + +/** + * @author jiajie + * @Description + * @Date 2018/4/12 + */ + +public interface StatisticsProtocol { + + String EVENT_OPENROOM = "openRoom";//自己开房 + String EVENT_ENTERROOM = "enterRoom"; + String EVENT_COMPLETE = "complete"; + + String EVENT_LOST_NETWORK = "lost_network_String EVENT";//断网日志 + String EVENT_RECONNECTION_ROOM_CHAT = "String EVENT_reconnection_room_chat";//断网重连聊天室 + String USER_KICKED_EVENT = "user_kicked_String EVENT";//用户被踢 + + String EVENT_LOGIN_PHONE_CLICK = "login_phone_click";//点击手机号登录 + String EVENT_LOGIN_FAILED_CLICK = "login_failed";//登录失败 + + String EVENT_LOGIN_REPARI_SUCCESS_CLICK = "login_repari_success_click";//用户完善资料 + + String EVENT_ROOM_INPUT_BOX_CLICK = "room_input_box_click";// 底部文字输入框点击 + String EVENT_ROOM_SWITCH_KTV_CLICK = "room_switch_ktv_click";// 切换KTV模式 + String EVENT_ROOM_OPEN_PLATOON_CLICK = "room_open_platoon_click";// 开启排麦模式 + String EVENT_ROOM_CLOSE_GIFT_EFFECTS_CLICK = "room_close_gift_effects_click";// 关闭礼物特效 + // String EVENT_ROOM_SHARE_CLICK="room_share_click";// 房间分享 + String EVENT_ROOM_LENGTH_OF_STAY_TIME = "room_length_of_stay_time";//在房间内停留时长 + String EVENT_USER_ON_MIC = "room_time_of_user_on_wheat";//用户在麦上停留时长事件 attr:userUid,roomUid + String EVENT_ENTER_ROOM_COUNT = "room_into";//进入房间次数attr:userUid,roomUid + + String EVENT_FRIENDSHIP_HALL_CLICK = "friendship_hall_click"; //进入交友大厅 + + String HOME_FAMILY_CLICK = "home_family_click"; // 首页家族tab + String JOIN_FAMILY_CLICK = "join_family_click"; // 加入家族按钮=家族主页) + String FAMILY_FAMILY_SQUARE_CLICK = "family_familySquare_click"; // 家族广场 + String FAMILY_MY_FAMILY_CLICK = "family_myFamily_click"; // 我的家族=家族页) + String MY_FAMILY_CLICK = "my_family_click"; // 我的家族入口=我的页) + String APP_LAUNCH_GH = "app_launch_gh"; // 公会成员启动应用 + String MY_HALL_CLICK = "my_hall_click"; // 我的厅入口 + String HALL_INCOME_CLICK = "hall_income_click"; // 收入统计入口 + String HALL_INCOME_WEEKLY_CLICK = "hall_income_weekly_click"; // 切换每周统计 + String HALL_INCOME_DETAIL_CLICK = "hall_income_detail_click"; // 点击查看成员收入详细 + String JOIN_HALL_CLICK = "join_hall_click"; // 申请入厅按钮=厅主个人主页) + String JOIN_HALL_OPEN_GROUP_CLICK = "join_hall_openGroup_click"; // 加入公开群按钮=厅主个人主页) + String ROOM_CREATE_A_PK = "room_create_a_pk";// 创建PK + String ROOM_CREATE_A_PK_AGAIN = "room_create_a_pk_again";//再次创建 + String ROOM_RESTART_PK = "room_restart_pk"; //重新开始 + String game_homepage_chosegame_click = "game_homepage_chosegame_click";//选择游戏点击 + String game_homepage_banner_click = "game_homepage_banner_click";//banner点击 + String game_homepage_createroom_click = "game_homepage_cr_click";//创建房间 + String game_homepage_lunkyroom_click = "game_homepage_lunkyroom_click";//房间说明 + String game_homepage_createroom_ordinary_click = "game_homepage_cr_ord_click";//创建普通房 + String game_homepage_createroom_cp_click = "game_homepage_cr_cp_click";//创建陪伴房 + String gamematching_close_click = "gamematching_close_click";//取消匹配 + String roomcp_game_open_click = "roomcp_game_open_click";//打开游戏模式 + String roomcp_gamechose_ready_click = "roomcp_gamechose_ready_click";//麦上用户发起按钮 + String roomcp_gamechose_invitation_click = "roomcp_gamechose_inv_click";//游戏邀请好友 + String roomcp_gamechose_close_click = "roomcp_gamechose_close_click";//关闭游戏模式 + String roomcp_gamematching_ready_click = "roomcp_gamematching_rea_click";//麦下用户准备按钮 + String roomcp_gamematching_refuse_click = "roomcp_gamematching_ref_click";//取消准备 + String roomcp_gamematching_accept_click = "roomcp_gamematching_acc_click";//麦上用户接受按钮 + String roomcp_gamematching_close_click = "roomcp_gamematching_clo_click";//房主关闭按钮 + String roomcp_gameover_changegame_click = "roomcp_gameover_cha_click";//换个游戏 + String roomcp_gameover_anotherround_click = "roomcp_gameover_anr_click";//再来一局 + String roomcp_gameover_follow_click = "roomcp_gameover_follow_click";//游戏结束关注按钮 + String roomcp_ktv_open_click = "roomcp_ktv_open_click";//陪伴房打开KTV + String roomcp_ktv_close_click = "roomcp_ktv_close_click";//陪伴房关闭ktv + String roomcp_ktv_choosesong_click = "roomcp_ktv_choosesong_click";////陪伴房点歌 + String roomcp_roomlimit_invitation_click = "roomcp_roomlimit_inv_click";//房间限制邀请进入 + String roomcp_roomlimit_friends_click = "roomcp_roomlimit_fri_click";//房间限制好友进入 + String roomcp_roomlimit_password_click = "roomcp_roomlimit_paw_click";//房间限制密码进入 + String roomcp_share_click = "roomcp_share_click";//陪伴房分享 + String roomcp_gift_open_click = "roomcp_gift_open_click";//陪伴房打开礼物面板 + String roomcp_gift_send_click = "roomcp_gift_send_click";////陪伴房送礼物 + String h5_gamepage_giveup_click = "h5_gamepage_giveup_click";//游戏认输 + String + + h5_recommend_used = "h5_recommend_used";//使用推荐卡 + + String guest_page_follow = "guest_page_follow";//客态页-关注 + + /** + * 我的曲库-删除 + */ + String ROOM_MY_LIBRARY_DELETE = "my_library_delete"; + /** + * 我的曲库-添加共享音乐 + */ + String ROOM_MY_LIBRARY_ADD_MUSIC = "my_library_add_music"; + + /** + * 我的曲库-扫描本地音乐 + */ + String ROOM_MY_LIBRARY_LOCAL_MUSIC = "my_library_local_music"; + + /** + * 共享音乐 + */ + String ROOM_SHARING_MUSIC = "sharing_music"; + + /** + * 共享音乐-搜索 + */ + String ROOM_SHARING_MUSIC_SEARCH = "sharing_music_search"; + + /** + * 开启纯净模式 + */ + String ROOM_OPEN_PURE_MODE = "open_pure_mode"; + + + //游戏v2 + String gamepage_homepage = "gamepage_homepage";//游戏榜单 + String gamelist_challenge = "gamelist_challenge";//挑战按钮 + String mp_room_game = "mp_room_game";//点击游戏选择面板按钮 + String mp_room_game_choice = "mp_room_game_choice";//点击选择游戏(多人房) + String mp_room_game_accept = "mp_room_game_accept";//点击接受按钮 + String mp_room_game_again = "mp_room_game_again";//点击再来一局按钮 + String mp_room_game_newgame = "mp_room_game_newgame";//点击换个游戏按钮 + String mp_room_game_newmatch = "mp_room_game_newmatch";//点击换个对手按钮 + String mp_room_game_return = "mp_room_game_return";//点击返回按钮 + String mp_room_game_share = "mp_room_game_share";//点击分享按钮 + String public_chat_game = "public_chat_game";//点击游戏选择面板按钮 + String public_chat_game_choice = "public_chat_game_choice";//点击选择游戏(公聊大厅) + String public_chat_game_accept = "public_chat_game_accept";//点击接受按钮 + String public_chat_game_again = "public_chat_game_again";//点击再来一局按钮 + String public_chat_game_newgame = "public_chat_game_newgame";//点击换个游戏按钮 + String public_chat_game_newmatch = "public_chat_game_newmatch";//点击换个对手按钮 + String public_chat_game_return = "public_chat_game_return";//点击返回按钮 + String public_chat_game_share = "public_chat_game_share";//点击分享按钮 + String private_chat_game = "private_chat_game";//点击游戏选择面板按钮 + String private_chat_game_choice = "private_chat_game_choice";//点击选择游戏(私聊IM) + String private_chat_game_again = "private_chat_game_again";//点击再来一局按钮 + String private_chat_game_accept = "private_chat_game_accept";//点击再来一局按钮 + String private_chat_game_newgame = "private_chat_game_newgame";//点击换个游戏按钮 + String private_chat_game_return = "private_chat_game_return";//点击返回按钮 + String private_chat_game_share = "private_chat_game_share";//点击分享按钮 + String private_chat_game_share_way = "private_chat_game_share_way";//选择渠道 + String cp_room_game__again = "cp_room_game__again";//点击再来一局按钮 + String cp_room_game_newgame = "cp_room_game_newgame";//点击换个游戏按钮 + String cp_room_game_return = "cp_room_game_return";//点击返回按钮 + String cp_room_game_share = "cp_room_game_share";//点击分享按钮 + String game_matching_again = "game_matching_again";//重新匹配 + String game_matching_getnews = "game_matching_getnews";//客户端接收匹配消息 + String game_homepage_lunkyroom = "game_homepage_lunkyroom";//首页声控福利房 + + //师徒 + String FIND_APPRENTICE_ENTRANCE = "find_apprentice_entrance";//收个徒弟赢钻石 + String MENTOR_GO_TO_THE_APPRENTICE = "mentor_go_to_the_apprentice";//去收徒 + String MENTOR_RANKING_LIST = "mentor_ranking_list";//名师排行榜 + String MENTOR_DISENGAGEMENT = "mentor_disengagement";//解除关系 + String NEWS_TASK_ONE_START = "news_task_one_start";//任务一开始 + String NEWS_TASK_ONE_COMPLETE = "news_task_one_complete";//任务一完成 + String NEWS_TASK_TWO_START = "news_task_two_start";//任务二开始 + String NEWS_TASK_TWO_COMPLETE = "news_task_two_complete";//任务二完成 + String NEWS_TASK_THREE_START = "news_task_three_start";//任务三开始 + String NEWS_TASK_THREE_COMPLETE = "news_task_three_complete";//任务三完成 + String NEWS_TASK_THREE_ACCOMPANYING_ROOM = "news_task_three_accompanying_room";//任务三邀请进房-陪伴房 + String NEWS_TASK_THREE_ORDINARY_ROOM = "news_task_three_ordinary_room";//任务三邀请进房-普通房 + String NEWS_TASK_FOUR_START = "news_task_four_start";//任务四开始 + String NEWS_TASK_FOUR_COMPLETE = "news_task_four_complete";//任务四完成 + String NEWS_SUCCESSFUL_APPRENTICE = "news_successful_apprentice";//收徒成功 + String NEWS_FAILURE_TO_RECEIVE_APPRENTICE = "news_failure_apprentice";// 收徒失败 + String NEWS_ROB = "news_rob";//抢徒弟 + String NEWS_ROB_SUCCESS = "news_rob_succeed";//抢徒弟成功 + String MENTOR_PUSH = "mentor_push";//收到抢徒弟全局推送 + String MENTOR_PUSH_JUMP = "mentor_push_jump";//抢徒弟全局推送-点击跳转 + String GLOBAL_PUSH_JUMP = "global_push_jump";//抢徒弟全局推送-点击跳转 + + String EVENT_ROOM_MY_HALL_CLICK = "room_my_hall_click"; // 厅管理入口 + String EVENT_ROOM_RECOMMEND_CLICK = "room_recommend_click"; // 我要上推荐 + + // 多人房 + String EVENT_MP_ROOM_SHARE_CLICK = "mp_room_share_click"; // 分享 房间 + String EVENT_MP_ROOM_SMASH_EGG_CLICK = "mp_room_smashEgg_click"; // 砸蛋入口 + String EVENT_MP_ROOM_SMASHEGG_CHOOSE = "mp_room_smashEgg_choose"; // 开始砸蛋-多人房 + String EVENT_MP_ROOM_RANKING_LIST_CLICK = "mp_room_rankingList_click"; // 房间榜 + String EVENT_MP_ROOM_MUSIC_CLICK = "mp_room_music_click"; // 音乐 + String EVENT_MP_ROOM_SET_TOPIC_CLICK = "mp_room_setTopic_click"; // 设置房间话题 + String EVENT_MP_ROOM_CLOSE_MIC_CLICK = "mp_room_close_mic_click"; // 关闭麦克风 + String EVENT_MP_ROOM_CLOSE_SOUND_CLICK = "mp_room_close_sound_click"; // 关闭声音 + String EVENT_MP_ROOM_EMOTICON_CLICK = "mp_room_emoticon_click"; // 表情面板按钮 + String EVENT_MP_ROOM_MORE_CLICK = "mp_room_more_click"; // 更多面板 + String EVENT_MP_ROOM_GIFT_CLICK = "mp_room_gift_click"; // 礼物面板按钮 + // 陪伴房 + String EVENT_CP_ROOM_SHARE_CLICK = "cp_room_share_click"; // 分享房间 + String EVENT_CP_ROOM_SMASH_EGG_CLICK = "cp_room_smashEgg_click"; // 砸蛋入口 + String EVENT_CP_ROOM_SMASHEGG_CHOOSE = "cp_room_smashEgg_choose"; // 开始砸蛋-陪伴房 + String EVENT_CP_ROOM_RANKING_LIST_CLICK = "cp_room_rankingList_click"; // 房间榜 + String EVENT_CP_ROOM_MUSIC_CLICK = "cp_room_music_click"; // 音乐 + String EVENT_CP_ROOM_SET_TOPIC_CLICK = "cp_room_setTopic_click"; // 设置房间话题 + String EVENT_CP_ROOM_CLOSE_MIC_CLICK = "cp_room_close_mic_click"; // 关闭麦克风 + String EVENT_CP_ROOM_CLOSE_SOUND_CLICK = "cp_room_close_sound_click"; // 关闭声音 + String EVENT_CP_ROOM_EMOTICON_CLICK = "cp_room_emoticon_click"; // 表情面板按钮 + String EVENT_CP_ROOM_MORE_CLICK = "cp_room_more_click"; // 更多面板 + String EVENT_CP_ROOM_GIFT_CLICK = "cp_room_gift_click"; // 礼物面板按钮 + String EVENT_MY_RECOMMEND_CLICK = "my_recommend_click"; // 我的推荐位 + + //资料卡片 + String data_card_gift_send_click = "data_card_gift_send"; // 送礼物 + String data_card_magic_send_click = "data_card_magic_send"; // 施魔法 + String data_card_decoration_send_click = "data_card_decoration_send"; // 送装扮 + String data_card_follow_click = "data_card_follow"; // 关注他 + String data_card_kickout_room_click = "data_card_kickout_room"; // 踢出房间 + String data_card_set_admin_click = "data_card_set_admin"; // 设为管理员 + String data_dard_join_blacklist_click = "data_dard_join_blacklist"; // 加入黑名单 + String data_dard_homepage_click = "data_dard_homepage"; // 主页 + String data_dard_close_mic_click = "data_dard_close_mic"; // 闭麦 + String data_dard_takeOut_mic_click = "data_dard_takeOut_mic"; // 抱他下麦 + String data_dard_lock_mic_click = "data_dard_lock_mic"; // 锁麦 + String data_dard_report_click = "data_dard_report"; // 举报 + + + String personal_data_101prove = "personal_data_101prove"; // 点击跳转h5认证按钮 + String game_homepage_followroom = "game_homepage_followroom"; // 点击关注人的房间 + String game_homepage_all_game = "game_homepage_all_game"; // 全部游戏入口 + String all_game_player = "all_game_player"; // 找玩友入口 + String all_game_choice = "all_game_choice"; //游戏匹配 + + + String EVENT_ROOM_MINIMIZE_CLOSED = "room_minimize_closed"; //房间最小化关闭按钮 + String EVENT_ROOM_LIST_TYPE = "room_list_type"; //区分房间类型(普通房、牌照房、新秀房) + String EVENT_ROOM_LIST_LABEL = "room_list_label"; // 区分房间标签 + + //萝卜-签到-任务 + String EVENT_POPUP_SIGN_IN_CLICK = "popup_sign_in_click"; //签到按钮-签到弹窗 + String EVENT_POPUP_SIGN_CLOSED = "popup_sign_closed"; // 签到弹框关闭按钮 + String EVENT_GAME_HOMEPAGE_SIGN_CLICK = "game_homepage_sign_click"; //签到-首页 + String EVENT_FIND_SIGN_CLICK = "find_sign_click"; //签到-发现页 + String EVENT_FIND_TASK_CLICK = "find_task_click"; //任务中心 + String EVENT_TASK_TOFINSH_CLICK = "task_toFinsh_click"; //去完成按钮 区分任务 + String EVENT_CJTASK_TOFINSH_CLICK = "cjtask_toFinsh_click"; // 成就任务去完成按钮 区分任务 + String EVENT_MY_RADISH_CLICK = "my_radish_click"; //我的萝卜 + String EVENT_SIGN_SHARE_CLICK = "sign_share_click"; // 签到-分享 + String EVENT_SIGN_REWARD_SHARE_CLICK = "sign_reward_share_click"; // 累计奖励-分享 + String EVENT_SIGN_REMIND_SWITCH = "sign_remind_switch"; // 签到提醒开关 + String EVENT_SIGN_IN_CLICK = "sign_in_click"; // 签到按钮-签到页 + String EVENT_SIGN_SUCCESS = "sign_success"; // 签到成功 区分入口 + String EVENT_TASK_GET_CLICK = "task_get_click"; // 每日任务领取按钮 区分任务 + String EVENT_CJTASK_GET_CLICK = "cjtask_get_click"; // 成就任务领取按钮 区分任务 + //补签 + String EVENT_RE_SIGN_SUCCESS = "re_sign_success"; // 补签成功 区分第几次补签 + + String EVENT_HALL_HALLINCOME_CLICK = "hall_hallincome_click"; // 厅收入统计 + String EVENT_HALL_ADDMEMBERS_CLICK = "hall_addMembers_click"; // 添加成员 区分入口 + + String DATA_CARD_CHAT = "data_card_chat"; // 资料卡 data_card 资料卡片-私聊 计数 + String FULL_GIFT_WATCHING = "full_gift_watching"; // 全服礼物 full_gift 前往围观计数 + //礼物值 + String EVENT_ROOM_GIFTVALUE_SWITCH = "room_giftValue_switch"; //礼物值开关 区分开关状态 + String EVENT_DATA_CARD_CLEAN_GIFTVALUE = "data_card_clean_giftValue"; //资料卡片-清除礼物值 + + String EVENT_OPEN_LEAVE_MODE = "open_leave_mode"; // 开启离开模式 + + String game_homepage_player = "game_homepage_player"; // 找玩友 + String game_homepage_matchsex = "game_homepage_matchsex"; // 异性匹配 + String game_homepage_hiparty = "game_homepage_hiparty"; // 嗨聊派对 + String room_hiparty = "room_hiparty"; //房间内-随机进入嗨聊房 + String room_hiparty_slide = "room_hiparty_slide"; //房间内-滑动切换嗨聊房 + String game_player_beginmatch = "game_player_beginmatch"; // 开始匹配按钮 + String game_player_choice = "game_player_choice"; // 玩友匹配页-筛选条件 + String game_player_finishmatch = "game_player_finishmatch"; // 停止匹配按钮 + String h5_gamepage_expression = "h5_gamepage_expression"; // 发送表情 区分表情 + String private_chat_favorite = "private_chat_favorite"; // TA爱玩的游戏 + + String game_homepage_activity = "game_homepage_activity"; // 首页活动入口 + String cp_room_activity = "cp_room_activity"; //陪伴房活动入口 + String mp_room_activity = "mp_room_activity"; // 多人房活动入口 + String public_chat_banword = "public_chat_banword"; // 公聊大厅-资料卡禁言操作 + + // 声音匹配 + String EVENT_SOUND_MATCH_LIKE = "soundmatch_like";// 喜欢 + String EVENT_SOUND_MATCH_UNLIKE = "soundmatch_unlike";// 不喜欢 + String EVENT_SOUND_MATCH_SUSPEND = "soundmatch_suspend";// 暂停播放按钮 + String EVENT_SOUND_MATCH_CHOICE_SEX = "soundmatch_choiceSex";// 选择性别 + String EVENT_SOUND_MATCH_USE_OLD_POP = "soundmatch_useOld_pop";// 询问使用弹窗 + String EVENT_SOUND_MATCH_RECORD_POP = "soundmatch_record_pop";// 去录制弹窗 + String EVENT_PRIVATE_CHAT_SAY_HELLO = "private_chat_sayHello";// 私聊页打个招呼 + // 我的声音 + String EVENT_MY_SOUND_RECORD = "my_sound_record";// 去录制 + String EVENT_MY_SOUND = "my_sound";// 我的 我的声音 + String EVENT_MY_SOUND_RERECORD = "my_sound_rerecord";// 重新录制 + String EVENT_MY_SOUND_TEXT_SWITCH = "my_sound_text_switch";// 切换文案 + String EVENT_MY_SOUND_RECORD_SAVE = "my_sound_record_save";// 保存录音 + + /** + * 开启纯净模式 + */ + String LOGIN_BINDING_PHONE_SKIP = "binding_phone_skip"; + String EVENT_HOME_CHAT_NUMBER_OF_POINTS = "home-chat-number-of-points"; // 首页-私聊-话匣子游戏-抛点数 + String EVENT_HOME_PAGE_PRIVATE = "home-page-private"; // 首页-私聊 + + String EVENT_MESSAGE_START_CHATTER_BOX = "message-start-chatterbox"; // 消息-发起话匣子 + String EVENT_MESSAGE_CHATTER_BOX_POINTS = "message-chatterbox-points"; // 消息-发起话匣子-抛点数 + String EVENT_MESSAGE_HOME_START_CHATTER_BOX = "home_start_chatterbox"; // 首页-私聊-点击话匣子 + /** + * 首页-声音匹配 + */ + String EVENT_HOME_SOUND_MATCHING = "home-sound-matching"; + /** + * 首页-合拍女神 + */ + String EVENT_HOME_GODDESS_OF_HARMONY = "home-goddess-of-harmony"; + /** + * 首页-大厅热聊 + */ + String EVENT_HOME_LOBBY_CHAT = "home-lobby-chat"; + /** + * 首页-小游戏 + */ + String EVENT_HOME_SMALL_GAME = "home-small-game"; + /** + * 合拍男/女神-进入房间 + */ + String EVENT_MATCH_MALE_ENTER_ROOM = "match-male-enter-room"; + /** + * 首页-用户列表-围观游戏 + */ + String EVENT_HOME_USER_LIST_WATCH_GAMES = "home-user-list-watch-games"; + /** + * 首页-用户列表-踩进房间 + */ + String EVENT_HOME_USER_LIST_STEP_INTO_ROOM = "home-user-list-step-into-room"; + /** + * 首页-语音派对 + */ + String EVENT_HOME_VOICE_PARTY = "home-voice-party"; + /** + * 首页-语音派对 + */ + String EVENT_HOME_DROP_REFRESH = "home-drop-refresh"; + + /** + * 首页-话题 + */ + String EVENT_HOME_MINI_WORLD = "home-little-world"; + + /** + * 首页-测一测 + */ + String EVENT_HOME_TEST = "home-test"; + + // 话题 + String EVENT_MINI_WORLD_PLAZA_JOINED_MORE = "world-plaza-joined-more";// 世界广场-我加入的-更多 + String EVENT_MINI_WORLD_PLAZA_JOINED_FIND_WORLD = "world-plaza-joined-find-world";// 世界广场-我加入的-发现新世界 + String EVENT_MINI_WORLD_SQUARE_INTO_WORLD = "world-square-into-world";// 世界广场-进入世界 + String EVENT_MINI_WORLD_SQUARE_FIND_WORLD_MORE = "world-square-find-world-more";// 世界广场-发现世界-更多 + String EVENT_MINI_WORLD_SQUARE_SEARCH_WORLD = "world-square-search-world";// 世界广场-搜索世界 + String EVENT_MINI_WORLD_PAGE_WORLD_NOTES = "world-page-world-notes";// 世界客态页-世界说明 + String EVENT_MINI_WORLD_PAGE_INVITATION_MEMBERS = "world-page-invitation-members";// 世界客态页-成员后面的邀请成员 + String EVENT_MINI_WORLD_PAGE_VIEW_MEMBERS_LIST = "world-page-view-members-list";// 世界客态页-查看成员列表 + String EVENT_MINI_WORLD_PAGE_JOIN_WORLD = "world-page-join-world";// 世界客态页-加入世界-点击加入按钮记一次 + String EVENT_MINI_WORLD_PAGE_ENTER_WORLD = "world-page-enter-world";// 世界客态页-加入世界成功-点击加入成功记一次 + String EVENT_MINI_WORLD_PAGE_INVITE_FRIENDS = "world-page-invite-friends";// 世界客态页-群成员不足邀请好友 + String EVENT_MINI_WORLD_PAGE_TALK_ABOUT_NEXT_TIME = "world-page-talk-next-time";// 世界客态页-群成员不足下次再说 + String EVENT_MINI_WORLD_PAGE_REMOVE_MEMBERS = "world-page-remove-members";// 世界客态页-查看成员列表--移除-点击移除按钮记一次 + String EVENT_MINI_WORLD_PAGE_ADD_GROUP_CHAT = "world-page-enter-group-chat";// 世界客态页-加入群聊-加入成功后进入群聊的用户,人数不足这种情况不算; + String EVENT_MINI_WORLD_PAGE_CLICK_GROUP_CHAT = "world-page-click-group-chat";// 世界客态页-点击群聊-点击群聊按钮记一次 + String EVENT_MINI_WORLD_PAGE_NO_MESSAGE = "world-page-no-message";// 世界客态页-开启消息免打扰 + String EVENT_MINI_WORLD_PAGE_REPORTING_WORLD = "world-page-reporting-world";// 世界客态页-举报话题 + String EVENT_MINI_WORLD_PAGE_EXIT_WORLD = "world-page-exit-world";// 世界客态页-退出话题 + String EVENT_MINI_WORLD_PAGE_EDIT_DATA = "world-page-edit-data";// 世界客态页-编辑资料 + String EVENT_MINI_WORLD_PAGE_DISSOLUTION_WORLD = "world-page-dissolution-world";// 世界客态页-解散世界 + String EVENT_MINI_WORLD_ROOM_BACK_TO_WORLD = "room-back-to-world";// 语音房-回到话题 + String EVENT_MINI_WORLD_EDITING_TOPICS = "world-page-editing-topics";// 世界客态页-群聊-编辑话题 + String EVENT_MINI_WORLD_CREATE_PARTY = "world-page-create-party";// 世界客态页-群聊-创建语音派对 + String EVENT_MINI_WORLD_JOIN_PARTY = "world-page-join-party";// 世界客态页-群聊-加入语音派对 + String EVENT_MINI_WORLD_MODIFY_PARTY_NAME = "world-page-modify-party-name";// 世界客态页-群聊-修改派对名称 + + String EVENT_WORLD_VIEW_WORLD_PAGE = "world_view_wolrd_page";// 进入话题客态页 + // =区分个人主页主客态页、动态右上角跟资料页TA(我)的话题、话题广场、语音派对、动态广场、动态详情) + String EVENT_WORLD_VIEW_WORLD_PAGE_B = "world_view_wolrd_page_b";// 进入话题客态页-区分世界 =区分世界) + String EVENT_WORLD_JOIN_GROUP = "world_join_group";// 加入群聊 =区分世界) + String EVENT_WORLD_LEAVE_GROUP_CHAT = "world_leave_group_chat";// 退出群聊 =区分世界) + String EVENT_WORLD_PAGE_ENTER_GROUP_CHAT = "world_page_enter_group_chat";// 进入群聊 =区分话题客态页、消息页) + String EVENT_WORLD_PAGE_ENTER_GROUP_CHAT_B = "world_page_enter_group_chat_b";// 进入群聊-区分世界 =区分话题) + String EVENT_WORLD_PAGE_NOTICE = "world_page_notice";// 切换公告和动态tab =区分:世界动态、世界公告的次数) + String EVENT_WORLD_PAGE_ENTER_PARTY = "world_page_enter_party";// 加入语音派对 =区分话题客态页、话题群聊) + String EVENT_WORLD_PAGE_ENTER_PARTY_B = "world_page_enter_party_b";// 加入语音派对 =区分话题) + + + /** + * 语音房-加入话题 + */ + String EVENT_JOIN_MINI_WORLD_FROM_ROOM = "room-join-the-world"; + /** + * 语音房-关注房主 + */ + String EVENT_FOLLOW_OWNER_FROM_ROOM = "room-focus-on-homeowner"; + + /** + * 语音房-新人有礼弹窗-领取奖励 + */ + String EVENT_ROOM_POPUP_NEW_USER_REWARD = "popup_newUser_reward"; + + // 去充值 + String EVENT_GIFT_PANEL_TO_RECHARGE = "gift_panel_to_recharge"; // 礼物面板_去充值 =区分私聊、群聊、公聊大厅、房间) + String EVENT_NOT_ENOUGH_TO_RECHARGE = "not_enough_to_recharge"; // 余额不足_去充值 =区分送礼物、买座驾、买头饰、开通贵族) + + + //社区 大部分都要区分个人主页、话题客态页、动态详情、动态广场 + String EVENT_WORLD_COPY_COMMENT = "world_copy_comment"; //复制评论 + String EVENT_WORLD_REPORT_COMMENT = "world_report_comment"; //举报评论 + String EVENT_WORLD_DELETE_COMMENT = "world_delete_comment"; //删除评论 + String EVENT_WORLD_REPLY_COMMENT = "world_reply_comment"; //回复评论 + String EVENT_WORLD_MOMENTS_MORE = "world_moments_more";//展开内容 区分个人主页、话题客态页 + String EVENT_WORLD_DELETE_MOMENTS = "world_delete_moments"; //删除动态 区分个人主页、话题客态页 + String EVENT_WORLD_REPORT_MOMENTS = "world_report_moments"; //举报动态 区分个人主页、话题客态页、动态广场 + String EVENT_WORLD_SHARE_MOMENTS = "world_share_moments"; //分享动态 区分个人主页、话题客态页、动态广场 + String EVENT_WORLD_COMMENT_MOMENTS = "world_comment_moments"; //评论按钮 区分个人主页、话题客态页、动态广场 + String EVEMT_WORLD_LIKE_MOMENTS = "world_like_moments"; //点赞动态 区分个人主页、话题客态页、动态广场 + String EVENT_WORLD_COMMENT_DYNAMIC = "world_comment_dynamic"; //评论动态 + String EVENT_WORLD_MOMENTS_DETAILS = "world_moments_details"; //动态详情 区分话题客态、个人主页、APP内分享、消息互动通知、linkedme + String EVENT_WORLD_LIKE_MOMENTS_B = "world_like_moments_b"; //点赞动态的次数,区分话题 + String EVENT_WORLD_COMMENT_MOMENTS_B = "world_comment_moments_b"; // 点击评论按钮进入详情页的次数,区分话题 + String EVENT_WORLD_LIKE_MOMENTS_C = "world_like_moments_c"; // 点赞动态的次数,区分点赞和取消赞 + + //发布 + String EVENT_WORLD_PUBLISH_SUCCEED = "world_publish_succeed"; //成功发布 + String EVENT_WORD_RETURN_CANCEL = "word_return_cancel"; //未发布弹窗选择 区分选项 + String EVENT_WORLD_GIVE_UP = "world_give_up"; //已编辑内容中途返回 + String EVENT_WORLD_PUBLISH_MOMENTS = "world_publish_moments"; //发布动态 + String EVENT_WORLD_PUBLISH_MOMENTS_B = "world_publish_moments_b"; //发布动态 区分入口:广场,话题客态页 + //1.3.2 广场 + String EVENT_SQUARE_RECOMMEND_FOLLOW = "square_recommend_follow";//切换推荐和关注tab 区分tab:推荐、关注 + + + String EVENT_SETTING_SHOW_AGE = "setting_show_age"; // 年龄展示 =区分开关) + String EVENT_SETTING_CHAT_MATCHING = "setting_chat_matching"; // 匹配聊天 (区分开关) + String EVENT_SETTING_SECRET = "setting_secret"; //点击进入隐私设置的次数 + String EVENT_SETTING_LOCATION = "setting_location"; //点击设置地理位置的次数 + String EVENT_SETTING_NOTICE = "setting_notice"; //点击进入通知提醒设置的次数 + String EVENT_SETTING_SYSTEM_NOTICE = "setting_system_notice"; //点击设置系统消息提醒的次数 区分开关 + + String EVENT_HOME_PAGE_HOOK_UP = "homepage_hook_up"; // 撩一下 + String EVENT_HOME_PAGE_PERSONAL_PAGE = "homepage_personal_page"; // 进入个人客态页 + + String EVENT_SQUARE_CHOOSE_WORLD = "square_choose_world"; // 发布动态选择发布的话题 区分话题 + String EVENT_SQUARE_RECOMMEND_WORLD = "square_recommend_world"; // 发布动态选择推荐的话题 区分话题 + String EVENT_SQUARE_JOIN_WORLD = "square_join_world"; // 发布动态点击发布时弹窗 区分 我再想想 加入并发布 + + //礼物消息重发 + String EVENT_ROOM_GIFT_FAILED = "room_gift_failed"; //房间礼物消息发送失败 + String EVENT_ROOM_GIFT_RETRY_FAILED = "room_gift_retry_failed"; //房间礼物消息重发失败 + String EVENT_ROOM_GIFT_RETRY_SUCCEED = "room_gift_retry_succeed"; //房间礼物消息重发成功 区分是第几次重新发送成功 + + String EVENT_HOME_FIRST_TAB = "home_first_tab"; // 首页tab + String EVENT_HOME_FIND_TAB = "home_find_tab"; // 发现tab + String EVENT_HOME_MESSAGE_TAB = "home_message_tab"; // 消息tab + String EVENT_HOME_MINE_TAB = "home_mine_tab"; // 我的tab + + String EVENT_HOMEPAGE_MOMENT = "homepage_moment"; // 个人主页动态tab =区分主态客态) + String EVENT_HOMEPAGE_DATA = "homepage_data"; // 个人主页资料tab =区分主态客态) + String EVENT_HOMEPAGE_GIFT = "homepage_gift"; // 个人主页礼物tab =区分主态客态) + String EVENT_HOMEPAGE_GIFT_CHANGE_TAB = "homepage_gift_change_tab"; // 礼物页切换按钮 =区分礼物成就,收到的礼物) + String EVENT_HOMEPAGE_GIFT_TIP = "homepage_gift_tip"; // 有礼物提示卡片 =区分礼物名称) + String EVENT_HOMEPAGE_GIFT_NO_TIP = "homepage_gift_no_tip"; // 无礼物提示卡片 =区分礼物名称) + String EVENT_HOMEPAGE_CAR = "homepage_car"; // 个人主页座驾tab =区分主态客态) + + + String EVENT_SEARCH_RECENT_SEARCH = "search_recent_search"; // 最近搜索记录 + String EVENT_SEARCH_RECENT_ENTER_ROOM = "search_recent_enter_room"; // 最近进房记录 + + //房间活动入口 + String EVENT_ROOM_ACTIVITY_ENTRANCE = "room_activity_entrance"; //房间左上角活动入口-区分活动 + String EVENT_ROOM_ACTIVITY_ENTRANCE_B = "room_activity_entrance_b"; //房间右下角活动入口-区分活动 + + //欢迎语 + String EVENT_ROOM_WELCOME_HIM = "room_welcome_him"; //用户进房,麦上用户点击“欢迎TA”的次数 + String EVENT_ROOM_FOLLOW_HIM = "room_follow_him"; //收到欢迎语,用户点击“关注TA”的次数 + + //1元首充 + String EVENT_ROOM_GIFT_ONEYUAN_ENTRANCE = "room_gift_oneyuan_entrance"; //礼物面板_一元首充-区分入口 + + String EVENT_INFORMATION_RANDOM_AVATAR = "information_random_avatar"; //随机头像 + String EVENT_INFORMATION_RANDOM_NAME = "information_random_name"; //随机昵称 + + String EVENT_HOME_PUSH_INQUIRE = "home_push_inquire"; //通知权限弹窗-区分-“立即开启”/“下次再说” + + String EVENT_ONE_CLICK_LOGIN = "one_click_login"; // 一键登录 + String EVENT_ONE_CLICK_LOGIN_SUCCEED = "one_click_login_succeed"; // 一键登录成功 + String EVENT_ONE_CLICK_LOGIN_FAILED = "one_click_login_failed"; // 一键登录失败 + String EVENT_ONE_CLICK_LOGIN_CHANGE_ID = "one_click_login_change_id"; // 一键登录-切换账号 + + //主播认证 + String EVENT_MY_OFFICIAL_ANCHOR = "my_official_anchor"; //“我的”页面点击官方主播入口的次数 + + + /** + * MoliStar1.4.0版本埋点整理 + */ + String EVENT_APP_LAUNCH = "app_launch"; //app启动 + + String EVENT_SEARCH = "search"; // 进入搜索页 + + String EVENT_INTO_ROOM_CLICK = "intoroom"; //进入房间 + String EVENT_SEARCH_INTO_RESULT_ROOM_CLICK = "search_intoresultroom";//搜索_进入结果房间 + String EVENT_SEARCH_INTO_HISTORY_ROOM_CLICK = "search_intohistoryroom";//搜索_进入历史房间 + String EVENT_HOME_INTO_TJ_ROOM_CLICK = "home_intoTJroom";//首页_进入推荐房间 + String EVENT_HOME_INTO_MY_ROOM_CLICK = "home_intomyroom";//首页_进入我的房间 + String EVENT_HOME_INTO_FOLLOW_ROOM_CLICK = "home_intofollowroom";//首页_进入收藏房间 + String EVENT_HOME_INTO_CHAT_ROOM_CLICK = "home_intochatroom";//首页_进入聊天交友房间 + + String EVENT_HOME_INTO_JYKL_ROOM_CLICK = "JYKL_intoroom";//点击交友扩列项进入房间 + String EVENT_HOME_INTO_TJFJ_ROOM_CLICK = "TJFJ_intoroom";//点击推荐房间进入房间 + String EVENT_HOME_INTO_LTJY_ROOM_CLICK = "LTJY_intoroom";//点击聊天交友项进入房间 + String EVENT_HOME_INTO_DBRUK_CLICK = "DBRUK_intoroom";//点击顶部我的房间/关注进入房间 + + String EVENT_MORE_ROOM_INTO_ROOM_CLICK = "moreroom_intoroom";//更多房间页_进入房间 + String EVENT_ME_INTO_MY_ROOM_CLICK = "me_intomyroom";//我页_进入我的房间 + String EVENT_ME_INTO_FOLLOW_ROOM_CLICK = "me_intofollowroom";//我页_进入关注房间 + + + String EVENT_HOME_RANK_CLICK = "home_rank";//首页_榜单 + + String EVENT_HOME_BANNER_CLICK = "home_banner";//首页_banner + String EVENT_ROOM_PROMOTE_CLICK = "room_promote";//语音房_推广入口 + + String EVENT_HOME_SCREEN_DONG_TAI_CLICK = "home_screendongtai";//首页_聊天交友切换到动态 + String EVENT_SQUARE_DONG_TAI_CLICK = "squaredongtai";//点击广场动态页 + String EVENT_SQUARE_DONGTAI_TJ_HJ_CLICK = "squaredongtai_TJ_HT";//广场动态页_推荐_点击话题 + String EVENT_SQUARE_DONGTAI_FOLLOW_CLICK = "squaredongtai_follow";//广场动态页_关注 + String EVENT_SQUARE_DONGTAI_NEW_CLICK = "squaredongtai_new";//广场动态页_最新 + + String EVENT_ROOM_INVITEFANS_CLICK = "room_invitefans";//语音房邀请粉丝 + String EVENT_ROOM_QUICKCHAT_CLICK = "room_quickchat";//语音房_快捷发言 + String EVENT_ROOM_CHAT_CLICK = "room_chat";//语音房_公屏发言 + String EVENT_ROOM_FOLLOW_BUTTON_CLICK = "room_follow_button";//语音房_收藏顶部按钮 + String EVENT_ROOM_FOLLOW_CHAT_CLICK = "room_follow_chat";//语音房_收藏公屏提示 + String EVENT_ROOM_SHARE_CLICK = "room_share";//语音房_分享 + String EVENT_ROOM_MESSAGE_CLICK = "room_message";//语音房_消息 + String EVENT_ROOM_MESSAGE_FINDNEW_CLICK = "room_message_findnew";//语音房_消息_发现萌新 + + String EVENT_ROOM_SENDHONGBAO_CLICK = "room_sendhongbao";//进入发红包页面 + String EVENT_ROOM_SENDHONGBAO_SUCCESS = "room_sendhongbao_success";//发红包成功 + + String EVENT_MESSAGE = "message";//消息页 + String EVENT_MESSAGE_FINDNEW = "message_findnew";//消息页_发现萌新 + String EVENT_PRIVATECHAT_CAHT = "privatechat_chat";//私聊_聊文字或图片 + String EVENT_PRIVATECHAT_SENDGIFT = "privatechat_sendgift";//私聊_送礼物 + + String EVENT_UPDATE_OPTIONALPOPUP = "update_optionalpopup";//更新_提示更新弹窗 + String EVENT_UPDATE_OPTIONALPOPUP_NEXT = "update_optionalpopup_next";//更新_提示更新弹窗_下次再说 + String EVENT_UPDATE_OPTIONALPOPUP_NOW = "update_optionalpopup_now";//更新_提示更新弹窗_立即更新 + String EVENT_UPDATE_FORCEPOPUP = "update_forcepopup";//更新_强制更新弹窗 + String EVENT_UPDATE_FORCEPOPUP_NOW = "update_forcepopup_now";//更新_强制更新弹窗_立即更新 + String EVENT_OPERATIONAL_ROOM_SUCCESS = "operational_room_success";//赛事详情进入聊天室 + + String EVENT_RM_ROOM_SUCCESS = "RM_room_success"; + String EVENT_TJ_TABEXCHANGE = "TJ_tabexchange"; + String EVENT_TJ_ROOM_SUCCESS = "TJ_room_success"; + String EVENT_GZR_ROOM_SUCCESS = "GZR_room_success"; + String EVENT_SCFJ_ROOM_SUCCESS = "SCFJ_room_success"; + String EVENT_KH_ROOM_SUCCESS = "KH_room_success"; + + String EVENT_ZXTJ_ROOM_MORE_CLICK = "ZXTJ_room_more_click";//最新推荐更多点击 + String EVENT_RQZB_ROOM_MORE_CLICK = "RQZB_room_more_click";//人气主播更多点击 + String EVENT_RQZB_ROOM_SUCCESS = "RQZB_room_success";//人气主播进入房间成功 + String EVENT_MINI_GAME_ROOM_SUCCESS = "mini_game_room_success";//小游戏tab进入房间成功 + String EVENT_ZB_TAB_ROOM_SUCCESS = "ZB_TAB_room_success";//直播tab进入房间成功 + String EVENT_COMMON_TAB_ROOM_SUCCESS = "COMMON_TAB_room_success";//通用tab进入房间成功 + String EVENT_HOME_MY_ROOM_CLICK = "home_my_room_click";//首页_点击我的房间 + + String EVENT_VIP_OPEN_CLICK = "vip_open_click"; + String EVENT_VIP_ENTRANCE_ROOM_CLICK = "vip_entrance_room_click"; + String EVENT_VIP_ENTRANCE_GIFT_CLICK = "vip_entrance_gift_click"; + String EVENT_VIP_ENTRANCE_FACE_CLICK = "vip_entrance_face_click"; + String EVENT_VIP_ENTRANCE_ME_CLICK = "vip_entrance_me_click"; + + String EVENT_RECENT_CARD_SHOW = "recent_card_show";//最近在看卡片曝光 + String EVENT_RECENT_CARD_CLICK = "recent_card_click";//最近在看卡片点击 + String EVENT_GEBO_TAB_CLICK = "gebo_tab_click";//个播页二级tab分类点击 + + String EVENT_HOMEPAGE_POP_SHOW = "homepage_pop_show";//首页活动弹窗曝光 + String EVENT_HOMEPAGE_POP_CLICK = "homepage_pop_click";//首页活动弹窗图片点击(跳转H5) + String EVENT_HOMEPAGE_POP_CLOSE_CLICK = "homepage_pop_close_click";//首页活动弹窗关闭点击 + String EVENT_TASK_TOAST_SHOW = "task_toast_show";//任务完成toast曝光 + String EVENT_TASK_TOAST_CLICK = "task_toast_click";//任务完成toast点击(跳转活动页) + + String EVENT_ROOM_NUGIVE_POP_SHOW = "room_nugive_pop_show";//房间礼物赠送弹窗曝光 + String EVENT_ROOM_NUGIVE_POP_CLICK = "room_nugive_pop_click";//房间礼物赠送弹窗关闭点击 + + String EVENT_NUGIFT_POP_SHOW = "nugift_pop_show";//新人专享礼物弹窗曝光 + String EVENT_NUGIFT_POP_CLICK = "nugift_pop_click";//新人专享礼物弹窗充值点击 + String EVENT_NUGIFT_POP_FINISH_CLICK = "nugift_pop_finish_click";//新人专享礼物弹窗充值完成后弹窗 + String EVENT_NUGIFT_POP_CLOSE_CLICK = "nugift_pop_close_click";//新人专享礼物弹窗关闭点击 + String EVENT_USERCENTER_NUGIFT_POP_SHOW = "usercenter_nugift_pop_show";//新人专享礼物入口曝光 + String EVENT_USERCENTER_NUGIFT_POP_CLICK = "usercenter_nugift_pop_click";//新人专享礼物入口点击 + + String EVENT_PERSONALSHOW_TOP_CARD_SHOW = "personalshow_top_card_show";//个播展示卡片曝光 + String EVENT_PERSONALSHOW_TOP_CARD_ROOM_CLICK = "personalshow_top_card_room_click";//个播展示卡片进入房间点击 + String EVENT_PERSONALSHOW_TOP_CARD_VOICE_CLICK = "personalshow_top_card_voice_click";//个播展示卡片播放语音点击 + + String EVENT_USERCENTER_RECHARGE_CARD_CLICK = "usercenter_recharge_card_click";//个人中心充值卡片点击 + String EVENT_USERCENTER_NOBLE_CARD_CLICK = "usercenter_noble_card_click";//个人中心贵族卡片片点击 + String EVENT_USERCENTER_FUNCTION_CLIC = "usercenter_function_clicck";//个人中心功能板块点击 + String EVENT_USERCENTER_QUICK_ENTRY_CLICK = "usercenter_quick_entry_click";//个人中心快捷进房点击未匹配成功 + String EVENT_USERCENTER_QUICK_ENTRYSUCCESS_CLICK = "usercenter_quick_entrysuccess_click";//个人中心快捷进房点击成功匹配 + String EVENT_USERCENTER_BANNER_CLICK = "usercenter_banner_click";//个人中心banner模块点击 + + String EVENT_TREASURE_ELF_ENTRANCE_CLICK = "treasure_elf_entrance_click";//夺宝精灵主入口点击 + String EVENT_TREASURE_ELF_SCREEN_ENTRANCE_CLICK = "treasure_elf_screen_entrance_click";//夺宝精灵公屏入口点击 + String EVENT_TREASURE_ELF_LOTTERY_CLICK = "treasure_elf_lottery_click";//夺宝精灵抽奖点击 + +} diff --git a/core/src/main/java/com/chwl/core/support/config/Constants.kt b/core/src/main/java/com/chwl/core/support/config/Constants.kt new file mode 100644 index 0000000..21b2647 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/config/Constants.kt @@ -0,0 +1,9 @@ +package com.chwl.core.support.config + +/** + * Created by Max on 2023/10/26 22:50 + * Desc:常用变量 + **/ +object Constants { + val KEY_INTENT = "/intent" +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/listener/ListenerOwner.kt b/core/src/main/java/com/chwl/core/support/listener/ListenerOwner.kt new file mode 100644 index 0000000..18298f2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/listener/ListenerOwner.kt @@ -0,0 +1,10 @@ +package com.chwl.core.support.listener + + + +interface ListenerOwner : ListenerStore { + /** + * 发布事件 + */ + fun postEvent(block: (T) -> Unit) +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/listener/ListenerStore.kt b/core/src/main/java/com/chwl/core/support/listener/ListenerStore.kt new file mode 100644 index 0000000..8844a8b --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/listener/ListenerStore.kt @@ -0,0 +1,14 @@ +package com.chwl.core.support.listener + + +interface ListenerStore { + fun getListenerCount(): Int + + fun addListener(listener: T) + + fun addFirstListener(listener: T) + + fun removeListener(listener: T) + + fun removeAllListener() +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/listener/SafeListenerOwner.kt b/core/src/main/java/com/chwl/core/support/listener/SafeListenerOwner.kt new file mode 100644 index 0000000..949115c --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/listener/SafeListenerOwner.kt @@ -0,0 +1,53 @@ +package com.chwl.core.support.listener + +import java.util.concurrent.CopyOnWriteArrayList + + +class SafeListenerOwner : ListenerOwner { + + private var listeners: CopyOnWriteArrayList? = null + + private fun checkCreateListener() { + if (listeners == null) { + listeners = CopyOnWriteArrayList() + } + } + + override fun addListener(listener: T) { + checkCreateListener() + if (listeners?.contains(listener) == true) { + return + } + listeners?.add(listener) + } + + override fun addFirstListener(listener: T) { + checkCreateListener() + if (listeners?.contains(listener) == true) { + return + } + listeners?.add(0, listener) + } + + override fun removeListener(listener: T) { + listeners?.remove(listener) + } + + override fun removeAllListener() { + listeners?.clear() + listeners = null + } + + /** + * 发布事件 + */ + override fun postEvent(block: (T) -> Unit) { + listeners?.forEach { + block.invoke(it) + } + } + + override fun getListenerCount(): Int { + return listeners?.size ?: 0 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/listener/SimpleListenerOwner.kt b/core/src/main/java/com/chwl/core/support/listener/SimpleListenerOwner.kt new file mode 100644 index 0000000..059b34b --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/listener/SimpleListenerOwner.kt @@ -0,0 +1,51 @@ +package com.chwl.core.support.listener + + +class SimpleListenerOwner : ListenerOwner { + + private var listeners: ArrayList? = null + + private fun checkCreateListener() { + if (listeners == null) { + listeners = ArrayList() + } + } + + override fun addListener(listener: T) { + checkCreateListener() + if (listeners?.contains(listener) == true) { + return + } + listeners?.add(listener) + } + + override fun addFirstListener(listener: T) { + checkCreateListener() + if (listeners?.contains(listener) == true) { + return + } + listeners?.add(0, listener) + } + + override fun removeListener(listener: T) { + listeners?.remove(listener) + } + + override fun removeAllListener() { + listeners?.clear() + listeners = null + } + + /** + * 发布事件 + */ + override fun postEvent(block: (T) -> Unit) { + listeners?.forEach { + block.invoke(it) + } + } + + override fun getListenerCount(): Int { + return listeners?.size ?: 0 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/AudioRoomContext.kt b/core/src/main/java/com/chwl/core/support/room/AudioRoomContext.kt new file mode 100644 index 0000000..8b6acf0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/AudioRoomContext.kt @@ -0,0 +1,51 @@ +package com.chwl.core.support.room + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.chwl.core.support.room.RoomAbility +import com.chwl.core.support.room.RoomContext + +/** + * Created by Max on 2023/10/26 15:41 + * Desc:语音房 + * @param roomId roomUid + **/ +class AudioRoomContext(roomId: Long) : RoomContext(roomId) { + + /** + * 临时维护在这里,后续逐步改动 + */ + companion object { + private var context: RoomContext? = null + + // TODO:#临时方案 目前房间的生命周期有点出乎意料,未成功进房时,View层都已初始化完毕,所以临时开放这个LiveData供View层获取到Context + private val _contextLiveData = MutableLiveData() + val contextLiveData: LiveData get() = _contextLiveData + fun get(): RoomContext? { + return context + } + + fun set(context: RoomContext?) { + this.context = context + _contextLiveData.postValue(context) + } + } + + override fun loadAbility(list: MutableMap) { + super.loadAbility(list) + } + + /** + * 激活房间(进入房间后) + */ + @Deprecated("临时方案:后续逐步完善RoomContext替换计划,到时候不会在这里实现该逻辑") + fun run() { + set(this) + performStart() + } + + override fun onCleared() { + super.onCleared() + set(null) + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/FrameLayoutRoomWidget.kt b/core/src/main/java/com/chwl/core/support/room/FrameLayoutRoomWidget.kt new file mode 100644 index 0000000..92df1c2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/FrameLayoutRoomWidget.kt @@ -0,0 +1,139 @@ +package com.chwl.core.support.room + +import android.content.Context +import android.util.AttributeSet +import android.widget.FrameLayout +import androidx.annotation.CallSuper +import androidx.lifecycle.Observer +import com.chwl.core.utils.extension.toast +import com.chwl.library.net.rxnet.exception.ExceptionHandle +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.disposables.Disposable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import java.lang.Exception + +/** + * Created by Max on 2023/10/30 18:20 + * Desc:FrameLayout版本的房间组件 + * PS:由于目前房间架构支持同类型房间View层共用+目前的房间生命周期很不清晰!所以下面相关代码都在解决何时初始化、何时解绑等!! + **/ +abstract class FrameLayoutRoomWidget : FrameLayout, RoomWidget { + + protected val widgetScope = MainScope() + protected var roomView: RoomView? = null + protected var roomContext: RoomContext? = null + + // 当前房间UID + private var roomId: Long? = null + + // 为了获取到RoomContext + private val contextObserver = + Observer { value -> + if (roomId != null && (value == null || roomId != value.roomId)) { + onUnbindContext() + } + roomId = value?.roomId + if (value != null) { + onBindContext(value) + this.roomView?.let { + onInitialize(it, value) + } + } + } + + private var compositeDisposable: CompositeDisposable? = null + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attrs, defStyleAttr, defStyleRes) + + @CallSuper + override fun onStart(roomView: RoomView) { + this.roomView = roomView + roomView.getRoomContextLiveData().observeForever(contextObserver) + } + + @CallSuper + override fun onStop() { + // 注销监听 + roomView?.getRoomContextLiveData()?.removeObserver(contextObserver) + // 解绑 + onUnbindContext() + this.roomView = null + } + + /** + * 绑定房间上下文:建立数据连接 + */ + open fun onBindContext(roomContext: RoomContext) { + this.roomContext = roomContext + } + + /** + * 解绑上下文:重置View状态 + */ + open fun onUnbindContext() { + compositeDisposable?.dispose() + compositeDisposable = null + try { + widgetScope.cancel() + } catch (e: Exception) { + e.printStackTrace() + } + this.roomContext = null + } + + /** + * 初始化(View+Context) + */ + open fun onInitialize(roomView: RoomView, roomContext: RoomContext) {} + + protected fun getCompositeDisposable(): CompositeDisposable { + var disposable = compositeDisposable + if (disposable == null) { + disposable = CompositeDisposable() + compositeDisposable = disposable + } + return disposable + } + + protected fun addDisposable(disposable: Disposable) { + getCompositeDisposable().add(disposable) + } + + protected fun safeLaunch( + onError: suspend(e: Throwable) -> Unit = { + if (it.message != "Job was cancelled") { + val message = ExceptionHandle.handleException(it) + message.toast() + } + }, + onComplete: (() -> Unit)? = null, + block: suspend CoroutineScope.() -> Unit + ) { + widgetScope.launch { + try { + block() + } catch (e: Throwable) { + e.printStackTrace() + onError(e) + } finally { + onComplete?.invoke() + } + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/RoomAbility.kt b/core/src/main/java/com/chwl/core/support/room/RoomAbility.kt new file mode 100644 index 0000000..483c2c4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/RoomAbility.kt @@ -0,0 +1,154 @@ +package com.chwl.core.support.room + +import androidx.annotation.CallSuper +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import com.example.lib_utils.log.ILog +import com.trello.rxlifecycle3.LifecycleProvider +import com.trello.rxlifecycle3.LifecycleTransformer +import com.trello.rxlifecycle3.OutsideLifecycleException +import com.trello.rxlifecycle3.RxLifecycle +import com.chwl.core.support.room.lifecycle.RoomFullLifecycleObserver +import com.chwl.core.support.room.lifecycle.RoomLifecycle +import com.chwl.core.utils.extension.toast +import com.chwl.library.net.rxnet.exception.ExceptionHandle +import io.reactivex.Observable +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.disposables.Disposable +import io.reactivex.functions.Function +import io.reactivex.subjects.BehaviorSubject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import java.lang.Exception + +/** + * Created by Max on 2023/10/26 11:03 + * Desc:房间-基础能力组件 + **/ +abstract class RoomAbility : LifecycleEventObserver, ILog, RoomFullLifecycleObserver, + LifecycleProvider { + + protected var roomContext: RoomContext? = null + + protected var roomView: RoomView? = null + + // 自定义RxLifeCycle(临时方案:后续替换为Flow) + private val lifecycleSubject = BehaviorSubject.create() + + private var compositeDisposable: CompositeDisposable? = null + + protected val abilityScope = MainScope() + + /** + * 被RoomContext激活 + */ + @CallSuper + open fun onAttach(context: RoomContext) { + this.roomContext = context + context.roomLifecycle.addObserver(this) + } + + /** + * View附加状态 + * @param view + */ + @CallSuper + open fun onViewAttach(view: RoomView) { + roomView?.getLifecycleOwner()?.lifecycle?.removeObserver(this) + roomView = view + view.getLifecycleOwner().lifecycle.addObserver(this) + } + + @CallSuper + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + if (event == Lifecycle.Event.ON_DESTROY) { + roomView?.getLifecycleOwner()?.lifecycle?.removeObserver(this) + roomView = null + } + } + + override fun onStateChanged(context: RoomContext, event: RoomLifecycle.Event) { + super.onStateChanged(context, event) + // 同步更新事件 + lifecycleSubject.onNext(event) + if (event == RoomLifecycle.Event.STOP) { + compositeDisposable?.dispose() + compositeDisposable = null + try { + abilityScope.cancel() + } catch (e: Exception) { + e.printStackTrace() + } + roomContext?.roomLifecycle?.removeObserver(this) + roomContext = null + } + } + + protected fun safeLaunch( + onError: suspend(e: Throwable) -> Unit = { + if (it.message != "Job was cancelled") { + val message = ExceptionHandle.handleException(it) + message.toast() + } + }, + onComplete: (() -> Unit)? = null, + block: suspend CoroutineScope.() -> Unit + ) { + abilityScope.launch { + try { + block() + } catch (e: Throwable) { + e.printStackTrace() + onError(e) + } finally { + onComplete?.invoke() + } + } + } + + + + /** + * 下面为RxLifeCycle相关(临时方案,后续替换Flow) + */ + + protected fun addDisposable(disposable: Disposable) { + getCompositeDisposable().add(disposable) + } + + private fun getCompositeDisposable(): CompositeDisposable { + var disposable = compositeDisposable + if (disposable == null) { + disposable = CompositeDisposable() + compositeDisposable = disposable + } + return disposable + } + + @Deprecated("准备移除,改用addDisposable即可") + override fun lifecycle(): Observable { + return lifecycleSubject.hide() + } + + @Deprecated("准备移除,改用addDisposable即可") + override fun bindUntilEvent(event: RoomLifecycle.Event): LifecycleTransformer { + return RxLifecycle.bindUntilEvent(lifecycleSubject, event) + } + + @Deprecated("准备移除,改用addDisposable即可") + override fun bindToLifecycle(): LifecycleTransformer { + return RxLifecycle.bind(lifecycleSubject, ROOM_LIFECYCLE) + } + + private val ROOM_LIFECYCLE: Function = + Function { lastEvent -> + when (lastEvent) { + RoomLifecycle.Event.START -> RoomLifecycle.Event.STOP + RoomLifecycle.Event.STOP -> throw OutsideLifecycleException("Cannot bind to Room lifecycle when outside of it.") + else -> throw UnsupportedOperationException("Binding to $lastEvent not yet implemented") + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/RoomContext.kt b/core/src/main/java/com/chwl/core/support/room/RoomContext.kt new file mode 100644 index 0000000..8fc3614 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/RoomContext.kt @@ -0,0 +1,88 @@ +package com.chwl.core.support.room + +import androidx.annotation.CallSuper +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.chwl.core.room.core.RoomDataService +import com.example.lib_utils.log.ILog +import com.chwl.core.support.room.lifecycle.RoomLifecycle +import com.chwl.core.support.room.lifecycle.RoomLifecycleRegistry + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:一个房间 + * @param roomId roomUid + **/ +abstract class RoomContext(var roomId: Long) : ILog { + + /** + * 生命周期处理 + */ + val roomLifecycle: RoomLifecycleRegistry = RoomLifecycleRegistry() + + /** + * 所有能力组件 + */ + private val abilityList = LinkedHashMap() + + init { + initAbility() + } + + /** + * 启动(进入房间) + */ + @CallSuper + open fun performStart() { + logI("performStart()", filePrinter = true) + roomLifecycle.handleLifecycleEvent(this, RoomLifecycle.Event.START) + } + + /** + * 停止(退出房间) + */ + @CallSuper + open fun performStop() { + logI("performStop()", filePrinter = true) + roomLifecycle.handleLifecycleEvent(this, RoomLifecycle.Event.STOP) + onCleared() + } + + /** + * 初始化Ability + */ + private fun initAbility() { + loadAbility(abilityList) + abilityList.keys.forEach { + abilityList[it]?.onAttach(this) + } + } + + /** + * 装载能力组件 + */ + open fun loadAbility(list: MutableMap) { + list.put(RoomDataService::class.java.simpleName, RoomDataService()) + } + + /** + * 查找组件 + */ + fun findAbility(key: String?): T? { + return abilityList[key] as? T + } + + /** + * 附加上视图了 + */ + @Deprecated("临时方案:后续逐步完善RoomContext替换计划,到时候不会在这里实现该逻辑") + fun onViewAttach(view: RoomView) { + abilityList.keys.forEach { + abilityList[it]?.onViewAttach(view) + } + } + + protected open fun onCleared() { + abilityList.clear() + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/RoomService.kt b/core/src/main/java/com/chwl/core/support/room/RoomService.kt new file mode 100644 index 0000000..bd6571f --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/RoomService.kt @@ -0,0 +1,10 @@ +package com.chwl.core.support.room + +/** + * Created by Max on 2023/10/26 12:31 + * Desc:房间-基础服务组件 + * PS:基于[RoomContext],提供整个房间的基础服务能力。(服务之间可相互提供能力,也可向下提供能力。) + * + **/ +abstract class RoomService : RoomAbility() { +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/RoomView.kt b/core/src/main/java/com/chwl/core/support/room/RoomView.kt new file mode 100644 index 0000000..e5ae730 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/RoomView.kt @@ -0,0 +1,29 @@ +package com.chwl.core.support.room + +import android.app.Activity +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LiveData +import androidx.room.Room + +/** + * Created by Max on 2023/10/26 15:05 + * Desc:房间视图层 + * TODO:目前Activity和子Fragment都实现该接口,感觉有些奇怪,PS:还没熟悉现阶段的房间视图层级关系,后续梳理后整体优化 + **/ +interface RoomView { + fun getLifecycleOwner(): LifecycleOwner + + fun getActivity(): Activity? + + fun getViewFragmentManager(): FragmentManager + + fun getRoomContextLiveData(): LiveData + + /** + * 获取房间上下文 + */ + fun getRoomContext(): RoomContext? + + fun findWidget(name: String): RoomWidget? +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/RoomWidget.kt b/core/src/main/java/com/chwl/core/support/room/RoomWidget.kt new file mode 100644 index 0000000..5fec497 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/RoomWidget.kt @@ -0,0 +1,20 @@ +package com.chwl.core.support.room + +import com.example.lib_utils.log.ILog + +/** + * Created by Max on 2023/10/26 17:12 + * Desc:房间UI组件 + **/ +interface RoomWidget : ILog { + + /** + * 开始(View层) + */ + fun onStart(roomView: RoomView) + + /** + * 结束(View层) + */ + fun onStop() +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomFullLifecycleObserver.kt b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomFullLifecycleObserver.kt new file mode 100644 index 0000000..5f09257 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomFullLifecycleObserver.kt @@ -0,0 +1,34 @@ +package com.chwl.core.support.room.lifecycle + +import com.chwl.core.support.room.RoomContext + + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:房间生命周期事件观察者(完整) + **/ +interface RoomFullLifecycleObserver : RoomLifecycleObserver { + + override fun onStateChanged(context: RoomContext, event: RoomLifecycle.Event) { + when (event) { + RoomLifecycle.Event.START -> { + onStart(context) + } + RoomLifecycle.Event.STOP -> { + onStop(context) + } + } + } + + /** + * 启动房间 + * PS:只会执行一次,相当于Activity的onCreate。 + */ + fun onStart(context: RoomContext) {} + + /** + * 退出房间 + * PS:只会执行一次,相当于Activity的onDestroy。 + */ + fun onStop(context: RoomContext) {} +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycle.kt b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycle.kt new file mode 100644 index 0000000..f11afe3 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycle.kt @@ -0,0 +1,35 @@ +package com.chwl.core.support.room.lifecycle + +import com.example.lib_utils.ICleared + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:房间生命周期 + **/ +abstract class RoomLifecycle : ICleared { + + /** + * 添加生命周期监听 + * PS:目前是及时事件分发,对于已发生状态事件不会补充分发。 + */ + abstract fun addObserver(observer: RoomLifecycleObserver) + + /** + * 移除生命周期监听 + */ + abstract fun removeObserver(observer: RoomLifecycleObserver) + + enum class Event { + /** + * 启动房间 + * PS:只会执行一次,相当于Activity的onCreate。 + */ + START, + + /** + * 退出房间 + * PS:只会执行一次,相当于Activity的onDestroy。 + */ + STOP; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleObserver.kt b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleObserver.kt new file mode 100644 index 0000000..317bde1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleObserver.kt @@ -0,0 +1,18 @@ +package com.chwl.core.support.room.lifecycle + +import com.chwl.core.support.room.RoomContext + + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:房间生命周期事件观察者 + **/ +interface RoomLifecycleObserver { + + /** + * 状态改变 + * @param event 新事件 + */ + fun onStateChanged(context: RoomContext, event: RoomLifecycle.Event) + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleOwner.kt b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleOwner.kt new file mode 100644 index 0000000..1aa56b8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleOwner.kt @@ -0,0 +1,9 @@ +package com.chwl.core.support.room.lifecycle + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:房间生命周期持有者 + **/ +interface RoomLifecycleOwner { + fun getLifecycle(): RoomLifecycle +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleRegistry.kt b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleRegistry.kt new file mode 100644 index 0000000..f12369f --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/lifecycle/RoomLifecycleRegistry.kt @@ -0,0 +1,62 @@ +package com.chwl.core.support.room.lifecycle + +import com.example.lib_utils.log.ILog +import com.chwl.core.support.room.RoomContext +import java.util.concurrent.CopyOnWriteArrayList + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:房间生命周期简单实现 + * PS:目前是及时事件分发,对于已发生状态事件不会补充分发。 + **/ +class RoomLifecycleRegistry : RoomLifecycle(), ILog { + /** + * 生命周期监听 + */ + private val observers: CopyOnWriteArrayList = CopyOnWriteArrayList() + + /** + * 当前事件 + */ + private var event: Event? = null + + override fun addObserver(observer: RoomLifecycleObserver) { + observers.add(observer) + } + + override fun removeObserver(observer: RoomLifecycleObserver) { + observers.remove(observer) + } + + /** + * 设置最新的事件 + */ + fun handleLifecycleEvent(context: RoomContext, event: Event) { + logI("handleLifecycleEvent() event:$event", filePrinter = true) + if (this.event == Event.STOP) { + // 停止状态 + logI("handleLifecycleEvent() 停止状态", filePrinter = true) + return + } + if (this.event == event) { + // 状态未改变 + return + } + dispatchEvent(context, event) + } + + /** + * 分发事件 + */ + private fun dispatchEvent(context: RoomContext, event: Event) { + logI("dispatchEvent() event:$event", filePrinter = true) + this.event = event + observers.forEach { + it.onStateChanged(context, event) + } + if (event == Event.STOP) { + // 停止后,主动清空下 + observers.clear() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/support/room/lifecycle/rx/RoomRxLifecycleEvent.java b/core/src/main/java/com/chwl/core/support/room/lifecycle/rx/RoomRxLifecycleEvent.java new file mode 100644 index 0000000..2c42851 --- /dev/null +++ b/core/src/main/java/com/chwl/core/support/room/lifecycle/rx/RoomRxLifecycleEvent.java @@ -0,0 +1,11 @@ +package com.chwl.core.support.room.lifecycle.rx; + + +/** + * Created by Max on 2023/10/26 11:50 + * Desc:RxLifecycle 房间生命周期 + **/ +public enum RoomRxLifecycleEvent { + START, + STOP +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/team/bean/RespTeamMemberInfo.java b/core/src/main/java/com/chwl/core/team/bean/RespTeamMemberInfo.java new file mode 100644 index 0000000..30c4e45 --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/bean/RespTeamMemberInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.team.bean; + +import java.util.List; + +import lombok.Data; + +/** + * Created by MadisonRong on 19/07/2018. + */ +@Data +public class RespTeamMemberInfo { + + private List memberList; + private int count; +} diff --git a/core/src/main/java/com/chwl/core/team/bean/TeamEvent.java b/core/src/main/java/com/chwl/core/team/bean/TeamEvent.java new file mode 100644 index 0000000..f2144c5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/bean/TeamEvent.java @@ -0,0 +1,31 @@ +package com.chwl.core.team.bean; + +import lombok.Data; + +/** + * Created by MadisonRong on 27/06/2018. + */ +@Data +public class TeamEvent { + + public static final int OP_DELETE_TEAM = 1; + public static final int OP_QUIT_TEAM = 2; + public static final int OP_UPDATE_MSG = 3; + + private int operation; + private String msgUuid; + + public int getOperation() { + return operation; + } + + public TeamEvent setOperation(int operation) { + this.operation = operation; + return this; + } + + public TeamEvent setMsgUuid(String msgUuid) { + this.msgUuid = msgUuid; + return this; + } +} diff --git a/core/src/main/java/com/chwl/core/team/bean/TeamInfo.java b/core/src/main/java/com/chwl/core/team/bean/TeamInfo.java new file mode 100644 index 0000000..1acfa1c --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/bean/TeamInfo.java @@ -0,0 +1,36 @@ +package com.chwl.core.team.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * @author jack + * @Description + * @Date 2018/6/5 + */ +@Data +public class TeamInfo implements Serializable { + private String id;// + private String tid;// 云信群组id + private String name;// 群聊名称 + private String uid;// 群主uid + private String familyId;// 家族id + private String icon;// 群聊图标 + private String description;// 群聊描述 + private int managerCount;// 管理员数量 + private int disabledCount;// 禁言数量 + private int memberCount;// 成员数量 + private String createTime;// 创建时间 + private String updateTime;// 更新时间 + private long familyAccount;// 家族金豆 + private boolean isExists;// 是否在该群聊 + private boolean isVerify;// 是否需要验证 + private double totalAmount; // 群统计总流水值 + + private String memberUid;// 用户成员uid + private int role;// 该成员在群聊的角色(1:群主 2:管理员 3:普通成员) + private boolean isPromt;// 消息免打扰 true:开启免打扰 , false:关闭免打扰 + private boolean isDisplayAccount;//是否显示家族金豆 + +} diff --git a/core/src/main/java/com/chwl/core/team/bean/TeamMemberInfo.java b/core/src/main/java/com/chwl/core/team/bean/TeamMemberInfo.java new file mode 100644 index 0000000..4834e39 --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/bean/TeamMemberInfo.java @@ -0,0 +1,72 @@ +package com.chwl.core.team.bean; + +import com.chwl.core.R; +import com.chwl.core.level.UserLevelVo; +import com.chwl.library.utils.ResUtil; + +import lombok.Data; + +/** + * Created by MadisonRong on 30/05/2018. + */ +@Data +public class TeamMemberInfo { + + /** + * 群主 + */ + public static final int ROLE_TEAM_OWNER = 1; + + /** + * 管理员 + */ + public static final int ROLE_TEAM_MANAGER = 2; + + /** + * 普通成员 + */ + public static final int ROLE_TEAM_MEMBER = 3; + + private String id; + + private long uid; + //耳伴号 + private long erbanNo; + // 昵称 + private String nick; + //头像 + private String avatar; + // 云信 account + private String account; + // 群昵称 + private String teamNick; + + private String familyId;//家族id + + private String chatId;//群聊id + + private String tid;//云信群组id + private int role;//群聊成员角色(1:群主 2:管理员 3:普通成员) + private boolean isPromt;//是否消息提醒 + private boolean isDisable;// 是否禁言 + private String createTime;// 加入时间 + /** + * 等级信息 + */ + private UserLevelVo userLevelVo; + + public static String getTeamMemberRoleName(int role) { + switch (role) { + case ROLE_TEAM_OWNER: + return ResUtil.getString(R.string.team_bean_teammemberinfo_01); + + case ROLE_TEAM_MANAGER: + return ResUtil.getString(R.string.team_bean_teammemberinfo_02); + + default: + case ROLE_TEAM_MEMBER: + return ResUtil.getString(R.string.team_bean_teammemberinfo_03); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/team/bean/TeamTransactionInfo.java b/core/src/main/java/com/chwl/core/team/bean/TeamTransactionInfo.java new file mode 100644 index 0000000..bdf542c --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/bean/TeamTransactionInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.team.bean; + +import java.util.List; + +import lombok.Data; + +/** + * Created by MadisonRong on 20/07/2018. + */ +@Data +public class TeamTransactionInfo { + + private int count; + private double totalAmount; + private double weekAmount; + private List weekRecords; +} diff --git a/core/src/main/java/com/chwl/core/team/bean/TeamTransactionRecordInfo.java b/core/src/main/java/com/chwl/core/team/bean/TeamTransactionRecordInfo.java new file mode 100644 index 0000000..13b0b48 --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/bean/TeamTransactionRecordInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.team.bean; + +import lombok.Data; + +/** + * Created by MadisonRong on 20/07/2018. + */ +@Data +public class TeamTransactionRecordInfo { + + private long uid; + private String nick; + private String avatar; + private double amount; + private long time; + private String source; +} diff --git a/core/src/main/java/com/chwl/core/team/model/ITeamModel.java b/core/src/main/java/com/chwl/core/team/model/ITeamModel.java new file mode 100644 index 0000000..0b86998 --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/model/ITeamModel.java @@ -0,0 +1,246 @@ +package com.chwl.core.team.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; +import com.chwl.core.luckymoney.bean.LuckyMoneyRecordsInfo; +import com.chwl.core.team.bean.RespTeamMemberInfo; +import com.chwl.core.team.bean.TeamInfo; +import com.chwl.core.team.bean.TeamMemberInfo; +import com.chwl.core.team.bean.TeamTransactionInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface ITeamModel extends IModel { + + TeamInfo getTeamInfoCache(String tid); + + void setTeamInfoCache(String tid, TeamInfo teamInfo); + + TeamInfo getCurrentTeamInfo(); + + void setCurrentTeamInfo(TeamInfo currentTeamInfo); + + /** + * 分页获取群组成员列表 + * + * @param chatId 群聊 ID + * @param page 页码 + * @return + */ + Single getTeamMemberList(String chatId, String page); + + /** + * 创建群组 + * + * @param familyId 家族 ID + * @param uid 创建者的用户 UID + * @param icon 群头像(七牛的 url) + * @param name 群组名称 + * @param isVerify 是否开启身份验证 + * @param members 群组成员 + * @return + */ + Single createTeam(String familyId, String uid, String icon, + String name, boolean isVerify, String[] members); + + /** + * 群主(族长)删除本群组 + * + * @param chatId 群组 ID + * @param uid 群主 UID + * @return + */ + Single deleteTeam(String chatId, String uid); + + /** + * 管理员或者普通成员退出群组 + * + * @param chatId 群组 ID + * @return + */ + Single quiteTeam(String chatId); + + /** + * 清空群组的聊天记录(本地的) + * + * @param tid 云信群组 ID + */ + void clearChattingHistory(String tid); + + /** + * 通过耳伴号搜索群聊成员 + * + * @param chatId 群组 ID + * @param erbanNo 耳伴号 + * @param page 页码 + * @return + */ + Single> queryErbanNo(String chatId, String erbanNo, int page); + + /** + * 添加成员到群组里 + * + * @param chatId 群组 ID + * @param targetUids 目标用户(被操作者) UID 数组 + * @return + */ + Single addMemberToTeam(String chatId, String[] targetUids); + + /** + * 设置群组消息提示方式(是否开启消息免打扰) + * + * @param chatId 群组 ID + * @param uid 用户 UID + * @param wannaMute 是否要开启消息免打扰 + * @return + */ + Single muteNotification(String chatId, String uid, Boolean wannaMute); + + /** + * 查询用户已加入的群组列表 + * + * @return + */ + Single> queryJoin(); + + /** + * 更新群资料(更新群头像) + * + * @param chatId 群组 ID + * @param icon 群头像 URL + * @return + */ + Single updateTeamIcon(String chatId, String icon); + + /** + * 更新群资料(更新群名称) + * + * @param chatId 群组 ID + * @param name 群名称 + * @return + */ + Single updateTeamName(String chatId, String name); + + /** + * 更新群资料(更新入群验证方式) + * + * @param chatId 群组 ID + * @param isVerify 群组是否加入身份验证 + * @return + */ + Single updateTeamJoinAuthMethod(String chatId, Boolean isVerify); + + /** + * 获取群资料 + * + * @param sessionId 云信群组 ID + * @return + */ + Single getTeamInfo(String sessionId); + + /** + * 禁言/解禁 群组成员 + * + * @param chatId 群组 ID + * @param targetUid 目标用户(被操作者) UID + * @param wannaMute 是否禁言 + * @return + */ + Single muteTeamMember(String chatId, String targetUid, Boolean wannaMute); + + /** + * 设置/取消设置 群组管理员 + * + * @param chatId 群组 ID + * @param targetUid 目标用户(被操作者) UID + * @param wannaSetManager 是否设置管理员;true 为设置,false 为取消设置 + * @return + */ + Single setTeamManager(String chatId, String targetUid, boolean wannaSetManager); + + /** + * 踢出群组成员 + * + * @param chatId 群组 ID + * @param targetUid 目标用户(被操作者) UID + * @return + */ + Single kickOutTeamMember(String chatId, String targetUid); + + /** + * 统计群组人数 + * + * @param chatId 群组 ID + * @return + */ + Single getTeamMemberCount(String chatId); + + /** + * 查询群统计(群组内一周的交易记录) + * @param chatId 群组 ID + * @param page 页码 + * @return + */ + Single queryTeamTransactionRecords(String chatId, int page); + + /** + * 搜索群统计(群组内一周的交易记录) + * @param chatId 群组 ID + * @param page 页码 + * @return + */ + Single searchTeamTransactionRecords(String chatId, String erbanNo, int page); + + /** + * 群组内发红包 + * + * @param tid 云信群组 ID + * @param amount 红包金额 + * @param count 红包可领取个数 + * @return + */ + Single sendLuckyMoney(String tid, double amount, int count, String message); + + /** + * 群组内收红包 + * + * @param luckyMoneyId 红包 ID + * @return + */ + Single> receiveLuckyMoney(String luckyMoneyId); + + /** + * 群组内查看红包的领取情况 + * + * @param luckyMoneyId 红包 ID + * @return + */ + Single receiveLuckyMoneyRecords(String luckyMoneyId); + +} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/java/com/chwl/core/team/model/TeamModel.java b/core/src/main/java/com/chwl/core/team/model/TeamModel.java new file mode 100644 index 0000000..b0c36d1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/team/model/TeamModel.java @@ -0,0 +1,950 @@ +package com.chwl.core.team.model; + +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.family.model.FamilyModel; +import com.chwl.core.luckymoney.bean.LuckyMoneyInfo; +import com.chwl.core.luckymoney.bean.LuckyMoneyRecordsInfo; +import com.chwl.core.team.bean.RespTeamMemberInfo; +import com.chwl.core.team.bean.TeamInfo; +import com.chwl.core.team.bean.TeamMemberInfo; +import com.chwl.core.team.bean.TeamTransactionInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * @author jack + * @Description + * @Date 2018/6/5 + */ + +public class TeamModel extends BaseModel implements ITeamModel { + private final Api api = RxNet.create(Api.class); + private volatile Map teamInfoMapCache = new Hashtable<>(); + private volatile TeamInfo currentTeamInfo; + + public static ITeamModel get() { + return TeamModelHolder.instance; + } + + private static class TeamModelHolder { + private static TeamModel instance = new TeamModel(); + } + + private TeamModel() { + } + + @Override + public TeamInfo getTeamInfoCache(String tid) { + return teamInfoMapCache.get(tid); + } + + @Override + public void setTeamInfoCache(String tid, TeamInfo teamInfo) { + teamInfoMapCache.put(tid, teamInfo); + } + + @Override + public TeamInfo getCurrentTeamInfo() { + return currentTeamInfo; + } + + @Override + public void setCurrentTeamInfo(TeamInfo currentTeamInfo) { + this.currentTeamInfo = currentTeamInfo; + } + + + + /** + * 分页获取群组成员列表 + * + * @param chatId 群聊 ID + * @param page 页码 + * @return + */ + @Override + public Single getTeamMemberList(String chatId, String page) { + return api.queryGroupMember(chatId, page, "10") + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 创建群组 + * + * @param familyId 家族 ID + * @param uid 创建者的用户 UID + * @param icon 群头像(七牛的 url) + * @param name 群组名称 + * @param isVerify 是否开启身份验证 + * @param members 群组成员 + * @return + */ + @Override + public Single createTeam(String familyId, String uid, String icon, String name, boolean isVerify, + String[] members) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < members.length; i++) { + sb.append(members[i]); + if (i < (members.length - 1)){ + sb.append(","); + } + } + + return api.createGroup(familyId, uid, icon, name, isVerify, sb.toString()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_01)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 群主(族长)删除本群组 + * + * @param chatId 群组 ID + * @param uid 群主 UID + * @return + */ + @Override + public Single deleteTeam(String chatId, String uid) { + return api.removeGroup(chatId, uid) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_02)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 管理员或者普通成员退出群组 + * + * @param chatId 群组 ID + * @return + */ + @Override + public Single quiteTeam(String chatId) { + return api.leaveGroup(chatId, String.valueOf(AuthModel.get().getCurrentUid())) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_03)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 清空群组的聊天记录(本地的) + * + * @param tid 云信群组 ID + */ + @Override + public void clearChattingHistory(String tid) { + NIMClient.getService(MsgService.class) + .clearChattingHistory(tid, SessionTypeEnum.Team); + } + + /** + * 通过耳伴号搜索群聊成员 + * + * @param chatId 群组 ID + * @param erbanNo 耳伴号 + * @param page 页码 + * @return + */ + @Override + public Single> queryErbanNo(String chatId, String erbanNo, int page) { + return api.queryGroupMemberByErbanNO(chatId, erbanNo, String.valueOf(page), "10") + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 添加成员到群组里 + * + * @param chatId 群组 ID + * @param targetUids 目标用户(被操作者) UID 数组 + * @return + */ + @Override + public Single addMemberToTeam(String chatId, String[] targetUids) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < targetUids.length ; i++) { + sb.append(targetUids[i]); + if (i < targetUids.length - 1){ + sb.append(","); + } + } + return api.addSingleMemberToGroup(chatId, uid, sb.toString()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_04)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 设置群组消息提示方式(是否开启消息免打扰) + * + * @param chatId 群组 ID + * @param uid 用户 UID + * @param wannaMute 是否要开启消息免打扰 + * @return + */ + @Override + public Single muteNotification(String chatId, String uid, Boolean wannaMute) { + return api.optMessageNotify(chatId, uid, wannaMute) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_05)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 查询用户已加入的群组列表 + * + * @return + */ + @Override + public Single> queryJoin() { + if (FamilyModel.Instance().getMyFamily() == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.team_model_teammodel_06))); + } + String familyId = FamilyModel.Instance().getMyFamily().getFamilyId(); + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.queryJoin(familyId, uid) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新群资料(更新群头像) + * + * @param chatId 群组 ID + * @param icon 群头像 URL + * @return + */ + @Override + public Single updateTeamIcon(String chatId, String icon) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.updateGroupInfo(chatId, uid, icon,null,null) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新群资料(更新群名称) + * + * @param chatId 群组 ID + * @param name 群名称 + * @return + */ + @Override + public Single updateTeamName(String chatId, String name) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.updateGroupInfo(chatId, uid, null, name,null) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 更新群资料(更新入群验证方式) + * + * @param chatId 群组 ID + * @param isVerify 群组是否加入身份验证 + * @return + */ + @Override + public Single updateTeamJoinAuthMethod(String chatId, Boolean isVerify) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.updateGroupInfo(chatId, uid, null,null, isVerify) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 获取群资料 + * + * @param sessionId 云信群组 ID + * @return + */ + @Override + public Single getTeamInfo(String sessionId) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.getGroupInfo(sessionId, uid) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 禁言/解禁 群组成员 + * + * @param chatId 群组 ID + * @param targetUid 目标用户(被操作者) UID + * @param wannaMute 是否禁言 + * @return + */ + @Override + public Single muteTeamMember(String chatId, String targetUid, Boolean wannaMute) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.groupMemberMute(chatId, uid, targetUid, wannaMute) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_07)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 设置/取消设置 群组管理员 + * + * @param chatId 群组 ID + * @param targetUid 目标用户(被操作者) UID + * @param wannaSetManager 是否设置管理员;true 为设置,false 为取消设置 + * @return + */ + @Override + public Single setTeamManager(String chatId, String targetUid, boolean wannaSetManager) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + if (wannaSetManager) { + return api.setManager(chatId, uid, targetUid) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_08)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } else { + return api.cancelManager(chatId, uid, targetUid) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_09)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + } + + /** + * 踢出群组成员 + * + * @param chatId 群组 ID + * @param targetUid 目标用户(被操作者) UID + * @return + */ + @Override + public Single kickOutTeamMember(String chatId, String targetUid) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.groupMemberKickOut(chatId, uid, targetUid) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()){ + return Single.just(ResUtil.getString(R.string.team_model_teammodel_010)); + }else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 统计群组人数 + * + * @param chatId 群组 ID + * @return + */ + @Override + public Single getTeamMemberCount(String chatId) { + return api.groupMemberCount(chatId) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 查询群统计(群组内一周的交易记录) + * @param chatId 群组 ID + * @param page 页码 + * @return + */ + @Override + public Single queryTeamTransactionRecords(String chatId, int page) { + return api.queryTeamTransactionRecords(chatId, null, page, 10) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 搜索群统计(群组内一周的交易记录) + * @param chatId 群组 ID + * @param page 页码 + * @return + */ + @Override + public Single searchTeamTransactionRecords(String chatId, String erbanNo, int page) { + return api.queryTeamTransactionRecords(chatId, erbanNo, page, 10) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 群组内发红包 + * + * @param tid 云信群组 ID + * @param amount 红包金额 + * @param count 红包可领取个数 + * @return + */ + @Override + public Single sendLuckyMoney(String tid, double amount, int count, String message) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.sendLuckyMoney(uid, tid, amount, count, message) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 群组内收红包 + * + * @param luckyMoneyId 红包 ID + * @return + */ + @Override + public Single> receiveLuckyMoney(String luckyMoneyId) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.receiveLuckyMoney(uid, luckyMoneyId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + /** + * 群组内查看红包的领取情况 + * + * @param luckyMoneyId 红包 ID + * @return + */ + @Override + public Single receiveLuckyMoneyRecords(String luckyMoneyId) { + String uid = String.valueOf(AuthModel.get().getCurrentUid()); + return api.receiveLuckyMoneyRecord(uid, luckyMoneyId) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + /***********************************************************************************************/ + + /** + * @param familyId + * @param uid + * @param icon + * @param name + * @param isVerify + * @return + */ + public Single> createGroup(String familyId, + String uid, + String icon, + String name, + boolean isVerify, + String members) { + return api.createGroup( + familyId, + uid, + icon, + name, + isVerify, + members + ) + .compose(new Transformer<>()); + } + + + public Single> removeGroup(String chatId, + String uid) { + return api.removeGroup( + chatId, + uid + ) + .compose(new Transformer<>()); + } + + + public Single> queryGroupMember(String chatId, + String page, + String pageSize) { + return api.queryGroupMember( + chatId, + page, + pageSize + ) + .compose(new Transformer<>()); + } + + public Single> optMessageNotify(String chatId, + String uid, + boolean ope) { + return api.optMessageNotify( + chatId, + uid, + ope + ) + .compose(new Transformer<>()); + } + + + public Single> groupMemberMute(String chatId, + String uid, + String targetUid, + Boolean mute) { + return api.groupMemberMute( + chatId, + uid, + targetUid, + mute + ) + .compose(new Transformer<>()); + } + + + public Single> groupMemberKickOut(String chatId, + String uid, + String targetUid) { + return api.groupMemberKickOut( + chatId, + uid, + targetUid + ) + .compose(new Transformer<>()); + } + + public Single> setManager(String chatId, + String uid, + String targetUid) { + return api.setManager( + chatId, + uid, + targetUid + ) + .compose(new Transformer<>()); + } + + + public Single> cancelManager(String chatId, + String uid, + String targetUid) { + return api.cancelManager( + chatId, + uid, + targetUid + ) + .compose(new Transformer<>()); + } + + public Single> leaveGroup(String chatId, + String uid) { + return api.leaveGroup( + chatId, + uid + ) + .compose(new Transformer<>()); + } + + public Single>> queryFamilyGroups(String familyId, + String uid) { + return api.queryFamilyGroups( + familyId, + uid + ) + .compose(new Transformer<>()); + } + + public Single>> queryGroupMemberByErbanNO(String chatId, + String erbanNo, + String page, + String pageSize) { + return api.queryGroupMemberByErbanNO( + chatId, + erbanNo, + page, + pageSize + ) + .compose(new Transformer<>()); + } + + public Single> groupMemberCount(String chatId) { + return api.groupMemberCount( + chatId + ) + .compose(new Transformer<>()); + } + + public Single> getGroupInfo(String chatId, + String uid) { + return api.getGroupInfo( + chatId, + uid + ) + .compose(new Transformer<>()); + } + + /***********************************************************************************************/ + + private interface Api { + + /** + * 创建群 + * + * @param familyId + * @param uid + * @param icon + * @param name + * @param isVerify + * @return + */ + @POST("/family/group/create") + Single> createGroup(@Query("familyId") String familyId, + @Query("uid") String uid, + @Query("icon") String icon, + @Query("name") String name, + @Query("isVerify") Boolean isVerify, + @Query("members") String members); + + /** + * 解散群 + * + * @param chatId + * @param uid + * @return + */ + @POST("/family/group/remove") + Single> removeGroup(@Query("chatId") String chatId, + @Query("uid") String uid); + + /** + * 新增成员到群组 + * + * @param chatId + * @param uid + * @param targetUids + * @return + */ + @POST("/family/group/member/add") + Single> addSingleMemberToGroup(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("targetUids") String targetUids); + + + /** + * 查询群聊成员列表 + * + * @param chatId + * @param page + * @param pageSize + * @return + */ + @GET("/family/group/member/queryMember") + Single> queryGroupMember(@Query("chatId") String chatId, + @Query("page") String page, + @Query("pageSize") String pageSize); + + + /** + * 打开/关闭群聊消息提醒 + * + * @param chatId + * @param uid + * @param ope + * @return + */ + @POST("/family/group/member/mute") + Single> optMessageNotify(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("ope") Boolean ope);//操作参数false:关闭消息提醒 true:打开消息提醒 + + /** + * 禁言/解禁群聊成员 + * + * @param chatId + * @param uid + * @param targetUid + * @param mute + * @return + */ + @POST("/family/group/member/disable") + Single> groupMemberMute(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("targetUid") String targetUid, + @Query("mute") Boolean mute); + + + /** + * 踢出群聊成员 + * + * @param chatId + * @param uid + * @param targetUid + * @return + */ + @POST("/family/group/member/kick") + Single> groupMemberKickOut(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("targetUid") String targetUid); + + /** + * 设置群聊管理员 + * + * @param chatId + * @param uid + * @param targetUid + * @return + */ + @POST("/family/group/member/setManager") + Single> setManager(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("targetUid") String targetUid); + + /** + * 取消群聊管理员 + * + * @param chatId + * @param uid + * @param targetUid + * @return + */ + @POST("/family/group/member/unManager") + Single> cancelManager(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("targetUid") String targetUid); + + /** + * 离开群聊 + * + * @param chatId + * @param uid + * @return + */ + @POST("/family/group/member/leave") + Single> leaveGroup(@Query("chatId") String chatId, + @Query("uid") String uid); + + + /** + * 获取家族的所有群聊 + * + * @param familyId + * @param uid + * @return + */ + @GET("/family/group/query") + Single>> queryFamilyGroups(@Query("familyId") String familyId, + @Query("uid") String uid); + + + /** + * 通过耳伴号或者用户名搜索群聊成员 + * + * @param chatId + * @param key 耳伴号或者用户名 + * @param page + * @param pageSize + * @return + */ + @GET("/family/group/member/queryByErbanNo") + Single>> queryGroupMemberByErbanNO(@Query("chatId") String chatId, + @Query("key") String key, + @Query("page") String page, + @Query("pageSize") String pageSize); + + /** + * 修改群资料 + * @param chatId + * @param uid + * @param icon + * @param name + * @param isVerify + * @return + */ + @POST("/family/group/update") + Single> updateGroupInfo(@Query("chatId") String chatId, + @Query("uid") String uid, + @Query("icon") String icon, + @Query("name") String name, + @Query("isVerify") Boolean isVerify); + + + /** + * 统计群聊人数 + * + * @param chatId + * @return + */ + @POST("/family/group/member/count") + Single> groupMemberCount(@Query("chatId") String chatId); + + + /** + * 获取群聊资料详情 + * + * @param chatId + * @param uid + * @return + */ + @GET("/family/group/get") + Single> getGroupInfo(@Query("tid") String chatId, + @Query("uid") String uid); + + /** + * 查询已加入的群聊列表 + * + * @param familyId 家族 id + * @param uid 用户 UID + * @return + */ + @GET("/family/group/queryJoin") + Single>> queryJoin(@Query("familyId") String familyId, + @Query("uid") String uid); + + /** + * 查询群统计(群组内一周的交易记录) + * @param chatId 群组 ID + * @param erbanNo 耳伴号 + * @param page + * @param pageSize + * @return + */ + @GET("/family/group/money/record/week") + Single> queryTeamTransactionRecords(@Query("groupId") String chatId, + @Query("erbanNo") String erbanNo, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 发红包 + * + * @param uid 用户 UID + * @param tid 群组 ID + * @param amount 红包金额 + * @param count 红包可领人数 + * @return + */ + @POST("/family/red_packet/dispatch") + Single> sendLuckyMoney(@Query("uid") String uid, + @Query("tid") String tid, + @Query("amount") double amount, + @Query("count") int count, + @Query("message") String message); + + /** + * 领红包 + * + * @param uid 用户 UID + * @param luckyMoneyId 红包 ID + * @return + */ + @POST("/family/red_packet/claim") + Single> receiveLuckyMoney(@Query("uid") String uid, + @Query("redPacketId") String luckyMoneyId); + + /** + * 查看红包领取记录 + * + * @param uid 用户 UID + * @param luckyMoneyId 红包 ID + * @return + */ + @GET("/family/red_packet/record") + Single> receiveLuckyMoneyRecord(@Query("uid") String uid, + @Query("redPacketId") String luckyMoneyId); + } + +} diff --git a/core/src/main/java/com/chwl/core/treasurefairy/TreasureFairyModel.kt b/core/src/main/java/com/chwl/core/treasurefairy/TreasureFairyModel.kt new file mode 100644 index 0000000..da23606 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/TreasureFairyModel.kt @@ -0,0 +1,328 @@ +package com.chwl.core.treasurefairy + +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.gift.bean.SimpleUserInfo +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.core.treasurefairy.bean.FairyInfo.Companion.LEVEL_HIGH +import com.chwl.core.treasurefairy.bean.FairyInfo.Companion.LEVEL_LOW +import com.chwl.core.treasurefairy.bean.FairyInfo.Companion.LEVEL_MIDDLE +import com.chwl.core.treasurefairy.bean.DrawInfo +import com.chwl.core.treasurefairy.bean.ExchangeGiftInfo +import com.chwl.core.treasurefairy.bean.FairyInfo +import com.chwl.core.treasurefairy.bean.FairyResolveParam +import com.chwl.core.treasurefairy.bean.FairyTestParam +import com.chwl.core.treasurefairy.bean.ForestInfo +import com.chwl.core.treasurefairy.bean.MyFairyInfo +import com.chwl.core.treasurefairy.bean.PrizeInfo +import com.chwl.core.treasurefairy.bean.ResolveInfo +import com.chwl.core.treasurefairy.bean.SendFairyInfo +import com.chwl.core.treasurefairy.bean.TestFairyRecordInfo +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.* + +object TreasureFairyModel { + + private val api = RxNet.create(Api::class.java) + + suspend fun drawTreasureFairy(drawNum: Int): List? = launchRequest { + api.drawTreasureFairy(drawNum, AvRoomDataManager.get().roomUid) + } + + suspend fun getDrawInfo(): DrawInfo? = launchRequest { + api.getDrawInfo() + } + + suspend fun getPrizeInfoList(): List? = launchRequest { + api.getPrizeInfoList() + } + + suspend fun drawForestFairy(drawNum: Int, poolLevel: Int): List? = launchRequest { + api.drawForestFairy(drawNum, poolLevel) + } + + suspend fun getForestRecord( + page: Int, + pageSize: Int + ): List? = launchRequest { + api.getForestRecord(page, pageSize) + } + + suspend fun getForestPrizePool(poolLevel: Int): List? = launchRequest { + api.getForestPrizePool(poolLevel) + } + + suspend fun getForestInfo(): ForestInfo? = launchRequest { + api.getForestInfo() + } + + suspend fun getMyFairyInfo(): MyFairyInfo? { + val data = launchRequest { + api.getMyFairyInfo() + } + + data?.lowElves?.forEach { + it.level = LEVEL_LOW + } + data?.middleElves?.forEach { + it.level = LEVEL_MIDDLE + } + data?.highElves?.forEach { + it.level = LEVEL_HIGH + } + + return data + } + + suspend fun getFriendsList(nick: String?): List? = launchRequest { + api.getFriendsList(nick) + } + + suspend fun askForFairy(elfId: Long, targetUid: Long): String? = launchRequest { + api.askForFairy(elfId, targetUid) + } + + suspend fun sendFairy(elfId: Long, targetUid: Long): String? = launchRequest { + api.sendFairy(elfId, targetUid) + } + + suspend fun getSendFairyList( + page: Int, + pageSize: Int + ): List? = launchRequest { + api.getSendFairyList(page, pageSize) + } + + suspend fun testFairy(fairyTestParam: FairyTestParam): FairyInfo? = launchRequest { + api.testFairy(fairyTestParam) + } + + suspend fun resolveFairy(resolveParam: FairyResolveParam): List? = launchRequest { + api.resolveFairy(resolveParam) + } + + suspend fun getTestFairyRecordList( + page: Int, + pageSize: Int + ): List? = launchRequest { + api.getTestFairyRecordList(page, pageSize) + } + + suspend fun getExchangeGiftInfoList(): List? = launchRequest { + api.getExchangeGiftInfoList() + } + + suspend fun exchangeGift(itemId: Long): ExchangeGiftInfo? = launchRequest { + api.exchangeGift(itemId, AvRoomDataManager.get().roomUid) + } + + suspend fun getDebrisExchangeList(): List? = launchRequest { + api.getDebrisExchangeList() + } + + suspend fun getFairyCallList(): List? = launchRequest { + api.getFairyCallList() + } + + suspend fun getExchangeRecord( + convertType: Int, + page: Int, + pageSize: Int + ): List? = launchRequest { + api.getExchangeRecord(convertType, page, pageSize) + } + + suspend fun buyDebris(num: Int, uid: String): String? = launchRequest { + api.buyDebris(num, uid) + } + + private interface Api { + + /** + * 夺宝 + * + * @param drawNum + * @return + */ + @FormUrlEncoded + @POST("act/seize-treasure/draw") + suspend fun drawTreasureFairy( + @Field("drawNum") drawNum: Int, + @Field("roomUid") roomUid: Long + ): ServiceResult> + + @GET("act/seize-treasure/user/draw/info") + suspend fun getDrawInfo(): ServiceResult + + /** + * 奖池列表 + * + */ + @GET("act/seize-treasure/draw/pool/list") + suspend fun getPrizeInfoList(): ServiceResult> + + /** + * 猛犸森林抽奖 + * + */ + @FormUrlEncoded + @POST("act/seize-treasure/forest/draw") + suspend fun drawForestFairy( + @Field("drawNum") drawNum: Int, + @Field("poolLevel") poolLevel: Int + ): ServiceResult> + + /** + * 猛犸森林抽奖记录 + * + */ + @GET("act/seize-treasure/forest/draw/record") + suspend fun getForestRecord( + @Query("page") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * + * 猛犸森林奖池配置列表 + * + */ + @GET("act/seize-treasure/draw/forest/item") + suspend fun getForestPrizePool(@Query("poolLevel") poolLevel: Int): ServiceResult> + + /** + * + * 猛犸森林奖池配置列表 + * + */ + @GET("act/seize-treasure/user/forest/info") + suspend fun getForestInfo(): ServiceResult + + /** + * + * 获取我的精灵信息 + * + */ + @GET("act/seize-treasure/elf/user/info") + suspend fun getMyFairyInfo(): ServiceResult + + /** + * + * 好友列表 + * + */ + @GET("fans/friend/list") + suspend fun getFriendsList(@Query("nick") nick: String?): ServiceResult> + + /** + * 精灵-索要 + * + */ + @FormUrlEncoded + @POST("act/seize-treasure/elf/askFor") + suspend fun askForFairy( + @Field("elfId") elfId: Long, + @Field("targetUid") targetUid: Long + ): ServiceResult + + /** + * 精灵-赠送 + * + */ + @FormUrlEncoded + @POST("act/seize-treasure/elf/send") + suspend fun sendFairy( + @Field("elfId") elfId: Long, + @Field("targetUid") targetUid: Long + ): ServiceResult + + /** + * 精灵-赠予/获赠记录 + * + */ + @GET("act/seize-treasure/elf/record") + suspend fun getSendFairyList( + @Query("page") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 合成礼物 + */ + @POST("act/seize-treasure/elf/compound") + suspend fun testFairy(@Body fairyTestParam: FairyTestParam): ServiceResult + + /** + * 分解礼物 + */ + @POST("act/seize-treasure/elf/salvage") + suspend fun resolveFairy(@Body resolveParam: FairyResolveParam): ServiceResult> + + /** + * 合成礼物记录 + * + */ + @GET("act/seize-treasure/elf/compound/record") + suspend fun getTestFairyRecordList( + @Query("page") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 精灵兑换-礼物列表 + * + */ + @GET("act/seize-treasure/convert/elf/list") + suspend fun getExchangeGiftInfoList(): ServiceResult> + + /** + * 精灵兑换-兑换 + * + */ + @FormUrlEncoded + @POST("act/seize-treasure/convert") + suspend fun exchangeGift( + @Field("itemId") itemId: Long, + @Field("roomUid") roomUid: Long + ): ServiceResult + + + /** + * 兑换-碎片兑换列表 + * + */ + @GET("act/seize-treasure/convert/chip/list") + suspend fun getDebrisExchangeList(): ServiceResult> + + /** + * 兑换-精灵召唤列表 + * + */ + @GET("/act/seize-treasure/convert/elf/list") + suspend fun getFairyCallList(): ServiceResult> + + /** + * 猛犸森林抽奖记录 + * + */ + @GET("act/seize-treasure/convert/record") + suspend fun getExchangeRecord( + @Query("convertType") convertType: Int, + @Query("page") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> + + /** + * 购买精灵碎片 + * + */ + @FormUrlEncoded + @POST("/act/seize-treasure/shard/buy") + suspend fun buyDebris( + @Field("num") num: Int, + @Field("uid") uid: String + ): ServiceResult + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/Compound.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/Compound.kt new file mode 100644 index 0000000..04b0870 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/Compound.kt @@ -0,0 +1,6 @@ +package com.chwl.core.treasurefairy.bean + +data class Compound( + val elfId: Long, + val elfNum: Int +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/DrawInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/DrawInfo.kt new file mode 100644 index 0000000..825cdc1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/DrawInfo.kt @@ -0,0 +1,7 @@ +package com.chwl.core.treasurefairy.bean + +data class DrawInfo( + var drawTicketNum: Int = 0, + val luckyNum: Int = 0, + val needLuckyNum: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/ExchangeGiftInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/ExchangeGiftInfo.kt new file mode 100644 index 0000000..874bbf6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/ExchangeGiftInfo.kt @@ -0,0 +1,35 @@ +package com.chwl.core.treasurefairy.bean + +data class ExchangeGiftInfo( + val expendNum: Int = 0, + val itemId: Long = 0, + val level: Int = 0, + val rewardId: Int = 0, + val rewardName: String = "", + val rewardNum: Int = 0, + val rewardPicUrl: String = "", + val rewardShowValue: String = "", + val rewardUnit: String = "", + val rewardType: String = "", + val type: Int = 0, + val createTime: Long = 0, + val convertLevel: Int = 0, + val propItems: List ?= null +) { + + fun getPrizeName(): String { + return if (rewardType == "gift") { + "${rewardName}(${rewardShowValue}鉆)" + } else { + "${rewardName}(${rewardNum}${rewardUnit})" + } + } + + fun getPrizeUnit(): String { + return if (rewardType == "gift") { + "${rewardShowValue}鉆" + } else { + "${rewardNum}${rewardUnit}" + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyInfo.kt new file mode 100644 index 0000000..94afd03 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyInfo.kt @@ -0,0 +1,25 @@ +package com.chwl.core.treasurefairy.bean + +import java.io.Serializable + +data class FairyInfo( + val elfId: Long = 0, + val elfNum: Int = 0, + val elfLevel: Int = 0, + val elfName: String = "", + val elfPicUrl: String = "", + var selectedNum: Int +) : Serializable { + + /** + * 精灵等级, 对应 lowElves= 0, middleElves = 1, highElves = 2 + * 服务端未添加区分精灵等级字段. 本地根据数组遍历赋值 + */ + var level: Int = LEVEL_LOW + + companion object { + const val LEVEL_LOW = 0 + const val LEVEL_MIDDLE = 1 + const val LEVEL_HIGH = 2 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyMsgInfoBean.java b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyMsgInfoBean.java new file mode 100644 index 0000000..9edf28c --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyMsgInfoBean.java @@ -0,0 +1,16 @@ +package com.chwl.core.treasurefairy.bean; + +import lombok.Data; + +@Data +public class FairyMsgInfoBean { + private long uid; + private String nick; + private long roomUid;//房间uid + private String rewardType;//奖励类型 + private String rewardName;//奖励名称 + private int rewardLevel;//奖励等级 + private int rewardNum;//奖励数量 + private int userLevelLimit;//限制等级 + private int rewardShowValue;//展示价值 +} diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyResolveParam.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyResolveParam.kt new file mode 100644 index 0000000..364df07 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyResolveParam.kt @@ -0,0 +1,5 @@ +package com.chwl.core.treasurefairy.bean + +data class FairyResolveParam( + val expendList: MutableList = arrayListOf() +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyTestParam.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyTestParam.kt new file mode 100644 index 0000000..457752b --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/FairyTestParam.kt @@ -0,0 +1,6 @@ +package com.chwl.core.treasurefairy.bean + +data class FairyTestParam( + val expendList: MutableList = arrayListOf(), + var level: Int = 0, +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/ForestInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/ForestInfo.kt new file mode 100644 index 0000000..16edbb4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/ForestInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.treasurefairy.bean + +data class ForestInfo( + val avatar: String = "", + val erbanNo: Int = 0, + val highBallNum: String = "0", + val lowBallNum: String = "0", + val middleBallNum: String = "0", + val nick: String = "", + val uid: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/MyFairyInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/MyFairyInfo.kt new file mode 100644 index 0000000..1d108d4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/MyFairyInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.treasurefairy.bean + +data class MyFairyInfo( + val highElves: ArrayList? = null, + val middleElves: ArrayList? = null, + val lowElves: ArrayList? = null, + val avatar: String = "", + val nick: String = "", + val chipNum: Int +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/PrizeInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/PrizeInfo.kt new file mode 100644 index 0000000..ff709e4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/PrizeInfo.kt @@ -0,0 +1,16 @@ +package com.chwl.core.treasurefairy.bean + +data class PrizeInfo( + val rewardId: Int = 0, + val rewardName: String = "", + val rewardNum: Int = 0, + val rewardOrder: Int = 0, + val rewardLevel: Int = 0, + val rewardPicUrl: String = "", + val rewardType: String = "", + val rewardUnit: String = "", + val drawTime: Long = 0, + val poolLevel: Int = 0, + val propType: Int? = null, + val itemIndex:Int = 0, +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/PropItemInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/PropItemInfo.kt new file mode 100644 index 0000000..97012bf --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/PropItemInfo.kt @@ -0,0 +1,8 @@ +package com.chwl.core.treasurefairy.bean + +data class PropItemInfo( + val picUrl: String = "", + val propId: Int = 0, + val propName: String = "", + val propNum: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/ResolveInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/ResolveInfo.kt new file mode 100644 index 0000000..0e53b79 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/ResolveInfo.kt @@ -0,0 +1,8 @@ +package com.chwl.core.treasurefairy.bean + +import java.io.Serializable + +data class ResolveInfo( + val elfLevel: Int = 0, + val pieceNum: Int = 0 +) : Serializable \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/SendFairyInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/SendFairyInfo.kt new file mode 100644 index 0000000..2e4e51f --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/SendFairyInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.treasurefairy.bean + +data class SendFairyInfo( + val createTime: Long = 0, + val elfId: Long = 0, + val elfName: String = "", + val elfPicUrl: String = "", + val recordId: Int = 0, + val targetAvatar: String = "", + val targetNick: String = "", + val targetUid: Long = 0, + val type: Int = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/treasurefairy/bean/TestFairyRecordInfo.kt b/core/src/main/java/com/chwl/core/treasurefairy/bean/TestFairyRecordInfo.kt new file mode 100644 index 0000000..90c0e86 --- /dev/null +++ b/core/src/main/java/com/chwl/core/treasurefairy/bean/TestFairyRecordInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.treasurefairy.bean + +data class TestFairyRecordInfo( + val compoundLevel: Int = 0, + val createTime: Long = 0, + val elfLevel: Int = 0, + val elfName: String = "", + val expendList: List = listOf(), + val recordId: Long = 0, + val type: Int = 0 +) diff --git a/core/src/main/java/com/chwl/core/user/AttentionModel.java b/core/src/main/java/com/chwl/core/user/AttentionModel.java new file mode 100644 index 0000000..8a738bf --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/AttentionModel.java @@ -0,0 +1,95 @@ +package com.chwl.core.user; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.result.AttentionListResult; +import com.chwl.core.bean.response.result.FansListResult; +import com.chwl.core.user.bean.AttentionInfo; +import com.chwl.core.user.bean.FansListInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * Created by Administrator on 2017/7/5 0005. + */ + +public class AttentionModel extends BaseModel implements IAttentionModel { + private static final String TAG = "AttentionModel"; + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final AttentionModel INSTANCE = new AttentionModel(); + } + + public static AttentionModel get() { + return Helper.INSTANCE; + } + + @Override + public Single> getAttentionList(long uid, final int page, int pageSize) { + return api.getAllFans( + String.valueOf(uid), + String.valueOf(pageSize), + String.valueOf(page) + ).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap((Function>>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + }); + + } + + @Override + public Single getFansList(long uid, final int pageCount, int pageSize) { + return api.getFansList( + String.valueOf(uid), + String.valueOf(pageCount), + String.valueOf(pageSize) + ) + .compose(RxHelper.handleBeanData()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + interface Api { + + + /** + * @param uid + * @param pageSize + * @param pageNo + * @return + */ + @GET("/fans/following") + Single getAllFans(@Query("uid") String uid, + @Query("pageSize") String pageSize, + @Query("pageNo") String pageNo); + + /** + * @param uid + * @param pageSize + * @param pageNo + * @return + */ + @GET("/fans/fanslist") + Single getFansList(@Query("uid") String uid, + @Query("pageNo") String pageNo, + @Query("pageSize") String pageSize); + + + } +} diff --git a/core/src/main/java/com/chwl/core/user/IAttentionModel.java b/core/src/main/java/com/chwl/core/user/IAttentionModel.java new file mode 100644 index 0000000..119e781 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/IAttentionModel.java @@ -0,0 +1,33 @@ +package com.chwl.core.user; + +import com.chwl.core.base.IModel; +import com.chwl.core.user.bean.AttentionInfo; +import com.chwl.core.user.bean.FansListInfo; + +import java.util.List; + +import io.reactivex.Single; + +/** + * Created by Administrator on 2017/7/5 0005. + */ + +public interface IAttentionModel extends IModel { + /** + * 获取关注列表 + * @param uid + * @param page + * @param pageSize + * @return + */ + Single> getAttentionList(long uid, int page, int pageSize); + + /** + * 获取粉丝列表 + * @param uid + * @param pageCount + * @param pageSize + */ + Single getFansList(long uid, int pageCount, int pageSize); + +} diff --git a/core/src/main/java/com/chwl/core/user/IUserDynamicModel.java b/core/src/main/java/com/chwl/core/user/IUserDynamicModel.java new file mode 100644 index 0000000..5a50e7e --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/IUserDynamicModel.java @@ -0,0 +1,14 @@ +package com.chwl.core.user; + +import com.chwl.core.base.IModel; +import com.chwl.core.community.bean.WorldDynamicBean; + +import java.util.List; + +import io.reactivex.Single; + +public interface IUserDynamicModel extends IModel { + Single> getMyDynamic(long uid, String types, + int page, int pageSize, + long fromUid); +} diff --git a/core/src/main/java/com/chwl/core/user/IUserModel.java b/core/src/main/java/com/chwl/core/user/IUserModel.java new file mode 100644 index 0000000..5f295dc --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/IUserModel.java @@ -0,0 +1,282 @@ +package com.chwl.core.user; + +import androidx.annotation.Nullable; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.RoomHistoryInfo; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.home.bean.VisitorInfo; +import com.chwl.core.user.bean.DiamondGiveHistoryInfo; +import com.chwl.core.user.bean.GiftAchievementInfo; +import com.chwl.core.user.bean.GiftWallInfo; +import com.chwl.core.user.bean.NewUserInfo; +import com.chwl.core.user.bean.ProtocolInfo; +import com.chwl.core.user.bean.RegionInfoBean; +import com.chwl.core.user.bean.UserDetailInfo; +import com.chwl.core.user.bean.UserGameInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.user.bean.UserLabelInfo; +import com.chwl.core.user.bean.UserMineInfo; +import com.chwl.core.user.bean.UserRandomConfig; + +import java.util.List; + +import io.reactivex.Single; + +/** + * Created by chenran on 2017/3/15. + */ + +public interface IUserModel extends IModel { + + /** + * 信息不全登录,增加了邀请码 + * + * @param userInfo + */ + public Single requestCompleteUserInfo(UserInfo userInfo, String shareChannel, String shareUid, String roomUid, String shareCode, String adid); + + + /** + * 修改个人信息 + * 如果不需修改字段,传空或者"" + */ + public Single requestUpdateUserInfo(UserInfo userInfo); + + /** + * 修改头像 + * 是否付费 + */ + public Single upLoadAvatar(String avatarUrl,boolean needPay); + + /** + * 更新当前用户信息 + * + * @return + */ + Single updateCurrentUserInfo(); + + /** + * 获取某个用户的userInfo + * + * @param userId - + * @return - + */ + Single getUserInfo(final long userId); + + /** + * 根据uid 从服务器获取用户详细信息。 + * 旧的 + * + * @param userId + * @return + */ + Single getUserInfoFromServer(long userId); + + + Single getUserInfoFromServerUpdate(long userId,boolean isRef); + + /** + * 根据uid 从服务器获取用户详细信息。 + * 66新的 + * + * @param userId + * @return + */ + Single getUserInfoDetail(long userId); + Single getUserInfoDetailCache(long userId); + + /** + * 根据 批量 Uid 去我们后台获取用户的具体信息 + * + * @param uidList + * @return + */ + Single> loadUserInfoByUids(List uidList); + + /** + * 获取当前登录的用户信息 + * + * @return + */ + Single getCurrentUserInfo(); + + + /** + * 获取当前缓存的登录用户信息 + * + * @return + */ + @Nullable + UserInfo getCacheLoginUserInfo(); + + + UserDetailInfo getCacheLoginUserDetailInfo(); + + /** + * 仅仅更新登录用户的缓存信息 + */ + void onlyUpdateLoginUserInfoCache(); + + + /** + * 上传照片 + * + * @param url + */ + public Single requestAddPhoto(String url); + + /** + * 删除照片 + * + * @param pid + */ + public Single requestDeletePhoto(long pid); + + /** + * 排序类型,1收到的礼物数量多少排序,2礼物价格高低排序 + * + * @param uid + */ + public Single> requestUserGiftWall(long uid, int giftType, int orderType); + + /** + * 关键词搜索用户 + */ + Single searchUserInfo(String skey, int pageSize, int pageNo); + + + Single>> getNerUserList(int page, int pageSize); + + /** + * 重置支付密码 + * + * @param currentPwd + * @param newPwd + * @return + */ + Single resetPayPwd(String currentPwd, String newPwd); + + /** + * 设置支付密码 + * + * @param newPwd + * @return + */ + Single setPayPwd(String newPwd); + + + /** + * 获取当前用户的邀请码 + */ + Single getShareCode(); + + /** + * 获取101认证标签 + */ + Single> getGameWeek(long uid); + + /** + * 使用或删除101认证标签 + * status 1 删除,2 使用 + */ + Single useOrDelete(long id, int status); + + /** + * 开启或关闭家长模式 + * status 0 关闭,1 开启 + */ + Single openOrClosePatriarchMode(String pwd, int status); + + Single verifyPaymentPassword(String password); + + /** + * 是否是自己 + */ + boolean isMyseft(long targetUid); + + boolean isMyseft(String targetUid); + + String getNick(); + + Single getSimpleUser(String erbanNo); + + /** + * 获取用户拓展字段 + */ + UserInfo.Location getUserExpand(); + + Single> getAchievementList(long targetUid); + + Single> getInRoomRecord(); + + Single deleteInRoomRecord(); + + /** + * 随机头像昵称开关 + */ + Single getRandomConfig(); + + /** + * 随机昵称 + */ + Single getRandomNick(); + + /** + * 随机头像 + */ + Single getRandomAvatar(); + + Single> getGiveUserList(int page, int pageSize); + + @Nullable + String getPreFillInviteCode(); + + Single getProtocolInfo(); + + Single visitUserDetail(long uid); + + Single> getVisitorUserList(int pageNum, int pageSize); + + Single addReport(Long objId, int type); + + /** + * 获取编辑标签 + */ + Single getUserLabelInfo(); + + /** + * 保存标签 + */ + Single saveLabel(String label); + + /** + * 获取地区列表 + */ + Single> getAreaInfo(); + + /** + * 保存地区 + */ + Single saveArea(long area); + + /** + * 保存地区 + */ + Single userCpSettingUpdate(int type,boolean isShow); + + /** + * 获取个人信息未读 + */ + Single getUserMineInfo(); + + boolean isSamePartition(long partitionId); + + long getPartitionId(); + + boolean isArUser(); + boolean isTWUser(); + boolean isEnUser(); + + void refreshApi(); +} diff --git a/core/src/main/java/com/chwl/core/user/UserDynamicModel.java b/core/src/main/java/com/chwl/core/user/UserDynamicModel.java new file mode 100644 index 0000000..bb43dfa --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/UserDynamicModel.java @@ -0,0 +1,48 @@ +package com.chwl.core.user; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class UserDynamicModel implements IUserDynamicModel{ + private Api api; + + public UserDynamicModel() { + api = RxNet.create(Api.class); + } + + @Override + public Single> getMyDynamic(long uid, String types, int page, int pageSize, long fromUid) { + return api.getMyDynamic(uid, types, page, pageSize, fromUid).compose(RxHelper.handleSchAndExce()) + .flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> listServiceResult) throws Exception { + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + } + }); + } + + private interface Api { + + /** + * 获取互动消息 + */ + @POST("dynamic/getMyDynamic") + Single>> getMyDynamic(@Query("uid") long uid, @Query("types") String types, + @Query("page") int page, @Query("pageSize") int pageSize, + @Query("fromUid") long fromUid); + } +} diff --git a/core/src/main/java/com/chwl/core/user/UserInfoUiMgr.java b/core/src/main/java/com/chwl/core/user/UserInfoUiMgr.java new file mode 100644 index 0000000..4481f31 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/UserInfoUiMgr.java @@ -0,0 +1,67 @@ +package com.chwl.core.user; + +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; + +import com.chwl.core.user.bean.UserInfo; + +/** + * 个人主页/客态页用户信息监听 + */ +public class UserInfoUiMgr { + + private static final class Helper { + public static final UserInfoUiMgr INSTANCE = new UserInfoUiMgr(); + } + + public static UserInfoUiMgr get() { + return Helper.INSTANCE; + } + + private UserInfoUiMgr() { + + } + + private MutableLiveData ldUserInfo = new MutableLiveData<>(); + private MutableLiveData ldUid = new MutableLiveData<>(); + + public void setValue(UserInfo userInfo) { + if (userInfo != null) { + ldUserInfo.setValue(userInfo); + } + } + + public UserInfo getValue() { + return ldUserInfo.getValue(); + } + + public void setUid(long uid) { + ldUid.setValue(uid); + } + + public Long getUid() { + return ldUid.getValue(); + } + + public void register(LifecycleOwner owner, Observer observer) { + ldUserInfo.observe(owner, observer); + } + + public void regiter(Observer observer) { + ldUserInfo.observeForever(observer); + } + + public void unregister(Observer observer) { + ldUserInfo.removeObserver(observer); + } + + public void registerUid(LifecycleOwner owner, Observer observer) { + ldUid.observe(owner, observer); + } + + public void unregisterUid(Observer observer) { + ldUid.removeObserver(observer); + } + +} diff --git a/core/src/main/java/com/chwl/core/user/UserModel.java b/core/src/main/java/com/chwl/core/user/UserModel.java new file mode 100644 index 0000000..bd0146b --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/UserModel.java @@ -0,0 +1,1268 @@ +package com.chwl.core.user; + +import android.annotation.SuppressLint; +import android.text.TextUtils; +import android.util.LruCache; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.auth.event.LoginEvent; +import com.chwl.core.auth.event.LogoutEvent; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.RoomHistoryInfo; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.bean.response.result.GiftWallListResult; +import com.chwl.core.bean.response.result.UserListResult; +import com.chwl.core.bean.response.result.UserResult; +import com.chwl.core.home.bean.VisitorInfo; +import com.chwl.core.level.event.CharmLevelUpEvent; +import com.chwl.core.level.event.LevelUpEvent; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.user.bean.DiamondGiveHistoryInfo; +import com.chwl.core.user.bean.GiftAchievementInfo; +import com.chwl.core.user.bean.GiftWallInfo; +import com.chwl.core.user.bean.NewUserInfo; +import com.chwl.core.user.bean.ProtocolInfo; +import com.chwl.core.user.bean.RegionInfoBean; +import com.chwl.core.user.bean.UserDetailInfo; +import com.chwl.core.user.bean.UserGameInfo; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.user.bean.UserLabelInfo; +import com.chwl.core.user.bean.UserMineInfo; +import com.chwl.core.user.bean.UserRandomConfig; +import com.chwl.core.user.event.CurrentUserInfoCompleteEvent; +import com.chwl.core.user.event.CurrentUserInfoCompleteFailEvent; +import com.chwl.core.user.event.LoadLoginUserInfoEvent; +import com.chwl.core.user.event.LoginUserInfoUpdateEvent; +import com.chwl.core.user.event.NeedCompleteInfoEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.common.util.OtherExtKt; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.StringUtils; +import com.chwl.library.utils.codec.DESUtils; +import com.google.gson.JsonElement; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; +import java.util.Objects; +import java.util.regex.Pattern; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by chenran on 2017/3/15. + */ + +public final class UserModel extends BaseModel implements IUserModel { + private static final String TAG = "UserModel"; + + private volatile UserInfo currentUserInfo = null; + private volatile UserDetailInfo UserDetailInfo = null; + private volatile LruCache cache = new LruCache<>(50); + private Api api = RxNet.create(Api.class); + + //用户信息不全的情况下,currentUserInfo并不会被保存,这里单独保存下预填写的邀请码... + private String preFillInviteCode; + + private static final class Helper { + public static final IUserModel INSTANCE = new UserModel(); + } + + @Override + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static IUserModel get() { + return Helper.INSTANCE; + } + + private UserModel() { + super(); + EventBus.getDefault().register(this); + } + + /** + * 登录进来接受事件 + * + * @param event + */ + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoginEvent(LoginEvent event) { + onLogin(AuthModel.get().getCurrentUid()); + } + + /** + * 退出登录接受事件 + * + * @param event + */ + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogoutEvent(LogoutEvent event) { + onLogout(); + } + + + /** + * 用户等级升级从后台刷新一下用户信息 + * + * @param event + */ + @Subscribe(threadMode = ThreadMode.MAIN) + public void onUserLevelUpEvent(LevelUpEvent event) { + updateCurrentUserInfo().subscribe(); + } + + /** + * 用户魅力等级升级从后台刷新一下用户信息 + * + * @param event + */ + @Subscribe(threadMode = ThreadMode.MAIN) + public void onUserCharmLevelUpEvent(CharmLevelUpEvent event) { + updateCurrentUserInfo().subscribe(); + } + + /******************************************************************************************************/ + + /** + * 登录后第一次获取用户信息 + * + * @param uid + */ + @SuppressLint("CheckResult") + private void onLogin(final long uid) { + OtherExtKt.doLog("登陆成功 获取用户信息 UserModel.onLogin()"); + api.requestUserInfo(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()) + .flatMap(userResult -> { + if (userResult == null || !userResult.isSuccess() || userResult.getData() == null) { + if (currentUserInfo == null) { + //首次登录请求用户信息失败,则退出登录 + AuthModel.get().logout().subscribe(); + } + return Single.error(new Throwable("invalid userInfo")); + } + UserInfo userInfo = userResult.getData(); + //用户信息不全的情况下,currentUserInfo并不会被保存,这里单独保存下预填写的邀请码... + preFillInviteCode = userInfo.getPrefillInviteCode(); + if (TextUtils.isEmpty(userInfo.getNick()) || TextUtils.isEmpty(userInfo.getAvatar())) { + //首次注册需要完善昵称和头像 + EventBus.getDefault().post(new NeedCompleteInfoEvent()); + return Single.error(new Throwable("need nick and avatar")); + } + + return Single.just(userResult.getData()); + }) + .subscribe(new Consumer() { + @Override + public void accept(UserInfo userInfo) throws Exception { + OtherExtKt.doLog("登陆成功 获取用户信息 成功 缓存用户信息"); + currentUserInfo = userInfo; + EventBus.getDefault().post(new LoadLoginUserInfoEvent()); + EventBus.getDefault().post(new LoginUserInfoUpdateEvent()); + } + }); + + } + + private void onLogout() { + currentUserInfo = null; + cache.evictAll(); + } + + @Override + public Single getCurrentUserInfo() { + long cUid = AuthModel.get().getCurrentUid(); + if (cUid == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_user_usermodel_01))); + } + if (null != getCacheLoginUserInfo()) { + return Single.just(getCacheLoginUserInfo()); + } + return updateCurrentUserInfo(); + } + + @Nullable + @Override + public UserInfo getCacheLoginUserInfo() { + return currentUserInfo; + } + + @Override + public UserDetailInfo getCacheLoginUserDetailInfo() { + return UserDetailInfo; + } + + @Override + public Single updateCurrentUserInfo() { + long cUid = AuthModel.get().getCurrentUid(); + if (cUid == 0) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_user_usermodel_02))); + } + + return api.requestUserInfo( + String.valueOf(cUid) + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(userInfoServiceResult -> { + UserInfo userInfo = userInfoServiceResult.getData(); + if (null == userInfo) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_03))); + } + //需要完善用户信息,网络不好的时候onLogin之前有可能调用到,所以这里也需要判断 + if (TextUtils.isEmpty(userInfo.getNick()) || TextUtils.isEmpty(userInfo.getAvatar())) { + EventBus.getDefault().post(new NeedCompleteInfoEvent()); + return Single.error(new Throwable("need nick and avatar")); + } + userInfo = NobleUtil.setCompletedNobleInfo(userInfo); + currentUserInfo = userInfo; + cache.put(cUid, userInfo); + return Single.just(userInfo); + }) + .doOnSuccess(userInfo -> { + //发出当前登录用户信息更新事件 + EventBus.getDefault().post(new LoginUserInfoUpdateEvent()); + + }); + + } + + /** + * 仅仅更新登录用户的缓存信息 + */ + @Override + public void onlyUpdateLoginUserInfoCache() { + long cUid = AuthModel.get().getCurrentUid(); + api.requestUserInfo(String.valueOf(cUid)) + .compose(RxHelper.handleCommon()) + .subscribe(info -> { + UserInfo userInfo = NobleUtil.setCompletedNobleInfo(info); + currentUserInfo = userInfo; + cache.put(cUid, userInfo); + }); + } + + /** + * 根据uid 获取用户详细信息。 + * + * @param userId + * @return + */ + @Override + public Single getUserInfo(final long userId) { + if (userId <= 0) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_04))); + } + + if (AuthModel.get().getCurrentUid() == userId) { + return getCurrentUserInfo(); + } + + //缓存用户信息 +// UserInfo tmp = cache.get(userId); +// if (tmp != null) { +// return Single.just(tmp); +// } else { + return getUserInfoFromServer(userId); +// } + + } + + /** + * 根据uid 从服务器获取用户详细信息。 + * + * @param userId + * @return + */ + @Override + public Single getUserInfoFromServer(final long userId) { + if (userId == AuthModel.get().getCurrentUid()) { + return updateCurrentUserInfo(); + } + if (userId == AuthModel.get().getCurrentUid()) { + return getCurrentUserInfo(); + } + return api.requestUserInfo( + String.valueOf(userId) + ) + .compose(RxHelper.handleSchedulers()) + .flatMap(userInfoServiceResult -> { + UserInfo userInfo = userInfoServiceResult.getData(); + if (null == userInfo) { + if (OtherExtKt.isVerify(userInfoServiceResult.getMessage())) { + return Single.error(new Exception(userInfoServiceResult.getMessage())); + } else { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_05))); + } + } + userInfo = NobleUtil.setCompletedNobleInfo(userInfo); + cache.put(userInfo.getUid(), userInfo); + return Single.just(userInfo); + }); + + } + + /** + * 根据uid 从服务器获取用户详细信息。 + * + * @param userId + * @return + */ + @Override + public Single getUserInfoFromServerUpdate(final long userId,boolean isRef) { + return api.requestUserInfo(String.valueOf(userId)) + .compose(RxHelper.handleSchedulers()) + .flatMap(userInfoServiceResult -> { + + UserInfo userInfo = userInfoServiceResult.getData(); + if (null == userInfo) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_05))); + } + + UserInfo userInfo2 = NobleUtil.setCompletedNobleInfo(userInfo); + if (isRef) { + cache.put(userInfo2.getUid(), userInfo2); + + currentUserInfo = userInfo2; + cache.put(userId, userInfo2); + } + return Single.just(userInfo2); + }); + + } + + @Override + public Single getUserInfoDetail(long uid) { + return api.getUserInfoDetail(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()) + .flatMap(userDetailInfo -> { + if (null == userDetailInfo) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_06))); + } + if (userDetailInfo.getCode() != 200) { + return Single.error(new Exception(userDetailInfo.getMessage())); + } + UserDetailInfo = userDetailInfo; + return Single.just(userDetailInfo); + }); + } + + @Override + public Single getUserInfoDetailCache(long uid){ + if (UserDetailInfo != null && UserDetailInfo.getData() != null && UserDetailInfo.getData().getUid() == uid) { + return Single.just(UserDetailInfo); + } else { + return api.getUserInfoDetail(String.valueOf(uid)) + .compose(RxHelper.handleSchedulers()) + .flatMap(userDetailInfo -> { + if (null == userDetailInfo) { + return Single.error(new Exception(ResUtil.getString(R.string.xchat_android_core_user_usermodel_06))); + } + if (userDetailInfo.getCode() != 200) { + return Single.error(new Exception(userDetailInfo.getMessage())); + } + UserDetailInfo = userDetailInfo; + return Single.just(userDetailInfo); + }); + } + } + + + + /** + * 根据 云信的Uid 去我们后台获取用户的具体信息 + * + * @param uidList + * @return + */ + @Override + public Single> loadUserInfoByUids(List uidList) { + String listStr = TextUtils.join(",", uidList); + return api.getUserInfoListUrl( + listStr + ) + .flatMap(new Function>>() { + @Override + public SingleSource> apply(UserListResult userListResult) throws Exception { + if (userListResult.isSuccess()) { + if (!ListUtils.isListEmpty(userListResult.getData())) { + return Single.just(userListResult.getData()); + } else { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_user_usermodel_07))); + } + } else { + return Single.error(new Throwable(userListResult.getMessage())); + } + + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 用户补全资料 + * + * @param userInfo + * @param shareChannel + * @param shareUid + * @param roomUid + */ + @Override + public Single requestCompleteUserInfo(final UserInfo userInfo, String shareChannel, String shareUid, String roomUid, String inviteCode, String adid) { + + if (StringUtils.isEmpty(String.valueOf(userInfo.getUid()))) { + return Single.error(new Throwable(ResUtil.getString(R.string.xchat_android_core_user_usermodel_08))); + } + String ticket = AuthModel.get().getTicket(); + + String birth = null; + if (!StringUtils.isEmpty(userInfo.getBirthStr())) { + birth = String.valueOf(userInfo.getBirthStr()); + } + + String regionId = null; + if (userInfo.getRegionId() > 0) { + regionId = String.valueOf(userInfo.getRegionId()); + } + + String nick = null; + if (!StringUtils.isEmpty(userInfo.getNick())) { + nick = userInfo.getNick(); + } + String avatar = null; + if (!StringUtils.isEmpty(userInfo.getAvatar())) { + avatar = userInfo.getAvatar(); + } + String gender = null; + if (userInfo.getGender() > 0) { + gender = String.valueOf(userInfo.getGender()); + } + if (StringUtils.isEmpty(shareChannel)) { + shareChannel = null; + } + if (StringUtils.isEmpty(shareUid)) { + shareUid = null; + } + + if (StringUtils.isEmpty(roomUid) || !isNumeric(roomUid)) { + roomUid = null; + } + if (TextUtils.isEmpty(inviteCode)) { + inviteCode = null; + } + + return api.updateUserInfo( + ticket, + String.valueOf(userInfo.getUid()), + birth, + nick, + avatar, + gender, + shareChannel, + shareUid, + roomUid, + null, + null, + null, + null, + null, + null, + inviteCode, + adid, + regionId + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function>() { + @Override + public SingleSource apply(UserInfo userInfo) throws Exception { + return updateCurrentUserInfo(); + } + }) + .doOnSuccess(data -> { + EventBus.getDefault().post(new CurrentUserInfoCompleteEvent()); + //完善资料后,登录流程结束,发出加载事件 + EventBus.getDefault().post(new LoadLoginUserInfoEvent()); + }) + .doOnError(throwable -> { + EventBus.getDefault().post(new CurrentUserInfoCompleteFailEvent(throwable.getMessage())); + }); + + } + + private boolean isNumeric(String str) { + Pattern pattern = Pattern.compile("[0-9]*"); + return pattern.matcher(str).matches(); + } + + @Override + public Single requestUpdateUserInfo(@NonNull final UserInfo userInfo) { + + if (StringUtils.isEmpty(String.valueOf(userInfo.getUid()))) { + return Single.error(new Throwable("empty uid")); + } + + String ticket = AuthModel.get().getTicket(); + + String birth = null; + if (!StringUtils.isEmpty(userInfo.getBirthStr())) { + birth = String.valueOf(userInfo.getBirthStr()); + } + String nick = null; + if (!StringUtils.isEmpty(userInfo.getNick())) { + nick = userInfo.getNick(); + } + String signture = null; + if (!StringUtils.isEmpty(userInfo.getSignture())) { + signture = userInfo.getSignture(); + } + String userVoice = null; + if (!StringUtils.isEmpty(userInfo.getUserVoice())) { + userVoice = userInfo.getUserVoice(); + } + String voiceDura = null; + if (userInfo.getVoiceDura() > 0) { + voiceDura = String.valueOf(userInfo.getVoiceDura()); + } + String avatar = null; + if (!StringUtils.isEmpty(userInfo.getAvatar())) { + avatar = userInfo.getAvatar(); + } + String region = null; + if (!StringUtils.isEmpty(userInfo.getRegion())) { + region = userInfo.getRegion(); + } + //为空串的时候也允许修改个性签名 + String userDesc = userInfo.getUserDesc(); + String gender = null; + if (userInfo.getGender() > 0) { + gender = String.valueOf(userInfo.getGender()); + } + + return api.updateUserInfo( + ticket, + String.valueOf(userInfo.getUid()), + birth, + nick, + avatar, + gender, + null, + null, + null, + signture, + userVoice, + voiceDura, + region, + userDesc, + null, + null, + "", + null + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function>() { + @Override + public SingleSource apply(UserInfo userInfo) throws Exception { + return updateCurrentUserInfo(); + } + }); + + } + + @Override + public Single upLoadAvatar(String avatarUrl, boolean needPay) { + return api.upLoadAvatar(avatarUrl,needPay) + .compose(RxHelper.handleIgnoreData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single requestAddPhoto(String url) { + String ticket = AuthModel.get().getTicket(); + final long uid = AuthModel.get().getCurrentUid(); + return api.addPhoto( + ticket, + url, + String.valueOf(uid) + ) + .flatMap((Function>) serviceResult -> { + if (serviceResult == null || !serviceResult.isSuccess()) { + String msg = serviceResult == null ? "" : serviceResult.getMessage(); + return Single.error(new Throwable(msg)); + } + return Single.just(serviceResult); + }) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function>() { + @Override + public SingleSource apply(ServiceResult serviceResult) throws Exception { + return updateCurrentUserInfo(); + } + }); + + } + + @Override + public Single requestDeletePhoto(long pid) { + String ticket = AuthModel.get().getTicket(); + final long uid = AuthModel.get().getCurrentUid(); + return api.deletePhoto( + ticket, + String.valueOf(uid), + String.valueOf(pid) + ) + .flatMap((Function>) serviceResult -> { + if (serviceResult == null || !serviceResult.isSuccess()) { + String msg = serviceResult == null ? "" : serviceResult.getMessage(); + return Single.error(new Throwable(msg)); + } + return Single.just(serviceResult); + }) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function>() { + @Override + public SingleSource apply(ServiceResult serviceResult) throws Exception { + return updateCurrentUserInfo(); + } + }); + } + + @Override + public Single> requestUserGiftWall(long uid, int giftType, int orderType) { + return api.giftWall(String.valueOf(uid), + giftType, + String.valueOf(orderType)) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single>> getNerUserList(int page, int pageSize) { + return api.getNerUserList(page, pageSize) + .compose(RxHelper.handleSchedulers()); + } + + + /** + * 重置支付密码 + * + * @param currentPwd + * @param newPwd + * @return + */ + @Override + public Single resetPayPwd(String currentPwd, String newPwd) { + String currentUid = String.valueOf(AuthModel.get().getCurrentUid()); + String desCurrentPwd = DESUtils.DESAndBase64(currentPwd); + String desNewPwd = DESUtils.DESAndBase64(newPwd); + String ticket = AuthModel.get().getTicket(); + return api.resetPayPwd(currentUid, desCurrentPwd, desNewPwd, ticket) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_user_usermodel_09)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 设置支付密码 + * + * @param newPwd + * @return + */ + @Override + public Single setPayPwd(String newPwd) { + String currentUid = String.valueOf(AuthModel.get().getCurrentUid()); + String desNewPwd = DESUtils.DESAndBase64(newPwd); + String ticket = AuthModel.get().getTicket(); + return api.setPayPwd(currentUid, desNewPwd, ticket) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult stringServiceResult) throws Exception { + if (stringServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_user_usermodel_010)); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getShareCode() { + return api.shareCode(AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + public Single> getGameWeek(long uid) { + return api.getGameWeek(uid) + .compose(RxHelper.singleMainResult()); + } + + + @Override + public Single useOrDelete(long id, int status) { + return api.useOrDeleteTag(id, status) + .compose(RxHelper.singleMainResult(true)); + } + + @Override + public Single openOrClosePatriarchMode(String pwd, int status) { + return api.openOrClosePatriarchMode(AuthModel.get().getCurrentUid(), pwd, status) + .compose(RxHelper.singleMainResult(true)); + } + + @Override + public Single searchUserInfo(String skey, int pageSize, int pageNo) { + return api.searchUserInfo( + skey, + String.valueOf(pageSize), + String.valueOf(pageNo) + ) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + + } + + @Override + public Single verifyPaymentPassword(String password) { + return api.verifyPaymentPassword(AuthModel.get().getCurrentUid(), password) + .compose(RxHelper.handleStringData()); + } + + @Override + public boolean isMyseft(long targetUid) { + return isMyseft(String.valueOf(targetUid)); + } + + @Override + public boolean isMyseft(String targetUid) { + return Objects.equals(String.valueOf(AuthModel.get().getCurrentUid()), targetUid); + } + + @Override + public String getNick() { + UserInfo userInfo = getCacheLoginUserInfo(); + String nick = null; + if (userInfo != null) { + nick = userInfo.getNick(); + } + if (nick == null) { + nick = ""; + } + return nick; + } + + @Override + public Single getSimpleUser(String erbanNo) { + return api.apiGetSimpleUser(erbanNo) + .compose(RxHelper.handleCommon()); + } + + @Override + public UserInfo.Location getUserExpand() { + if (currentUserInfo != null) { + return currentUserInfo.getUserExpand(); + } + return null; + } + + @Override + public Single> getAchievementList(long targetUid) { + return api.getAchievementList(AuthModel.get().getCurrentUid(), targetUid) + .flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> listServiceResult) throws Exception { + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single> getInRoomRecord() { + return api.getInRoomRecord(AuthModel.get().getCurrentUid()).flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> listServiceResult) throws Exception { + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single deleteInRoomRecord() { + return api.deleteInRoomRecord(AuthModel.get().getCurrentUid()).compose(RxHelper.handleSchAndExce()); + } + + /** + * 随机头像昵称开关 + */ + @Override + public Single getRandomConfig() { + return api.apiRandomConfig() + .compose(RxHelper.handleCommon()); + } + + /** + * 随机昵称 + */ + @Override + public Single getRandomNick() { + return api.apiRandomNick() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 随机头像 + */ + @Override + public Single getRandomAvatar() { + return api.apiRandomAvatar() + .compose(RxHelper.handleCommon()); + } + + @Override + public Single> getGiveUserList(int page, int pageSize) { + return api.getGiveUserList(page, pageSize) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Nullable + @Override + public String getPreFillInviteCode() { + return preFillInviteCode; + } + + @Override + public Single getProtocolInfo() { + return api.getProtocolInfo() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single visitUserDetail(long uid) { + return api.visitUserDetail(uid) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single> getVisitorUserList(int pageNum, int pageSize) { + return api.getVisitorUserList(pageNum, pageSize) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 舉報接口 + */ + @Override + public Single addReport(Long objId, int type) { + return api.addReport(objId, type) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getUserLabelInfo() { + return api.getUserLabelInfo() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single saveLabel(String label) { + return api.saveLabel(label) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single> getAreaInfo() { + return api.getAreaInfo() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single saveArea(long area) { + return api.saveArea(area) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single userCpSettingUpdate(int type,boolean isShow) { + return api.userCpSettingUpdate(type,isShow) + .compose(RxHelper.handleStringData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getUserMineInfo() { + return api.getUserMineInfo() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public boolean isSamePartition(long partitionId) { + if (currentUserInfo == null) { + return false; + } + if (currentUserInfo.partitionId == 0) { + return true; + } + return currentUserInfo.partitionId == partitionId; + } + + @Override + public long getPartitionId() { + if (currentUserInfo == null) { + return 0; + } + return currentUserInfo.partitionId; + } + + //是否是阿拉伯用户 + public boolean isArUser(){ + if (currentUserInfo == null) { + return false; + } + // 2是 阿拉伯 + return currentUserInfo.partitionId == 2; + } + //是否是华语用户 + public boolean isTWUser(){ + if (currentUserInfo == null) { + return false; + } + // 4 是 华语用户 + return currentUserInfo.partitionId == 4; + } + //是否是英文用户 + public boolean isEnUser(){ + if (currentUserInfo == null) { + return false; + } + // 1 是 英文用户 + return currentUserInfo.partitionId == 1; + } + + + + private interface Api { + /** + * 获取某个用户的用户信息 + * + * @return - + */ + @GET("/user/get") + Single> requestUserInfo(@Query("uid") String uid); + + @GET("/user/detail/get") + Single getUserInfoDetail(@Query("uid") String uid); + + + /** + * @param key + * @param pageSize + * @param pageNo + * @return + */ + @GET("/search/user") + Single searchUserInfo(@Query("key") String key, + @Query("pageSize") String pageSize, + @Query("pageNo") String pageNo); + + + /** + * @param uids + * @return + */ + @GET("/user/list") + Single getUserInfoListUrl(@Query("uids") String uids); + + + /** + * @param ticket + * @param uid + * @param birth + * @param nick + * @param avatar + * @param gender + * @param shareChannel + * @param shareUid + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("user/v2/update") + Single updateUserInfo(@Field("ticket") String ticket, + @Field("uid") String uid, + @Field("birth") String birth, + @Field("nick") String nick, + @Field("avatar") String avatar, + @Field("gender") String gender, + @Field("shareChannel") String shareChannel, + @Field("shareUid") String shareUid, + @Field("roomUid") String roomUid, + @Field("signture") String signture, + @Field("userVoice") String userVoice, + @Field("voiceDura") String voiceDura, + @Field("region") String region, + @Field("userDesc") String userDesc, + @Field("shareCode") String shareCode, + @Field("inviteCode") String inviteCode, + @Field("adid") String adid, + @Field("regionId") String regionId); + + @FormUrlEncoded + @POST("user/v2/uploadAvatar") + Single> upLoadAvatar(@Field("avatarUrl") String avatarUrl, @Field("needPay") boolean needPay); + + + /** + * @param ticket + * @param photoStr + * @param uid + * @return + */ + @POST("/photo/upload") + Single addPhoto(@Query("ticket") String ticket, + @Query("photoStr") String photoStr, + @Query("uid") String uid); + + /** + * @param ticket + * @param uid + * @param pid + * @return + */ + @POST("/photo/delPhoto") + Single deletePhoto(@Query("ticket") String ticket, + @Query("uid") String uid, + @Query("pid") String pid); + + + /** + * @param uid + * @param orderType + * @return + */ + @GET("/giftwall/getByGiftType") + Single giftWall(@Query("uid") String uid, + @Query("giftType") int giftType, + @Query("orderType") String orderType); + + + @POST("user/paymentPasswd/modify") + Single> resetPayPwd(@Query("uid") String uid, + @Query("oldPasswd") String oldPasswd, + @Query("newPasswd") String newPasswd, + @Query("ticket") String ticket); + + @POST("user/paymentPasswd/reset") + Single> setPayPwd(@Query("uid") String uid, + @Query("newPasswd") String newPasswd, + @Query("ticket") String ticket); + + /** + * 新秀玩友 + * + * @return - + */ + @GET("user/list/new") + Single>> getNerUserList(@Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 获取邀请码 + * + * @return - + */ + @GET("user/shareCode") + Single> shareCode(@Query("uid") long uid); + + /** + * 获取认证标签 + * + * @return - + */ + @FormUrlEncoded + @POST("game/v3/week") + Single>> getGameWeek(@Field("uid") long uid); + + /** + * 使用或删除标签 + * + * @return - + */ + @FormUrlEncoded + @POST("live/useOrDelete") + Single> useOrDeleteTag(@Field("liveId") long liveId, + @Field("status") int status); + + /** + * 使用或删除标签 + * + * @return - + */ + @FormUrlEncoded + @POST("user/openOrClose") + Single> openOrClosePatriarchMode(@Field("uid") long uid, + @Field("password") String password, + @Field("status") int status); + + @FormUrlEncoded + @POST("user/paymentPasswd/check") + Single> verifyPaymentPassword(@Field("uid") long uid, + @Field("passwd") String password); + + /** + * @param erbanNo 号或手机号码 + * @return - + */ + @GET("user/getSimpleUser") + Single> apiGetSimpleUser(@Query("erbanNo") String erbanNo); + + @GET("giftwall/getAchievementList") + Single>> getAchievementList(@Query("uid") long uid, @Query("targetUid") long targetUid); + + @GET("userroom/getInRoomRecord") + Single>> getInRoomRecord(@Query("uid") long uid); + + @POST("userroom/deleteInRoomRecord") + Single deleteInRoomRecord(@Query("uid") long uid); + + @GET("/userRandom/getConfig") + Single> apiRandomConfig(); + + @GET("/random/nick/get") + Single> apiRandomNick(); + + @GET("/userRandom/getAvatar") + Single> apiRandomAvatar(); + + /** + * 最近转赠联系人信息 + * + * @return - + */ + @GET("/user/diamond/giveRecord") + Single>> getGiveUserList(@Query("page") int page, + @Query("pageSize") int pageSize); + + + /** + * 用户协议更新弹窗 + * + * @return + */ + @GET("/user/latestPrivacyPolicy") + Single> getProtocolInfo(); + + /** + * 访客列表 + * + * @return + */ + @GET("/user/detail/visitUserDetail") + Single> visitUserDetail(@Query("uid") long uid); + + /** + * 访客列表 + * + * @return - + */ + @GET("/uservisitrecord/visitUserList") + Single>> getVisitorUserList(@Query("pageNum") int pageNum, + @Query("pageSize") int pageSize); + + @POST("user/paymentPasswd/modify") + Single> addReport(@Query("uid") String uid, + @Query("oldPasswd") String oldPasswd, + @Query("newPasswd") String newPasswd, + @Query("ticket") String ticket); + + /** + * 舉報 + */ + @POST("/user/black/add") + Single> addReport(@Query("objId") Long objId, @Query("type") int type); + + /** + * 编辑标签 + */ + @GET("/label/edit") + Single> getUserLabelInfo(); + + /** + * 保存标签 + */ + @POST("/label/save") + Single> saveLabel(@Query("labels") String labels); + + /** + * 获取地区列表 + */ + @GET("/regionInfo/list") + Single>> getAreaInfo(); + + /** + * 保存地区 + */ + @POST("/regionInfo/save") + Single> saveArea(@Query("id") long id); + + /** + * Byte type,//1-cp头像是否展示,2-cp动画 + * Boolean isShow 是否开启 + */ + @POST("/user/setting/update") + Single> userCpSettingUpdate(@Query("type") int type,@Query("isShow") boolean isShow); + + /** + * 个人信息未读 + */ + @GET("/user/detail/mine") + Single> getUserMineInfo(); + + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/AttentionInfo.java b/core/src/main/java/com/chwl/core/user/bean/AttentionInfo.java new file mode 100644 index 0000000..14fb8ae --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/AttentionInfo.java @@ -0,0 +1,71 @@ +package com.chwl.core.user.bean; + +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.room.bean.RoomInfo; +import com.chwl.core.vip.bean.UserVipInfo; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * Created by Administrator on 2017/7/8 0008. + */ +@Data +public class AttentionInfo implements Serializable { + + public String nick; + + public long fansNum; + + public long uid; + + public String avatar; + + public boolean valid; + + private int operatorStatus; + + private int type; + + public String getUserDesc() { + return userDesc; + } + + public void setUserDesc(String userDesc) { + this.userDesc = userDesc; + } + + private String title; + + private RoomInfo userInRoom; + + public List uidList; + + public NobleInfo nobleUsers; + + public UserLevelVo userLevelVo; + public boolean newUser; + //性别 1:男 2:女 0 :未知 + private int gender; + private long birth; + //个人简介 + private String userDesc; + + //1普通账号,2官方账号,3机器账号 + private int defUser; + + private UserVipInfo userVipInfoVO; + + private String userInfoCardPic; + + /** + * 判断是否为官方 + * @return + */ + public boolean isOfficial() { + return getDefUser() == UserInfo.USER_TYPE_OFFICIAL; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/AttentionItem.java b/core/src/main/java/com/chwl/core/user/bean/AttentionItem.java new file mode 100644 index 0000000..fa2b534 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/AttentionItem.java @@ -0,0 +1,70 @@ +package com.chwl.core.user.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; + +public class AttentionItem implements MultiItemEntity, Parcelable, Serializable { + public static final transient byte TYPE_PLAY_TOGETHER = (byte) 1;// 一起玩 + public static final transient byte TYPE_ATTENTION = (byte) 2; // 在房间内的关注用户 + public static final transient byte TYPE_ATTENTION_MORE = (byte) 3; // 更多按钮 + + //类型 + private byte itemType; + + //正常数据 + private T data; + + public AttentionItem(byte itemType) { + this(itemType, null); + } + + public AttentionItem(byte itemType, T data) { + this.itemType = itemType; + this.data = data; + } + + protected AttentionItem(Parcel in) { + itemType = in.readByte(); + data = (T) in.readSerializable(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public AttentionItem createFromParcel(Parcel in) { + return new AttentionItem(in); + } + + @Override + public AttentionItem[] newArray(int size) { + return new AttentionItem[size]; + } + }; + + @Override + public int getItemType() { + return itemType; + } + + public void setData(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte(itemType); + dest.writeSerializable(data); + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/BaseInfo.java b/core/src/main/java/com/chwl/core/user/bean/BaseInfo.java new file mode 100644 index 0000000..60e6ed4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/BaseInfo.java @@ -0,0 +1,65 @@ +package com.chwl.core.user.bean; + +import android.text.TextUtils; + +import lombok.Getter; +import lombok.Setter; + +/** + * 基础信息 + * Created by lvzebiao on 2018/12/21. + */ +public class BaseInfo { + @Getter + @Setter + private long uid; + + @Setter + private String nick; + + @Setter + @Getter + private int groupType; + + public BaseInfo(long uid) { + this(uid, ""); + } + + public BaseInfo() { + this(0, ""); + } + + public BaseInfo(String uid, String nick) { + this(accountToUid(uid), nick); + } + + public BaseInfo(long uid, String nick) { + this.uid = uid; + 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 = ""; + } + return nick; + } + + private static long accountToUid(String uid) { + long longUid = 0; + if (!TextUtils.isEmpty(uid)) { + try { + longUid = Long.parseLong(uid); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + return longUid; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java b/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java new file mode 100644 index 0000000..b025c57 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java @@ -0,0 +1,73 @@ +package com.chwl.core.user.bean; + +import com.chwl.core.vip.bean.UserVipInfo; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * 用户信息基础类 + * create by lvzebiao @2019/11/26 + */ +@Getter +@Setter +public class BaseUserInfo implements Serializable { + + private String nick; + + private String avatar; + + private int gender; + + private int age; + + private String headwearPic; + + private String headwearEffect; + + private int headwearType; + + private long uid; + + private int nobleId; + + //1普通账号,2官方账号,3机器账号 + private int defUser; + + private boolean newUser; + + // 财富等级 + private String experLevelPic; + + // 魅力等级 + private String charmLevelPic; + + // 铭牌图片 + private String nameplatePic; + + // 铭牌文字 + private String nameplateWord; + private boolean isCustomWord; + + // 在哪个房间id + private Long inRoomUid; + + /** + * 贵族头饰 + */ + private String micDecorate; + private UserInfo.NamePlate nameplate; + + private UserVipInfo userVipInfoVO; + + /** + * 判断是否为官方账号 + * @return + */ + public boolean isOfficial() { + return getDefUser() == UserInfo.USER_TYPE_OFFICIAL; + } + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/DiamondGiveHistoryInfo.java b/core/src/main/java/com/chwl/core/user/bean/DiamondGiveHistoryInfo.java new file mode 100644 index 0000000..0866e37 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/DiamondGiveHistoryInfo.java @@ -0,0 +1,30 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class DiamondGiveHistoryInfo implements Serializable { + + private Long id;//记录 id + private Long fromUid;//用户uid + private Long targetUid;//对方用户uid + private Long targetErbanNo;//对方平台id + private String targetNick;//对方用户信息 + private String targetAvatar;//對方用戶頭像 + + private Long diamondNum;//转赠给对方的数量 + private Double realDiamondNum;//转赠实际支出的数量,包含手续费 + private Long createTime;//创建时间 + private Long updateTime;//更新时间 + + private int type;//转赠类型: 0转赠钻石 1转赠礼物 + private Integer giftId;//转赠礼物id + private Integer giftNum;//转赠礼物数 + private String giftUrl;//轉贈禮物url + private String giftName;//轉贈禮物名字 + private Long giftGoldNum;//转赠礼物单价 + private Long totalGiftGoldNum;//转赠礼物总价值 + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/EffectType.java b/core/src/main/java/com/chwl/core/user/bean/EffectType.java new file mode 100644 index 0000000..1bd5b4e --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/EffectType.java @@ -0,0 +1,8 @@ +package com.chwl.core.user.bean; + +public @interface EffectType { + int IMG = 0; + int MP4 = 1; + int SVGA = 2; + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/FansInfo.java b/core/src/main/java/com/chwl/core/user/bean/FansInfo.java new file mode 100644 index 0000000..fa20fa0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/FansInfo.java @@ -0,0 +1,46 @@ +package com.chwl.core.user.bean; + +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.vip.bean.UserVipInfo; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by ${Seven} on 2017/8/9. + * + * @author Administrator + */ +@Data +public class FansInfo implements Serializable { + private long uid; + private boolean valid; + private String avatar; + private String nick; + + private NobleInfo nobleUsers; + private UserLevelVo userLevelVo; + private boolean newUser; + //性别 1:男 2:女 0 :未知 + private int gender; + private long birth; + //个人简介 + private String userDesc; + //1普通账号,2官方账号,3机器账号 + private int defUser; + + private UserVipInfo userVipInfoVO; + + private String userInfoCardPic; + + /** + * 判断是否为官方 + * @return + */ + public boolean isOfficial() { + return getDefUser() == UserInfo.USER_TYPE_OFFICIAL; + } + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/FansListInfo.java b/core/src/main/java/com/chwl/core/user/bean/FansListInfo.java new file mode 100644 index 0000000..26df078 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/FansListInfo.java @@ -0,0 +1,29 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by chenran on 2017/10/2. + */ + +public class FansListInfo implements Serializable { + private int pageCount; + private List fansList; + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List getFansList() { + return fansList; + } + + public void setFansList(List fansList) { + this.fansList = fansList; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/FirstChargeInfo.kt b/core/src/main/java/com/chwl/core/user/bean/FirstChargeInfo.kt new file mode 100644 index 0000000..5429139 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/FirstChargeInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.user.bean + +import lombok.Data + +@Data +data class FirstChargeInfo( + val needToShow: Boolean = false, + val roomUid: Long = 0, + val showAfterSecond: Long = 0 +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfo.java b/core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfo.java new file mode 100644 index 0000000..866bc1f --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; +import java.util.ArrayList; + +import lombok.Data; + +@Data +public class GiftAchievementInfo implements Serializable { + private String typeName; + private int attainNum; + private int totalNum; + private String backgroundUrl; // 背景 + private String grayBgUrl; // 灰色背景 + private String maskUrl; // 蒙层 + private ArrayList giftList; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfoSub.java b/core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfoSub.java new file mode 100644 index 0000000..e29ff1e --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/GiftAchievementInfoSub.java @@ -0,0 +1,18 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class GiftAchievementInfoSub implements Serializable { + private String giftName; + private int giftSum; + private String tip; + private int status; // 0-未点亮 1-已点亮 + private String picUrl; + + public boolean isStatus() { + return status == 0; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/GiftAchievementItem.java b/core/src/main/java/com/chwl/core/user/bean/GiftAchievementItem.java new file mode 100644 index 0000000..c5f4672 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/GiftAchievementItem.java @@ -0,0 +1,63 @@ +package com.chwl.core.user.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; + +public class GiftAchievementItem implements MultiItemEntity, Serializable { + public static final transient byte TYPE_TITILE = (byte) 1;// title + public static final transient byte TYPE_ITEM = (byte) 2; // item + public static final transient byte TYPE_BLOCK_DIVIDER = (byte) 3; // item + + //类型 + private byte itemType; + + //正常数据 + private T data; + private String mBgUrl; + private String mMaskUrl; + + public String getmGrayBgUrl() { + return mGrayBgUrl; + } + + private String mGrayBgUrl; + + public GiftAchievementItem(byte itemType) { + this(itemType, null); + } + + public GiftAchievementItem(byte itemType, T data) { + this.itemType = itemType; + this.data = data; + } + + public GiftAchievementItem(byte itemType, T data, String bgUrl, String maskUrl, String grayBgUrl) { + this.itemType = itemType; + this.data = data; + this.mBgUrl = bgUrl; + this.mMaskUrl = maskUrl; + this.mGrayBgUrl = grayBgUrl; + } + + @Override + public int getItemType() { + return itemType; + } + + public void setData(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + public String getmBgUrl() { + return mBgUrl; + } + + public String getmMaskUrl() { + return mMaskUrl; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/GiftWallInfo.java b/core/src/main/java/com/chwl/core/user/bean/GiftWallInfo.java new file mode 100644 index 0000000..788f11a --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/GiftWallInfo.java @@ -0,0 +1,64 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +/** + * Created by chenran on 2017/10/17. + */ + +public class GiftWallInfo implements Serializable { + private long uid; + private int giftId; + private int reciveCount; + private String giftName; + private String picUrl; + private int giftPrice; + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public int getGiftId() { + return giftId; + } + + public void setGiftId(int giftId) { + this.giftId = giftId; + } + + public int getReciveCount() { + return reciveCount; + } + + public void setReciveCount(int reciveCount) { + this.reciveCount = reciveCount; + } + + public String getGiftName() { + return giftName; + } + + public void setGiftName(String giftName) { + this.giftName = giftName; + } + + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + + public int getGiftPrice() { + return giftPrice; + } + + public void setGiftPrice(int giftPrice) { + this.giftPrice = giftPrice; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/InviteUserInfo.java b/core/src/main/java/com/chwl/core/user/bean/InviteUserInfo.java new file mode 100644 index 0000000..0f41b36 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/InviteUserInfo.java @@ -0,0 +1,12 @@ +package com.chwl.core.user.bean; + +import lombok.Data; + +@Data +public class InviteUserInfo { + private String inviteNick; + private long inviteUid; + private boolean isInRoom; + private long roomUid; + private int fromType; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/JoinWorldInfo.java b/core/src/main/java/com/chwl/core/user/bean/JoinWorldInfo.java new file mode 100644 index 0000000..7bfeecc --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/JoinWorldInfo.java @@ -0,0 +1,19 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class JoinWorldInfo implements Serializable { + + /** + * worldId : 157 + * icon : https://image.zhongjialx.com/Fq1gHipzykdi4f9_UVAYAPeRPJIw?imageslim + * name : 5678 + */ + + private int worldId; + private String icon; + private String name; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/LiveSkillVoListBean.java b/core/src/main/java/com/chwl/core/user/bean/LiveSkillVoListBean.java new file mode 100644 index 0000000..597ae63 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/LiveSkillVoListBean.java @@ -0,0 +1,88 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +public class LiveSkillVoListBean implements Serializable { + /** + * id : 1 + * liveId : 3 + * skillName : 王者 + * skillPicture : picture + * skillType : 1 + * status : 3 + * valid : 1 + */ + + private long id; + private long liveId; + private String skillName; + private String skillPicture; + private String skillType; + private int status; //技能状态 1--未认证 2--审核中 3--已认证 + private int valid;// 是否激活 0-未激活 1-已激活 + private int hasUse; //是否使用 0-未使用 | 1-使用 + + public int getHasUse() { + return hasUse; + } + + public void setHasUse(int hasUse) { + this.hasUse = hasUse; + } + + public long getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public long getLiveId() { + return liveId; + } + + public void setLiveId(int liveId) { + this.liveId = liveId; + } + + public String getSkillName() { + return skillName; + } + + public void setSkillName(String skillName) { + this.skillName = skillName; + } + + public String getSkillPicture() { + return skillPicture; + } + + public void setSkillPicture(String skillPicture) { + this.skillPicture = skillPicture; + } + + public String getSkillType() { + return skillType; + } + + public void setSkillType(String skillType) { + this.skillType = skillType; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getValid() { + return valid; + } + + public void setValid(int valid) { + this.valid = valid; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/LiveTagInfo.java b/core/src/main/java/com/chwl/core/user/bean/LiveTagInfo.java new file mode 100644 index 0000000..756ac1e --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/LiveTagInfo.java @@ -0,0 +1,52 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; +import java.util.List; + +public class LiveTagInfo implements Serializable { + + + /** + * liveTag : true + * liveSkillName : tagName + * liveSkillVoList : [{"id":1,"liveId":3,"skillName":ResUtil.getString(R.string.user_bean_livetaginfo_01),"skillPicture":"picture","skillType":"1","status":3,"valid":1}] + */ + + private boolean liveTag; + private String liveSkillName; + + public String getSkillTag() { + return skillTag; + } + + public void setSkillTag(String skillTag) { + this.skillTag = skillTag; + } + + private String skillTag; + private List liveSkillVoList; + + public boolean isLiveTag() { + return liveTag; + } + + public void setLiveTag(boolean liveTag) { + this.liveTag = liveTag; + } + + public String getLiveSkillName() { + return liveSkillName; + } + + public void setLiveSkillName(String liveSkillName) { + this.liveSkillName = liveSkillName; + } + + public List getLiveSkillVoList() { + return liveSkillVoList; + } + + public void setLiveSkillVoList(List liveSkillVoList) { + this.liveSkillVoList = liveSkillVoList; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/MedalBean.kt b/core/src/main/java/com/chwl/core/user/bean/MedalBean.kt new file mode 100644 index 0000000..c817d70 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/MedalBean.kt @@ -0,0 +1,11 @@ +package com.chwl.core.user.bean + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class MedalBean : Serializable { + val medalId: Long? = null + val picUrl: String? = null + val medalName: String? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/user/bean/NameplateInfo.java b/core/src/main/java/com/chwl/core/user/bean/NameplateInfo.java new file mode 100644 index 0000000..debe10c --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/NameplateInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.user.bean; + +import lombok.Data; + +@Data +public class NameplateInfo { + public String nameplateImage; + public String nameplateName; + public String word; + public boolean isCustomWord; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/NewUserInfo.java b/core/src/main/java/com/chwl/core/user/bean/NewUserInfo.java new file mode 100644 index 0000000..8b82b80 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/NewUserInfo.java @@ -0,0 +1,98 @@ +package com.chwl.core.user.bean; + +public class NewUserInfo { + + /** + * uid : 40 + * erbanNo : 6373907 + * nick : erban新人 + * birth : 631123200000 + * followNum : 0 + * fansNum : 0 + * gender : 1 + * avatar : https://image.zhongjialx.com/default_head.png + * createTime : 1535425509000 + */ + + private int uid; + private int erbanNo; + private String nick; + private long birth; + private int followNum; + private int fansNum; + private int gender; + private String avatar; + private long createTime; + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public long getBirth() { + return birth; + } + + public void setBirth(long birth) { + this.birth = birth; + } + + public int getFollowNum() { + return followNum; + } + + public void setFollowNum(int followNum) { + this.followNum = followNum; + } + + public int getFansNum() { + return fansNum; + } + + public void setFansNum(int fansNum) { + this.fansNum = fansNum; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/ProtocolInfo.kt b/core/src/main/java/com/chwl/core/user/bean/ProtocolInfo.kt new file mode 100644 index 0000000..8ddf1ee --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/ProtocolInfo.kt @@ -0,0 +1,9 @@ +package com.chwl.core.user.bean + +data class ProtocolInfo( + val content: String = "", + val linkText: String = "", + val linkUrl: String = "", + val title: String = "", + val ver: Float = 0f +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/user/bean/RadishWallInfo.java b/core/src/main/java/com/chwl/core/user/bean/RadishWallInfo.java new file mode 100644 index 0000000..14a3363 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/RadishWallInfo.java @@ -0,0 +1,12 @@ +package com.chwl.core.user.bean; + +import lombok.Data; + +@Data +public class RadishWallInfo { + private long uid; + private long giftId; + private String giftName; + private String picUrl; + private int receiveCount; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/RegionInfoBean.java b/core/src/main/java/com/chwl/core/user/bean/RegionInfoBean.java new file mode 100644 index 0000000..67a288b --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/RegionInfoBean.java @@ -0,0 +1,12 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +public class RegionInfoBean implements Serializable { + public String code = ""; + public String icon = ""; + public String name = ""; + public long id = 0; + public long partitionId = 0; + public long seq = 0; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/SearchUserInfo.java b/core/src/main/java/com/chwl/core/user/bean/SearchUserInfo.java new file mode 100644 index 0000000..c08f341 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/SearchUserInfo.java @@ -0,0 +1,36 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class SearchUserInfo implements Serializable { + + /** + * 用户uid + */ + private Long uid; + /** + * 平台号 + */ + private Long erbanNo; + /** + * 头像 + */ + private String avatar; + /** + * 昵称 + */ + private String nick; + /** + * 性别 1.男 2.女 + */ + private Byte gender; + + /** + * 生日 + */ + private String birth; + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/SimpleUserInfo.java b/core/src/main/java/com/chwl/core/user/bean/SimpleUserInfo.java new file mode 100644 index 0000000..57827f6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/SimpleUserInfo.java @@ -0,0 +1,21 @@ +package com.chwl.core.user.bean; + +import com.chwl.core.level.UserLevelVo; + +import java.io.Serializable; + +import lombok.Data; + +/** + * UserInfoView 使用的一个bean + * Created by lvzebiao on 2019/1/10. + */ +@Data +public class SimpleUserInfo implements Serializable{ + + private long uid; + private String nick; + private int gender; + private UserLevelVo userLevelVo; + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserBgVO.java b/core/src/main/java/com/chwl/core/user/bean/UserBgVO.java new file mode 100644 index 0000000..e1bcab0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserBgVO.java @@ -0,0 +1,12 @@ +package com.chwl.core.user.bean; + +/** + * 个人主页 背景, 用户资料弹窗卡片背景 + */ +public class UserBgVO { + public String pic; + public String effect; + public int effectType; + + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java b/core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java new file mode 100644 index 0000000..46ece12 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserCPListBean.java @@ -0,0 +1,20 @@ +package com.chwl.core.user.bean; + +public class UserCPListBean { + + public long uid; + public int cpLevel; + public int relationNameType; + public int clickFlag; + public int maxCpLevel; + public long cpDay; + public String cpAvatar; + public String cpNick; + public long cpUid; + public long startExp; //起始值 + public long endExp; + public long currentExp; + public String avatar; + public String nick; + public long cancelGoldNum; +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java new file mode 100644 index 0000000..1e9395c --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserDetailInfo.java @@ -0,0 +1,518 @@ +package com.chwl.core.user.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.game_team.UserGameTeamInfo; + +import java.io.Serializable; +import java.util.List; + +public class UserDetailInfo implements Serializable { + + + /** + * code : 200 + * message : success + * data : {"uid":935007,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_01),"erbanNo":8072455,"fansNum":5,"userLevelVo":{"experAmount":1647,"charmAmount":182,"experUrl":"http://image.doudouyue.com/wealth_06.png","charmUrl":"http://image.doudouyue.com/charm_02.png","experLevelName":"Lv6","charmLevelName":"Lv2","experLevelGrp":"","charmLevelGrp":"","experLevelSeq":6,"charmLevelSeq":2},"userGiftWall":[{"uid":935007,"giftPrice":100,"giftId":1362,"giftName":ResUtil.getString(R.string.user_bean_userdetailinfo_02),"picUrl":"http://image.doudouyuyin.com/FutM6ydZBdAn6Iz_ro7mgen1Cmph?imageslim","reciveCount":152}],"dynamicInfo":[{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_03),"likeCount":1,"commentCount":2,"dynamicId":1339,"publishTime":1587726740000,"playCount":0,"type":2,"dynamicResList":[{"id":950,"resUrl":"https://image.zhongjialx.com/FhWRCGNLYybra8--ItDfuN3lpCIX?imageslim","resDuration":0,"format":"jpeg","width":2000,"height":1500}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_04),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_05),"likeCount":1,"commentCount":1,"dynamicId":1337,"publishTime":1587726053000,"playCount":0,"type":2,"dynamicResList":[{"id":948,"resUrl":"https://image.zhongjialx.com/FhwRh_iAaqRkgsOZdHK3n3TM75Zq?imageslim","resDuration":0,"format":"jpeg","width":2000,"height":1500}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_06),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_07),"likeCount":1,"commentCount":1,"dynamicId":1330,"publishTime":1587721604000,"playCount":0,"type":2,"dynamicResList":[{"id":947,"resUrl":"https://image.zhongjialx.com/FpthMLmgrkDHfEatTBKb0h05mnXj?imageslim","resDuration":0,"format":"jpeg","width":1080,"height":1672}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_08),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_09),"likeCount":1,"commentCount":3,"dynamicId":1329,"publishTime":1587720609000,"playCount":0,"type":2,"dynamicResList":[{"id":946,"resUrl":"https://image.zhongjialx.com/FtV48sdlmrKkc69OSft43J-S7wDk?imageslim","resDuration":0,"format":"png","width":1080,"height":1920}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_010),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_011),"likeCount":5,"commentCount":7,"dynamicId":1327,"publishTime":1587711821000,"playCount":0,"type":2,"dynamicResList":[{"id":938,"resUrl":"https://image.zhongjialx.com/FgInE7evjBy8lL33uHkmvORMlC1_?imageslim","resDuration":0,"format":"jpeg","width":1296,"height":1728}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_012),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"}],"privatePhoto":[{"photoUrl":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim","seqNo":0}]} + */ + + private int code; + private String message; + private DataBean data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public static class DataBean { + /** + * uid : 935007 + * nick : 大幽魂上衣 + * erbanNo : 8072455 + * fansNum : 5 + * userLevelVo : {"experAmount":1647,"charmAmount":182,"experUrl":"http://image.doudouyue.com/wealth_06.png","charmUrl":"http://image.doudouyue.com/charm_02.png","experLevelName":"Lv6","charmLevelName":"Lv2","experLevelGrp":"","charmLevelGrp":"","experLevelSeq":6,"charmLevelSeq":2} + * userGiftWall : [{"uid":935007,"giftPrice":100,"giftId":1362,"giftName":ResUtil.getString(R.string.user_bean_userdetailinfo_013),"picUrl":"http://image.doudouyuyin.com/FutM6ydZBdAn6Iz_ro7mgen1Cmph?imageslim","reciveCount":152}] + * dynamicInfo : [{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_014),"likeCount":1,"commentCount":2,"dynamicId":1339,"publishTime":1587726740000,"playCount":0,"type":2,"dynamicResList":[{"id":950,"resUrl":"https://image.zhongjialx.com/FhWRCGNLYybra8--ItDfuN3lpCIX?imageslim","resDuration":0,"format":"jpeg","width":2000,"height":1500}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_015),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_016),"likeCount":1,"commentCount":1,"dynamicId":1337,"publishTime":1587726053000,"playCount":0,"type":2,"dynamicResList":[{"id":948,"resUrl":"https://image.zhongjialx.com/FhwRh_iAaqRkgsOZdHK3n3TM75Zq?imageslim","resDuration":0,"format":"jpeg","width":2000,"height":1500}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_017),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_018),"likeCount":1,"commentCount":1,"dynamicId":1330,"publishTime":1587721604000,"playCount":0,"type":2,"dynamicResList":[{"id":947,"resUrl":"https://image.zhongjialx.com/FpthMLmgrkDHfEatTBKb0h05mnXj?imageslim","resDuration":0,"format":"jpeg","width":1080,"height":1672}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_019),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_020),"likeCount":1,"commentCount":3,"dynamicId":1329,"publishTime":1587720609000,"playCount":0,"type":2,"dynamicResList":[{"id":946,"resUrl":"https://image.zhongjialx.com/FtV48sdlmrKkc69OSft43J-S7wDk?imageslim","resDuration":0,"format":"png","width":1080,"height":1920}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_021),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"},{"uid":935007,"worldId":-1,"content":ResUtil.getString(R.string.user_bean_userdetailinfo_022),"likeCount":5,"commentCount":7,"dynamicId":1327,"publishTime":1587711821000,"playCount":0,"type":2,"dynamicResList":[{"id":938,"resUrl":"https://image.zhongjialx.com/FgInE7evjBy8lL33uHkmvORMlC1_?imageslim","resDuration":0,"format":"jpeg","width":1296,"height":1728}],"status":1,"isLike":false,"nick":ResUtil.getString(R.string.user_bean_userdetailinfo_023),"avatar":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim"}] + * privatePhoto : [{"photoUrl":"https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim","seqNo":0}] + * isReview boolean + */ + + private int uid; + private String nick; + private String avatar; + private int erbanNo; + private int fansNum; + private long birth; + private long roomUid; + private String roomTitle; + private UserLevelVoBean userLevelVo; + private List userGiftWall; + private List userLuckyBagGiftWall; + private List dynamicInfo; + private List privatePhoto; + private String nameplatePic; + private String nameplateWord; + private String region; + private UserDetailMedalInfo medals; + private List userGamePartner; + private RelationUserVO relationUserVO; + private GuildInfo guildInfo; + private List userNameplateList; + + private UserBgVO usingPersonalBackground; + private int uploadGifAvatarPrice = -1; + + public int getUploadGifAvatarPrice() { + return uploadGifAvatarPrice; + } + + public void setUploadGifAvatarPrice(int uploadGifAvatarPrice) { + this.uploadGifAvatarPrice = uploadGifAvatarPrice; + } + + public UserBgVO getUsingPersonalBackground() { + return usingPersonalBackground; + } + + public void setUsingPersonalBackground(UserBgVO usingPersonalBackground) { + this.usingPersonalBackground = usingPersonalBackground; + } + + public List getUserNameplateList() { + return userNameplateList; + } + + public void setUserNameplateList(List userNameplateList) { + this.userNameplateList = userNameplateList; + } + + public GuildInfo getGuildInfo() { + return guildInfo; + } + + public void setGuildInfo(GuildInfo guildInfo) { + this.guildInfo = guildInfo; + } + + public RelationUserVO getRelationUserVO() { + return relationUserVO; + } + + public void setRelationUserVO(RelationUserVO relationUserVO) { + this.relationUserVO = relationUserVO; + } + + public List getUserGamePartner() { + return userGamePartner; + } + + public void setUserGamePartner(List userGamePartner) { + this.userGamePartner = userGamePartner; + } + + public String getRegion() { + return region; + } + + public void setRegion(String region) { + this.region = region; + } + + public long getRoomUid() { + return roomUid; + } + + public void setRoomUid(long roomUid) { + this.roomUid = roomUid; + } + + public String getRoomTitle() { + return roomTitle; + } + + public void setRoomTitle(String roomTitle) { + this.roomTitle = roomTitle; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNameplatePic() { + return nameplatePic; + } + + public void setNameplatePic(String nameplatePic) { + this.nameplatePic = nameplatePic; + } + + public String getNameplateWord() { + return nameplateWord; + } + + public void setNameplateWord(String nameplateWord) { + this.nameplateWord = nameplateWord; + } + + public long getBirth() { + return birth; + } + + public void setBirth(long birth) { + this.birth = birth; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public int getErbanNo() { + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public int getFansNum() { + return fansNum; + } + + public void setFansNum(int fansNum) { + this.fansNum = fansNum; + } + + public UserLevelVoBean getUserLevelVo() { + return userLevelVo; + } + + public void setUserLevelVo(UserLevelVoBean userLevelVo) { + this.userLevelVo = userLevelVo; + } + + public List getUserGiftWall() { + return userGiftWall; + } + + public void setUserGiftWall(List userGiftWall) { + this.userGiftWall = userGiftWall; + } + + public List getDynamicInfo() { + return dynamicInfo; + } + + public void setDynamicInfo(List dynamicInfo) { + this.dynamicInfo = dynamicInfo; + } + + public List getPrivatePhoto() { + return privatePhoto; + } + + public void setPrivatePhoto(List privatePhoto) { + this.privatePhoto = privatePhoto; + } + + public UserDetailMedalInfo getMedals() { + return medals; + } + + public void setMedals(UserDetailMedalInfo medals) { + this.medals = medals; + } + + + public List getUserLuckyBagGiftWall() { + return userLuckyBagGiftWall; + } + + public void setUserLuckyBagGiftWall(List userLuckyBagGiftWall) { + this.userLuckyBagGiftWall = userLuckyBagGiftWall; + } + + public static class UserLevelVoBean { + /** + * experAmount : 1647 + * charmAmount : 182 + * experUrl : http://image.doudouyue.com/wealth_06.png + * charmUrl : http://image.doudouyue.com/charm_02.png + * experLevelName : Lv6 + * charmLevelName : Lv2 + * experLevelGrp : + * charmLevelGrp : + * experLevelSeq : 6 + * charmLevelSeq : 2 + */ + + private long experAmount; + private long charmAmount; + private String experUrl; + private String charmUrl; + private String experLevelName; + private String charmLevelName; + private String experLevelGrp; + private String charmLevelGrp; + private int experLevelSeq; + private int charmLevelSeq; + + public long getExperAmount() { + return experAmount; + } + + public void setExperAmount(long experAmount) { + this.experAmount = experAmount; + } + + public long getCharmAmount() { + return charmAmount; + } + + public void setCharmAmount(long charmAmount) { + this.charmAmount = charmAmount; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public String getCharmUrl() { + return charmUrl; + } + + public void setCharmUrl(String charmUrl) { + this.charmUrl = charmUrl; + } + + public String getExperLevelName() { + return experLevelName; + } + + public void setExperLevelName(String experLevelName) { + this.experLevelName = experLevelName; + } + + public String getCharmLevelName() { + return charmLevelName; + } + + public void setCharmLevelName(String charmLevelName) { + this.charmLevelName = charmLevelName; + } + + public String getExperLevelGrp() { + return experLevelGrp; + } + + public void setExperLevelGrp(String experLevelGrp) { + this.experLevelGrp = experLevelGrp; + } + + public String getCharmLevelGrp() { + return charmLevelGrp; + } + + public void setCharmLevelGrp(String charmLevelGrp) { + this.charmLevelGrp = charmLevelGrp; + } + + public int getExperLevelSeq() { + return experLevelSeq; + } + + public void setExperLevelSeq(int experLevelSeq) { + this.experLevelSeq = experLevelSeq; + } + + public int getCharmLevelSeq() { + return charmLevelSeq; + } + + public void setCharmLevelSeq(int charmLevelSeq) { + this.charmLevelSeq = charmLevelSeq; + } + } + + public static class UserGiftWallBean implements MultiItemEntity { + /** + * uid : 935007 + * giftPrice : 100 + * giftId : 1362 + * giftName : 棒棒糖 + * picUrl : http://image.doudouyuyin.com/FutM6ydZBdAn6Iz_ro7mgen1Cmph?imageslim + * reciveCount : 152 + */ + + private int uid; + private int giftPrice; + private int giftId; + private String giftName; + private String picUrl; + private int reciveCount; + public static final int TYPE_EMPTY = 0; + public static final int TYPE_NORMAL = 1; + private int itemType = 1; + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getGiftPrice() { + return giftPrice; + } + + public void setGiftPrice(int giftPrice) { + this.giftPrice = giftPrice; + } + + public int getGiftId() { + return giftId; + } + + public void setGiftId(int giftId) { + this.giftId = giftId; + } + + public String getGiftName() { + return giftName; + } + + public void setGiftName(String giftName) { + this.giftName = giftName; + } + + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + + public int getReciveCount() { + return reciveCount; + } + + public void setReciveCount(int reciveCount) { + this.reciveCount = reciveCount; + } + + public int getItemType() { + return itemType; + } + + public void setItemType(int itemType) { + this.itemType = itemType; + } + } + + public static class PrivatePhotoBean { + /** + * photoUrl : https://image.zhongjialx.com/rotate_picture_1587010848888.jpg?imageslim + * seqNo : 0 + */ + + private String photoUrl; + private int seqNo; + private boolean isReview; + + public String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(String photoUrl) { + this.photoUrl = photoUrl; + } + + public int getSeqNo() { + return seqNo; + } + + public void setSeqNo(int seqNo) { + this.seqNo = seqNo; + } + + public boolean isReview() { + return isReview; + } + + public void setReview(boolean review) { + isReview = review; + } + } + + public static class RelationUserVO { + + public int cpLevel; + public int relationType; //CP = 1; brother = 2;sister = 3; friend = 4; + public int clickFlag; //默认状态0,申请发送后1,申请通过2 + public int cpDay; + public String cpAvatar; + public String cpNick; + public long cpUid; + public long currentExp; + public long nextLevelExp; + public String avatar; + public String nick; + public long startExp; + public long endExp; + + public Boolean showCpAvatar; + public Boolean showCpAnim; + public long cancelGoldNum = 0L; + + } + + public static class GuildInfo{ + public long erbanNo; + public long guildId; + public String avatar; + public String guildName; + + } + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserDetailMedalInfo.kt b/core/src/main/java/com/chwl/core/user/bean/UserDetailMedalInfo.kt new file mode 100644 index 0000000..c1480d2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserDetailMedalInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.user.bean + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class UserDetailMedalInfo : Serializable { + val userMedals: List? = null + val medalCount: Long? = null +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/user/bean/UserGameInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserGameInfo.java new file mode 100644 index 0000000..38bac0c --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserGameInfo.java @@ -0,0 +1,70 @@ +package com.chwl.core.user.bean; + +public class UserGameInfo { + + + /** + * uid : 123 + * gameId : lianliankan + * winCount : 200 + * gamePicture : xxxxx + * first : true + */ + + private int uid; + private String gameId; + private int winCount; + private String gamePicture; + private boolean first; + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public String getGameId() { + return gameId; + } + + public void setGameId(String gameId) { + this.gameId = gameId; + } + + public int getWinCount() { + return winCount; + } + + public void setWinCount(int winCount) { + this.winCount = winCount; + } + + public String getGamePicture() { + return gamePicture; + } + + public void setGamePicture(String gamePicture) { + this.gamePicture = gamePicture; + } + + public boolean isFirst() { + return first; + } + + public void setFirst(boolean first) { + this.first = first; + } + + @Override + public String toString() { + return "UserGameInfo{" + + "uid=" + uid + + ", gameId='" + gameId + '\'' + + ", winCount=" + winCount + + ", gamePicture='" + gamePicture + '\'' + + ", first=" + first + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserInfo.java new file mode 100644 index 0000000..8eba94c --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserInfo.java @@ -0,0 +1,946 @@ +package com.chwl.core.user.bean; + + +import android.graphics.Color; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; + +import androidx.annotation.Nullable; + +import com.chwl.core.decoration.car.bean.CarInfo; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.noble.NobleResourceType; +import com.chwl.core.noble.bean.NobleInfo; +import com.chwl.core.user.UserModel; +import com.chwl.core.vip.bean.UserVipInfo; +import com.chwl.library.common.util.OtherExtKt; +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.realm.annotations.PrimaryKey; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +/** + * Created by chenran on 2017/3/8. + */ +public class UserInfo implements Serializable { + + public static final int USER_STATUS_REVOKED = 2; // 2 表示 用户注销 + + + public static final int USER_TYPE_COMMON = 1; + public static final int USER_TYPE_OFFICIAL = 2; + public static final int USER_TYPE_ROBOT = 3; + + public static final transient int GENDER_MALE = 1; + public static final transient int GENDER_FEMALE = 2; + public static String IS_NEW_USER = "newUser"; + public static String IS_FROM_SAY_HELLO_CHANNEL = "fromSayHelloChannel"; + public static String GENDER = "gender"; + public static String NICK = "nick"; + public static String ENTER_HIDE = "enterHide"; + public static String AVATAR = "avatar"; + public static String IS_OFFICIAL = "official"; + public static String DEF_USER = "defUser"; + public static String HAS_PRETTY = "hasPrettyErbanNo"; + public static String OAC_NAME = "officialAnchorCertificationName"; + public static String OAC_ICON = "officialAnchorCertificationIcon"; + public static String NAMEPLATE_WORD = "inRoomNameplateWord"; + public static String NAMEPLATE_PIC = "inRoomNameplatePic"; + public static String NAMEPLATE_IS_CUSTOM = "isCustomWord"; + public static String VIP_ICON = "vipIcon"; + public static String ENTER_ROOM_EFFECTS = "enterRoomEffects"; + public static String BUBBLE_URL_ANDROID = "androidBubbleUrl"; + public static String BUBBLE_URL_IOS = "iosBubbleUrl"; + public static String AT_UIDS = "atUids"; + public static String AT_NAMES = "atNames"; + + public static String CP_LEVEL = "cp_level"; + public static String PLATFORM_ROLE = "platformRole"; + /** + * PK的时候队伍ID + * GroupType_default = 0,//默认 + * * GroupTyp_red = 1, //蓝队 + * * GroupType_Blue = 2,//红队 + */ + @Getter + @Setter + public int groupType; + @PrimaryKey + private long uid; + //耳伴号 + private long erbanNo; + // 昵称 + private String nick; + //头像 + private String avatar; + //isReview头像是否在审核中 + private boolean isReview; + //新的头像 + private String newAvatar; + //性别 1:男 2:女 0 :未知 + private int gender; + //生日 + private long birth; + //生日日期格式不存数据库 + private String birthStr; + //签名 + private String signture; + //声音展示文件 + private String userVoice; + //声音时间 + private int voiceDura; + + /** + * 声音是否正在播放, RecycleView 记录状态 + */ + @Getter + @Setter + private boolean voicePlaying; + + //关注数 + private long followNum; + //粉丝数 + private long fansNum; + //访客数量 + @Getter + @Setter + private long visitNum; + //进房历史记录数量 + @Getter + @Setter + private long inRoomNum; + //人气值 + private long fortune; + //1普通账号,2官方账号,3机器账号 ,4公会账号 + private int defUser; + //地区 + @Getter + @Setter + private String region; + //个人简介 + private String userDesc; + //个人相册 + private List privatePhoto; + private ArrayList joinWorlds; + //技能卡 + @Getter + @Setter + private List absCardPics; + //cpState + @Getter + @Setter + private int cpState; + @Getter + @Setter + private int registerDay; + /** + * 是否是靓号,1:靓号 + */ + private boolean hasPrettyErbanNo; + /** + * 贵族到期时间 + */ + private int remainDay = -1; + /** + * 贵族信息 + */ + private NobleInfo nobleUsers; + /** + * 等级信息 + */ + @Getter + @Setter + private UserLevelVo userLevelVo; + /** + * 铭牌地址 + */ + @Getter + @Setter + private String nameplatePic; + /** + * 铭牌地址List + */ + @Getter + @Setter + private List userNameplateList; + @Getter + @Setter + private String nameplateWord; + @Getter + @Setter + private boolean isCustomWord; + /** + * 头饰信息 + */ + private HeadWearInfo userHeadwear; + @Getter + @Setter + //区号 + private String phoneAreaCode; + //手机号 + private String phone; + private String email; + //是否绑定手机号 + private boolean isBindPhone; + //是否设置密码 + private boolean isBindPasswd; + //是否设置支付密码 + private boolean isBindPaymentPwd; + //1line2facebook3手机 + private int bindType; + /** + * 模厅ID + */ + private long hallId; + /** + * 判断是否已经实名认证了 + */ + private boolean isCertified; + /** + * 判断是否开启家长模式 + */ + @Getter + @Setter + private boolean parentMode; + /** + * 判断家长是否设置过密码 + */ + @Getter + @Setter + private boolean hasSetParentPwd; + /** + * 位置相关 + */ + private Location userExpand; + + /** + * 是否是官方代充用户 + */ + @Getter + private boolean isRechargeUser; + + /** + * 0-普通用户 1-超管用户 + */ + @Getter + @Setter + private int platformRole; + /** + * 新增参数,是否绑定提现银行卡,true:已绑定,false:未绑定 + */ + @Getter + @Setter + private boolean isBindBankCard; + /** + * 提现绑定卡号密文 + */ + @Getter + @Setter + private String bankCardNum; + /** + * 持卡人姓名 + */ + @Getter + @Setter + private String bankCardName; + /** + * 提现绑定卡号明文 + */ + @Getter + @Setter + private String bankCardNumPlain; + /** + * 官方主播铭牌标识 + */ + @Getter + @Setter + private NamePlate nameplate; + @Getter + @Setter + private String attestationBackPic; + @Getter + @Setter + private String prefillInviteCode; + @Getter + @Setter + private boolean isFirstCharge; + @Getter + @Setter + private int gameStatus; + @Getter + @Setter + private UserVipInfo userVipInfoVO; + @Getter + @Setter + private String userInfoCardPic; + @Getter + @Setter + private String micNickColor; + @Getter + @Setter + private String micCircle; + /** + * 守护榜 + */ + private List userRankList; + /** + * 座驾信息 + */ + @SerializedName("carport") + private CarInfo mCarInfo; + private String familyId; + private boolean newUser; + @Getter + @Setter + private boolean fromSayHelloChannel; + @Getter + @Setter + private LiveTagInfo userInfoSkillVo; + + @Getter + @Setter + private String androidBubbleUrl; + @Getter + @Setter + private String iosBubbleUrl; + + @Getter + @Setter + private boolean showLimitCharge; + @Getter + @Setter + private long limitChargeEndTime; + + @Getter + @Setter + private boolean banAccount; + + /** + * 声音签名 + */ + @Getter + @Setter + private SoundBean audioCard; + + /** + * "用户自己的房间是否牌照房" + */ + @Getter + @Setter + private boolean hasPermitRoom; + + /** + * 标签 + */ + @Getter + @Setter + private List labels; + + private long inRoomUid; + + @Getter + @Setter + public boolean inMic; + + @Getter + @Setter + public boolean inOnline; + + @Getter + @Setter + public long partitionId; + + @Getter + @Setter + public UserBgVO infoCardVo; + + @Getter + @Setter + public boolean hasSuperRole; // 超级管理员 + + @Getter + @Setter + public int regionId; // 国家/地区 id + + @Getter + @Setter + public String guildNameplateIcon; // 公會長銘牌 + + @Getter + @Setter + public int useStatus; // useStatus=2就是注销用户 + + + public UserInfo() { + + } + + public UserInfo(UserInfo userInfo) { + this.uid = userInfo.uid; + this.erbanNo = userInfo.erbanNo; + this.nick = userInfo.nick; + this.avatar = userInfo.avatar; + this.gender = userInfo.gender; + this.birth = userInfo.birth; + this.birthStr = userInfo.birthStr; + this.signture = userInfo.signture; + this.userVoice = userInfo.userVoice; + this.voiceDura = userInfo.voiceDura; + this.followNum = userInfo.followNum; + this.fansNum = userInfo.fansNum; + this.fortune = userInfo.fortune; + this.defUser = userInfo.defUser; + this.region = userInfo.region; + this.userDesc = userInfo.userDesc; + this.privatePhoto = userInfo.privatePhoto; + this.joinWorlds = userInfo.joinWorlds; + this.nobleUsers = userInfo.nobleUsers; + this.hasPrettyErbanNo = userInfo.hasPrettyErbanNo; + this.remainDay = userInfo.remainDay; + this.newUser = userInfo.newUser; + this.phone = userInfo.phone; + this.isBindPhone = userInfo.isBindPhone; + this.bindType = userInfo.bindType; + this.isReview = userInfo.isReview; + this.newAvatar = userInfo.newAvatar; + this.partitionId = userInfo.partitionId; + } + + protected boolean isEnterHide() { + if (userVipInfoVO == null) { + return false; + } + return userVipInfoVO.getEnterHide(); + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Location getUserExpand() { + return userExpand; + } + + public void setUserExpand(Location userExpand) { + this.userExpand = userExpand; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public boolean isBindPhone() { + return isBindPhone; + } + + public void setBindPhone(boolean bindPhone) { + isBindPhone = bindPhone; + } + + public boolean isBindPasswd() { + return isBindPasswd; + } + + public void setBindPasswd(boolean bindPasswd) { + isBindPasswd = bindPasswd; + } + + public boolean isBindPaymentPwd() { + return isBindPaymentPwd; + } + + public void setBindPaymentPwd(boolean bindPaymentPwd) { + isBindPaymentPwd = bindPaymentPwd; + } + + public int getBindType() { + return bindType; + } + + public void setBindType(int bindType) { + this.bindType = bindType; + } + + public boolean isCertified() { + return isCertified; + } + + public void setCertified(boolean certified) { + isCertified = certified; + } + + public List getUserRankList() { + return userRankList; + } + + public void setUserRankList(List userRankList) { + this.userRankList = userRankList; + } + + + public long getUid() { + return uid; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public long getErbanNo() { + return erbanNo; + } + + public void setErbanNo(long erbanNo) { + this.erbanNo = erbanNo; + } + + public String getNick() { + return TextUtils.isEmpty(nick) ? "" : nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public long getBirth() { + return birth; + } + + public void setBirth(long birth) { + this.birth = birth; + } + + public String getBirthStr() { + return birthStr; + } + + public void setBirthStr(String birthStr) { + this.birthStr = birthStr; + } + + + public String getSignture() { + return signture; + } + + public void setSignture(String signture) { + this.signture = signture; + } + + public String getUserVoice() { + return userVoice; + } + + public void setUserVoice(String userVoice) { + this.userVoice = userVoice; + } + + public int getVoiceDura() { + return voiceDura; + } + + public void setVoiceDura(int voiceDura) { + this.voiceDura = voiceDura; + } + + public long getFollowNum() { + return followNum; + } + + public void setFollowNum(long followNum) { + this.followNum = followNum; + } + + public long getFansNum() { + return fansNum; + } + + public void setFansNum(long fansNum) { + this.fansNum = fansNum; + } + + public long getFortune() { + return fortune; + } + + public void setFortune(long fortune) { + this.fortune = fortune; + } + + public int getDefUser() { + return defUser; + } + + public void setDefUser(int defUser) { + this.defUser = defUser; + } + + public String getUserDesc() { + return userDesc; + } + + public void setUserDesc(String userDesc) { + this.userDesc = userDesc; + } + + public List getPrivatePhoto() { + return privatePhoto; + } + + public void setPrivatePhoto(List privatePhoto) { + this.privatePhoto = privatePhoto; + } + + public ArrayList getJoinWorlds() { + return joinWorlds; + } + + public NobleInfo getNobleInfo() { + return nobleUsers; + } + + public void setNobleInfo(NobleInfo nobleInfo) { + this.nobleUsers = nobleInfo; + } + + public NobleInfo getNobleUsers() { + return nobleUsers; + } + + public boolean isHasPrettyErbanNo() { + return hasPrettyErbanNo; + } + + public void setHasPrettyErbanNo(boolean hasPrettyErbanNo) { + this.hasPrettyErbanNo = hasPrettyErbanNo; + } + + public int getRemainDay() { + return remainDay; + } + + public void setRemainDay(int remainDay) { + this.remainDay = remainDay; + } + + public String getNewAvatar() { + return newAvatar; + } + + public void setNewAvatar(String newAvatar) { + this.newAvatar = newAvatar; + } + + public boolean isReview() { + return isReview; + } + + public void setReview(boolean review) { + isReview = review; + } + + public CarInfo getCarInfo() { + return mCarInfo; + } + + public void setCarInfo(CarInfo carInfo) { + mCarInfo = carInfo; + } + + public boolean isNewUser() { + return newUser; + } + + public void setNewUser(boolean newUser) { + this.newUser = newUser; + } + + public HeadWearInfo getUserHeadwear() { + return userHeadwear; + } + + public void setUserHeadwear(HeadWearInfo userHeadwear) { + this.userHeadwear = userHeadwear; + } + + public long getInRoomUid() { + return inRoomUid; + } + + public void setInRoomUid(long inRoomUid) { + this.inRoomUid = inRoomUid; + } + + //用户是否注销 + public boolean isRevoked() { + return useStatus == USER_STATUS_REVOKED; + } + + public Map toMap(@Nullable Map map, UserInfo userInfo) { + if (map == null) { + map = new HashMap<>(); + } + map.put(NICK, userInfo.getNick()); + map.put(AVATAR, userInfo.getAvatar()); + map.put(GENDER, userInfo.getGender()); + map.put(IS_OFFICIAL, userInfo.getDefUser() == USER_TYPE_OFFICIAL); + map.put(IS_NEW_USER, isNewUser()); + map.put(IS_FROM_SAY_HELLO_CHANNEL, isFromSayHelloChannel()); + map.put(DEF_USER, userInfo.getDefUser()); + map.put(HAS_PRETTY, userInfo.isHasPrettyErbanNo()); + map.put(PLATFORM_ROLE, userInfo.getPlatformRole()); + + // 官方认证文本,图标 + if (userInfo.getNameplate() != null) { + map.put(OAC_NAME, userInfo.getNameplate().getFixedWord()); + map.put(OAC_ICON, userInfo.getNameplate().getIconPic()); + } else { + map.put(OAC_NAME, ""); + map.put(OAC_ICON, ""); + } + + UserVipInfo userVipInfo = userInfo.getUserVipInfoVO(); + if (userVipInfo != null && !TextUtils.isEmpty(userVipInfo.getVipIcon())) { + map.put(VIP_ICON, userVipInfo.getNameplateUrl()); + map.put(NobleResourceType.KEY_ENTER_HIDE, userVipInfo.getEnterHide()); + if (!TextUtils.isEmpty(userVipInfo.getEnterRoomEffects())) { + map.put(ENTER_ROOM_EFFECTS, userVipInfo.getEnterRoomEffects()); + } + } + + if (!TextUtils.isEmpty(androidBubbleUrl)) { + map.put(BUBBLE_URL_ANDROID, androidBubbleUrl); + } + + if (!TextUtils.isEmpty(iosBubbleUrl)) { + map.put(BUBBLE_URL_IOS, iosBubbleUrl); + } + + UserDetailInfo userDetailInfo = UserModel.get().getCacheLoginUserDetailInfo(); + if (userDetailInfo != null && userDetailInfo.getData() != null && userDetailInfo.getData().getRelationUserVO() != null) { + map.put(CP_LEVEL, userDetailInfo.getData().getRelationUserVO().cpLevel); + } + + + return map; + } + + /** + * 根据id移除 已退出/已解散 的话题 + */ + public void removeWorld(int worldId) { + if (joinWorlds != null) { + for (JoinWorldInfo joinWorldInfo : joinWorlds) { + if (joinWorldInfo.getWorldId() == worldId) { + joinWorlds.remove(joinWorldInfo); + break; + } + } + } + } + + /** + * 判断是否为官方账号 + * + * @return + */ + public boolean isOfficial() { + return getDefUser() == USER_TYPE_OFFICIAL; + } + + public String getFamilyId() { + return familyId; + } + + public void setFamilyId(String familyId) { + this.familyId = familyId; + } + + @Override + public String toString() { + return "UserInfo{" + + "uid=" + uid + + ", erbanNo=" + erbanNo + + ", nick='" + nick + '\'' + + ", avatar='" + avatar + '\'' + + ", gender=" + gender + + ", birth=" + birth + + ", birthStr='" + birthStr + '\'' + + ", signture='" + signture + '\'' + + ", userVoice='" + userVoice + '\'' + + ", voiceDura=" + voiceDura + + ", followNum=" + followNum + + ", fansNum=" + fansNum + + ", fortune=" + fortune + + ", defUser=" + defUser + + ", region='" + region + '\'' + + ", userDesc='" + userDesc + '\'' + + ", privatePhoto=" + privatePhoto + + ", hasPrettyErbanNo=" + hasPrettyErbanNo + + ", remainDay=" + remainDay + + ", nobleUsers=" + nobleUsers + + ", userLevelVo=" + userLevelVo + + ", userHeadwear=" + userHeadwear + + ", mCarInfo=" + mCarInfo + + ", newUser=" + newUser + + '}'; + } + + public long getHallId() { + return hallId; + } + + public void setHallId(long hallId) { + this.hallId = hallId; + } + + /** + * 靓号变色 + * + * @param defColor 非靓号颜色 + */ + public SpannableString getNick(int defColor) { + + if (TextUtils.isEmpty(nick)) + return new SpannableString(""); + + SpannableString spannableString = new SpannableString(nick); + + if (hasPrettyErbanNo) { + ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#EB5335")); + spannableString.setSpan(colorSpan, 0, nick.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + ForegroundColorSpan colorSpan = new ForegroundColorSpan(defColor); + spannableString.setSpan(colorSpan, 0, nick.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + + return spannableString; + } + + public boolean isSuperAdmin() { + return platformRole == 1; + } + + @Data + public static class Location { + + + /** + * id : 4 + * uid : 909785 + * longitude : 113.387654 + * latitude : 23.126857 + * provinceCode : 440000 + * cityCode : 440100 + * createTime : 1560927504000 + * updateTime : 1561343473000 + */ + + private int id; + private int uid; + private double longitude; + private double latitude; + private int provinceCode; + private int cityCode; + private long createTime; + private long updateTime; + /** + * 是否显示地址位置 + */ + private boolean showLocation; + private boolean showAge; + private boolean matchChat; + /** + * 省 + */ + private String provinceName; + + /** + * 市 + */ + private String cityName; + + /** + * 详细地址 + */ + private String address; + /** + * 系统消息是否提醒,true:提醒 + */ + private boolean sysMsgNotify; + + /** + * 互动消息通知,true:提醒 + */ + private boolean interactiveMsgNotify = true; + + private boolean singleBroadcastMsgNotify; + } + + /** + * 官方主播认证铭牌 + */ + @Data + public static class NamePlate { + private long id; + private String iconPic; + private String fixedWord; + + public String getFixedWord() { + OtherExtKt.doLog(" getFixedWord = "+fixedWord); + return fixedWord; + } + + public void setFixedWord(String fixedWord) { + this.fixedWord = fixedWord; + } + } + + /** + * 声音签名 + */ + @Data + public static class SoundBean implements Serializable { + private long uid; + private String audioUrl;//音频七牛云url + private Integer second;//时间 + private Integer status;//(0=初始状态,1=审核中, 2=审核通过,3=审核不通过,4=被下架) + } + +} + diff --git a/core/src/main/java/com/chwl/core/user/bean/UserInfoSkillEntity.kt b/core/src/main/java/com/chwl/core/user/bean/UserInfoSkillEntity.kt new file mode 100644 index 0000000..9fe929d --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserInfoSkillEntity.kt @@ -0,0 +1,26 @@ +package com.chwl.core.user.bean + +/** + * { +"code": 0, +"data": [ +{ +"colorType": 0, +"icon": "string", +"id": 0, +"name": "string", +"propVals": [ +"string" +] +} +], +"message": "string" +} + */ +data class UserInfoSkillEntity( + val cardId: Int, + val icon: String?, + val id: Int, + val name: String, + val propVals: List +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/user/bean/UserLabelInfo.kt b/core/src/main/java/com/chwl/core/user/bean/UserLabelInfo.kt new file mode 100644 index 0000000..6fbc3b2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserLabelInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.user.bean + +import lombok.Data +import java.io.Serializable + +@Data +data class UserLabelInfo( + val groups: List? = null, + val labels: List? = null, + val meLabels: List? = null +) : Serializable + + diff --git a/core/src/main/java/com/chwl/core/user/bean/UserLabelItemInfo.kt b/core/src/main/java/com/chwl/core/user/bean/UserLabelItemInfo.kt new file mode 100644 index 0000000..87716f6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserLabelItemInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.user.bean + +import lombok.Data +import java.io.Serializable + +@Data +data class UserLabelItemInfo( + val group: String = "", + val label: String = "", + var picked: Boolean = false +) : Serializable + + diff --git a/core/src/main/java/com/chwl/core/user/bean/UserMineInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserMineInfo.java new file mode 100644 index 0000000..7c8b648 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserMineInfo.java @@ -0,0 +1,43 @@ +package com.chwl.core.user.bean; + +import lombok.Data; + +@Data +public class UserMineInfo { + public int friendCount; + public int browseNum; + public int browseNumTip; + public int visitListVipLimit; + + public int getFriendCount() { + return friendCount; + } + + public void setFriendCount(int friendCount) { + this.friendCount = friendCount; + } + + public int getBrowseNum() { + return browseNum; + } + + public void setBrowseNum(int browseNum) { + this.browseNum = browseNum; + } + + public int getBrowseNumTip() { + return browseNumTip; + } + + public void setBrowseNumTip(int browseNumTip) { + this.browseNumTip = browseNumTip; + } + + public int getVisitListVipLimit() { + return visitListVipLimit; + } + + public void setVisitListVipLimit(int visitListVipLimit) { + this.visitListVipLimit = visitListVipLimit; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserPhoto.java b/core/src/main/java/com/chwl/core/user/bean/UserPhoto.java new file mode 100644 index 0000000..ec63c95 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserPhoto.java @@ -0,0 +1,42 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +import io.realm.annotations.PrimaryKey; + +/** + * Created by chenran on 2017/7/25. + */ + +public class UserPhoto implements Serializable { + + @PrimaryKey + private long pid; + //图片地址 + private String photoUrl; + + + public long getPid() { + return pid; + } + + public void setPid(long pid) { + this.pid = pid; + } + + public String getPhotoUrl() { + return photoUrl; + } + + public void setPhotoUrl(String photoUrl) { + this.photoUrl = photoUrl; + } + + @Override + public String toString() { + return "UserPhoto{" + + "pid=" + pid + + ", photoUrl='" + photoUrl + '\'' + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserRandomConfig.java b/core/src/main/java/com/chwl/core/user/bean/UserRandomConfig.java new file mode 100644 index 0000000..b1a0a7a --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserRandomConfig.java @@ -0,0 +1,15 @@ +package com.chwl.core.user.bean; + +import lombok.Data; + +/** + * create by lvzebiao @2020/3/20 + */ +@Data +public class UserRandomConfig { + + private boolean nick; + + private boolean avatar; + +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserRankInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserRankInfo.java new file mode 100644 index 0000000..ecd0c52 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserRankInfo.java @@ -0,0 +1,122 @@ +package com.chwl.core.user.bean; + +import java.io.Serializable; + +/** + * Created by huangmeng1 on 2018/5/17. + */ + +public class UserRankInfo implements Serializable { + /** + * uid : 90004936 + * erbanNo : 5110456 + * nick : 小星星 + * avatar : https://img.letusmix.com/FgBAxWIm-XHjZtwam6baf3Ns07RQ?imageslim + * gender : 2 + * experSeq : 6 + * experUrl : https://img.letusmix.com/ul_6.png + * charmSeq : 0 + * goldAmount : 1464 + * ranking : 1 + */ + + private int uid; + private int erbanNo; + private String nick; + private String avatar; + private int gender; + private int experSeq; + private String experUrl; + private int charmSeq; + private int goldAmount; + private int ranking; + private String rankingType; + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public String getRankingType() { + return rankingType; + } + + public void setRankingType(String rankingType) { + this.rankingType = rankingType; + } + + public int getErbanNo() { + + return erbanNo; + } + + public void setErbanNo(int erbanNo) { + this.erbanNo = erbanNo; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getGender() { + return gender; + } + + public void setGender(int gender) { + this.gender = gender; + } + + public int getExperSeq() { + return experSeq; + } + + public void setExperSeq(int experSeq) { + this.experSeq = experSeq; + } + + public String getExperUrl() { + return experUrl; + } + + public void setExperUrl(String experUrl) { + this.experUrl = experUrl; + } + + public int getCharmSeq() { + return charmSeq; + } + + public void setCharmSeq(int charmSeq) { + this.charmSeq = charmSeq; + } + + public int getGoldAmount() { + return goldAmount; + } + + public void setGoldAmount(int goldAmount) { + this.goldAmount = goldAmount; + } + + public int getRanking() { + return ranking; + } + + public void setRanking(int ranking) { + this.ranking = ranking; + } +} diff --git a/core/src/main/java/com/chwl/core/user/bean/UserRecommendRoomInfo.java b/core/src/main/java/com/chwl/core/user/bean/UserRecommendRoomInfo.java new file mode 100644 index 0000000..9c92fac --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/bean/UserRecommendRoomInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.user.bean; + +import lombok.Data; + +/** + * @author jack + * @Description 用户导流 - 用户完善信息后 获得导流去的房间信息 + * @Date 2018/7/9 + */ +@Data +public class UserRecommendRoomInfo { + private long recommendRoomUid; +} diff --git a/core/src/main/java/com/chwl/core/user/event/BravoCoinAnimEvent.java b/core/src/main/java/com/chwl/core/user/event/BravoCoinAnimEvent.java new file mode 100644 index 0000000..73b6d3f --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/BravoCoinAnimEvent.java @@ -0,0 +1,12 @@ +package com.chwl.core.user.event; + +import com.chwl.core.gift.bean.BravoGiftRewardBean; + +/** + * @author jack + * @Description 超级礼物 主播动画事件 + * @Date 2018/11/30 + */ +public class BravoCoinAnimEvent { + public BravoGiftRewardBean data; +} diff --git a/core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteEvent.java b/core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteEvent.java new file mode 100644 index 0000000..6a03225 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.user.event; + +/** + * 补全资料成功的事件,一般来说,这个事件,整个用户周期只会触发一次 + * 区分{@link LoadLoginUserInfoEvent} 这个事件是每次启动成功都会触发 + */ +public class CurrentUserInfoCompleteEvent { + +} diff --git a/core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteFailEvent.java b/core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteFailEvent.java new file mode 100644 index 0000000..bc0c87b --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/CurrentUserInfoCompleteFailEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.user.event; + + +public class CurrentUserInfoCompleteFailEvent { + public String errorMsg; + + public CurrentUserInfoCompleteFailEvent(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/core/src/main/java/com/chwl/core/user/event/LoadLoginUserInfoEvent.java b/core/src/main/java/com/chwl/core/user/event/LoadLoginUserInfoEvent.java new file mode 100644 index 0000000..d51e425 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/LoadLoginUserInfoEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.user.event; + +/** + * @author jack + * @Description + * @Date 2018/11/22 + */ +public class LoadLoginUserInfoEvent { +} diff --git a/core/src/main/java/com/chwl/core/user/event/LoginUserInfoUpdateEvent.java b/core/src/main/java/com/chwl/core/user/event/LoginUserInfoUpdateEvent.java new file mode 100644 index 0000000..f08b9c6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/LoginUserInfoUpdateEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.user.event; + +/** + * @author jack + * @Description 当前登陆的用户信息新事件 + * @Date 2018/11/30 + */ +public class LoginUserInfoUpdateEvent { +} diff --git a/core/src/main/java/com/chwl/core/user/event/NeedBindPhoneEvent.java b/core/src/main/java/com/chwl/core/user/event/NeedBindPhoneEvent.java new file mode 100644 index 0000000..8aa35cd --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/NeedBindPhoneEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.user.event; + +/** + * 需要绑定手机号 + * Created by lvzebiao on 2020/2/27. + */ +public class NeedBindPhoneEvent { +} diff --git a/core/src/main/java/com/chwl/core/user/event/NeedCompleteInfoEvent.java b/core/src/main/java/com/chwl/core/user/event/NeedCompleteInfoEvent.java new file mode 100644 index 0000000..c3b0352 --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/NeedCompleteInfoEvent.java @@ -0,0 +1,8 @@ +package com.chwl.core.user.event; + +/** + * create by lvzebiao on 2018/8/31 + */ +public class NeedCompleteInfoEvent { + +} diff --git a/core/src/main/java/com/chwl/core/user/event/ShowMeEvent.kt b/core/src/main/java/com/chwl/core/user/event/ShowMeEvent.kt new file mode 100644 index 0000000..2ff6e7c --- /dev/null +++ b/core/src/main/java/com/chwl/core/user/event/ShowMeEvent.kt @@ -0,0 +1,3 @@ +package com.chwl.core.user.event + +class ShowMeEvent diff --git a/core/src/main/java/com/chwl/core/utils/APIEncryptUtil.java b/core/src/main/java/com/chwl/core/utils/APIEncryptUtil.java new file mode 100644 index 0000000..6c8cd0c --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/APIEncryptUtil.java @@ -0,0 +1,123 @@ +package com.chwl.core.utils; + +import com.chwl.core.XConstants; +import com.chwl.library.utils.codec.MD5Utils; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author jack + * @Description + * @Date 2018/5/4 + */ + +public class APIEncryptUtil { + private static final String DES_ENCRYPT_KEY_SMS_PARAMS = XConstants.DES_ENCRYPT_KEY_SMS_PARAMS; + private static final String DES_ENCRYPT_KEY_SMS_SIGN = XConstants.DES_ENCRYPT_KEY_SMS_SIGN; + + +// /** +// * 参数加密 +// * @param params +// * @return +// * @throws Exception +// */ +// public static String encryptParams(Map params) throws Exception{ +// String json = new Gson().toJson(params); +// return DESUtils.DESAndBase64Encrypt(json,DES_ENCRYPT_KEY_SMS_PARAMS); +// } + + /** + * 生成签名 + * @param params + * @return + * @throws Exception + */ + public static String paramsToSign(Map params) throws Exception{ + String sign = formatUrlMap(params,false,false)+"&key="+DES_ENCRYPT_KEY_SMS_PARAMS; +// Log.e("APIEncryptUtil", "timestamp:"+params.get("timestamp") + " sign : " + sign); + return MD5Utils.getMD5String(sign).toUpperCase(); + //return DESUtils.DESAndBase64Encrypt(sign, DES_ENCRYPT_KEY_SMS_SIGN).toUpperCase(); + } + + + /** + * + * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串
+ * 实现步骤:
+ * + * @param paraMap 要排序的Map对象 + * @param urlEncode 是否需要URLENCODE + * @param keyToLower 是否需要将Key转换为全小写 true:key 转化成小写,false:不转化 + * @return + */ + public static String formatUrlMap(Map paraMap, boolean urlEncode, boolean keyToLower) { + String buff = ""; + try { + List> infoIds = new ArrayList>(paraMap.entrySet()); + // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) + Collections.sort(infoIds, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + return (o1.getKey()).toString().compareTo(o2.getKey()); + } + }); + // 构造URL 键值对的格式 + StringBuilder buf = new StringBuilder(); + for (Map.Entry item : infoIds) { + if (com.chwl.library.utils.StringUtils.isNotBlank(item.getKey())) { + String key = item.getKey(); + String val = item.getValue(); + if (urlEncode) { + val = URLEncoder.encode(val, "utf-8"); + } + if (keyToLower) { + buf.append(key.toLowerCase() + "=" + val); + } else { + buf.append(key + "=" + val); + } + buf.append("&"); + } + + } + buff = buf.toString(); + if (buff.isEmpty() == false) { + buff = buff.substring(0, buff.length() - 1); + } + } catch (Exception e) { + return null; + } + return buff; + } + + + /** + * 把组装在url 上面的参数字符串 转成 map + * 例子: + * uid=91459&pageSize=10&pageNo=1 -> map + * @param paramStr + */ + public static Map urlEncodeToMap(String paramStr){ + Map paramsMap = new HashMap<>(); + if (paramStr == null || paramStr.length() == 0) + return paramsMap; + String[] kvs = paramStr.split("&"); + for (int i = 0; i < kvs.length; i++) { + String tmp = kvs[i]; + paramsMap.put(tmp.substring(0, tmp.indexOf("=") - 1), tmp.substring(tmp.indexOf("=") + 1, tmp.length())); + + } + return paramsMap; + } + + public static String cutUrlParamStr(String url){ + return url.substring(url.indexOf("?") + 1, url.length()); + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/ActivityUtil.java b/core/src/main/java/com/chwl/core/utils/ActivityUtil.java new file mode 100644 index 0000000..55198f8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/ActivityUtil.java @@ -0,0 +1,48 @@ +package com.chwl.core.utils; + +import android.app.Activity; +import android.content.Context; +import android.view.WindowManager; + +import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; + +/** + * Created by lvzebiao on 2019/2/27. + */ + +public class ActivityUtil { + + public static boolean isValidContext(Context context) { + return context != null && context instanceof Activity && !((Activity) context).isFinishing() && !((Activity) context).isDestroyed(); + } + + public static void addAlpha(Context context, float alpha) { + if (context instanceof Activity) { + WindowManager.LayoutParams params = ((Activity) context).getWindow().getAttributes(); + params.alpha = alpha; + ((Activity) context).getWindow().setAttributes(params); + } + } + + public static void removeAlpha(Context context) { + if (context instanceof Activity) { + WindowManager.LayoutParams params = ((Activity) context).getWindow().getAttributes(); + params.alpha = 1f; + ((Activity) context).getWindow().setAttributes(params); + } + } + + /** + * RxAppCompatActivity类型才弹窗 + * 尝试修复异常 + * java.lang.IllegalStateException: + * You need to use a Theme.AppCompat theme (or descendant) with this activity. + * + * @param context + * @return + */ + public static boolean isCanShowAppCompatDialog(Context context) { + return isValidContext(context) && (context instanceof RxAppCompatActivity); + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/AsyncTaskScanMusicFile.java b/core/src/main/java/com/chwl/core/utils/AsyncTaskScanMusicFile.java new file mode 100644 index 0000000..f5aad1a --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/AsyncTaskScanMusicFile.java @@ -0,0 +1,351 @@ +package com.chwl.core.utils; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.media.MediaScannerConnection; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Environment; +import android.provider.MediaStore; + +import com.chwl.core.R; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.db.model.LocalMusicDbModel; +import com.chwl.library.common.file.FileHelper; +import com.chwl.library.utils.BlankUtil; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.file.BasicFileUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CountDownLatch; + +public class AsyncTaskScanMusicFile extends AsyncTask> { + + private Context mContext; + private int minAudioDuration; + + private String[] projections; + private Uri audioUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + + private List localSongs = new ArrayList<>(); + private ScanMediaCallback mCallback; + private List donwloadPaths; + + private final String AUDIO_SUFFIX_MP3 = ".mp3"; +// private final String AUDIO_SUFFIX_AAC = ".aac"; +// private final String AUDIO_SUFFIX_3GP = ".3gp"; +// private final String AUDIO_SUFFIX_WAV = ".wav"; +// private final String AUDIO_SUFFIX_FLAC = ".flac"; +// private final String AUDIO_SUFFIX_M4A = ".m4a"; + + private float percent; + private float previousNotifyPercent;//上次通知的进度 + private final float minPercentInterval = .02f; + + private List lastScannedSongs;//上一次扫描到的歌曲 + + private Set countDowns;//等待所有扫描到的文件都添加媒体库完成 + + public AsyncTaskScanMusicFile(Context mContext) { + this.mContext = mContext; + this.countDowns = new HashSet<>(); + initProjections(); + } + + public AsyncTaskScanMusicFile(Context context, int minAudioDuration) { + this(context); + this.minAudioDuration = minAudioDuration; + } + + public AsyncTaskScanMusicFile(Context context, int minAudioDuration, ScanMediaCallback callback) { + this(context, minAudioDuration); + mCallback = callback; + } + + public void setLastScannedSongs(List lastScannedSongs) { + this.lastScannedSongs = lastScannedSongs; + } + + @Override + protected Set doInBackground(Context... params) { + percent = 0f; + previousNotifyPercent = 0f; + + String filePath = ""; + for (int i=0; i 0) { + for (int j = 0; j < files.length; j++) { + String path = files[j].getAbsolutePath(); + if (AUDIO_SUFFIX_MP3.equals(BasicFileUtils.getFileExt(path)) + ) { + addToMediaDb(path); + } + } + } + } + } + + try { + for (CountDownLatch latch : countDowns) { + latch.await(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + + publishProgress(new Progress(100, "", localSongs.size())); + + +// BasicFileUtils.scanFileSystem(new BasicFileUtils.ScannedFileCallback() { +// @Override +// public void onScanned(String filePath, float weightOfTotalFile) { +// //1.加入到媒体库 +// if (AUDIO_SUFFIX_MP3.equals(BasicFileUtils.getFileExt(filePath)) +//// || AUDIO_SUFFIX_AAC.equals(BasicFileUtils.getFileExt(filePath)) +//// || AUDIO_SUFFIX_3GP.equals(BasicFileUtils.getFileExt(filePath)) +//// || AUDIO_SUFFIX_WAV.equals(BasicFileUtils.getFileExt(filePath)) +//// || AUDIO_SUFFIX_M4A.equals(BasicFileUtils.getFileExt(filePath)) +//// || AUDIO_SUFFIX_FLAC.equals(BasicFileUtils.getFileExt(filePath)) +// ) { +// addToMediaDb(filePath); +// } +// percent += weightOfTotalFile; +// notifyProgress(filePath); +// } +// }); +// try { +// for (CountDownLatch latch : countDowns) { +// latch.await(); +// } +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// publishProgress(new Progress(100, "", localSongs.size())); + + return null; + } + + @Override + protected void onProgressUpdate(Progress... values) { + super.onProgressUpdate(values); +// if (mCallback != null) { +// mCallback.onProgress((int) values[0].getPercent(), values[0].getMessage(), values[0].getTotal()); +// } + } + + @Override + protected void onPostExecute(Set dirs) { + saveLocalSongsToDb(); + if (mCallback != null) { + mCallback.onComplete(true); + } + } + + private void notifyProgress(String filePath) { + if (isFitInterval()) { + previousNotifyPercent = percent; + publishProgress(new Progress(percent, filePath, localSongs.size())); + } + } + + /** + * 每次通知百分比 间隔是否适合 + * + * @return + */ + private boolean isFitInterval() { + return percent - previousNotifyPercent > minPercentInterval; + } + + private void addToMediaDb(final String filePath) { + LocalMusicBean song = findInLastSongs(filePath); + + if (song != null) { + addLocalSongToSongsList(song); + notifyProgress(filePath); + } else { + final CountDownLatch latch = new CountDownLatch(1); + countDowns.add(latch); + MediaScannerConnection.scanFile(mContext, new String[]{filePath}, new String[]{AUDIO_SUFFIX_MP3}, + new MediaScannerConnection.OnScanCompletedListener() { + @Override + public void onScanCompleted(String path, Uri uri) { + if (uri != null) { + LocalMusicBean song = getLocalSongFromUri(uri); + addLocalSongToSongsList(song); + notifyProgress(filePath); + latch.countDown(); + } + } + }); + } + } + + private LocalMusicBean findInLastSongs(String filePath) { + if (BlankUtil.isBlank(lastScannedSongs)) { + return null; + } + for (LocalMusicBean song : lastScannedSongs) { + if (song != null && song.getLocalUri() != null + && song.getLocalUri().equals(filePath)){ + return song; + } + } + return null; + } + + private void closeCursor(Cursor mCursor) { + if (mCursor != null && !mCursor.isClosed()) { + mCursor.close(); + } + } + + /** + * 获取本地扫描音乐信息 + * + * @param audioIdUri 音频ID URI + * + * @return + */ + private LocalMusicBean getLocalSongFromUri(Uri audioIdUri) { + if (isAudioUri(audioIdUri)) { + ContentResolver contentResolver = mContext.getContentResolver(); + + Cursor mCursor = contentResolver.query(audioIdUri, projections, null, null, null); + if (mCursor != null && mCursor.moveToFirst()) { + LocalMusicBean localSongInfo = getLocalSong(mCursor); + closeCursor(mCursor); + return localSongInfo; + } + closeCursor(mCursor); + } + return null; + } + + private boolean isAudioUri(Uri audioIdUri) { + if (audioIdUri == null) { + return false; + } + return audioIdUri.getPath().contains(audioUri.getPath()); + } + + /** + * 增加到本地音乐 + */ + private synchronized boolean addLocalSongToSongsList(LocalMusicBean songInfo) { + if (songInfo != null && songInfo.getDuration() > minAudioDuration) { + localSongs.add(songInfo); + return true; + } + return false; + } + + private void initProjections() { + projections = new String[]{ + MediaStore.Audio.Media.TITLE, + MediaStore.Audio.Media.ARTIST, + MediaStore.Audio.Media.ALBUM, + MediaStore.Audio.Media.DURATION, + MediaStore.Audio.Media.YEAR, + MediaStore.Audio.Media.DATA, + MediaStore.Audio.Media._ID}; + + String rootPath = FileHelper.getRootFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + "/"; + donwloadPaths = new ArrayList<>(); + donwloadPaths.add(rootPath+"kgmusic/download/");//酷狗目录 + donwloadPaths.add(rootPath+"qqmusic/song/");//qq音乐 + donwloadPaths.add(rootPath+"netease/cloudmusic/Music/");//网易云音乐 + donwloadPaths.add(rootPath+"KuwoMusic/music/");//酷我音乐 + donwloadPaths.add(rootPath+"xiami/audios/");//虾米音乐 + donwloadPaths.add(rootPath+"Baidu_music/download/");//百度音乐 + donwloadPaths.add(rootPath+"Music/");//媒体库 + donwloadPaths.add(rootPath+"MIUI/music/mp3/");//媒体库 + donwloadPaths.add(rootPath+"Smartisan/music/cloud/");//媒体库 + donwloadPaths.add(rootPath+"Music/Download/");//媒体库 + donwloadPaths.add(rootPath+"Samsung/Music/Download/");//媒体库 + donwloadPaths.add(rootPath+ResUtil.getString(R.string.xchat_android_core_utils_asynctaskscanmusicfile_01));//媒体库 + } + + private void saveLocalSongsToDb() { + LocalMusicDbModel.getInstance() + .batchAddToDB(localSongs) + .blockingGet(); + } + + /** + * 获取本地音乐 + */ + private LocalMusicBean getLocalSong(Cursor cursor) { + LocalMusicBean song = new LocalMusicBean(); + song.setSongName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE))); + song.setYear(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.YEAR))); + song.setAlbumName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM))); + song.setDuration(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)));//与服务端统一精度 精确到毫秒 + + song.setArtistName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST))); + song.setLocalUri(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA))); + song.setLocalId(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID))); + song.setSongId(SongUtils.generateThirdPartyId()); + + int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));// 歌曲的id + Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); + song.setUri(uri.toString()); + + return song; + } + + /** + * 扫描音乐回调 + */ + public interface ScanMediaCallback { + /** + * 扫描进度通知 + * + * @param progress 0-100 扫描百分比 + * @param message 扫描信息,一般为扫描的文件名 + * @param size 扫描歌曲数量 + */ + public void onProgress(int progress, String message, int size); + + /** + * 扫描完成通知 + * + * @param result 扫描结果是否成功 true成功 + */ + public void onComplete(boolean result); + } + + public static class Progress { + private float percent; + private String message; + private int total; + + public Progress(float percent, String message, int total) { + this.percent = percent; + this.message = message; + this.total = total; + } + + public float getPercent() { + return percent; + } + + public String getMessage() { + return message; + } + + public int getTotal() { + return total; + } + } +} diff --git a/core/src/main/java/com/chwl/core/utils/BitmapUtils.java b/core/src/main/java/com/chwl/core/utils/BitmapUtils.java new file mode 100644 index 0000000..9c35578 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/BitmapUtils.java @@ -0,0 +1,128 @@ +package com.chwl.core.utils; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.Log; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author Rowand jj + *ѹ��ͼƬ�Ĺ����� + */ +public final class BitmapUtils +{ + /** + * Ĭ�ϲ����� + */ + private static final int DEFAULT_SAMPLE_SIZE = 1; + private static final String TAG = "BitmapUtils"; + + /** + * ���ݲ�����ѹ��ͼƬ + */ + public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) + { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + BitmapFactory.decodeResource(res, resId,opts); + opts.inSampleSize = caclulateInSampleSize(opts, reqWidth, reqHeight); + opts.inJustDecodeBounds = false; + return BitmapFactory.decodeResource(res, resId, opts); + } + /** + * ��decodeSampledBitmapFromResource������ͬ����ȡbitmap�ķ�ʽ��ͬ + */ + public static Bitmap decodeSampledBitmapFromFile(String pathName, int reqWidth, int reqHeight) + { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + BitmapFactory.decodeFile(pathName, opts); + opts.inSampleSize = caclulateInSampleSize(opts, reqWidth, reqHeight); + opts.inJustDecodeBounds = false; + Log.i(TAG,"OPTS = "+opts.inSampleSize); + return BitmapFactory.decodeFile(pathName, opts); + } + /** + * ��decodeSampledBitmapFromResource������ͬ����ȡbitmap�ķ�ʽ��ͬ + */ + public static Bitmap decodeSampledBitmapFromByteArray(byte[] data, int reqWidth, int reqHeight) + { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + BitmapFactory.decodeByteArray(data, 0, data.length, opts); + opts.inSampleSize = caclulateInSampleSize(opts, reqWidth, reqHeight); + opts.inJustDecodeBounds = false; + return BitmapFactory.decodeByteArray(data, 0, data.length, opts); + } + /** + * ���������ε���decodeStream,�ڶ��ε���InptutStreamʱ��ָ���Ѿ�ָ��ĩβ��. + * @return + */ + public static Bitmap decodeSampledBitmapFromStream(InputStream in, int reqWidth, int reqHeight) + { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + byte[] data = null; + try + { + int len = 0; + byte[] buf = new byte[1024]; + while((len = in.read(buf)) != -1) + { + bout.write(buf, 0, len); + } + data = bout.toByteArray(); + } catch (IOException e) + { + e.printStackTrace(); + } + return decodeSampledBitmapFromByteArray(data, reqWidth, reqHeight); + } + + + /** + * ��������� + */ + private static int caclulateInSampleSize(BitmapFactory.Options opts, int reqWidth, int reqHeight) + { + if(opts == null) + return DEFAULT_SAMPLE_SIZE; + int width = opts.outWidth; + int height = opts.outHeight; + int sampleSize = DEFAULT_SAMPLE_SIZE; + if(width > reqWidth || height > reqHeight) + { + int widthRatio = (int) (width/(float)reqWidth); + int heightRatio = (int) (height/(float)reqHeight); + + sampleSize = (widthRatio > heightRatio) ? heightRatio : widthRatio; + } + return sampleSize; + } +} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/java/com/chwl/core/utils/CheckUtils.java b/core/src/main/java/com/chwl/core/utils/CheckUtils.java new file mode 100644 index 0000000..6a019ee --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/CheckUtils.java @@ -0,0 +1,15 @@ +package com.chwl.core.utils; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.initial.InitialModel; +import com.chwl.core.initial.bean.InitInfo; +import com.chwl.library.utils.ListUtils; + +public class CheckUtils { + + public static boolean isCheckUser() { + InitInfo initInfo = InitialModel.get().getCacheInitInfo(); + if (initInfo == null || ListUtils.isListEmpty(initInfo.getCheckUids())) return false; + return initInfo.getCheckUids().contains(AuthModel.get().getCurrentUid()); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/ComboUtil.kt b/core/src/main/java/com/chwl/core/utils/ComboUtil.kt new file mode 100644 index 0000000..d479d9a --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/ComboUtil.kt @@ -0,0 +1,31 @@ +package com.chwl.core.utils + +import android.graphics.Point +import android.view.View +import com.chwl.library.utils.ScreenUtils +import com.example.lib_utils.UiUtils.isRtl + +object ComboUtil { + var comboCount = 1 + var point = Point(0,0) + fun setPoint(child: View) { + if (point.x>0 || point.y>0) return + val density: Float = child.context.resources.displayMetrics.density + val giftWidth = (80 * density + 0.5).toInt() + val location = IntArray(2) + + child.getLocationInWindow(location) + val x: Int + if (isRtl(child.context)) { + location[0] = ScreenUtils.getScreenWidth(child.context) - location[0] + x = (location[0] - child.width / 2) - giftWidth / 2 + } else { + x = (location[0] + child.width / 2) - giftWidth / 2 + } + val y = (location[1] + child.height / 2) - giftWidth / 3 + point = Point(x, y) + LogUtils.d("ComboUtil x= $x y= $y") + } + + fun isChangePoint() = comboCount > 1 +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/CoreLogger.java b/core/src/main/java/com/chwl/core/utils/CoreLogger.java new file mode 100644 index 0000000..37cf1ac --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/CoreLogger.java @@ -0,0 +1,719 @@ +/** + * Log类。可以直接使用静态函数 + * 也可以用某个tag生成一个logger对象 + * 使用前需要先调用init初始化 + * 内部使用android的Log类实现,并支持写入文件 + */ +package com.chwl.core.utils; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import com.chwl.library.utils.StringUtils; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.log.MLog; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; + + +/** + * @author daixiang + * + */ +@SuppressLint("SimpleDateFormat") +public class CoreLogger { + + public enum LogLevel { + Verbose, + Debug, + Info, + Warn, + Error + } + + // 写log文件策略 + public enum LogFilePolicy { + NoLogFile, // 不写文件 + PerDay, // 一天只产生一个log文件 + PerLaunch // 每次运行均产生一个log文件 + } + + public static class LogConfig { + public String dir; // log文件目录,绝对路径 + public LogFilePolicy policy; + public LogLevel outputLevel; // 输出级别,大于等于此级别的log才会输出 + public LogLevel fileLevel; // 输出到文件的级别,大于等于此级别的log才会写入文件 + public int fileFlushCount; // 每次累计log超过此条数时,会检查是否需要flush log文件 + public int fileFlushInterval; // 定时每隔一定秒数检查是否需要flush log文件 + public int fileFlushMinInterval; // 距离上次flush最少需要多少秒 + + public LogConfig() { + policy = LogFilePolicy.PerLaunch; + outputLevel = LogLevel.Verbose; + fileLevel = LogLevel.Info; + fileFlushCount = 10; + fileFlushInterval = 60; + fileFlushMinInterval = 10; + } + public LogConfig(LogConfig cfg) { + this.dir = cfg.dir; + this.policy = cfg.policy; + this.outputLevel = cfg.outputLevel; + this.fileLevel = cfg.fileLevel; + this.fileFlushCount = cfg.fileFlushCount; + this.fileFlushInterval = cfg.fileFlushInterval; + this.fileFlushMinInterval = cfg.fileFlushMinInterval; + } + } + + + private static ConcurrentHashMap loggers = new ConcurrentHashMap(); +// private static Context context; + private static LoggerThread loggerThread; // 用于在另一个线程写log文件 + + private static LogConfig config = new LogConfig(); + // 写文件线程未准备好的时候,将可以写入文件的log先缓存起来 + private static List logList = Collections.synchronizedList(new ArrayList()); + + private String myTag; + + private CoreLogger(String tag) { + myTag = tag; + } + + public String getTag() { + return myTag; + } + +// public static void init(Context ctx) { +// +// LogConfig cfg = new LogConfig(); +// if (ctx != null) { +// File f = ctx.getExternalCacheDir(); +// if (f != null +// && Environment.getExternalStorageState().equals( +// Environment.MEDIA_MOUNTED)) { +// Log.i("Logger", "cache dir = " + f.getAbsolutePath()); +// cfg.dir = f.getAbsolutePath() + "/logs"; +// } else { +// Log.i("Logger", "no extenal storage available"); +// f = ctx.getCacheDir(); +// if (f != null) { +// cfg.dir = f.getAbsolutePath() + "/logs"; +// } +// } +// } +// cfg.policy = LogFilePolicy.PerLaunch; +// cfg.outputLevel = LogLevel.Verbose; +// cfg.fileLevel = LogLevel.Info; +// +// Logger.init(ctx, cfg); +// } + + /** + * 使用Logger之前,必须先init + * @param cfg + */ + public static void init(LogConfig cfg) { + +// context = ctx; + info("Logger", "init Logger"); + config = new LogConfig(cfg); + +// if (config.policy != LogFilePolicy.NoLogFile && loggerThread == null) { +// loggerThread = new LoggerThread("LoggerThread", config); +// loggerThread.start(); +// } + + initMLog(config); + } + + public static void initMLog(LogConfig cfg) { + if (cfg.policy != LogFilePolicy.NoLogFile) { + String logDir = cfg.dir; + MLog.LogOptions options = new MLog.LogOptions(); + if (BasicConfig.INSTANCE.isDebuggable()) { + options.logLevel = MLog.LogOptions.LEVEL_VERBOSE; + } else { + options.logLevel = MLog.LogOptions.LEVEL_INFO; + } + options.honorVerbose = false; + options.logFileName = "logs.txt"; + MLog.initialize(logDir, options); + MLog.info("Logger", "init MLog, logFilePath = " + logDir + File.separator + options.logFileName); + } + } + + public static CoreLogger getLogger(String tag) { + if (StringUtils.isEmpty(tag)) { + tag = "Default"; + } + CoreLogger coreLogger; + try { + coreLogger = loggers.get(tag); + if (coreLogger == null) { + coreLogger = new CoreLogger(tag); + loggers.put(tag, coreLogger); + } + } catch (Exception e) { + MLog.error("Logger", "getLogger error! " + e); + coreLogger = new CoreLogger(tag); + } + + return coreLogger; + } + + public static CoreLogger getLogger(Class cls) { + if (cls == null) { + return CoreLogger.getLogger(""); + } + +// String className = cls.getName(); +// String tag = className.substring(className.lastIndexOf(".") + 1); + return CoreLogger.getLogger(cls.getSimpleName()); + } + + private static boolean isLoggable(LogLevel level) { + return level.compareTo(config.outputLevel) >= 0; + } + + private static String levelToString(LogLevel level) { + String str = ""; + switch (level) { + case Debug: + str = "Debug"; + break; + case Error: + str = "Error"; + break; + case Info: + str = "Info"; + break; + case Verbose: + str = "Verbose"; + break; + case Warn: + str = "Warn"; + break; + default: + str = "Debug"; + break; + } + return str; + } + + public static String getLogFilePath() { + if (loggerThread != null) { + return loggerThread.getFilePath(); + } else { + return null; + } + } + + private static void logToFile(String tag, LogLevel level, String message, Throwable t) { + + if (config.policy != LogFilePolicy.NoLogFile) { + if (loggerThread == null || !loggerThread.isReady()) { + // 文件线程未准备好,先缓存 + logList.add(LoggerThread.getFormattedString(tag, level, message)); + } else { + loggerThread.logToFile(tag, level, message, t); + } + } + } + + public static void log(String tag, LogLevel level, String message) { + if (CoreLogger.isLoggable(level)) { + message = msgForTextLog(tag, message); + switch (level) { + case Debug: +// Log.d(tag, message); + MLog.debugWithoutLineNumber(tag, message); + break; + case Error: +// Log.e(tag, message); + MLog.errorWithoutLineNumber(tag, message); + break; + case Info: +// Log.i(tag, message); + MLog.infoWithoutLineNumber(tag, message); + break; + case Verbose: +// Log.v(tag, message); + MLog.verboseWithoutLineNumber(tag, message); + break; + case Warn: +// Log.w(tag, message); + MLog.warnWithoutLineNumber(tag, message); + break; + default: +// Log.d(tag, message); + MLog.debugWithoutLineNumber(tag, message); + break; + } +// logToFile(tag, level, message, null); + } + } + + private static void logError(String tag, String msg, Throwable tr) { + if (CoreLogger.isLoggable(LogLevel.Error)) { +// msg = msgForTextLog(tag, msg); + if (tr == null) { +// Log.e(tag, msg); + MLog.error(tag, msg); + } else { +// Log.e(tag, msg, tr); + MLog.error(tag, msg, tr); + } +// logToFile(tag, LogLevel.Error, msg, tr); + } + } + +// public static void log(String tag, LogLevel level, String message, Throwable throwable) { +// switch (level) { +// case Debug: +// Log.d(tag, message, throwable); +// break; +// case Error: +// Log.e(tag, message, throwable); +// break; +// case Info: +// Log.i(tag, message, throwable); +// break; +// case Verbose: +// Log.v(tag, message, throwable); +// break; +// case Warn: +// Log.v(tag, message, throwable); +// break; +// default: +// Log.d(tag, message, throwable); +// break; +// } +// } + + private static String msgForTextLog(String tag, String message) { + if (message == null) { + message = "null"; + } + int line = -1; + String filename = null; + if (Thread.currentThread().getStackTrace().length > 4) { + line = Thread.currentThread().getStackTrace()[4].getLineNumber(); + filename = Thread.currentThread().getStackTrace()[4].getFileName(); + } + StringBuilder sb = new StringBuilder(); + sb.append("["); + sb.append(tag); + sb.append("] "); + sb.append(message); + sb.append("(P:"); + sb.append(android.os.Process.myPid()); + sb.append(")"); + sb.append("(T:"); + if (Looper.getMainLooper() == Looper.myLooper()) + sb.append("Main&"); + else + sb.append(Thread.currentThread().getId()); + sb.append(")"); +// sb.append("(C:"); +// sb.append(tag); +// sb.append(")"); + if (filename != null) { + sb.append(" at ("); + sb.append(filename); + } + if (line > 0) { + sb.append(":"); + sb.append(line); + sb.append(")"); + } + return sb.toString(); + } + + public static void verbose(String tag, String message) { +// message = msgForTextLog(tag, message); + CoreLogger.log(tag, LogLevel.Verbose, message); + } + + public static void debug(String tag, String message) { +// message = msgForTextLog(tag, message); + CoreLogger.log(tag, LogLevel.Debug, message); + } + + public static void info(String tag, String message) { +// message = msgForTextLog(tag, message); + CoreLogger.log(tag, LogLevel.Info, message); + } + + public static void warn(String tag, String message) { +// message = msgForTextLog(tag, message); + CoreLogger.log(tag, LogLevel.Warn, message); + } + + public static void error(String tag, String message) { +// message = msgForTextLog(tag, message); + CoreLogger.log(tag, LogLevel.Error, message); + } + + public static void error(String tag, String message, Throwable throwable) { +// message = msgForTextLog(tag, message); + CoreLogger.logError(tag, message, throwable); + } + + public void verbose(String message) { + CoreLogger.verbose(myTag, message); +// message = msgForTextLog(myTag, message); +// MLog.verboseWithoutLineNumber(myTag, message); + } + + public void debug(String message) { + CoreLogger.debug(myTag, message); +// message = msgForTextLog(myTag, message); +// MLog.debugWithoutLineNumber(myTag, message); + } + + public void info(String message) { + CoreLogger.info(myTag, message); +// message = msgForTextLog(myTag, message); +// MLog.infoWithoutLineNumber(myTag, message); + } + + public void warn(String message) { + CoreLogger.warn(myTag, message); +// message = msgForTextLog(myTag, message); +// MLog.warnWithoutLineNumber(myTag, message); + } + + public void error(String message) { + CoreLogger.error(myTag, message); +// message = msgForTextLog(myTag, message); +// MLog.errorWithoutLineNumber(myTag, message); + } + + public void error(String message, Throwable throwable) { + CoreLogger.logError(myTag, message, throwable); +// message = msgForTextLog(myTag, message); +// MLog.errorWithoutLineNumber(myTag, message, throwable); + } + + public static void onTerminate() { + if (loggerThread != null) { + loggerThread.sendFlush(); + } + } + +// private static class SdkLogger implements ILog { +// +// @Override +// public void verbose(String tag, String msg) { +// +// Logger.verbose(tag, msg); +// } +// +// @Override +// public void debug(String tag, String msg) { +// +// Logger.debug(tag, msg); +// } +// +// @Override +// public void info(String tag, String msg) { +// +// Logger.info(tag, msg); +// } +// +// @Override +// public void warn(String tag, String msg) { +// +// Logger.warn(tag, msg); +// } +// +// @Override +// public void error(String tag, String msg) { +// +// Logger.error(tag, msg); +// } +// +// @Override +// public void error(String tag, String msg, Throwable t) { +// Logger.error(tag, msg, t); +// } +// +// } + + /** + * 用于写log文件的线程 + * @author daixiang + * + */ + private static class LoggerThread extends Thread { + + private static final int LogMessageType = 0; + private static final int TimerMessageType = 1; + private static final int LogThrowableType = 2; + private static final int FlushLog = 3; + + private LogThreadHandler handler; // 使用此handler将log消息发到此线程处理 + private LogConfig config; + private String filePath; + private boolean isReady = false; + + public LoggerThread(String name, LogConfig cfg) { + super(name); + config = cfg; + } + + public boolean isReady() { + return isReady; + } + + private static String getFormattedString(String tag, LogLevel level, String msg) { + + String thread = (Looper.getMainLooper() == Looper.myLooper()) ? "[Main]" + : ("[" + Thread.currentThread().getId() + "]"); + String strLevel = "[" + CoreLogger.levelToString(level) + "]"; + String logMsg = thread + "[" + tag + "]" + strLevel + " " + msg; + return logMsg; + } + + public void logToFile(String tag, LogLevel level, String msg, Throwable t) { + if ((config.policy != LogFilePolicy.NoLogFile) + && (level.compareTo(config.fileLevel) >= 0) + && (handler != null)) { + + String logMsg = getFormattedString(tag, level, msg); + + Message threadMessage = null; + if (t == null) { + threadMessage = handler.obtainMessage(LogMessageType); + threadMessage.obj = logMsg; + } else { + threadMessage = handler.obtainMessage(LogThrowableType); + threadMessage.obj = logMsg; + Bundle b = new Bundle(); + b.putSerializable("throwable", t); + threadMessage.setData(b); + } + + if (threadMessage != null) { + handler.sendMessage(threadMessage); + } + } + } + + public void sendFlush() { + if (handler != null) { + handler.sendEmptyMessage(FlushLog); + } + } + +// public void logToFile(String tag, LogLevel level, String msg) { +// logToFile(tag, level, msg, null); +// } + + public String getFilePath() { + return filePath; + } + + public void run() { + + Looper.prepare(); + + File logDir = new File(config.dir); + if (!logDir.exists()) { + CoreLogger.info("Logger", "create log dir: " + logDir.getAbsolutePath()); + logDir.mkdirs(); + } + + SimpleDateFormat f; + if (config.policy == LogFilePolicy.PerLaunch) { + f = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS"); + } else { + f = new SimpleDateFormat("yyyy-MM-dd"); + } + + filePath = config.dir + "/" + f.format(new Date()) + ".log"; + CoreLogger.info("Logger", "log file name: " + filePath); + + handler = new LogThreadHandler(this); + isReady = true; + + // 将之前缓存的log先写入文件 + List list = new ArrayList(logList); + try { + if (list.size() > 0) { + CoreLogger.debug("Logger", "write logs before logger thread ready to file: " + list.size()); + for (String s : list) { + handler.writeLine(s); + } + handler.flush(true); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + logList.clear(); + list.clear(); + list = null; + + Looper.loop(); + } + + private static class LogThreadHandler extends Handler { + + private SimpleDateFormat dateFormat; + private BufferedWriter writer; + private LoggerThread loggerThread; + private int logCounter; + private long lastFlushTime; + + private void writeLine(String formattedStr) throws IOException { + if (writer != null) { + writer.write(dateFormat.format(new Date()) + " " + formattedStr); + writer.newLine(); + } + } + + public LogThreadHandler(LoggerThread thread) { + loggerThread = thread; + dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + boolean append; + if (loggerThread.config.policy == LogFilePolicy.PerLaunch) { + append = false; + + } else { + append = true; + } + + try { + FileWriter fw = new FileWriter(loggerThread.filePath, append); + writer = new BufferedWriter(fw); + if (loggerThread.config.policy == LogFilePolicy.PerDay) { + writer.newLine(); + } +// writer.write(dateFormat.format(new Date()) + " " + loggerThread.getFormattedString("Logger", loggerThread.config.fileLevel, "---------------------Log Begin---------------------")); +// writer.newLine(); + + // 在文件开头加入一个易于识别的行 + writeLine(getFormattedString("Logger", loggerThread.config.fileLevel, "---------------------Log Begin---------------------")); + flush(true); + } catch (IOException e) { + writer = null; + e.printStackTrace(); + } + + if (writer != null && loggerThread.config.fileFlushInterval > 0) { + long time = loggerThread.config.fileFlushInterval * 1000; + new Timer().schedule(new TimerTask() { + + @Override + public void run() { + Message msg = obtainMessage(TimerMessageType); + sendMessage(msg); + } + }, time, time); + } + } + + public void flush(boolean force) throws IOException { + if (writer != null) { + + long now = System.currentTimeMillis(); + // 不要太频繁flush,最低间隔 + if ((now - lastFlushTime) > (loggerThread.config.fileFlushMinInterval * 1000)) { + writer.flush(); + lastFlushTime = System.currentTimeMillis(); + logCounter = 0; + } else { + logCounter++; + } + } + + } + + public void flushIfNeeded() throws IOException { + if (logCounter > loggerThread.config.fileFlushCount) { + flush(false); + } else { + logCounter++; + } + } + + @Override + public void handleMessage(Message msg) { + + if (writer == null) { + return; + } + + try { + switch (msg.what) { + + case LogMessageType: + { +// String str = dateFormat.format(new Date()) + " " +// + msg.obj; +// writer.write(str); +// writer.newLine(); + writeLine((String)msg.obj); + flushIfNeeded(); + break; + } + case LogThrowableType: + { +// String str = dateFormat.format(new Date()) + " " +// + msg.obj; +// writer.write(str); +// writer.newLine(); + writeLine((String)msg.obj); + Bundle data = msg.getData(); + if (data != null) { + Throwable t = (Throwable) data + .getSerializable("throwable"); + if (t != null) { + PrintWriter pw = new PrintWriter(writer); + t.printStackTrace(pw); + //pw.close(); // 不能close,否则内部的bufferedwriter也会被close! + writer.newLine(); + flush(true); // 异常,立刻flush + } else { + flushIfNeeded(); + } + } else { + flushIfNeeded(); + } + break; + } + case TimerMessageType: + flush(false); + break; + case FlushLog: + flush(true); + break; + default: + break; + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } +} diff --git a/core/src/main/java/com/chwl/core/utils/CoreTextUtils.java b/core/src/main/java/com/chwl/core/utils/CoreTextUtils.java new file mode 100644 index 0000000..57396ec --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/CoreTextUtils.java @@ -0,0 +1,96 @@ +package com.chwl.core.utils; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; + +public class CoreTextUtils { + + public static SpannableString textTwoColors(String firContent, String secContent, int firColor, int secColor) { + SpannableString spannableString = new SpannableString(firContent + secContent); + spannableString.setSpan(new ForegroundColorSpan(firColor), 0, firContent.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + spannableString.setSpan(new ForegroundColorSpan(secColor), firContent.length(), firContent.length() + secContent.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + return spannableString; + } + + /** + * 复制文本到粘贴板 + * + * @param text text + */ + public static void copyTextToClipboard(Context context, String text) { + try { + //获取剪贴板管理器: + ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + // 创建普通字符型ClipData + ClipData mClipData = ClipData.newPlainText(null, text); + // 将ClipData内容放到系统剪贴板里。 + if (cm != null) { + cm.setPrimaryClip(mClipData); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * + */ + public static String getClipboardFirstText(Context context) { + //获取剪贴板管理器: + try { + ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData data = cm.getPrimaryClip(); + if (data != null && data.getItemCount() > 0) { + ClipData.Item firstItem = data.getItemAt(0); + if (firstItem != null && firstItem.getText() != null) { + return firstItem.getText().toString(); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + public static void clearClipboard(Context context) { + try { + ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + if (cm != null) { + ClipData data = cm.getPrimaryClip(); + if (data != null && data.getItemCount() > 0) { + ClipData.Item firstItem = data.getItemAt(0); + if (firstItem != null && firstItem.getText() != null) { + String text = firstItem.getText().toString(); + if (!android.text.TextUtils.isEmpty(text)) { + cm.setPrimaryClip(ClipData.newPlainText(null, "")); + } + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + } + + /** + * 判断是不是都是空白字符,比如空格,换行 + * @param text - + * @return - + */ + public static boolean isEmptyText(String text) { + if (android.text.TextUtils.isEmpty(text)) { + return true; + } + String newText = text.replaceAll("\n", ""); + newText = newText.trim(); + return android.text.TextUtils.isEmpty(newText); + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/CurrentTimeUtils.java b/core/src/main/java/com/chwl/core/utils/CurrentTimeUtils.java new file mode 100644 index 0000000..e4152cc --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/CurrentTimeUtils.java @@ -0,0 +1,15 @@ +package com.chwl.core.utils; + +public class CurrentTimeUtils { + + private static long offsetTime; + + public static void initTime(long currentTime) { + if (currentTime == 0) return; + offsetTime = System.currentTimeMillis() - currentTime; + } + + public static long getCurrentTime() { + return System.currentTimeMillis() - offsetTime; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/DialogUtil.kt b/core/src/main/java/com/chwl/core/utils/DialogUtil.kt new file mode 100644 index 0000000..6db8f93 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/DialogUtil.kt @@ -0,0 +1,32 @@ +package com.chwl.core.utils + +import android.app.Activity +import com.chwl.core.R +import com.chwl.library.common.util.SPUtils +import com.chwl.library.constants.ConstantsLib +import com.chwl.library.utils.ResUtil +import com.example.lib_utils.AppUtils +import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper + +object DialogUtil { + + fun getDialog(activity: Activity, listener:EasyAlertDialogHelper.OnDialogActionListener){ + if (!SPUtils.getBoolean(ConstantsLib.Key.Permissions_Img, false)) { + val dialog = EasyAlertDialogHelper.createOkCancelDiolag( + activity, + null, + ResUtil.getString( + R.string.dialot_permission_tips, + ResUtil.getString(R.string.app_name) + ), + ResUtil.getString(R.string.Allow), + ResUtil.getString(R.string.No), + true, + listener + ) + dialog.show() + } else { + listener.doOkAction() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/DirectoryHelper.java b/core/src/main/java/com/chwl/core/utils/DirectoryHelper.java new file mode 100644 index 0000000..acd938b --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/DirectoryHelper.java @@ -0,0 +1,75 @@ +package com.chwl.core.utils; + +import static android.os.Environment.MEDIA_MOUNTED; + +import android.content.Context; +import android.os.Environment; + +import com.chwl.core.Constants; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.file.StorageUtils; + +import java.io.File; + +/** + * 一个目录的使用工具 + * create by lvzebiao @2019/11/19 + */ +public class DirectoryHelper { + + private static final class Helper { + public static final DirectoryHelper INSTANCE = new DirectoryHelper(); + } + + public static DirectoryHelper get() { + return Helper.INSTANCE; + } + + private File dynamicDir; + /**App相册位置*/ + private File appAlbumDir; + + public static File createDir(String imageDir) { + try { + File dir = StorageUtils.getExternalStorageDirectory(BasicConfig.INSTANCE.getAppContext(), + imageDir); + if (!dir.exists()) { + dir.mkdirs(); + } + return dir; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public File getDynamicDir() { + if (dynamicDir == null) { + dynamicDir = createDir(Constants.DYNAMIC_CACHE_DIR); + } + return dynamicDir; + } + + public File getAppAlubmDir() { + if (appAlbumDir == null) { + Context context = BasicConfig.INSTANCE.getAppContext(); + if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) + && StorageUtils.hasExternalStoragePermission(context)) { + appAlbumDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + } + if (appAlbumDir == null) { + appAlbumDir = context.getCacheDir(); + } + + if (!appAlbumDir.exists()) { + appAlbumDir.mkdirs(); + } + if (!appAlbumDir.exists()) { + appAlbumDir = null; + return null; + } + } + return appAlbumDir; + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/ExtensionUtil.java b/core/src/main/java/com/chwl/core/utils/ExtensionUtil.java new file mode 100644 index 0000000..3fd4337 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/ExtensionUtil.java @@ -0,0 +1,172 @@ +package com.chwl.core.utils; + +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.im.custom.bean.FaceAttachment; +import com.chwl.core.im.custom.bean.RoomTipAttachment; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ExtensionUtil { + + /** + * 获取房间内的ext字段 + * + * @param chatRoomMessage 聊天室内的信息 + * @param account 想要获取的对应用户的ext账号 + * @return ext + */ + public static Map getExtension(ChatRoomMessage chatRoomMessage, String account) { + Object o = null; + // 本地的ext字段 + if (chatRoomMessage.getLocalExtension() != null && chatRoomMessage.getLocalExtension().get(account) != null) { + o = chatRoomMessage.getLocalExtension().get(account); + } + // 别人发送过来的ext字段 + if (o == null && + chatRoomMessage.getRemoteExtension() != null && + chatRoomMessage.getRemoteExtension().get(account) != null) { + o = chatRoomMessage.getRemoteExtension().get(account); + } + // 默认的云信发送过来的ext字段 + if (o == null && + chatRoomMessage.getChatRoomMessageExtension() != null && + chatRoomMessage.getChatRoomMessageExtension().getSenderExtension() != null && + chatRoomMessage.getChatRoomMessageExtension().getSenderExtension().get(account) != null) { + o = chatRoomMessage.getChatRoomMessageExtension().getSenderExtension().get(account); + } + return o == null ? null : (Map) o; + } + + /** + * 获取房间内的ext字段 + * + * @param chatRoomMessage 聊天室内的信息 + * @param key + * @return ext + */ + public static List getListExtension(ChatRoomMessage chatRoomMessage, String key) { + Object o = null; + // 本地的ext字段 + if (chatRoomMessage.getLocalExtension() != null && chatRoomMessage.getLocalExtension().get(key) != null) { + o = chatRoomMessage.getLocalExtension().get(key); + } + // 别人发送过来的ext字段 + if (o == null && + chatRoomMessage.getRemoteExtension() != null && + chatRoomMessage.getRemoteExtension().get(key) != null) { + o = chatRoomMessage.getRemoteExtension().get(key); + } + // 默认的云信发送过来的ext字段 + if (o == null && + chatRoomMessage.getChatRoomMessageExtension() != null && + chatRoomMessage.getChatRoomMessageExtension().getSenderExtension() != null && + chatRoomMessage.getChatRoomMessageExtension().getSenderExtension().get(key) != null) { + o = chatRoomMessage.getChatRoomMessageExtension().getSenderExtension().get(key); + } + return (o instanceof List) ? (List) o : null; + } + + public static String getAccount(ChatRoomMessage chatRoomMessage) throws NullPointerException { + String account; + if (chatRoomMessage.getMsgType() == MsgTypeEnum.tip) { + account = chatRoomMessage.getFromAccount(); + } else if (chatRoomMessage.getMsgType() == MsgTypeEnum.text) { + account = chatRoomMessage.getFromAccount(); + } else if (chatRoomMessage.getMsgType() == MsgTypeEnum.notification) { + account = chatRoomMessage.getFromAccount(); + } else if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) { + CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment(); + if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP) { + account = ((RoomTipAttachment) attachment).getUid() + ""; + } else if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FACE) { + account = ((FaceAttachment) attachment).getUid() + ""; + } else { + account = chatRoomMessage.getFromAccount(); + } + } else { + account = chatRoomMessage.getFromAccount(); + } + return account; + } + + /** + * 获取聊天室成员的拓展字段 + * + * @param chatRoomMember - + * @return - 可能为null + */ + public static Map getExtension(ChatRoomMember chatRoomMember) { + if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount())) { + return null; + } + Map ext = chatRoomMember.getExtension(); + if (ext != null && ext.containsKey(chatRoomMember.getAccount())) { + Object tmp = ext.get(chatRoomMember.getAccount()); + try { + //noinspection unchecked + return (Map) tmp; + } catch (Exception ex) { + ex.printStackTrace(); + } + } + return null; + } + + private static final String KEY_IS_WELCOME = "is_welcome"; + + /** + * 判断聊天室消息本地字段 是否已经欢迎过了 + */ + public static boolean isWelcomeLocal(ChatRoomMessage chatRoomMessage) { + try { + if (chatRoomMessage == null) { + return false; + } + Map localExt = chatRoomMessage.getLocalExtension(); + if (localExt == null) { + LogUtil.print("isWelcomeLocal:localExt == null"); + return false; + } + LogUtil.print("isWelcomeLocal:" + new Gson().toJson(localExt)); + if (localExt.containsKey(KEY_IS_WELCOME)) { + Object objIsWelcome = localExt.get(KEY_IS_WELCOME); + if (objIsWelcome instanceof Boolean) { + return (boolean) objIsWelcome; + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return false; + } + + /** + * 设置聊天室消息本地字段 是否已经欢迎过了 + */ + public static void setWelcomeLocal(ChatRoomMessage chatRoomMessage, boolean welcome) { + try { + if (chatRoomMessage == null) { + return; + } + Map localExt = chatRoomMessage.getLocalExtension(); + if (localExt == null) { + localExt = new HashMap<>(); + } + localExt.put(KEY_IS_WELCOME, welcome); + chatRoomMessage.setLocalExtension(localExt); + LogUtil.print("setWelcomeLocal:" + new Gson().toJson(localExt)); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/ExtensionUtils.java b/core/src/main/java/com/chwl/core/utils/ExtensionUtils.java new file mode 100644 index 0000000..4fcf622 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/ExtensionUtils.java @@ -0,0 +1,47 @@ +package com.chwl.core.utils; + + +import androidx.annotation.NonNull; + +import com.chwl.core.decoration.car.bean.CarInfo; +import com.chwl.core.decoration.headwear.bean.HeadWearInfo; +import com.chwl.core.level.UserLevelVo; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.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 (!CoreTextUtils.isEmptyText(userInfo.getNameplateWord())) { + valueMap.put(UserInfo.NAMEPLATE_WORD, userInfo.getNameplateWord()); + } + if (!CoreTextUtils.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); + } + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/IConnectivityClient.java b/core/src/main/java/com/chwl/core/utils/IConnectivityClient.java new file mode 100644 index 0000000..3eb3955 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/IConnectivityClient.java @@ -0,0 +1,16 @@ +/** + * + */ +package com.chwl.core.utils; + + +import com.chwl.library.coremanager.ICoreClient; + +/** + * @author daixiang + * + */ +public interface IConnectivityClient extends ICoreClient { + + public void onConnectivityChange(IConnectivityCore.ConnectivityState previousState, IConnectivityCore.ConnectivityState currentState); +} diff --git a/core/src/main/java/com/chwl/core/utils/IConnectivityCore.java b/core/src/main/java/com/chwl/core/utils/IConnectivityCore.java new file mode 100644 index 0000000..22f2a58 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/IConnectivityCore.java @@ -0,0 +1,23 @@ +/** + * + */ +package com.chwl.core.utils; + + +import com.chwl.library.coremanager.IBaseCore; + +/** + * @author daixiang + * + */ +public interface IConnectivityCore extends IBaseCore { + + public enum ConnectivityState { + NetworkUnavailable, + ConnectedViaMobile, + ConnectedViaWifi, + ConnectedViaOther + } + + public ConnectivityState getConnectivityState(); +} diff --git a/core/src/main/java/com/chwl/core/utils/IHandlerCore.java b/core/src/main/java/com/chwl/core/utils/IHandlerCore.java new file mode 100644 index 0000000..b96bd1d --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/IHandlerCore.java @@ -0,0 +1,37 @@ +package com.chwl.core.utils; + + +import com.chwl.library.coremanager.IBaseCore; +import com.chwl.library.coremanager.ICoreClient; + +/** + * Handler相关逻辑处理 + * @author zhongyongsheng on 2015/5/27. + */ +public interface IHandlerCore extends IBaseCore { + + /** + * 在主线程里发送广播 + * @param clientClass + * @param methodName + * @param args + */ + void notifyClientsInMainThread(Class clientClass, String methodName, Object... args); + + void notifyClientsInMainThreadDelayed(int delay, Class clientClass, String methodName, Object... args); + + void performInMainThread(Runnable runnable); + + /** + * 延迟 秒 发送 + * @param runnable + * @param delay + */ + void performInMainThread(Runnable runnable, long delay); + + /** + * 移除任务 + * @param runnable + */ + void removeCallbacks(Runnable runnable); +} diff --git a/core/src/main/java/com/chwl/core/utils/ImageSplitter.java b/core/src/main/java/com/chwl/core/utils/ImageSplitter.java new file mode 100644 index 0000000..af038df --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/ImageSplitter.java @@ -0,0 +1,101 @@ +package com.chwl.core.utils; + +import android.graphics.Bitmap; +import android.graphics.Matrix; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; + +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.library.utils.BitmapLruCacheHelper; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by huangmeng1 on 2018/5/7. + */ + + +public class ImageSplitter { + + public static List splits(String url, Bitmap bitmap) { + + List pieces = new ArrayList<>(); + try { + if (bitmap.getWidth() == bitmap.getHeight()) { + pieces.add(new BitmapDrawable(bitmap)); + } else { + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 0.5f); + int width = bitmap.getWidth(); + int pieceWidth = bitmap.getHeight(); + int pieceHeight = bitmap.getHeight(); + int xPiece = width / pieceWidth; + for (int j = 0; j < xPiece; j++) { + int xValue = j * pieceWidth; + Bitmap temp = BitmapLruCacheHelper.getInstance().getBitmapFromMemCache(url + j); + if (temp == null) { + temp = Bitmap.createBitmap(bitmap, xValue, 0, + pieceWidth, pieceHeight, matrix, true); + BitmapLruCacheHelper.getInstance().addBitmapToMemCache(url + j, temp); + } + pieces.add(new BitmapDrawable(temp)); + } + } + } catch (Exception e) { + } + return pieces; + } + + public static List split(Bitmap bitmap) { + + List pieces = new ArrayList(); + try { + if (bitmap.getWidth() == bitmap.getHeight()) { + pieces.add(new BitmapDrawable(bitmap)); + } else { + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 0.5f); + + int width = bitmap.getWidth(); + int pieceWidth = bitmap.getHeight(); + int pieceHeight = bitmap.getHeight(); + int xPiece = width / pieceWidth; + for (int j = 0; j < xPiece; j++) { + int xValue = j * pieceWidth; + pieces.add(new BitmapDrawable(Bitmap.createBitmap(bitmap, xValue, 0, + pieceWidth, pieceHeight, matrix, true))); + } + } + + } catch (Exception e) { + } + return pieces; + } + + public static List split(String url, Bitmap bitmap) { + if (AvRoomDataManager.get().mHeadWearMap.get(url) != null) { + return AvRoomDataManager.get().mHeadWearMap.get(url); + } + + List pieces = new ArrayList(); + try { + Matrix matrix = new Matrix(); + matrix.setScale(0.5f, 0.5f); + + int width = bitmap.getWidth(); + int pieceWidth = bitmap.getHeight(); + int pieceHeight = bitmap.getHeight(); + int xPiece = width / pieceWidth; + for (int j = 0; j < xPiece; j++) { + int xValue = j * pieceWidth; + pieces.add(new BitmapDrawable(Bitmap.createBitmap(bitmap, xValue, 0, + pieceWidth, pieceHeight, matrix, true))); + } + } catch (Exception e) { + } + AvRoomDataManager.get().mHeadWearMap.put(url, pieces); + return pieces; + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/ImgServiceUrlUtil.java b/core/src/main/java/com/chwl/core/utils/ImgServiceUrlUtil.java new file mode 100644 index 0000000..0cb0da6 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/ImgServiceUrlUtil.java @@ -0,0 +1,196 @@ +package com.chwl.core.utils; + + +import com.chwl.library.utils.StringUtils; +import com.chwl.library.utils.file.JXFileUtils; + +/** + * Created by lijun3 on 2016/3/15. + * + * copy from ImageViewUrl.java in mobile-bs2 + * + * + com.yy.ent.mobile + mobile-bs2 + 1.1.3 + + * + * image.yy.com 图片处理服务 参数工具类 + * + */ +public class ImgServiceUrlUtil { + + public static final String IMP_SERVICE_HEADER = "http://image.yy.com/"; + + private static final String DEFAULT_WIDTH_PLACEHOLDER = "{w}"; + private static final String DEFAULT_HEIGHT_PLACEHOLDER = "{h}"; + private Pattern pattern; + private CutModel cm; + private int w; + private int h; + private boolean exif; + private String widthPlaceholder; + private String heightPlaceholder; + private boolean useBlur; + private double blur; + + public static ImgServiceUrlUtil atMostEdge() { + return new ImgServiceUrlUtil(Pattern.AT_MOST_EDGE); + } + + public static ImgServiceUrlUtil atLeastEdge() { + return new ImgServiceUrlUtil(Pattern.AT_LEAST_EDGE); + } + + public static ImgServiceUrlUtil atMostSize() { + return new ImgServiceUrlUtil(Pattern.AT_MOST_SIZE); + } + + public static ImgServiceUrlUtil atLeastSize() { + return new ImgServiceUrlUtil(Pattern.AT_LEAST_SIZE); + } + + public static ImgServiceUrlUtil cutBySize(CutModel cm) { + return new ImgServiceUrlUtil(Pattern.CUT_BY_SIZE, cm); + } + + public static ImgServiceUrlUtil cutBySize() { + return cutBySize(CutModel.CENTER_TOP); + } + + public static ImgServiceUrlUtil cutByEdge(CutModel cm) { + return new ImgServiceUrlUtil(Pattern.CUT_BY_EDGE, cm); + } + + public static ImgServiceUrlUtil cutByEdge() { + return cutByEdge(CutModel.CENTER_TOP); + } + + private ImgServiceUrlUtil(Pattern pattern) { + this(pattern, null); + } + + private ImgServiceUrlUtil(Pattern pattern, CutModel cm) { + this.pattern = pattern; + this.cm = (cm == null ? CutModel.CENTER_TOP : cm); + } + + /** + * 长边 + * @param w + * @return + */ + public final ImgServiceUrlUtil width(int w) { + this.w = w; + return this; + } + + /** + * 短边 + * @param h + * @return + */ + public final ImgServiceUrlUtil height(int h) { + this.h = h; + return this; + } + + public final ImgServiceUrlUtil widthPlaceholder() { + return widthPlaceholder(DEFAULT_WIDTH_PLACEHOLDER); + } + + public final ImgServiceUrlUtil widthPlaceholder(String widthPlaceholder) { + this.widthPlaceholder = widthPlaceholder; + return this; + } + + public final ImgServiceUrlUtil heightPlaceholder() { + return heightPlaceholder(DEFAULT_HEIGHT_PLACEHOLDER); + } + + public final ImgServiceUrlUtil heightPlaceholder(String heightPlaceholder) { + this.heightPlaceholder = heightPlaceholder; + return this; + } + + public final ImgServiceUrlUtil dropExif() { + this.exif = true; + return this; + } + + public final ImgServiceUrlUtil blur(double blur) { + this.useBlur = true; + this.blur = blur; + return this; + } + + public final String on(String bs2Url) { + if (StringUtils.isEmpty(bs2Url)) { + throw new IllegalArgumentException("bs2Url is blank"); + } + String bucket = StringUtils.substringBetween(bs2Url, "://", ".bs2"); + if (StringUtils.isEmpty(bucket)) { + throw new IllegalArgumentException("bucket is blank"); + } + String filename = JXFileUtils.getFileName(StringUtils.trim(bs2Url)); + if (StringUtils.isEmpty(filename)) { + throw new IllegalArgumentException("filename is blank"); + } + + StringBuffer buffer = new StringBuffer(); + buffer.append(IMP_SERVICE_HEADER).append(bucket).append('/').append(filename).append("?imageview/").append(this.pattern.value); + + if ((this.pattern == Pattern.CUT_BY_SIZE) || (this.pattern == Pattern.CUT_BY_EDGE)) { + buffer.append('/').append(this.cm.value); + } + if (this.w > 0) + buffer.append("/w/").append(this.w); + else if (!StringUtils.isEmpty(this.widthPlaceholder)) { + buffer.append("/w/").append(StringUtils.trim(this.widthPlaceholder)); + } + if (this.h > 0) + buffer.append("/h/").append(this.h); + else if (!StringUtils.isEmpty(this.heightPlaceholder)) { + buffer.append("/h/").append(StringUtils.trim(this.heightPlaceholder)); + } + if (this.exif) { + buffer.append("/exif/0"); + } + if (this.useBlur) { + buffer.append("/blur/").append(this.blur); + } + return buffer.toString(); + } + + public static enum CutModel { + CENTER_CENTER("0"), CENTER_TOP("1"), CENTER_BOTTOM("2"), + LEFT_CENTER("3"), LEFT_TOP("4"), LEFT_BOTTOM("5"), + RIGHT_CENTER("6"), RIGHT_TOP("7"), RIGHT_BOTTOM("8"); + + private String value; + + private CutModel(String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + } + + public static enum Pattern { + AT_MOST_EDGE("0"), AT_LEAST_EDGE("1"), + AT_MOST_SIZE("2"), AT_LEAST_SIZE("3"), + CUT_BY_SIZE("4"), CUT_BY_EDGE("5"); + + private String value; + + private Pattern(String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + } +} diff --git a/core/src/main/java/com/chwl/core/utils/IntentUtils.java b/core/src/main/java/com/chwl/core/utils/IntentUtils.java new file mode 100644 index 0000000..c8fd0c1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/IntentUtils.java @@ -0,0 +1,49 @@ +package com.chwl.core.utils; + +import android.app.Activity; +import android.app.PendingIntent; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; + +/** + * Creator: Chanry + * Date:2016/3/21 + * Time: 21:09 + *

+ * Description: + */ +public class IntentUtils { + + public static Intent getBackIntent(Context context) { + return new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setClassName( + context, + "com.yy.mobile.ui.splash.SplashActivity"); + } + + public static PendingIntent getBackPendingIntent(Context context) { + return PendingIntent + .getActivity(context, 0, getBackIntent(context), PendingIntent.FLAG_CANCEL_CURRENT); + } + + public static Intent toWirelessSettingsIntent(Context context) { + Intent intent = new Intent(); + + if (context.getPackageManager().resolveActivity(intent, 0) == null) { + intent = new Intent(android.provider.Settings.ACTION_SETTINGS); + } else { + ComponentName component = new ComponentName( + "com.android.settings", + "com.android.settings.WirelessSettings"); + intent.setComponent(component); + intent.setAction("android.intent.action.VIEW"); + } + if (!(context instanceof Activity)) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } + return intent; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/LogUtils.java b/core/src/main/java/com/chwl/core/utils/LogUtils.java new file mode 100644 index 0000000..3e2dbfe --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/LogUtils.java @@ -0,0 +1,130 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package com.chwl.core.utils; + +import android.util.Log; + +import com.chwl.core.R; +import com.chwl.core.BuildConfig; +import com.chwl.library.utils.ResUtil; + +import java.util.Locale; + +public class LogUtils { + public static boolean DEBUG = BuildConfig.DEBUG; + private static final int INDEX = 4; + + public LogUtils() { + } + + private static String getPrefix() { + StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[4]; + String className = stackTraceElement.getClassName(); + int classNameStartIndex = className.lastIndexOf(".") + 1; + className = className.substring(classNameStartIndex); + String methodName = stackTraceElement.getMethodName(); + int methodLine = stackTraceElement.getLineNumber(); + String format = "%s-%s(L:%d)"; + return String.format(Locale.CHINESE, format, className, methodName, methodLine); + } + + public static void v(String content) { + if (DEBUG) { + Log.v(getPrefix(), content); + } + + } + + public static void v(String content, Throwable tr) { + if (DEBUG) { + Log.v(getPrefix(), content, tr); + } + + } + + public static void d(String content) { + if (DEBUG) { + Log.d(getPrefix(), content); + } + } + + public static void dd(String content) { + if (DEBUG) { + Log.d(getPrefix(), content); + } + } + + public static void d(String tag, String content) { + if (DEBUG) { + Log.d(tag, content); + } + } + + public static void d(String content, Throwable tr) { + if (DEBUG) { + Log.d(getPrefix(), content, tr); + } + + } + + public static void i(String content) { + if (DEBUG) { + Log.i(getPrefix(), content); + } + + } + + public static void i(String content, Throwable tr) { + if (DEBUG) { + Log.i(getPrefix(), content, tr); + } + + } + + public static void w(String content) { + if (DEBUG) { + Log.e(getPrefix(), content); + } + + } + + public static void w(String content, Throwable tr) { + if (DEBUG) { + Log.w(getPrefix(), content, tr); + } + + } + + public static void e(String content) { + if (DEBUG) { + Log.e(getPrefix(), content); + } + + } + + public static void e(String content, Throwable tr) { + if (DEBUG) { + Log.e(getPrefix(), content, tr); + } + + } + + public static String showAllElementsInfo() { + String print = ""; + int count = 0; + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + StackTraceElement[] var3 = stackTraceElements; + int var4 = stackTraceElements.length; + + for(int var5 = 0; var5 < var4; ++var5) { + StackTraceElement stackTraceElement = var3[var5]; + ++count; + print = print + String.format(ResUtil.getString(R.string.xchat_android_core_utils_logutils_01), stackTraceElement.getClassName(), stackTraceElement.getMethodName(), stackTraceElement.getLineNumber(), count); + } + + return print; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/OaidUtil.java b/core/src/main/java/com/chwl/core/utils/OaidUtil.java new file mode 100644 index 0000000..ea41eaf --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/OaidUtil.java @@ -0,0 +1,19 @@ +package com.chwl.core.utils; + + +public class OaidUtil { + + private static String oaid; + + private OaidUtil() { + + } + + public static void setOaid(String oaid) { + OaidUtil.oaid = oaid; + } + + public static String getOaid() { + return oaid; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/OldHttpErrorHandleUtil.java b/core/src/main/java/com/chwl/core/utils/OldHttpErrorHandleUtil.java new file mode 100644 index 0000000..95372ec --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/OldHttpErrorHandleUtil.java @@ -0,0 +1,45 @@ +package com.chwl.core.utils; + +import com.google.gson.Gson; +import com.chwl.core.R; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.library.utils.ResUtil; + +import java.nio.charset.Charset; + +import retrofit2.HttpException; + +public class OldHttpErrorHandleUtil { + + public static String handle(Throwable throwable) { + try { + if (throwable instanceof HttpException) { + retrofit2.Response response = ((HttpException) throwable).response(); + if (response.errorBody() == null) { + return throwable.getMessage(); + } + byte[] bodyByte = response.errorBody().bytes(); + if (bodyByte.length <= 0) { + return throwable.getMessage(); + } + ServiceResult result; + try { + result = new Gson().fromJson(new String(bodyByte, Charset.forName("UTF-8")), ServiceResult.class); + } catch (Exception e) { + return ResUtil.getString(R.string.xchat_android_core_utils_oldhttperrorhandleutil_01); + } + return result.getMessage(); + } else if (throwable.getMessage() != null && (throwable.getMessage().contains("SocketTimeoutException") || throwable.getMessage().contains("ConnectException") || throwable.getMessage().contains("UnknownHostException"))) { + return ResUtil.getString(R.string.xchat_android_core_utils_oldhttperrorhandleutil_02); + } else if (throwable.getMessage() != null && (throwable.getMessage().contains("JsonParseException") || throwable.getMessage().contains("JSONException") || throwable.getMessage().contains("ParseException"))) { + return ResUtil.getString(R.string.data_parsing_exception); + } else if (throwable.getMessage() != null && throwable.getMessage().contains("IllegalArgumentException")) { + return ResUtil.getString(R.string.parameter_error); + } else { + return throwable.getMessage(); + } + } catch (Exception e) { + return e.getMessage(); + } + } +} diff --git a/core/src/main/java/com/chwl/core/utils/SharedPreferenceUtils.java b/core/src/main/java/com/chwl/core/utils/SharedPreferenceUtils.java new file mode 100644 index 0000000..fd504d7 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/SharedPreferenceUtils.java @@ -0,0 +1,87 @@ +package com.chwl.core.utils; + +import android.content.Context; +import android.content.SharedPreferences; + +import com.chwl.core.XConstants; + + +public class SharedPreferenceUtils { + + private static final String TAG = "SharedPreferenceUtils"; + public static final String KEY_EXCHANGE_RATE = "key_exchange_rate"; + + public static final String KEY_EXCHANGE_GOLD_RATE = "key_exchange_gold_rate"; + public static final String SEARCH_HISTORY = "search_history_"; + + private static SharedPreferences preferences; + + private SharedPreferenceUtils() { + } + + //请在Application中初始化 + public static void init(Context context) { + preferences = context.getSharedPreferences(XConstants.XCHAT_SHARE_PREFERENCE_NAME, Context.MODE_PRIVATE); + } + + // 耳伴钻石兑率 + public static void setExchangeGoldRate(double exchangeGoldRate) { + put(KEY_EXCHANGE_GOLD_RATE, Double.toString(exchangeGoldRate)); + } + + public static double getExchangeGoldRate() { + return Double.parseDouble((String) get(KEY_EXCHANGE_GOLD_RATE, "0")); + } + + // 哈哈钻石兑率 + public static void setExchangeRate(double exchangeRate) { + put(KEY_EXCHANGE_RATE, Double.toString(exchangeRate)); + } + + public static double getExchangeRate() { + return Double.parseDouble((String) get(KEY_EXCHANGE_RATE, "0")); + } + + public static Object get(String key, Object defaultValue) { + if (defaultValue instanceof String) { + return preferences.getString(key, (String) defaultValue); + } else if (defaultValue instanceof Integer) { + return preferences.getInt(key, (Integer) defaultValue); + } else if (defaultValue instanceof Boolean) { + return preferences.getBoolean(key, (Boolean) defaultValue); + } else if (defaultValue instanceof Float) { + return preferences.getFloat(key, (Float) defaultValue); + } else if (defaultValue instanceof Long) { + return preferences.getLong(key, (Long) defaultValue); + } + return defaultValue; + } + + public static void put(String key, Object value) { + SharedPreferences.Editor editor = preferences.edit(); + + if (value instanceof String) { + editor.putString(key, (String) value); + } else if (value instanceof Integer) { + editor.putInt(key, (Integer) value); + } else if (value instanceof Boolean) { + editor.putBoolean(key, (Boolean) value); + } else if (value instanceof Float) { + editor.putFloat(key, (Float) value); + } else if (value instanceof Long) { + editor.putLong(key, (Long) value); + } else { + editor.putString(key, value.toString()); + } + editor.apply(); + } + + public static void remove(String key) { + preferences.edit().remove(key).apply(); + } + + public static boolean contains(String key) { + return preferences.contains(key); + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/SongUtils.java b/core/src/main/java/com/chwl/core/utils/SongUtils.java new file mode 100644 index 0000000..1fd6dfc --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/SongUtils.java @@ -0,0 +1,24 @@ +package com.chwl.core.utils; + + +import com.chwl.library.utils.UUIDUtil; + +/** + * Creator: 舒强睿 + * Date:2014/12/4 + * Time:21:21 + *

+ * Description: + */ +public class SongUtils { + + public static final String PREFIX = "third_"; + + public static String generateThirdPartyId() { + return PREFIX.concat(UUIDUtil.getUUID()); + } + + public static boolean isThirdPartyId(String songId) { + return songId != null && songId.startsWith(PREFIX); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/StarUtils.java b/core/src/main/java/com/chwl/core/utils/StarUtils.java new file mode 100644 index 0000000..a0a02bb --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/StarUtils.java @@ -0,0 +1,104 @@ +package com.chwl.core.utils; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import java.util.Calendar; +import java.util.Date; + +/** + * Created by zhouxiangfeng on 2017/5/24. + */ + +public class StarUtils { + + public static final String[] zodiacArr = {ResUtil.getString(R.string.xchat_android_core_utils_starutils_01), ResUtil.getString(R.string.xchat_android_core_utils_starutils_02), ResUtil.getString(R.string.xchat_android_core_utils_starutils_03), ResUtil.getString(R.string.xchat_android_core_utils_starutils_04), ResUtil.getString(R.string.xchat_android_core_utils_starutils_05), ResUtil.getString(R.string.xchat_android_core_utils_starutils_06), ResUtil.getString(R.string.xchat_android_core_utils_starutils_07), ResUtil.getString(R.string.xchat_android_core_utils_starutils_08), ResUtil.getString(R.string.xchat_android_core_utils_starutils_09), ResUtil.getString(R.string.xchat_android_core_utils_starutils_010), ResUtil.getString(R.string.xchat_android_core_utils_starutils_011), ResUtil.getString(R.string.xchat_android_core_utils_starutils_012)}; + + public static final String[] constellationArr = {ResUtil.getString(R.string.xchat_android_core_utils_starutils_013), ResUtil.getString(R.string.xchat_android_core_utils_starutils_014), ResUtil.getString(R.string.xchat_android_core_utils_starutils_015), ResUtil.getString(R.string.xchat_android_core_utils_starutils_016), ResUtil.getString(R.string.xchat_android_core_utils_starutils_017), ResUtil.getString(R.string.xchat_android_core_utils_starutils_018), ResUtil.getString(R.string.xchat_android_core_utils_starutils_019), ResUtil.getString(R.string.xchat_android_core_utils_starutils_020), ResUtil.getString(R.string.xchat_android_core_utils_starutils_021), ResUtil.getString(R.string.xchat_android_core_utils_starutils_022), ResUtil.getString(R.string.xchat_android_core_utils_starutils_023), ResUtil.getString(R.string.xchat_android_core_utils_starutils_024)}; + + public static final int[] constellationImgArr = { + R.drawable.ic_constellation_aquarius, + R.drawable.ic_constellation_pisces, + R.drawable.ic_constellation_aries, + R.drawable.ic_constellation_taurus, + R.drawable.ic_constellation_gemini, + R.drawable.ic_constellation_cancer, + R.drawable.ic_constellation_leo, + R.drawable.ic_constellation_virgo, + R.drawable.ic_constellation_libra, + R.drawable.ic_constellation_scorpio, + R.drawable.ic_constellation_sagittarius, + R.drawable.ic_constellation_capricorn, + }; + + public static final int[] constellationEdgeDay = {20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22}; + + /** + * 根据日期获取生肖 + * + * @return + */ + public static String getZodica(Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return zodiacArr[cal.get(Calendar.YEAR) % 12]; + } + + /** + * 根据日期获取星座 + * + * @return + */ + public static int getConstellation(Date date) { + if (date == null) { + return constellationImgArr[0]; + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int month = cal.get(Calendar.MONTH); + int day = cal.get(Calendar.DAY_OF_MONTH); + if (day < constellationEdgeDay[month]) { + month = month - 1; + } + if (month >= 0) { + return constellationImgArr[month]; + } + // default to return 魔羯 + return constellationImgArr[11]; + } + + public static String getConstellationString(Date date) { + if (date == null) { + return constellationArr[0]; + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int month = cal.get(Calendar.MONTH); + int day = cal.get(Calendar.DAY_OF_MONTH); + if (day < constellationEdgeDay[month]) { + month = month - 1; + } + if (month >= 0) { + return constellationArr[month]; + } + // default to return 魔羯 + return constellationArr[11]; + } + + public static String getElapseTimeForShowNOS(int milliseconds) { + StringBuilder sb = new StringBuilder(); + int seconds = milliseconds / 1000; + if (seconds < 1) + seconds = 1; + int hour = seconds / (60 * 60); + if (hour != 0) { + sb.append(hour).append(ResUtil.getString(R.string.xchat_android_core_utils_starutils_025)); + } + int minute = (seconds - 60 * 60 * hour) / 60; + if (minute != 0) { + sb.append(minute).append(ResUtil.getString(R.string.xchat_android_core_utils_starutils_026)); + } + return sb.toString(); + } + +} + diff --git a/core/src/main/java/com/chwl/core/utils/StringFormatUtils.java b/core/src/main/java/com/chwl/core/utils/StringFormatUtils.java new file mode 100644 index 0000000..e1c66ad --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/StringFormatUtils.java @@ -0,0 +1,405 @@ +package com.chwl.core.utils; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import java.net.URLEncoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + ************************************************************************** + * @Version 1.0 + * @ClassName: StringUtils + * @Description: 字符串操作工具包 + * @Author zengweijie + * @date 2013-8-6 下午1:51:14 + ************************************************************************** + */ +public class StringFormatUtils { + private final static Pattern emailer = Pattern + .compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"); + + private final static ThreadLocal dateFormater = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + private final static ThreadLocal dateFormater2 = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd"); + } + }; + + /** + * 将字符串转位日期类型 + * + * @param sdate + * @return + */ + public static Date toDate(String sdate) { + try { + return dateFormater.get().parse(sdate); + } catch (ParseException e) { + return null; + } + } + + /** + * 以友好的方式显示时间 + * + * @param sdate + * @return + */ + public static String friendly_time(String sdate) { + Date time = toDate(sdate); + if (time == null) { + return "Unknown"; + } + String ftime = ""; + Calendar cal = Calendar.getInstance(); + + // 判断是否是同一天 + String curDate = dateFormater2.get().format(cal.getTime()); + String paramDate = dateFormater2.get().format(time); + if (curDate.equals(paramDate)) { + int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000); + if (hour == 0) + ftime = Math.max( + (cal.getTimeInMillis() - time.getTime()) / 60000, 1) + + ResUtil.getString(R.string.xchat_android_core_utils_stringutils_01); + else + ftime = hour + ResUtil.getString(R.string.xchat_android_core_utils_stringutils_02); + return ftime; + } + + long lt = time.getTime() / 86400000; + long ct = cal.getTimeInMillis() / 86400000; + int days = (int) (ct - lt); + if (days == 0) { + int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000); + if (hour == 0) + ftime = Math.max( + (cal.getTimeInMillis() - time.getTime()) / 60000, 1) + + ResUtil.getString(R.string.xchat_android_core_utils_stringutils_03); + else + ftime = hour + ResUtil.getString(R.string.xchat_android_core_utils_stringutils_04); + } else if (days == 1) { + ftime = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_05); + } else if (days == 2) { + ftime = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_06); + } else if (days > 2 && days <= 10) { + ftime = days + ResUtil.getString(R.string.xchat_android_core_utils_stringutils_07); + } else if (days > 10) { + ftime = dateFormater2.get().format(time); + } + return ftime; + } + + /** + * 判断给定字符串时间是否为今日 + * + * @param sdate + * @return boolean + */ + public static boolean isToday(String sdate) { + boolean b = false; + Date time = toDate(sdate); + Date today = new Date(); + if (time != null) { + String nowDate = dateFormater2.get().format(today); + String timeDate = dateFormater2.get().format(time); + if (nowDate.equals(timeDate)) { + b = true; + } + } + return b; + } + + /** + * 判断给定字符串是否空白串。 空白串是指由空格、制表符、回车符、换行符组成的字符串 若输入字符串为null或空字符串,返回true + * + * @param input + * @return boolean + */ + public static boolean isEmpty(String input) { + if (input == null || "".equals(input) || "null".equals(input) + || "-1".equals(input)) + return true; + + for (int i = 0; i < input.length(); i++) { + char c = input.charAt(i); + if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { + return false; + } + } + return true; + } + + public static boolean isEmpty(Object arg0) { + if (arg0 == null) + return true; + return false; + } + + /** + * 判断是不是一个合法的电子邮件地址 + * + * @param email + * @return + */ + public static boolean isEmail(String email) { + if (email == null || email.trim().length() == 0) + return false; + return emailer.matcher(email).matches(); + } + + public static boolean isMobileNO(String mobiles) { + Pattern p = Pattern + .compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"); + Matcher m = p.matcher(mobiles); + return m.matches(); + } + + /** + * 字符串转整数 + * + * @param str + * @param defValue + * @return + */ + public static int toInt(String str, int defValue) { + try { + return Integer.parseInt(str); + } catch (Exception e) { + } + return defValue; + } + + /** + * 对象转整数 + * + * @param obj + * @return 转换异常返回 0 + */ + public static int toInt(Object obj) { + if (obj == null) + return 0; + return toInt(obj.toString(), 0); + } + + /** + * 对象转整数 + * + * @param obj + * @return 转换异常返回 0 + */ + public static long toLong(String obj) { + if (obj == null) return 0; + try { + return Long.parseLong(obj); + } catch (Exception e) { + } + return 0; + } + + /** + * 字符串转布尔值 + * + * @param b + * @return 转换异常返回 false + */ + public static boolean toBool(String b) { + try { + return Boolean.parseBoolean(b); + } catch (Exception e) { + } + return false; + } + + public static String getURLEncoder(String eStr) { + String str = ""; + try { + str = URLEncoder.encode(eStr, "UTF-8"); + } catch (Exception e) { + e.printStackTrace(); + } + return str; + } + + /** + * is null or its length is 0 or it is made by space + * + *

+	 * isBlank(null) = true;
+	 * isBlank("") = true;
+	 * isBlank("  ") = true;
+	 * isBlank("a") = false;
+	 * isBlank("a ") = false;
+	 * isBlank(" a") = false;
+	 * isBlank("a b") = false;
+	 * 
+ * + * @param str + * @return if string is null or its size is 0 or it is made by space, return + * true, else return false. + */ + public static boolean isBlank(String str) { + return (str == null || str.trim().length() == 0); + } + + /** + * 技能人周期转换 描述这个方法的作用 + * + * @param arg0 + * @return + * @Exception 异常对象 + */ + public static String formapOrderDateForDay(String arg0) { + String temp = ""; + + if (arg0 == null) { + return temp; + } + + String[] tempArr = arg0.split(","); + + if (tempArr.length == 0) { + return temp; + } + + for (String string : tempArr) { + String _tempName = ""; + int tempIndex = Integer.parseInt(string); + switch (tempIndex) { + case 1: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_08); + break; + case 2: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_09); + break; + case 3: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_010); + break; + case 4: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_011); + break; + case 5: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_012); + break; + case 6: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_013); + break; + case 7: + _tempName = ResUtil.getString(R.string.xchat_android_core_utils_stringutils_014); + break; + + default: + break; + } + temp = temp + _tempName + "、"; + } + + return temp.substring(0, temp.lastIndexOf("、")); + } + + public static String formapOrderDateForDayTag(String arg0) { + String temp = ""; + + if (arg0 == null) { + return temp; + } + + String[] tempArr = arg0.split(","); + + if (tempArr.length == 0) { + return temp; + } + + for (String string : tempArr) { + temp = temp + string + ","; + } + + return temp.substring(0, temp.lastIndexOf(",")); + } + + /** + * + * @Title: splicing + * @Description: 字符串拼接 + * @param @param str + * @param @return 设定文件 + * @return String 返回类型 + * @throws + */ + public static String splic(String... str) { + String sc = ""; + if (str.length > 0) { + StringBuffer bf = new StringBuffer(); + for (String item : str) { + bf.append(item); + } + sc = bf.toString(); + } + return sc; + } + + /** + * 删除最后字符 + * + * @param @param str + * @return String 返回类型 + */ + public static String delLastStr(String str) { + if (StringFormatUtils.isBlank(str)) { + return ""; + } + String tempStr = str.substring(0, str.length() - 1); + return tempStr; + } + + // /** * 判断字符串是否是整数 */ + // public static boolean isInteger(String value) { + // try { + // Integer.parseInt(value); + // return true; + // } catch (NumberFormatException e) { + // return false; + // } + // } + // + // /** * 判断字符串是否是浮点数 */ + // public static boolean isDouble(String value) { + // try { + // Double.parseDouble(value); + // if (value.contains(".")) + // return true; + // return false; + // } catch (NumberFormatException e) { + // return false; + // } + // } + // + // /** * 判断字符串是否是数字 */ + // public static boolean isNumber(String value) { + // return isInteger(value) || isDouble(value); + // } + + // 验证字符串中包含数字,很简单。 + public static boolean isNumber(String str) { + boolean isNumber = true; + char[] ch = str.toCharArray(); + for (int i = 0; i < ch.length; i++) { + isNumber = Character.isDigit(ch[i]); + if (!isNumber) + return false; + } + return true; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/SystemUidUtil.java b/core/src/main/java/com/chwl/core/utils/SystemUidUtil.java new file mode 100644 index 0000000..78525a1 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/SystemUidUtil.java @@ -0,0 +1,14 @@ +package com.chwl.core.utils; + + +import com.chwl.core.XConstants; + + +public class SystemUidUtil { + + public static boolean isSystemUid(String uid) { + return XConstants.SECRETARY_UID.equals(uid) + || XConstants.SYSTEM_MESSAGE_UID.equals(uid) + || XConstants.MATCH_UID.equals(uid); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/TestLog.java b/core/src/main/java/com/chwl/core/utils/TestLog.java new file mode 100644 index 0000000..024baa9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/TestLog.java @@ -0,0 +1,25 @@ +package com.chwl.core.utils; + +import com.netease.nim.uikit.common.util.log.sdk.LogBase; +import com.netease.nim.uikit.common.util.log.sdk.wrapper.NimLog; +import com.netease.nim.uikit.common.util.storage.ExternalStorage; + +/** + * Created by huangmeng1 on 2018/6/13. + */ + +public class TestLog extends NimLog { + + private static final String LOG_FILE_NAME_PREFIX = "test"; + + public static void init(String logDir, int level) { + final LogBase.LogInterceptor interceptor = new LogBase.LogInterceptor() { + @Override + public boolean checkValidBeforeWrite() { + return ExternalStorage.getInstance().checkStorageValid(); + } + }; + + NimLog.initDateNLog(null, logDir, LOG_FILE_NAME_PREFIX, level, 0, 0, true, interceptor); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/Transformer.java b/core/src/main/java/com/chwl/core/utils/Transformer.java new file mode 100644 index 0000000..beee573 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/Transformer.java @@ -0,0 +1,26 @@ +package com.chwl.core.utils; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.SingleTransformer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by huangmeng1 on 2018/5/9. + */ + +public class Transformer implements SingleTransformer { + @Override + public SingleSource apply(Single upstream) { + return upstream.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap(new Function>() { + @Override + public SingleSource apply(T t) throws Exception { + return null; + } + }); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/UploadUtils.java b/core/src/main/java/com/chwl/core/utils/UploadUtils.java new file mode 100644 index 0000000..5177162 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/UploadUtils.java @@ -0,0 +1,10 @@ +package com.chwl.core.utils; + +/** + * create by lvzebiao @2019/11/20 + */ +public class UploadUtils { + + + +} diff --git a/core/src/main/java/com/chwl/core/utils/WLog.kt b/core/src/main/java/com/chwl/core/utils/WLog.kt new file mode 100644 index 0000000..8b77e1e --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/WLog.kt @@ -0,0 +1,95 @@ +package com.chwl.core.utils + +import android.annotation.SuppressLint +import android.content.Context +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileOutputStream + +@SuppressLint("StaticFieldLeak") +object WLog { + + + private var outPutDir: File? = null + private var fileOutputStream: FileOutputStream? = null + private var bufferedOutputStream: BufferedOutputStream? = null + private var mContext: Context? = null + var FILE_NAME: String = "" + + fun init(context: Context, fileName: String) { +// this.mContext = context +// FILE_NAME = fileName +// outPutDir = context.getExternalFilesDir(null) +// if (outPutDir != null) { +// if (!outPutDir!!.exists()) { +// outPutDir!!.mkdirs() +// } +// } +// +// Thread.setDefaultUncaughtExceptionHandler(object : Thread.UncaughtExceptionHandler { +// override fun uncaughtException(t: Thread, e: Throwable) { +// val errorMsg = "error = ${e.javaClass.simpleName} : ${e.message}" +// writeLog2(errorMsg) +// +// +// val msg = StringBuilder() +// e.stackTrace.forEach { +// msg.append("\tat ").append(it.toString()).append("\n") +// } +// writeLog2(msg.toString()) +// } +// }) +// +// +// writeLog2(" WLog 初始化 成功------") + } + + + fun writeLog(log: String) { +// var log = log +// val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") +// val fileTime = SimpleDateFormat("yyyy-MM-dd-") +// log = "-${simpleDateFormat.format(Date(System.currentTimeMillis()))}-:-$log".trimIndent() +// try { +// val outPutFile = File( +// outPutDir, +// "mmmmLog-" + fileTime.format(Date(System.currentTimeMillis())) + ".txt" +// ) +// fileOutputStream = FileOutputStream(outPutFile, true) +// bufferedOutputStream = BufferedOutputStream(fileOutputStream) +// bufferedOutputStream?.write(System.getProperty("line.separator")?.toByteArray()) +// bufferedOutputStream?.write(log.toByteArray()) +// bufferedOutputStream?.flush() +// fileOutputStream?.close() +// bufferedOutputStream?.close() +// } catch (e: Exception) { +// Log.e("IO Exception", e.toString()) +// } + + } + + + fun writeLog2(log: String) { +// var log = log +// val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") +// val fileTime = SimpleDateFormat("yyyy-MM-dd-") +// log = "-${simpleDateFormat.format(Date(System.currentTimeMillis()))}-:-$log".trimIndent() +// try { +// val outPutFile = File( +// outPutDir, +// "mmmmLog-" + fileTime.format(Date(System.currentTimeMillis())) + ".txt" +// ) +// fileOutputStream = FileOutputStream(outPutFile, true) +// bufferedOutputStream = BufferedOutputStream(fileOutputStream) +// bufferedOutputStream?.write(System.getProperty("line.separator")?.toByteArray()) +// bufferedOutputStream?.write(log.toByteArray()) +// bufferedOutputStream?.flush() +// fileOutputStream?.close() +// bufferedOutputStream?.close() +// } catch (e: Exception) { +// Log.e("IO Exception", e.toString()) +// } + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/extension/StringExtension.kt b/core/src/main/java/com/chwl/core/utils/extension/StringExtension.kt new file mode 100644 index 0000000..442db22 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/extension/StringExtension.kt @@ -0,0 +1,48 @@ +package com.chwl.core.utils.extension + +import android.graphics.Color +import com.chwl.library.utils.SingleToastUtil + + +fun String?.subAndReplaceDot(maxLength: Int = 6): String { + if (this == null) return "" + return if (this.length > maxLength) this.substring(0, maxLength) + "..." else this +} + +fun String?.sub(maxLength: Int = 6): String { + if (this == null) return "" + return if (this.length > maxLength) this.substring(0, maxLength) else this +} + +fun String?.toIntOrDef(def: Int = 0): Int { + return this?.toIntOrNull() ?: def +} + +fun String?.toDoubleOrDef(def: Double = 0.0): Double { + return this?.toDoubleOrNull() ?: def +} + +/** + * 主要用于将服务器返回的RGB值转换为ColorInt + */ +fun String?.toColorInt(defaultValue: String): Int { + if (this.isNullOrBlank()) return Color.parseColor(defaultValue) + return try { + Color.parseColor(this) + } catch (t: Throwable) { + Color.parseColor(defaultValue) + } +} + +fun String?.toast() { + SingleToastUtil.showToast(this) +} + +inline fun String?.ifNullOrEmpty(defaultValue: () -> String): String = + if (this.isNullOrEmpty()) defaultValue() else this + +inline fun String?.ifNotNullOrEmpty(block: (String) -> Unit) { + if (!this.isNullOrEmpty()) { + block(this) + } +} diff --git a/core/src/main/java/com/chwl/core/utils/myutil/MyJsonUtils.java b/core/src/main/java/com/chwl/core/utils/myutil/MyJsonUtils.java new file mode 100644 index 0000000..7e5ce8a --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/myutil/MyJsonUtils.java @@ -0,0 +1,256 @@ +package com.chwl.core.utils.myutil; + + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/01/07
+ *     desc  : utils about json
+ * 
+ */ +public final class MyJsonUtils { + + private static final byte TYPE_BOOLEAN = 0x00; + private static final byte TYPE_INT = 0x01; + private static final byte TYPE_LONG = 0x02; + private static final byte TYPE_DOUBLE = 0x03; + private static final byte TYPE_STRING = 0x04; + private static final byte TYPE_JSON_OBJECT = 0x05; + private static final byte TYPE_JSON_ARRAY = 0x06; + + private MyJsonUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + + /** + * Checks if a given input is a JSONObject. + * + * @param input Anything. + * @return true if it is a JSONObject. + */ + public static boolean isJSONObject(final T input) { + return input instanceof JSONObject; + } + + /** + * Checks if a given input is a JSONArray + * + * @param input Anything. + * @return true if it is a JSONArray. + */ + public static boolean isJSONArray(final T input) { + return input instanceof JSONArray; + } + + public static boolean getBoolean(final JSONObject jsonObject, + final String key) { + return getBoolean(jsonObject, key, false); + } + + public static boolean getBoolean(final JSONObject jsonObject, + final String key, + final boolean defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_BOOLEAN); + } + + public static boolean getBoolean(final String json, + final String key) { + return getBoolean(json, key, false); + } + + public static boolean getBoolean(final String json, + final String key, + final boolean defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_BOOLEAN); + } + + public static int getInt(final JSONObject jsonObject, + final String key) { + return getInt(jsonObject, key, -1); + } + + public static int getInt(final JSONObject jsonObject, + final String key, + final int defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_INT); + } + + public static int getInt(final String json, + final String key) { + return getInt(json, key, -1); + } + + public static int getInt(final String json, + final String key, + final int defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_INT); + } + + public static long getLong(final JSONObject jsonObject, + final String key) { + return getLong(jsonObject, key, -1); + } + + public static long getLong(final JSONObject jsonObject, + final String key, + final long defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_LONG); + } + + public static long getLong(final String json, + final String key) { + return getLong(json, key, -1); + } + + public static long getLong(final String json, + final String key, + final long defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_LONG); + } + + public static double getDouble(final JSONObject jsonObject, + final String key) { + return getDouble(jsonObject, key, -1); + } + + public static double getDouble(final JSONObject jsonObject, + final String key, + final double defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_DOUBLE); + } + + public static double getDouble(final String json, + final String key) { + return getDouble(json, key, -1); + } + + public static double getDouble(final String json, + final String key, + final double defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_DOUBLE); + } + + public static String getString(final JSONObject jsonObject, + final String key) { + return getString(jsonObject, key, ""); + } + + public static String getString(final JSONObject jsonObject, + final String key, + final String defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_STRING); + } + + public static String getString(final String json, + final String key) { + return getString(json, key, ""); + } + + public static String getString(final String json, + final String key, + final String defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_STRING); + } + + public static JSONObject getJSONObject(final JSONObject jsonObject, + final String key, + final JSONObject defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_JSON_OBJECT); + } + + public static JSONObject getJSONObject(final String json, + final String key, + final JSONObject defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_JSON_OBJECT); + } + + public static JSONArray getJSONArray(final JSONObject jsonObject, + final String key, + final JSONArray defaultValue) { + return getValueByType(jsonObject, key, defaultValue, TYPE_JSON_ARRAY); + } + + public static JSONArray getJSONArray(final String json, + final String key, + final JSONArray defaultValue) { + return getValueByType(json, key, defaultValue, TYPE_JSON_ARRAY); + } + + private static T getValueByType(final JSONObject jsonObject, + final String key, + final T defaultValue, + final byte type) { + if (jsonObject == null || key == null || key.length() == 0) { + return defaultValue; + } + try { + Object ret; + if (type == TYPE_BOOLEAN) { + ret = jsonObject.getBoolean(key); + } else if (type == TYPE_INT) { + ret = jsonObject.getInt(key); + } else if (type == TYPE_LONG) { + ret = jsonObject.getLong(key); + } else if (type == TYPE_DOUBLE) { + ret = jsonObject.getDouble(key); + } else if (type == TYPE_STRING) { + ret = jsonObject.getString(key); + } else if (type == TYPE_JSON_OBJECT) { + ret = jsonObject.getJSONObject(key); + } else if (type == TYPE_JSON_ARRAY) { + ret = jsonObject.getJSONArray(key); + } else { + return defaultValue; + } + //noinspection unchecked + return (T) ret; + } catch (JSONException e) { + e.printStackTrace(); + return defaultValue; + } + } + + private static T getValueByType(final String json, + final String key, + final T defaultValue, + final byte type) { + if (json == null || json.length() == 0 + || key == null || key.length() == 0) { + return defaultValue; + } + try { + return getValueByType(new JSONObject(json), key, defaultValue, type); + } catch (JSONException e) { + e.printStackTrace(); + return defaultValue; + } + } + + public static String formatJson(final String json) { + return formatJson(json, 4); + } + + public static String formatJson(final String json, final int indentSpaces) { + try { + for (int i = 0, len = json.length(); i < len; i++) { + char c = json.charAt(i); + if (c == '{') { + return new JSONObject(json).toString(indentSpaces); + } else if (c == '[') { + return new JSONArray(json).toString(indentSpaces); + } else if (!Character.isWhitespace(c)) { + return json; + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + return json; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/myutil/MySpanUtils.java b/core/src/main/java/com/chwl/core/utils/myutil/MySpanUtils.java new file mode 100644 index 0000000..b4a2ce0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/myutil/MySpanUtils.java @@ -0,0 +1,1461 @@ +package com.chwl.core.utils.myutil; + +import static android.graphics.BlurMaskFilter.Blur; + +import android.annotation.SuppressLint; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Shader; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.text.Layout; +import android.text.Layout.Alignment; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.AlignmentSpan; +import android.text.style.BackgroundColorSpan; +import android.text.style.CharacterStyle; +import android.text.style.ClickableSpan; +import android.text.style.ForegroundColorSpan; +import android.text.style.LeadingMarginSpan; +import android.text.style.LineHeightSpan; +import android.text.style.MaskFilterSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.ReplacementSpan; +import android.text.style.ScaleXSpan; +import android.text.style.StrikethroughSpan; +import android.text.style.StyleSpan; +import android.text.style.SubscriptSpan; +import android.text.style.SuperscriptSpan; +import android.text.style.TypefaceSpan; +import android.text.style.URLSpan; +import android.text.style.UnderlineSpan; +import android.text.style.UpdateAppearance; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.annotation.DrawableRes; +import androidx.annotation.FloatRange; +import androidx.annotation.IntDef; +import androidx.annotation.IntRange; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import com.example.lib_utils.AppUtils; + +import java.io.InputStream; +import java.io.Serializable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; + +public class MySpanUtils { + + private static final int COLOR_DEFAULT = 0xFEFFFFFF; + + public static final int ALIGN_BOTTOM = 0; + public static final int ALIGN_BASELINE = 1; + public static final int ALIGN_CENTER = 2; + public static final int ALIGN_TOP = 3; + + @IntDef({ALIGN_BOTTOM, ALIGN_BASELINE, ALIGN_CENTER, ALIGN_TOP}) + @Retention(RetentionPolicy.SOURCE) + public @interface Align { + } + + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + public static MySpanUtils with(final TextView textView) { + return new MySpanUtils(textView); + } + + private TextView mTextView; + private CharSequence mText; + private int flag; + private int foregroundColor; + private int backgroundColor; + private int lineHeight; + private int alignLine; + private int quoteColor; + private int stripeWidth; + private int quoteGapWidth; + private int first; + private int rest; + private int bulletColor; + private int bulletRadius; + private int bulletGapWidth; + private int fontSize; + private float proportion; + private float xProportion; + private boolean isStrikethrough; + private boolean isUnderline; + private boolean isSuperscript; + private boolean isSubscript; + private boolean isBold; + private boolean isItalic; + private boolean isBoldItalic; + private String fontFamily; + private Typeface typeface; + private Alignment alignment; + private int verticalAlign; + private ClickableSpan clickSpan; + private String url; + private float blurRadius; + private Blur style; + private Shader shader; + private float shadowRadius; + private float shadowDx; + private float shadowDy; + private int shadowColor; + private Object[] spans; + + private Bitmap imageBitmap; + private Drawable imageDrawable; + private Uri imageUri; + private int imageResourceId; + private int alignImage; + + private int spaceSize; + private int spaceColor; + + private SerializableSpannableStringBuilder mBuilder; + private boolean isCreated; + + private int mType; + private final int mTypeCharSequence = 0; + private final int mTypeImage = 1; + private final int mTypeSpace = 2; + + private MySpanUtils(TextView textView) { + this(); + mTextView = textView; + } + + public MySpanUtils() { + mBuilder = new SerializableSpannableStringBuilder(); + mText = ""; + mType = -1; + setDefault(); + } + + private void setDefault() { + flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; + foregroundColor = COLOR_DEFAULT; + backgroundColor = COLOR_DEFAULT; + lineHeight = -1; + quoteColor = COLOR_DEFAULT; + first = -1; + bulletColor = COLOR_DEFAULT; + fontSize = -1; + proportion = -1; + xProportion = -1; + isStrikethrough = false; + isUnderline = false; + isSuperscript = false; + isSubscript = false; + isBold = false; + isItalic = false; + isBoldItalic = false; + fontFamily = null; + typeface = null; + alignment = null; + verticalAlign = -1; + clickSpan = null; + url = null; + blurRadius = -1; + shader = null; + shadowRadius = -1; + spans = null; + + imageBitmap = null; + imageDrawable = null; + imageUri = null; + imageResourceId = -1; + + spaceSize = -1; + } + + /** + * Set the span of flag. + * + * @param flag The flag. + *
    + *
  • {@link Spanned#SPAN_INCLUSIVE_EXCLUSIVE}
  • + *
  • {@link Spanned#SPAN_INCLUSIVE_INCLUSIVE}
  • + *
  • {@link Spanned#SPAN_EXCLUSIVE_EXCLUSIVE}
  • + *
  • {@link Spanned#SPAN_EXCLUSIVE_INCLUSIVE}
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setFlag(final int flag) { + this.flag = flag; + return this; + } + + /** + * Set the span of foreground's color. + * + * @param color The color of foreground + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setForegroundColor(@ColorInt final int color) { + this.foregroundColor = color; + return this; + } + + /** + * Set the span of background's color. + * + * @param color The color of background + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setBackgroundColor(@ColorInt final int color) { + this.backgroundColor = color; + return this; + } + + /** + * Set the span of line height. + * + * @param lineHeight The line height, in pixel. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setLineHeight(@IntRange(from = 0) final int lineHeight) { + return setLineHeight(lineHeight, ALIGN_CENTER); + } + + /** + * Set the span of line height. + * + * @param lineHeight The line height, in pixel. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER}
  • + *
  • {@link Align#ALIGN_BOTTOM}
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setLineHeight(@IntRange(from = 0) final int lineHeight, + @Align final int align) { + this.lineHeight = lineHeight; + this.alignLine = align; + return this; + } + + /** + * Set the span of quote's color. + * + * @param color The color of quote + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setQuoteColor(@ColorInt final int color) { + return setQuoteColor(color, 2, 2); + } + + /** + * Set the span of quote's color. + * + * @param color The color of quote. + * @param stripeWidth The width of stripe, in pixel. + * @param gapWidth The width of gap, in pixel. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setQuoteColor(@ColorInt final int color, + @IntRange(from = 1) final int stripeWidth, + @IntRange(from = 0) final int gapWidth) { + this.quoteColor = color; + this.stripeWidth = stripeWidth; + this.quoteGapWidth = gapWidth; + return this; + } + + /** + * Set the span of leading margin. + * + * @param first The indent for the first line of the paragraph. + * @param rest The indent for the remaining lines of the paragraph. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setLeadingMargin(@IntRange(from = 0) final int first, + @IntRange(from = 0) final int rest) { + this.first = first; + this.rest = rest; + return this; + } + + /** + * Set the span of bullet. + * + * @param gapWidth The width of gap, in pixel. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setBullet(@IntRange(from = 0) final int gapWidth) { + return setBullet(0, 3, gapWidth); + } + + /** + * Set the span of bullet. + * + * @param color The color of bullet. + * @param radius The radius of bullet, in pixel. + * @param gapWidth The width of gap, in pixel. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setBullet(@ColorInt final int color, + @IntRange(from = 0) final int radius, + @IntRange(from = 0) final int gapWidth) { + this.bulletColor = color; + this.bulletRadius = radius; + this.bulletGapWidth = gapWidth; + return this; + } + + /** + * Set the span of font's size. + * + * @param size The size of font. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setFontSize(@IntRange(from = 0) final int size) { + return setFontSize(size, false); + } + + /** + * Set the span of size of font. + * + * @param size The size of font. + * @param isSp True to use sp, false to use pixel. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setFontSize(@IntRange(from = 0) final int size, final boolean isSp) { + if (isSp) { + final float fontScale = Resources.getSystem().getDisplayMetrics().scaledDensity; + this.fontSize = (int) (size * fontScale + 0.5f); + } else { + this.fontSize = size; + } + return this; + } + + /** + * Set the span of proportion of font. + * + * @param proportion The proportion of font. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setFontProportion(final float proportion) { + this.proportion = proportion; + return this; + } + + /** + * Set the span of transverse proportion of font. + * + * @param proportion The transverse proportion of font. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setFontXProportion(final float proportion) { + this.xProportion = proportion; + return this; + } + + /** + * Set the span of strikethrough. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setStrikethrough() { + this.isStrikethrough = true; + return this; + } + + /** + * Set the span of underline. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setUnderline() { + this.isUnderline = true; + return this; + } + + /** + * Set the span of superscript. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setSuperscript() { + this.isSuperscript = true; + return this; + } + + /** + * Set the span of subscript. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setSubscript() { + this.isSubscript = true; + return this; + } + + /** + * Set the span of bold. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setBold() { + isBold = true; + return this; + } + + /** + * Set the span of italic. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setItalic() { + isItalic = true; + return this; + } + + /** + * Set the span of bold italic. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setBoldItalic() { + isBoldItalic = true; + return this; + } + + /** + * Set the span of font family. + * + * @param fontFamily The font family. + *
    + *
  • monospace
  • + *
  • serif
  • + *
  • sans-serif
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setFontFamily(@NonNull final String fontFamily) { + this.fontFamily = fontFamily; + return this; + } + + /** + * Set the span of typeface. + * + * @param typeface The typeface. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setTypeface(@NonNull final Typeface typeface) { + this.typeface = typeface; + return this; + } + + /** + * Set the span of horizontal alignment. + * + * @param alignment The alignment. + *
    + *
  • {@link Alignment#ALIGN_NORMAL }
  • + *
  • {@link Alignment#ALIGN_OPPOSITE}
  • + *
  • {@link Alignment#ALIGN_CENTER }
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setHorizontalAlign(@NonNull final Alignment alignment) { + this.alignment = alignment; + return this; + } + + /** + * Set the span of vertical alignment. + * + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setVerticalAlign(@Align final int align) { + this.verticalAlign = align; + return this; + } + + /** + * Set the span of click. + *

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

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

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

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

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

+ * + * @param url The url. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setUrl(@NonNull final String url) { + setMovementMethodIfNeed(); + this.url = url; + return this; + } + + private void setMovementMethodIfNeed() { + if (mTextView != null && mTextView.getMovementMethod() == null) { + mTextView.setMovementMethod(LinkMovementMethod.getInstance()); + } + } + + /** + * Set the span of blur. + * + * @param radius The radius of blur. + * @param style The style. + *
    + *
  • {@link Blur#NORMAL}
  • + *
  • {@link Blur#SOLID}
  • + *
  • {@link Blur#OUTER}
  • + *
  • {@link Blur#INNER}
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setBlur(@FloatRange(from = 0, fromInclusive = false) final float radius, + final Blur style) { + this.blurRadius = radius; + this.style = style; + return this; + } + + /** + * Set the span of shader. + * + * @param shader The shader. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setShader(@NonNull final Shader shader) { + this.shader = shader; + return this; + } + + /** + * Set the span of shadow. + * + * @param radius The radius of shadow. + * @param dx X-axis offset, in pixel. + * @param dy Y-axis offset, in pixel. + * @param shadowColor The color of shadow. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setShadow(@FloatRange(from = 0, fromInclusive = false) final float radius, + final float dx, + final float dy, + final int shadowColor) { + this.shadowRadius = radius; + this.shadowDx = dx; + this.shadowDy = dy; + this.shadowColor = shadowColor; + return this; + } + + + /** + * Set the spans. + * + * @param spans The spans. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils setSpans(@NonNull final Object... spans) { + if (spans.length > 0) { + this.spans = spans; + } + return this; + } + + /** + * Append the text text. + * + * @param text The text. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils append(@NonNull final CharSequence text) { + apply(mTypeCharSequence); + mText = text; + return this; + } + + /** + * Append one line. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendLine() { + apply(mTypeCharSequence); + mText = LINE_SEPARATOR; + return this; + } + + /** + * Append text and one line. + * + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendLine(@NonNull final CharSequence text) { + apply(mTypeCharSequence); + mText = text + LINE_SEPARATOR; + return this; + } + + /** + * Append one image. + * + * @param bitmap The bitmap of image. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@NonNull final Bitmap bitmap) { + return appendImage(bitmap, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param bitmap The bitmap. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@NonNull final Bitmap bitmap, @Align final int align) { + apply(mTypeImage); + this.imageBitmap = bitmap; + this.alignImage = align; + return this; + } + + /** + * Append one image. + * + * @param drawable The drawable of image. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@NonNull final Drawable drawable) { + return appendImage(drawable, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param drawable The drawable of image. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@NonNull final Drawable drawable, @Align final int align) { + apply(mTypeImage); + this.imageDrawable = drawable; + this.alignImage = align; + return this; + } + + /** + * Append one image. + * + * @param uri The uri of image. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@NonNull final Uri uri) { + return appendImage(uri, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param uri The uri of image. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@NonNull final Uri uri, @Align final int align) { + apply(mTypeImage); + this.imageUri = uri; + this.alignImage = align; + return this; + } + + /** + * Append one image. + * + * @param resourceId The resource id of image. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@DrawableRes final int resourceId) { + return appendImage(resourceId, ALIGN_BOTTOM); + } + + /** + * Append one image. + * + * @param resourceId The resource id of image. + * @param align The alignment. + *
    + *
  • {@link Align#ALIGN_TOP }
  • + *
  • {@link Align#ALIGN_CENTER }
  • + *
  • {@link Align#ALIGN_BASELINE}
  • + *
  • {@link Align#ALIGN_BOTTOM }
  • + *
+ * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendImage(@DrawableRes final int resourceId, @Align final int align) { + apply(mTypeImage); + this.imageResourceId = resourceId; + this.alignImage = align; + return this; + } + + /** + * Append space. + * + * @param size The size of space. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendSpace(@IntRange(from = 0) final int size) { + return appendSpace(size, Color.TRANSPARENT); + } + + /** + * Append space. + * + * @param size The size of space. + * @param color The color of space. + * @return the single {@link MySpanUtils} instance + */ + public MySpanUtils appendSpace(@IntRange(from = 0) final int size, @ColorInt final int color) { + apply(mTypeSpace); + spaceSize = size; + spaceColor = color; + return this; + } + + private void apply(final int type) { + applyLast(); + mType = type; + } + + public SpannableStringBuilder get() { + return mBuilder; + } + + /** + * Create the span string. + * + * @return the span string + */ + public SpannableStringBuilder create() { + applyLast(); + if (mTextView != null) { + mTextView.setText(mBuilder); + } + isCreated = true; + return mBuilder; + } + + private void applyLast() { + if (isCreated) { + return; + } + if (mType == mTypeCharSequence) { + updateCharCharSequence(); + } else if (mType == mTypeImage) { + updateImage(); + } else if (mType == mTypeSpace) { + updateSpace(); + } + setDefault(); + } + + private void updateCharCharSequence() { + if (mText.length() == 0) return; + int start = mBuilder.length(); + if (start == 0 && lineHeight != -1) {// bug of LineHeightSpan when first line + mBuilder.append(Character.toString((char) 2)) + .append("\n") + .setSpan(new AbsoluteSizeSpan(0), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + start = 2; + } + mBuilder.append(mText); + int end = mBuilder.length(); + if (verticalAlign != -1) { + mBuilder.setSpan(new VerticalAlignSpan(verticalAlign), start, end, flag); + } + if (foregroundColor != COLOR_DEFAULT) { + mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag); + } + if (backgroundColor != COLOR_DEFAULT) { + mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag); + } + if (first != -1) { + mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag); + } + if (quoteColor != COLOR_DEFAULT) { + mBuilder.setSpan( + new CustomQuoteSpan(quoteColor, stripeWidth, quoteGapWidth), + start, + end, + flag + ); + } + if (bulletColor != COLOR_DEFAULT) { + mBuilder.setSpan( + new CustomBulletSpan(bulletColor, bulletRadius, bulletGapWidth), + start, + end, + flag + ); + } + if (fontSize != -1) { + mBuilder.setSpan(new AbsoluteSizeSpan(fontSize, false), start, end, flag); + } + if (proportion != -1) { + mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag); + } + if (xProportion != -1) { + mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag); + } + if (lineHeight != -1) { + mBuilder.setSpan(new CustomLineHeightSpan(lineHeight, alignLine), start, end, flag); + } + if (isStrikethrough) { + mBuilder.setSpan(new StrikethroughSpan(), start, end, flag); + } + if (isUnderline) { + mBuilder.setSpan(new UnderlineSpan(), start, end, flag); + } + if (isSuperscript) { + mBuilder.setSpan(new SuperscriptSpan(), start, end, flag); + } + if (isSubscript) { + mBuilder.setSpan(new SubscriptSpan(), start, end, flag); + } + if (isBold) { + mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag); + } + if (isItalic) { + mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag); + } + if (isBoldItalic) { + mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag); + } + if (fontFamily != null) { + mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag); + } + if (typeface != null) { + mBuilder.setSpan(new CustomTypefaceSpan(typeface), start, end, flag); + } + if (alignment != null) { + mBuilder.setSpan(new AlignmentSpan.Standard(alignment), start, end, flag); + } + if (clickSpan != null) { + mBuilder.setSpan(clickSpan, start, end, flag); + } + if (url != null) { + mBuilder.setSpan(new URLSpan(url), start, end, flag); + } + if (blurRadius != -1) { + mBuilder.setSpan( + new MaskFilterSpan(new BlurMaskFilter(blurRadius, style)), + start, + end, + flag + ); + } + if (shader != null) { + mBuilder.setSpan(new ShaderSpan(shader), start, end, flag); + } + if (shadowRadius != -1) { + mBuilder.setSpan( + new ShadowSpan(shadowRadius, shadowDx, shadowDy, shadowColor), + start, + end, + flag + ); + } + if (spans != null) { + for (Object span : spans) { + mBuilder.setSpan(span, start, end, flag); + } + } + } + + private void updateImage() { + int start = mBuilder.length(); + mText = ""; + updateCharCharSequence(); + int end = mBuilder.length(); + if (imageBitmap != null) { + mBuilder.setSpan(new CustomImageSpan(imageBitmap, alignImage), start, end, flag); + } else if (imageDrawable != null) { + mBuilder.setSpan(new CustomImageSpan(imageDrawable, alignImage), start, end, flag); + } else if (imageUri != null) { + mBuilder.setSpan(new CustomImageSpan(imageUri, alignImage), start, end, flag); + } else if (imageResourceId != -1) { + mBuilder.setSpan(new CustomImageSpan(imageResourceId, alignImage), start, end, flag); + } + } + + private void updateSpace() { + int start = mBuilder.length(); + mText = "< >"; + updateCharCharSequence(); + int end = mBuilder.length(); + mBuilder.setSpan(new SpaceSpan(spaceSize, spaceColor), start, end, flag); + } + + static class VerticalAlignSpan extends ReplacementSpan { + + static final int ALIGN_CENTER = 2; + static final int ALIGN_TOP = 3; + + final int mVerticalAlignment; + + VerticalAlignSpan(int verticalAlignment) { + mVerticalAlignment = verticalAlignment; + } + + @Override + public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) { + text = text.subSequence(start, end); + return (int) paint.measureText(text.toString()); + } + + @Override + public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { + text = text.subSequence(start, end); + Paint.FontMetricsInt fm = paint.getFontMetricsInt(); +// int need = height - (v + fm.descent - fm.ascent - spanstartv); +// if (need > 0) { +// if (mVerticalAlignment == ALIGN_TOP) { +// fm.descent += need; +// } else if (mVerticalAlignment == ALIGN_CENTER) { +// fm.descent += need / 2; +// fm.ascent -= need / 2; +// } else { +// fm.ascent -= need; +// } +// } +// need = height - (v + fm.bottom - fm.top - spanstartv); +// if (need > 0) { +// if (mVerticalAlignment == ALIGN_TOP) { +// fm.bottom += need; +// } else if (mVerticalAlignment == ALIGN_CENTER) { +// fm.bottom += need / 2; +// fm.top -= need / 2; +// } else { +// fm.top -= need; +// } +// } + + canvas.drawText(text.toString(), x, y - ((y + fm.descent + y + fm.ascent) / 2 - (bottom + top) / 2), paint); + } + } + + static class CustomLineHeightSpan implements LineHeightSpan { + + private final int height; + + static final int ALIGN_CENTER = 2; + static final int ALIGN_TOP = 3; + + final int mVerticalAlignment; + static Paint.FontMetricsInt sfm; + + CustomLineHeightSpan(int height, int verticalAlignment) { + this.height = height; + mVerticalAlignment = verticalAlignment; + } + + @Override + public void chooseHeight(final CharSequence text, final int start, final int end, + final int spanstartv, final int v, final Paint.FontMetricsInt fm) { +// LogUtils.e(fm, sfm); + if (sfm == null) { + sfm = new Paint.FontMetricsInt(); + sfm.top = fm.top; + sfm.ascent = fm.ascent; + sfm.descent = fm.descent; + sfm.bottom = fm.bottom; + sfm.leading = fm.leading; + } else { + fm.top = sfm.top; + fm.ascent = sfm.ascent; + fm.descent = sfm.descent; + fm.bottom = sfm.bottom; + fm.leading = sfm.leading; + } + int need = height - (v + fm.descent - fm.ascent - spanstartv); + if (need > 0) { + if (mVerticalAlignment == ALIGN_TOP) { + fm.descent += need; + } else if (mVerticalAlignment == ALIGN_CENTER) { + fm.descent += need / 2; + fm.ascent -= need / 2; + } else { + fm.ascent -= need; + } + } + need = height - (v + fm.bottom - fm.top - spanstartv); + if (need > 0) { + if (mVerticalAlignment == ALIGN_TOP) { + fm.bottom += need; + } else if (mVerticalAlignment == ALIGN_CENTER) { + fm.bottom += need / 2; + fm.top -= need / 2; + } else { + fm.top -= need; + } + } + if (end == ((Spanned) text).getSpanEnd(this)) { + sfm = null; + } +// LogUtils.e(fm, sfm); + } + } + + static class SpaceSpan extends ReplacementSpan { + + private final int width; + private final Paint paint = new Paint(); + + private SpaceSpan(final int width) { + this(width, Color.TRANSPARENT); + } + + private SpaceSpan(final int width, final int color) { + super(); + this.width = width; + paint.setColor(color); + paint.setStyle(Paint.Style.FILL); + } + + @Override + public int getSize(@NonNull final Paint paint, final CharSequence text, + @IntRange(from = 0) final int start, + @IntRange(from = 0) final int end, + @Nullable final Paint.FontMetricsInt fm) { + return width; + } + + @Override + public void draw(@NonNull final Canvas canvas, final CharSequence text, + @IntRange(from = 0) final int start, + @IntRange(from = 0) final int end, + final float x, final int top, final int y, final int bottom, + @NonNull final Paint paint) { + canvas.drawRect(x, top, x + width, bottom, this.paint); + } + } + + static class CustomQuoteSpan implements LeadingMarginSpan { + + private final int color; + private final int stripeWidth; + private final int gapWidth; + + private CustomQuoteSpan(final int color, final int stripeWidth, final int gapWidth) { + super(); + this.color = color; + this.stripeWidth = stripeWidth; + this.gapWidth = gapWidth; + } + + public int getLeadingMargin(final boolean first) { + return stripeWidth + gapWidth; + } + + public void drawLeadingMargin(final Canvas c, final Paint p, final int x, final int dir, + final int top, final int baseline, final int bottom, + final CharSequence text, final int start, final int end, + final boolean first, final Layout layout) { + Paint.Style style = p.getStyle(); + int color = p.getColor(); + + p.setStyle(Paint.Style.FILL); + p.setColor(this.color); + + c.drawRect(x, top, x + dir * stripeWidth, bottom, p); + + p.setStyle(style); + p.setColor(color); + } + } + + static class CustomBulletSpan implements LeadingMarginSpan { + + private final int color; + private final int radius; + private final int gapWidth; + + private Path sBulletPath = null; + + private CustomBulletSpan(final int color, final int radius, final int gapWidth) { + this.color = color; + this.radius = radius; + this.gapWidth = gapWidth; + } + + public int getLeadingMargin(final boolean first) { + return 2 * radius + gapWidth; + } + + public void drawLeadingMargin(final Canvas c, final Paint p, final int x, final int dir, + final int top, final int baseline, final int bottom, + final CharSequence text, final int start, final int end, + final boolean first, final Layout l) { + if (((Spanned) text).getSpanStart(this) == start) { + Paint.Style style = p.getStyle(); + int oldColor = 0; + oldColor = p.getColor(); + p.setColor(color); + p.setStyle(Paint.Style.FILL); + if (c.isHardwareAccelerated()) { + if (sBulletPath == null) { + sBulletPath = new Path(); + // Bullet is slightly better to avoid aliasing artifacts on mdpi devices. + sBulletPath.addCircle(0.0f, 0.0f, radius, Path.Direction.CW); + } + c.save(); + c.translate(x + dir * radius, (top + bottom) / 2.0f); + c.drawPath(sBulletPath, p); + c.restore(); + } else { + c.drawCircle(x + dir * radius, (top + bottom) / 2.0f, radius, p); + } + p.setColor(oldColor); + p.setStyle(style); + } + } + } + + @SuppressLint("ParcelCreator") + static class CustomTypefaceSpan extends TypefaceSpan { + + private final Typeface newType; + + private CustomTypefaceSpan(final Typeface type) { + super(""); + newType = type; + } + + @Override + public void updateDrawState(final TextPaint textPaint) { + apply(textPaint, newType); + } + + @Override + public void updateMeasureState(final TextPaint paint) { + apply(paint, newType); + } + + private void apply(final Paint paint, final Typeface tf) { + int oldStyle; + Typeface old = paint.getTypeface(); + if (old == null) { + oldStyle = 0; + } else { + oldStyle = old.getStyle(); + } + + int fake = oldStyle & ~tf.getStyle(); + if ((fake & Typeface.BOLD) != 0) { + paint.setFakeBoldText(true); + } + + if ((fake & Typeface.ITALIC) != 0) { + paint.setTextSkewX(-0.25f); + } + + paint.getShader(); + + paint.setTypeface(tf); + } + } + + static class CustomImageSpan extends CustomDynamicDrawableSpan { + private Drawable mDrawable; + private Uri mContentUri; + private int mResourceId; + + private CustomImageSpan(final Bitmap b, final int verticalAlignment) { + super(verticalAlignment); + mDrawable = new BitmapDrawable(AppUtils.getApp().getResources(), b); + mDrawable.setBounds( + 0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight() + ); + } + + private CustomImageSpan(final Drawable d, final int verticalAlignment) { + super(verticalAlignment); + mDrawable = d; + mDrawable.setBounds( + 0, 0, mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight() + ); + } + + private CustomImageSpan(final Uri uri, final int verticalAlignment) { + super(verticalAlignment); + mContentUri = uri; + } + + private CustomImageSpan(@DrawableRes final int resourceId, final int verticalAlignment) { + super(verticalAlignment); + mResourceId = resourceId; + } + + @Override + public Drawable getDrawable() { + Drawable drawable = null; + if (mDrawable != null) { + drawable = mDrawable; + } else if (mContentUri != null) { + Bitmap bitmap; + try { + InputStream is = + AppUtils.getApp().getContentResolver().openInputStream(mContentUri); + bitmap = BitmapFactory.decodeStream(is); + drawable = new BitmapDrawable(AppUtils.getApp().getResources(), bitmap); + drawable.setBounds( + 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight() + ); + if (is != null) { + is.close(); + } + } catch (Exception e) { + Log.e("sms", "Failed to loaded content " + mContentUri, e); + } + } else { + try { + drawable = ContextCompat.getDrawable(AppUtils.getApp(), mResourceId); + drawable.setBounds( + 0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight() + ); + } catch (Exception e) { + Log.e("sms", "Unable to find resource: " + mResourceId); + } + } + return drawable; + } + } + + static abstract class CustomDynamicDrawableSpan extends ReplacementSpan { + + static final int ALIGN_BOTTOM = 0; + + static final int ALIGN_BASELINE = 1; + + static final int ALIGN_CENTER = 2; + + static final int ALIGN_TOP = 3; + + final int mVerticalAlignment; + + private CustomDynamicDrawableSpan() { + mVerticalAlignment = ALIGN_BOTTOM; + } + + private CustomDynamicDrawableSpan(final int verticalAlignment) { + mVerticalAlignment = verticalAlignment; + } + + public abstract Drawable getDrawable(); + + @Override + public int getSize(@NonNull final Paint paint, final CharSequence text, + final int start, final int end, final Paint.FontMetricsInt fm) { + Drawable d = getCachedDrawable(); + Rect rect = d.getBounds(); + if (fm != null) { +// LogUtils.d("fm.top: " + fm.top, +// "fm.ascent: " + fm.ascent, +// "fm.descent: " + fm.descent, +// "fm.bottom: " + fm.bottom, +// "lineHeight: " + (fm.bottom - fm.top)); + int lineHeight = fm.bottom - fm.top; + if (lineHeight < rect.height()) { + if (mVerticalAlignment == ALIGN_TOP) { + fm.top = fm.top; + fm.bottom = rect.height() + fm.top; + } else if (mVerticalAlignment == ALIGN_CENTER) { + fm.top = -rect.height() / 2 - lineHeight / 4; + fm.bottom = rect.height() / 2 - lineHeight / 4; + } else { + fm.top = -rect.height() + fm.bottom; + fm.bottom = fm.bottom; + } + fm.ascent = fm.top; + fm.descent = fm.bottom; + } + } + return rect.right; + } + + @Override + public void draw(@NonNull final Canvas canvas, final CharSequence text, + final int start, final int end, final float x, + final int top, final int y, final int bottom, @NonNull final Paint paint) { + Drawable d = getCachedDrawable(); + Rect rect = d.getBounds(); + canvas.save(); + float transY; + int lineHeight = bottom - top; +// LogUtils.d("rectHeight: " + rect.height(), +// "lineHeight: " + (bottom - top)); + if (rect.height() < lineHeight) { + if (mVerticalAlignment == ALIGN_TOP) { + transY = top; + } else if (mVerticalAlignment == ALIGN_CENTER) { + transY = (bottom + top - rect.height()) / 2; + } else if (mVerticalAlignment == ALIGN_BASELINE) { + transY = y - rect.height(); + } else { + transY = bottom - rect.height(); + } + canvas.translate(x, transY); + } else { + canvas.translate(x, top); + } + d.draw(canvas); + canvas.restore(); + } + + private Drawable getCachedDrawable() { + WeakReference wr = mDrawableRef; + Drawable d = null; + if (wr != null) { + d = wr.get(); + } + if (d == null) { + d = getDrawable(); + mDrawableRef = new WeakReference<>(d); + } + return d; + } + + private WeakReference mDrawableRef; + } + + static class ShaderSpan extends CharacterStyle implements UpdateAppearance { + private Shader mShader; + + private ShaderSpan(final Shader shader) { + this.mShader = shader; + } + + @Override + public void updateDrawState(final TextPaint tp) { + tp.setShader(mShader); + } + } + + static class ShadowSpan extends CharacterStyle implements UpdateAppearance { + private float radius; + private float dx, dy; + private int shadowColor; + + private ShadowSpan(final float radius, + final float dx, + final float dy, + final int shadowColor) { + this.radius = radius; + this.dx = dx; + this.dy = dy; + this.shadowColor = shadowColor; + } + + @Override + public void updateDrawState(final TextPaint tp) { + tp.setShadowLayer(radius, dx, dy, shadowColor); + } + } + + private static class SerializableSpannableStringBuilder extends SpannableStringBuilder + implements Serializable { + + private static final long serialVersionUID = 4909567650765875771L; + } + + +} diff --git a/core/src/main/java/com/chwl/core/utils/myutil/MyTimeUtils.java b/core/src/main/java/com/chwl/core/utils/myutil/MyTimeUtils.java new file mode 100644 index 0000000..32d1458 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/myutil/MyTimeUtils.java @@ -0,0 +1,1635 @@ +package com.chwl.core.utils.myutil; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.provider.Settings; + +import androidx.annotation.NonNull; + +import com.example.lib_utils.AppUtils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/08/02
+ *     desc  : utils about time
+ * 
+ */ +public final class MyTimeUtils { + + private static final ThreadLocal> SDF_THREAD_LOCAL + = new ThreadLocal>() { + @Override + protected Map initialValue() { + return new HashMap<>(); + } + }; + + private static SimpleDateFormat getDefaultFormat() { + return getSafeDateFormat("yyyy-MM-dd HH:mm:ss"); + } + /** + * Checks whether the device is using Network Provided Time or not. + * Useful in situations where you want to verify that the device has a correct time set, to avoid fraud, or if you want to prevent the user from messing with the time and abusing your "one-time" and "expiring" features. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isUsingNetworkProvidedTime() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + return Settings.Global.getInt(AppUtils.getApp().getContentResolver(), Settings.Global.AUTO_TIME, 0) == 1; + } else { + return Settings.System.getInt(AppUtils.getApp().getContentResolver(), Settings.System.AUTO_TIME, 0) == 1; + } + } + + + @SuppressLint("SimpleDateFormat") + public static SimpleDateFormat getSafeDateFormat(String pattern) { + Map sdfMap = SDF_THREAD_LOCAL.get(); + //noinspection ConstantConditions + SimpleDateFormat simpleDateFormat = sdfMap.get(pattern); + if (simpleDateFormat == null) { + simpleDateFormat = new SimpleDateFormat(pattern); + sdfMap.put(pattern, simpleDateFormat); + } + return simpleDateFormat; + } + + private MyTimeUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * Milliseconds to the formatted time string. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param millis The milliseconds. + * @return the formatted time string + */ + public static String millis2String(final long millis) { + return millis2String(millis, getDefaultFormat()); + } + + /** + * Milliseconds to the formatted time string. + * + * @param millis The milliseconds. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the formatted time string + */ + public static String millis2String(long millis, @NonNull final String pattern) { + return millis2String(millis, getSafeDateFormat(pattern)); + } + + /** + * Milliseconds to the formatted time string. + * + * @param millis The milliseconds. + * @param format The format. + * @return the formatted time string + */ + public static String millis2String(final long millis, @NonNull final DateFormat format) { + return format.format(new Date(millis)); + } + + /** + * Formatted time string to the milliseconds. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the milliseconds + */ + public static long string2Millis(final String time) { + return string2Millis(time, getDefaultFormat()); + } + + /** + * Formatted time string to the milliseconds. + * + * @param time The formatted time string. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the milliseconds + */ + public static long string2Millis(final String time, @NonNull final String pattern) { + return string2Millis(time, getSafeDateFormat(pattern)); + } + + /** + * Formatted time string to the milliseconds. + * + * @param time The formatted time string. + * @param format The format. + * @return the milliseconds + */ + public static long string2Millis(final String time, @NonNull final DateFormat format) { + try { + return format.parse(time).getTime(); + } catch (ParseException e) { + e.printStackTrace(); + } + return -1; + } + + /** + * Formatted time string to the date. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the date + */ + public static Date string2Date(final String time) { + return string2Date(time, getDefaultFormat()); + } + + /** + * Formatted time string to the date. + * + * @param time The formatted time string. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the date + */ + public static Date string2Date(final String time, @NonNull final String pattern) { + return string2Date(time, getSafeDateFormat(pattern)); + } + + /** + * Formatted time string to the date. + * + * @param time The formatted time string. + * @param format The format. + * @return the date + */ + public static Date string2Date(final String time, @NonNull final DateFormat format) { + try { + return format.parse(time); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * Date to the formatted time string. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param date The date. + * @return the formatted time string + */ + public static String date2String(final Date date) { + return date2String(date, getDefaultFormat()); + } + + /** + * Date to the formatted time string. + * + * @param date The date. + * @param pattern The pattern of date format, such as yyyy/MM/dd HH:mm + * @return the formatted time string + */ + public static String date2String(final Date date, @NonNull final String pattern) { + return getSafeDateFormat(pattern).format(date); + } + + /** + * Date to the formatted time string. + * + * @param date The date. + * @param format The format. + * @return the formatted time string + */ + public static String date2String(final Date date, @NonNull final DateFormat format) { + return format.format(date); + } + + /** + * Date to the milliseconds. + * + * @param date The date. + * @return the milliseconds + */ + public static long date2Millis(final Date date) { + return date.getTime(); + } + + /** + * Milliseconds to the date. + * + * @param millis The milliseconds. + * @return the date + */ + public static Date millis2Date(final long millis) { + return new Date(millis); + } + + /** + * Return the time span, in unit. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time1 The first formatted time string. + * @param time2 The second formatted time string. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span, in unit + */ + public static long getTimeSpan(final String time1, + final String time2, + @TimeConstants.Unit final int unit) { + return getTimeSpan(time1, time2, getDefaultFormat(), unit); + } + + /** + * Return the time span, in unit. + * + * @param time1 The first formatted time string. + * @param time2 The second formatted time string. + * @param format The format. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span, in unit + */ + public static long getTimeSpan(final String time1, + final String time2, + @NonNull final DateFormat format, + @TimeConstants.Unit final int unit) { + return millis2TimeSpan(string2Millis(time1, format) - string2Millis(time2, format), unit); + } + + /** + * Return the time span, in unit. + * + * @param date1 The first date. + * @param date2 The second date. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span, in unit + */ + public static long getTimeSpan(final Date date1, + final Date date2, + @TimeConstants.Unit final int unit) { + return millis2TimeSpan(date2Millis(date1) - date2Millis(date2), unit); + } + + /** + * Return the time span, in unit. + * + * @param millis1 The first milliseconds. + * @param millis2 The second milliseconds. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span, in unit + */ + public static long getTimeSpan(final long millis1, + final long millis2, + @TimeConstants.Unit final int unit) { + return millis2TimeSpan(millis1 - millis2, unit); + } + + /** + * Return the fit time span. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time1 The first formatted time string. + * @param time2 The second formatted time string. + * @param precision The precision of time span. + *
    + *
  • precision = 0, return null
  • + *
  • precision = 1, return 天
  • + *
  • precision = 2, return 天, 小时
  • + *
  • precision = 3, return 天, 小时, 分钟
  • + *
  • precision = 4, return 天, 小时, 分钟, 秒
  • + *
  • precision >= 5,return 天, 小时, 分钟, 秒, 毫秒
  • + *
+ * @return the fit time span + */ + public static String getFitTimeSpan(final String time1, + final String time2, + final int precision) { + long delta = string2Millis(time1, getDefaultFormat()) - string2Millis(time2, getDefaultFormat()); + return millis2FitTimeSpan(delta, precision); + } + + /** + * Return the fit time span. + * + * @param time1 The first formatted time string. + * @param time2 The second formatted time string. + * @param format The format. + * @param precision The precision of time span. + *
    + *
  • precision = 0, return null
  • + *
  • precision = 1, return 天
  • + *
  • precision = 2, return 天, 小时
  • + *
  • precision = 3, return 天, 小时, 分钟
  • + *
  • precision = 4, return 天, 小时, 分钟, 秒
  • + *
  • precision >= 5,return 天, 小时, 分钟, 秒, 毫秒
  • + *
+ * @return the fit time span + */ + public static String getFitTimeSpan(final String time1, + final String time2, + @NonNull final DateFormat format, + final int precision) { + long delta = string2Millis(time1, format) - string2Millis(time2, format); + return millis2FitTimeSpan(delta, precision); + } + + /** + * Return the fit time span. + * + * @param date1 The first date. + * @param date2 The second date. + * @param precision The precision of time span. + *
    + *
  • precision = 0, return null
  • + *
  • precision = 1, return 天
  • + *
  • precision = 2, return 天, 小时
  • + *
  • precision = 3, return 天, 小时, 分钟
  • + *
  • precision = 4, return 天, 小时, 分钟, 秒
  • + *
  • precision >= 5,return 天, 小时, 分钟, 秒, 毫秒
  • + *
+ * @return the fit time span + */ + public static String getFitTimeSpan(final Date date1, final Date date2, final int precision) { + return millis2FitTimeSpan(date2Millis(date1) - date2Millis(date2), precision); + } + + /** + * Return the fit time span. + * + * @param millis1 The first milliseconds. + * @param millis2 The second milliseconds. + * @param precision The precision of time span. + *
    + *
  • precision = 0, return null
  • + *
  • precision = 1, return 天
  • + *
  • precision = 2, return 天, 小时
  • + *
  • precision = 3, return 天, 小时, 分钟
  • + *
  • precision = 4, return 天, 小时, 分钟, 秒
  • + *
  • precision >= 5,return 天, 小时, 分钟, 秒, 毫秒
  • + *
+ * @return the fit time span + */ + public static String getFitTimeSpan(final long millis1, + final long millis2, + final int precision) { + return millis2FitTimeSpan(millis1 - millis2, precision); + } + + /** + * Return the current time in milliseconds. + * + * @return the current time in milliseconds + */ + public static long getNowMills() { + return System.currentTimeMillis(); + } + + /** + * Return the current formatted time string. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @return the current formatted time string + */ + public static String getNowString() { + return millis2String(System.currentTimeMillis(), getDefaultFormat()); + } + + /** + * Return the current formatted time string. + * + * @param format The format. + * @return the current formatted time string + */ + public static String getNowString(@NonNull final DateFormat format) { + return millis2String(System.currentTimeMillis(), format); + } + + /** + * Return the current date. + * + * @return the current date + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * Return the time span by now, in unit. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span by now, in unit + */ + public static long getTimeSpanByNow(final String time, @TimeConstants.Unit final int unit) { + return getTimeSpan(time, getNowString(), getDefaultFormat(), unit); + } + + /** + * Return the time span by now, in unit. + * + * @param time The formatted time string. + * @param format The format. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span by now, in unit + */ + public static long getTimeSpanByNow(final String time, + @NonNull final DateFormat format, + @TimeConstants.Unit final int unit) { + return getTimeSpan(time, getNowString(format), format, unit); + } + + /** + * Return the time span by now, in unit. + * + * @param date The date. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span by now, in unit + */ + public static long getTimeSpanByNow(final Date date, @TimeConstants.Unit final int unit) { + return getTimeSpan(date, new Date(), unit); + } + + /** + * Return the time span by now, in unit. + * + * @param millis The milliseconds. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the time span by now, in unit + */ + public static long getTimeSpanByNow(final long millis, @TimeConstants.Unit final int unit) { + return getTimeSpan(millis, System.currentTimeMillis(), unit); + } + + /** + * Return the fit time span by now. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param precision The precision of time span. + *
    + *
  • precision = 0,返回 null
  • + *
  • precision = 1,返回天
  • + *
  • precision = 2,返回天和小时
  • + *
  • precision = 3,返回天、小时和分钟
  • + *
  • precision = 4,返回天、小时、分钟和秒
  • + *
  • precision >= 5,返回天、小时、分钟、秒和毫秒
  • + *
+ * @return the fit time span by now + */ + public static String getFitTimeSpanByNow(final String time, final int precision) { + return getFitTimeSpan(time, getNowString(), getDefaultFormat(), precision); + } + + /** + * Return the fit time span by now. + * + * @param time The formatted time string. + * @param format The format. + * @param precision The precision of time span. + *
    + *
  • precision = 0,返回 null
  • + *
  • precision = 1,返回天
  • + *
  • precision = 2,返回天和小时
  • + *
  • precision = 3,返回天、小时和分钟
  • + *
  • precision = 4,返回天、小时、分钟和秒
  • + *
  • precision >= 5,返回天、小时、分钟、秒和毫秒
  • + *
+ * @return the fit time span by now + */ + public static String getFitTimeSpanByNow(final String time, + @NonNull final DateFormat format, + final int precision) { + return getFitTimeSpan(time, getNowString(format), format, precision); + } + + /** + * Return the fit time span by now. + * + * @param date The date. + * @param precision The precision of time span. + *
    + *
  • precision = 0,返回 null
  • + *
  • precision = 1,返回天
  • + *
  • precision = 2,返回天和小时
  • + *
  • precision = 3,返回天、小时和分钟
  • + *
  • precision = 4,返回天、小时、分钟和秒
  • + *
  • precision >= 5,返回天、小时、分钟、秒和毫秒
  • + *
+ * @return the fit time span by now + */ + public static String getFitTimeSpanByNow(final Date date, final int precision) { + return getFitTimeSpan(date, getNowDate(), precision); + } + + /** + * Return the fit time span by now. + * + * @param millis The milliseconds. + * @param precision The precision of time span. + *
    + *
  • precision = 0,返回 null
  • + *
  • precision = 1,返回天
  • + *
  • precision = 2,返回天和小时
  • + *
  • precision = 3,返回天、小时和分钟
  • + *
  • precision = 4,返回天、小时、分钟和秒
  • + *
  • precision >= 5,返回天、小时、分钟、秒和毫秒
  • + *
+ * @return the fit time span by now + */ + public static String getFitTimeSpanByNow(final long millis, final int precision) { + return getFitTimeSpan(millis, System.currentTimeMillis(), precision); + } + + /** + * Return the friendly time span by now. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the friendly time span by now + *
    + *
  • 如果小于 1 秒钟内,显示刚刚
  • + *
  • 如果在 1 分钟内,显示 XXX秒前
  • + *
  • 如果在 1 小时内,显示 XXX分钟前
  • + *
  • 如果在 1 小时外的今天内,显示今天15:32
  • + *
  • 如果是昨天的,显示昨天15:32
  • + *
  • 其余显示,2016-10-15
  • + *
  • 时间不合法的情况全部日期和时间信息,如星期六 十月 27 14:21:20 CST 2007
  • + *
+ */ + public static String getFriendlyTimeSpanByNow(final String time) { + return getFriendlyTimeSpanByNow(time, getDefaultFormat()); + } + + /** + * Return the friendly time span by now. + * + * @param time The formatted time string. + * @param format The format. + * @return the friendly time span by now + *
    + *
  • 如果小于 1 秒钟内,显示刚刚
  • + *
  • 如果在 1 分钟内,显示 XXX秒前
  • + *
  • 如果在 1 小时内,显示 XXX分钟前
  • + *
  • 如果在 1 小时外的今天内,显示今天15:32
  • + *
  • 如果是昨天的,显示昨天15:32
  • + *
  • 其余显示,2016-10-15
  • + *
  • 时间不合法的情况全部日期和时间信息,如星期六 十月 27 14:21:20 CST 2007
  • + *
+ */ + public static String getFriendlyTimeSpanByNow(final String time, + @NonNull final DateFormat format) { + return getFriendlyTimeSpanByNow(string2Millis(time, format)); + } + + /** + * Return the friendly time span by now. + * + * @param date The date. + * @return the friendly time span by now + *
    + *
  • 如果小于 1 秒钟内,显示刚刚
  • + *
  • 如果在 1 分钟内,显示 XXX秒前
  • + *
  • 如果在 1 小时内,显示 XXX分钟前
  • + *
  • 如果在 1 小时外的今天内,显示今天15:32
  • + *
  • 如果是昨天的,显示昨天15:32
  • + *
  • 其余显示,2016-10-15
  • + *
  • 时间不合法的情况全部日期和时间信息,如星期六 十月 27 14:21:20 CST 2007
  • + *
+ */ + public static String getFriendlyTimeSpanByNow(final Date date) { + return getFriendlyTimeSpanByNow(date.getTime()); + } + + /** + * Return the friendly time span by now. + * + * @param millis The milliseconds. + * @return the friendly time span by now + *
    + *
  • 如果小于 1 秒钟内,显示刚刚
  • + *
  • 如果在 1 分钟内,显示 XXX秒前
  • + *
  • 如果在 1 小时内,显示 XXX分钟前
  • + *
  • 如果在 1 小时外的今天内,显示今天15:32
  • + *
  • 如果是昨天的,显示昨天15:32
  • + *
  • 其余显示,2016-10-15
  • + *
  • 时间不合法的情况全部日期和时间信息,如星期六 十月 27 14:21:20 CST 2007
  • + *
+ */ + public static String getFriendlyTimeSpanByNow(final long millis) { + long now = System.currentTimeMillis(); + long span = now - millis; + if (span < 0) + // U can read http://www.apihome.cn/api/java/Formatter.html to understand it. + return String.format("%tc", millis); + if (span < 1000) { + return "刚刚"; + } else if (span < TimeConstants.MIN) { + return String.format(Locale.getDefault(), "%d秒前", span / TimeConstants.SEC); + } else if (span < TimeConstants.HOUR) { + return String.format(Locale.getDefault(), "%d分钟前", span / TimeConstants.MIN); + } + // 获取当天 00:00 + long wee = getWeeOfToday(); + if (millis >= wee) { + return String.format("今天%tR", millis); + } else if (millis >= wee - TimeConstants.DAY) { + return String.format("昨天%tR", millis); + } else { + return String.format("%tF", millis); + } + } + + private static long getWeeOfToday() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTimeInMillis(); + } + + /** + * Return the milliseconds differ time span. + * + * @param millis The milliseconds. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the milliseconds differ time span + */ + public static long getMillis(final long millis, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis + timeSpan2Millis(timeSpan, unit); + } + + /** + * Return the milliseconds differ time span. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the milliseconds differ time span + */ + public static long getMillis(final String time, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return getMillis(time, getDefaultFormat(), timeSpan, unit); + } + + /** + * Return the milliseconds differ time span. + * + * @param time The formatted time string. + * @param format The format. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the milliseconds differ time span. + */ + public static long getMillis(final String time, + @NonNull final DateFormat format, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return string2Millis(time, format) + timeSpan2Millis(timeSpan, unit); + } + + /** + * Return the milliseconds differ time span. + * + * @param date The date. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the milliseconds differ time span. + */ + public static long getMillis(final Date date, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return date2Millis(date) + timeSpan2Millis(timeSpan, unit); + } + + /** + * Return the formatted time string differ time span. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param millis The milliseconds. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span + */ + public static String getString(final long millis, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return getString(millis, getDefaultFormat(), timeSpan, unit); + } + + /** + * Return the formatted time string differ time span. + * + * @param millis The milliseconds. + * @param format The format. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span + */ + public static String getString(final long millis, + @NonNull final DateFormat format, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis2String(millis + timeSpan2Millis(timeSpan, unit), format); + } + + /** + * Return the formatted time string differ time span. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span + */ + public static String getString(final String time, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return getString(time, getDefaultFormat(), timeSpan, unit); + } + + /** + * Return the formatted time string differ time span. + * + * @param time The formatted time string. + * @param format The format. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span + */ + public static String getString(final String time, + @NonNull final DateFormat format, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis2String(string2Millis(time, format) + timeSpan2Millis(timeSpan, unit), format); + } + + /** + * Return the formatted time string differ time span. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param date The date. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span + */ + public static String getString(final Date date, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return getString(date, getDefaultFormat(), timeSpan, unit); + } + + /** + * Return the formatted time string differ time span. + * + * @param date The date. + * @param format The format. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span + */ + public static String getString(final Date date, + @NonNull final DateFormat format, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis2String(date2Millis(date) + timeSpan2Millis(timeSpan, unit), format); + } + + /** + * Return the date differ time span. + * + * @param millis The milliseconds. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the date differ time span + */ + public static Date getDate(final long millis, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis2Date(millis + timeSpan2Millis(timeSpan, unit)); + } + + /** + * Return the date differ time span. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the date differ time span + */ + public static Date getDate(final String time, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return getDate(time, getDefaultFormat(), timeSpan, unit); + } + + /** + * Return the date differ time span. + * + * @param time The formatted time string. + * @param format The format. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the date differ time span + */ + public static Date getDate(final String time, + @NonNull final DateFormat format, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis2Date(string2Millis(time, format) + timeSpan2Millis(timeSpan, unit)); + } + + /** + * Return the date differ time span. + * + * @param date The date. + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the date differ time span + */ + public static Date getDate(final Date date, + final long timeSpan, + @TimeConstants.Unit final int unit) { + return millis2Date(date2Millis(date) + timeSpan2Millis(timeSpan, unit)); + } + + /** + * Return the milliseconds differ time span by now. + * + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the milliseconds differ time span by now + */ + public static long getMillisByNow(final long timeSpan, @TimeConstants.Unit final int unit) { + return getMillis(getNowMills(), timeSpan, unit); + } + + /** + * Return the formatted time string differ time span by now. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span by now + */ + public static String getStringByNow(final long timeSpan, @TimeConstants.Unit final int unit) { + return getStringByNow(timeSpan, getDefaultFormat(), unit); + } + + /** + * Return the formatted time string differ time span by now. + * + * @param timeSpan The time span. + * @param format The format. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the formatted time string differ time span by now + */ + public static String getStringByNow(final long timeSpan, + @NonNull final DateFormat format, + @TimeConstants.Unit final int unit) { + return getString(getNowMills(), format, timeSpan, unit); + } + + /** + * Return the date differ time span by now. + * + * @param timeSpan The time span. + * @param unit The unit of time span. + *
    + *
  • {@link TimeConstants#MSEC}
  • + *
  • {@link TimeConstants#SEC }
  • + *
  • {@link TimeConstants#MIN }
  • + *
  • {@link TimeConstants#HOUR}
  • + *
  • {@link TimeConstants#DAY }
  • + *
+ * @return the date differ time span by now + */ + public static Date getDateByNow(final long timeSpan, @TimeConstants.Unit final int unit) { + return getDate(getNowMills(), timeSpan, unit); + } + + /** + * Return whether it is today. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isToday(final String time) { + return isToday(string2Millis(time, getDefaultFormat())); + } + + /** + * Return whether it is today. + * + * @param time The formatted time string. + * @param format The format. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isToday(final String time, @NonNull final DateFormat format) { + return isToday(string2Millis(time, format)); + } + + /** + * Return whether it is today. + * + * @param date The date. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isToday(final Date date) { + return isToday(date.getTime()); + } + + /** + * Return whether it is today. + * + * @param millis The milliseconds. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isToday(final long millis) { + long wee = getWeeOfToday(); + return millis >= wee && millis < wee + TimeConstants.DAY; + } + + /** + * Return whether it is leap year. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLeapYear(final String time) { + return isLeapYear(string2Date(time, getDefaultFormat())); + } + + /** + * Return whether it is leap year. + * + * @param time The formatted time string. + * @param format The format. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLeapYear(final String time, @NonNull final DateFormat format) { + return isLeapYear(string2Date(time, format)); + } + + /** + * Return whether it is leap year. + * + * @param date The date. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLeapYear(final Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int year = cal.get(Calendar.YEAR); + return isLeapYear(year); + } + + /** + * Return whether it is leap year. + * + * @param millis The milliseconds. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLeapYear(final long millis) { + return isLeapYear(millis2Date(millis)); + } + + /** + * Return whether it is leap year. + * + * @param year The year. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLeapYear(final int year) { + return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; + } + + /** + * Return the day of week in Chinese. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the day of week in Chinese + */ + public static String getChineseWeek(final String time) { + return getChineseWeek(string2Date(time, getDefaultFormat())); + } + + /** + * Return the day of week in Chinese. + * + * @param time The formatted time string. + * @param format The format. + * @return the day of week in Chinese + */ + public static String getChineseWeek(final String time, @NonNull final DateFormat format) { + return getChineseWeek(string2Date(time, format)); + } + + /** + * Return the day of week in Chinese. + * + * @param date The date. + * @return the day of week in Chinese + */ + public static String getChineseWeek(final Date date) { + return new SimpleDateFormat("E", Locale.CHINA).format(date); + } + + /** + * Return the day of week in Chinese. + * + * @param millis The milliseconds. + * @return the day of week in Chinese + */ + public static String getChineseWeek(final long millis) { + return getChineseWeek(new Date(millis)); + } + + /** + * Return the day of week in US. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the day of week in US + */ + public static String getUSWeek(final String time) { + return getUSWeek(string2Date(time, getDefaultFormat())); + } + + /** + * Return the day of week in US. + * + * @param time The formatted time string. + * @param format The format. + * @return the day of week in US + */ + public static String getUSWeek(final String time, @NonNull final DateFormat format) { + return getUSWeek(string2Date(time, format)); + } + + /** + * Return the day of week in US. + * + * @param date The date. + * @return the day of week in US + */ + public static String getUSWeek(final Date date) { + return new SimpleDateFormat("EEEE", Locale.US).format(date); + } + + /** + * Return the day of week in US. + * + * @param millis The milliseconds. + * @return the day of week in US + */ + public static String getUSWeek(final long millis) { + return getUSWeek(new Date(millis)); + } + + /** + * Return whether it is am. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAm() { + Calendar cal = Calendar.getInstance(); + return cal.get(GregorianCalendar.AM_PM) == 0; + } + + /** + * Return whether it is am. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAm(final String time) { + return getValueByCalendarField(time, getDefaultFormat(), GregorianCalendar.AM_PM) == 0; + } + + /** + * Return whether it is am. + * + * @param time The formatted time string. + * @param format The format. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAm(final String time, + @NonNull final DateFormat format) { + return getValueByCalendarField(time, format, GregorianCalendar.AM_PM) == 0; + } + + /** + * Return whether it is am. + * + * @param date The date. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAm(final Date date) { + return getValueByCalendarField(date, GregorianCalendar.AM_PM) == 0; + } + + /** + * Return whether it is am. + * + * @param millis The milliseconds. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAm(final long millis) { + return getValueByCalendarField(millis, GregorianCalendar.AM_PM) == 0; + } + + /** + * Return whether it is am. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isPm() { + return !isAm(); + } + + /** + * Return whether it is am. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isPm(final String time) { + return !isAm(time); + } + + /** + * Return whether it is am. + * + * @param time The formatted time string. + * @param format The format. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isPm(final String time, + @NonNull final DateFormat format) { + return !isAm(time, format); + } + + /** + * Return whether it is am. + * + * @param date The date. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isPm(final Date date) { + return !isAm(date); + } + + /** + * Return whether it is am. + * + * @param millis The milliseconds. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isPm(final long millis) { + return !isAm(millis); + } + + /** + * Returns the value of the given calendar field. + * + * @param field The given calendar field. + *
    + *
  • {@link Calendar#ERA}
  • + *
  • {@link Calendar#YEAR}
  • + *
  • {@link Calendar#MONTH}
  • + *
  • ...
  • + *
  • {@link Calendar#DST_OFFSET}
  • + *
+ * @return the value of the given calendar field + */ + public static int getValueByCalendarField(final int field) { + Calendar cal = Calendar.getInstance(); + return cal.get(field); + } + + /** + * Returns the value of the given calendar field. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @param field The given calendar field. + *
    + *
  • {@link Calendar#ERA}
  • + *
  • {@link Calendar#YEAR}
  • + *
  • {@link Calendar#MONTH}
  • + *
  • ...
  • + *
  • {@link Calendar#DST_OFFSET}
  • + *
+ * @return the value of the given calendar field + */ + public static int getValueByCalendarField(final String time, final int field) { + return getValueByCalendarField(string2Date(time, getDefaultFormat()), field); + } + + /** + * Returns the value of the given calendar field. + * + * @param time The formatted time string. + * @param format The format. + * @param field The given calendar field. + *
    + *
  • {@link Calendar#ERA}
  • + *
  • {@link Calendar#YEAR}
  • + *
  • {@link Calendar#MONTH}
  • + *
  • ...
  • + *
  • {@link Calendar#DST_OFFSET}
  • + *
+ * @return the value of the given calendar field + */ + public static int getValueByCalendarField(final String time, + @NonNull final DateFormat format, + final int field) { + return getValueByCalendarField(string2Date(time, format), field); + } + + /** + * Returns the value of the given calendar field. + * + * @param date The date. + * @param field The given calendar field. + *
    + *
  • {@link Calendar#ERA}
  • + *
  • {@link Calendar#YEAR}
  • + *
  • {@link Calendar#MONTH}
  • + *
  • ...
  • + *
  • {@link Calendar#DST_OFFSET}
  • + *
+ * @return the value of the given calendar field + */ + public static int getValueByCalendarField(final Date date, final int field) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(field); + } + + /** + * Returns the value of the given calendar field. + * + * @param millis The milliseconds. + * @param field The given calendar field. + *
    + *
  • {@link Calendar#ERA}
  • + *
  • {@link Calendar#YEAR}
  • + *
  • {@link Calendar#MONTH}
  • + *
  • ...
  • + *
  • {@link Calendar#DST_OFFSET}
  • + *
+ * @return the value of the given calendar field + */ + public static int getValueByCalendarField(final long millis, final int field) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(millis); + return cal.get(field); + } + + private static final String[] CHINESE_ZODIAC = + {"猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊"}; + + /** + * Return the Chinese zodiac. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the Chinese zodiac + */ + public static String getChineseZodiac(final String time) { + return getChineseZodiac(string2Date(time, getDefaultFormat())); + } + + /** + * Return the Chinese zodiac. + * + * @param time The formatted time string. + * @param format The format. + * @return the Chinese zodiac + */ + public static String getChineseZodiac(final String time, @NonNull final DateFormat format) { + return getChineseZodiac(string2Date(time, format)); + } + + /** + * Return the Chinese zodiac. + * + * @param date The date. + * @return the Chinese zodiac + */ + public static String getChineseZodiac(final Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return CHINESE_ZODIAC[cal.get(Calendar.YEAR) % 12]; + } + + /** + * Return the Chinese zodiac. + * + * @param millis The milliseconds. + * @return the Chinese zodiac + */ + public static String getChineseZodiac(final long millis) { + return getChineseZodiac(millis2Date(millis)); + } + + /** + * Return the Chinese zodiac. + * + * @param year The year. + * @return the Chinese zodiac + */ + public static String getChineseZodiac(final int year) { + return CHINESE_ZODIAC[year % 12]; + } + + private static final int[] ZODIAC_FLAGS = {20, 19, 21, 21, 21, 22, 23, 23, 23, 24, 23, 22}; + private static final String[] ZODIAC = { + "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", + "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座" + }; + + /** + * Return the zodiac. + *

The pattern is {@code yyyy-MM-dd HH:mm:ss}.

+ * + * @param time The formatted time string. + * @return the zodiac + */ + public static String getZodiac(final String time) { + return getZodiac(string2Date(time, getDefaultFormat())); + } + + /** + * Return the zodiac. + * + * @param time The formatted time string. + * @param format The format. + * @return the zodiac + */ + public static String getZodiac(final String time, @NonNull final DateFormat format) { + return getZodiac(string2Date(time, format)); + } + + /** + * Return the zodiac. + * + * @param date The date. + * @return the zodiac + */ + public static String getZodiac(final Date date) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int month = cal.get(Calendar.MONTH) + 1; + int day = cal.get(Calendar.DAY_OF_MONTH); + return getZodiac(month, day); + } + + /** + * Return the zodiac. + * + * @param millis The milliseconds. + * @return the zodiac + */ + public static String getZodiac(final long millis) { + return getZodiac(millis2Date(millis)); + } + + /** + * Return the zodiac. + * + * @param month The month. + * @param day The day. + * @return the zodiac + */ + public static String getZodiac(final int month, final int day) { + return ZODIAC[day >= ZODIAC_FLAGS[month - 1] + ? month - 1 + : (month + 10) % 12]; + } + + private static long timeSpan2Millis(final long timeSpan, @TimeConstants.Unit final int unit) { + return timeSpan * unit; + } + + private static long millis2TimeSpan(final long millis, @TimeConstants.Unit final int unit) { + return millis / unit; + } + + static String millis2FitTimeSpan(long millis, int precision) { + if (precision <= 0) return null; + precision = Math.min(precision, 5); + String[] units = {"天", "小时", "分钟", "秒", "毫秒"}; + if (millis == 0) return 0 + units[precision - 1]; + StringBuilder sb = new StringBuilder(); + if (millis < 0) { + sb.append("-"); + millis = -millis; + } + int[] unitLen = {86400000, 3600000, 60000, 1000, 1}; + for (int i = 0; i < precision; i++) { + if (millis >= unitLen[i]) { + long mode = millis / unitLen[i]; + millis -= mode * unitLen[i]; + sb.append(mode).append(units[i]); + } + } + return sb.toString(); + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/myutil/MyUriUtils.kt b/core/src/main/java/com/chwl/core/utils/myutil/MyUriUtils.kt new file mode 100644 index 0000000..0def74f --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/myutil/MyUriUtils.kt @@ -0,0 +1,212 @@ +package com.chwl.core.utils.myutil + +import android.content.Context +import android.database.Cursor +import android.graphics.BitmapFactory +import android.net.Uri +import android.provider.MediaStore +import android.provider.OpenableColumns +import java.io.File +import java.io.FileOutputStream + +object MyUriUtils { + + fun getName(context: Context, uri: Uri, isImg: Boolean = true): String { + var fileName = "" + try { + val projection = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME) + val cursor: Cursor? = context.contentResolver.query( + uri, projection, null, null, null + ) + + cursor?.use { + if (it.moveToFirst()) { + fileName = + it.getString(it.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)) + } + } + } catch (e: Exception) { + fileName = "" + } + + if (fileName == "") { + val type = getFileType(context, uri) + var fileEnd: String + + if (isImg) { + if (type == "image/gif") { + fileEnd = ".gif" + } else if (type == "image/png") { + fileEnd = ".png" + } else if (type == "image/jpeg") { + fileEnd = ".jpeg" + } else if (type == "image/bmp") { + fileEnd = ".bmp" + } else if (type == "image/webp") { + fileEnd = ".webp" + } else { + fileEnd = ".jpg" + } + } else { + fileEnd = ".mp3" + } + + fileName = "file_${System.currentTimeMillis()}$fileEnd" + } + return fileName + } + + fun copyFile(context: Context, uri: Uri): File? { + try { + val fileName = getName(context, uri,true) + + val outPutDir = context.getExternalFilesDir(null) ?: return null + + val outPutFile = File(outPutDir, fileName) + + if (!outPutDir.exists()) { + outPutDir.mkdirs() + } + + context.contentResolver.openInputStream(uri)?.use { inS -> + FileOutputStream(outPutFile).use { outS -> + inS.copyTo(outS) + } + return outPutFile + } ?: return null + } catch (e: Exception) { + return null + } + } + + fun copyMp3File(context: Context, uri: Uri): File? { + try { + val fileName = getName(context, uri,false) + + val outPutDir = context.getExternalFilesDir(null) ?: return null + + val outPutFile = File(outPutDir, fileName) + + if (!outPutDir.exists()) { + outPutDir.mkdirs() + } + + context.contentResolver.openInputStream(uri)?.use { inS -> + FileOutputStream(outPutFile).use { outS -> + inS.copyTo(outS) + } + return outPutFile + } ?: return null + } catch (e: Exception) { + return null + } + } + + fun needCopy(context: Context, uri: Uri): Boolean { + try { + val fileName = getName(context, uri,false) + + val outPutDir = context.getExternalFilesDir(null) ?: return false + + val outPutFile = File(outPutDir, fileName) + + return !outPutFile.exists() + } catch (e: Exception) { + return false + } + } + + fun getFileType(context: Context, uri: Uri?): String { + if (uri==null) return "" + var type = "" + try { + context.contentResolver?.let { + type = it.getType(uri).toString() + } + } catch (e: Exception) { + + } + return type + } + + fun getFileSize(context: Context, uri: Uri): Long { + var size = -1L + try { + context.contentResolver?.let { + val pro = arrayOf(OpenableColumns.SIZE) + val cursor = it.query(uri, pro, null, null, null) + cursor?.let { c -> + if (c.moveToFirst()) { + val sizeIndex = c.getColumnIndexOrThrow(OpenableColumns.SIZE) + size = c.getLong(sizeIndex) + } + c.close() + } + + } + } catch (e: Exception) { + } + return size + } + + fun isGif(context: Context, uri: Uri?): Boolean { + if (uri == null) return false + return getFileType(context, uri) == "image/gif" + } + + fun copyFileToUrl(context: Context, uri: Uri, outUri: Uri): Boolean { + try { + val contentResolver = context.contentResolver + contentResolver?.openInputStream(uri)?.use { uriStream -> + try { + contentResolver?.openOutputStream(outUri, "wt")?.use { outStream -> + try { + uriStream.copyTo(outStream) + return true + } catch (e: Exception) { + } + } + } catch (e: Exception) { + + } + } + } catch (e: Exception) { + + } + return false + } + + fun getFileInfo(file: File): MutableList? { + var width = 0 + var height = 0 + var minType = "image/jpeg" + var data: MutableList? = null + + try { + BitmapFactory.Options().apply { + inJustDecodeBounds = true + BitmapFactory.decodeFile(file.absolutePath, this) + width = outWidth + height = outHeight + minType = outMimeType + }.let { + data = mutableListOf(width.toString(), height.toString(), minType) + } + } catch (e: Exception) { + + } + return data + } + + fun copyFile(file: File, dir: File) { + try { + if (!dir.exists()) { + dir.mkdirs() + } + file.copyTo(dir, true) + } catch (e: Exception) { + } + } + + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/myutil/MyUtil.kt b/core/src/main/java/com/chwl/core/utils/myutil/MyUtil.kt new file mode 100644 index 0000000..5bd746a --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/myutil/MyUtil.kt @@ -0,0 +1,46 @@ +package com.chwl.core.utils.myutil + +import android.view.View +import com.chwl.library.common.util.doLog + +object MyUtil { + var mAppWidth = 0 + var CLICK_TIME = 0L + var CLICK_DIFF_TIME = 2000L + var upMicIng = false + var downMicNum = 0 //需要下麦的 计数 + + fun changeUpMicStatus(isUpMic: Boolean) { + upMicIng = isUpMic + "上麦 上麦状态 设置 upMicIng = $upMicIng".doLog() + } + + fun initAppWidth(view: View?) { + view?.post { + mAppWidth = view.width + } + } + + fun getPosRowColumns(pos:Int,col:Int) : Array{ + val row = pos / col + val column = pos % col + return arrayOf(row+1,col+1) + } + + fun isDoubleClick() : Boolean { + val time = System.currentTimeMillis() + if (CLICK_TIME > 0) { + val diff = (time - CLICK_TIME).coerceAtLeast(0) + val isDouble = diff < CLICK_DIFF_TIME + if (!isDouble) CLICK_TIME = time + return isDouble + } else { + CLICK_TIME = time + return false + } + return true + } + + + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/utils/myutil/TimeConstants.java b/core/src/main/java/com/chwl/core/utils/myutil/TimeConstants.java new file mode 100644 index 0000000..fe19f13 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/myutil/TimeConstants.java @@ -0,0 +1,28 @@ +package com.chwl.core.utils.myutil; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2017/03/13
+ *     desc  : constants of time
+ * 
+ */ +public final class TimeConstants { + + public static final int MSEC = 1; + public static final int SEC = 1000; + public static final int MIN = 60000; + public static final int HOUR = 3600000; + public static final int DAY = 86400000; + + @IntDef({MSEC, SEC, MIN, HOUR, DAY}) + @Retention(RetentionPolicy.SOURCE) + public @interface Unit { + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/BalanceNotEnoughExeption.java b/core/src/main/java/com/chwl/core/utils/net/BalanceNotEnoughExeption.java new file mode 100644 index 0000000..5b4cf8b --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/BalanceNotEnoughExeption.java @@ -0,0 +1,12 @@ +package com.chwl.core.utils.net; + +/** + * Created by huangmeng1 on 2018/5/14. + */ + +public class BalanceNotEnoughExeption extends Exception { + public final static int code = 31005;//钻石不足错误码 + public BalanceNotEnoughExeption(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/BeanObserver.java b/core/src/main/java/com/chwl/core/utils/net/BeanObserver.java new file mode 100644 index 0000000..e85c5cd --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/BeanObserver.java @@ -0,0 +1,46 @@ +package com.chwl.core.utils.net; + +import com.google.gson.JsonParseException; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +import org.json.JSONException; + +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.net.UnknownHostException; +import java.text.ParseException; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; +import retrofit2.HttpException; + +/** + * create by lvzebiao on 2018/8/29 + */ +public abstract class BeanObserver implements SingleObserver { + + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onError(Throwable e) { + if (e instanceof SocketTimeoutException || e instanceof SocketException || e instanceof HttpException) { + onErrorMsg(ResUtil.getString(R.string.utils_net_beanobserver_03)); + } else if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) { + onErrorMsg(ResUtil.getString(R.string.utils_net_beanobserver_04)); + } else if (e instanceof UnknownHostException) { + onErrorMsg(ResUtil.getString(R.string.utils_net_beanobserver_03)); + } else if (e instanceof IllegalArgumentException) { + onErrorMsg(ResUtil.getString(R.string.utils_net_beanobserver_05)); + } else if (e.getMessage() == null) { + onErrorMsg(ResUtil.getString(R.string.utils_net_beanobserver_02)); + } else { + onErrorMsg(e.getMessage()); + } + } + + public abstract void onErrorMsg(String error); +} diff --git a/core/src/main/java/com/chwl/core/utils/net/DontWarnObserver.java b/core/src/main/java/com/chwl/core/utils/net/DontWarnObserver.java new file mode 100644 index 0000000..8533f53 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/DontWarnObserver.java @@ -0,0 +1,54 @@ +package com.chwl.core.utils.net; + +import android.text.TextUtils; + +import com.chwl.core.R; +import com.chwl.core.XConstants; +import com.chwl.library.utils.ResUtil; + +import java.net.UnknownHostException; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; + +/** + * 没有警告的Observer + * create by lvzebiao @2019/3/26 + */ +public abstract class DontWarnObserver implements SingleObserver { + + public void acceptThrowable(T t, Throwable throwable) { + + } + + public void accept(T t, String error) { + + } + + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onSuccess(T t) { + accept(t, null); + acceptThrowable(t, null); + } + + @Override + public void onError(Throwable e) { + String error = null; + if (e != null) { + error = e.getMessage(); + } + if (e instanceof UnknownHostException) { + error = ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_014); + } + if (TextUtils.isEmpty(error)) { + error = ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_014); + } + accept(null, error); + acceptThrowable(null, e); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/ErrorConsumer.java b/core/src/main/java/com/chwl/core/utils/net/ErrorConsumer.java new file mode 100644 index 0000000..3483fef --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/ErrorConsumer.java @@ -0,0 +1,59 @@ +package com.chwl.core.utils.net; + +import android.text.TextUtils; + +import com.chwl.core.R; +import com.chwl.core.XConstants; +import com.chwl.core.patriarch.exception.PmRoomLimitException; +import com.chwl.library.rxbus.RxBus; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.chwl.library.utils.config.BasicConfig; + +import java.net.UnknownHostException; + +import io.reactivex.functions.Consumer; +import retrofit2.HttpException; + +/** + * Created by huangmeng1 on 2018/5/9. + */ + +public class ErrorConsumer implements Consumer { + private boolean showtoast; + + public ErrorConsumer(boolean showtoast) { + this.showtoast = showtoast; + } + + public ErrorConsumer() { + } + + @Override + public void accept(Throwable e) throws Exception { + String msg = ""; + if (showtoast) { + RxBus.get().post(XConstants.HIDE); + } + if (e instanceof ServerException) { + if (e.getMessage() != null) { + msg = e.getMessage(); + } + } else if (e instanceof HttpException) { + msg = ResUtil.getString(R.string.utils_net_errorconsumer_01) + ((HttpException) e).code(); + } else if (e instanceof UnknownHostException) { + msg = ResUtil.getString(R.string.utils_net_errorconsumer_02); + } else if (e instanceof PmRoomLimitException) { + return; + } else { + msg = ResUtil.getString(R.string.utils_net_errorconsumer_03); + } + onFailure(msg); + } + + public void onFailure(String msg) { + if (showtoast && !TextUtils.isEmpty(msg)) { + SingleToastUtil.showToast(BasicConfig.INSTANCE.getAppContext(), msg); + } + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/FreezeException.java b/core/src/main/java/com/chwl/core/utils/net/FreezeException.java new file mode 100644 index 0000000..40d1924 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/FreezeException.java @@ -0,0 +1,9 @@ +package com.chwl.core.utils.net; + +public class FreezeException extends Exception { + public static final int code = 402; + + public FreezeException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/IgnoreException.java b/core/src/main/java/com/chwl/core/utils/net/IgnoreException.java new file mode 100644 index 0000000..e02b2a0 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/IgnoreException.java @@ -0,0 +1,11 @@ +package com.chwl.core.utils.net; + +/** + * 可以忽略的异常,比如不弹toast + */ + +public class IgnoreException extends Exception { + public IgnoreException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/RadishNotEnoughException.java b/core/src/main/java/com/chwl/core/utils/net/RadishNotEnoughException.java new file mode 100644 index 0000000..08fb1da --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/RadishNotEnoughException.java @@ -0,0 +1,12 @@ +package com.chwl.core.utils.net; + +/** + * create by lvzebiao @2019/3/21 + */ +public class RadishNotEnoughException extends Exception { + public final static int code = 881201;//萝卜不足错误码 + + public RadishNotEnoughException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/RxExtension.kt b/core/src/main/java/com/chwl/core/utils/net/RxExtension.kt new file mode 100644 index 0000000..a3c8018 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/RxExtension.kt @@ -0,0 +1,99 @@ +package com.chwl.core.utils.net + + +import com.chwl.core.R +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.utils.extension.ifNullOrEmpty +import com.chwl.library.utils.ResUtil +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import java.io.IOException + +/** + * 这里简单对接口脱掉外层,不适合成功情况下没有data字段的接口使用 + * + * @param + * @return + */ + +fun Single>.handleBeanData(): Single { + return this.handleException() + .flatMap { + if (it.isSuccess) { + if (it.data != null) { + return@flatMap Single.just(it.data) + } else { + return@flatMap Single.error(Throwable(ResUtil.getString(R.string.utils_net_rxextension_01))) + } + } else { + return@flatMap Single.error(Throwable(it.message.ifNullOrEmpty { ResUtil.getString(R.string.utils_net_rxextension_02) })) + } + } + + +} + +/** + * data是String的接口服务器返回的data可能是空的,写个String专用的,主要是进行了判空处理... + * + * @return + */ +fun Single>.handleStringData(): Single { + return this.handleException() + .flatMap { + if (it.isSuccess) { + return@flatMap Single.just(it.data.ifNullOrEmpty { ResUtil.getString(R.string.utils_net_rxextension_03) }) + } else { + return@flatMap Single.error(Throwable(it.message.ifNullOrEmpty { ResUtil.getString(R.string.utils_net_rxextension_04) })) + } + } + +} + +/** + * 统一IOException处理,请求接口报IOException基本是网络不正常导致的 + * + * @param + * @return + */ + +fun Single.handleException(): Single { + return this.onErrorResumeNext { + if (it is IOException) { + return@onErrorResumeNext Single.error(Throwable(ResUtil.getString(R.string.utils_net_rxextension_05))) + } + Single.error(it) + } + +} + +/** + * 接口线程调度 + * + * @param + * @return + */ +fun Single.io2main(): Single { + return this.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + +} + +suspend inline fun launchRequest( + crossinline block: suspend () -> ServiceResult +): T? { + return try { + block() + } catch (e: Exception) { + e.printStackTrace() + throw e + }.run { + if (isSuccess) { + data + } else { + throw ServerException(message, code) + } + } +} + diff --git a/core/src/main/java/com/chwl/core/utils/net/RxHelper.java b/core/src/main/java/com/chwl/core/utils/net/RxHelper.java new file mode 100644 index 0000000..ab40cfa --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/RxHelper.java @@ -0,0 +1,356 @@ +package com.chwl.core.utils.net; + +import android.content.Context; +import android.text.TextUtils; + +import com.chwl.core.R; +import com.chwl.core.XConstants; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.exception.FailReasonException; +import com.chwl.core.patriarch.exception.PmRoomLimitException; +import com.chwl.core.super_admin.model.exception.SAdminCannotGameException; +import com.chwl.library.rxbus.RxBus; +import com.chwl.library.utils.ResUtil; +import com.google.gson.JsonElement; +import com.orhanobut.logger.Logger; +import com.trello.rxlifecycle3.LifecycleProvider; +import com.trello.rxlifecycle3.android.ActivityEvent; +import com.trello.rxlifecycle3.android.FragmentEvent; +import com.trello.rxlifecycle3.components.RxActivity; +import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; + +import java.io.IOException; + +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.SingleTransformer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; + + +/** + * Created by hm on 2016/12/29. + */ + +public class RxHelper { + public static String ERROR_TIPS = ResUtil.getString(R.string.utils_net_rxhelper_01); + + /** + * 这里简单对接口脱掉外层,不适合成功情况下没有data字段的接口使用 + * + * @param + * @return + */ + public static SingleTransformer, T> handleBeanData() { + return upstream -> upstream + .flatMap(result -> { + if (result.isSuccess()) { + if (result.getData() != null) { + return Single.just(result.getData()); + } else { + Logger.e(ERROR_TIPS); + return Single.error(new Throwable(ERROR_TIPS)); + } + } else { + return Single.error(createThrowable(result)); + } + }); + } + + + /** + * 这里简单对接口脱掉外层,不适合成功情况下没有data字段的接口使用 + * + * @param + * @return + */ + public static SingleTransformer, T> handleBeanData2() { + return upstream -> upstream + .flatMap(result -> { + if (result.isSuccess()) { + if (result.getData() != null) { + return Single.just(result.getData()); + } else { + Logger.e(ERROR_TIPS); + return Single.error(new Throwable(ERROR_TIPS)); + } + } else { + return Single.error(new ServerException(getValidMessage(result), result.getCode())); + } + }); + } + + /** + * 这里简单对接口脱掉外层,不适合成功情况下没有data字段的接口使用 + * + * @param + * @return + */ + public static SingleTransformer, T> handleBeanData3() { + return upstream -> upstream + .flatMap(result -> { + if (result.isSuccess()) { + if (result.getData() != null) { + return Single.just(result.getData()); + } else { + return Single.error(new ServerException("",500)); + } + } else { + return Single.error(new ServerException(getValidMessage(result), result.getCode())); + } + }); + } + + + public interface NullHandle { + T createT(); + } + + /** + * 接口返回的一个通用处理,传入null,接口的data字段必须不能为空 + */ + public static SingleTransformer, T> handleCommon() { + return handleCommon(null); + } + + /** + * 接口返回的一个通用处理,要兼容data为空话,传入一个NullHandle + */ + public static SingleTransformer, T> handleCommon(NullHandle handle) { + return upstream -> upstream + .flatMap(result -> { + if (result.isSuccess()) { + if (result.getData() != null) { + return Single.just(result.getData()); + } + + if (handle != null && handle.createT() != null) { + return Single.just(handle.createT()); + } + Logger.e(ResUtil.getString(R.string.utils_net_rxhelper_02)); + return Single.error(new Throwable(ResUtil.getString(R.string.utils_net_rxhelper_03))); + } + + if (result.getCode() != 0) { + return Single.error(new FailReasonException(result.getMessage(), result.getCode())); + } + + return Single.error(new Throwable(getValidMessage(result))); + + }).compose(handleSchedulers()).compose(handleException()); + } + + public static SingleTransformer, String> handleStringData() { + return upstream -> upstream.compose(handleSchAndExce()).flatMap((Function, SingleSource>) tServiceResult -> { + if (tServiceResult.isSuccess()) { + return tServiceResult.getData() == null ? Single.just(ResUtil.getString(R.string.utils_net_rxhelper_04)) : Single.just(tServiceResult.getData()); + } + return Single.error(new Throwable(tServiceResult.getMessage())); + }); + } + + public static SingleTransformer, String> handleIgnoreData() { + return handleIgnoreData(""); + } + + /** + * 不需要关注data结果,只需要判断是否成功的处理 + */ + public static SingleTransformer, String> handleIgnoreData(String justData) { + return upstream -> upstream + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function, SingleSource>) tServiceResult -> { + if (tServiceResult.isSuccess()) { + String result; + if (justData == null) { + result = ""; + } else { + result = justData; + } + return Single.just(result); + } + return Single.error(createThrowable(tServiceResult)); + }); + } + + /** + * 接口线程调度 + * + * @param + * @return + */ + + public static SingleTransformer handleSchedulers() { + return upstream -> upstream.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public static SingleTransformer handleSchAndExce() { + return upstream -> upstream.compose(handleSchedulers()) + .compose(handleException()); + } + + /** + * 管理异常一些特别的处理 + * + * @param + * @return + */ + public static SingleTransformer handleException() { + return upstream -> upstream.onErrorResumeNext(throwable -> { + if (throwable instanceof IOException) { + return Single.error(new Throwable(ResUtil.getString(R.string.utils_net_rxhelper_05))); + } + return Single.error(throwable); + }); + } + + /** + * 管理商品的一些异常 + * 比如余额不足,萝卜不足 + * + * @param + * @return + */ + public static SingleTransformer, ServiceResult> handleGoods() { + return upstream -> upstream + .flatMap(result -> { + if (BalanceNotEnoughExeption.code == result.getCode()) { + return Single.error(new BalanceNotEnoughExeption(result.getMessage())); + } + if (RadishNotEnoughException.code == result.getCode()) { + return Single.error(new RadishNotEnoughException(result.getMessage())); + } + return Single.just(result); + }); + } + + public final static String DEFAULT_MSG = ResUtil.getString(R.string.utils_net_rxhelper_06); + + public static String getValidMessage(ServiceResult result) { + if (result != null && !TextUtils.isEmpty(result.getMessage())) { + return result.getMessage(); + } + return DEFAULT_MSG; + } + + public static SingleTransformer bindActivity(LifecycleProvider provider) { + return upstream -> upstream.compose(provider.bindUntilEvent(ActivityEvent.DESTROY)); + } + + public static SingleTransformer bindFragment(LifecycleProvider provider) { + return upstream -> upstream.compose(provider.bindUntilEvent(FragmentEvent.DESTROY_VIEW)); + } + + public static SingleTransformer bindContext(Context context) { + return upstream -> { + if (context == null) { + return upstream; + } + if (context instanceof RxAppCompatActivity) { + return upstream.compose(((RxAppCompatActivity) context) + .bindUntilEvent(ActivityEvent.DESTROY)); + } else if (context instanceof RxActivity) { + return upstream.compose(((RxActivity) context) + .bindUntilEvent(ActivityEvent.DESTROY)); + } + return upstream; + }; + } + + public static Throwable createThrowable(ServiceResult result) { + return new Throwable(getValidMessage(result)); + } + + public static SingleTransformer, T> singleMainResult() { + return observable -> observable.compose(handleSchedulers()).compose(singleResult(false)); + } + + /** + * 统一在baseactivity里面接收load弹窗的显示和隐藏 + * + * @return + */ + public static SingleTransformer, T> singleMainResult(boolean showLoad) { + if (showLoad) { + RxBus.get().post(XConstants.SHOW); + } + return observable -> observable.compose(handleSchedulers()).compose(singleResult(showLoad)); + } + + public static SingleTransformer, T> singleMainResultNoToast() { + RxBus.get().post(XConstants.SHOW); + return observable -> observable.compose(handleSchedulers()).compose(singleResult(false)) + .doFinally(() -> RxBus.get().post(XConstants.HIDE)) + .doOnError((Consumer) throwable -> { + RxBus.get().post(XConstants.HIDE); + }); + } + + private static SingleTransformer, T> singleResult(boolean showLoad) { + return upstream -> upstream.flatMap(tBaseBean -> Single.create((SingleOnSubscribe) e -> { + if (showLoad) { + RxBus.get().post(XConstants.HIDE); + } + if (tBaseBean.isSuccess()) { + if (tBaseBean.getData() == null) { + e.onSuccess((T) ""); + } else { + e.onSuccess(tBaseBean.getData()); + } + } else { + e.onError(new ServerException(tBaseBean.getMessage(), tBaseBean.getCode())); + } + })).doOnError(new ErrorConsumer(showLoad)); + } + + public static String getNotEmptyError(Throwable throwable) { + if (throwable == null || TextUtils.isEmpty(throwable.getMessage())) { + return DEFAULT_MSG; + } + return throwable.getMessage(); + } + + /** + * 青少年时长限制。。。实在 太多接口要处理 + * 写一个通用的 + * + * @param - + * @return - + */ + public static SingleTransformer, ServiceResult> handleRoomPmLimit() { + return upstream -> upstream + .flatMap(result -> { + if (result == null) { + return Single.error(new Throwable("null result")); + } + if (PmRoomLimitException.ERROR_CODE == result.getCode()) { + return Single.error(new PmRoomLimitException(getValidMessage(result))); + } + return Single.just(result); + }); + } + + /** + * 超管不能玩游戏 + * + * @param - + * @return - + */ + public static SingleTransformer, ServiceResult> handleSAdminError() { + return upstream -> upstream + .flatMap(result -> { + if (result == null) { + return Single.error(new Throwable("null result")); + } + if (SAdminCannotGameException.ERROR_CODE == result.getCode()) { + return Single.error(new SAdminCannotGameException(RxHelper.getValidMessage(result))); + } + return Single.just(result); + }); + } + +} diff --git a/core/src/main/java/com/chwl/core/utils/net/ServerException.java b/core/src/main/java/com/chwl/core/utils/net/ServerException.java new file mode 100644 index 0000000..e039938 --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/ServerException.java @@ -0,0 +1,14 @@ +package com.chwl.core.utils.net; + +/** + * Created by fwhm on 2017/7/27. + */ + +public class ServerException extends RuntimeException { + public int code; + + public ServerException(String message, int code) { + super(message); + this.code = code; + } +} diff --git a/core/src/main/java/com/chwl/core/utils/net/VipLevelNotEnoughException.java b/core/src/main/java/com/chwl/core/utils/net/VipLevelNotEnoughException.java new file mode 100644 index 0000000..0e5962f --- /dev/null +++ b/core/src/main/java/com/chwl/core/utils/net/VipLevelNotEnoughException.java @@ -0,0 +1,12 @@ +package com.chwl.core.utils.net; + +/** + * Created by huangmeng1 on 2018/5/14. + */ + +public class VipLevelNotEnoughException extends Exception { + public final static int code = 8535;//VIP等级不足 + public VipLevelNotEnoughException(String message) { + super(message); + } +} diff --git a/core/src/main/java/com/chwl/core/vip/VipBroadcastMsgEvent.kt b/core/src/main/java/com/chwl/core/vip/VipBroadcastMsgEvent.kt new file mode 100644 index 0000000..85795bb --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/VipBroadcastMsgEvent.kt @@ -0,0 +1,7 @@ +package com.chwl.core.vip + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage + +data class VipBroadcastMsgEvent( + val message: ChatRoomMessage? = null +) diff --git a/core/src/main/java/com/chwl/core/vip/VipModel.kt b/core/src/main/java/com/chwl/core/vip/VipModel.kt new file mode 100644 index 0000000..14ac648 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/VipModel.kt @@ -0,0 +1,120 @@ +package com.chwl.core.vip + +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.manager.AvRoomDataManager +import com.chwl.core.utils.net.launchRequest +import com.chwl.core.vip.bean.VipBroadcastInfo +import com.chwl.core.vip.bean.VipPageInfo +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.* + +object VipModel : BaseModel() { + + private val api = RxNet.create(Api::class.java) + + suspend fun getVipPageInfo(): VipPageInfo? = + launchRequest { + api.getVipPageInfo() + } + + suspend fun saveOriginDisguise(): Any? = + launchRequest { + api.saveOriginDisguise() + } + + suspend fun getVipBroadcastInfo(): VipBroadcastInfo? = + launchRequest { + api.getVipBroadcastInfo(AvRoomDataManager.get().roomUid) + } + + suspend fun sendVipBroadcast(content: String): String? = + launchRequest { + api.sendVipBroadcast(content, AvRoomDataManager.get().roomUid) + } + + suspend fun changeInvisibleInRoom(open: Boolean): String? = + launchRequest { + api.changeInvisibleInRoom(open) + } + + suspend fun openVipWithDiamond(vipLevel:Int): Any? = + launchRequest { + api.openVipWithDiamond( + if (AvRoomDataManager.get().roomUid == 0L) null else AvRoomDataManager.get().roomUid, + vipLevel) + } + + suspend fun getVipRebate(id: Long): Any? = + launchRequest { + api.getVipRebate(id) + } + + private interface Api { + + /** + * 获取vip主页信息 + * + * @return + */ + @GET("vip/v2/getVipPageInfo") + suspend fun getVipPageInfo(): ServiceResult + + + /** + * 保留原有装扮 + */ + + @GET("/vip/recoveryDress") + suspend fun saveOriginDisguise(): ServiceResult + + + /** + * 获取用户贵族房间小喇叭信息 + * + * @return + */ + @GET("/vip/getUserVipRoomHorn") + suspend fun getVipBroadcastInfo(@Query("roomUid") roomUid: Long): ServiceResult + + /** + * 发送贵族房内小喇叭 + * + * @return + */ + @GET("/vip/sendRoomHorn") + suspend fun sendVipBroadcast( + @Query("content") content: String, + @Query("roomUid") roomUid: Long + ): ServiceResult + + /** + * 开关隐身进房状态 + * + * @return + */ + @GET("/vip/changeInvisibleInRoom") + suspend fun changeInvisibleInRoom(@Query("open") open: Boolean): ServiceResult + + /** + * 使用钻石开通贵族 + * + * @return + */ + @FormUrlEncoded + @POST("/vip/openWithDiamond") + suspend fun openVipWithDiamond(@Field("roomUid") roomUid: Long?, + @Field("vipLevel") vipLevel: Int): ServiceResult + + /** + * 领取返利 + * + * @return + */ + @FormUrlEncoded + @POST("/vip/returnProfit/receive") + suspend fun getVipRebate(@Field("returnProfitRecordId") returnProfitRecordId: Long?): ServiceResult + + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/vip/VipOpenEvent.kt b/core/src/main/java/com/chwl/core/vip/VipOpenEvent.kt new file mode 100644 index 0000000..df834d8 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/VipOpenEvent.kt @@ -0,0 +1,3 @@ +package com.chwl.core.vip + + class VipOpenEvent diff --git a/core/src/main/java/com/chwl/core/vip/VipUpgradeEvent.kt b/core/src/main/java/com/chwl/core/vip/VipUpgradeEvent.kt new file mode 100644 index 0000000..dfa1f43 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/VipUpgradeEvent.kt @@ -0,0 +1,5 @@ +package com.chwl.core.vip + +import com.chwl.core.vip.bean.VipInfo + +data class VipUpgradeEvent(val vipInfo: VipInfo) diff --git a/core/src/main/java/com/chwl/core/vip/bean/UserVipInfo.kt b/core/src/main/java/com/chwl/core/vip/bean/UserVipInfo.kt new file mode 100644 index 0000000..dfe6d52 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/UserVipInfo.kt @@ -0,0 +1,22 @@ +package com.chwl.core.vip.bean + +import java.io.Serializable + +data class UserVipInfo( + val vipIcon: String = "", + val vipName: String = "", + val vipLevel: Int = 0, + val friendNickColour: String = "", + val preventKick: Boolean = false, + val privateChatLimit: Boolean = false, + val visitListView: Boolean = false, //无恒浏览 开关 + var enterHide: Boolean = false, + val preventTrace: Boolean = false, + var preventFollow: Boolean = false, + var uploadGifAvatar: Boolean = false, + var roomPicScreen: Boolean = false, + var visitHide: Boolean = false, //访客记录 高斯模糊 + val enterRoomEffects: String = "", + var userCardBG: String = "", + var nameplateUrl: String = "" +) : Serializable diff --git a/core/src/main/java/com/chwl/core/vip/bean/VipAuthInfo.kt b/core/src/main/java/com/chwl/core/vip/bean/VipAuthInfo.kt new file mode 100644 index 0000000..d1389e2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/VipAuthInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.vip.bean + +data class VipAuthInfo( + val authDesc: String = "", + val authIcon: String = "", + val authIntro: String = "", + val authName: String = "", + val authType: Int = 0, + val createTime: String = "", + val descPic: String = "", + val id: Int = 0, + val seq: Int = 0, + val status: Int = 0, + val updateTime: String = "" + ) diff --git a/core/src/main/java/com/chwl/core/vip/bean/VipBroadcastInfo.kt b/core/src/main/java/com/chwl/core/vip/bean/VipBroadcastInfo.kt new file mode 100644 index 0000000..4ca854c --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/VipBroadcastInfo.kt @@ -0,0 +1,9 @@ +package com.chwl.core.vip.bean + +import java.io.Serializable + +data class VipBroadcastInfo( + val lastSendTime: Long = 0L, + val remainCount: Int = 0, + val totalCount: Int = 0, +) : Serializable diff --git a/core/src/main/java/com/chwl/core/vip/bean/VipInfo.kt b/core/src/main/java/com/chwl/core/vip/bean/VipInfo.kt new file mode 100644 index 0000000..129d059 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/VipInfo.kt @@ -0,0 +1,37 @@ +package com.chwl.core.vip.bean + +import java.io.Serializable +import java.time.temporal.TemporalAmount + +data class VipInfo( + /** + * 是否敬请期待:1. 否 2.是 + */ + val comingSoon: Int = 0, + val levelKeepScore: Int = 0, + val levelUpScore: Int = 0, + val ownAuthTypes: List? = null, + val vipIcon: String = "", + val vipLevel: Int = 0, + val vipLogo: String = "", + val vipName: String = "", + var isMaxLevel: Boolean = false, + var remainSeconds: Int = 0, + var currLevel: Int = 0, + var currScore: Int = 0, + var nextVipName: String? = null, + var isReturnProfit: Int? = null, + val returnProfits: List? = null, + var buyAmount: Int = 0 +) : Serializable { + + fun isRebate() = isReturnProfit == 1 + + override fun equals(other: Any?): Boolean { + return other is VipInfo && other.vipLevel == vipLevel + } + + override fun hashCode(): Int { + return vipLevel + } +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/vip/bean/VipMessageInfo.java b/core/src/main/java/com/chwl/core/vip/bean/VipMessageInfo.java new file mode 100644 index 0000000..0fe93fa --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/VipMessageInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.vip.bean; + +import lombok.Data; + +@Data +public class VipMessageInfo { + private long uid; + private String nick; + private String avatar; + private long erbanNo; + private String currVipName; + private String preVipName; + private long roomUid; + private String floatPic; + private String content; + private String vipIcon; +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/vip/bean/VipPageInfo.kt b/core/src/main/java/com/chwl/core/vip/bean/VipPageInfo.kt new file mode 100644 index 0000000..44cfd6d --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/VipPageInfo.kt @@ -0,0 +1,10 @@ +package com.chwl.core.vip.bean + +data class VipPageInfo( + val vipAuthInfos: List? = null, + val vipInfos: List? = null, + val remainSeconds: Int = 0, + val currLevel: Int = 0, + val currScore: Int = 0, + val isMaxLevel: Boolean = false +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/vip/bean/VipRebateInfo.kt b/core/src/main/java/com/chwl/core/vip/bean/VipRebateInfo.kt new file mode 100644 index 0000000..992bab2 --- /dev/null +++ b/core/src/main/java/com/chwl/core/vip/bean/VipRebateInfo.kt @@ -0,0 +1,18 @@ +package com.chwl.core.vip.bean + +/** + * Created by Max on 2024/3/29 14:44 + * Desc: + **/ +data class VipRebateInfo( + val createTime: Long? = null, + val id: Long? = null, + var isReceive: Boolean? = null, + val profitAmount: Long? = null, + val profitDate: Long? = null, + val returnProfitRecordId: Long? = null, + val seqNo: Int? = null, + val updateTime: Long? = null, + val vipLevel: Int? = null, + val isReach: Boolean? = null +) \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/web/bean/H5NotifyData.java b/core/src/main/java/com/chwl/core/web/bean/H5NotifyData.java new file mode 100644 index 0000000..b9b0bd5 --- /dev/null +++ b/core/src/main/java/com/chwl/core/web/bean/H5NotifyData.java @@ -0,0 +1,34 @@ +package com.chwl.core.web.bean; + +import android.text.TextUtils; + +import com.google.gson.Gson; + +import lombok.Data; + +/** + * h5通知客户端的数据 + * Created by lvzebiao on 2019/2/25. + */ +@Data +public class H5NotifyData { + /** + * 刷新推荐卡仓库的数据 + */ + public final static int TYPE_REFRESH_RECOMMEND_POS_DATA = 1; + + private int type; + + public static H5NotifyData jsonToBean(String json) { + if (TextUtils.isEmpty(json)) { + return null; + } + try { + return new Gson().fromJson(json, H5NotifyData.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + +} diff --git a/core/src/main/java/com/chwl/core/web/bean/WebJsBeanInfo.java b/core/src/main/java/com/chwl/core/web/bean/WebJsBeanInfo.java new file mode 100644 index 0000000..74c8407 --- /dev/null +++ b/core/src/main/java/com/chwl/core/web/bean/WebJsBeanInfo.java @@ -0,0 +1,147 @@ +package com.chwl.core.web.bean; + +/** + *

js回调字段信息

+ * + * @author jiahui + * @date 2018/1/23 + */ +public class WebJsBeanInfo { + + public static final int TEXT = 1; + public static final int SHARE = 2; + public static final int JUMP_APP_PAGE = 3; + public static final int RESET_UI = 4; + public static final int IMAGE = 5;// 分享图片 + + + private int type; + private DataBean data; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public static class DataBean { + + private String msg; + private String title; + private String link; + + private String imgUrl; + private String desc; + private String showUrl; + + private int routerType; + private String routerVal; + private long targetUid; + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getShowUrl() { + return showUrl; + } + + public void setShowUrl(String showUrl) { + this.showUrl = showUrl; + } + + public int getRouterType() { + return routerType; + } + + public void setRouterType(int routerType) { + this.routerType = routerType; + } + + public String getRouterVal() { + return routerVal; + } + + public void setRouterVal(String routerVal) { + this.routerVal = routerVal; + + } + + public long getTargetUid() { + return targetUid; + } + + public void setTargetUid(long targetUid) { + this.targetUid = targetUid; + } + + @Override + public String toString() { + return "DataBean{" + + "msg='" + msg + '\'' + + ", title='" + title + '\'' + + ", link='" + link + '\'' + + ", imgUrl='" + imgUrl + '\'' + + ", desc='" + desc + '\'' + + ", showUrl='" + showUrl + '\'' + + ", routerType=" + routerType + + ", routerVal=" + routerVal + + ", targetUid=" + targetUid + + '}'; + } + } + + @Override + public String toString() { + return "WebJsBeanInfo{" + + "type=" + type + + ", data=" + data + + '}'; + } +} diff --git a/core/src/main/java/com/chwl/core/web/event/WebViewRefreshEvent.java b/core/src/main/java/com/chwl/core/web/event/WebViewRefreshEvent.java new file mode 100644 index 0000000..9f1e037 --- /dev/null +++ b/core/src/main/java/com/chwl/core/web/event/WebViewRefreshEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.web.event; + +public class WebViewRefreshEvent { +} diff --git a/core/src/main/java/com/chwl/core/widget/img/MyCircleImageView.kt b/core/src/main/java/com/chwl/core/widget/img/MyCircleImageView.kt new file mode 100644 index 0000000..62aed81 --- /dev/null +++ b/core/src/main/java/com/chwl/core/widget/img/MyCircleImageView.kt @@ -0,0 +1,53 @@ +package com.chwl.core.widget.img + +import android.content.Context +import android.content.res.TypedArray +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.view.setPadding +import com.chwl.core.R + +class MyCircleImageView : AppCompatImageView { + + private var mBorderWidth = 0f; + private var mBorderRadius = 0f; + private var mBorderColor = 0x00000000; + + constructor(context: Context) : super(context){ + initView(context, null) + } + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs){ + initView(context, attrs) + } + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ){ + initView(context, attrs) + } + + + private fun initView(context: Context, attrs: AttributeSet?) { + + attrs?.let { + val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.MyCircleImageView) + mBorderWidth = typedArray.getDimension(R.styleable.MyCircleImageView_borderWidth, 0f) + mBorderRadius = typedArray.getDimension(R.styleable.MyCircleImageView_borderRadius, 0f) + mBorderColor = typedArray.getColor(R.styleable.MyCircleImageView_borderColor, 0x00000000) + typedArray.recycle() + } + + + val shape = GradientDrawable() + //设置边框,参数为边框的类型,有矩形,椭圆,还有线等等,自己去试; + shape.shape = GradientDrawable.RECTANGLE + shape.cornerRadius = mBorderRadius + shape.setStroke(mBorderWidth.toInt(), mBorderColor) + setPadding(mBorderWidth.toInt()) + background = shape + } + + +} \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridItemTouchListener.java b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridItemTouchListener.java new file mode 100644 index 0000000..51319d9 --- /dev/null +++ b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridItemTouchListener.java @@ -0,0 +1,89 @@ +package com.chwl.core.widget.layoutmanager.pagergridlayoutmanager; + +import android.util.Log; +import android.view.MotionEvent; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 处理滑动冲突 + * + * @author ShenBen + * @date 2021/9/28 09:24 + * @email 714081644@qq.com + */ +class PagerGridItemTouchListener extends RecyclerView.SimpleOnItemTouchListener { + private static final String TAG = "ItemTouchListener"; + + private final PagerGridLayoutManager layoutManager; + private final RecyclerView recyclerView; + private int mScrollPointerId; + private int mInitialTouchX; + private int mInitialTouchY; + + PagerGridItemTouchListener(PagerGridLayoutManager layoutManager, RecyclerView recyclerView) { + this.layoutManager = layoutManager; + this.recyclerView = recyclerView; + } + + @Override + public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { + final int actionMasked = e.getActionMasked(); + final int actionIndex = e.getActionIndex(); + if (PagerGridLayoutManager.DEBUG) { + Log.i(TAG, "onInterceptTouchEvent-actionMasked: " + actionMasked + ", actionIndex: " + actionIndex); + } + switch (actionMasked) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: { + mScrollPointerId = e.getPointerId(actionIndex); + mInitialTouchX = (int) (e.getX(actionIndex) + 0.5f); + mInitialTouchY = (int) (e.getY(actionIndex) + 0.5f); + + recyclerView.getParent().requestDisallowInterceptTouchEvent(true); + } + break; + case MotionEvent.ACTION_MOVE: { + final int index = e.findPointerIndex(mScrollPointerId); + if (index < 0) { + return false; + } + final int x = (int) (e.getX(index) + 0.5f); + final int y = (int) (e.getY(index) + 0.5f); + + final int dx = x - mInitialTouchX; + final int dy = y - mInitialTouchY; + + if (layoutManager.canScrollHorizontally()) { + recyclerView.getParent().requestDisallowInterceptTouchEvent(recyclerView.canScrollHorizontally(-dx)); + } + if (layoutManager.canScrollVertically()) { + recyclerView.getParent().requestDisallowInterceptTouchEvent(recyclerView.canScrollVertically(-dy)); + } + } + break; + case MotionEvent.ACTION_POINTER_UP: { + onPointerUp(e); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + //do nothing + } + break; + } + return false; + } + + private void onPointerUp(MotionEvent e) { + final int actionIndex = e.getActionIndex(); + if (e.getPointerId(actionIndex) == mScrollPointerId) { + // Pick a new pointer to pick up the slack. + final int newIndex = actionIndex == 0 ? 1 : 0; + mScrollPointerId = e.getPointerId(newIndex); + mInitialTouchX = (int) (e.getX(newIndex) + 0.5f); + mInitialTouchY = (int) (e.getY(newIndex) + 0.5f); + } + } +} diff --git a/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridLayoutManager.java b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridLayoutManager.java new file mode 100644 index 0000000..00046aa --- /dev/null +++ b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridLayoutManager.java @@ -0,0 +1,2012 @@ +package com.chwl.core.widget.layoutmanager.pagergridlayoutmanager; + +import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX; + +import android.content.Context; +import android.graphics.PointF; +import android.graphics.Rect; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; + +import androidx.annotation.CallSuper; +import androidx.annotation.FloatRange; +import androidx.annotation.IntDef; +import androidx.annotation.IntRange; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RestrictTo; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.chwl.core.BuildConfig; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * 分页滑动网格布局LayoutManager + * + * @author ShenBen + * @date 2021/01/10 17:01 + * @email 714081644@qq.com + */ +public class PagerGridLayoutManager extends RecyclerView.LayoutManager implements RecyclerView.SmoothScroller.ScrollVectorProvider { + private static final String TAG = "PagerGridLayoutManager"; + public static final int UN_SET = 0; + /** + * 是否启用Debug + */ + static boolean DEBUG = BuildConfig.DEBUG; + /** + * 水平滑动 + */ + public static final int HORIZONTAL = RecyclerView.HORIZONTAL; + /** + * 垂直滑动 + */ + public static final int VERTICAL = RecyclerView.VERTICAL; + /** + * @see #mCurrentPagerIndex + */ + public static final int NO_ITEM = -1; + public static final int NO_PAGER_COUNT = 0; + + @RestrictTo(LIBRARY_GROUP_PREFIX) + @IntDef({HORIZONTAL, VERTICAL}) + @Retention(RetentionPolicy.SOURCE) + public @interface Orientation { + } + + private PagerGridSnapHelper mPagerGridSnapHelper; + /** + * 当前滑动方向 + */ + @Orientation + private int mOrientation = HORIZONTAL; + /** + * 行数 + */ + @IntRange(from = 1) + private int mRows; + /** + * 列数 + */ + @IntRange(from = 1) + private int mColumns; + /** + * 一页的数量 {@link #mRows} * {@link #mColumns} + */ + private int mOnePageSize; + /** + * 总页数 + */ + private int mPagerCount = NO_PAGER_COUNT; + /** + * 当前页码下标 + * 从0开始 + */ + private int mCurrentPagerIndex = NO_ITEM; + /** + * item的宽度 + */ + private int mItemWidth = UN_SET; + /** + * item的高度 + */ + private int mItemHeight = UN_SET; + /** + * 一个ItemView的所有ItemDecoration占用的宽度(px) + */ + private int mItemWidthUsed; + /** + * 一个ItemView的所有ItemDecoration占用的高度(px) + */ + private int mItemHeightUsed; + + /** + * 用于保存一些状态 + */ + protected final LayoutState mLayoutState; + + protected final LayoutChunkResult mLayoutChunkResult; + /** + * 用于计算锚点坐标 + * {@link #mShouldReverseLayout} 为false:左上角第一个view的位置 + * {@link #mShouldReverseLayout} 为true:右上角第一个view的位置 + */ + private final Rect mStartSnapRect = new Rect(); + /** + * 用于计算锚点坐标 + * {@link #mShouldReverseLayout} 为false:右下角最后一个view的位置 + * {@link #mShouldReverseLayout} 为true:左上角最后一个view的位置 + */ + private final Rect mEndSnapRect = new Rect(); + + private RecyclerView mRecyclerView; + /** + * 定义是否应从头到尾计算布局 + * + * @see #mShouldReverseLayout + */ + private boolean mReverseLayout = false; + /** + * 这保留了 PagerGridLayoutManager 应该如何开始布局视图的最终值。 + * 它是通过检查 {@link #getReverseLayout()} 和 View 的布局方向来计算的。 + */ + protected boolean mShouldReverseLayout = false; + + @Nullable + private PagerChangedListener mPagerChangedListener; + /** + * 计算多出来的宽度,因为在均分的时候,存在除不尽的情况,要减去多出来的这部分大小,一般也就为几px + * 不减去的话,会导致翻页计算不触发 + * + * @see #onMeasure(RecyclerView.Recycler, RecyclerView.State, int, int) + */ + private int diffWidth = 0; + /** + * 计算多出来的高度,因为在均分的时候,存在除不尽的情况,要减去多出来的这部分大小,一般也就为几px + * 不减去的话,会导致翻页计算不触发 + * + * @see #onMeasure(RecyclerView.Recycler, RecyclerView.State, int, int) + */ + private int diffHeight = 0; + /** + * 是否启用处理滑动冲突滑动冲突,默认开启 + * 只会在{@link RecyclerView} 在可滑动布局{@link #isInScrollingContainer(View)}中起作用 + */ + private boolean isHandlingSlidingConflictsEnabled = true; + private float mMillisecondPreInch = PagerGridSmoothScroller.MILLISECONDS_PER_INCH; + private int mMaxScrollOnFlingDuration = PagerGridSmoothScroller.MAX_SCROLL_ON_FLING_DURATION; + + private final RecyclerView.OnChildAttachStateChangeListener onChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() { + @Override + public void onChildViewAttachedToWindow(@NonNull View view) { + LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); + //判断ItemLayout的宽高是否是match_parent + if (layoutParams.width != ViewGroup.LayoutParams.MATCH_PARENT + || layoutParams.height != ViewGroup.LayoutParams.MATCH_PARENT) { + throw new IllegalStateException("Item layout must fill the whole PagerGridLayoutManager (use match_parent)"); + } + } + + @Override + public void onChildViewDetachedFromWindow(@NonNull View view) { + // nothing + } + }; + + private RecyclerView.OnItemTouchListener onItemTouchListener; + + public PagerGridLayoutManager(@IntRange(from = 1) int rows, @IntRange(from = 1) int columns) { + this(rows, columns, HORIZONTAL); + } + + public PagerGridLayoutManager(@IntRange(from = 1) int rows, @IntRange(from = 1) int columns, boolean reverseLayout) { + this(rows, columns, HORIZONTAL, reverseLayout); + } + + public PagerGridLayoutManager(@IntRange(from = 1) int rows, @IntRange(from = 1) int columns, @Orientation int orientation) { + this(rows, columns, orientation, false); + } + + public PagerGridLayoutManager(@IntRange(from = 1) int rows, @IntRange(from = 1) int columns, @Orientation int orientation, boolean reverseLayout) { + mLayoutState = createLayoutState(); + mLayoutChunkResult = createLayoutChunkResult(); + setRows(rows); + setColumns(columns); + setOrientation(orientation); + setReverseLayout(reverseLayout); + } + + /** + * print logcat + * + * @param debug is debug + */ + public static void setDebug(boolean debug) { + DEBUG = debug; + } + + /** + * @return 子布局LayoutParams,默认全部填充,子布局会根据{@link #mRows}和{@link #mColumns} 均分RecyclerView + */ + @Override + public final RecyclerView.LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + } + + @Override + public RecyclerView.LayoutParams generateLayoutParams(Context c, AttributeSet attrs) { + return new LayoutParams(c, attrs); + } + + @Override + public RecyclerView.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { + if (lp instanceof RecyclerView.LayoutParams) { + return new LayoutParams((RecyclerView.LayoutParams) lp); + } else if (lp instanceof ViewGroup.MarginLayoutParams) { + return new LayoutParams((ViewGroup.MarginLayoutParams) lp); + } else { + return new LayoutParams(lp); + } + } + + @Override + public boolean checkLayoutParams(RecyclerView.LayoutParams lp) { + return lp instanceof LayoutParams; + } + + @Override + public void onAttachedToWindow(RecyclerView view) { + super.onAttachedToWindow(view); + if (DEBUG) { + Log.d(TAG, "onAttachedToWindow: "); + } + //默认先这么设置 + view.setHasFixedSize(true); + if (isInScrollingContainer(view)) { + //在一个可滑动的布局中 + if (isHandlingSlidingConflictsEnabled) { + onItemTouchListener = new PagerGridItemTouchListener(this, view); + view.addOnItemTouchListener(onItemTouchListener); + } else { + //不启用的话可以自行解决 + if (DEBUG) { + Log.w(TAG, "isHandlingSlidingConflictsEnabled: false."); + } + } + } + view.addOnChildAttachStateChangeListener(onChildAttachStateChangeListener); + mPagerGridSnapHelper = new PagerGridSnapHelper(); + mPagerGridSnapHelper.attachToRecyclerView(view); + mRecyclerView = view; + } + + @Override + public void onMeasure(@NonNull RecyclerView.Recycler recycler, @NonNull RecyclerView.State state, int widthSpec, int heightSpec) { + int widthMode = View.MeasureSpec.getMode(widthSpec); + int heightMode = View.MeasureSpec.getMode(heightSpec); + int widthSize = View.MeasureSpec.getSize(widthSpec); + int heightSize = View.MeasureSpec.getSize(heightSpec); + //判断RecyclerView的宽度和高度是不是精确值 + if (widthMode == View.MeasureSpec.EXACTLY && heightMode == View.MeasureSpec.EXACTLY) { + int realWidth = widthSize - getPaddingStart() - getPaddingEnd(); + int realHeight = heightSize - getPaddingTop() - getPaddingBottom(); + //均分宽 + mItemWidth = mColumns > 0 ? realWidth / mColumns : 0; + //均分高 + mItemHeight = mRows > 0 ? realHeight / mRows : 0; + + //重置下宽高,因为在均分的时候,存在除不尽的情况,要减去多出来的这部分大小,一般也就为几px + //不减去的话,会导致翻页计算不触发 + diffWidth = realWidth - mItemWidth * mColumns; + diffHeight = realHeight - mItemHeight * mRows; + + mItemWidthUsed = realWidth - diffWidth - mItemWidth; + mItemHeightUsed = realHeight - diffHeight - mItemHeight; + } else { + mItemWidth = UN_SET; + mItemHeight = UN_SET; + diffWidth = 0; + diffHeight = 0; + mItemWidthUsed = 0; + mItemHeightUsed = 0; + if (DEBUG) { + Log.w(TAG, "onMeasure-width or height is not exactly, widthMode: " + widthMode + ", heightMode: " + heightMode); + } + } + + if (DEBUG) { + Log.d(TAG, "onMeasure-widthMode: " + widthMode + ", heightMode: " + heightMode + ", originalWidthSize: " + widthSize + ",originalHeightSize: " + heightSize + ",diffWidth: " + diffWidth + ",diffHeight: " + diffHeight + ",mItemWidth: " + mItemWidth + ",mItemHeight: " + mItemHeight + ",mStartSnapRect:" + mStartSnapRect + ",mEndSnapRect:" + mEndSnapRect); + } + super.onMeasure(recycler, state, widthSpec, heightSpec); + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + if (DEBUG) { + Log.d(TAG, "onLayoutChildren: " + state.toString()); + } + + if (mItemWidth == UN_SET || mItemHeight == UN_SET) { + throw new IllegalStateException("RecyclerView's width and height must be exactly."); + } + + int itemCount = getItemCount(); + if (itemCount == 0) { + removeAndRecycleAllViews(recycler); + setPagerCount(NO_PAGER_COUNT); + setCurrentPagerIndex(NO_ITEM); + return; + } + if (state.isPreLayout()) { + return; + } + + // resolve layout direction + resolveShouldLayoutReverse(); + + //计算锚点的坐标 + if (mShouldReverseLayout) { + //右上角第一个view的位置 + mStartSnapRect.set(getWidth() - getPaddingEnd() - mItemWidth, getPaddingTop(), getWidth() - getPaddingEnd(), getPaddingTop() + mItemHeight); + //左下角最后一个view的位置 + mEndSnapRect.set(getPaddingStart(), getHeight() - getPaddingBottom() - mItemHeight, getPaddingStart() + mItemWidth, getHeight() - getPaddingBottom()); + } else { + //左上角第一个view的位置 + mStartSnapRect.set(getPaddingStart(), getPaddingTop(), getPaddingStart() + mItemWidth, getPaddingTop() + mItemHeight); + //右下角最后一个view的位置 + mEndSnapRect.set(getWidth() - getPaddingEnd() - mItemWidth, getHeight() - getPaddingBottom() - mItemHeight, getWidth() - getPaddingEnd(), getHeight() - getPaddingBottom()); + } + + //计算总页数 + int pagerCount = itemCount / mOnePageSize; + if (itemCount % mOnePageSize != 0) { + ++pagerCount; + } + + //计算需要补充空间 + mLayoutState.replenishDelta = 0; + if (pagerCount > 1) { + //超过一页,计算补充空间距离 + int remain = itemCount % mOnePageSize; + int replenish = 0; + if (remain != 0) { + int i = remain / mColumns; + int k = remain % mColumns; + if (mOrientation == HORIZONTAL) { + replenish = (i == 0) ? (mColumns - k) * mItemWidth : 0; + } else { + if (k > 0) { + ++i; + } + replenish = (mRows - i) * mItemHeight; + } + } + mLayoutState.replenishDelta = replenish; + } + + mLayoutState.mRecycle = false; + mLayoutState.mLayoutDirection = LayoutState.LAYOUT_END; + mLayoutState.mAvailable = getEnd(); + mLayoutState.mScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN; + + int pagerIndex = mCurrentPagerIndex; + if (pagerIndex == NO_ITEM) { + pagerIndex = 0; + } else { + //取上次PagerIndex和最大MaxPagerIndex中最小值。 + pagerIndex = Math.min(pagerIndex, getMaxPagerIndex()); + } + + View firstView; + if (!isIdle() && getChildCount() != 0) { + //滑动中的更新状态 + firstView = getChildClosestToStart(); + } else { + //没有子view或者不在滑动状态 + firstView = null; + } + + //计算首个位置的偏移量,主要是为了方便child layout,计算出目标位置的上一个位置的坐标 + int left; + int top; + int right; + int bottom; + if (mShouldReverseLayout) { + if (firstView == null) { + //按页且从右上角开始布局 + mLayoutState.mCurrentPosition = pagerIndex * mOnePageSize; + + int calculateClipOffset = calculateClipOffset(true, mLayoutState.mCurrentPosition); + + if (mOrientation == RecyclerView.HORIZONTAL) { + bottom = getHeight() - getPaddingBottom(); + left = getWidth() - getPaddingEnd() + calculateClipOffset; + } else { + bottom = getPaddingTop() - calculateClipOffset; + left = getPaddingStart(); + } + } else { + //计算布局偏移量 + int position = getPosition(firstView); + mLayoutState.mCurrentPosition = position; + Rect rect = mLayoutState.mOffsetRect; + + int calculateClipOffset = calculateClipOffset(true, mLayoutState.mCurrentPosition); + + getDecoratedBoundsWithMargins(firstView, rect); + if (mOrientation == RecyclerView.HORIZONTAL) { + if (isNeedMoveToNextSpan(position)) { + //为了方便计算 + bottom = getHeight() - getPaddingBottom(); + left = rect.right + calculateClipOffset; + } else { + bottom = rect.top; + left = rect.left; + } + } else { + if (isNeedMoveToNextSpan(position)) { + //为了方便计算 + bottom = rect.top - calculateClipOffset; + left = getPaddingStart(); + } else { + bottom = rect.bottom; + left = rect.right; + } + } + //追加额外的滑动空间 + int scrollingOffset; + if (mOrientation == HORIZONTAL) { + scrollingOffset = getDecoratedStart(firstView) - getEndAfterPadding(); + } else { + scrollingOffset = getDecoratedStart(firstView); + } + mLayoutState.mAvailable -= scrollingOffset; + } + + top = bottom - mItemHeight; + right = left + mItemWidth; + } else { + if (firstView == null) { + //按页且从左上角开始布局 + mLayoutState.mCurrentPosition = pagerIndex * mOnePageSize; + + int calculateClipOffset = calculateClipOffset(true, mLayoutState.mCurrentPosition); + + if (mOrientation == RecyclerView.HORIZONTAL) { + bottom = getHeight() - getPaddingBottom(); + right = getPaddingStart() - calculateClipOffset; + } else { + bottom = getPaddingTop() - calculateClipOffset; + right = getWidth() - getPaddingEnd(); + } + } else { + //计算布局偏移量 + int position = getPosition(firstView); + mLayoutState.mCurrentPosition = position; + Rect rect = mLayoutState.mOffsetRect; + + int calculateClipOffset = calculateClipOffset(true, mLayoutState.mCurrentPosition); + + getDecoratedBoundsWithMargins(firstView, rect); + if (mOrientation == RecyclerView.HORIZONTAL) { + if (isNeedMoveToNextSpan(position)) { + //为了方便计算 + bottom = getHeight() - getPaddingBottom(); + right = rect.left - calculateClipOffset; + } else { + bottom = rect.top; + right = rect.right; + } + } else { + if (isNeedMoveToNextSpan(position)) { + //为了方便计算 + bottom = rect.top - calculateClipOffset; + right = getWidth() - getPaddingEnd(); + } else { + bottom = rect.bottom; + right = rect.left; + } + } + //追加额外的滑动空间 + int scrollingOffset = getDecoratedStart(firstView); + mLayoutState.mAvailable -= scrollingOffset; + } + top = bottom - mItemHeight; + left = right - mItemWidth; + } + mLayoutState.setOffsetRect(left, top, right, bottom); + + if (DEBUG) { + Log.i(TAG, "onLayoutChildren-pagerCount:" + pagerCount + ",mLayoutState.mAvailable: " + mLayoutState.mAvailable); + } + + //回收views + detachAndScrapAttachedViews(recycler); + //填充views + fill(recycler, state); + if (DEBUG) { + Log.i(TAG, "onLayoutChildren: childCount:" + getChildCount() + ",recycler.scrapList.size:" + recycler.getScrapList().size() + ",mLayoutState.replenishDelta:" + mLayoutState.replenishDelta); + } + + if (firstView == null) { + //移动状态不更新页数和页码 + setPagerCount(pagerCount); + setCurrentPagerIndex(pagerIndex); + } + } + + @Override + public void onLayoutCompleted(RecyclerView.State state) { + + } + + @Nullable + @Override + public View findViewByPosition(int position) { + final int childCount = getChildCount(); + if (childCount == 0) { + return null; + } + final int firstChild = getPosition(getChildAt(0)); + final int viewPosition = position - firstChild; + if (viewPosition >= 0 && viewPosition < childCount) { + final View child = getChildAt(viewPosition); + if (getPosition(child) == position) { + return child; + } + } + return super.findViewByPosition(position); + } + + @Override + public int computeHorizontalScrollOffset(@NonNull RecyclerView.State state) { + return computeScrollOffset(state); + } + + @Override + public int computeVerticalScrollOffset(@NonNull RecyclerView.State state) { + return computeScrollOffset(state); + } + + @Override + public int computeHorizontalScrollExtent(@NonNull RecyclerView.State state) { + return computeScrollExtent(state); + } + + @Override + public int computeVerticalScrollExtent(@NonNull RecyclerView.State state) { + return computeScrollExtent(state); + } + + @Override + public int computeVerticalScrollRange(@NonNull RecyclerView.State state) { + return computeScrollRange(state); + } + + @Override + public int computeHorizontalScrollRange(@NonNull RecyclerView.State state) { + return computeScrollRange(state); + } + + @Nullable + @Override + public Parcelable onSaveInstanceState() { + if (DEBUG) { + Log.d(TAG, "onSaveInstanceState: "); + } + SavedState state = new SavedState(); + state.mOrientation = mOrientation; + state.mRows = mRows; + state.mColumns = mColumns; + state.mCurrentPagerIndex = mCurrentPagerIndex; + state.mReverseLayout = mReverseLayout; + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof SavedState) { + SavedState savedState = (SavedState) state; + mOrientation = savedState.mOrientation; + mRows = savedState.mRows; + mColumns = savedState.mColumns; + calculateOnePageSize(); + setCurrentPagerIndex(savedState.mCurrentPagerIndex); + mReverseLayout = savedState.mReverseLayout; + requestLayout(); + if (DEBUG) { + Log.d(TAG, "onRestoreInstanceState: loaded saved state"); + } + } + } + + @Override + public void scrollToPosition(int position) { + assertNotInLayoutOrScroll(null); + + //先找到目标position所在第几页 + int pagerIndex = getPagerIndexByPosition(position); + scrollToPagerIndex(pagerIndex); + } + + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + assertNotInLayoutOrScroll(null); + + //先找到目标position所在第几页 + int pagerIndex = getPagerIndexByPosition(position); + smoothScrollToPagerIndex(pagerIndex); + } + + @Override + public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) { + if (mOrientation == VERTICAL) { + //垂直滑动不处理 + return 0; + } + return scrollBy(dx, recycler, state); + } + + @Override + public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { + if (mOrientation == HORIZONTAL) { + //水平滑动不处理 + return 0; + } + return scrollBy(dy, recycler, state); + + } + + @Override + public void onScrollStateChanged(int state) { + switch (state) { + case RecyclerView.SCROLL_STATE_IDLE://静止状态 + + break; + case RecyclerView.SCROLL_STATE_DRAGGING://手指拖拽 + + break; + case RecyclerView.SCROLL_STATE_SETTLING://自由滚动 + + break; + } + } + + @Override + public final boolean canScrollHorizontally() { + return mOrientation == RecyclerView.HORIZONTAL; + } + + @Override + public final boolean canScrollVertically() { + return mOrientation == RecyclerView.VERTICAL; + } + + @Override + public final int getWidth() { + return super.getWidth() - getDiffWidth(); + } + + @Override + public final int getHeight() { + return super.getHeight() - getDiffHeight(); + } + + @Override + @CallSuper + public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycler) { + super.onDetachedFromWindow(view, recycler); + if (DEBUG) { + Log.w(TAG, "onDetachedFromWindow: "); + } + if (mRecyclerView != null) { + if (onItemTouchListener != null) { + mRecyclerView.removeOnItemTouchListener(onItemTouchListener); + } + mRecyclerView.removeOnChildAttachStateChangeListener(onChildAttachStateChangeListener); + mRecyclerView = null; + } + mPagerGridSnapHelper.attachToRecyclerView(null); + mPagerGridSnapHelper = null; + //这里不能置为null,因为在ViewPager2嵌套Fragment使用, + //部分情况下Fragment不回调onDestroyView,但会导致onDetachedFromWindow触发。 + //所以如果想置null,请调用{@link #setPagerChangedListener(null)} +// mPagerChangedListener = null; + } + + /** + * 设置监听回调 + * + * @param listener + */ + public void setPagerChangedListener(@Nullable PagerChangedListener listener) { + mPagerChangedListener = listener; + } + + /** + * 是否启用处理滑动冲突滑动冲突,默认true + * 这个方法必须要在{@link RecyclerView#setLayoutManager(RecyclerView.LayoutManager)} 之前调用,否则无效 + * you must call this method before {@link RecyclerView#setLayoutManager(RecyclerView.LayoutManager)} + * + * @param enabled 是否启用 + * @see #isInScrollingContainer(View) + * @see #onAttachedToWindow(RecyclerView) + */ + public final void setHandlingSlidingConflictsEnabled(boolean enabled) { + isHandlingSlidingConflictsEnabled = enabled; + } + + public final boolean isHandlingSlidingConflictsEnabled() { + return isHandlingSlidingConflictsEnabled; + } + + /** + * 设置滑动每像素需要花费的时间,不可过小,不然可能会出现划过再回退的情况 + * 默认值:{@link PagerGridSmoothScroller#MILLISECONDS_PER_INCH} + *

+ * set millisecond pre inch. not too small. + * default value: {@link PagerGridSmoothScroller#MILLISECONDS_PER_INCH} + * + * @param millisecondPreInch 值越大,滚动速率越慢,反之 + * @see PagerGridSmoothScroller#calculateSpeedPerPixel(DisplayMetrics) + */ + public final void setMillisecondPreInch(@FloatRange(from = 1) float millisecondPreInch) { + mMillisecondPreInch = Math.max(1f, millisecondPreInch); + } + + /** + * @return 滑动每像素需要花费的时间 + * @see PagerGridSmoothScroller#calculateSpeedPerPixel(DisplayMetrics) + */ + public final float getMillisecondPreInch() { + return mMillisecondPreInch; + } + + /** + * 设置最大滚动时间,如果您想此值无效,请使用{@link Integer#MAX_VALUE} + * 默认值:{@link PagerGridSmoothScroller#MAX_SCROLL_ON_FLING_DURATION},单位:毫秒 + *

+ * set max scroll on fling duration.If you want this value to expire, use {@link Integer#MAX_VALUE} + * default value: {@link PagerGridSmoothScroller#MAX_SCROLL_ON_FLING_DURATION},Unit: ms + * + * @param maxScrollOnFlingDuration 值越大,滑动时间越长,滚动速率越慢,反之 + * @see PagerGridSmoothScroller#calculateTimeForScrolling(int) + */ + public final void setMaxScrollOnFlingDuration(@IntRange(from = 1) int maxScrollOnFlingDuration) { + mMaxScrollOnFlingDuration = Math.max(1, maxScrollOnFlingDuration); + } + + /** + * @return 最大滚动时间 + * @see PagerGridSmoothScroller#calculateTimeForScrolling(int) + */ + public final int getMaxScrollOnFlingDuration() { + return mMaxScrollOnFlingDuration; + } + + public final int getItemWidth() { + return mItemWidth; + } + + public final int getItemHeight() { + return mItemHeight; + } + + /** + * 计算一页的数量 + */ + private void calculateOnePageSize() { + mOnePageSize = mRows * mColumns; + } + + /** + * @return 一页的数量 + */ + @IntRange(from = 1) + public final int getOnePageSize() { + return mOnePageSize; + } + + public void setColumns(@IntRange(from = 1) int columns) { + assertNotInLayoutOrScroll(null); + + if (mColumns == columns) { + return; + } + mColumns = Math.max(columns, 1); + mPagerCount = NO_PAGER_COUNT; + mCurrentPagerIndex = NO_ITEM; + calculateOnePageSize(); + requestLayout(); + } + + /** + * @return 列数 + */ + @IntRange(from = 1) + public final int getColumns() { + return mColumns; + } + + public void setRows(@IntRange(from = 1) int rows) { + assertNotInLayoutOrScroll(null); + + if (mRows == rows) { + return; + } + mRows = Math.max(rows, 1); + mPagerCount = NO_PAGER_COUNT; + mCurrentPagerIndex = NO_ITEM; + calculateOnePageSize(); + requestLayout(); + } + + /** + * @return 行数 + */ + @IntRange(from = 1) + public final int getRows() { + return mRows; + } + + /** + * 设置滑动方向 + * + * @param orientation {@link #HORIZONTAL} or {@link #VERTICAL} + */ + public void setOrientation(@Orientation int orientation) { + assertNotInLayoutOrScroll(null); + + if (orientation != HORIZONTAL && orientation != VERTICAL) { + throw new IllegalArgumentException("invalid orientation:" + orientation); + } + if (orientation != mOrientation) { + mOrientation = orientation; + + requestLayout(); + } + } + + @Orientation + public int getOrientation() { + return mOrientation; + } + + public void setReverseLayout(boolean reverseLayout) { + assertNotInLayoutOrScroll(null); + + if (reverseLayout == mReverseLayout) { + return; + } + mReverseLayout = reverseLayout; + requestLayout(); + } + + public boolean getReverseLayout() { + return mReverseLayout; + } + + /** + * @param position position + * @return 获取当前position所在页下标 + */ + public final int getPagerIndexByPosition(int position) { + return position / mOnePageSize; + } + + /** + * @return 获取最大页数 + */ + public final int getMaxPagerIndex() { + return getPagerIndexByPosition(getItemCount() - 1); + } + + /** + * 直接滚到第几页 + * + * @param pagerIndex 第几页 + */ + public void scrollToPagerIndex(@IntRange(from = 0) int pagerIndex) { + assertNotInLayoutOrScroll(null); + + //先找到目标position所在第几页 + pagerIndex = Math.min(Math.max(pagerIndex, 0), getMaxPagerIndex()); + if (pagerIndex == mCurrentPagerIndex) { + //同一页直接return + return; + } + setCurrentPagerIndex(pagerIndex); + requestLayout(); + } + + /** + * 直接滚动到上一页 + */ + public void scrollToPrePager() { + assertNotInLayoutOrScroll(null); + + scrollToPagerIndex(mCurrentPagerIndex - 1); + } + + /** + * 直接滚动到下一页 + */ + public void scrollToNextPager() { + assertNotInLayoutOrScroll(null); + + scrollToPagerIndex(mCurrentPagerIndex + 1); + } + + /** + * 平滑滚到第几页,为避免长时间滚动,会预先跳转到就近位置,默认3页 + * + * @param pagerIndex 第几页,下标从0开始 + */ + public void smoothScrollToPagerIndex(@IntRange(from = 0) int pagerIndex) { + assertNotInLayoutOrScroll(null); + + pagerIndex = Math.min(Math.max(pagerIndex, 0), getMaxPagerIndex()); + int previousIndex = mCurrentPagerIndex; + if (pagerIndex == previousIndex) { + //同一页直接return + return; + } + boolean isLayoutToEnd = pagerIndex > previousIndex; + + if (Math.abs(pagerIndex - previousIndex) > 3) { + //先就近直接跳转 + int transitionIndex = pagerIndex > previousIndex ? pagerIndex - 3 : pagerIndex + 3; + scrollToPagerIndex(transitionIndex); + + if (mRecyclerView != null) { + mRecyclerView.post(new SmoothScrollToPosition(getPositionByPagerIndex(pagerIndex, isLayoutToEnd), this, mRecyclerView)); + } + } else { + PagerGridSmoothScroller smoothScroller = new PagerGridSmoothScroller(mRecyclerView, this); + smoothScroller.setTargetPosition(getPositionByPagerIndex(pagerIndex, isLayoutToEnd)); + startSmoothScroll(smoothScroller); + } + } + + /** + * 平滑到上一页 + */ + public void smoothScrollToPrePager() { + assertNotInLayoutOrScroll(null); + + smoothScrollToPagerIndex(mCurrentPagerIndex - 1); + } + + /** + * 平滑到下一页 + */ + public void smoothScrollToNextPager() { + assertNotInLayoutOrScroll(null); + + smoothScrollToPagerIndex(mCurrentPagerIndex + 1); + } + + protected LayoutState createLayoutState() { + return new LayoutState(); + } + + protected LayoutChunkResult createLayoutChunkResult() { + return new LayoutChunkResult(); + } + + protected boolean isLayoutRTL() { + return getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL; + } + + /** + * 设置总页数 + * + * @param pagerCount + */ + private void setPagerCount(int pagerCount) { + if (mPagerCount == pagerCount) { + return; + } + mPagerCount = pagerCount; + if (mPagerChangedListener != null) { + mPagerChangedListener.onPagerCountChanged(pagerCount); + } + } + + /** + * 返回总页数 + * + * @return 0:{@link #getItemCount()} is 0 + */ + @IntRange(from = 0) + public final int getPagerCount() { + return Math.max(mPagerCount, 0); + } + + /** + * 设置当前页码 + * + * @param pagerIndex 页码 + */ + private void setCurrentPagerIndex(int pagerIndex) { + if (mCurrentPagerIndex == pagerIndex) { + return; + } + int prePagerIndex = mCurrentPagerIndex; + mCurrentPagerIndex = pagerIndex; + if (mPagerChangedListener != null) { + mPagerChangedListener.onPagerIndexSelected(prePagerIndex, pagerIndex); + } + } + + /** + * 获取当前的页码 + * + * @return -1:{@link #getItemCount()} is 0,{@link #NO_ITEM} . else {@link #mCurrentPagerIndex} + */ + @IntRange(from = -1) + public final int getCurrentPagerIndex() { + return mCurrentPagerIndex; + } + + /** + * 由于View类中这个方法无法使用,直接copy处理 + * + * @param view + * @return 判断view是不是处在一个可滑动的布局中 + * @see ViewGroup#shouldDelayChildPressedState() + */ + private boolean isInScrollingContainer(View view) { + ViewParent p = view.getParent(); + while (p instanceof ViewGroup) { + if (((ViewGroup) p).shouldDelayChildPressedState()) { + return true; + } + p = p.getParent(); + } + return false; + } + + /** + * 根据页码下标获取position + * + * @param pagerIndex 页码 + * @param isLayoutToEnd true:页的第一个位置,false:页的最后一个位置 + * @return + */ + private int getPositionByPagerIndex(int pagerIndex, boolean isLayoutToEnd) { + return isLayoutToEnd ? pagerIndex * mOnePageSize : pagerIndex * mOnePageSize + mOnePageSize - 1; + } + + public final int getDiffWidth() { + return Math.max(diffWidth, 0); + } + + public final int getDiffHeight() { + return Math.max(diffHeight, 0); + } + + /** + * 获取真实宽度 + * + * @return + */ + private int getRealWidth() { + return getWidth() - getPaddingStart() - getPaddingEnd(); + } + + /** + * 获取真实高度 + * + * @return + */ + private int getRealHeight() { + return getHeight() - getPaddingTop() - getPaddingBottom(); + } + + /** + * 填充布局 + * + * @param recycler + * @param state + * @return 添加的像素数,用于滚动 + */ + private int fill(RecyclerView.Recycler recycler, RecyclerView.State state) { + LayoutState layoutState = mLayoutState; + int start = layoutState.mAvailable; + int remainingSpace = layoutState.mAvailable; + LayoutChunkResult layoutChunkResult = mLayoutChunkResult; + while (remainingSpace > 0 && layoutState.hasMore(state)) { + if (mShouldReverseLayout) { + reverseLayoutChunk(recycler, state, layoutState, layoutChunkResult); + } else { + layoutChunk(recycler, state, layoutState, layoutChunkResult); + } + layoutState.mAvailable -= layoutChunkResult.mConsumed; + remainingSpace -= layoutChunkResult.mConsumed; + } + boolean layoutToEnd = layoutState.mLayoutDirection == LayoutState.LAYOUT_END; + //因为最后一列或者一行可能只绘制了收尾的一个,补满 + while (layoutState.hasMore(state)) { + boolean isNeedMoveSpan = layoutToEnd ? isNeedMoveToNextSpan(layoutState.mCurrentPosition) : isNeedMoveToPreSpan(layoutState.mCurrentPosition); + if (isNeedMoveSpan) { + //如果需要切换行或列,直接退出 + break; + } + if (mShouldReverseLayout) { + reverseLayoutChunk(recycler, state, layoutState, layoutChunkResult); + } else { + layoutChunk(recycler, state, layoutState, layoutChunkResult); + } + } + //回收View + recycleViews(recycler); + return start - layoutState.mAvailable; + } + + /** + * 正项布局 + * + * @param recycler + * @param state + * @param layoutState + * @param layoutChunkResult + * @see #layoutChunk(RecyclerView.Recycler, RecyclerView.State, LayoutState, LayoutChunkResult) + * @see #mShouldReverseLayout + */ + private void layoutChunk(RecyclerView.Recycler recycler, RecyclerView.State state, LayoutState layoutState, LayoutChunkResult layoutChunkResult) { + boolean layoutToEnd = layoutState.mLayoutDirection == LayoutState.LAYOUT_END; + int position = layoutState.mCurrentPosition; + View view = layoutState.next(recycler); + if (layoutToEnd) { + addView(view); + } else { + addView(view, 0); + } + layoutState.mCurrentPosition = layoutToEnd ? layoutState.getNextPosition(position, mOrientation, mRows, mColumns, state) : + layoutState.getPrePosition(position, mOrientation, mRows, mColumns, state); + measureChildWithMargins(view, mItemWidthUsed, mItemHeightUsed); + //是否需要换行或者换列 + boolean isNeedMoveSpan = layoutToEnd ? isNeedMoveToNextSpan(position) : isNeedMoveToPreSpan(position); + layoutChunkResult.mConsumed = isNeedMoveSpan ? mOrientation == HORIZONTAL ? mItemWidth : mItemHeight : 0; + + //记录的上一个View的位置 + Rect rect = layoutState.mOffsetRect; + int left; + int top; + int right; + int bottom; + if (mOrientation == HORIZONTAL) { + //水平滑动 + if (layoutToEnd) { + //向后填充,绘制方向:从上到下 + if (isNeedMoveSpan) { + //下一列绘制,从头部开始 + left = rect.left + mItemWidth + calculateClipOffset(true, position); + top = getPaddingTop(); + } else { + //当前列绘制 + left = rect.left; + top = rect.bottom; + } + right = left + mItemWidth; + bottom = top + mItemHeight; + } else { + //向前填充,绘制方向:从下到上 + if (isNeedMoveSpan) { + //上一列绘制,从底部开启 + left = rect.left - mItemWidth - calculateClipOffset(false, position); + bottom = getHeight() - getPaddingBottom(); + } else { + //当前列绘制 + left = rect.left; + bottom = rect.top; + } + top = bottom - mItemHeight; + right = left + mItemWidth; + } + } else { + if (layoutToEnd) { + //向下填充,绘制方向:从左到右 + if (isNeedMoveSpan) { + //下一行绘制,从头部开始 + left = getPaddingStart(); + top = rect.bottom + calculateClipOffset(true, position); + } else { + //当前行绘制 + left = rect.left + mItemWidth; + top = rect.top; + } + right = left + mItemWidth; + bottom = top + mItemHeight; + } else { + //向上填充,绘制方向:从右到左 + if (isNeedMoveSpan) { + //上一行绘制,从尾部开始 + right = getWidth() - getPaddingEnd(); + left = right - mItemWidth; + bottom = rect.top - calculateClipOffset(false, position); + top = bottom - mItemHeight; + } else { + //当前行绘制 + left = rect.left - mItemWidth; + top = rect.top; + right = left + mItemWidth; + bottom = top + mItemHeight; + } + } + } + layoutState.setOffsetRect(left, top, right, bottom); + layoutDecoratedWithMargins(view, left, top, right, bottom); + } + + /** + * 反向布局 + * + * @param recycler + * @param state + * @param layoutState + * @param layoutChunkResult + * @see #layoutChunk(RecyclerView.Recycler, RecyclerView.State, LayoutState, LayoutChunkResult) + * @see #mShouldReverseLayout + */ + private void reverseLayoutChunk(RecyclerView.Recycler recycler, RecyclerView.State state, LayoutState layoutState, LayoutChunkResult layoutChunkResult) { + //仅处理水平反向滑动,垂直仅改变排列顺序 + boolean layoutToEnd = layoutState.mLayoutDirection == LayoutState.LAYOUT_END; + + int position = layoutState.mCurrentPosition; + View view = layoutState.next(recycler); + if (layoutToEnd) { + addView(view); + } else { + addView(view, 0); + } + layoutState.mCurrentPosition = layoutToEnd ? layoutState.getNextPosition(position, mOrientation, mRows, mColumns, state) : + layoutState.getPrePosition(position, mOrientation, mRows, mColumns, state); + measureChildWithMargins(view, mItemWidthUsed, mItemHeightUsed); + //是否需要换行或者换列 + boolean isNeedMoveSpan = layoutToEnd ? isNeedMoveToNextSpan(position) : isNeedMoveToPreSpan(position); + layoutChunkResult.mConsumed = isNeedMoveSpan ? mOrientation == HORIZONTAL ? mItemWidth : mItemHeight : 0; + + //记录的上一个View的位置 + Rect rect = layoutState.mOffsetRect; + int left; + int top; + int right; + int bottom; + if (mOrientation == HORIZONTAL) { + //水平滑动 + if (layoutToEnd) { + //向前填充,绘制方向:从上到下 + if (isNeedMoveSpan) { + //上一列绘制,从头部开始 + left = rect.left - mItemWidth - calculateClipOffset(true, position); + top = getPaddingTop(); + } else { + //当前列绘制 + left = rect.left; + top = rect.bottom; + } + right = left + mItemWidth; + bottom = top + mItemHeight; + } else { + //向后填充,绘制方向:从下到上 + if (isNeedMoveSpan) { + //下一列绘制,从底部开启 + left = rect.left + mItemWidth + calculateClipOffset(false, position); + bottom = getHeight() - getPaddingBottom(); + } else { + //当前列绘制 + left = rect.left; + bottom = rect.top; + } + top = bottom - mItemHeight; + right = left + mItemWidth; + } + } else { + if (layoutToEnd) { + //向下填充,绘制方向:从右到左 + if (isNeedMoveSpan) { + //下一行绘制,从尾部开始 + right = getWidth() - getPaddingEnd(); + top = rect.bottom + calculateClipOffset(true, position); + } else { + //当前行绘制,向前布局 + right = rect.left; + top = rect.top; + } + left = right - mItemWidth; + bottom = top + mItemHeight; + } else { + //向上填充,绘制方向:从左到右 + if (isNeedMoveSpan) { + //上一行绘制,从头部开始 + left = getPaddingStart(); + right = left + mItemWidth; + bottom = rect.top - calculateClipOffset(false, position); + top = bottom - mItemHeight; + } else { + //当前行绘制,向后布局 + left = rect.right; + right = left + mItemWidth; + top = rect.top; + bottom = top + mItemHeight; + } + } + } + layoutState.setOffsetRect(left, top, right, bottom); + layoutDecoratedWithMargins(view, left, top, right, bottom); + } + + /** + * @param delta 手指滑动的距离 + * @param recycler + * @param state + * @return + */ + private int scrollBy(int delta, RecyclerView.Recycler recycler, RecyclerView.State state) { + if (getChildCount() == 0 || delta == 0 || mPagerCount == 1) { + return 0; + } + mLayoutState.mRecycle = true; + final int layoutDirection; + if (shouldHorizontallyReverseLayout()) { + layoutDirection = delta > 0 ? LayoutState.LAYOUT_START : LayoutState.LAYOUT_END; + } else { + layoutDirection = delta > 0 ? LayoutState.LAYOUT_END : LayoutState.LAYOUT_START; + } + mLayoutState.mLayoutDirection = layoutDirection; + boolean layoutToEnd = layoutDirection == LayoutState.LAYOUT_END; + final int absDelta = Math.abs(delta); + if (DEBUG) { + Log.i(TAG, "scrollBy -> before : childCount:" + getChildCount() + ",recycler.scrapList.size:" + recycler.getScrapList().size() + ",delta:" + delta); + } + updateLayoutState(layoutToEnd, absDelta, true, state); + int consumed = mLayoutState.mScrollingOffset + fill(recycler, state); + if (layoutToEnd) { + //向后滑动,添加补充距离 + consumed += mLayoutState.replenishDelta; + } + if (consumed < 0) { + return 0; + } + //是否已经完全填充到头部或者尾部,滑动的像素>消费的像素 + boolean isOver = absDelta > consumed; + //计算实际可移动值 + int scrolled = isOver ? layoutDirection * consumed : delta; + //移动 + offsetChildren(-scrolled); + mLayoutState.mLastScrollDelta = scrolled; + + //回收view,此步骤在移动之后 + recycleViews(recycler); + if (DEBUG) { + Log.i(TAG, "scrollBy -> end : childCount:" + getChildCount() + ",recycler.scrapList.size:" + recycler.getScrapList().size() + ",delta:" + delta + ",scrolled:" + scrolled); + } + return scrolled; + } + + private void updateLayoutState(boolean layoutToEnd, int requiredSpace, + boolean canUseExistingSpace, RecyclerView.State state) { + View child; + //计算在不添加新view的情况下可以滚动多少(与布局无关) + int scrollingOffset; + if (layoutToEnd) { + child = getChildClosestToEnd(); + if (shouldHorizontallyReverseLayout()) { + scrollingOffset = -getDecoratedStart(child) + getStartAfterPadding(); + } else { + scrollingOffset = getDecoratedEnd(child) - getEndAfterPadding(); + } + } else { + child = getChildClosestToStart(); + if (shouldHorizontallyReverseLayout()) { + scrollingOffset = getDecoratedEnd(child) - getEndAfterPadding(); + } else { + scrollingOffset = -getDecoratedStart(child) + getStartAfterPadding(); + } + } + getDecoratedBoundsWithMargins(child, mLayoutState.mOffsetRect); + + mLayoutState.mCurrentPosition = layoutToEnd ? mLayoutState.getNextPosition(getPosition(child), mOrientation, mRows, mColumns, state) : + mLayoutState.getPrePosition(getPosition(child), mOrientation, mRows, mColumns, state); + + mLayoutState.mAvailable = requiredSpace; + if (canUseExistingSpace) { + mLayoutState.mAvailable -= scrollingOffset; + } + mLayoutState.mScrollingOffset = scrollingOffset; + } + + private View getChildClosestToEnd() { + return getChildAt(getChildCount() - 1); + } + + private View getChildClosestToStart() { + return getChildAt(0); + } + + /** + * 回收View + * + * @param recycler + */ + private void recycleViews(RecyclerView.Recycler recycler) { + //是否回收view + if (!mLayoutState.mRecycle) { + return; + } + if (shouldHorizontallyReverseLayout()) { + if (mLayoutState.mLayoutDirection == LayoutState.LAYOUT_START) { + //水平向右或者垂直向下滑动 + recycleViewsFromStart(recycler); + } else { + //水平向左或者垂直向上滑动 + recycleViewsFromEnd(recycler); + } + } else { + if (mLayoutState.mLayoutDirection == LayoutState.LAYOUT_START) { + //水平向左或者垂直向上滑动 + recycleViewsFromEnd(recycler); + } else { + //水平向右或者垂直向下滑动 + recycleViewsFromStart(recycler); + } + } + } + + private void recycleViewsFromStart(RecyclerView.Recycler recycler) { + //如果clipToPadding==false,则不计算padding + boolean clipToPadding = getClipToPadding(); + int start = clipToPadding ? getStartAfterPadding() : 0; + int childCount = getChildCount(); + for (int i = childCount - 1; i >= 0; i--) { + View childAt = getChildAt(i); + if (childAt != null) { + int decorated = getDecoratedEnd(childAt); + if (decorated >= start) { + continue; + } + if (DEBUG) { + Log.w(TAG, "recycleViewsFromStart-removeAndRecycleViewAt: " + i + ", position: " + getPosition(childAt)); + } + removeAndRecycleViewAt(i, recycler); +// removeAndRecycleView(childAt, recycler); + } + } + } + + private void recycleViewsFromEnd(RecyclerView.Recycler recycler) { + //如果clipToPadding==false,则不计算padding + boolean clipToPadding = getClipToPadding(); + int end = clipToPadding ? getEndAfterPadding() : (mOrientation == HORIZONTAL ? getWidth() : getHeight()); + int childCount = getChildCount(); + for (int i = childCount - 1; i >= 0; i--) { + View childAt = getChildAt(i); + if (childAt != null) { + int decorated = getDecoratedStart(childAt); + if (decorated <= end) { + continue; + } + if (DEBUG) { + Log.w(TAG, "recycleViewsFromEnd-removeAndRecycleViewAt: " + i + ", position: " + getPosition(childAt)); + } + removeAndRecycleViewAt(i, recycler); +// removeAndRecycleView(childAt, recycler); + } + } + } + + private int getDecoratedEnd(View child) { + final LayoutParams params = (LayoutParams) child.getLayoutParams(); + return mOrientation == HORIZONTAL ? getDecoratedRight(child) + params.rightMargin : getDecoratedBottom(child) + params.bottomMargin; + } + + private int getDecoratedStart(View child) { + final LayoutParams params = (LayoutParams) child.getLayoutParams(); + return mOrientation == HORIZONTAL ? getDecoratedLeft(child) - params.leftMargin : getDecoratedTop(child) - params.topMargin; + } + + private int getEndAfterPadding() { + return mOrientation == HORIZONTAL ? getWidth() - getPaddingEnd() : getHeight() - getPaddingBottom(); + } + + private int getStartAfterPadding() { + return mOrientation == HORIZONTAL ? getPaddingStart() : getPaddingTop(); + } + + private int getClipToPaddingSize() { + return mOrientation == HORIZONTAL ? getPaddingStart() + getPaddingEnd() : getPaddingTop() + getPaddingBottom(); + } + + /** + * 计算{@link #getClipToPadding()}==false时偏移量 + * + * @param layoutToEnd 是否是向后布局 + * @param position position + * @return offset + */ + private int calculateClipOffset(boolean layoutToEnd, int position) { + boolean clipToPadding = getClipToPadding(); + return !clipToPadding && (position % mOnePageSize == (layoutToEnd ? 0 : mOnePageSize - 1)) ? getClipToPaddingSize() : 0; + } + + private int getEnd() { + return mOrientation == HORIZONTAL ? getRealWidth() : getRealHeight(); + } + + /** + * 移动Children + * + * @param delta 移动偏移量 + */ + private void offsetChildren(int delta) { + if (mOrientation == HORIZONTAL) { + offsetChildrenHorizontal(delta); + } else { + offsetChildrenVertical(delta); + } + } + + /** + * @return 当前Recycler是否是静止状态 + */ + private boolean isIdle() { + return mRecyclerView == null || mRecyclerView.getScrollState() == RecyclerView.SCROLL_STATE_IDLE; + } + + /** + * @param position + * @return 是否需要换到下一行或列 + */ + private boolean isNeedMoveToNextSpan(int position) { + if (mOrientation == HORIZONTAL) { + int surplus = position % mOnePageSize; + int rowIndex = surplus / mColumns; + //是否在最后一行 + return rowIndex == 0; + } else { + return position % mColumns == 0; + } + } + + /** + * @param position + * @return 是否需要换到上一行或列 + */ + private boolean isNeedMoveToPreSpan(int position) { + if (mOrientation == HORIZONTAL) { + int surplus = position % mOnePageSize; + //在第几行 + int rowIndex = surplus / mColumns; + //是否在第一行 + return rowIndex == mRows - 1; + } else { + return position % mColumns == mColumns - 1; + } + } + + private int computeScrollOffset(RecyclerView.State state) { + if (getChildCount() == 0 || state.getItemCount() == 0) { + return 0; + } + View firstView = getChildAt(0); + if (firstView == null) { + return 0; + } + int position = getPosition(firstView); + final float avgSize = (float) getEnd() / (mOrientation == HORIZONTAL ? mColumns : mRows); + int index; + if (mOrientation == HORIZONTAL) { + //所在第几列 + int pagerIndex = getPagerIndexByPosition(position); + index = pagerIndex * mColumns + position % mColumns; + } else { + //所在第几行 + index = position / mColumns; + } + int scrollOffset; + if (shouldHorizontallyReverseLayout()) { + int scrollRange = computeScrollRange(state) - computeScrollExtent(state); + scrollOffset = scrollRange - Math.round(index * avgSize + (getDecoratedEnd(firstView) - getEndAfterPadding())); + } else { + scrollOffset = Math.round(index * avgSize + (getStartAfterPadding() - getDecoratedStart(firstView))); + } + if (DEBUG) { + Log.i(TAG, "computeScrollOffset: " + scrollOffset); + } + return scrollOffset; + } + + private int computeScrollExtent(RecyclerView.State state) { + if (getChildCount() == 0 || state.getItemCount() == 0) { + return 0; + } + int scrollExtent = getEnd(); + if (DEBUG) { + Log.i(TAG, "computeScrollExtent: " + scrollExtent); + } + return scrollExtent; + } + + private int computeScrollRange(RecyclerView.State state) { + if (getChildCount() == 0 || state.getItemCount() == 0) { + return 0; + } + int scrollRange = Math.max(mPagerCount, 0) * getEnd(); + if (DEBUG) { + Log.i(TAG, "computeScrollRange: " + scrollRange); + } + return scrollRange; + } + + private void resolveShouldLayoutReverse() { + if (mOrientation == VERTICAL || !isLayoutRTL()) { + mShouldReverseLayout = mReverseLayout; + } else { + //水平滑动且是RTL + mShouldReverseLayout = !mReverseLayout; + } + } + + boolean getShouldReverseLayout() { + return mShouldReverseLayout; + } + + /** + * @return 左上角第一个view的位置 + */ + final Rect getStartSnapRect() { + return mStartSnapRect; + } + + /** + * @return 右下角最后一个view的位置 + */ + final Rect getEndSnapRect() { + return mEndSnapRect; + } + + /** + * 根据下标计算页码 + * + * @param position + */ + final void calculateCurrentPagerIndexByPosition(int position) { + setCurrentPagerIndex(getPagerIndexByPosition(position)); + } + + final LayoutState getLayoutState() { + return mLayoutState; + } + + /** + * @return 是否水平方向反转布局 + */ + boolean shouldHorizontallyReverseLayout() { + return mShouldReverseLayout && mOrientation == HORIZONTAL; + } + + @Nullable + @Override + public PointF computeScrollVectorForPosition(int targetPosition) { + int childCount = getChildCount(); + if (childCount == 0) { + return null; + } + int firstSnapPosition = RecyclerView.NO_POSITION; + for (int i = childCount - 1; i >= 0; i--) { + View childAt = getChildAt(i); + if (childAt != null) { + int position = getPosition(childAt); + if (position % mOnePageSize == 0) { + firstSnapPosition = position; + break; + } + } + } + if (firstSnapPosition == RecyclerView.NO_POSITION) { + return null; + } + float direction = targetPosition < firstSnapPosition ? -1f : 1f; + if (shouldHorizontallyReverseLayout()) { + direction = -direction; + } + if (DEBUG) { + Log.w(TAG, "computeScrollVectorForPosition-firstSnapPosition: " + firstSnapPosition + ", targetPosition:" + targetPosition + ",mOrientation :" + mOrientation + ", direction:" + direction); + } + if (mOrientation == HORIZONTAL) { + return new PointF(direction, 0f); + } else { + return new PointF(0f, direction); + } + } + + /** + * 自定义LayoutParams + */ + public static class LayoutParams extends RecyclerView.LayoutParams { + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(int width, int height) { + super(width, height); + } + + public LayoutParams(ViewGroup.MarginLayoutParams source) { + super(source); + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + + public LayoutParams(RecyclerView.LayoutParams source) { + super(source); + } + + } + + private static class SmoothScrollToPosition implements Runnable { + private final int mPosition; + @NonNull + private final PagerGridLayoutManager mLayoutManager; + @NonNull + private final RecyclerView mRecyclerView; + + SmoothScrollToPosition(int position, @NonNull PagerGridLayoutManager layoutManager, @NonNull RecyclerView recyclerView) { + mPosition = position; + mLayoutManager = layoutManager; + mRecyclerView = recyclerView; + } + + @Override + public void run() { + PagerGridSmoothScroller smoothScroller = new PagerGridSmoothScroller(mRecyclerView, mLayoutManager); + smoothScroller.setTargetPosition(mPosition); + mLayoutManager.startSmoothScroll(smoothScroller); + } + } + + protected static class LayoutState { + + protected static final int LAYOUT_START = -1; + + protected static final int LAYOUT_END = 1; + + + protected static final int SCROLLING_OFFSET_NaN = Integer.MIN_VALUE; + + /** + * 可填充的View空间大小 + */ + protected int mAvailable; + /** + * 是否需要回收View + */ + protected boolean mRecycle; + + protected int mCurrentPosition; + /** + * 布局的填充方向 + * 值为 {@link #LAYOUT_START} or {@link #LAYOUT_END} + */ + protected int mLayoutDirection; + /** + * 在滚动状态下构造布局状态时使用。 + * 它应该设置我们可以在不创建新视图的情况下进行滚动量。 + * 有效的视图回收需要设置 + */ + protected int mScrollingOffset; + /** + * 开始绘制的坐标位置 + */ + protected final Rect mOffsetRect = new Rect(); + /** + * 最近一次的滑动数量 + */ + protected int mLastScrollDelta; + /** + * 需要补充滑动的距离 + */ + protected int replenishDelta; + + protected LayoutState() { + } + + protected void setOffsetRect(int left, int top, int right, int bottom) { + mOffsetRect.set(left, top, right, bottom); + } + + protected View next(RecyclerView.Recycler recycler) { + return recycler.getViewForPosition(mCurrentPosition); + } + + protected boolean hasMore(RecyclerView.State state) { + return mCurrentPosition >= 0 && mCurrentPosition < state.getItemCount(); + } + + /** + * @param currentPosition 当前的位置 + * @param orientation 方向 + * @param rows 行数 + * @param columns 列数 + * @param state 状态 + * @return 下一个位置 + */ + protected int getNextPosition(int currentPosition, int orientation, int rows, int columns, RecyclerView.State state) { + int position; + int onePageSize = rows * columns; + if (orientation == HORIZONTAL) { + int surplus = currentPosition % onePageSize; + //水平滑动 + //向后追加item + if (surplus == onePageSize - 1) { + //一页的最后一个位置 + position = currentPosition + 1; + } else { + //在第几列 + int columnsIndex = currentPosition % columns; + //在第几行 + int rowIndex = surplus / columns; + //是否在最后一行 + boolean isLastRow = rowIndex == rows - 1; + if (isLastRow) { + position = currentPosition - rowIndex * columns + 1; + } else { + position = currentPosition + columns; + if (position >= state.getItemCount()) { + //越界了 + if (columnsIndex != columns - 1) { + //如果不是最后一列,计算换行位置 + position = currentPosition - rowIndex * columns + 1; + } + } + } + } + } else { + //垂直滑动 + position = currentPosition + 1; + } + return position; + } + + /** + * @param currentPosition 当前的位置 + * @param orientation 方向 + * @param rows 行数 + * @param columns 列数 + * @param state 状态 + * @return 上一个位置 + */ + protected int getPrePosition(int currentPosition, int orientation, int rows, int columns, RecyclerView.State state) { + int position; + int onePageSize = rows * columns; + if (orientation == HORIZONTAL) { + int surplus = currentPosition % onePageSize; + //水平滑动 + //向前追加item + if (surplus == 0) { + //一页的第一个位置 + position = currentPosition - 1; + } else { + //在第几行 + int rowIndex = surplus / columns; + //是否在第一行 + boolean isFirstRow = rowIndex == 0; + if (isFirstRow) { + position = currentPosition - 1 + (rows - 1) * columns; + } else { + position = currentPosition - columns; + } + } + } else { + //垂直滑动 + position = currentPosition - 1; + } + return position; + } + } + + protected static class LayoutChunkResult { + protected int mConsumed; + protected boolean mFinished; + protected boolean mIgnoreConsumed; + protected boolean mFocusable; + + protected void resetInternal() { + mConsumed = 0; + mFinished = false; + mIgnoreConsumed = false; + mFocusable = false; + } + } + + /** + * @see RecyclerView.LayoutManager#onSaveInstanceState() + * @see RecyclerView.LayoutManager#onRestoreInstanceState(Parcelable) + */ + protected static class SavedState implements Parcelable { + /** + * 当前滑动方向 + */ + protected int mOrientation; + /** + * 行数 + */ + protected int mRows; + /** + * 列数 + */ + protected int mColumns; + /** + * 当前页码下标 + * 从0开始 + */ + protected int mCurrentPagerIndex = NO_ITEM; + + protected boolean mReverseLayout = false; + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(this.mOrientation); + dest.writeInt(this.mRows); + dest.writeInt(this.mColumns); + dest.writeInt(this.mCurrentPagerIndex); + } + + public void readFromParcel(Parcel source) { + this.mOrientation = source.readInt(); + this.mRows = source.readInt(); + this.mColumns = source.readInt(); + this.mCurrentPagerIndex = source.readInt(); + } + + public SavedState() { + } + + protected SavedState(Parcel in) { + this.mOrientation = in.readInt(); + this.mRows = in.readInt(); + this.mColumns = in.readInt(); + this.mCurrentPagerIndex = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public SavedState createFromParcel(Parcel source) { + return new SavedState(source); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + + @NonNull + @Override + public String toString() { + return "SavedState{" + + "mOrientation=" + mOrientation + + ", mRows=" + mRows + + ", mColumns=" + mColumns + + ", mCurrentPagerIndex=" + mCurrentPagerIndex + + '}'; + } + } + + public interface PagerChangedListener { + /** + * 页面总数量变化 + * + * @param pagerCount 页面总数,从1开始,为0时说明无数据,{{@link #NO_PAGER_COUNT}} + */ + void onPagerCountChanged(@IntRange(from = 0) int pagerCount); + + /** + * 选中的页面下标 + * + * @param prePagerIndex 上次的页码,当{{@link #getItemCount()}}为0时,为-1,{{@link #NO_ITEM}} + * @param currentPagerIndex 当前的页码,当{{@link #getItemCount()}}为0时,为-1,{{@link #NO_ITEM}} + */ + void onPagerIndexSelected(@IntRange(from = -1) int prePagerIndex, @IntRange(from = -1) int currentPagerIndex); + } +} diff --git a/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSmoothScroller.java b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSmoothScroller.java new file mode 100644 index 0000000..9ca9ce4 --- /dev/null +++ b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSmoothScroller.java @@ -0,0 +1,142 @@ +package com.chwl.core.widget.layoutmanager.pagergridlayoutmanager; + +import android.graphics.PointF; +import android.graphics.Rect; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; + +/** + * @author ShenBen + * @date 2021/02/18 11:40 + * @email 714081644@qq.com + */ +class PagerGridSmoothScroller extends LinearSmoothScroller { + private static final String TAG = "PagerGridSmoothScroller"; + @NonNull + private final PagerGridLayoutManager mLayoutManager; + @NonNull + private final RecyclerView mRecyclerView; + /** + * @see #calculateSpeedPerPixel(DisplayMetrics) + */ + static final float MILLISECONDS_PER_INCH = 100f; + /** + * @see #calculateTimeForScrolling(int) + */ + static final int MAX_SCROLL_ON_FLING_DURATION = 500; //ms + + PagerGridSmoothScroller(@NonNull RecyclerView recyclerView, @NonNull PagerGridLayoutManager layoutManager) { + super(recyclerView.getContext()); + mRecyclerView = recyclerView; + mLayoutManager = layoutManager; + } + + /** + * 该方法会在targetSnapView被layout出来的时候调用。 + * + * @param targetView targetSnapView + * @param state + * @param action + */ + @Override + protected void onTargetFound(View targetView, RecyclerView.State state, Action action) { + RecyclerView.LayoutManager layoutManager = getLayoutManager(); + if (layoutManager instanceof PagerGridLayoutManager) { + PagerGridLayoutManager manager = (PagerGridLayoutManager) layoutManager; + + int targetPosition = manager.getPosition(targetView); + + PointF pointF = computeScrollVectorForPosition(targetPosition); + if (pointF == null) { + //为null,则不处理 + return; + } + + boolean isLayoutToEnd = pointF.x > 0 || pointF.y > 0; + if (manager.shouldHorizontallyReverseLayout()) { + isLayoutToEnd = !isLayoutToEnd; + } + Rect snapRect; + if (isLayoutToEnd) { + snapRect = manager.getStartSnapRect(); + } else { + snapRect = manager.getEndSnapRect(); + } + Rect targetRect = new Rect(); + layoutManager.getDecoratedBoundsWithMargins(targetView, targetRect); + int dx = calculateDx(manager, snapRect, targetRect, isLayoutToEnd); + int dy = calculateDy(manager, snapRect, targetRect, isLayoutToEnd); + final int time = calculateTimeForDeceleration(Math.max(Math.abs(dx), Math.abs(dy))); + if (PagerGridLayoutManager.DEBUG) { + Log.i(TAG, "onTargetFound-targetPosition:" + targetPosition + ", dx:" + dx + ",dy:" + dy + ",time:" + time + ",isLayoutToEnd:" + isLayoutToEnd + ",snapRect:" + snapRect + ",targetRect:" + targetRect); + } + if (time > 0) { + action.update(dx, dy, time, mDecelerateInterpolator); + } else { + //说明滑动完成,计算页标 + manager.calculateCurrentPagerIndexByPosition(targetPosition); + } + } + } + + /** + * 不可过小,不然可能会出现划过再回退的情况 + * + * @param displayMetrics + * @return 值越大,滚动速率越慢,反之 + */ + @Override + protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { + float speed = mLayoutManager.getMillisecondPreInch() / displayMetrics.densityDpi; + if (PagerGridLayoutManager.DEBUG) { + Log.i(TAG, "calculateSpeedPerPixel-speed: " + speed); + } + return speed; + } + + /** + * 为避免长时间滚动,设置一个最大滚动时间 + * + * @param dx 滚动的像素距离 + * @return 值越大,滑动时间越长,滚动速率越慢,反之 + */ + @Override + protected final int calculateTimeForScrolling(int dx) { + int time = Math.min(mLayoutManager.getMaxScrollOnFlingDuration(), super.calculateTimeForScrolling(dx)); + Log.i(TAG, "calculateTimeForScrolling-time: " + time); + return time; + } + + static int calculateDx(PagerGridLayoutManager manager, Rect snapRect, Rect targetRect) { + if (!manager.canScrollHorizontally()) { + return 0; + } + return targetRect.left - snapRect.left; + } + + static int calculateDy(PagerGridLayoutManager manager, Rect snapRect, Rect targetRect) { + if (!manager.canScrollVertically()) { + return 0; + } + return targetRect.top - snapRect.top; + } + + static int calculateDx(PagerGridLayoutManager manager, Rect snapRect, Rect targetRect, boolean isLayoutToEnd) { + if (!manager.canScrollHorizontally()) { + return 0; + } + return isLayoutToEnd ? (targetRect.left - snapRect.left) : (targetRect.right - snapRect.right); + } + + static int calculateDy(PagerGridLayoutManager manager, Rect snapRect, Rect targetRect, boolean isLayoutToEnd) { + if (!manager.canScrollVertically()) { + return 0; + } + return isLayoutToEnd ? (targetRect.top - snapRect.top) : (targetRect.bottom - snapRect.bottom); + } +} diff --git a/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSnapHelper.java b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSnapHelper.java new file mode 100644 index 0000000..bf0be98 --- /dev/null +++ b/core/src/main/java/com/chwl/core/widget/layoutmanager/pagergridlayoutmanager/PagerGridSnapHelper.java @@ -0,0 +1,479 @@ +package com.chwl.core.widget.layoutmanager.pagergridlayoutmanager; + +import android.graphics.Rect; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SnapHelper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author ShenBen + * @date 2021/01/13 13:43 + * @email 714081644@qq.com + */ +class PagerGridSnapHelper extends SnapHelper { + private static final String TAG = "PagerGridSnapHelper"; + + private RecyclerView mRecyclerView; + /** + * 存放锚点位置的view,一般数量为1或2个 + */ + private final List snapList = new ArrayList<>(2); + + PagerGridSnapHelper() { + } + + @Override + public void attachToRecyclerView(@Nullable RecyclerView recyclerView) throws IllegalStateException { + super.attachToRecyclerView(recyclerView); + mRecyclerView = recyclerView; + } + + @Nullable + @Override + protected RecyclerView.SmoothScroller createScroller(@NonNull RecyclerView.LayoutManager layoutManager) { + if (!(layoutManager instanceof PagerGridLayoutManager)) { + return null; + } + if (mRecyclerView != null) { + return new PagerGridSmoothScroller(mRecyclerView, (PagerGridLayoutManager) layoutManager); + } + return null; + } + + @Override + public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) { + final int itemCount = layoutManager.getItemCount(); + if (itemCount == 0) { + return RecyclerView.NO_POSITION; + } + int childCount = layoutManager.getChildCount(); + if (childCount == 0) { + return RecyclerView.NO_POSITION; + } + if (!(layoutManager instanceof PagerGridLayoutManager)) { + return RecyclerView.NO_POSITION; + } + final PagerGridLayoutManager manager = (PagerGridLayoutManager) layoutManager; + if (manager.getLayoutState().mLastScrollDelta == 0) { + //说明无法滑动了,到头或滑动到底 + return RecyclerView.NO_POSITION; + } + int[] calculateScrollDistance = calculateScrollDistance(velocityX, velocityY); + //计算滑动的距离 + int scrollDistance = manager.canScrollHorizontally() ? calculateScrollDistance[0] : calculateScrollDistance[1]; + + if (manager.shouldHorizontallyReverseLayout()) { + //取反 + scrollDistance = -scrollDistance; + } + + //滑动方向是否向前 + final boolean forwardDirection = isForwardFling(manager, velocityX, velocityY); + //布局中心位置,水平滑动为X轴坐标,垂直滑动为Y轴坐标 + final int layoutCenter = getLayoutCenter(manager); + + reacquireSnapList(manager); + + //目标位置 + int targetPosition = RecyclerView.NO_POSITION; + switch (snapList.size()) { + case 1: { + View view = snapList.get(0); + int position = manager.getPosition(view); + + if (forwardDirection) { + //方向向前 + if (scrollDistance >= layoutCenter) { + //计算滑动的距离直接超过布局一半值 + targetPosition = position; + } else { + if (manager.shouldHorizontallyReverseLayout()) { + //水平滑动需要反转的情况 + int viewDecoratedEnd = getViewDecoratedEnd(manager, view); + if (viewDecoratedEnd + scrollDistance >= layoutCenter) { + //view的结束线+scrollDistance大于于中间线, + //即view在中间线的左边或者上边 + targetPosition = position; + } else { + //寻找上一个锚点位置 + targetPosition = position - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } + } else { + int viewDecoratedStart = getViewDecoratedStart(manager, view); + if (viewDecoratedStart - scrollDistance <= layoutCenter) { + //view的起始线-scrollDistance 小于中间线, + //即view在中间线的左边或者上边 + targetPosition = position; + } else { + //寻找上一个锚点位置 + targetPosition = position - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } + } + } + } else { + //方向向后 + if (Math.abs(scrollDistance) >= layoutCenter) { + //计算滑动的距离直接超过布局一半值 + targetPosition = position - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + if (manager.shouldHorizontallyReverseLayout()) { + //水平滑动需要反转的情况 + int viewDecoratedStart = getViewDecoratedStart(manager, view); + if (viewDecoratedStart - Math.abs(scrollDistance) < layoutCenter) { + //寻找上一个锚点位置 + targetPosition = position - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + targetPosition = position; + } + } else { + int viewDecoratedEnd = getViewDecoratedEnd(manager, view); + if (viewDecoratedEnd + Math.abs(scrollDistance) > layoutCenter) { + //寻找上一个锚点位置 + targetPosition = position - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + targetPosition = position; + } + } + } + } + } + break; + case 2: { + View view1 = snapList.get(0); + int position1 = manager.getPosition(view1); + View view2 = snapList.get(1); + int position2 = manager.getPosition(view2); + + if (manager.shouldHorizontallyReverseLayout()) { + if (forwardDirection) { + //方向向前 + if (scrollDistance >= layoutCenter) { + //计算滑动的距离直接超过布局一半值 + targetPosition = position2; + } else { + int viewDecoratedEnd2 = getViewDecoratedEnd(manager, view2); + if (viewDecoratedEnd2 + scrollDistance >= layoutCenter) { + //view的结束线+scrollDistance 大于中间线, + //即view在中间线的左边或者上边 + targetPosition = position2; + } else { + targetPosition = position2 - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } + } + } else { + if (Math.abs(scrollDistance) >= layoutCenter) { + targetPosition = position2 - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + int viewDecoratedStart1 = getViewDecoratedStart(manager, view1); + if (viewDecoratedStart1 - Math.abs(scrollDistance) <= layoutCenter) { + targetPosition = position2 - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + targetPosition = position2; + } + } + } + } else { + if (forwardDirection) { + //方向向前 + if (scrollDistance >= layoutCenter) { + //计算滑动的距离直接超过布局一半值 + targetPosition = position2; + } else { + int viewDecoratedStart2 = getViewDecoratedStart(manager, view2); + + if (viewDecoratedStart2 - scrollDistance <= layoutCenter) { + //view的起始线-scrollDistance 小于中间线, + //即view在中间线的左边或者上边 + targetPosition = position2; + } else { + targetPosition = position2 - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } + } + } else { + if (Math.abs(scrollDistance) >= layoutCenter) { + targetPosition = position2 - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + int viewDecoratedEnd1 = getViewDecoratedEnd(manager, view1); + if (viewDecoratedEnd1 + Math.abs(scrollDistance) >= layoutCenter) { + targetPosition = position2 - 1; + if (targetPosition < 0) { + targetPosition = RecyclerView.NO_POSITION; + } + } else { + targetPosition = position2; + } + } + } + } + } + break; + case 3: + //1行*1列可能出现的情况 + targetPosition = manager.getPosition(snapList.get(1)); + break; + default: + if (PagerGridLayoutManager.DEBUG) { + Log.w(TAG, "findTargetSnapPosition-snapList.size: " + snapList.size()); + } + break; + } + if (PagerGridLayoutManager.DEBUG) { + Log.d(TAG, "findTargetSnapPosition->forwardDirection:" + forwardDirection + ",targetPosition:" + targetPosition + ",velocityX: " + velocityX + ",velocityY: " + velocityY + ",scrollDistance:" + scrollDistance + ",snapList:" + snapList.size()); + } + snapList.clear(); + return targetPosition; + } + + @Nullable + @Override + public View findSnapView(RecyclerView.LayoutManager layoutManager) { + View snapView = null; + if (layoutManager instanceof PagerGridLayoutManager) { + PagerGridLayoutManager manager = (PagerGridLayoutManager) layoutManager; + reacquireSnapList(manager); + switch (snapList.size()) { + case 1: { + snapView = snapList.get(0); + } + break; + case 2: { + //布局中心位置,水平滑动为X轴坐标,垂直滑动为Y轴坐标 + final int layoutCenter = getLayoutCenter(manager); + View view1 = snapList.get(0); + View view2 = snapList.get(1); + Rect rect = new Rect(); + manager.getDecoratedBoundsWithMargins(view2, rect); + + if (manager.shouldHorizontallyReverseLayout()) { + int viewDecoratedEnd2 = getViewDecoratedEnd(manager, view2); + if (viewDecoratedEnd2 <= layoutCenter) { + snapView = view1; + } else { + snapView = view2; + } + } else { + int viewDecoratedStart2 = getViewDecoratedStart(manager, view2); + if (viewDecoratedStart2 <= layoutCenter) { + snapView = view2; + } else { + snapView = view1; + } + } + } + break; + case 3: + //1行*1列可能出现的情况 + snapView = snapList.get(1); + break; + default: + if (PagerGridLayoutManager.DEBUG) { + Log.w(TAG, "findSnapView wrong -> snapList.size: " + snapList.size()); + } + break; + } + if (PagerGridLayoutManager.DEBUG) { + Log.i(TAG, "findSnapView: position:" + (snapView != null ? layoutManager.getPosition(snapView) : RecyclerView.NO_POSITION) + ", snapList.size:" + snapList.size()); + } + snapList.clear(); + } + return snapView; + } + + @Nullable + @Override + public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView) { + int[] snapDistance = new int[2]; + int targetPosition = layoutManager.getPosition(targetView); + if (layoutManager instanceof PagerGridLayoutManager) { + final PagerGridLayoutManager manager = (PagerGridLayoutManager) layoutManager; + //布局中心位置,水平滑动为X轴坐标,垂直滑动为Y轴坐标 + final int layoutCenter = getLayoutCenter(manager); + int dx; + int dy; + Rect targetRect = new Rect(); + layoutManager.getDecoratedBoundsWithMargins(targetView, targetRect); + if (manager.shouldHorizontallyReverseLayout()) { + int viewDecoratedEnd = getViewDecoratedEnd(manager, targetView); + if (viewDecoratedEnd >= layoutCenter) { + //向前回退 + Rect snapRect = manager.getStartSnapRect(); + dx = PagerGridSmoothScroller.calculateDx(manager, snapRect, targetRect); + dy = PagerGridSmoothScroller.calculateDy(manager, snapRect, targetRect); + } else { + //向后前进 + dx = -calculateDxToNextPager(manager, targetRect); + dy = -calculateDyToNextPager(manager, targetRect); + } + } else { + int viewDecoratedStart = getViewDecoratedStart(manager, targetView); + + if (viewDecoratedStart <= layoutCenter) { + //向前回退 + Rect snapRect = manager.getStartSnapRect(); + dx = PagerGridSmoothScroller.calculateDx(manager, snapRect, targetRect); + dy = PagerGridSmoothScroller.calculateDy(manager, snapRect, targetRect); + } else { + //向后前进 + dx = -calculateDxToNextPager(manager, targetRect); + dy = -calculateDyToNextPager(manager, targetRect); + } + } + snapDistance[0] = dx; + snapDistance[1] = dy; + + if (snapDistance[0] == 0 && snapDistance[1] == 0) { + //说明滑动完成,计算页标 + manager.calculateCurrentPagerIndexByPosition(targetPosition); + } + if (PagerGridLayoutManager.DEBUG) { + Log.i(TAG, "calculateDistanceToFinalSnap-targetView: " + targetPosition + ",snapDistance: " + Arrays.toString(snapDistance)); + } + } + return snapDistance; + } + + private boolean isForwardFling(PagerGridLayoutManager layoutManager, int velocityX, int velocityY) { + return layoutManager.canScrollHorizontally() ? + (layoutManager.getShouldReverseLayout() ? velocityX < 0 : velocityX > 0) + : velocityY > 0; + } + + /*** + * 获取锚点view + * @param manager + */ + private void reacquireSnapList(PagerGridLayoutManager manager) { + if (!snapList.isEmpty()) { + snapList.clear(); + } + int childCount = manager.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = manager.getChildAt(i); + if (child == null) { + continue; + } + //先去寻找符合锚点位置的view + if (manager.getPosition(child) % manager.getOnePageSize() == 0) { + snapList.add(child); + } + } + } + + static int calculateDxToNextPager(PagerGridLayoutManager manager, Rect targetRect) { + if (!manager.canScrollHorizontally()) { + return 0; + } + return getLayoutEndAfterPadding(manager) - targetRect.left; + } + + static int calculateDyToNextPager(PagerGridLayoutManager manager, Rect targetRect) { + if (!manager.canScrollVertically()) { + return 0; + } + return getLayoutEndAfterPadding(manager) - targetRect.top; + } + + /** + * 计算targetView中心位置到布局中心位置的距离 + * + * @param layoutManager + * @param targetView + * @return + */ + static int distanceToCenter(RecyclerView.LayoutManager layoutManager, @NonNull View targetView) { + //布局中心位置,水平滑动为X轴坐标,垂直滑动为Y轴坐标 + final int layoutCenter = getLayoutCenter(layoutManager); + final int childCenter = getChildViewCenter(layoutManager, targetView); + return childCenter - layoutCenter; + } + + static int getLayoutCenter(RecyclerView.LayoutManager layoutManager) { + return getLayoutStartAfterPadding(layoutManager) + getLayoutTotalSpace(layoutManager) / 2; + } + + static int getLayoutStartAfterPadding(RecyclerView.LayoutManager layoutManager) { + return layoutManager.canScrollHorizontally() ? layoutManager.getPaddingStart() : layoutManager.getPaddingTop(); + } + + static int getLayoutEndAfterPadding(RecyclerView.LayoutManager layoutManager) { + return layoutManager.canScrollHorizontally() ? + layoutManager.getWidth() - layoutManager.getPaddingEnd() + : layoutManager.getHeight() - layoutManager.getPaddingBottom(); + } + + static int getLayoutTotalSpace(RecyclerView.LayoutManager layoutManager) { + return layoutManager.canScrollHorizontally() ? + layoutManager.getWidth() - layoutManager.getPaddingStart() - layoutManager.getPaddingEnd() : + layoutManager.getHeight() - layoutManager.getPaddingTop() - layoutManager.getPaddingBottom(); + } + + static int getChildViewCenter(RecyclerView.LayoutManager layoutManager, View targetView) { + return getViewDecoratedStart(layoutManager, targetView) + + (getViewDecoratedMeasurement(layoutManager, targetView) / 2); + } + + static int getViewDecoratedStart(RecyclerView.LayoutManager layoutManager, View view) { + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams(); + if (layoutManager.canScrollHorizontally()) { + return layoutManager.getDecoratedLeft(view) - params.leftMargin; + } else { + return layoutManager.getDecoratedTop(view) - params.topMargin; + } + } + + static int getViewDecoratedEnd(RecyclerView.LayoutManager layoutManager, View view) { + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams(); + if (layoutManager.canScrollHorizontally()) { + return layoutManager.getDecoratedRight(view) - params.rightMargin; + } else { + return layoutManager.getDecoratedBottom(view) - params.bottomMargin; + } + } + + static int getViewDecoratedMeasurement(RecyclerView.LayoutManager layoutManager, View view) { + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams(); + if (layoutManager.canScrollHorizontally()) { + return layoutManager.getDecoratedMeasuredWidth(view) + params.leftMargin + params.rightMargin; + } else { + return layoutManager.getDecoratedMeasuredHeight(view) + params.topMargin + params.bottomMargin; + } + } +} diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_aquarius.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_aquarius.webp new file mode 100644 index 0000000000000000000000000000000000000000..ed30614c013100017c3a6e47be266d1825527837 GIT binary patch literal 2114 zcmV-I2)*}GNk&FG2mk_}`U zqxDc)IAW54Tb595mNEacSHLk!fe|Y`QwP&Q45i!SKN7p2fIhUOebLFO;U4vV(w!Qe zmw?o4;E_}9ieK>7i)IoL>pFklo{KZ2hK2|A#VEU#dhDlp01sgWMV{{~xipn#rGv+k zl47L(H#{Lwc-UQ}!f0ADkJ9WG8n~Yn9Fp~s|wviMl-bZc$S)^@Gl;B3vkP<=`Mv#}Qd;6QHhR)?Lnvp8n9U8Nx{V|Ds7)M1(% zz>BMB{mEVUI1O8K4Tbx`p`6sQM$rK_7Eoyb03CwCZ#(W|bmECMGQ`Ntvl7Ngri$dT zeRhB8V!N;BB&LGcT&j>Sm-=)K;M=u}PuE;NT`T%_ja!Tr1k~nRV zpucYEj;S4k@!y*w+`BWIynuR>@j&Sz<}3A+)!Y1UsXsXGpbtO~*bh!$Vz1plN?JcW zAARq<*-6;{y<<~VK_i#+=hp{2k4OL8_Xqu4|B>pA>;v`#*+2ChLO+OvxJ7j%mheDr9EPsUo44IV<5@D)D zwU~aih=)SOLJmMx%1UL_pofI}ydXpTmUvw2SSwXy3ynCyNudR&@M$pu;y0m{N*k!zkDq%nSz8%8A^Bfkrz6A>IZK_vKPq4f$>;$m!Sr=_1+Y zAw^0_Diz?e({lLNwj<|K7+qY9IabvK)h+B@od*VA`#92znHME&bIf9%a6O?C)L;yI zuEe`yd(dG4!bZDTcl{urYJiNOPqr3`Kd4Iv@CmaFSsAwQ)jt96U!1y!Tp>I$uxmJOJ z{%J5#od{x%oosnq1L4kxR!M-T!Uv5F-AQJzTwl-tP1NMugP&T6@FuNhR68MUX>rn_ ze7TGEX(KxTS_ceQ?WFPuz2KHF+N)ROM+#Qiz=C9sMvGdL+nZTiOK}6dg!j$b8>s;|APy3rL8f*A^XWv zZ{{9rRQ*TypRoo;x$NDa_pWez=h=BS1U%Zp>@gHinr2R9-Rt51?FO+Y^YBZ?6&O^U z|JLY_wq+x-Tco24(M*|NMsJTvn%8*+r<3IB1~A-=*2BBvqs#wwC;hU?5FQpJ7D1)^Q&$y`6>s`@ zCQw6h))mwKhedXZqtQ9Mrmxc=tE&l`yeZqP1C)-O8SyO?*qr%IoP@hVB!Nwfj(!x@ zDTzNFP_5h1wYS?l$P2KlPT?%s9;`1a#eDD5b~b1b`+tK7e{ZC!gY!B}(+Gqgyo;VY z^}QYe7Tbf%>zn&%xM>6kKOkwH)uqi7G?;=WA^KzXdyAr--@v%|`!>ENVITg*0j>d^ zx_<2e*|2=?g@$Gs0?cOQyeG(1)Gz<35z(@YMWb!l-4a07AfX%jM0!@)5lWEJISc>iq+lUF~s`<@wIf4Ym`Il4CW`u-9= z*UX>lc9+z>7=Mw5Ebct3+rGW}+dswv{KHsVOMd>=Z_l70llMhaz2fa#g6)=Lp#jZM zNJ}T&(|`Rept#`u%4$4+^yn!(v>d^J$J4&am9tGN`nA2SH>G%m_YZxq$OVAkLs9?i`qw1Hzc z&@<@IJO5JtzG4>i%;FkEY}bzJ zxT{wd!l%jjhFI}w1pP3)DP4lKRo$Un#6U9hx8|?*~Q}h0OPew{Lh5!Km@6{FZ zo%2WCPY~L;1TM5Z23knwxzYKGxfSG>kuf9v7-=2fpXE&6U~63vi{az+j9*^t!(h$U zL{qqDU;7PxjQ#&tqGI~*ruPg9|4j3bt8KvtR38oFYjA(NW0VMS*J5&Y^@3#ny`XU3 ztg6vF{XR$inWfIIA3%op2W%UZiv!4pq+orfD)xUf_34>9g&Ik^&U^oR3ljG+Z4$70 z;7y%bV-0=qS}n|~hnM0YzEmxTzAwwG4(@76%V=XHTF}xNtJ#KKVQ#u*EQO&e~B?Dg1*!HOh{ts;VGO1{G!3IE=k1OPF zyQJ&PpUdMa+xSM5cmj7ImMw3j2MN2;U$wFNX=!9tZrY1x>-<(1mYzntf*f}uLo&51 z;Nrlcy{RS7fAJj~?m33G{SkX!;o2+^#f(`~>(+nQoep0ADaXi1inuCtf@lA5fnK|_ z_T+s1vVp3V<(45&CQ_UZ>Nl4Q#9*a31|Q`geBPgXxp}%FHN2-$=7Jo^<^g*;QNk zQi$L&C{^2w+>wFpl-1Byd(!bQBr@6W)88L8mED(r@78ix#i4Zf%`yqKa(3!}Y3*Wq z=DcflZ^%{xcY%Ok^vBOu;Cx^w_@d{E{x4(SjlSsMGXUxGmKGxE34$zz_Sw`ja6uTL z3gsljAUU=MkU${2d&*&ZaHTw$Iysrp-SA%(%2#A&lpS4H*hChQf0(eG6$lbP8Xmu5 z@UdII@00z|I5r6j4+m{z*}cs&^9L$`pg z^FeWkV7LA2_3~TKlQ3Z-(@wAJa!ugroS0=q6%w9STnu|x(I8Z_^!fKU08m=W>Sh1n zXjU(N91-e+YrhJWY)SV7T}d)_}@|MNsyh!6k(0BUhr AEdT%j literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_cancer.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_cancer.webp new file mode 100644 index 0000000000000000000000000000000000000000..3a3deb904c6d2886e14d6d318acd404afacd90cf GIT binary patch literal 1956 zcmV;V2V3}3Nk>2LJ$9MM6+kP&il$0000G00016001KZ06|PpNLvB`00EG6ZQB{i z14^Ij<#=XmThG|GZQHhO+qP}nw%YDax{TDjh`%op!N_eSMaeMio`$|4=;|ohcgq*2 z^V_b`&A`KorHd8FqqwqE2^SDt=hs*BQ;Y| z`+}R~TaB59+`Wl`BUQW>{Ul2tnNna23w9|CroRj7_x_z&3)_Fk?Wm9UYk$OU0BTC$2{&hxnom*hBy5; zzK11WGu;ix$pWXsgCNw-_D-7R`H8S+#!lJ+Nu0SvUa&iSdhAQ;6-8fm)zUqr*l{LL$O90soU0vET9cVu$WQEmZ>F8n^ZCzf3dht&*BWB^WJQh97$F z@>7cQDt`HrQgpxrk3TaoZy<#{an3r16kxe#FMBC^Z%vF%ONqbq4(=(y+ui6A6%bEV z!Iq%+^LSjiVL&dXdrg%V>Mu2ezRjxwK#iuR_8MF7k@nu(ZG9%$`z*Ef9l+jq7hB)C zY<*X>^&QvFcXM06DNO1p#s4joTmL5l09H^qAQ}Y#05BK;odGIb03-lDQ67y%BcY)e z90mY51q8MLV28{8JKDb*eUs~d-FRCLEGRro`bBw){aO8z_ig_}`aAA#&3Dba*eB3W z^;gp;*uVR4`|n9=#=PMAc0yErz6_*V_1`DbB4vuo$B&?{cwVjc4E<97f$K@^Blhpv zJTz{ZdOUrD)N~CZ9~nxH+Ri1RQU@)E9YlxOghhbkFU0L#p3c)m%4HP^GtF8n>i>}K)8~aBZQ~w!5MCz7j*b?NzBVDWHPgEm^jwZ%ED#u@?GD|Dnfje!hGv-DW8Sc za*~xXjY=@}N$v6{@sPAS>PHAtV6&)bCk4fJw+|%pyfUSgSYR_2=gYk7XKJ>JLdyik zl&ELCo=*dd?J#@g^bNadaC(4%yJImW9u`oU%L?SP!*8X^8Gr#l_Pl*UH+{if6};#E zCa}`#Cr0s-To8l);4t-ZGYwL>018!P{igKqxqeD=F#)~~Pe9+OSy>Q0 z3sCECG|M4V(mK|z9qDU-rZ!E7Y4iU`FM6UB-tNW;sF*T`yXb`^>RS-r{ z-qLBjS|_l}dZnz2auhG+y+&IK5be-C5vy$Ca)%0gEsnN<&${naV)N2;e0YbRBUmSa zxi}M4n$KfBV8%njEmQVpyQ|m3R(qT+8~stVR2VW>JOVGF(RMe<7h%EA`vGUm)%xI% zqBC!=8iq$kSU%kj#(=_8%6ID;&Z8BN?oBXw#2Fe1SXSPYG|tSlmS8g_9V-pui(A7=31Hv!# zjwJc6ieeFVop~hDrHWDb|6kQ06+>;sBC{Y&BFWBDj6y=<1L-^{-?)lcsz^;c3B~Nv z33!NIt1pTc!5I=GTX&MdATj$}QM6`DC6Z@@9Nekh{kypuHh(v4sg2jGHR(qxVatK* z_6C-bsD9q|ZXwY2h5J)K;Pr|h*R~wFl76yr*oF^s@EK^kr`m|1Db=|O%$Mf!F2iST z_cf!1IOK5~Slg;8Y2MU86R@D;<7fKr_U;CN;!Zhm0RX0Z$4&Em1@|u*>G=)~eb`o; zR>E$Zx`54@NjLlK<@>g z*T|nE{R?HxkqYGY>CI)#?P{+{LJrl|QdPGB)ZKPbb(>4oZADeLan;;5S9PC4qzT28 z?+ay%eh~pyP&gn^1pok0833IDDqH|006tM3jYK1%p_V`b+Wkmc0G~nKsx0E29^`-FgC>HVAv1r@zf*x zC-^8OWmuX2yzwj`gm-lB_sYB;-U18hCl3EWMgm^B+-Th9=E|#H+(DNDB`~jV6EDPe znMa-}l7v823Qgcssg=q0j20u50U;3{Rj59;;~u=$ZvZF$(AiW{g$`AJW-Jb%SK2b@ z!lf&D5o>Q#s|5DT^dXWKd6ULt*51oAs__|)r)<>!B;`5v5MT&|j`{gM9A)5TIR=QS z62(#L{FmolrH!gaqnQBkW3RaDfVPn~(Y_G7l1ac%WnaHE-nj@!H_P`ZWWbyOhO>~k zKPbdaep$Wu82pX#G6m3O17W$k6d^Uebx{^x<|>|dUhrB#X4aYd3@`+891!Qgx~b?n zkQy6?f-b#4)_&$V_Mm6(g?fH-ixDV{8FB@);EFna_4oDI^G$#04L$$( zHRm+|YQ+`YO5Wc-d968le_$v|ZxiAv&EVtbCHbo$vfLX1MA>eh`3FiS$8@ATPmg_F z?4)+4gUxaI1kx#G~5?p`n8v9zcrAL)ORCt=1G`TaW@vd*e4Q;FJrk@q7|lYi+d zFH8uf@dwX=Em|DcKW;*@cD8HyAG`w2@^D(=W@Ob3oD)|)+1`NyPTHB5cYLQd;#1Ga z&oUvNz~pyQ2d&~S?+afIsf!1{1{nT&4_B$V+FMH#{DOPq)U3#ak_FFL5tr0rJVAd`h zAaGFt_x^q#rYJ;d+~c+z{jwesu-3M%Cb#eJp`xVjZkDEc=Bb|(f}$J4FHO;W`T}II zG`n_YlP5&O1K>&i?U<*HNpd}zbE`5!A(TyA&h4w{0JS2m2XrtC}Iu0000bC>>k>-ZQHhO+jiMD)2`PDeBT!l5f0q8jU*{^-!r>O`vpl;xxw&# zkq$@nk*R%Qge@A?tzJ=<7_GMOZ851Vez&q4jIm|i@+?$dlS(?KZf*~QtQV$-W#BJj z@YgUHWfhC|Mdmt)Nyjq7qK>RJtPK*Q!A*umBXwBjgoxSDQsZV-8~ZznL+23V4p3ew zoVW~cZ&-x=XAN<>*)Zz;|Ep&5lG)9$C@)D1h}#v0QCE`R@$*iLR{c6K(zZ3r9iXM$ z(8iCguZs2;T|}R(OoYE?xdWimP!ix|6)%c?M1|R{SxElLatA>5eIhubWH==+>o)YY zb0EgXI^Xxlq3dsKcLqgeZUSE1z|ZZm8N2@9f#!xt5kxCFPJ;pTy4t^wuh>(RfEY^l zlsYnPGyrMg2syLtWJOxIX2NlZz@g-209atR+h-gty*m9f4N0ZFYstTC5A8!<0!rPB z4$~pzC1@5Ykvt6o>)mcT8bSZvlWGI(=|JG6g2#aGoes@KF6^Rl=s$ZlorqEX-BPoG z!Z^V5UcqU=@k573B6qQt7ESHcZ5f@oON+a1vGo-|U7;s>;PRG|gBFjbpgYsiSpe0A z{%6~rb(K=#q0ZPB@I=hStw+G?i$L@qJih|hJmC9LJinqvMbWutKo@0Z=mQb9luex@ z&7Ip#U6agROHJJdFn8O<)NL+Pw-rs@#x-->+|+#vM&*Xa_k}8HUqk{{P&gpC1ONa~ z7XY0BDqH|006tM5j6@@%Ar~A5WHE)k85BkwnnxeC6Skfw%=qsU& zAg7d{FF~Y|aF0}iyV}D1@aK=9ULZ8<{9%Z#IIbnofl%b2%YXp>`!P0jLQOv5qH63A zRHyYcR#z;FT~4v8Ou2YMS>KughFw;YV+6T0OqLP0yK}rjZAcg0=bxD zSsV6QJ?-$d-F7*8Ip&2T90k5+Snu+F?Mg&{w3lyyV;>BpiY|L zJ1WK)PtN#{6yK6)d&Ve>IGZY+eh>B-2;6WhDrr!g$yk7pG__x!X*}M`K1sfhlAVaG z_*!p-Pj9(H%}yWjneJMyyh(sMqbz@C=+>{_GJQ8|1cfj_GlIaRFrb*{7thr1_Sm5p z$bi3nwMy_i-P2Nt`U|tFUK)N<{~OCvUs^rvLPljo#)8QHS0|QA6y3G{^=5%z=G+)M zz_8;W5x9`kww=Spv@OmE(fX7rvSMgA=OX>Jzmr%9|GfkFXlq!YRk*g0j`fnx9APc* zcd~?PZGI`4Jwc|v?oF@n8_5XOgnL(yIVfp!f1%HiaE}GWdW;jjgORCOr*y5yH$uO8 zGwhVdIRfe(=4|r^@eak}g*vNMRQf;9@>8^#&F9c(@`3VGf{Eh)D|n66EL{!_N$KRE zRyn+ud--?1kY4`5@^gW!?r}>KPoi!7>B(j$@$!I~#Y2vrefQtF&LM1*i{v~%|6W6P z{@6o6z__G*a7eQKuK0u$%Wpzc% z%M6Ufw=*)wrUGnixmj_|y-45+-)ST-si|zgOZYDwe>BCrF#HTZ-u}7pA{hv3wM%nyqu#8_gc!!My`n3R2{bgv&a4NjZttw%0d_q?|J`t_Jzso z8K>wiiOes?rrC~>!nskqW_wqemLhW?hz}kSuW!JQ1I&I?8{ZDn#^ChOJN73kD#u(*e^d&M%3Ra=r`i@rUHa7WdtYmLLyNip)WERpD773KFO2$Ouz5S zuX9zDcVmN>e1wHE@K&i!Cd2P0Va!>h33O`V*Aed`P`%Q%jUlwrulrSnh94y(Z4I4Yihy@WiwU07T7t3D3z z4@lt5AvT1}@(IFi%ja`Fn8`J5(55mEBg>v|gSG(PW4|lU0{)`hUsrqK)#IDI0($@f zDj~jnj)0o}CjbBYh&)SgATigZKn5>`-_rQq=#co&iQI_X3-LUYXpOw^Y*bCi*)CEU O)5CcIF79pBmv{h9`I#aB literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_leo.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_leo.webp new file mode 100644 index 0000000000000000000000000000000000000000..db3a042d23774ecbd49e483c92bce7c9561ff740 GIT binary patch literal 1572 zcmV+<2HW{kNk&E-1^@t8MM6+kP&il$0000G00016001KZ06|PpNUi|@00EF}Yum9m zZ!k2bw)MugZQE9D+wCYlgbX|E%(iX&H=j7q_dV|cL8&xa@idtN89<0w>bnW;HB|?g7Gk zEu2bMiI^w5H8;#buoZN|2zkiEhHuA3Xp` zK1d)7Oa8M9Bzlkxf5w>mC#if&CkqaYtpmw!Bg2nbUy{xxGNP=4{z>Ow-fC1qsa(Oi z8Dwy9HAbOVEt}XUfY3oNsyi|9mF4_uk%fq^;Kqjbgsyj$Z-1w}ZA|KZCNk^7<(glMVO?)UHhK%r- zMZ=$nz`D=^4=HZU#{EF7gUvysg^0!$;lf|B#toi`+T|+oMg!m@98IlT<_DG)}AX*b1%rz5zOAg z&)>mAlXq-~A79KR$hEk;wqN;#S;Pd-twXf6Ss(bN?zu5k<*xQ+#&**2Lo_3hwnZ*g z(6`J@9g+j=8EdkX9rDf=EPGihFIrWX!BBiDI(0f8-I_l&>2;KH_aMOhFoNoNlLY!` zd0s7D7I2^+)K3(#a%b1UQgIaaFs{le4u&kA6I)uW1I!R21#>n&1%Q+{h|QA%ve+ed z+j?|0ZAfJQ9uq#qeOl4RXq=ZNsYRg`-(3 zXs*O;tVkZ<2L5HWe0;S!c60t0qdgWk3QSP5ube1G2<%;Wk&sY1md02qGT%)qj!>*| zSn9mE!J-eetRHoF5!E_xjgEk;=q6|mOww4U4@ZLw7XUC0lV)qoMy!kk zL<;)kb2GVs3;f}$IB-S}_L%?wzW@U9{9H1N}Q W+x;GU;9A3KpECVt?dii-AOHZkiS0-L literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_libra.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_libra.webp new file mode 100644 index 0000000000000000000000000000000000000000..db232cbd1d945d19ec0d1928a00761eba5052242 GIT binary patch literal 1560 zcmV+z2Iu)wNk&Ex1^@t8MM6+kP&il$0000G00016001KZ06|PpNa6ti00EG5ZQCKq z>Z?ypXr#9Fjvd+NZfM)KBX4GAww2ko-A2{7D7+scf|1)cj-+faIVCgm1<6o3W$1=` zR_lXpV`_khIcbT}p|XTDYR2UsMCXqy3#x#RxrxCT!WX|HCcau#44h2zH^b6!iy*u; z1b7)?F-|hYN>Ezoa*G7nXj|eVNPR20MVdY=lNEwinZxf?_pr`JD6|dm`#_uM4x#c+ zF}Kj9N?$|>K=e|Kfl_2Hp~V4S7tReHPvbO+Sc*; zlP2T0pKZNf42jHtq-{SMY#znAL&Fo-r!Od?nb)j#2rnSR!G6}Q+^q%sRDf~czPvwl z13@U8UW2x*8g%B@AbX9_JyPu6F7%ir_E;+P96;>3i_mi}q34Q1&v8Ybn+v_BKq{y5 zUkim9Cy@YFP&gn61ONc=6abw8DqH|006tM7jzpuPArqEJI0Xc=0B8m9eQWX4@&gaM zet7$xKG|5Kb;@KyVx=>ZkWpZDLCuK+ZV zW+DBX&?h?YNP7hSsCqT}{Qbc8PYpEC5!JR3Vg%KIMr8*lxeJ5W}bY)jEPR zhSVKVA@W9n=V4k@u^~DZ8EWjg|9>gj6FoTUX|!ePfo4sTHLY3GofuRiZX4q48V~Qj3ruB`T+0Icwct4(>fKy2x=a~j689B*Db`G;x={g+JLniFo$K$TiGPZcw%emKpQPcLMD8NmF5mR@ZEaP!cpSv0@%k) zv-guIls4}$-~B05e^veZCwl%`-Zk{l%L1oc71jzAf+aMMf3f@BjF=La>Js&M*6!Bq zY#N|9k|5X#)lBEMqgvg>W0L6SjScOyW{PuNcu*NO`?%MoV)E3~*ba~0v;K}QMo(O% zG=6Znz*IF2hPV3@zN?n3c^BYGyy-PgPGF~*m;tt+e+lP(xpP_X?ftAW&b>Kp#HA>a!d2ZU=};n7h5I&dIFB45{YPK6gX6Jcj!cwx=04;6p`W}7yfU*{{~IkU!Oy( zgxZf=KiT9*z>Rw_I2ao8E8Od(u7Nmy1(0_mY_~4^WtyOEsxr<-nPc_v%!fn4%<_GK zzqt#wv)QFdY*RF*0_*1{kF5TH2DFD34s#+g KpUn|wD1ZRuMEMW^ literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_pisces.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_pisces.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6cf3d95bc3a795aac10d130e3f3ddd9228e7088 GIT binary patch literal 1876 zcmV-a2dnr}Nk&FY2LJ$9MM6+kP&il$0000G00016001KZ06|PpNJ|0$00EFJ$+l@* z`^0%oqib99+Ggw7wr$(CZQHhOK%fLb&VhH6v5apO?2)2LCKD{)6Tcce)qmUh(j9m;X!^J#^M zo*NTksXvocROpNZ9LQ%VBKp3BvbTnaQFRRoHVK)K-*N@co$(!D+{J{8{UxMosfYLGaBb_4?&-h-t3(WCZ|XD1M&hkpY=1Gv^q6`Oo@c! zB7sYY@rOMe&D$S^1-O5-Wl=kPFz~!3cXRac(1+ORqkrBCU$I1yB8$`F2_Aue^o%%s z=R54cY)IXn`x^hd>WDk2-JT{+Q?d)YXN^gN|73171l>MH3-zanXDJzpumjfE{~D zERfx0AOP@~txN0c(G07CnqKS7-GWO9ux z6SDvS;tKdTkq7_HPL#|wOy@|pb34;DiS1g-bQ^%}whPm3E~eXxOt*1aZksdRr;w?- zKK;H>1@Vh;09H^qAld`~08kbHodGIb03-lDQ67y%BcY)dJeDjt1q8MLWDekMUjY7* z_^Zpo#)etKU&N=RSC|jspVYruz1;u0dVuqp^n~>n^Z@-&^vCuo{?q@9(cAz1YgWIK zhlL&K%AJAy5grmztLQ78pQt^8|5$w{eU1Ln`z{83)1I!HFqxH5nGj9-$OocdBU@K9 z47Lh)i-|)OWMJVKPLSAv*Dl!-WYL|wiz4IsO#cbin5?7&V=nv)z9I1fd=2ja0RH@Z zskAUTFLf7EWR~&g4^GrTz+s?l9F+Pv)(ID`-MLTr0i2L@8f5yPsI^SYiFjuPKy;nD zYd>;sIzIZ%;yn_yve_^d)_!9!^|kOXB#ZUYKF5wrJ~X$i&Ox{BVamq|FGjUxv|Uvl zZnb0R)QW?xnkSwq_qcQDZ;jkm*2+Pwy*;BjKJ_htI;O-;YFMOJe)rsc zPQ;g4hJVmQcQ5s@yBnIwx;HJaG${W)2w?v$#e+>ZTb3nMQB@cR43_ado8NKdW~1q4 zKOX5RND7UaY}k9@@inpBxTq_9@p$uJuKQT&S@pmlh`bcEA=rBdm7jmpfZzLyb`ssD zut@3=j2cH4dnzL#mbwKklKd6Je68k}^~AC-Abj^@nh00B`yRem^gyC`$z(F-RiI+x zK%WRVpFV*uKz9aL=?vqPeSB^%b*eO1f^~!|Cr}RFmNpbaNAKm8_R6o#HNQ2Vod1R2 zljHu2g=RFYK@9Ct4Xh~jdoq0w^<;h`fPR;WQknjXzB8o^Z!snjh zfcxTZuP>|_&T?rNVr(MoI&Szp@n*)|FvXW{Zo-e=JtvsaNfBm(^ zj%xAr87!dqm8z(jxHpw?87x;HbPCa#Wx53mdT9P&Fv3FMv;`Z4l?oWtPt8_tfREeH zJh4fPKKAM?y3ZfDzeL=}Yzgbx)BA)e-B=j$(c11Eo36rB&cwR?_;l}?wv(Vonz%%! zC+Bwh(%KzjNSK}r?Xc z^Pd?fg)Rz0001#r31Ao(?{Y72OQ8W~-n8 literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_sagittarius.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_sagittarius.webp new file mode 100644 index 0000000000000000000000000000000000000000..8fd8bfb007b7fd2bce4b41a07c0138adf8298af6 GIT binary patch literal 2202 zcmV;L2xa$DNk&GJ2mkK|HSo@Kb@ z4_G-DwsUySbM{R>vQHPKi09mIw{uuRKrK(x$Y#%ce9DrU;BbHETb^8Uk9<#09i}bjG4&O<-K(4i}yNaCRr!0Q?dF=Qm(C z1B598dj?3+lXnHqcSzD?Ba7x=%TD)&y`5+!@LLXHioo^>SWcDDgC^G4=nQ#}#;(zV zXS6&cyG47>TZOV_ZR3SlZB?*^>Xs3v2yCZ-fi$<$9hx}XUbU~!8qryk8EgM3=uG3h zxZ$&ZZb6#PXKrv$t{_w%ALE)94)8$&bFY^R=K-j#PJemXEQ z8|Z8OjY>~gCsB%gV<1S*W?%3Sbu4?;#`GNH1Db-SV4BxARwhVBCxyYFJ?K9`~UiiYmv z8o6(7=rM&tEiw9!g$hVN!~_6VP&gp21polB833IDDqH|006t9|j6@=#p&0F*fG7mS zwg6xfpuaQaShGEw@XzuCs|RxX(aP9cyC~%+-?ym`Fb~tNkRD(^UH@P`p+921z<-qW z0RDUDRqPM@Z|nj3tLdrx9q?EEqyDGvSG4tGj%AuN5p#iDvZ+6e`P}pL&KuI-_r1bD zSAXJl@cpv(Q2nMB{0G~w@*ZZ+{u1bX1EZDR}sbjxA*wHxB-ZMZ2v$uAfF8W*Rj;ds1m?hV%wr}gUTHm#D7nt`=1aGk4!hjDRdCJLleS^S&Ds9mq*+TA3T)p2nIo=qIes9Il;#^)Ln+7VqU;=Y zB|a+IyPYx=4Q(@^XYe_E7Kk*YaU+MIUs*HpoZdsvT$fxF@~B%Jpo6MAKN4*qa`ey% z7%3ZDA4skX3X>>QGn}lbe&G*DOdj5VtPoowQ5jmvik^yW@F)QK%o{?1wuU+X2xVK* z_138K{ER61aCtxpf13sB(LRq`hLY2#kOO|hp zDg>$&qs9krgRNY_QzsC=)SQ_>3UTUb7TP?zsbD?v zJBX{~B4WqNu!PLfK4CVyi0XgkhIjn{tPV8eX%YcYb@VgdK7;5A&ekjhmjLPCZ>+p5 z)aOneO?|F>^&~)Kr6lJ3i|GBa{pII~w3c`a51YK#CP2x16I=ne-d{-=8)>eL$I;wi0BmL|UJ=gOjH_I%U$Iu)) zV%|s(DJr`z@qGDu3%yuMK5uxg`wr>ic`bm#?ga1Q#IwO3GG{uvqvxJmDl75BWJ~a0 zcD_yRHz*CuEnC!2#ZfAokERtd%acpuP76fGZ;5DUB@Qw5$@GwXZag1E5^H4(-8m9- z8#ib0#eFBj;6-I5F+{AGC3I#(^Z?-Snq+#XcDT0Eiql37=?Pbpt`0W+!OWCIZbqSd zfjgd{cM!QKZYpr*wIN4SC^Q6)6#>vX#7CcoHV@_1GpSCy{>tl^nXV&7hD%LJ!I#I6 z&Z?V2T{@H@n1k#!kC%LEn9+S;zd(0K%Re_TwmrG_7UYd%08$U;A+om}qqMgSO;Ob` z$=koIpnm9+oqAfE-K5pBYcSk)sWYh~&E-gA9N*U+Uu5T)2LFWBsMM|-p)fB~$>;z4 zG>gQW_vaGK$5-x-Gj5MPJFjC}brzK|7kz$5$$#-!VH;IZvNzWk+ZvNg1v2Ag`Y(Ju zUCE!B`C3(cJd>2cQy;VX{ns{^Go=zmxcZd+ZZyMgWrlQ9K9PZ+W|x8_bH*Css`H3U z_^2IZnck)UCqn~d%D^~jk=?DgOjXIG>MUuIR}9w>My6$Bs$<0#EdUL zcUC~DJ^#KhEsBTp-ks@md#&fwNR;~3UsxNRH=fzS3yuDibi7a1iRC*mpU1Zb`-6T@ z;ta54|MPkDH|XKjOVV^gQZ!#!8=WF$BV~tQQG>~Ke|`r#&2LU?f$JRn0kDiZ0pWY4NL(9{LiRn`__H{w z9-x{3-UCghx21)^84kWfqb1;f7C~4WohSBv3zL+-Vpd^ zjnkzD^6e3XwbA*AeLvKN|7Pkh-f~zH4|(q3X-MVaeFAU7oVSV~tc}hO*?7%Pd&bm9 zQ&H+P58rBt2G5e&rHTj*)7T!*_MkZR5Y|Q{jlH?195l;EuXMEvh;|vFQaJ#^+UVvQ zC*;U6+;om~L~gHXdZSZ0x+XchmO8ozaCYzF=$^~by`rOgTqpPDj-Dw@>dqs77D}uC zCkg;oP&go*1ONc=766?ADqH|006tM5jzlA(A(Vb*bT|bBv;bvv0;7A~KOjFKI(2v( z(nkAj&x;@H2ctK;4>>NQk3bLB?@bTeAA&#IPf1E-lFl%i%Iu}Y29c~|{-*lBswf_JB{_2+L z;yRpHy*92F+CH6bg{Vd_HUb5QUiMIze*Yqt`2@-Eczw%W%h3>rs8_(B-?+*idiseU z>%A({{TYBZ%GLe+C6rm7BR%T#?-jv;j|cQ?K^ZQmU!}w~ogWXz^f?~ihWh$Ji^*(w z)$NyQ&Cuc{PW!axGy&4r_9I*KyWs+&y2fU_7Nzpl!J*cYvbt1VB9)h3{0o;O~r5WeI9!e?|<_bqa1+D|0ROZ}<85og;$B9&$1^WlDKiOyWurLL`>{B&W%ZA%1MINRM|s_Fo?R`jA?H}&7A?s`zZMA1pTmOthqTcC`^nM~$6|K`W_ z+Ml*wBVdiWvw^jOz{Pt~bv#@FD?iFo;>MB1uUnAtF|2_n{#o8~z`TiN{H0C2#?HLV z&|`?Wvm~AC0sWhtxcNwevk;xG#7C2LzZEAzu8kt$Op1{NX9T50^gkXZGz&g5KM&m* z4w_JFSWDIvB75v{|CW5tUdREW+xS{)fWpzl%*9WYwYPF#aGb;Z&?|B-0Jzj1SW2ci z$;4mDB*vVF^0JFt8#Tn?XI56L>I}_u1L9J7X{Fu79)yJrQhF8I ztE1pWr9M~c3c0HU%HK@ujkDrqvC{T^nP8rh$@<_XjR?TM|!->pX%!_X}D+ucPvl`Q{^Vt^$=&$~VKbWzM z*tG61^eG`FJYz{H4z}=WrVh!mcw~(@rSSLukr4ctiXS1jd0#P^b@fu zZ9vDX+{xI{S$wz`>T4sCM|HG6BQ;8xH~6r6w}j5LTe+ytmw@-3Ium;eLs9rwCQhIL y1rM|uP%6MOo<3}#__?Z0ul;V>Ipa_N;@%w_(?gr|LgJtJJHLm`;+jVhF8}~Wr=?#2 literal 0 HcmV?d00001 diff --git a/core/src/main/res/drawable-xhdpi/ic_constellation_taurus.webp b/core/src/main/res/drawable-xhdpi/ic_constellation_taurus.webp new file mode 100644 index 0000000000000000000000000000000000000000..88866983574dec2e9df8ba56c4dea258032ec4b0 GIT binary patch literal 1836 zcmV+{2h;dcNk&E_2LJ$9MM6+kP&il$0000G00016001KZ06|PpNGk#W00EG+ZQJq2 z3rdPz$FsGqdsMq)+qP}nwr!g$durQ^o%9)e`SgAf!N_eJM^a{cIVG9-f{ItK7UPb_ z8w`o3=X3`PJG5$Azow^3r1e(3*N~f<4;wkC*I7y_=oy?+@d#D$?NVKjs><-;-_B4_NjicGU!2MAy zNix=#S#bWdnIyW48O{EuYQ9wRLzqQ%m1;Rjc0Dtis=Pl)=L0i3dbZR_N7tQ83UM4G zW7HZ$GB}G%I+yV>QvawNoaPeVy*oYV-o0zY%d#JWpf|H^7KL{?hLGw7|K(`L>sl} z;=KSruyq&yzBnz14krFoiYSlq zM<)mwrQQ6C{xcr?^Vm`9v#;&MNZ#Wn|6lDro@n#LDVpIQmE(m-bcCG@lY{p+mY*g1 zfLGJ+hwF4<26SfjIm?mKr6A?^H+!G_RqJ@t)wk@Xxz~;|C6g<2=#F{Mzg~(|W4Q^( zJJ;yUbMP^MAPar`J6*jiOEE!P=!TeLwdU#BRJVdzi2b}Er2$^x$_w7JFQ{a^CO0+e z_p5W#3T>DP>S)k|OngdiU`Un!i-%#FzsytO9g4Im{=O_t<#!Rr6lGr<00aR6-`$i1w)cG#ef=fH_u5HrPQtyF*s(|GgfWO!L#aOlLna$=*DRDTuVq3)A1WX!dQooXwuQ|+v>DsSQc3Y<@YR8hHy>8C z|5L_qXr$_GwZiiQL+D4ReCcv!@&a5B<>fy#ls~8YCmG651lAObU}}r4~%PLjsdu#A&K#zi}G2= zC~xy5tmZe9KW&TfW!=*^L)igQm}9p1VO!L4*I(vBvgVkYq1lY3y5sIqzr!3wK$*T; zqMb4^*=0^($gn!B;KpOcFZ&F0Eq&i`D{duZ z{WksP2-y&3h1+iFe**{9)Lyd*9CFhWO^hV4jWcCCnVrtzahBuo+ zm1$$_|D=zHSbByki>z^W$CxNFjZRb+xvde?TPL>q5OuefH*0uFKyPDpUoes8HVJvV zgt9RG&u9{Kk}|UYOVzicye+RRl51Lj5_Y&UvT5;W#W~BNgru?)m+PlEKdV`}u@?aD z?wl5^ASY5aAqjS}@+MLos72?NMI@17t_&7inM=KZMbvfV3$%PN;p?D^$30i(8~}#C z_;sWr>y5iIxNoJZaUOUREV?3sspJVPIPDL-jr>Fh{j2ZCbymUg$iM@uFG5AD(n)ME zFqeL;=ty7t&(j0AW=v}Pglcn|lw_t;mzmVwOdm9+g~00oJnw+^G>$<5xeushoO*+>ZcHLdId30m{(#(aZG!UPQW8I!&!PACdb*z(k@}HsGZ1 z{iBEgnrEXA^xodulv%f2jqyawSrHSzYa$n?PaENpS3BDz92K52kFUy zufYyI#Zc#(G|a+Ry&Ee+r$&*n7I3pw)7#fk$TTp(UW90{q9sA;&;S7b_7mOtS!QRL z9Yo-T51i~PSpjCe=vCloGRt-`!F`l3XR+!S>c7tb-@^Cfx2W=GpSvB;oxNGHx68#27pi;|he zjiU9TMaz>x?N~?yS>3v%nb+Lrm4Zt#h^7F@GG&$inLIvWe$;zkvm?E{)Qt*OT9;OD zA-_bPKI^A9`iwF(>f`evN8u@$(`gGithX`J$33M(+S1^MqukKTuE3={q4Op+tk(2X zUbe>)nL?OR*-W@(qUNMc1%cT%(p{i7*@TK>+&gmHE;JNqju;1D@#*qju}8%bn)kXTCVs_$jufW7&%3X2A?R>rt2iXwH-P zJL4J*(|2C5%*S+&+@I@fb>d@U{tjRfg@|P4#E7NtW9cfkfUHIa7%e222p6qk=^Suf z7vC?x)%0E*eT_c%c=MbsY;!lC2?iKrqo%R%@q#ef^GzQ&`m7f6%8#8DMCXv;gY=Sk-C@X`m(iXcPoM=YAt2RV!{C(uf z&_-i9E20 zT`)qY>WM`$;Yc!|cZVo3`*QpX+tUz=b#$8hdJv(N&l&s;ux+ + + اهلا بك في برنامج Molistar، سيتم حظر اي شخص يخالف القوانين، او يقوم بعملية التزوير والنصب + تعال إلى موليستار واجتمع بصوتك الحصري. + تعال إلى موليستار، واصنع أصدقاء، والعب معًا. + انضم إلى عائلة والعب مع الأصدقاء الذين يشتركون في اهتماماتك. + مرحبًا، أود دعوتك للانضمام إلى عائلتي في موليستار: + انضم إلى عائلة والعب مع الأصدقاء الذين يشتركون في اهتماماتك. + مرحبًا، أود دعوتك للانضمام إلى مجموعة الدردشة في موليستار: + انقر على موضوع الغرفة لعرض إعلان الغرفة. + تم فتح وضع المواعدة العمياء، يرجى النقر على ميكروفون المضيف لتحديد المضيف. + بدأت جولة جديدة من المواعيد العمياء. + دخلت مرحلة اختيار القلب. + أعلن عن الهدف المفضل. + الإصدار قديم، يرجى تحميل الإصدار الأحدث. + خطأ في الشبكة. + خطأ غير معروف. + معلومات المستخدم فارغة، يرجى تسجيل الدخول مرة أخرى. + يدعم فقط عرض السجلات خلال 3 أشهر. + ليس مستخدمًا جديدًا. + الطلب ناجح-> + الطلب ناجح + الطلب ناجح-> + خطأ في الطلب: + [صورة] + [فيديو] + [رسالة صوتية] + [الموقع] + [ملف] + + [تذكير بالإشعارات] + لقد تلقيت رسالة... + الشخص الذي تتابعه متصل الآن، سارع وتحقق من ذلك~~~ + [هدية] + [دعوة للعب اللعبة] + [معلومات الترقية] + لقد تلقيت + ظرفًا أحمر! + تهانينا، لقد فزت بفرصة سحب محظوظة + تذكير: + [مشاركة الغرفة] + [مشاركة العائلة] + [مشاركة المجموعة] + [لقد تلقيت رسالة مشتركة] + [لقد تلقيت ظرفًا أحمر في المجموعة] + قام + [لقد استلمت + ظرفًا أحمر من] + قام + [باستلام ظرفًا أحمر من] + [لقد تلقيت رسالة نظام] + [لقد تلقيت رسالة متعلقة بقاعة الدردشة العامة] + [لقد تلقيت رسالة عن النقابة] + [تذكير بالتسجيل] + [تسجيل الدخول لمشاركة الملايين] + [رسالة استعراض زجاجة الصوت] + [مشاركة ديناميكية] + [لقد تلقيت ظرفًا أحمر على مستوى الخادم] + [تذكير بالمخاطر] + [صوت] + لقد تلقيت رسالة + غرفة الاستشارات + أنا غرفة استشارات للمبتدئين الجدد لطيفة + المبتدئ + اجتماعي + ترفيه + راديو + كوكب + موسيقى + تم التعليق بنجاح + حدث خطأ غير معروف، يرجى الخروج من الغرفة وإعادة الدخول + [إعلان الغرفة] + حقل معلومات المستخدم فارغ + غير موجود في الغرفة أو معلومات الغرفة فارغة + تم استقبال معلومات الطرد + قد تحتوي الرسالة على معلومات غير قانونية، يرجى التوقف عن إرسال معلومات مماثلة مثل ذلك! + جاري الاتصال... + حالة غير طبيعية في غرفة الدردشة! + حالة الاتصال بغرفة الدردشة تصبح غير متصلة! + تسجيل الدخول... + تسجيل دخول غرفة الدردشة Netease بنجاح + إعادة الاتصال بغرفة الدردشة + الحاجة إلى إعادة تسجيل الدخول (تم طردك أو معلومات التحقق غير صحيحة)... + الشبكة مفصولة... + حدث فصل الشبكة + رسالة مخصصة: + تأثيرات الهدايا + تأثيرات الهدايا + رسالة إنشاء المنافسة-> msgUuid: + وقت الاستلام: + رسالة إنشاء المنافسة-> attr: + رسالة بدء المنافسة-> msgUuid: + وقت الاستلام: + رسالة بدء المنافسة-> attr: + رسالة نتيجة المنافسة-> msgUuid: + وقت الاستلام: + رسالة نتيجة المنافسة-> attr: + رسالة غرفة العد العشوائي تحتوي على خطأ... + العد العشوائي: + لقد دخلت الغرفة بشكل غير مرئي + لقد دخلت الغرفة بشكل غير مرئي + فشل دخول الغرفة + معلمات دخول الغرفة فارغة، يرجى التحقق مما إذا كانت المعلمات صالحة في واجهة enterRoom:appScene: + sdkAppId غير صالح في معلمات دخول الغرفة + roomId غير صالح في معلمات دخول الغرفة + userID غير صحيح في معلمات دخول الغرفة + userSig غير صالح في معلمات دخول الغرفة + انتهت مهلة طلب دخول الغرفة، يرجى التحقق من الشبكة + الخدمة غير متوفرة. يرجى التحقق مما إذا كانت الدقائق المتبقية من الباقة أكبر من 0 ومما إذا كان حساب Tencent Cloud في تأخر في الدفع + انتهت مهلة طلب الخروج من الغرفة + فشل تشغيل الكاميرا + جهاز الكاميرا غير مصرح به + خطأ في ضبط معلمات الكاميرا + جاري احتلال الكاميرا + فشل تشغيل الميكروفون + جهاز الميكروفون غير مصرح به + فشل ترميز إطار الفيديو + جاري احتلال الميكروفون + فشل إيقاف الميكروفون + فشل تشغيل مكبر الصوت + خطأ في ضبط معلمات مكبر الصوت + فشل إيقاف مكبر الصوت + فشل بدء تسجيل الشاشة + فشل تسجيل الشاشة + لا توجد إذن لرفع المسار المساعد + يقوم مستخدمون آخرون برفع مسارات مساعدة + فشل ترميز إطار الفيديو + الدقة غير مدعومة + فشل ترميز إطار الصوت + معدل أخذ العينات الصوتية غير مدعوم + + تنسيق البكسل المحدد غير مدعوم + نوع الذاكرة المخزنة المحدد غير مدعوم + انتهت مهلة طلب التجاوز + انتهت مهلة طلب خلط السحاب + استجابة غير طبيعية لخلط السحاب + استجابة غير طبيعية للتجاوز + انتهت مهلة بدء إشارة دفع التيار إلى سحابة Tencent & live CDN + استجابة غير طبيعية لبدء دفع التيار إلى سحابة Tencent & live CDN + انتهت مهلة إيقاف إشارة دفع التيار إلى سحابة Tencent & live CDN + استجابة غير طبيعية لإيقاف دفع التيار إلى سحابة Tencent & live CDN + انتهت مهلة طلب الربط + انتهت مهلة طلب الخروج من الربط + معلمة غير صالحة + المستخدم حالياً بدور المستمع، لا يمكن طلب أو فصل الربط عبر الغرف، يجب التبديل إلى دور البث أولاً + غير مدعوم الربط عبر الغرف + تم الوصول إلى حد الربط عبر الغرف + استنفذ عدد محاولات إعادة المحاولة للربط عبر الغرف + انتهت مهلة طلب الربط عبر الغرف + خطأ في تنسيق طلب الربط عبر الغرف + توقيع الربط عبر الغرف مفقود + فشل فك تشفير توقيع الربط عبر الغرف + لم يتم العثور على مفتاح فك تشفير توقيع الربط عبر الغرف + خطأ في تحليل توقيع الربط عبر الغرف + خطأ في الطابع الزمني لتوقيع الربط عبر الغرف + عدم تطابق توقيع الربط عبر الغرف + + لا يوجد ربط في هذه الغرفة + لم يقم المستخدم ببدء الربط + فشل الربط عبر الغرف + فشل إلغاء الربط عبر الغرف + لا توجد الغرفة المرتبطة + تم الوصول إلى حد الربط في الغرفة المرتبطة + المستخدم المرتبط غير موجود + تم حذف المستخدم المرتبط + تم الوصول إلى حد الموارد للمستخدم المرتبط + طلب الربط غير منتظم في التسلسل + مكالمة Trtc callback onError errCode= + حدث خطأ غير معروف، يرجى الخروج من الغرفة وإعادة الدخول + فشل إرسال رسالة هدية الغرفة، الخطأ: + فشل إعادة إرسال رسالة هدية الغرفة، الخطأ: + تمت إعادة إرسال رسالة هدية الغرفة بنجاح - تمييز محاولات إعادة الاتصال: + تسجيل دخول تلقائي ناجح + تسجيل دخول ناجح! + غير مثبت فيسبوك + خطأ في تسجيل الدخول + تم إلغاء تسجيل الدخول + غير مثبت LINE + خطأ في تسجيل الدخول + تم إلغاء تسجيل الدخول + غير مثبت Gmail + خطأ في تسجيل الدخول + تم إلغاء تسجيل الدخول + تم تسجيل الدخول بنجاح! + تمت إعادة تعيين كلمة المرور بنجاح + غير قادر على الحصول على معرف المستخدم الحالي + تم الحصول بنجاح على معلومات ربط الهاتف + غير قادر على الحصول على معرف المستخدم الحالي + ربط الهاتف المحمول بنجاح + تم التسجيل بنجاح + + تنفيذ تسجيل الخروج - تنظيف معلومات السجل + حدث استثناء غير معروف + لا توجد معلومات تذكرة + تم تغيير كلمة مرور تسجيل الدخول بنجاح + لا توجد معرف المستخدم + لا توجد معلومات تذكرة + تعيين كلمة مرور تسجيل الدخول بنجاح + تمنع الخادم تسجيل الدخول + اسم المستخدم أو كلمة المرور غير صحيحة + تنفيذ حالة IM - تنظيف معلومات السجل + لا توجد معلومات حساب + تنفيذ طريقة تسجيل الدخول إلى IM + معلومات تسجيل الدخول فارغة + تم تسجيل الدخول إلى IM بنجاح + تم تسجيل الدخول إلى IM بنجاح + فشل رمز الخطأ: + شذوذ في الشبكة، يرجى تبديل الشبكة والمحاولة مرة أخرى: + فشل تسجيل الدخول إلى IM - معلومات الاستثناء: + لا يوجد حساب مقابل + خطأ غير معروف! + خطأ في الشبكة + انتهت مهلة الطلب + شذوذ في الشبكة، يرجى التحقق من شبكتك والمحاولة مرة أخرى! + المستخدم غير موجود أو كلمة المرور غير صحيحة + المستخدم غير موجود أو كلمة المرور غير صحيحة + المستخدم غير موجود أو كلمة المرور غير صحيحة + تم تجميد المستخدم + رمز التحقق غير صحيح + رقم الهاتف غير صالح + إعادة تعيين كلمة المرور غير صالحة + اسم مستعار غير صالح + + رقم الهاتف مُسجل بالفعل + انتهت بيانات تسجيل الدخول، يرجى تسجيل الدخول مرة أخرى + انتهت بيانات تسجيل الدخول، يرجى تسجيل الدخول مرة أخرى + انتهت بيانات تسجيل الدخول، يرجى تسجيل الدخول مرة أخرى + انتهت بيانات تسجيل الدخول، يرجى تسجيل الدخول مرة أخرى + خطأ في الشبكة + الخادم قيد الصيانة + كمية الماس غير كافية + رمز التحقق من الرسائل القصيرة غير صحيح + المستخدم غير موجود + غرفة قيد التقدم... + المزايدين الحاليين يتم المزايدة عليهم، لم يتم الانتهاء بعد + سعر المزايدة أقل من أعلى سعر حالي + الطلب غير موجود + صيغة رقم الهاتف غير صحيحة + شبكة غير طبيعية + خطأ غير معروف + الخادم قيد الصيانة + كمية الماس غير كافية + رمز التحقق من الرسائل القصيرة غير صحيح + الخدمة غير متوفرة + الخادم غير طبيعي + خطأ غير معروف + الخدمة مشغولة + المستخدم غير موجود + غرفة قيد التقدم... + المزايدين الحاليين يتم المزايدة عليهم، لم يتم الانتهاء بعد + سعر المزايدة أقل من أعلى سعر حالي + الطلب غير موجود + خطأ في إرسال الرسالة النصية + صيغة رقم الهاتف غير صحيحة + + الحب مُزعج جداً، سأُزعجك في المستقبل + أتيت من أجلك، بغض النظر عن تجاوز الجبال + أشتاق إليك، بنوع يُريد اللقاء والعناق الشديد + اللطف كنز، وأنت كذلك + أحب التجول في عالمك، لا أخشى الضياع فيه + اختبار + الشراء ناجح. + الهدية ناجحة. + لا يوجد مُعرف مستخدم + تم شراء السيارة بنجاح + الهدية ناجحة + تمت الهدية بنجاح + الاستخدام الناجح + الشراء ناجح. + تم شراء القبعة بنجاح + الهدية ناجحة. + تمت الهدية بنجاح + الاستخدام الناجح + الاستخدام الناجح + تيانلونج بابو + الاستخدام الناجح + يرجى إدخال البيئة الصحيحة + يرجى إدخال البيئة الصحيحة + الرجاء تهيئة البيئة أولاً + غير مُساعد جداً + فول الفرح + تم تسجيل الدخول للمستخدم بنجاح... + تم تسجيل الخروج للمستخدم بنجاح... + + لا يوجد مُعرف مستخدم + تمت مزامنة البيانات بنجاح + خطأ في استرداد معلومات المستخدم.. + لا توجد عائلة. + لا تزال لم تنضم إلى أي عائلة... + لا يوجد مُعرف مستخدم + خطأ في استرداد معلومات المستخدم.. + تم الخروج من العائلة + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + غير قادر على استرداد معلومات المستخدم + لا يوجد مُعرف مستخدم + لم يتم العثور على مُعرف المستخدم + تم طرد العضو بنجاح + غير قادر على استرداد مُعرف المستخدم + تم التعديل بنجاح + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + تم الانضمام إلى مجموعة الدردشة بنجاح + لا يوجد مُعرف مستخدم + لم يتم العثور على مُعرف المستخدم + تمت المساهمة بنجاح! + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + لا يوجد مُعرف مستخدم + الملف فارغ أو غير موجود! + الملف فارغ أو غير موجود! + تم التحميل بنجاح + تم التحميل إلى Qiniu + آيس كريم + خطأ في الشبكة + الحاجة إلى استكمال من الطرف الآخر قبل البدء مرة أخرى + غير محدد أولاً، يرجى تحليل أولاً= في CustomAttachParser + تم استلام معلومات ذات صلة بالنبلاء: %s + غير معروف + شخص ما + لا يوجد أصدقاء. + يبدأ رقم الصفحة من 1 + يجب أن يكون حجم الصفحة أكبر من 1 الحجم >= 1 + تم طلب البيانات بنجاح بالفعل! + غير قادر على استرداد معلومات البداية + الرئيسية + المنتدى + الأحداث + الرسائل + الملف الشخصي + معلومات الغرفة أو السحر المستلم فارغة + معلومات الغرفة أو السحر المستلم فارغة + معلومات الغرفة أو السحر المستلم فارغة + فشل في استرداد قائمة السحر، خطأ غير معروف + فشل في استرداد قائمة السحر، معلومات قائمة السحر فارغة + فشل في استرداد قائمة السحر، رمز الخطأ: + فشل في استرداد جدار السحر، خطأ غير معروف + فشل في استرداد جدار السحر، معلومات جدار السحر فارغة + فشل في استرداد جدار السحر، رمز الخطأ: + المبتدئ يبحث عن الانتباه! + ما الذي تتحدث عنه؟ + كيف يمكن أن ألعب هذا؟ + أريد التحدث على الميكروفون + --------- تم تفريغ بيانات AvRoomDataManager بنجاح --------- + لم يعدوا في الغرفة + خطأ في الشبكة، الرمز = + + خطأ غير معروف! + خطأ في الشبكة + انتهاء مهلة الطلب + بدء المهمة الأولى + اكتملت المهمة الأولى + بدء المهمة الثانية + بدء المهمة الثالثة + بدء المهمة الرابعة + تم استلام التلميذ بنجاح + فشل في استلام التلميذ + دفع المعلم-التلميذ + معلومات الغرفة فارغة + معلومات الغرفة أو السحر المستلم فارغة + البث العالمي: + البث + فشل تنزيل موارد العضوية VIP + الإمبراطور + 600 الماسة + نجاح + نجاح + خطأ بدون رسالة تنبيه + تم الإعجاب بنجاح + تم إلغاء الإعجاب بنجاح + نجاح + فشل في الحصول على رابط المشاركة + واجهة إحصائيات المشاركة + واجهة إحصائيات المشاركة + تمت إعادة التوقيع بنجاح، التمييز بالتوقيع للمرة الثانية: + + الماس x + تم الاستلام بنجاح + تم إرسال الهدية المُرجعة إلى زخارفي + خبير الظرف الأحمر + لا يوجد وصف للمزاد بعد + غرفة ترخيص + غرفة المبتدئين + غرفة عادية + دردشة + جمع القلوب + إعلان جمع القلوب + النهاية + شعر قصير طويل + ياو يان + قليلاً。 + abc123😄!؟uh uh uh + المبتدئين + اللقاء + الاجتماعية + الترفيه + الموسيقى + الراديو + + لقاء + مرحبًا + تم تنظيف البلياردو بنجاح. + 99.99 مليون+ + مليون + خروج من الغرفة RoomInfo = null لا توجد معلومات عن الغرفة + فتح الغرفة + المستخدم على الميكروفون + البقاء في الغرفة لمدة + quitUserRoom إشعار الخادم بالخروج من الغرفة بنجاح: + quitUserRoom إشعار الخادم بالخروج من الغرفة فشل: + دخول الغرفة بنجاح والحصول على أعضاء ثابتين، العدد: + دخول الغرفة بنجاح والحصول على أعضاء زوار، العدد: + صفحة %1d المتصلين بالإنترنت: %2d + تستغرق عملية تحديث قائمة الطلبات عبر الإنترنت: + هذا الموقع في الميكروفون محجوز بالفعل. + هذا الموقع في الميكروفون محجوز بالفعل. + فشل التحرك لأسفل بسبب التحرك لأعلى + فشل التحرك لأسفل بسبب التحرك لأعلى + هذه الطريقة يمكن أن تحدث تسلسل الميكروفون الخاص بك فقط، لا تحدث معلومات تسلسل الميكروفون للآخرين. + تحديث تسلسل الميكروفون الإضافي بنجاح: + تم التحديث بنجاح + فشل تحديث تسلسل الميكروفون الإضافي: + فشل تحديث تسلسل الميكروفون الإضافي: + تم التحديث بنجاح + فشل التحديث + تحديث غير طبيعي + كود الخطأ: + غرفة %s + معلومات الغرفة الحالية فارغة + تم إرسال الدعوة بنجاح + تم فتح الغرفة بنجاح + تم إغلاق الغرفة بنجاح + لا توجد معلومات عن الغرفة + لا يوجد uid لحساب تسجيل الدخول الحالي + تم تفعيل وضع PK بنجاح + لا توجد معلومات عن الغرفة + لا يوجد uid لحساب تسجيل الدخول الحالي + تم إلغاء تفعيل وضع PK بنجاح + لا توجد معلومات عن الغرفة + لا يوجد uid لحساب تسجيل الدخول الحالي + لا توجد معلومات عن الغرفة + لا يوجد uid لحساب تسجيل الدخول الحالي + لا توجد معلومات عن الغرفة + لا يوجد uid لحساب تسجيل الدخول الحالي + لا توجد بيانات + لا توجد معلومات عن الغرفة + لا يوجد uid لحساب تسجيل الدخول الحالي + تم إنشاء PK بنجاح + لا توجد معلومات عن الغرفة + لم يتم إنشاء PK أو حالة PK غير طبيعية + PK غير جاهز + تم بدء PK بنجاح + لم يتم إنشاء PK + تمت دعوتك للتحدث بنجاح + تم إرسال نهاية PK + لا توجد معلومات PK الأصلية + PK غير جاهز + نجاح + PK غير جاهز + لم يتم إنشاء PK + + الإعدادات لا تذكر المستخدمين بالأخطاء، الكود= + تمت مشاركة النجاح + فشلت عملية المشاركة، يرجى المحاولة مرة أخرى + تم إلغاء المشاركة + صاحب المجموعة + المسؤول + عضو عادي + نجاح الإنشاء. + نجاح الحذف. + نجاح الخروج من المجموعة. + الإضافة ناجحة. + نجاح الإعدادات. + لا توجد معلومات عن الفريق. + نجاح الإعدادات. + نجاح الإعدادات. + نجاح الإعدادات. + نجاح الإعدادات. + ملك + + عظيم غوست أعلى + البوظة + ثمانية أو تسعة من كل عشرة أمور في الحياة غير مرضية ، التخلي هو التحرر + عظيم غوست أعلى + الجهد يضمن قيمتك 🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍🌵🌵🌿🍀🌳🌳💐🌻🌷🌻 + عظيم غوست أعلى + صفيحة له + عظيم غوست أعلى + عصير الحديد ، يمنح القوة ، لا مشكلة ، صحيح؟! + عظيم غوست أعلى + اذهب إلى القمة 🦆 + عظيم غوست أعلى + البوظة + ثمانية أو تسعة من كل عشرة أمور في الحياة غير مرضية ، التخلي هو التحرر + عظيم غوست أعلى + الجهد يضمن قيمتك 🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍🌵🌵🌿🍀🌳🌳💐🌻🌷🌻 + عظيم غوست أعلى + صفيحة له + عظيم غوست أعلى + عصير الحديد ، يمنح القوة ، لا مشكلة ، صحيح؟! + عظيم غوست أعلى + اذهب إلى القمة 🦆 + + عظيم غوست أعلى + لا يوجد تسجيل دخول حالي uid + لا يوجد تسجيل دخول حالي uid + أرجعت الخادم حقل userInfo فارغًا + Uid غير صالح + أرجعت الخادم حقل userInfo فارغًا + أرجعت الخادم حقل userInfo فارغًا + معلومات المستخدم غير موجودة + Uid المستخدم فارغ + تمت إعادة التعيين بنجاح + تم التحديث بنجاح + iMusic/Songs/ + اسم الفئة: %s \nاسم الطريقة: %s \nالسطر الطريقة: %d \nالحالي هو %d منها \n---------------------------- \n + شبكة غير طبيعية + خطأ في الشبكة + شبكة غير طبيعية ، يرجى التحقق من شبكتك والمحاولة مرة أخرى ~ + خطأ في تحليل البيانات + خطأ في المعلمة + خطأ داخلي في الخادم + خطأ في الشبكة ، يرجى المحاولة مرة أخرى لاحقًا... + خطأ في الشبكة ، يرجى المحاولة مرة أخرى لاحقًا... + في حالة النجاح ، يمكن أن يكون حقل بيانات الواجهة فارغًا ، لا يناسب استخدام هذه الطريقة لإزالة الطبقة الخارجية. + خطأ غير معروف + نجاح + خطأ غير معروف + شبكة غير طبيعية ، يرجى التحقق من شبكتك والمحاولة مرة أخرى... + شبكة غير طبيعية ، يرجى التحقق من شبكتك والمحاولة مرة أخرى + في حالة النجاح ، يمكن أن يكون حقل بيانات الواجهة فارغًا ، لا يناسب استخدام هذه الطريقة لإزالة الطبقة الخارجية. + في حالة النجاح ، يمكن أن يكون حقل بيانات الواجهة فارغًا ، لا يناسب استخدام هذه الطريقة لإزالة الطبقة الخارجية. + حقل البيانات المرجعة من قبل الواجهة فارغ ، ولا يقوم NullHandle.createT بإرجاع كائن T + نجاح + شبكة غير طبيعية ، يرجى المحاولة مرة أخرى لاحقًا! + خطأ في الشبكة + + MoliStar يأخذ استراحة ~ يرجى المحاولة مرة أخرى لاحقًا + خطأ في الشبكة ، يرجى التحقق من شبكتك والمحاولة مرة أخرى! + قرد + ديك + كلب + خنزير + فأر + ثور + نمر + أرنب + تنين + ثعبان + حصان + خروف + الدلو + الحوت + الحمل + الثور + الجوزاء + السرطان + الأسد + العذراء + الميزان + + العقرب + القوس + الجدي + الساعة + الدقيقة + منذ دقائق + منذ ساعات + منذ دقائق + منذ ساعات + أمس + قبل يومين + منذ أيام + الاثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + الأحد + الأسئلة المتكررة + بنك الصين الأوسط + بطاقة التوفير + فشل التنزيل + فشل التنزيل + الرد على التعليق + صفحة الزائر + الصفحة الشخصية + تفاصيل النشاط + + المربع الديناميكي + أعجب بالديناميكية - التمييز - + عدد الإعجابات على الديناميكية، تمييز الموضوع - + عدد الإعجابات على الديناميكية، تمييز - + أعجب + إلغاء الإعجاب + طلب تحالف من قبل عضو النقابة + تم الإرسال بنجاح، يرجى الانتظار بصبر + تمت إزالة عضو القاعة بنجاح + تم تقديم طلبك بنجاح + تمت الدعوة بنجاح + الانضمام إلى القاعة بنجاح + تمت العملية بنجاح + تمت العملية بنجاح + تم تعيين المسؤول بنجاح + تم إلغاء المسؤول بنجاح + تمت الكتم بنجاح + تم رفع الكتم بنجاح + تم طرد العضو بنجاح + تمت الإضافة بنجاح + تم حل مجموعة الدردشة بنجاح + تم الانسحاب من مجموعة الدردشة بنجاح + تم الانضمام إلى مجموعة الدردشة بنجاح + القرار الصغير المطلق + العدد + بلاتينيوم Lv5 + أول خروج من الجبل LV3 + + حجر عالي الجودة + القرار الصغير المطلق + العدد + بلاتينيوم Lv5 + أول خروج من الجبل LV3 + حجر عالي الجودة + العدد + بلاتينيوم Lv5 + أول خروج من الجبل LV3 + حجر عالي الجودة + العدد + بلاتينيوم Lv5 + أول خروج من الجبل LV3 + حجر عالي الجودة + بلاتينيوم Lv5 + أول خروج من الجبل LV3 + حجر عالي الجودة + انضم + توصية + تغيير ناجح + خطأ في الشبكة + خطأ في الشبكة + نجاح + خطأ في الشبكة + نجاح + + خطأ في الشبكة + نجاح + خطأ في الشبكة + تم إيقاف تشغيل المورد! جرب شيئًا آخر + يجب أن تكون الموسيقى المشتركة محلية + فشل إدخال قاعدة البيانات + شياو مينج + شياو هونج + الحمقى ww + الحمقى ww + رسالة مخصصة: + نجاح + فشل + فشل + تم إرسال رمز التحقق إلى هاتفك المحمول، يرجى التحقق + خطأ في الشبكة + إعادة تعيين كلمة المرور في حالة عدم تسجيل الدخول + إعادة تعيين كلمة المرور في حالة تسجيل الدخول + لا يمكن للمسؤول الفائق القيام بالعملية + معلومات الغرفة الحالية فارغة. + رصيد غير كافٍ + معلومات الغرفة الحالية فارغة. + فشل التنزيل + فشل التنزيل + فشل التحقق من MD5 + لا توجد معلومات تنزيل الإصدار الجديد + جارٍ التنزيل... + جارٍ التنزيل... + بالفعل أحدث إصدار + التطبيق غير مثبت + HABU- إنشاء صداقات جديدة، انضم إلى HABU الآن. + العثور على والانضمام إلى أفضل المجموعات، والتحدث مع الغرباء + استثناء تحليل البيانات + خطأ في المعلمة + + رفض الطرف الآخر طلب الـ PK + (%s)فشلت العملية + " السماح لـ %s بالوصول إلى الصور على جهازك؟ ا" + السماح + لا + مخصص + diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..17d2d55 --- /dev/null +++ b/core/src/main/res/values-tr/strings.xml @@ -0,0 +1,669 @@ + + Platform, dostane etkileşimleri teşvik eder ve yasa dışı içeriklerin yayılmasını yasaklar. Kullanıcılar karşı yapılan dolandırıcılık faaliyetleri kesinlikle yasaktır. Herhangi bir ihlal durumunda hesap askıya alınacaktır. Lütfen ihlalleri zamanında bildirin. + MoliStar\'a gelin ve özgün sesinizi keşfedin. + MoliStar\'a gelin, arkadaşlık kurun ve oyun oynayın. + Bir aileyi katıldığınızda, ilgi alanlarınızla eşleşen arkadaşlarıyla oynayın. + Merhaba, MoliStar aileminize katılmanızı isterim: + Bir aileyi katıldığınızda, ilgi alanlarınızla eşleşen arkadaşlarıyla oynayın. + Merhaba, MoliStar grup sohbetime katılmanızı isterim: + Odanın konusuna tıklayarak oda duyurusunu görüntüleyin. + Kör tarih modu açık, lütfen sunucunun mikrofonuna tıklayarak sunucuyu seçin. + Yeni bir kör tarih turu başladı. + Kalp seçim aşamasına girdi. + Sevgilinin adını açıklıyor. + Sürüm eskidirdi, lütfen en son sürümü indirin. + Ağ hatası. + Bilinmeyen hata. + Kullanıcı bilgisi boş, lütfen yeniden giriş yapın. + Sadece 3 ay içindeki kayıtları görüntülemeyi destekliyor. + Yeni kullanıcı değil. + İstek başarılı-> + İstek Başarılı + İstek Başarılı-> + İstek Hata Kodu: + [Görüntü] + [Video] + [Ses Mesajı] + [Konum] + [Dosya] + [Bildirim Hatırlatıcısı] + Mesaj aldınız... + Takip ettiğiniz kişi şu anda çevrimiçi, hızlıca kontrol edin~~~ + [Hediye] + [Oyun Davetiyesi] + [Yükseltme Bilgisi] + Mesaj aldınız + kırmızı zar! + Tebrikler, bir çekiliş fırsatı kazandınız + Hatırlatma: + [Odayı Paylaş] + [Aileyi Paylaş] + [Grubu Paylaş] + [Paylaşım mesajı aldınız] + [Grup kırmızı zarı aldınız] + kırmızı zarınızı aldı] + [Kazandınız + \'nin kırmızı zarını] + aldı + \'nin kırmızı zarını] + [Sistem mesajı aldınız] + [Genel sohbet salonu ile ilgili mesaj aldınız] + [Cilde mesajı aldınız] + [Kayıt Hatırlatıcı] + [Kaydolun milyonları paylaşın] + [Ses Lişi İnceleme Mesajı] + [Dinamik paylaştınız] + [Sunucu geneli kırmızı zarı aldınız] + [Risk Hatırlatıcı] + [Ses] + Mesaj aldınız + Danışma Odası + Ben sevimli küçük yeni gelen danışma odasıyım + Yeni Gelenler + Sosyal + Eğlence + Radyo + Gezegen + Müzik + Geri Bildirim Başarılı + Bilinmeyen bir hata oluştu, lütfen odadan çıkın ve tekrar girin + [Oda Duyurusu] + Kullanıcı bilgi alanı boş + Odaya girilmedi veya oda bilgisi boş + Atılma bilgisi alındı + Mesaj yasa dışı bilgi içerebilir, lütfen benzer bilgileri göndermeyi durdurun! + Bağlanıyor... + Sohbet odası durumu anormal! + Sohbet odası çevrimiçi durumu UNLOGIN oldu! + Giriş yapılıyor... + Netease sohbet odası giriş başarılı + Sohbet odası yeniden bağlanıyor + Yeniden giriş yapılması gerekiyor (atıldı veya doğrulama bilgisi yanlış)... + Ağ kesildi... + Ağ kesilme olayı + Özel mesaj: + Hediye etkileri + Hediye etkileri + PK Oluşturma Mesajı-> msgUuid: + Alınan zaman: + PK Oluşturma Mesajı-> attr: + PK Başlangıç Mesajı-> msgUuid: + Alınan zaman: + PK Başlangıç Mesajı-> attr: + PK Sonuç Mesajı-> msgUuid: + Alınan zaman: + PK Sonuç Mesajı-> attr: + Rampage geri sayım odası mesajı hatası... + Rampage Geri Sayım: + Odaya gizli olarak girdiniz + Odaya gizli olarak girdiniz + Odaya giriş başarısız + Oda giriş parametreleri boş, enterRoom:appScene: arayüzüne geçerli parametrelerin geçirilip geçirilmediğini kontrol edin + Oda giriş parametrelerinde geçersiz sdkAppId + Oda giriş parametrelerinde geçersiz roomId + Oda giriş parametrelerinde yanlış userID + Oda giriş parametrelerinde yanlış userSig + Odaya giriş isteği zaman aşımına uğradı, lütfen ağı kontrol edin + Servis kullanılamıyor. Paketin kalan dakikalarının 0\'dan büyük olduğunu ve Tencent Cloud hesabının borçlu olup olmadığını kontrol edin + Odaya çıkış isteği zaman aşımına uğradı + Kamera açma başarısız + Kamera cihazı yetkilendirilmemiş + Kamera parametre ayarlaması hatası + Kamera meşgul + Mikrofon açma başarısız + Mikrofon cihazı yetkilendirilmemiş + Mikrofon parametre ayarlaması başarısız oldu + Mikrofon meşgul + Mikrofonu durdurma başarısız + Hoparlör açma başarısız + Hoparlör parametre ayarlaması başarısız oldu + Hoparlörü durdurma başarısız + Ekran kaydı başlatma başarısız + Ekran kaydı başarısız + Yardımcı yol yükleme izni yok + Diğer kullanıcılar yardımcı yolları yüklemekte + Video karesi kodlama başarısız + Desteklenmeyen video çözünürlüğü + Ses karesi kodlama başarısız + Desteklenmeyen ses örnekleme hızı + Ayarlanan piksel formatı desteklenmiyor + Ayarlanan tampon türü desteklenmiyor + Geçiş isteği zaman aşımına uğradı + Bulut karıştırma isteği zaman aşımına uğradı + Bulut karıştırma yanıtı anormal + Geçiş yanıtı anormal + Tencent Cloud canlı CDN\'ye akış başlatma sinyali başlatma zaman aşımı + Tencent Cloud canlı CDN\'ye akış başlatma sinyali başlatma anormalliği + Tencent Cloud canlı CDN\'ye akışı durdurma sinyali başlatma zaman aşımı + Tencent Cloud canlı CDN\'ye akışı durdurma sinyali başlatma anormalliği + Bağlanma isteği zaman aşımına uğradı + Bağlantıdan çıkma isteği zaman aşımına uğradı + Geçersiz parametre + Şu anda izleyici rolünde olduğunuz için, cross-room bağlantısı talep edemez veya koparamazsınız, önce switchRole() ile sunucuya geçmelisiniz + Cross-room bağlantı desteklenmiyor + Oda arası bağlantı sınırı ulaşıldı + Oda arası bağlantı yeniden deneme sayısı tükenmiştir + Oda arası bağlantı isteği zaman aşımına uğradı + Oda arası bağlantı isteği biçimi yanlış + Oda arası bağlantı imzası eksik + Oda arası bağlantı imzası çözümlenemedi + Oda arası bağlantı imza çözüm anahtarı bulunamadı + Oda arası bağlantı imzası ayrıştırma hatası + Oda arası bağlantı imzası zaman damgası hatası + Oda arası bağlantı imzası uyuşmuyor + Bu odada bağlantı yok + Kullanıcı bağlantıyı başlatmadı + Oda arası bağlantı başarısız oldu + Oda arası bağlantının iptali başarısız oldu + Bağlı olan oda mevcut değil + Bağlı olan oda bağlantı sınırına ulaştı + Bağlı kullanıcı mevcut değil + Bağlı kullanıcı silinmiş durumda + Bağlı kullanıcı kaynak sınırına ulaştı + Bağlantı isteği seri düzensizliği + Trtc geri çağırma onError errCode= + Bilinmeyen bir hata oluştu, lütfen odadan çıkın ve tekrar girin + Oda hediye mesajı gönderme başarısız oldu, hata: + Oda hediye mesajı yeniden gönderme başarısız oldu, hata: + Oda hediye mesajı yeniden gönderme başarılı - yeniden bağlantı girişimlerini ayırt etmek için: + Otomatik giriş başarılı + Giriş başarılı! + Facebook yüklü değil + Giriş hatası + Giriş iptal edildi + Line yüklü değil + Giriş hatası + Giriş iptal edildi + Gmail yüklü değil + Giriş hatası + Giriş iptal edildi + Giriş başarılı! + Şifre sıfırlama başarılı + Mevcut kullanıcı UID\'si alınamadı + Telefon bağlama bilgileri başarıyla alındı + Mevcut kullanıcı UID\'si alınamadı + Telefon bağlama başarılı + Kayıt başarılı + Çıkış yapılıyor-cleanLogInfo yürütülüyor + Bilinmeyen bir istisna oluştu + Bilet bilgisi yok + Giriş şifresi başarıyla değiştirildi + UID yok + Bilet bilgisi yok + Giriş şifresi başarıyla ayarlandı + Sunucu tarafından giriş yasaklandı + Kullanıcı adı veya şifre yanlış + im durumu-cleanLogInfo yürütülüyor + Hesap bilgisi yok + imLogin yöntemi yürütülüyor + Giriş bilgisi boş + IM giriş başarılı + IM giriş başarılı + Başarısız hata kodu: + Ağ anomaliası, lütfen ağı değiştirin ve tekrar deneyin: + IM giriş başarısız oldu, istisna bilgisi: + Eşleşen bir hesap yok + Bilinmeyen hata! + Ağ hatası + İstek zaman aşımına uğradı + Ağ anomaliası, lütfen ağınıza bakın ve tekrar deneyin! + Kullanıcı mevcut değil veya şifre yanlış + Kullanıcı mevcut değil veya şifre yanlış + Kullanıcı mevcut değil veya şifre yanlış + Kullanıcı dondurulmuş durumda + Doğrulama kodu yanlış + Geçersiz telefon numarası + Şifre sıfırlama geçersiz + Takma ad geçersiz + Telefon numarası zaten kayıtlı + Giriş kimlik bilgileri süresi doldu, lütfen tekrar giriş yapın + Giriş kimlik bilgileri süresi doldu, lütfen tekrar giriş yapın + Giriş kimlik bilgileri süresi doldu, lütfen tekrar giriş yapın + Giriş kimlik bilgileri süresi doldu, lütfen tekrar giriş yapın + Ağ hatası + Sunucu bakımda + Yeterli elmas miktarı yok + SMS doğrulama kodu yanlış + Kullanıcı mevcut değil + Oda devam ediyor... + Mevcut teklif veren hala teklif alıyor, henüz bitmedi + Teklif fiyatı mevcut en yüksek fiyatından düşük + Sipariş mevcut değil + Telefon numarası biçimi yanlış + Ağ anomaliası + Bilinmeyen hata + Sunucu bakımda + Yeterli elmas miktarı yok + SMS doğrulama kodu yanlış + Servis kullanılamıyor + Sunucu anomaliası + Bilinmeyen hata + Servis yoğunluğunda + Kullanıcı mevcut değil + Oda devam ediyor... + Mevcut teklif veren hala teklif alıyor, henüz bitmedi + Teklif fiyatı mevcut en yüksek fiyatından düşük + Sipariş mevcut değil + SMS gönderme hatası + Telefon numarası biçimi yanlış + Aşk çok zor, gelecekte seni rahatsız edeceğim + Senin için geldim, dağları aştan da korkmadan + Seni özledim, karşılaştığında ve sıkıca sarılmak isteyen türde + Naziklik hazine gibidir, ve sen de öylesin + Dünyanda seyahat etmekten hoşlanırım, kaybolmaktan korkmuyorum + Test + Satın alma başarılı. + Hediye verme başarılı. + UID yok + Araba satın alımı başarılı + Hediye verme başarılı + Hediye araba verme başarılı + Başarıyla kullanıldı + Satın alım başarılı. + Avatar Çerçevesi satın alımı başarılı + Hediye verme başarılı. + Hediye araba verme başarılı + Başarıyla kullanıldı + Başarıyla kullanıldı + Tianlong Babu (Türkçe karşılığı olmayabilir) + Başarıyla kullanıldı + Lütfen doğru ortamı girin + Lütfen doğru ortamı girin + Lütfen önce ortamı başlatın + Çok çaresiz + Joy beans (Bu ifade genellikle çevrilmez, çünkü bir oyun veya uygulama içi özel terim olabilir) + Kullanıcı giriş başarılı... + Kullanıcı çıkış başarılı... + UID yok + Senkronizasyon başarılı + Kullanıcı bilgisi alma hatası.. + Hiçbir aile yok. + Henüz bir aileniz yok... + UID yok + Kullanıcı bilgisi alma hatası.. + Aileden ayrıldı + UID bulunamadı + UID yok + UID yok + Kullanıcı bilgisi alınamıyor + UID yok + UID bulunamadı + Başarıyla atıldı + UID alınamıyor + Başarıyla değiştirildi + UID bulunamadı + UID bulunamadı + UID bulunamadı + UID yok + Grup sohbetine başarıyla katıldı + UID yok + UID bulunamadı + Bağışlama başarılı! + UID bulunamadı + UID yok + UID yok + Boş veya mevcut olmayan dosya! + Boş veya mevcut olmayan dosya! + Yükleme başarılı + Qiniu\'ya yüklendi + Dondurma + Ağ hatası + Tekrar başlatmak için diğer tarafın tamamlaması gerekiyor + Öncelikle tanımlanmalıdır, lütfen CustomAttachParser\'da ilk olarak = çözün + Nobil ile ilgili bilgi alındı: %s + Bilinmiyor + Birisi + Hiç arkadaş yok. + Sayfa numarası 1\'den başlar + Sayfa boyutu 1\'den büyük olmalıdır pageSize >= 1 + İstek zaten başarılı! + Başlatma bilgisi alınamıyor + Anasayfa + Forum + Etkinlikler + Mesajlar + Benim + Oda bilgisi veya alınan sihir boş + Oda bilgisi veya alınan sihir boş + Oda bilgisi veya alınan sihir boş + Sihir listesi alınamadı, bilinmeyen hata + Sihir listesi alınamadı, sihir listesi bilgisi null + Sihir listesi alınamadı, hata kodu: + Sihir duvarı alınamadı, bilinmeyen hata + Sihir duvarı alınamadı, sihir duvarı bilgisi null + Sihir duvarı alınamadı, hata kodu: + Yeni gelen dikkat istiyor! + Ne hakkında konuşuyorsunuz? + Bunu nasıl oynuyorsunuz? + Mikrofona gitmek istiyorum + ---------AvRoomDataManager verileri temizleme tamamlandı---------- + Oda içinde artık değil + Ağ hatası, kod = + Bilinmeyen hata! + Ağ hatası + İstek zaman aşımına uğradı + Görev bir başlıyor + Görev bir tamamlandı + Görev iki başlıyor + Görev üç başlıyor + Görev dört başlıyor + Çırak başarıyla alındı + Çırak alınamadı + Usta-çırak ittifakı + Oda bilgisi boş + Oda bilgisi veya alınan sihir boş + Küresel duyuru: + Duyuru + VIP kaynakları indirilemedi + Şehzade + 600 elmas + Başarılı + Başarılı + Hata, toast mesajı olmadan + Başarıyla beğenildi + Başarıyla beğenilmedi + Başarılı + Paylaşım bağlantısı alınamadı + Paylaşım istatistikleri arayüzü + Paylaşım istatistikleri arayüzü + Başarıyla yeniden oturum açıldı, n. kez yeniden oturum açma ayırt edildi: + Elmas x + Başarıyla alındı + İade hediyesi bezemelerime gönderildi + Kırmızı paket uzmanı + Henüz aucioneer açıklaması yok + Lisanslı oda + Yeni gelenler odası + Adi oda + Sohbet + Kalp seçimi + Kalp seçimi duyurusu + Bitiş + Kısa Saç Uzun + Yao Yan + Azıcık。 + abc123😄!?uh uh uh + Yeni gelenler + Rastgele karşılaşma + Sosyal + Eğlence + Müzik + Radyo + Rastgele karşılaş + Hoş geldiniz + Fırlatma biliyarı başarıyla temizlendi. + 99.99M+ + M + Odanın terk edilmesi RoomInfo = null Oda bilgisi yok + Oda açma + Mikrofon kullanıcısı + Odada kalın + quitUserRoom Sunucuya odayı terk etmek için bildirim başarılı oldu: + quitUserRoom Sunucuya odayı terk etmek için bildirim başarısız oldu: + Başarıyla odaya girildi ve sabit üyeler alındı, sayı: + Başarıyla odaya girildi ve ziyaretçi üyeleri alındı, sayı: + Sayfa %1d Ziyaretçi Çevrimiçi: %2d + Çevrimiçi sipariş listesinin çevrimi işlenmesi sürdü: + Bu mikrofon pozisyonu zaten dolu. + Bu mikrofon pozisyonu zaten dolu. + Yukarı taşınmış olmanın nedeniyle aşağı hareket başarısız oldu + Yukarı taşınmış olmanın nedeniyle aşağı hareket başarısız oldu + Bu yöntem sadece kendi mikrofon sıranızı güncelleyebilir, diğerlerinin mikrofon sırasını güncellememelisiniz. + Mikrofon sırası ek alan kodu başarıyla güncellendi: + Güncelleme başarılı + Mikrofon sırası ek alan kodu güncellenemedi: + Mikrofon sırası ek alan kodu güncellenemedi: + Güncelleme başarılı + Güncelleme başarısız + Güncelleme anormal + Hata kodu: + %s\'nin Odası + Mevcut oda bilgisi null + Davet başarıyla gönderildi + Başarıyla açıldı + Başarıyla kapandı + Oda bilgisi yok + Mevcut oturum açmış hesap uid\'si yok + PK modu başarıyla aktive edildi + Oda bilgisi yok + Mevcut oturum açmış hesap uid\'si yok + PK modu başarıyla devre dışı bırakıldı + Oda bilgisi yok + Mevcut oturum açmış hesap uid\'si yok + Oda bilgisi yok + Mevcut oturum açmış hesap uid\'si yok + Oda bilgisi yok + Mevcut oturum açmış hesap uid\'si yok + Veri yok + Oda bilgisi yok + Mevcut oturum açmış hesap uid\'si yok + PK başarıyla oluşturuldu + Oda bilgisi yok + PK oluşturulmadı veya anormal PK durumu + PK hazır değil + PK başarıyla başladı + Hiçbir PK oluşturulmadı + Konuşma daveti başarıyla gönderildi + PK bitimi gönderildi. + Orijinal PK bilgisi yok + PK hazır değil + Başarılı + PK hazır değil + Hiçbir PK oluşturulmadı + Ayarlar kullanıcıları hatalardan haberdar etmiyor, kod= + Paylaşım başarılı + Paylaşım başarısız oldu, lütfen tekrar deneyin + Paylaşım iptal edildi + Grup sahibi + Yönetici + Adi üye + Oluşturma başarılı. + Silme başarılı. + Grubu terk etme başarılı. + Ekleme başarılı. + Ayarlar başarılı. + Aile bilgisi yok. + Ayarlar başarılı. + Ayarlar başarılı. + Ayarlar başarılı. + Ayarlar başarılı. + Kral + Büyük Hayalet Üstü + Lokum + Hayattaki on şeyden sekizi veya dokuzu memnuniyetsizlik getirir, bırakmak kurtuluştur + Büyük Hayalet Üstü + Çaba, değeri garanti eder🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍仙人掌仙人掌🌿🍀🌳🌳💐🌻🌷🌻 + Büyük Hayalet Üstü + Onu plate et + Büyük Hayalet Üstü + Demir suyu, güç verir, sorun yok, değil mi?! + Büyük Hayalet Üstü + En üst kata git🦆 + Büyük Hayalet Üstü + Lokum + Hayattaki on şeyden sekizi veya dokuzu memnuniyetsizlik getirir, bırakmak kurtuluştur + Büyük Hayalet Üstü + Çaba, değeri garanti eder🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍仙人掌仙人掌🌿🍀🌳🌳💐🌻🌷🌻 + Büyük Hayalet Üstü + Onu plate et + Büyük Hayalet Üstü + Demir suyu, güç verir, sorun yok, değil mi?! + Büyük Hayalet Üstü + En üst kata git 🦆 + Büyük Hayalet Üstü + Mevcut oturum açmış hesap uid\'si yok + Mevcut oturum açmış hesap uid\'si yok + Sunucu boş userInfo alanı döndürdü + Geçersiz uid + Sunucu boş userInfo alanı döndürdü + Sunucu boş userInfo alanı döndürdü + Kullanıcı bilgisi bulunamadı + Kullanıcı uid\'si boş + Sıfırlama başarılı + Ayarlar başarılı + iMusic/Songs/ + SınıfAdı:%s \nYöntemAdı:%s \nYöntemSatırı:%d \nŞimdi %d. birim \n---------------------------- \n + Ağ anormal + Ağ hatası + Ağ anormal, lütfen ağını kontrol edip tekrar deneyin~ + Veri ayrıştırma anormal + Parametre hatası + Sunucu iç hatası + Ağ hatası, lütfen daha sonra tekrar deneyin... + Ağ hatası, lütfen daha sonra tekrar deneyin... + Başarı durumunda, arayüzün döndürdüğü veri alanı boş olabilir, bu yöntem dış tabakayı soyuitable değil. + Bilinmeyen hata + Başarılı + Bilinmeyen hata + Ağ anormal, lütfen ağını kontrol edip tekrar deneyin... + Ağ anormal, lütfen ağını kontrol edip tekrar deneyin + Başarı durumunda, arayüzün döndürdüğü veri alanı boş olabilir, bu yöntem dış tabakayı soyuitable değil. + Başarı durumunda, arayüzün döndürdüğü veri alanı boş olabilir, bu yöntem dış tabakayı soyuitable değil. + Arayüzün döndürdüğü veri alanı boş ve NullHandle.createT T nesnesi döndürmez + Başarılı + Ağ anormal, lütfen daha sonra tekrar deneyin! + Ağ hatası + MoliStar bir ara veriyor~ Lütfen daha sonra tekrar deneyin + Ağ hatası, lütfen ağını kontrol edip tekrar deneyin! + Maymun + Horoz + Köpek + Domuz + Fare + Öküz + Kaplan + Tavşan + Ejderha + Yılan + At + Koyun + Kova + Balık + Koç + Boğa + İkizler + Yengeç + Aslan + Başak + Terazi + Akrep + Yay + Oğlak + Saat + Dakika + dakika önce + saat önce + dakika önce + saat önce + Dün + Dünkü gün + gün önce + Pazartesi + Salı + Çarşamba + Perşembe + Cuma + Cumartesi + Pazar + Sıkça Sorulan Sorular + Çin Işıkları Bankası + Birim kartı + İndirme başarısız oldu + İndirme başarısız oldu + Yorum cevapla + Konuk Sayfası + Kişi sayfası + Güncellemeler detayları + Güncellemeler Alanı + Güncellemeye beğen - ayırım- + Güncelleme konusu üzerindeki beğenilerin sayısı, konuyu ayırt et- + Güncelleme konusu üzerindeki beğenilerin sayısı, ayırım- + Beğen + Beğeniyi kaldır + Bildiri üyesi tarafından başlatıldı + Başarıyla gönderildi, lütfen sabırla bekleyin + Bildiri üyesi başarıyla kaldırıldı + Başvurunuz iletildi + Davet başarılı + Salona katılma başarılı + İşlem başarılı + İşlem başarılı + Yönetici ayarlandı başarılı + Yöneticilik başarıyla iptal edildi + Susturma işlemi başarılı + Susturma kaldırma işlemi başarılı + Başarıyla atıldı + Başarıyla eklendi + Grup sohbeti başarıyla dağıtıldı + Grup sohbetinden başarıyla ayrıldı + Grup sohbetine başarıyla katıldı + Küçük Karar Kesin + Sayım + Platin Lv5 + Dağdan Çıkış LV3 + Yüksek kalite taş + Küçük Karar Kesin + Sayım + Platin Lv5 + Dağdan Çıkış LV3 + Yüksek kalite taş + Sayım + Platin Lv5 + Dağdan Çıkış LV3 + Yüksek kalite taş + Sayım + Platin Lv5 + Dağdan Çıkış LV3 + Yüksek kalite taş + Platin Lv5 + Dağdan Çıkış LV3 + Yüksek kalite taş + Katıldı + Önerilen + Değişim başarılı + Ağ hatası + Ağ hatası + Başarılı + Ağ hatası + Başarılı + Ağ hatası + Başarılı + Ağ hatası + Kaynak kullanım dışı bırakıldı! Başka bir şey deneyin + Paylaşılan müzik yerel olmalıdır + Veritabanı eklemesi başarısız oldu + Xiao Ming + Xiao Hong + Silly ww + Silly ww + Özel mesaj: + Başarılı + Başarısız + Başarısız + Doğrulama kodu cep telefonunuza gönderildi, lütfen kontrol edin + Ağ hatası + Oturum dışı şifre sıfırlama + Oturum açmış durumda şifre sıfırlama + Üst yönetici işlem yapamaz + Mevcut oda bilgisi boş. + Bakiye yetersiz + Mevcut oda bilgisi boş. + İndirme başarısız oldu + İndirme başarısız oldu + MD5 doğrulaması başarısız oldu + Yeni sürüm indirme bilgisi yok + İndiriliyor... + İndiriliyor... + Zaten en son sürümdesiniz + Uygulama yüklenmedi + HABU-Yeni arkadaşlar edin, hemen HABU\'ya katılın. + En iyi grupları bulun ve katılın, yabancılarla konuşun + Veri ayrıştırma istisnası + Parametre hatası + Rakip PK isteğini reddetti + işlem başarısız (%s) + %s cihazınızda fotoğraflara erişim izni verilsin mi? + İzin ver + Hayır + Özelleştir + diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..36ca010 --- /dev/null +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,671 @@ + + 平臺倡導友善互動,禁止宣傳及發佈違規違法內容,嚴禁欺詐用戶,如有違規將進行帳號封禁,如有違規請及時舉報。 + 來MoliStar,邂逅你的專屬聲音 + 來MoliStar,開黑交友玩遊戲 + 加入家族,和你興趣相投的小夥伴一起玩耍吧~ + hi,我想邀請您加入我的MoliStar家族: + 加入家族,和你興趣相投的小夥伴一起玩耍吧~ + hi,我想邀請您加入我的MoliStar群聊: + 可點擊房間話題查看本房間公告 + 相親玩法已開啟,請點擊主持人麥位選擇主持人 + 新一輪的相親已開啟 + 已進入心動選人環節 + 公布心動對象 + 版本過舊,請下載最新版本哦 + 網絡錯誤 + 未知錯誤 + 用戶信息為空,請重新登錄 + 僅支持查看3個月內記錄 + 不是新用戶。 + 請求成功-> + 請求成功 + 請求成功-> + 請求異常 code: + [圖片] + [視頻] + [語音消息] + [位置] + [文件] + [通知提醒] + 你收到一條消息... + 您關註的TA上線啦,快去圍觀吧~~~ + [禮物] + [遊戲邀請] + [升級信息] + 您收到一個 + 紅包哦! + 恭喜您,獲得抽獎機會 + 提示: + [分享房間] + [分享家族] + [分享群組] + [您收到一條分享消息] + [您收到了一個群紅包] + 領取了你的紅包] + [你領取了 + 的紅包] + 領取了 + 的紅包] + [您收到一條系統消息] + [您收到一條公聊大廳相關消息] + [您收到一條公會消息] + [簽到提醒] + [簽到瓜分百萬] + [聲音瓶子審核消息] + [分享一條動態] + [您收到一個全服紅包] + [風險提示] + [語音] + 你收到一條消息 + 輔導的房間 + 我是一只小萌新輔導輔導輔導輔導的房間 + 新秀 + 交友 + 娛樂 + 電臺 + 星球 + 音樂 + 反饋成功 + 發生未知錯誤,請退出房間重新進入 + [房間公告] + 獲取用戶的信息字段為空 + 不在房間內或房間信息為空 + 收到踢人信息 + 消息中可能含有違規信息,請停止發送類似信息! + 連接中... + 聊天室狀態異常! + 聊天室在線狀態變為UNLOGIN! + 登錄中... + 雲信聊天室已登錄成功 + 重連聊天室事 + 需要重新登錄(被踢或驗證信息錯誤)... + 網絡斷開... + 斷網事件 + 自定義消息: + 禮物特效 + 禮物特效 + PK 創建消息-> msgUuid: + 接受到的時間: + PK 創建消息-> attr: + PK 開始消息-> msgUuid: + 接受到的時間: + PK 開始消息-> attr: + PK 結果消息-> msgUuid: + 接受到的時間: + PK 結果消息-> attr: + 暴走倒計時房間消息出錯了... + 暴走倒計時: + 您已隱身進入房間 + 您已隱身進入房間 + 進入房間失敗 + 進房參數為空,請檢查 enterRoom:appScene: 接口調用是否傳入有效的 param + 進房參數 sdkAppId 錯誤 + 進房參數 roomId 錯誤 + 進房參數 userID 不正確 + 進房參數 userSig 不正確 + 請求進房超時,請檢查網絡 + 服務不可用。請檢查:套餐包剩餘分鐘數是否大於0,騰訊雲賬號是否欠費 + 請求退房超時 + 打開攝像頭失敗 + 攝像頭設備未授權 + 攝像頭參數設置出錯 + 攝像頭正在被占用中 + 打開麥克風失敗 + 麥克風設備未授權 + 麥克風設置參數失敗 + 麥克風正在被占用中 + 停止麥克風失敗 + 打開揚聲器失敗 + 揚聲器設置參數失敗 + 停止揚聲器失敗 + 開始錄屏失敗 + 錄屏失敗 + 沒有權限上行輔路 + 其他用戶正在上行輔路 + 視頻幀編碼失敗 + 不支持的視頻分辨率 + 音頻幀編碼失敗 + 不支持的音頻采樣率 + 設置的 pixel format 不支持 + 設置的 buffer type 不支持 + 旁路轉推請求超時 + 雲端混流請求超時 + 雲端混流回包異常 + 旁路轉推回包異常 + 開始向騰訊雲的直播 CDN 推流信令超時 + 開始向騰訊雲的直播 CDN 推流信令異常 + 停止向騰訊雲的直播 CDN 推流信令超時 + 停止向騰訊雲的直播 CDN 推流信令異常 + 請求連麥超時 + 請求退出連麥超時 + 無效參數 + 當前是觀眾角色,不能請求或斷開跨房連麥,需要先 switchRole() 到主播 + 不支持跨房間連麥 + 達到跨房間連麥上限 + 跨房間連麥重試次數耗盡 + 跨房間連麥請求超時 + 跨房間連麥請求格式錯誤 + 跨房間連麥無簽名 + 跨房間連麥簽名解密失敗 + 未找到跨房間連麥簽名解密密鑰 + 跨房間連麥簽名解析錯誤 + 跨房間連麥簽名時間戳錯誤 + 跨房間連麥簽名不匹配 + 本房間無連麥 + 本用戶未發起連麥 + 跨房間連麥失敗 + 取消跨房間連麥失敗 + 被連麥房間不存在 + 被連麥房間達到連麥上限 + 被連麥用戶不存在 + 被連麥用戶已被刪除 + 被連麥用戶達到資源上限 + 連麥請求序號錯亂 + Trtc回調onError errCode= + 發生未知錯誤,請退出房間重新進入 + 房間禮物消息發送失敗, error: + 房間禮物消息重發失敗, error: + 房間禮物消息重發成功-區分重連次數: + 自動登錄成功 + 登錄成功! + 未安裝facebook + 登錄出錯 + 登錄取消 + 未安裝Line + 登錄出錯 + 取消登錄 + 未安裝gmail + 登錄出錯 + 取消登錄 + 登錄成功! + 重置密碼成功 + 獲取不到當前用戶UID + 獲取手機綁定信息成功 + 獲取不到當前用戶UID + 綁定手機成功 + 註冊成功 + 執行logout-cleanLogInfo + 發生未知異常 + 沒有ticket信息 + 修改登錄密碼成功 + 沒有uid + 沒有ticket信息 + 設置登錄密碼成功 + 被服務器禁止登錄 + 用戶名或密碼錯誤 + 執行im狀態-cleanLogInfo + 沒有賬戶信息 + 執行imLogin方法 + 登錄信息為空 + IM登錄成功 + IM登錄成功 + 失敗錯誤碼: + 網絡異常,請切換網絡后重試: + IM登錄失敗異常信息: + 不存在對應賬號 + 未知錯誤! + 網絡錯誤 + 請求超時 + 網絡異常,請檢查你的網絡再試! + 用戶不存在或密碼錯誤 + 用戶不存在或密碼錯誤 + 用戶不存在或密碼錯誤 + 用戶已被凍結 + 驗證碼錯誤 + 手機號不可用 + 重置密碼無效 + 昵稱不合法 + 手機號碼已經被註冊 + 登錄憑證失效,請重新登錄 + 登錄憑證失效,請重新登錄 + 登錄憑證失效,請重新登錄 + 登錄憑證失效,請重新登錄 + 網絡錯誤 + 服務器正在維護 + 鉆石數量不夠 + 短信驗證碼錯誤 + 該用戶不存在 + 房間正在運行中... + 當前被競拍者正在被競拍中,還未結束 + 競拍價格小於當前最高價 + 訂單不存在 + 手機格式不正確 + 網絡異常 + 未知錯誤 + 服務器正在維護 + 鉆石數量不夠 + 短信驗證碼錯誤 + 服務不可用 + 服務端異常 + 未知錯誤 + 服務繁忙 + 該用戶不存在 + 房間正在運行中... + 當前被競拍者正在被競拍中,還未結束 + 競拍價格小於當前最高價 + 訂單不存在 + 發送短信出錯 + 手機格式不正確 + 談戀愛太麻煩了,以後就麻煩你了 + 我是為你而來,不在乎穿越綿綿山脈 + 我想你了,是那種要見一面緊緊抱住的那種 + 溫柔是寶藏,你也是 + 我喜歡在你的世界亂逛,丟了也不怕 + 測試 + 購買成功. + 贈送成功. + 沒有Uid + 購買座駕成功 + 贈送成功 + 贈送座駕成功 + 使用成功 + 購買成功. + 購買頭飾成功 + 贈送成功. + 贈送座駕成功 + 使用成功 + 使用成功 + 天龍八部 + 使用成功 + 請輸入正確的環境 + 請輸入正確的環境 + 請先初始化環境 + 很無奈 + 歡樂豆 + 用戶登錄成功後.... + 用戶登出成功後.... + 沒有UID + 同步成功 + 找不到uid + 沒有家族. + 沒加入家族中... + 沒有uid + 獲取用戶信息出錯了.. + 已退出家族 + 找不到uid + 沒有uid + 沒有uid + 獲取不到用戶信息 + 沒有uid + 沒找到uid + 踢出成功 + 獲取不到 uid + 修改成功 + 找不到uid + 找不到uid + 找不到uid + 沒有uid + 加入群聊成功 + 沒有uid + 找不到uid + 貢獻成功! + 找不到uid + 沒有uid + 沒有uid + 為空或者該文件不存在! + 為空或者該文件不存在! + 上傳成功 + 七牛上傳 + 冰淇淋 + 網絡異常 + 需要對方完成後,才能再次發起哦 + 未定義的first,請現在CustomAttachParser中解析first= + 收到貴族相關信息:%s + 未知 + 某某 + 沒有好友. + 頁碼從1開始 + 每頁大小必須大於1 pageSize >= 1 + 已經請求成功了! + 獲取不到初始化信息 + 首頁 + 論壇 + 賽事 + 消息 + 我的 + 房間信息或者收到魔法為空 + 房間信息或者收到魔法為空 + 房間信息或者收到魔法為空 + 獲取魔法列表失敗,未知錯誤 + 獲取魔法列表失敗,魔法列表信息為null + 獲取魔法列表失敗,錯誤碼: + 獲取魔法墻失敗,未知錯誤 + 獲取魔法墻失敗,魔法墻信息為null + 獲取魔法墻失敗,錯誤碼: + 萌新求關註! + 你們在聊什麽呀? + 這個怎麽玩呀? + 我要上麥 + ---------清除AvRoomDataManager數據完成--------- + TA已經不在房間了 + 網絡異常, code = + 未知錯誤! + 網絡錯誤 + 請求超時 + 任務一開始 + 任務一完成 + 任務二開始 + 任務三開始 + 任務四開始 + 收徒成功 + 收徒失敗 + 師徒推送 + 房間信息為空 + 房間信息或者收到魔法為空 + 全局廣播: + 廣播 + 下載VIP資源失敗 + 皇帝 + 600鉆石 + 成功 + 成功 + 不需要toast提示的錯誤 + 點贊成功 + 取消點贊成功 + 成功 + 分享連接獲取失敗 + 分享統計接口 + 分享統計接口 + 補簽成功, 區分第幾次補簽: + 鉆石x + 領取成功 + 回歸禮已發放至我的裝扮 + 紅包小能手 + 暫無競拍描述 + 牌照房 + 新秀房 + 普通房 + 交談 + 心動選人 + 公布心動 + 結束 + 短發情長 + 杳鳶 + 稍微。 + abc123😄!?呃呃呃 + 新秀 + 邂逅 + 交友 + 娛樂 + 音樂 + 電臺 + 邂逅 + 歡迎 + 清除桌球成功。 + 9999萬+ + + 退出房間 RoomInfo = null 沒有房間信息 + 開房 + 用戶在麥上 + 在房間內停留時長 + quitUserRoom 通知服務端退出房間成功: + quitUserRoom 通知服務端退出房間失敗: + 進入房間獲取固定成員成功,人數: + 進入房間獲取遊客成員成功,人數: + 第%1d頁遊客在線人數:%2d + 循環處理在線順序列表耗時: + 該麥位已經有人了哦~ + 該麥位已經有人了 + 上麥導致下麥失敗 + 上麥導致下麥失敗 + 該方法只能更新自己的麥序,不要更新別人的麥序信息。 + 更新麥序額外字段成功 code: + 更新成功 + 更新麥序額外字段失敗 code: + 更新麥序額外字段失敗 code: + 更新成功 + 更新失敗 + 更新異常 + 錯誤碼: + %s的房間 + 當前房間信息為null + 邀請成功 + 開啟成功 + 關閉成功 + 沒有房間信息 + 無當前登錄賬戶uid + 開啟pk模式成功 + 沒有房間信息 + 無當前登錄賬戶uid + 關閉pk模式成功 + 沒有房間信息 + 無當前登錄賬戶uid + 沒有房間信息 + 無當前登錄賬戶uid + 沒有房間信息 + 無當前登錄賬戶uid + 無數據 + 沒有房間信息 + 無當前登錄賬戶uid + 創建PK成功 + 沒有房間信息 + PK沒有創建或者PK狀態異常 + PK還沒準備好 + 開始PK成功 + 沒有創建PK + 邀請上麥成功 + PK結束已經發送過來。 + 沒有原來的PK信息 + PK還沒準備好 + 成功 + PK還沒準備好 + 沒有創建PK + 設置不提醒用戶出錯,code= + 分享成功 + 分享失敗,請重試 + 分享取消 + 群主 + 管理員 + 普通成員 + 創建成功。 + 刪除成功。 + 推出群組成功。 + 添加成功。 + 設置成功。 + 無家族信息. + 設置成功。 + 設置成功。 + 設置成功。 + 設置成功。 + 王者 + 大幽魂上衣 + 棒棒糖 + 人生不如意之事 十之八九\n放下才是解脫 + 大幽魂上衣 + 努力,才能保證你的價值🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍🌵🌵🌿🍀🌳🌳💐🌻🌷🌻 + 大幽魂上衣 + 盤他 + 大幽魂上衣 + 鐵汁,奧力給,沒毛病吧?! + 大幽魂上衣 + 上熱門🦆 + 大幽魂上衣 + 棒棒糖 + 人生不如意之事 十之八九\n放下才是解脫 + 大幽魂上衣 + 努力,才能保證你的價值🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍🌵🌵🌿🍀🌳🌳💐🌻🌷🌻 + 大幽魂上衣 + 盤他 + 大幽魂上衣 + 鐵汁,奧力給,沒毛病吧?! + 大幽魂上衣 + 上熱門🦆 + 大幽魂上衣 + 沒有當前登錄的uid + 沒有當前登錄的uid + 服務器返回的userInfo字段為空 + uid不合法 + 服務器返回的userInfo字段為空 + 服務器返回的userInfo字段為空 + 沒有找到用戶信息 + 用戶uid為空 + 重置成功 + 設置成功 + i音樂/歌曲/ + ClassName:%s \nMethodName:%s \nMethodLine:%d \n當前是第%d個 \n---------------------------- \n + 網絡異常 + 網絡錯誤 + 網絡異常,請檢查您的網絡再試~ + 數據解析異常 + 參數錯誤 + 服務器內部錯誤 + 網絡錯誤,請稍後再試... + 網絡錯誤,請稍後再試... + 成功情況下接口返回data字段可以為空,不適合使用此方法脫掉外層。 + 未知錯誤 + 成功 + 未知錯誤 + 網絡異常,請檢查您的網絡再試... + 網絡異常,請檢查你的網絡再試 + 成功情況下接口返回data字段可以為空,不適合使用此方法脫掉外層。 + 成功情況下接口返回data字段可以為空,不適合使用此方法脫掉外層。 + 接口返回的data字段為空了,且NullHandle.createT沒有返回T對象 + 成功 + 網絡異常,請稍後再試! + 網絡錯誤 + MoliStar開小差中~請稍後再試 + 網絡異常,請檢查您的網絡再試! + + + + + + + + + + + + + 水瓶座 + 雙魚座 + 白羊座 + 金牛座 + 雙子座 + 巨蟹座 + 獅子座 + 處女座 + 天秤座 + 天蠍座 + 射手座 + 魔羯座 + 小時 + + 分鐘前 + 小時前 + 分鐘前 + 小時前 + 昨天 + 前天 + 天前 + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + 周日 + 常見問題 + 中國光大銀行 + 儲蓄卡 + 下載失敗 + 下載失敗 + 回復評論 + 話題客態頁 + 個人主頁 + 動態詳情 + 動態廣場 + 點贊動態-區分- + 點贊動態的次數,區分話題- + 點贊動態的次數,區分- + 點贊 + 取消贊 + 公會成員啟動應用 + 發送成功,請耐心等待 + 移除廳成員成功 + 您的申請已提交 + 邀請成功 + 加入廳成功 + 操作成功 + 操作成功 + 設置管理員成功 + 取消管理員成功 + 禁言成功 + 取消禁言成功 + 踢出成功 + 添加成功 + 解散群聊成功 + 退出群聊成功 + 加入群聊成功 + 小決絕 + 伯爵 + 白金Lv5 + 初出茅廬LV3 + 高階石頭 + 小決絕 + 伯爵 + 白金Lv5 + 初出茅廬LV3 + 高階石頭 + 伯爵 + 白金Lv5 + 初出茅廬LV3 + 高階石頭 + 伯爵 + 白金Lv5 + 初出茅廬LV3 + 高階石頭 + 白金Lv5 + 初出茅廬LV3 + 高階石頭 + 我加入的 + 推薦 + 更改成功 + 網絡錯誤 + 網絡錯誤 + 成功 + 網絡錯誤 + 成功 + 網絡錯誤 + 成功 + 網絡錯誤 + 該資源已經廢棄了哦!試試別的吧 + 該共享音樂應該在本地 + 數據庫插入失敗 + 小明 + 小紅 + 笨ww + 笨ww  + 自定義消息: + 成功 + 失敗 + 失敗 + 驗證碼已發送到您的手機,請註意查收 + 網絡錯誤 + 非登錄態重置密碼 + 登錄態重置密碼 + 超管不能操作 + 當前房間信息為空. + 余額不足 + 當前房間信息為空. + 下載失敗 + 下載失敗 + MD5驗證不通過 + 沒有新版本下載信息 + 正在下載中... + 下載中... + 已是最新版本 + 未安裝該應用 + HABU-Making new friends,join HABU right now. + Find and join the best groups,talk with strangers + 數據解析異常 + 參數錯誤 + + 對方拒絕你的PK請求 + + 操作失敗 (%s) + 允許 %s 存取裝置上的相片? + 允許 + + 定制 + diff --git a/core/src/main/res/values/attr.xml b/core/src/main/res/values/attr.xml new file mode 100644 index 0000000..63b9734 --- /dev/null +++ b/core/src/main/res/values/attr.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml new file mode 100644 index 0000000..841d5a2 --- /dev/null +++ b/core/src/main/res/values/strings.xml @@ -0,0 +1,678 @@ + + The platform promotes friendly interactions and prohibits the promotion and dissemination of illegal content. Fraudulent activities against users are strictly prohibited. Any violations will result in account suspension. Please report any violations promptly. + Come to MoliStar and meet your exclusive voice. + Come to MoliStar, make friends, and play games together. + Join a family and play with friends who share your interests. + Hi, I would like to invite you to join my MoliStar family: + Join a family and play with friends who share your interests. + Hi, I would like to invite you to join my MoliStar group chat: + Click on the room topic to view the room announcement. + Blind date mode is open, please click on the host&s microphone to select the host. + A new round of blind dates has begun. + Entered the heart-picking stage. + Announce the object of affection. + Version outdated, please download the latest version. + Network error. + Unknown error. + User information is empty, please log in again. + Only supports viewing records within 3 months. + Not a new user. + Request successful-> + Request Successful + Request Successful-> + Request Exception code: + [Image] + [Video] + [Voice Message] + [Location] + [File] + [Notification Reminder] + You have received a message... + The person you are following is online now, hurry up and check it out~~~ + [Gift] + [Game Invitation] + [Upgrade Information] + You have received a + red envelope! + Congratulations, you have won a lucky draw opportunity + Reminder: + [Share Room] + [Share Family] + [Share Group] + [You have received a shared message] + [You have received a group red envelope] + has claimed your red envelope] + [You have claimed + &s red envelope] + has claimed + &s red envelope] + [You have received a system message] + [You have received a public chat hall related message] + [You have received a guild message] + [Check-in Reminder] + [Check-in to share millions] + [Voice Bottle Review Message] + [Share a dynamic] + [You have received a server-wide red envelope] + [Risk Reminder] + [Voice] + You have received a message + Counseling Room + I am a cute little newbie counseling room + Newcomer + Social + Entertainment + Radio + Planet + Music + Feedback Successful + Unknown error occurred, please exit the room and re-enter + [Room Announcement] + User information field is empty + Not in the room or room information is empty + Received kick-out information + The message may contain illegal information, please stop sending similar information like that! + Connecting... + Chat room status abnormal! + Chat room online status becomes UNLOGIN! + Logging in... + Netease chat room login successful + Reconnecting chat room + Need to re-login (kicked or verification information incorrect)... + Network disconnected... + Network disconnection event + Custom message: + Gift effects + Gift effects + PK Creation Message-> msgUuid: + Received time: + PK Creation Message-> attr: + PK Start Message-> msgUuid: + Received time: + PK Start Message-> attr: + PK Result Message-> msgUuid: + Received time: + PK Result Message-> attr: + Rampage countdown room message error... + Rampage Countdown: + You have entered the room invisibly + You have entered the room invisibly + Failed to enter room + Room entry parameters are empty, please check if valid parameters are passed in enterRoom:appScene: interface + Invalid sdkAppId in room entry parameters + Invalid roomId in room entry parameters + Incorrect userID in room entry parameters + Incorrect userSig in room entry parameters + Request room entry timeout, please check network + Service unavailable. Please check if the remaining minutes of the package are greater than 0 and if the Tencent Cloud account is in arrears + Request room exit timeout + Failed to turn on camera + Camera device unauthorized + Camera parameter setting error + Camera is being occupied + Failed to turn on microphone + Microphone device unauthorized + Microphone parameter setting failed + Microphone is being occupied + Failed to stop microphone + Failed to turn on speaker + Speaker parameter setting failed + Failed to stop speaker + Failed to start screen recording + Screen recording failed + No permission to upload auxiliary path + Other users are uploading auxiliary paths + Video frame encoding failed + Unsupported video resolution + Audio frame encoding failed + Unsupported audio sampling rate + The set pixel format is not supported + The set buffer type is not supported + Bypass request timeout + Cloud mixing request timeout + Abnormal cloud mixing response + Abnormal bypass response + Timeout for starting the signaling of pushing stream to Tencent Cloud&s live CDN + Abnormal signaling for starting the push stream to Tencent Cloud&s live CDN + Timeout for stopping the signaling of pushing stream to Tencent Cloud&s live CDN + Abnormal signaling for stopping the push stream to Tencent Cloud&s live CDN + Request for linkage timeout + Request to exit linkage timeout + Invalid parameter + Currently in audience role, cannot request or disconnect cross-room linkage, need to switchRole() to anchor first + Cross-room linkage not supported + Cross-room linkage limit reached + Cross-room linkage retry count exhausted + Cross-room linkage request timeout + Cross-room linkage request format error + Cross-room linkage signature missing + Cross-room linkage signature decryption failed + Cross-room linkage signature decryption key not found + Cross-room linkage signature parsing error + Cross-room linkage signature timestamp error + Cross-room linkage signature mismatch + No linkage in this room + The user did not initiate the linkage + Cross-room linkage failed + Failed to cancel cross-room linkage + Linked room does not exist + Linked room reached the linkage limit + Linked user does not exist + Linked user has been deleted + Linked user reached resource limit + Linkage request serial disorder + Trtc callback onError errCode= + Unknown error occurred, please exit the room and re-enter + Room gift message sending failed, error: + Room gift message resend failed, error: + Room gift message resend succeeded - distinguishing reconnection attempts: + Automatic login successful + Login successful! + Facebook not installed + Login error + Login canceled + Line not installed + Login error + Login canceled + Gmail not installed + Login error + Login canceled + Login successful! + Password reset successful + Unable to get current user UID + Successfully obtain phone binding information + Unable to get current user UID + Mobile phone binding successful + Registration successful + Execute logout-cleanLogInfo + Unknown exception occurred + No ticket information + Successfully changed login password + No UID + No ticket information + Set login password successfully + Login prohibited by server + Incorrect username or password + Execute im status-cleanLogInfo + No account information + Execute imLogin method + Login information is empty + IM login successful + IM login successful + Failed error code: + Network anomaly, please switch network and try again: + IM login failed exception information: + No corresponding account exists + Unknown error! + Network error + Request timeout + Network anomaly, please check your network and try again! + User does not exist or password is incorrect + User does not exist or password is incorrect + User does not exist or password is incorrect + User has been frozen + Verification code incorrect + Invalid phone number + Password reset invalid + Nickname invalid + Phone number already registered + Login credentials expired, please log in again + Login credentials expired, please log in again + Login credentials expired, please log in again + Login credentials expired, please log in again + Network error + Server under maintenance + Insufficient diamond quantity + SMS verification code incorrect + User does not exist + Room in progress... + Current bidder is being bid on, not yet finished + Bidding price less than current highest price + Order does not exist + Incorrect phone number format + Network abnormality + Unknown error + Server under maintenance + Insufficient diamond quantity + SMS verification code incorrect + Service unavailable + Server abnormality + Unknown error + Service busy + User does not exist + Room in progress... + Current bidder is being bid on, not yet finished + Bidding price less than current highest price + Order does not exist + Error sending SMS + Incorrect phone number format + Love is too troublesome, I&ll trouble you in the future + I came for you, regardless of crossing the mountains + I miss you, the kind that wants to meet and hug tightly + Gentleness is treasure, and so are you + I like to wander around in your world, not afraid to lose my way + Test + Purchase successful. + Gift successful. + No UID + Car purchase successful + Gift successful + Gift car successful + Successful use + Purchase successful. + Avatar Frame purchase successful + Gift successful. + Gift car successful + Successful use + Successful use + Tianlong Babu + Successful use + Please enter the correct environment + Please enter the correct environment + Please initialize the environment first + Very helpless + Joy beans + User login successful... + User logout successful... + No UID + Synchronization successful + User information retrieval error.. + No family. + Not in a family yet... + No UID + Error retrieving user information.. + Exited family + No UID found + No UID + No UID + Unable to retrieve user information + No UID + UID not found + Successfully kicked out + Unable to retrieve UID + Successfully modified + No UID found + No UID found + No UID found + No UID + Successfully joined group chat + No UID + No UID found + Contribution successful! + No UID found + No UID + No UID + Empty or non-existent file! + Empty or non-existent file! + Upload successful + Uploaded to Qiniu + Ice Cream + Network error + Need completion from the other party before initiating again + Undefined first, please parse first= in CustomAttachParser + Received noble-related information: %s + Unknown + Someone + No friends. + Page number starts from 1 + Page size must be greater than 1 pageSize >= 1 + Request successful already! + Unable to retrieve initialization information + Home + Forum + Events + Messages + Mine + Room information or received magic is empty + Room information or received magic is empty + Room information or received magic is empty + Failed to retrieve magic list, unknown error + Failed to retrieve magic list, magic list information is null + Failed to retrieve magic list, error code: + Failed to retrieve magic wall, unknown error + Failed to retrieve magic wall, magic wall information is null + Failed to retrieve magic wall, error code: + Newbie seeking attention! + What are you chatting about? + How do you play this? + I want to go on mic + ---------Clear AvRoomDataManager data completed--------- + They are no longer in the room + Network error, code = + Unknown error! + Network error + Request timeout + Task one starts + Task one completed + Task two starts + Task three starts + Task four starts + Successfully received apprentice + Failed to receive apprentice + Master-apprentice push + Room information is empty + Room information or received magic is empty + Global broadcast: + Broadcast + Failed to download VIP resources + Emperor + 600 diamonds + Success + Success + Error without toast prompt + Successfully liked + Successfully unliked + Success + Failed to get sharing link + Sharing statistics interface + Sharing statistics interface + Successfully re-signed, Distinguish the nth re-signing: + Diamonds x + Successfully received + Return gift has been sent to my decorations + Red packet expert + No auction description yet + License room + Newbie room + Ordinary room + Chat + Heart-picking + Announce heart-picking + End + Short Hair Long + Yao Yan + Slightly。 + abc123😄!?uh uh uh + Newbie + Encounter + Social + Entertainment + Music + Radio + Encounter + Welcome + Clear billiards successful. + 99.99M+ + M + Quit room RoomInfo = null No room information + Open room + User on mic + Stay in room for + quitUserRoom Notify server to quit room successfully: + quitUserRoom Notify server to quit room failed: + Successfully entered room and obtained fixed members, number: + Successfully entered room and obtained visitor members, number: + Page %1d Visitor Online: %2d + Loop processing online order list takes: + This microphone position is already occupied. + This microphone position is already occupied. + Failure to move down due to being moved up + Failure to move down due to being moved up + This method can only update your own microphone sequence, do not update others& microphone sequence information. + Successfully updated microphone sequence extra field code: + Update successful + Failed to update microphone sequence extra field code: + Failed to update microphone sequence extra field code: + Update successful + Update failed + Update abnormal + Error code: + %s\'s Room + Current room information is null + Invitation sent successfully + Opened successfully + Closed successfully + No room information + No current login account uid + PK mode activated successfully + No room information + No current login account uid + PK mode deactivated successfully + No room information + No current login account uid + No room information + No current login account uid + No room information + No current login account uid + No data + No room information + No current login account uid + PK created successfully + No room information + PK not created or abnormal PK status + PK not ready + PK started successfully + No PK created + Invited to speak successfully + PK end has been sent. + No original PK information + PK not ready + Success + PK not ready + No PK created + Settings not reminding users of errors, code= + Share successful + Share failed, please try again + Share canceled + Group owner + Administrator + Ordinary member + Creation successful. + Deletion successful. + Quit group successful. + Add successful. + Settings successful. + No family information. + Settings successful. + Settings successful. + Settings successful. + Settings successful. + King + Great Ghost Upper + Lollipop + Eight or nine out of ten things in life are unsatisfactory, letting go is liberation + Great Ghost Upper + Effort ensures your worth 🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍🌵🌵🌿🍀🌳🌳💐🌻🌷🌻 + Great Ghost Upper + Plate him + Great Ghost Upper + Iron juice, give strength, no problem, right?! + Great Ghost Upper + Go to the top 🦆 + Great Ghost Upper + Lollipop + Eight or nine out of ten things in life are unsatisfactory, letting go is liberation + Great Ghost Upper + Effort ensures your worth 🌹🌷💐🥀🍂🍁🌼🌸🌺🍃🌾🌱🌾🎍🌵🌵🌿🍀🌳🌳💐🌻🌷🌻 + Great Ghost Upper + Plate him + Great Ghost Upper + Iron juice, give strength, no problem, right?! + Great Ghost Upper + Go to the top 🦆 + Great Ghost Upper + No current login uid + No current login uid + Server returned empty userInfo field + Invalid uid + Server returned empty userInfo field + Server returned empty userInfo field + User information not found + User uid is empty + Reset successful + Setting successful + iMusic/Songs/ + ClassName:%s \nMethodName:%s \nMethodLine:%d \nCurrent is the %dth one \n---------------------------- \n + Network abnormal + Network error + Network abnormal, please check your network and try again~ + Data parsing abnormal + Parameter error + Server internal error + Network error, please try again later... + Network error, please try again later... + In case of success, the interface returns data field can be empty, not suitable for using this method to strip the outer layer. + Unknown error + Success + Unknown error + Network abnormal, please check your network and try again... + Network abnormal, please check your network and try again + In case of success, the interface returns data field can be empty, not suitable for using this method to strip the outer layer. + In case of success, the interface returns data field can be empty, not suitable for using this method to strip the outer layer. + The data field returned by the interface is empty, and NullHandle.createT does not return a T object + Success + Network abnormal, please try again later! + Network error + MoliStar is taking a break~ Please try again later + Network error, please check your network and try again! + Monkey + Rooster + Dog + Pig + Rat + Ox + Tiger + Rabbit + Dragon + Snake + Horse + Sheep + Aquarius + Pisces + Aries + Taurus + Gemini + Cancer + Leo + Virgo + Libra + Scorpio + Sagittarius + Capricorn + Hour + Minute + minutes ago + hours ago + minutes ago + hours ago + Yesterday + The day before yesterday + days ago + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + Frequently Asked Questions + China Everbright Bank + Savings card + Download failed + Download failed + Reply comment + Topic Guest Page + Personal homepage + Dynamic details + Dynamic Square + Like dynamic - distinguish- + The number of likes on dynamic, distinguish topic- + The number of likes on dynamic, distinguish- + Like + Cancel like + Guild member initiated application + Sent successfully, please wait patiently + Successfully removed hall member + Your application has been submitted + Invitation successful + Join hall successful + Operation successful + Operation successful + Administrator set successfully + Administrator canceled successfully + Muted successfully + Unmuted successfully + Kicked out successfully + Added successfully + Dismiss group chat successfully + Quit group chat successfully + Joined group chat successfully + Little Decision Absolute + Count + Platinum Lv5 + First Out of the Mountain LV3 + High-grade stone + Little Decision Absolute + Count + Platinum Lv5 + First Out of the Mountain LV3 + High-grade stone + Count + Platinum Lv5 + First Out of the Mountain LV3 + High-grade stone + Count + Platinum Lv5 + First Out of the Mountain LV3 + High-grade stone + Platinum Lv5 + First Out of the Mountain LV3 + High-grade stone + Joined + Recommend + Change successful + Network error + Network error + Success + Network error + Success + Network error + Success + Network error + The resource has been deprecated! Try something else + The shared music should be local + Database insertion failed + Xiao Ming + Xiao Hong + Silly ww + Silly ww + Custom message: + Success + Failure + Failure + The verification code has been sent to your mobile phone, please check + Network error + Reset password in non-login state + Reset password in login state + Super admin cannot operate + Current room information is empty. + Insufficient balance + Current room information is empty. + Download failed + Download failed + MD5 verification failed + No new version download information + Downloading... + Downloading... + Already the latest version + Application not installed + HABU-Making new friends, join HABU right now. + Find and join the best groups, talk with strangers + Data parsing exception + Parameter error + + + The opponent rejected your PK request + operation failed (%s) + + Allow %s to access photos on your device? + Allow + No + + Custom + + + 绑定邮箱成功 + + + diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardBean.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardBean.java new file mode 100644 index 0000000..14cfee8 --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardBean.java @@ -0,0 +1,41 @@ +package com.chwl.core.bank_card.bean; + +import lombok.Data; + +/** + * Created by MadisonRong on 2019-08-16 + */ +@Data +public class BankCardBean { + + /** + * 默认支付银行卡的标记 + */ + public static final int CARD_DEFAULT_PAY = 1; + + /** + * 不是默认支付银行卡的标记 + */ + public static final int CARD_NOT_DEFAULT_PAY = 0; + + /** + * recordId : 7 + * uid : 909768 + * bankCardNo : **** **** **** 0674 + * defaultFlag : 0 + * bankName : 招商银行 + * bankLogo : http://img.erbanyy.com/CMB.jpg + * cardType : 储蓄卡 + */ + private int recordId; + private int uid; + private String bankCardNo; + private int defaultFlag; + private String bankName; + private String bankLogo; + private String cardType; + + public boolean isDefaultPaymentCard() { + return defaultFlag == CARD_DEFAULT_PAY; + } +} diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardListResp.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardListResp.java new file mode 100644 index 0000000..cae9615 --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/bean/BankCardListResp.java @@ -0,0 +1,19 @@ +package com.chwl.core.bank_card.bean; + +import java.util.List; + +import lombok.Data; + +/** + * Created by MadisonRong on 2019-08-19 + */ +@Data +public class BankCardListResp { + /** + * list : [{"recordId":12,"uid":909768,"bankCardNo":"**** **** **** 0148","defaultFlag":1,"bankName":ResUtil.getString(R.string.bank_card_bean_bankcardlistresp_01),"bankLogo":"http://img.erbanyy.com/CEB.jpg","cardType":ResUtil.getString(R.string.bank_card_bean_bankcardlistresp_02)}] + * maxBindNum : 3 + */ + + private int maxBindNum; + private List list; +} diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/exception/NeedBindBankCardException.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/exception/NeedBindBankCardException.java new file mode 100644 index 0000000..3265b3c --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/exception/NeedBindBankCardException.java @@ -0,0 +1,13 @@ +package com.chwl.core.bank_card.exception; + +import com.chwl.core.exception.FailReasonException; + +/** + * Created by MadisonRong on 2019-08-16 + */ +public class NeedBindBankCardException extends FailReasonException { + + public NeedBindBankCardException(String message, int code) { + super(message, code); + } +} diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/model/BankCardModel.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/model/BankCardModel.java new file mode 100644 index 0000000..425d925 --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/model/BankCardModel.java @@ -0,0 +1,148 @@ +package com.chwl.core.bank_card.model; + +import com.chwl.core.Constants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bank_card.bean.BankCardListResp; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by MadisonRong on 2019-08-16 + */ +public class BankCardModel extends BaseModel implements IBankCardModel { + + private Api api; + + private BankCardModel() { + api = RxNet.create(Api.class); + } + + public static BankCardModel getInstance() { + return SingletonHolder.INSTANCE; + } + + @Override + public Single getBankCardList() { + return api.getBankCardList(String.valueOf(AuthModel.get().getCurrentUid()), + Constants.CHARGE_UNION_PAY) + .compose(RxHelper.handleCommon(BankCardListResp::new)); + } + + @Override + public Single getBindBankCardSmsCode(String bankCardNo, String bankMobile) { + return api.getBindBankCardSmsCode(String.valueOf(AuthModel.get().getCurrentUid()), bankCardNo, + bankMobile, Constants.CHARGE_UNION_PAY) + .compose(RxHelper.handleStringData()); + } + + @Override + public Single bindBankCard(String bankCardNo, String bankMobile, String smsCode) { + return api.bindBankCard(String.valueOf(AuthModel.get().getCurrentUid()), bankCardNo, + bankMobile, Constants.CHARGE_UNION_PAY, smsCode) + .compose(RxHelper.handleStringData()); + } + + @Override + public Single unbindBankCard(String recordId, String paymentPwd) { + return api.unbindBankCard(String.valueOf(AuthModel.get().getCurrentUid()), recordId, paymentPwd) + .compose(RxHelper.handleStringData()); + } + + @Override + public Single setDefaultBankCard(String recordId) { + return api.setDefaultBankCard(String.valueOf(AuthModel.get().getCurrentUid()), + recordId, Constants.CHARGE_UNION_PAY) + .compose(RxHelper.handleStringData()); + } + + private static class SingletonHolder { + private static final BankCardModel INSTANCE = new BankCardModel(); + } + + interface Api { + + /** + * 已绑定的银行卡列表 + * + * @param uid + * @param payChannel + * @return + */ + @GET("payment/bankCardSign/list") + public Single> getBankCardList(@Query("uid") String uid, + @Query("payChannel") String payChannel); + + /** + * 获取绑定银行卡时需要的验证码 + * + * @param uid + * @param bankCardNo 银行卡号 + * @param bankMobile 银行预留手机号 + * @param payChannel 支付渠道 + * {@link Constants#CHARGE_UNION_PAY} + * @return + */ + @GET("payment/bankCardSign/getSmsCode") + public Single> getBindBankCardSmsCode(@Query("uid") String uid, + @Query("bankCardNo") String bankCardNo, + @Query("bankMobile") String bankMobile, + @Query("payChannel") String payChannel); + + /** + * 绑定银行卡 + * + * @param uid + * @param bankCardNo 银行卡号 + * @param bankMobile 银行预留手机号 + * @param payChannel 支付渠道 + * {@link Constants#CHARGE_UNION_PAY} + * @param smsCode 短信验证码 + * @return + */ + @FormUrlEncoded + @POST("payment/bankCardSign/sign") + public Single> bindBankCard(@Field("uid") String uid, + @Field("bankCardNo") String bankCardNo, + @Field("bankMobile") String bankMobile, + @Field("payChannel") String payChannel, + @Field("smsCode") String smsCode); + + /** + * 解绑银行卡 + * + * @param uid + * @param recordId 签约记录id + * @param paymentPwd 支付密码 + * @return + */ + @FormUrlEncoded + @POST("payment/bankCardSign/release") + public Single> unbindBankCard(@Field("uid") String uid, + @Field("recordId") String recordId, + @Field("paymentPwd") String paymentPwd); + + /** + * 设置默认支付卡 + * + * @param uid + * @param recordId 签约记录id + * @param payChannel 支付渠道 + * {@link Constants#CHARGE_UNION_PAY} + * @return + */ + @FormUrlEncoded + @POST("payment/bankCardSign/setDefault") + public Single> setDefaultBankCard(@Field("uid") String uid, + @Field("recordId") String recordId, + @Field("payChannel") String payChannel); + } +} diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/model/IBankCardModel.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/model/IBankCardModel.java new file mode 100644 index 0000000..0c50ab5 --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/model/IBankCardModel.java @@ -0,0 +1,55 @@ +package com.chwl.core.bank_card.model; + +import com.chwl.core.bank_card.bean.BankCardListResp; +import com.chwl.core.base.IModel; + +import io.reactivex.Single; + +/** + * Created by MadisonRong on 2019-08-16 + */ +public interface IBankCardModel extends IModel { + + /** + * 获取已绑定的银行卡列表 + * + * @return + */ + public Single getBankCardList(); + + /** + * 获取绑定银行卡时需要的验证码 + * + * @param bankCardNo 银行卡号 + * @param bankMobile 银行预留手机号 + * @return + */ + public Single getBindBankCardSmsCode(String bankCardNo, String bankMobile); + + /** + * 绑定银行卡 + * + * @param bankCardNo 银行卡号 + * @param bankMobile 银行预留手机号 + * @param smsCode 短信验证码 + * @return + */ + public Single bindBankCard(String bankCardNo, String bankMobile, String smsCode); + + /** + * 获取绑定银行卡时需要的验证码 + * + * @param recordId 签约记录id + * @param paymentPwd 支付密码 + * @return + */ + public Single unbindBankCard(String recordId, String paymentPwd); + + /** + * 设置默认支付卡 + * + * @param recordId 签约记录id + * @return + */ + public Single setDefaultBankCard(String recordId); +} diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/view/IAddBankCardAgreementView.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/view/IAddBankCardAgreementView.java new file mode 100644 index 0000000..4bc2638 --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/view/IAddBankCardAgreementView.java @@ -0,0 +1,47 @@ +package com.chwl.core.bank_card.view; + +import com.chwl.library.base.IMvpBaseView; + +/** + * Created by MadisonRong on 2019-08-19 + */ +public interface IAddBankCardAgreementView extends IMvpBaseView { + + /** + * 跳转到实名认证页面 + */ + default void goToRealNamePage() { + } + + /** + * 跳转到支付密码页 + */ + default void openPaymentPasswordPage() { + } + + /** + * 跳转到设置支付密码页 + */ + default void goToSetPasswordActivity() { + } + + /** + * 跳转到绑定手机页面 + */ + default void goToBindPhoneActivity() { + } + + /** + * 跳转到绑定银行卡页面 + */ + default void goToAddBankCardPage() { + } + + /** + * 提示错误 + * + * @param error + */ + default void displayError(String error) { + } +} diff --git a/core/src/model_bank_card/java/com/chwl/core/bank_card/view/IBankCardView.java b/core/src/model_bank_card/java/com/chwl/core/bank_card/view/IBankCardView.java new file mode 100644 index 0000000..07988e9 --- /dev/null +++ b/core/src/model_bank_card/java/com/chwl/core/bank_card/view/IBankCardView.java @@ -0,0 +1,48 @@ +package com.chwl.core.bank_card.view; + +import com.chwl.core.bank_card.bean.BankCardListResp; +import com.chwl.library.base.IMvpBaseView; + +/** + * Created by MadisonRong on 2019-08-16 + */ +public interface IBankCardView extends IMvpBaseView { + + /** + * 获取银行卡列表成功 + * + * @param bankCardListResp + */ + default void onGetBankCardSuccess(BankCardListResp bankCardListResp) { + } + + /** + * 发送错误时 + * + * @param code + * @param error + */ + default void onError(int code, String error) { + } + + /** + * 绑定银行卡成功 + */ + default void onBindBankCardSuccess() { + } + + /** + * 解绑银行卡成功 + */ + default void onUnbindBankCardSuccess() { + } + + /** + * 设置默认支付银行成功 + */ + default void onSetDefaultSuccess(int position) { + } + + default void onGetSmsCodeSuccess() { + } +} diff --git a/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/ChannelPageInfo.java b/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/ChannelPageInfo.java new file mode 100644 index 0000000..e9ef98d --- /dev/null +++ b/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/ChannelPageInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.channel_page.bean; + +import lombok.Data; + +/** + * + * Created by lvzebiao on 2020/2/26. + */ +@Data +public class ChannelPageInfo { + + private int routeType; + + private String routeValue; + +} diff --git a/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/HelloMessageInfo.kt b/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/HelloMessageInfo.kt new file mode 100644 index 0000000..601fad7 --- /dev/null +++ b/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/HelloMessageInfo.kt @@ -0,0 +1,9 @@ +package com.chwl.core.channel_page.bean + +import java.io.Serializable + +data class HelloMessageInfo( + val roomPopup: Boolean = false, + val sayHelloUserAvatarList: List? = null, + val sayHelloUserNum: Int = 0, +) : Serializable \ No newline at end of file diff --git a/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/NewUserHelloInfo.kt b/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/NewUserHelloInfo.kt new file mode 100644 index 0000000..fa5eba2 --- /dev/null +++ b/core/src/model_channel_page/java/com/chwl/core/channel_page/bean/NewUserHelloInfo.kt @@ -0,0 +1,13 @@ +package com.chwl.core.channel_page.bean + +import java.io.Serializable + +data class NewUserHelloInfo( + val roomUid: Long = 0L, + val sayHello: Boolean = false, + val sayHelloMsg: String = "", + val sayHelloUserUid: Long = 0L, + val sayHelloUserAvatar: String = "", + val sayHelloUserErbanNo: Int = 0, + val sayHelloUserNickname: String = "" +) : Serializable \ No newline at end of file diff --git a/core/src/model_channel_page/java/com/chwl/core/channel_page/model/ChannelPageModel.java b/core/src/model_channel_page/java/com/chwl/core/channel_page/model/ChannelPageModel.java new file mode 100644 index 0000000..b89ff3f --- /dev/null +++ b/core/src/model_channel_page/java/com/chwl/core/channel_page/model/ChannelPageModel.java @@ -0,0 +1,183 @@ +package com.chwl.core.channel_page.model; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.channel_page.bean.ChannelPageInfo; +import com.chwl.core.channel_page.bean.HelloMessageInfo; +import com.chwl.core.channel_page.bean.NewUserHelloInfo; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.user.bean.InviteUserInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.NetworkUtils; +import com.chwl.library.utils.config.BasicConfig; + +import io.reactivex.Single; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * 渠道落地页的处理 + * 主要考虑三种情况 + * 1、普通情况下进来APP + * 2、闪屏跳转下的冲突 + * 3、linkedme跳转下的冲突 + *

+ * Created by lvzebiao on 2020/2/26. + */ + +public class ChannelPageModel extends BaseModel implements IChannelPageModel { + + private final Api api = RxNet.create(Api.class); + + public final static String KEY_FLAG_VALID_CHANNEL_PAGE = "flag_valid_channel_page"; + + private static final class Helper { + public static final ChannelPageModel INSTANCE = new ChannelPageModel(); + } + + public static ChannelPageModel get() { + return Helper.INSTANCE; + } + + private ChannelPageModel() { + } + + @Override + public Single getChannelPage() { + return api.apiGetChannelPage() + .flatMap(result -> { + if (result.isSuccess()) { + //把routerType=0的情况也考虑进去,当0的时候,也处理为空的情况 + //满足陈金林的骚操作,添加渠道,但不设置落地页 + if (result.getData() != null && result.getData().getRouteType() != 0) { + return Single.just(result.getData()); + } + } + return Single.error(new Throwable("empty channelpageinfo or connect failed")); + }); + } + + + @Override + public Single checkInviteUserInRoom(String inviteCode) { + return api.checkInviteUserInRoom(inviteCode) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single checkNewUserInRoom() { + return api.checkNewUserInRoom() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single checkHelloMessage() { + return api.checkHelloMessage(AvRoomDataManager.get().getRoomUid()) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchAndExce()); + } + + /** + * + */ + + @Override + public void checkAd() { + + if (BasicConfig.INSTANCE.isKwaiChannel()) { + checkKwaiAd("1"); + } + + if (BasicConfig.INSTANCE.isByteDanceChannel()) { + checkByteDanceAd("0"); + } + } + + /** + * @param evenType 暂时只有0 + */ + + @Override + public void checkByteDanceAd(String evenType) { + try { + api.checkByteDanceAd(evenType, + NetworkUtils.getIPAddress(BasicConfig.INSTANCE.getAppContext()), + System.getProperty("http.agent")) + .compose(RxHelper.handleSchedulers()) + .subscribe(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * @param evenType 暂时只有0 + */ + + @Override + public void checkKwaiAd(String evenType) { + try { + api.checkKwaiAd(evenType, + NetworkUtils.getIPAddress(BasicConfig.INSTANCE.getAppContext()), + System.getProperty("http.agent")) + .compose(RxHelper.handleSchedulers()) + .subscribe(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private interface Api { + + /** + * 获取渠道分发配置 + */ + @GET("/channel/distribute/get") + Single> apiGetChannelPage(); + + /** + * 填了邀请码用户检查改邀请码用户有没有在房间 在的话就跳转进房间 + */ + @GET("/user/v2/checkInviteUserInRoom") + Single> checkInviteUserInRoom(@Query("inviteCode") String inviteCode); + + /** + * 新用户推荐房间弹窗 + */ + @GET("/newUserStart/indexSayHello") + Single> checkNewUserInRoom(); + + /** + * 新用户推荐房间进入房间后收到消息提示弹窗 + */ + @GET("/newUserStart/roomSayHello") + Single> checkHelloMessage(@Query("roomUid") Long roomUid); + + /** + * 字节跳动推广接口 + */ + @FormUrlEncoded + @POST("/juliang/ad/activeTrack") + Single> checkByteDanceAd( + @Field("evenType") String evenType, + @Field("ip") String ip, + @Field("ua") String ua); + + /** + * 快手推广接口 + */ + @FormUrlEncoded + @POST("/kuaishouAd/activeTrack") + Single> checkKwaiAd( + @Field("evenType") String evenType, + @Field("ip") String ip, + @Field("ua") String ua); + } + +} diff --git a/core/src/model_channel_page/java/com/chwl/core/channel_page/model/IChannelPageModel.java b/core/src/model_channel_page/java/com/chwl/core/channel_page/model/IChannelPageModel.java new file mode 100644 index 0000000..7ec3bdb --- /dev/null +++ b/core/src/model_channel_page/java/com/chwl/core/channel_page/model/IChannelPageModel.java @@ -0,0 +1,29 @@ +package com.chwl.core.channel_page.model; + +import com.chwl.core.channel_page.bean.ChannelPageInfo; +import com.chwl.core.channel_page.bean.HelloMessageInfo; +import com.chwl.core.channel_page.bean.NewUserHelloInfo; +import com.chwl.core.user.bean.InviteUserInfo; + +import io.reactivex.Single; + +/** + * Created by lvzebiao on 2020/2/26. + */ + +public interface IChannelPageModel { + + Single getChannelPage(); + + Single checkInviteUserInRoom(String inviteCode); + + Single checkNewUserInRoom(); + + Single checkHelloMessage(); + + void checkAd(); + + void checkByteDanceAd(String evenType); + + void checkKwaiAd(String evenType); +} diff --git a/core/src/model_community/java/com/chwl/core/community/CommunityConstant.java b/core/src/model_community/java/com/chwl/core/community/CommunityConstant.java new file mode 100644 index 0000000..5c9068f --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/CommunityConstant.java @@ -0,0 +1,19 @@ +package com.chwl.core.community; + +/** + * 社区模块的一些常量定义 + * create by lvzebiao @2020/1/8 + */ +public class CommunityConstant { + + /** + * 版本有效的动态类型 + */ + public static final String VERSION_VALID_TYPE = "0,2"; + + /** + * 动态列表一页的记录数 + */ + public static final int DYNAMIC_PAGE_SIZE = 10; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/IPublishModel.java b/core/src/model_community/java/com/chwl/core/community/IPublishModel.java new file mode 100644 index 0000000..cdd414a --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/IPublishModel.java @@ -0,0 +1,19 @@ +package com.chwl.core.community; + +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.core.community.bean.PublishBody; + +import java.util.List; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2019/11/12 + */ +public interface IPublishModel { + + + Single publish(PublishBody body); + Single> squareWorld(byte type, int page, int pageSize); + +} diff --git a/core/src/model_community/java/com/chwl/core/community/ImageUploadConfig.java b/core/src/model_community/java/com/chwl/core/community/ImageUploadConfig.java new file mode 100644 index 0000000..b857c2b --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/ImageUploadConfig.java @@ -0,0 +1,22 @@ +package com.chwl.core.community; + +/** + * 动态上传的一些配置 + * create by lvzebiao @2019/11/20 + */ +public class ImageUploadConfig { + + /** + * 最大上传的文件大小,超过则进入压缩算法 + */ + public static final long MAX_FILE_SIZE = 2 * 1024 * 1024; + /** + * 期望压缩的质量大小 + */ + public static final long EXPECT_COMPRESS_SIZE = 500 * 1024; + /** + * 分辨率压缩的期望像素值 + */ + public static final int EXPECT_MIN_WIDTH = 1000; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/PublishModel.java b/core/src/model_community/java/com/chwl/core/community/PublishModel.java new file mode 100644 index 0000000..953d314 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/PublishModel.java @@ -0,0 +1,75 @@ +package com.chwl.core.community; + +import com.google.gson.JsonElement; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.core.community.bean.PublishBody; +import com.chwl.core.community.event.DynamicPublishEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import org.greenrobot.eventbus.EventBus; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * create by lvzebiao @2019/11/12 + */ +public class PublishModel extends BaseModel implements IPublishModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final PublishModel INSTANCE = new PublishModel(); + } + + public static PublishModel get() { + return Helper.INSTANCE; + } + + @Override + public Single publish(PublishBody body) { + LogUtil.print("log body:", body); + return api.apiPublish(body) + .compose(RxHelper.handleIgnoreData()) + .doOnSuccess(s -> EventBus.getDefault().post(new DynamicPublishEvent())); + } + + @Override + public Single> squareWorld(byte type, int page, int pageSize) { + return api.squareWorld(type, page, pageSize).compose(RxHelper.handleSchAndExce()) + .flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> listServiceResult) throws Exception { + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + } + }); + } + + private interface Api { + + /** + * 接口有自动加入话题功能 + */ + @POST("dynamic/square/publish") + Single> apiPublish(@Body PublishBody body); + + @GET("dynamic/square/world") + Single>> squareWorld(@Query("type") byte type, @Query("page") int page, @Query("pageSize") int pageSize); + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java b/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java new file mode 100644 index 0000000..11199c3 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java @@ -0,0 +1,42 @@ +package com.chwl.core.community.attachment; + +import androidx.annotation.Keep; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; + +@Keep +public class DynamicSysAttachment extends CustomAttachment { + private ErbanSysMsgInfo erbanSysMsgInfo; + + public ErbanSysMsgInfo getErbanSysMsgInfo() { + return erbanSysMsgInfo; + } + + public void setErbanSysMsgInfo(ErbanSysMsgInfo erbanSysMsgInfo) { + this.erbanSysMsgInfo = erbanSysMsgInfo; + } + + public DynamicSysAttachment(int second) { + super(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC, second); + } + @Override + protected void parseData(JSONObject data) { + erbanSysMsgInfo = new Gson().fromJson(data.toJSONString(), ErbanSysMsgInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(erbanSysMsgInfo); + return JSONObject.parseObject(jsonStr); + } + + @Override + public String toString() { + return "DynamicSysAttachment{" + + "erbanSysMsgInfo=" + erbanSysMsgInfo + + '}'; + } +} diff --git a/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java b/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java new file mode 100644 index 0000000..6934f76 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java @@ -0,0 +1,60 @@ +package com.chwl.core.community.attachment; + +import androidx.annotation.Keep; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; + +@Keep +public class UnReadCountAttachment extends CustomAttachment { + + private int total; + private int like; + private int comment; + private int share; + private String avatar; + private int reply; + + public UnReadCountAttachment() { + super(CustomAttachment.CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC, CustomAttachment.CUSTOM_DYNAMTC_UNREADCOUNT); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + + if (data.containsKey("total")) { + total = data.getIntValue("total"); + } + + if (data.containsKey("like")) { + like = data.getIntValue("like"); + } + + if (data.containsKey("comment")) { + comment = data.getIntValue("comment"); + } + + if (data.containsKey("share")) { + share = data.getIntValue("share"); + } + + if (data.containsKey("avatar")) { + avatar = data.getString("avatar"); + } + + if (data.containsKey("reply")) { + reply = data.getIntValue("reply"); + } + + } + + @Override + protected JSONObject packData() { + return super.packData(); + } + + public int getTotal() { + return total; + } +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/Comment.java b/core/src/model_community/java/com/chwl/core/community/bean/Comment.java new file mode 100644 index 0000000..9717fb1 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/Comment.java @@ -0,0 +1,92 @@ +package com.chwl.core.community.bean; + +import com.chwl.core.community.bean.comment.Reply; +import com.chwl.core.community.bean.comment.ReplyResult; +import com.chwl.core.vip.bean.UserVipInfo; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/11/26 + */ +@Setter +@Getter +public class Comment { + + private long commentId; + private long uid; + private long dynamicId; + private String nick; + private String communityAvatar; + private String avatar; + private String content; + private String imageUrl; + private long publishTime; + private boolean owner; + private int age; + private int gender; + private int type; + private int uploadFlag; + private ReplyResult replyInfo; + private String toCommunityNick; + private long toUid; + private long parentId; + private long createTime; + /** + * ture 表示楼主标识 + */ + private boolean landLordFlag; + + private String cacheNextReplyId; + + private UserVipInfo userVipInfoVO; + + public boolean isEmptyReply() { + return replyInfo == null || ListUtils.isListEmpty(replyInfo.getReplyList()); + } + + public List getReplyList() { + List list = null; + if (replyInfo != null) { + list = replyInfo.getReplyList(); + } + if (list == null) { + list = new ArrayList<>(); + } + return list; + } + + public Reply getItemReply(int replyPos) { + if (replyInfo != null) { + List list = replyInfo.getReplyList(); + if (!ListUtils.isListEmpty(list) && replyPos >= 0 && replyPos < list.size()) { + return list.get(replyPos); + } + } + return null; + } + + public void addReply(Reply reply) { + if (replyInfo == null) { + replyInfo = new ReplyResult(); + } + List list = replyInfo.getReplyList(); + if (list == null) { + list = new ArrayList<>(); + } + list.add(reply); + } + + public ReplyResult getReplyInfo() { + if (replyInfo == null) { + replyInfo = new ReplyResult(); + } + return replyInfo; + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/CommentResult.java b/core/src/model_community/java/com/chwl/core/community/bean/CommentResult.java new file mode 100644 index 0000000..324b19c --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/CommentResult.java @@ -0,0 +1,17 @@ +package com.chwl.core.community.bean; + +import java.util.List; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/26 + */ +@Data +public class CommentResult { + + private List commentList; + + private long nextTimestamp; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/CommunityNoticeInfo.java b/core/src/model_community/java/com/chwl/core/community/bean/CommunityNoticeInfo.java new file mode 100644 index 0000000..f3a6257 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/CommunityNoticeInfo.java @@ -0,0 +1,37 @@ +package com.chwl.core.community.bean; + +import lombok.Data; + +@Data +public class CommunityNoticeInfo { + private long uid; + private String nick; + private String avatar; + private int gender; // 1-男 2-女 + private int age; + private int type; // 类型, 0-纯文本 1-语音 2-图片 3-视频 + private long worldId; // 世界id + private long targetUid; // 目标用户id + private String content; // 动态内容 + private long dynamicId; // 动态id + private int actionType; // 动作类型 1-评论 2-回复 3-点赞 TODO 分享? + private String commentContent; // 评论内容 + private long commentId; // 评论id + private String actionDesc; // 动作描述(预备字段) + private int status; // 状态 0-未读 1-已读 + private int isDelete; // 是否删除 0-未删除 1-已删除 + // 时间 + private String worldName;// 话题名称 + private String message; + private long publishTime; + private DynamicMedia dynamicRes; + private long msgId; + + public boolean isMale() { + return gender == 1; + } + + public boolean isShowAge() { + return age > 0; + } +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/DyChangeData.java b/core/src/model_community/java/com/chwl/core/community/bean/DyChangeData.java new file mode 100644 index 0000000..74b7697 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/DyChangeData.java @@ -0,0 +1,15 @@ +package com.chwl.core.community.bean; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/19 + */ +@Data +public class DyChangeData { + + private int likeCount; + + private boolean like; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/DynamicMedia.java b/core/src/model_community/java/com/chwl/core/community/bean/DynamicMedia.java new file mode 100644 index 0000000..c5aa400 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/DynamicMedia.java @@ -0,0 +1,71 @@ +package com.chwl.core.community.bean; + +import android.text.TextUtils; + +import androidx.annotation.Keep; + +import kotlin.jvm.Transient; +import lombok.Data; + +/** + * create by lvzebiao @2019/11/21 + */ +@Keep +@Data +public class DynamicMedia { + + + /** + * resUrl : http://1t.click/bjZW + * resDuration : 0 + * cover : + * format : jpeg + * width : 1280 + * height : 853 + */ + + private String resUrl; + private long resDuration; + private String cover; + private String format; + private int width; + private int height; + @Transient + private String localFilePath; + public String getLocalFilePath() { + return localFilePath; + } + + public void setLocalFilePath(String localFilePath) { + this.localFilePath = localFilePath; + } + + /** + * 是否是网络图片 + * @return - + */ + public boolean isNetImage() { + try { + return resUrl != null && resUrl.startsWith("http"); + } catch (Exception ex) { + ex.printStackTrace(); + } + return false; + } + + public boolean isJpgOrPng() { + if (TextUtils.isEmpty(format)) { + return false; + } + return format.toLowerCase().equals("jpeg") || format.toLowerCase().equals("jpg") + || format.toLowerCase().equals("png"); + } + + public boolean isGif() { + if (TextUtils.isEmpty(format)) { + return false; + } + return format.toLowerCase().equals("gif"); + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/MiniWorldChooseInfo.java b/core/src/model_community/java/com/chwl/core/community/bean/MiniWorldChooseInfo.java new file mode 100644 index 0000000..c7c0fa1 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/MiniWorldChooseInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.community.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class MiniWorldChooseInfo implements Serializable { + private long worldId; + private String worldName; + private boolean inWorld; + + private String icon; + private String description; +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/PublishBody.java b/core/src/model_community/java/com/chwl/core/community/bean/PublishBody.java new file mode 100644 index 0000000..ffe7ad9 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/PublishBody.java @@ -0,0 +1,37 @@ +package com.chwl.core.community.bean; + + +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/21 + */ +@Data +public class PublishBody { + + + /** + * uid : 909768 + * worldId : 63 + * type : 2 + * content : 234234 + * resList : [{"resUrl":"http://1t.click/bjZW","resDuration":0,"cover":"","format":"jpeg","width":1280,"height":853}] + */ + + private long uid; + private Long worldId; + private int type; + private String content; + private List resList; + + public void addDynamicMedia(DynamicMedia index) { + if (resList == null) { + resList = new ArrayList<>(); + } + resList.add(index); + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/PublishItem.java b/core/src/model_community/java/com/chwl/core/community/bean/PublishItem.java new file mode 100644 index 0000000..f9a3105 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/PublishItem.java @@ -0,0 +1,81 @@ +package com.chwl.core.community.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/11/11 + */ +@AllArgsConstructor +@Setter +@Getter +public class PublishItem implements Parcelable { + + /**添加类型,用于显示添加图片、动图之类*/ + public final static int BUTTON_TYPE_ADD_ITEM = 1; + /**显示图片*/ + public final static int BUTTON_TYPE_SHOW_PIC = 2; + + private long id; + + private int buttonType; + + private String path; + /** + * 0 普通图片 1 gif 图 + */ + private int fileTag; + + @Override + public boolean equals(Object obj) { + if (obj instanceof PublishItem) { + PublishItem tmp = (PublishItem) obj; + return id == tmp.getId(); + } + return false; + } + + public boolean isAddItem() { + return buttonType == BUTTON_TYPE_ADD_ITEM; + } + + public boolean isGif() { + return fileTag == 1; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(this.id); + dest.writeInt(this.buttonType); + dest.writeString(this.path); + dest.writeInt(this.fileTag); + } + + protected PublishItem(Parcel in) { + this.id = in.readLong(); + this.buttonType = in.readInt(); + this.path = in.readString(); + this.fileTag = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public PublishItem createFromParcel(Parcel source) { + return new PublishItem(source); + } + + @Override + public PublishItem[] newArray(int size) { + return new PublishItem[size]; + } + }; +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/UnReadCountInfo.java b/core/src/model_community/java/com/chwl/core/community/bean/UnReadCountInfo.java new file mode 100644 index 0000000..ea5d4f1 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/UnReadCountInfo.java @@ -0,0 +1,61 @@ +package com.chwl.core.community.bean; + +import java.io.Serializable; + + +public class UnReadCountInfo implements Serializable { + + /** + * comment : 0 + * share : 0 + * total : 198 + * reply : 0 + * like : 198 + */ + + private int comment; + private int share; + private int total; + private int reply; + private int like; + + public int getComment() { + return comment; + } + + public void setComment(int comment) { + this.comment = comment; + } + + public int getShare() { + return share; + } + + public void setShare(int share) { + this.share = share; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getReply() { + return reply; + } + + public void setReply(int reply) { + this.reply = reply; + } + + public int getLike() { + return like; + } + + public void setLike(int like) { + this.like = like; + } +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/UserDynamicItem.java b/core/src/model_community/java/com/chwl/core/community/bean/UserDynamicItem.java new file mode 100644 index 0000000..6d744de --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/UserDynamicItem.java @@ -0,0 +1,70 @@ +package com.chwl.core.community.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; + +public class UserDynamicItem implements MultiItemEntity, Parcelable, Serializable { + public static final transient byte TYPE_FIRST_DIVIDER = 3; + public static final transient byte TYPE_DYNAMIC = (byte) 1;// 动态 + public static final transient byte TYPE_EMPTY = (byte) 2; // empty + + //类型 + private byte itemType; + + //正常数据 + private T data; + + public UserDynamicItem(byte itemType) { + this(itemType, null); + } + + public UserDynamicItem(byte itemType, T data) { + this.itemType = itemType; + this.data = data; + } + + protected UserDynamicItem(Parcel in) { + itemType = in.readByte(); + data = (T) in.readSerializable(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public UserDynamicItem createFromParcel(Parcel in) { + return new UserDynamicItem(in); + } + + @Override + public UserDynamicItem[] newArray(int size) { + return new UserDynamicItem[size]; + } + }; + + @Override + public int getItemType() { + return itemType; + } + + public void setData(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte(itemType); + dest.writeSerializable(data); + } +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicBean.java b/core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicBean.java new file mode 100644 index 0000000..a512882 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicBean.java @@ -0,0 +1,109 @@ +package com.chwl.core.community.bean; + + +import android.text.TextUtils; + +import androidx.annotation.Keep; + +import com.chwl.core.user.bean.BaseUserInfo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/11/13 + */ +@Keep +@Setter +@Getter +public class WorldDynamicBean extends BaseUserInfo implements Serializable { + + public final static int TYPE_ONLY_TEXT = 0; + + public final static int TYPE_IMAGE = 2; + + private int type; + + private List imageUrl; + + private List dynamicResList; + + private String content; + + /**点赞数*/ + private int likeCount; + /**是否点赞过*/ + private boolean isLike; + + private long dynamicId; + + private int commentCount; + + private long publishTime; + + private long worldUid; + + private long worldId; + /** 动态状态,0-审核中,1-审核通过*/ + private int status; + /**是否首帖*/ + private boolean isFirstDynamic; + + private String worldName; + + private boolean inWorld; + + // 个人页接口返回数据 + private String tag; // 话题名称 + private int playCount; // 语音播放次数 + private int voiceId; // 语音id + // 个人页接口返回数据 + + private List labelList; + private int squareTop; + private int topicTop; + + @Override + public boolean equals(Object obj) { + if (obj instanceof WorldDynamicBean) { + WorldDynamicBean objBean = (WorldDynamicBean) obj; + return this.dynamicId == objBean.getDynamicId(); + } + return false; + } + + public boolean isTextOrImageItem() { + return type == TYPE_ONLY_TEXT || type == TYPE_IMAGE; + } + + public String getShareCover() { + String imageUrl = getAvatar(); + if (dynamicResList == null) { + dynamicResList = new ArrayList<>(); + } + for (DynamicMedia media : dynamicResList) { + if (media != null && !TextUtils.isEmpty(media.getResUrl()) && media.isJpgOrPng()) { + imageUrl = media.getResUrl(); + break; + } + } + return imageUrl; + } + + public boolean isSystemDynamic() { + return type == 5; + } + + /** + * 是否审核中 + * @return - + */ + public boolean isChecking() { + return status != 1; + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicListResult.java b/core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicListResult.java new file mode 100644 index 0000000..ba55006 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/WorldDynamicListResult.java @@ -0,0 +1,19 @@ +package com.chwl.core.community.bean; + +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/11/13 + */ +@Setter +@Getter +public class WorldDynamicListResult { + + private List dynamicList; + + private long nextDynamicId; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/comment/PopupParams.java b/core/src/model_community/java/com/chwl/core/community/bean/comment/PopupParams.java new file mode 100644 index 0000000..4d07b8b --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/comment/PopupParams.java @@ -0,0 +1,29 @@ +package com.chwl.core.community.bean.comment; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/27 + */ +@Data +public class PopupParams { + + private String copyContent; + /** + * 评论或者回复发表人 + */ + private long commentOwnerUid; + + private int groupPostion; + + private int childPosition; + /** + * 1 评论的弹窗,2 回复的弹窗 + */ + private int type; + /** + * 传 评论 / 回复 id + */ + private long deteleId; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/comment/Reply.java b/core/src/model_community/java/com/chwl/core/community/bean/comment/Reply.java new file mode 100644 index 0000000..3727d12 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/comment/Reply.java @@ -0,0 +1,38 @@ +package com.chwl.core.community.bean.comment; + +import com.chwl.core.vip.bean.UserVipInfo; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/27 + */ +@Data +public class Reply { + + private String avatar; + private String nick; + private String content; + private long uid; + + private long dynamicId; + + private long replyId; + + private long toCommentId; + + private String toAvatar; + private String toNick; + private long toUid; + private long publishTime; + + private boolean landLordFlag; + + private long parentId; + + private int replyCount; + + private UserVipInfo userVipInfoVO; + + +} diff --git a/core/src/model_community/java/com/chwl/core/community/bean/comment/ReplyResult.java b/core/src/model_community/java/com/chwl/core/community/bean/comment/ReplyResult.java new file mode 100644 index 0000000..be27a2c --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/bean/comment/ReplyResult.java @@ -0,0 +1,29 @@ +package com.chwl.core.community.bean.comment; + +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/27 + */ +@Data +public class ReplyResult { + /** + * 下一次的回复id + */ + private long nextTimestamp; + + private int leftCount; + + private List replyList; + + public List getReplyList() { + if (replyList == null) { + replyList = new ArrayList<>(); + } + return replyList; + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/dynamic/DynamicDetailModel.java b/core/src/model_community/java/com/chwl/core/community/dynamic/DynamicDetailModel.java new file mode 100644 index 0000000..9f1fe4c --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/dynamic/DynamicDetailModel.java @@ -0,0 +1,115 @@ +package com.chwl.core.community.dynamic; + +import com.google.gson.JsonElement; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.bean.CommentResult; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.bean.comment.Reply; +import com.chwl.core.community.bean.comment.ReplyResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * create by lvzebiao @2019/11/26 + */ +public class DynamicDetailModel extends BaseModel implements IDynamicDetailModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final DynamicDetailModel INSTANCE = new DynamicDetailModel(); + } + + public static DynamicDetailModel get() { + return Helper.INSTANCE; + } + + public Single getDetail(long dynamicId, long worldId) { + return api.apiGetDynamicDetail(AuthModel.get().getCurrentUid(), dynamicId, worldId) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single getCommentList(long dynamicId, String commentId, int pageSize) { + return api.apiGetCommentList(AuthModel.get().getCurrentUid(), dynamicId, commentId, pageSize) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single publishComment(long dynamicId, String content) { + return api.apiPublishComment(AuthModel.get().getCurrentUid(), dynamicId, content) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single reply(long dynamicId, long commentId, String content) { + return api.apiCommentReply(AuthModel.get().getCurrentUid(), dynamicId, commentId, content) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single getReplyList(long dynamicId, long commentId, int pageSize, String timestamp) { + return api.apiGetReplyList(AuthModel.get().getCurrentUid(), dynamicId, pageSize, commentId, timestamp) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single deleteComment(long commentId) { + return api.apiDeleteComment(AuthModel.get().getCurrentUid(), commentId) + .compose(RxHelper.handleIgnoreData()); + } + + private interface Api { + + @GET("dynamic/detail") + Single> apiGetDynamicDetail( + @Query("uid") long uid, + @Query("dynamicId") long dynamicId, + @Query("worldId") long worldId); + + /** + * @param timestamp 查询记录的时间戳 + */ + @GET("/dynamic/comment/list") + Single> apiGetCommentList(@Query("uid") long uid, + @Query("dynamicId") long dynamicId, + @Query("timestamp") String timestamp, + @Query("pageSize") int pageSize); + + @POST("/dynamic/comment/publish") + Single> apiPublishComment(@Query("uid") long uid, + @Query("dynamicId") long dynamicId, + @Query("content") String content); + + @POST("/dynamic/comment/reply") + Single> apiCommentReply(@Query("uid") long uid, + @Query("dynamicId") long dynamicId, + @Query("commentId") long commentId, + @Query("content") String content); + + @GET("/dynamic/comment/reply/list") + Single> apiGetReplyList(@Query("uid") long uid, + @Query("dynamicId") long dynamicId, + @Query("pageSize") int pageSize, + @Query("commentId") long commentId, + @Query("timestamp") String timestamp); + + /** + * @param uid - + * @param commentId 评论/回复id (commentId或replyId) + * @return - + */ + @POST("/dynamic/comment/delete") + Single> apiDeleteComment(@Query("uid") long uid, + @Query("commentId") long commentId); + + + } +} diff --git a/core/src/model_community/java/com/chwl/core/community/dynamic/DynamicModel.java b/core/src/model_community/java/com/chwl/core/community/dynamic/DynamicModel.java new file mode 100644 index 0000000..77196f1 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/dynamic/DynamicModel.java @@ -0,0 +1,135 @@ +package com.chwl.core.community.dynamic; + +import com.google.gson.JsonElement; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.CommunityConstant; +import com.chwl.core.community.bean.WorldDynamicListResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * create by lvzebiao @2019/11/13 + */ +public class DynamicModel extends BaseModel implements IDynamicModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final DynamicModel INSTANCE = new DynamicModel(); + } + + public static DynamicModel get() { + return Helper.INSTANCE; + } + + @Override + public Single getDynamicList(int page,long worldId, String dynamicId) { + //此版本仅支持图文 固定传0,2 + return api.apiGetDynamicList(AuthModel.get().getCurrentUid(), worldId, dynamicId, page,10, CommunityConstant.VERSION_VALID_TYPE) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single getLatestDynamicList(long worldId, String dynamicId) { + //此版本仅支持图文 固定传0,2 + return api.apiGetLatestDynamicList(AuthModel.get().getCurrentUid(), worldId, dynamicId, 10, CommunityConstant.VERSION_VALID_TYPE) + .compose(RxHelper.handleCommon()); + } + + /** + * @param likedUid 被赞用户uid + * @param status 状态,0-取消赞,1-赞 + * @param event 1-话题客态页 2-个人主页 3-动态详情 4-动态广场 + * @return - + */ + @Override + public Single like(long worldId, long dynamicId, long likedUid, int status, int event) { + return api.apiLike(AuthModel.get().getCurrentUid(), worldId, dynamicId, likedUid, status) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single delete(long worldId, long dynamicId) { + return api.apiDelete(AuthModel.get().getCurrentUid(), worldId, dynamicId) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single reportShare(long uid, long worldId, long dynamicId) { + return api.apiShare(uid, worldId, dynamicId, AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleIgnoreData()); + } + + private interface Api { + + /** + *推荐 + * @param dynamicId 动态id,本次从该id开始取(不包括当前id对应的记录),不传从最新开始取 + * @return - + */ + //@POST("dynamic/list") + @POST("dynamic/listV2") + Single> apiGetDynamicList( + @Query("uid") long uid, + @Query("worldId") long worldId, + @Query("dynamicId") String dynamicId, + @Query("page") int page, + @Query("pageSize") int pageSize, + @Query("types") String types); + + /** + *最新 + * @param dynamicId 动态id,本次从该id开始取(不包括当前id对应的记录),不传从最新开始取 + * @return - + */ + @POST("dynamic/latestList") + Single> apiGetLatestDynamicList( + @Query("uid") long uid, + @Query("worldId") long worldId, + @Query("dynamicId") String dynamicId, + @Query("pageSize") int pageSize, + @Query("types") String types); + + /** + * @param likedUid 被赞用户uid + * @param status 状态,0-取消赞,1-赞 + * @return - + */ + @POST("dynamic/like") + Single> apiLike( + @Query("uid") long uid, + @Query("worldId") long worldId, + @Query("dynamicId") long dynamicId, + @Query("likedUid") long likedUid, + @Query("status") int status); + + /** + * @return - + */ + @POST("dynamic/delete") + Single> apiDelete( + @Query("uid") long uid, + @Query("worldId") long worldId, + @Query("dynamicId") long dynamicId); + + /** + * @param uid 被分享的人uid + * @param shareUid 分享的人uid + * @return - + */ + @POST("dynamic/share") + Single> apiShare( + @Query("uid") long uid, + @Query("worldId") long worldId, + @Query("dynamicId") long dynamicId, + @Query("shareUid") long shareUid); + + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicDetailModel.java b/core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicDetailModel.java new file mode 100644 index 0000000..4167373 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicDetailModel.java @@ -0,0 +1,27 @@ +package com.chwl.core.community.dynamic; + +import com.chwl.core.community.bean.CommentResult; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.bean.comment.Reply; +import com.chwl.core.community.bean.comment.ReplyResult; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2019/11/26 + */ +public interface IDynamicDetailModel { + + Single getDetail(long dynamicId, long worldId); + + Single getCommentList(long dynamicId, String timestamp, int pageSize); + + Single publishComment(long dynamicId, String content); + + Single reply(long dynamicId, long commentId, String content); + + Single getReplyList(long dynamicId, long commentId, int pageSize, String timestamp); + + Single deleteComment(long commentId); + +} diff --git a/core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicModel.java b/core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicModel.java new file mode 100644 index 0000000..4e9237f --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/dynamic/IDynamicModel.java @@ -0,0 +1,22 @@ +package com.chwl.core.community.dynamic; + +import com.chwl.core.community.bean.WorldDynamicListResult; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2019/11/13 + */ +public interface IDynamicModel { + + Single getDynamicList(int page,long worldId, String dynamicId); + + Single getLatestDynamicList(long worldId, String dynamicId); + + Single like(long worldId, long dynamicId, long likedUid, int status, int event); + + Single delete(long worldId, long dynamicId); + + Single reportShare(long uid, long worldId, long dynamicId); + +} diff --git a/core/src/model_community/java/com/chwl/core/community/event/DynamicDetailFinishEvent.java b/core/src/model_community/java/com/chwl/core/community/event/DynamicDetailFinishEvent.java new file mode 100644 index 0000000..765768a --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/event/DynamicDetailFinishEvent.java @@ -0,0 +1,22 @@ +package com.chwl.core.community.event; + +import com.chwl.core.community.bean.WorldDynamicBean; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * 详情页关闭,发出事件,并且回传数据 + * create by lvzebiao @2019/11/28 + */ +@AllArgsConstructor +@Data +public class DynamicDetailFinishEvent { + + private int listPosition; + + private WorldDynamicBean bean; + + private boolean isDelete; + +} diff --git a/core/src/model_community/java/com/chwl/core/community/event/DynamicPublishEvent.java b/core/src/model_community/java/com/chwl/core/community/event/DynamicPublishEvent.java new file mode 100644 index 0000000..d1dad0b --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/event/DynamicPublishEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.community.event; + +/** + * create by lvzebiao @2019/12/1 + */ +public class DynamicPublishEvent { +} diff --git a/core/src/model_community/java/com/chwl/core/community/event/DynamicRefreshEvent.java b/core/src/model_community/java/com/chwl/core/community/event/DynamicRefreshEvent.java new file mode 100644 index 0000000..e6040cc --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/event/DynamicRefreshEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.community.event; + +/** + * create by lvzebiao @2019/12/1 + */ +public class DynamicRefreshEvent { +} diff --git a/core/src/model_community/java/com/chwl/core/community/event/SquareTaskEvent.java b/core/src/model_community/java/com/chwl/core/community/event/SquareTaskEvent.java new file mode 100644 index 0000000..065ea27 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/event/SquareTaskEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.community.event; + +import lombok.Data; + +@Data +public class SquareTaskEvent { +} diff --git a/core/src/model_community/java/com/chwl/core/community/event/UnReadCountEvent.java b/core/src/model_community/java/com/chwl/core/community/event/UnReadCountEvent.java new file mode 100644 index 0000000..f5a394c --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/event/UnReadCountEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.community.event; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class UnReadCountEvent { + private int total; +} diff --git a/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java b/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java new file mode 100644 index 0000000..6d211c0 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java @@ -0,0 +1,64 @@ +package com.chwl.core.community.im; + +import androidx.annotation.Keep; + +import com.chwl.core.community.bean.WorldDynamicBean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * create by lvzebiao @2019/11/22 + */ +@Data +@Keep +public class DynamicImMsg implements Serializable { + + private long dynamicId; + + private String nick; + + private String imageUrl; + /** + * 发布人的Uid + */ + private long publishUid; + + private long worldId; + + private String content; + + public static DynamicImMsg beanToMsg(WorldDynamicBean bean, long worldId) { + if (bean == null) { + return null; + } + + return toMsg(bean.getDynamicId(), bean.getNick(), + bean.getUid(), bean.getShareCover(), worldId, bean.getContent()); + } + + public static DynamicImMsg beanToMsg(WorldDynamicBean bean) { + if (bean == null) { + return null; + } + + return toMsg(bean.getDynamicId(), bean.getNick(), + bean.getUid(), bean.getShareCover(), bean.getWorldId(), bean.getContent()); + } + + private static DynamicImMsg toMsg(long dynamicId, String nick, + long uid, String shareCover, + long worldId, String content) { + DynamicImMsg msg = new DynamicImMsg(); + msg.setDynamicId(dynamicId); + msg.setNick(nick); + msg.setPublishUid(uid); + msg.setImageUrl(shareCover); + msg.setWorldId(worldId); + msg.setContent(content); + return msg; + } + + +} diff --git a/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java b/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java new file mode 100644 index 0000000..e53c0a7 --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java @@ -0,0 +1,73 @@ +package com.chwl.core.community.im; + +import androidx.annotation.Keep; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.chwl.core.im.custom.bean.CustomAttachment; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/11/22 + */ +@Keep +public class WorldDynamicAttachment extends CustomAttachment { + + @Setter + @Getter + private DynamicImMsg dynamicImMsg; + + public WorldDynamicAttachment(int first, int second) { + super(first, second); + } + + @Override + protected void parseData(JSONObject data) { + try { + dynamicImMsg = JSON.parseObject(data.toJSONString(), DynamicImMsg.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + protected JSONObject packData() { + JSONObject object = null; + try { + if (dynamicImMsg != null) { + object = JSONObject.parseObject(JSON.toJSONString(dynamicImMsg)); + } + } catch (Exception ex) { + + } + if (object == null) { + object = new JSONObject(); + } + return object; + } + + public static IMMessage createShareMsg(DynamicImMsg dynamicImMsg, String targetUid) { + WorldDynamicAttachment attachment = new WorldDynamicAttachment( + CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC, + CUSTOM_MSG_SUB_TYPE_WORLD_DYNAMIC_SHARE + ); + attachment.setDynamicImMsg(dynamicImMsg); + return MessageBuilder.createCustomMessage(targetUid, + SessionTypeEnum.P2P, attachment); + //IMNetEaseManager.get().sendMessage(message); + } + + public static boolean isShareMsg(CustomAttachment attachment) { + if (attachment == null) { + return false; + } + return attachment.getFirst() == CUSTOM_MSG_HEADER_TYPE_WORLD_DYNAMIC + && attachment.getSecond() == CUSTOM_MSG_SUB_TYPE_WORLD_DYNAMIC_SHARE; + } + +} diff --git a/core/src/model_community/java/com/chwl/core/community/square/ISquareModel.java b/core/src/model_community/java/com/chwl/core/community/square/ISquareModel.java new file mode 100644 index 0000000..a159bdf --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/square/ISquareModel.java @@ -0,0 +1,30 @@ +package com.chwl.core.community.square; + +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.bean.WorldDynamicListResult; + +import java.util.List; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2020/1/8 + */ +public interface ISquareModel { + + /** + * 推荐动态 + */ + Single> getRecommendDynamics(int page, int pageSize); + + /** + * 关注动态列表 + */ + Single getFollowerDynamics(String dynamicId, int pageSize); + /** + * 最新动态 + */ + Single getLatestDynamics(int page, int pageSize,String dynamicId); + +} diff --git a/core/src/model_community/java/com/chwl/core/community/square/SquareModel.java b/core/src/model_community/java/com/chwl/core/community/square/SquareModel.java new file mode 100644 index 0000000..fce1a8b --- /dev/null +++ b/core/src/model_community/java/com/chwl/core/community/square/SquareModel.java @@ -0,0 +1,105 @@ +package com.chwl.core.community.square; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.community.CommunityConstant; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.bean.WorldDynamicListResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * create by lvzebiao @2020/1/8 + */ +public class SquareModel extends BaseModel implements ISquareModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final SquareModel INSTANCE = new SquareModel(); + } + + public static SquareModel get() { + return SquareModel.Helper.INSTANCE; + } + + /** + * 推荐动态 + */ + @Override + public Single> getRecommendDynamics(int page, int pageSize) { + return api.apiRecommendDynamics(page, pageSize, CommunityConstant.VERSION_VALID_TYPE) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + /** + * 最新动态 + */ + @Override + public Single getLatestDynamics(int page, int pageSize,String dynamicId) { + return api.apiLatestDynamics(page, pageSize,dynamicId, CommunityConstant.VERSION_VALID_TYPE) + .compose(RxHelper.handleCommon()); + } + + + /** + * 关注动态列表 + */ + @Override + public Single getFollowerDynamics(String dynamicId, int pageSize) { + return api.apiFollowerDynamics(dynamicId, pageSize, CommunityConstant.VERSION_VALID_TYPE) + .compose(RxHelper.handleCommon()); + } + + private interface Api { + + /** + * 推荐动态 + * @param page 页数,1表示取首页,其他表示取其他页 + * @param pageSize 请求返回的记录数 + * @return - + */ + @GET("/dynamic/square/recommendDynamics") + Single>> apiRecommendDynamics( + @Query("page") int page, + @Query("pageSize") int pageSize, + @Query("types") String types + ); + + /** + * 最新动态 + * @param page 页数,1表示取首页,其他表示取其他页 + * @param pageSize 请求返回的记录数 + * @return - + */ + @GET("/dynamic/square/latestDynamics") + Single> apiLatestDynamics( + @Query("page") int page, + @Query("pageSize") int pageSize, + @Query("dynamicId") String dynamicId, + @Query("types") String types + ); + + /** + * 关注的动态列表 + * @param pageSize 请求返回的记录数 + * @return - + */ + @GET("/dynamic/square/followerDynamics") + Single> apiFollowerDynamics( + @Query("dynamicId") String dynamicId, + @Query("pageSize") int pageSize, + @Query("types") String types + ); + + } + +} diff --git a/core/src/model_database_room/java/com/chwl/core/db/AppDataBase.java b/core/src/model_database_room/java/com/chwl/core/db/AppDataBase.java new file mode 100644 index 0000000..7d4a6f4 --- /dev/null +++ b/core/src/model_database_room/java/com/chwl/core/db/AppDataBase.java @@ -0,0 +1,34 @@ +package com.chwl.core.db; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import com.chwl.core.XConstants; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.db.bean.SongBean; +import com.chwl.core.music.db.dao.LocalMusicDao; +import com.chwl.core.music.db.dao.SongDao; +import com.chwl.library.utils.config.BasicConfig; + +@Database(entities = {LocalMusicBean.class, SongBean.class}, version = 1, exportSchema = false) +public abstract class AppDataBase extends RoomDatabase { + + private static volatile AppDataBase mInstance; + public static AppDataBase getInstance() { + if (mInstance == null) { + synchronized (AppDataBase.class) { + if (mInstance == null) { + mInstance = Room.databaseBuilder(BasicConfig.INSTANCE.getAppContext(), AppDataBase.class, XConstants.XCHAT_DATABASE_NAME) + .fallbackToDestructiveMigration() + .build(); + } + } + } + return mInstance; + } + + public abstract LocalMusicDao localMusicDao(); + + public abstract SongDao songDao(); +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallModel.java new file mode 100644 index 0000000..124284b --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallModel.java @@ -0,0 +1,597 @@ +package com.chwl.core.module_hall.hall; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.auth.event.LogoutEvent; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.module_hall.hall.bean.ApplyResult; +import com.chwl.core.module_hall.hall.bean.AuthInfo; +import com.chwl.core.module_hall.hall.bean.AuthListResult; +import com.chwl.core.module_hall.hall.bean.ClanAndHallInfo; +import com.chwl.core.module_hall.hall.bean.HallInfo; +import com.chwl.core.module_hall.hall.bean.HallMenuByUidResult; +import com.chwl.core.module_hall.hall.bean.JoinRoomInfo; +import com.chwl.core.module_hall.hall.bean.ListMemberInfo; +import com.chwl.core.module_hall.hall.bean.OptionInfo; +import com.chwl.core.module_hall.hall.bean.OwnerHallInfo; +import com.chwl.core.module_hall.hall.bean.SuperAdminHall; +import com.chwl.core.module_hall.hall.bean.SuperAdminInfo; +import com.chwl.core.module_hall.hall.bean.UserClanInfo; +import com.chwl.core.module_hall.hall.event.UserHallUpdateEvent; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.user.event.LoginUserInfoUpdateEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import lombok.Getter; +import lombok.Setter; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Query; +import retrofit2.http.Url; + + +/** + * 厅的接口 + * Created by lvzebiao on 2019/1/7. + */ + +public class HallModel extends BaseModel implements IHallModel { + private Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final HallModel INSTANCE = new HallModel(); + } + + public void refreshApi() { + api = RxNet.create(Api.class); + } + + public static HallModel get() { + return Helper.INSTANCE; + } + + private HallModel() { + EventBus.getDefault().register(this); + } + + /** + * 模厅ID + */ + @Setter + @Getter + private long hallId; + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoginInfoUpdate(LoginUserInfoUpdateEvent event) { + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo != null) { + hallId = userInfo.getHallId(); + EventBus.getDefault().post(new UserHallUpdateEvent()); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogout(LogoutEvent event) { + hallId = 0; + } + + /** + * 申请加入厅 + */ + @Override + public Single applyJoinHall(long hallId) { + return api.applyHall(AuthModel.get().getCurrentUid(), hallId) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleException()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_hall_hallmodel_02)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 申请加入公会 + */ + @Override + public Single applyJoinClan(long clanId) { + return api.applyClan(AuthModel.get().getCurrentUid(), clanId) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleException()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_hall_hallmodel_02)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + + /** + * 模厅审核 + */ + @Override + public Single dealApply(String url, int type) { + return api.dealApply(url, type, String.valueOf(AuthModel.get().getCurrentUid())) + .compose(RxHelper.handleCommon(ApplyResult::new)); + } + /** + * 模厅审核 + */ + @Override + public Single confirm(String url) { + return api.confirm(url).compose(RxHelper.handleCommon(ApplyResult::new)); + } + + /** + * 公会审核 + */ + @Override + public Single dealApplyClan(String url, int type) { + return api.dealApply(url, type, String.valueOf(AuthModel.get().getCurrentUid())) + .compose(RxHelper.handleCommon(ApplyResult::new)); + } + + /** + * 获取厅成员 + */ + @Override + public Single getAllMembers(long hallId, int page, int pageSize) { + return api.getAllMembers(hallId, page, pageSize) + .compose(RxHelper.handleCommon(ListMemberInfo::new)); + } + + @Override + public Single removeFromHall(long hallId, long targetUid) { + return api.remove(hallId, AuthModel.get().getCurrentUid(), targetUid) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_hall_hallmodel_03)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + @Override + public Single> getHallMenusByUid(long uid) { + return api.getHallMenusByUid(uid) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + /** + * @param roleType 1:厅主 2:高管 3:普通成员 + */ + @Override + public Single> getHallAuths(long uid, long hallId, int roleType) { + return api.getHallAuths(uid, hallId, roleType) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single quit(long uid) { + return api.quit(uid) + .compose(RxHelper.handleSchAndExce()) + .flatMap(response -> { + if (response.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_hall_hallmodel_04)); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + /** + * 获取厅信息 + */ + @Override + public Single getHallInfo(long uid, long hallId) { + return api.getHallInfo(AuthModel.get().getCurrentUid(), hallId) + .compose(RxHelper.handleCommon(HallInfo::new)); + } + + @Override + public Single queryMembers(String queryString, int page, int pageSize) { + return api.queryMembers(AuthModel.get().getCurrentUid(), queryString, page, pageSize) + .compose(RxHelper.handleCommon(ListMemberInfo::new)); + } + + @Override + public Single setManager(long targetUid, long hallId) { + return api.setManager(AuthModel.get().getCurrentUid(), targetUid, hallId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap((Function>) response -> { + if (response.isSuccess()) { + return Single.just("success"); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + @Override + public Single removeManager(long targetUid, long hallId) { + return api.removeManager(AuthModel.get().getCurrentUid(), targetUid, hallId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap((Function>) response -> { + if (response.isSuccess()) { + return Single.just("success"); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + @Override + public Single getHallManager(long hallId) { + return api.getHallManager(hallId) + .compose(RxHelper.handleCommon(ListMemberInfo::new)); + } + + @Override + public Single> getHallManagerAuths(long managerUid) { + return api.getHallManagerAuths(AuthModel.get().getCurrentUid(), managerUid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .flatMap((Function>>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + }); + } + + @Override + public Single setHallManagerAuths(long managerUid, long hallId, String authStr) { + return api.setHallManagerAuths(AuthModel.get().getCurrentUid(), managerUid, hallId, authStr) + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function>) response -> { + if (response.isSuccess()) { + return Single.just("success"); + } else { + return Single.error(new Throwable(response.getMessage())); + } + }); + } + + /** + * 高管邀请成员加入 + */ + @Override + public Single inviteMember(long hallId, long targetUid) { + return api.invite(hallId, AuthModel.get().getCurrentUid(), targetUid) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_hall_hallmodel_05)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + @Override + public Single getOwnerHallInfo(long targetUid) { + return api.getOwnerHallInfo(AuthModel.get().getCurrentUid(), targetUid) + .compose(RxHelper.handleCommon(OwnerHallInfo::new)); + } + + @Override + public Single> getClanHallList(long clanId) { + return api.getClanHallList(clanId) + .compose(RxHelper.handleCommon()); + } + + + @Override + public Single getClanAllMembers(long uid, int page, int pageSize) { + return api.getClanAllMembers(uid, page, pageSize) + .compose(RxHelper.handleCommon(ListMemberInfo::new)); + } + + /** + * 获取用户家族和公会信息,不一定是自己的 + * 特别注意,这里的HallInfo里面是没有RoleType的 + */ + @Override + public Single getUserHallAndClan(long uid) { + return api.getUserHallAndClan(uid) + .compose(RxHelper.handleCommon()); + } + + public Single getUserClanInfo(long uid) { + return api.getUserClanInfo(uid) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single> getSuperAdminHallList(long clanId, long uid) { + return api.getSuperAdminHallList(clanId, uid) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single searchSuperAdminInfo(long erbanNo) { + return api.searchSuperAdminInfo(erbanNo) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single setSuperAdmin(String roomUids, long uid) { + return api.setSuperAdmin(roomUids, uid) + .compose(RxHelper.handleStringData()); + } + + @Override + public Single> getRoomSuperAdminList(long roomUid) { + return api.getRoomSuperAdminList(roomUid) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single> getClanSuperAdminList(long clanId) { + return api.getClanSuperAdminList(clanId) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single removeSuperAdmin(long uid) { + return api.removeSuperAdmin(uid) + .compose(RxHelper.handleStringData()); + } + + /** + * 获取用户加入房間 + */ + @Override + public Single getJoinRoom(long hallId) { + return api.getJoinRoom(hallId) + .compose(RxHelper.handleCommon()); + } + + private interface Api { + /** + * 申请加入模厅 + */ + @FormUrlEncoded + @POST("/hall/apply") + Single> applyHall(@Field("uid") long uid, + @Field("hallId") long hallId); + + /** + * 申请加入公会 + */ + @FormUrlEncoded + @POST("/clan/apply") + Single> applyClan(@Field("uid") long uid, + @Field("clanId") long clanId); + + /** + * 模厅审核 + * + * @param url 随实体一起返回的 URL + * @param type 审批操作,0表示拒绝,1表示同意 + * @return + */ + @POST + @Headers({"need_update_url:false"}) + Single> dealApply(@Url String url, + @Query("type") int type, + @Query("uid") String uid); + + + @POST + @Headers({"need_update_url:false"}) + Single> confirm(@Url String url); + + /** + * 获取厅成员 + */ + @GET("/hall/getAllMembers") + Single> getAllMembers(@Query("hallId") long hallId, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 移除厅成员 + */ + @FormUrlEncoded + @POST("/hall/remove") + Single> remove(@Field("hallId") long hallId, + @Field("uid") long uid, + @Field("targetUid") long targetUid); + + + /** + * 获取模厅首页顶部功能列表 + * + * @param uid 厅主id + */ + @POST("/hallAuth/getHallMenusByUid") + Single getHallMenusByUid(@Query("uid") long uid); + + /** + * 获取模厅首页顶部功能列表 + * + * @param uid 厅主id + */ + @POST("/hallAuth/getHallAuths") + Single getHallAuths(@Query("uid") long uid, + @Query("hallId") long hallId, + @Query("roleType") int roleType); + + /** + * 申请退出模厅 + */ + @POST("/hall/quit") + Single quit(@Query("uid") long uid); + + /** + * 模厅信息 + */ + @GET("/hall/getHallInfo") + Single> getHallInfo(@Query("uid") long uid, + @Query("hallId") long hallId); + + + /** + * 按条件搜索成员 + */ + @GET("/clan/listMember") + Single> queryMembers(@Query("uid") long uid, + @Query("queryStr") String queryString, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 添加高管 + */ + @POST("/hall/setManager") + Single setManager(@Query("uid") long uid, @Query("targetUid") long targetUid, @Query("hallId") long hallId); + + /** + * 取消高管 + */ + @POST("/hall/removeManager") + Single removeManager(@Query("uid") long uid, @Query("targetUid") long targetUid, @Query("hallId") long hallId); + + /** + * 获取高管列表 + */ + @GET("/hall/getHallManager") + Single> getHallManager(@Query("hallId") long hallId); + + /** + * 获取高管权限列表 + * + * @param uid 厅主id + * @param managerUid 高管id + */ + @POST("/hallAuth/getHallManagerAuths") + Single getHallManagerAuths(@Query("uid") long uid, + @Query("managerUid") long managerUid); + + /** + * @param authStr member_join_manager,member_exit_manager,look_hall_income + */ + @POST("/hallAuth/setHallManagerAuths") + Single setHallManagerAuths(@Query("uid") long uid, + @Query("managerUid") long managerUid, + @Query("hallId") long hallId, + @Query("authStr") String authStr); + + /** + * 高管邀请成员加入 + */ + @FormUrlEncoded + @POST("/hall/invite") + Single> invite(@Field("hallId") long hallId, + @Field("uid") long uid, + @Field("targetUid") long targetUid); + + /** + * 获取厅主模厅信息 + */ + @GET("/hall/getOwnerHallInfo") + Single> getOwnerHallInfo(@Query("uid") long uid, + @Query("targetUid") long targetUid); + + /** + * 获取家族下的公会列表 + */ + @GET("/clan/listHall") + Single>> getClanHallList(@Query("clanId") long clanId); + + /** + * 获取家族下的成员列表 + */ + @GET("/clan/listMember") + Single> getClanAllMembers(@Query("uid") long uid, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 获取用户家族和公会信息 + */ + @GET("/clan/getUserHallAndClan") + Single> getUserHallAndClan(@Query("uid") long uid); + + /** + * 获取用户家族和公会信息 + */ + @GET("/user/getUserClanInfo") + Single> getUserClanInfo(@Query("uid") long uid); + + /** + * 获取设置超管可以管理的房间列表 + */ + @GET("/hall/superManager/listHallInClan") + Single>> getSuperAdminHallList(@Query("clanId") long clanId, @Query("uid") long uid); + + /** + * 搜索超管信息 + */ + @GET("/hall/superManager/search") + Single> searchSuperAdminInfo(@Query("erbanNo") long erbanNo); + + /** + * 移除超管 + */ + @GET("/hall/superManager/remove") + Single> removeSuperAdmin(@Query("targetUid") long targetUid); + + /** + * 设置超管信息 + * + * @param roomUids 设置的房间uid,都会隔开 + * @param uid 需要设置的用户uid + */ + @FormUrlEncoded + @POST("/hall/superManager/setSuperManage") + Single> setSuperAdmin(@Field("roomUids") String roomUids, @Field("uid") long uid); + + /** + * 获取房间超管信息 + */ + @GET("/hall/superManager/listSuperManageInClan") + Single>> getClanSuperAdminList(@Query("clanId") long clanId); + + /** + * 获取公会超管信息 + */ + @GET("/hall/superManager/listSuperManageInRoom") + Single>> getRoomSuperAdminList(@Query("roomUid") long roomUid); + + /** + * 获取用户加入房間 + */ + @GET("/hall/getApplyBtnStatus") + Single> getJoinRoom(@Query("hallId") long hallId); + + } +} \ No newline at end of file diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallNameModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallNameModel.java new file mode 100644 index 0000000..3b2f290 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/HallNameModel.java @@ -0,0 +1,53 @@ +package com.chwl.core.module_hall.hall; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class HallNameModel extends BaseModel implements IHallNameModel { + private static final String TAG = "HallNameModel"; + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final HallNameModel INSTANCE = new HallNameModel(); + } + + public static HallNameModel get() { + return Helper.INSTANCE; + } + + @Override + public Single updateHallName(String hallName,long hallId) { + return api.updateHallName(AuthModel.get().getCurrentUid(), hallName,hallId) + .compose(RxHelper.handleSchAndExce()) + .flatMap(response -> { + if (response.isSuccess()) { + return Single.just(hallName); + } else { + return Single.error(new Throwable(response.getMessage())); + } + }); + + } + + interface Api { + + /** + * 更新模厅名 + * + * @param uid + * 厅主id + */ + @POST("/hall/updateHallName") + Single updateHallName(@Query("uid") long uid, + @Query("hallName") String hallName, + @Query("hallId") long hallId); + + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallModel.java new file mode 100644 index 0000000..3c76b52 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallModel.java @@ -0,0 +1,106 @@ +package com.chwl.core.module_hall.hall; + + +import com.chwl.core.module_hall.hall.bean.ApplyResult; +import com.chwl.core.module_hall.hall.bean.AuthInfo; +import com.chwl.core.module_hall.hall.bean.ClanAndHallInfo; +import com.chwl.core.module_hall.hall.bean.HallInfo; +import com.chwl.core.module_hall.hall.bean.JoinRoomInfo; +import com.chwl.core.module_hall.hall.bean.ListMemberInfo; +import com.chwl.core.module_hall.hall.bean.OptionInfo; +import com.chwl.core.module_hall.hall.bean.OwnerHallInfo; +import com.chwl.core.module_hall.hall.bean.SuperAdminHall; +import com.chwl.core.module_hall.hall.bean.SuperAdminInfo; + +import java.util.List; + +import io.reactivex.Single; + + +/** + * + * Created by lvzebiao on 2019/1/7. + */ + +public interface IHallModel { + + long getHallId(); + + /** + * 申请加入厅 + */ + Single applyJoinHall(long hallId); + + /** + * 申请加入公会 + */ + Single applyJoinClan(long clanId); + + /** + * 模厅审核 + */ + Single dealApply(String url, int type); + + Single confirm(String url); + + /** + * 公会审核 + */ + Single dealApplyClan(String url, int type); + + /** + * 获取厅成员 + * @param hallId 厅Id + */ + Single getAllMembers(long hallId, + int page, + int pageSize); + /**移除模厅*/ + Single removeFromHall(long hallId,long targetUid); + + + Single> getHallMenusByUid(long uid); + Single> getHallAuths(long uid, long hallId, int roleType); + Single quit(long uid); + + /**获取模厅信息*/ + Single getHallInfo(long uid, long hallId); + + + Single queryMembers(String queryString,int page,int pageSize); + + Single setManager(long targetUid, long hallId); + Single removeManager(long targetUid, long hallId); + + Single getHallManager(long hallId); + Single> getHallManagerAuths(long managerUid); + Single setHallManagerAuths(long managerUid, long hallId, String authStr); + + /** + * 高管邀请成员加入 + */ + Single inviteMember(long hallId,long targetUid); + + Single getOwnerHallInfo(long targetUid); + + Single> getClanHallList(long clanId); + + Single getClanAllMembers(long clanId, int page, int pageSize); + + Single getUserHallAndClan(long uid); + + Single> getSuperAdminHallList(long clanId, long uid); + + Single searchSuperAdminInfo(long erbanNo); + + Single setSuperAdmin(String roomUids ,long uid); + + Single> getRoomSuperAdminList(long roomUid); + + Single> getClanSuperAdminList(long clanId); + + Single removeSuperAdmin(long uid); + + Single getJoinRoom(long hallId); + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallNameModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallNameModel.java new file mode 100644 index 0000000..9e2d739 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/IHallNameModel.java @@ -0,0 +1,9 @@ +package com.chwl.core.module_hall.hall; + +import com.chwl.core.base.IModel; + +import io.reactivex.Single; + +public interface IHallNameModel extends IModel { + Single updateHallName(String hallName,long hallId); +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ApplyResult.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ApplyResult.java new file mode 100644 index 0000000..7be9178 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ApplyResult.java @@ -0,0 +1,20 @@ +package com.chwl.core.module_hall.hall.bean; + +import lombok.Data; + +/** + * 申请入厅之后的结果 + * Created by lvzebiao on 2019/1/8. + */ +@Data +public class ApplyResult { + /**消息已过期*/ + public final static int CODE_MSG_OUT_OF_DATE = 90121; + /**消息已处理*/ + public final static int CODE_MSG_HAS_HANDLE = 90122; + + private int code; + + private String msg; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthInfo.java new file mode 100644 index 0000000..41e7f95 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthInfo.java @@ -0,0 +1,53 @@ +package com.chwl.core.module_hall.hall.bean; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import lombok.Data; + +@Data +public class AuthInfo implements Serializable { + /**加入公会*/ + public final static String AUTH_MEMBER_JOIN_CLAN = "member_join_clan"; + /**添加成员,同意成员加入*/ + public final static String AUTH_MEMBER_JOIN_MANAGER = "member_join_manager"; + /**移除成员,同意成员退出*/ + public final static String AUTH_MEMBER_EXIT_MANAGER = "member_exit_manager"; + /**高管设置*/ + public final static String AUTH_HALL_MANAGER_SET = "hall_manager_set"; + /**个播房房间收入*/ + public final static String AUTH_SINGLE_ROOM_INCOME = "single_room_income"; + /**申请退出模厅,厅主不能申请*/ + public final static String AUTH_APPLY_HALL_EXIT = "hall_exit"; + /**成员收入*/ + public final static String AUTH_LOOK_HALL_INCOME = "look_hall_income"; + /** 厅名设置(本地自定义) */ + public final static String AUTH_HALL_NAME_SET = "hall_name_set"; + /** 公会收入(本地自定义) */ + public final static String AUTH_HALL_CLAN_INCOME = "clan_income"; + + + /**表示能够处理的权限,为了兼容版本问题,过滤新版可能出现的新权限*/ + public static List canHandleAuth() { + List list = new ArrayList<>(); + list.add(AUTH_MEMBER_JOIN_CLAN); + list.add(AUTH_MEMBER_JOIN_MANAGER); + list.add(AUTH_MEMBER_EXIT_MANAGER); + list.add(AUTH_HALL_MANAGER_SET); + list.add(AUTH_APPLY_HALL_EXIT); + list.add(AUTH_LOOK_HALL_INCOME); + list.add(AUTH_SINGLE_ROOM_INCOME); + return list; + } + + private String code; + private String name; + private String description; + /** 1:拥有 0:没有 */ + private int status; + + public boolean isOwnAuth() { + return status == 1; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthListResult.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthListResult.java new file mode 100644 index 0000000..fa346e4 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/AuthListResult.java @@ -0,0 +1,8 @@ +package com.chwl.core.module_hall.hall.bean; + +import com.chwl.core.bean.response.ServiceResult; + +import java.util.List; + +public class AuthListResult extends ServiceResult> { +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanAndHallInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanAndHallInfo.java new file mode 100644 index 0000000..00de42e --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanAndHallInfo.java @@ -0,0 +1,10 @@ +package com.chwl.core.module_hall.hall.bean; + +import lombok.Data; + +@Data +public class ClanAndHallInfo { + private ClanInfo clan; + private HallInfo hall; + private boolean manageHall; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanInfo.java new file mode 100644 index 0000000..61bb063 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ClanInfo.java @@ -0,0 +1,19 @@ +package com.chwl.core.module_hall.hall.bean; + +import lombok.Data; + +@Data +public class ClanInfo { + private String avatar; + private int id; + private String name; + private long elderUid; + private String elderName; + private long elderErbanNo; + private boolean elderHasExchangeManagerAuth; + private int status; + private long ownerId; + private boolean userIsElder; + private long hallId; + private String levelIcon; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/GroupListInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/GroupListInfo.java new file mode 100644 index 0000000..8833e80 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/GroupListInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.module_hall.hall.bean; + +import java.io.Serializable; + +public class GroupListInfo implements Serializable { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/H5FamilyInfo.kt b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/H5FamilyInfo.kt new file mode 100644 index 0000000..1c50875 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/H5FamilyInfo.kt @@ -0,0 +1,21 @@ +package com.chwl.core.module_hall.hall.bean + +import androidx.annotation.Keep +import com.chwl.core.UriProvider +import java.io.Serializable + +@Keep +class H5FamilyInfo : Serializable { + val familyId: Long? = null + val familyName: String? = null + val familyListUrl: String? = null + val myFamilyUrl: String? = null + + fun getFullFamilyListUrl(): String? { + return UriProvider.toFullUrl(familyListUrl) + } + + fun getFullMyFamilyUrl(): String? { + return UriProvider.toFullUrl(myFamilyUrl) + } +} \ No newline at end of file diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamInfo.java new file mode 100644 index 0000000..17e6a04 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamInfo.java @@ -0,0 +1,43 @@ +package com.chwl.core.module_hall.hall.bean; + +import com.chwl.core.module_hall.team.bean.HTeamType; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * 厅群信息 + * Created by lvzebiao on 2019/1/10. + */ +@Data +public class HTeamInfo implements Serializable{ + /**云信的群聊唯一id*/ + private String tid; + /**群聊id*/ + private long chatId; + + private String name; + + private String icon; + /**是否已在群聊中*/ + private boolean inChat; + /**{@link HTeamType}*/ + private int type; + /** + * 群聊角色{@link HTeamMember.TYPE} + */ + private int role; + /**是否消息提醒,false:关闭免打扰*/ + private boolean promptStatus; + /**成员列表:头像集合*/ + private List memberAvatars; + /**管理员列表:头像集合*/ + private List managerAvatars; + /** + * 群公告 + */ + private String notice; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamMember.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamMember.java new file mode 100644 index 0000000..7d3fa80 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HTeamMember.java @@ -0,0 +1,41 @@ +package com.chwl.core.module_hall.hall.bean; + +import com.chwl.core.user.bean.SimpleUserInfo; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * 厅群成员信息 + * Created by lvzebiao on 2019/1/14. + */ +@Setter +@Getter +public class HTeamMember extends SimpleUserInfo implements Serializable{ + + public interface TYPE { + /**群主*/ + int TEAM_OWNER = 1; + /**管理员*/ + int TEAM_ADMIN = 2; + /**成员*/ + int TEAM_NORMAL = 3; + } + + private String avatar; + /**群聊角色(1.群主,2、管理员 3、成员)*/ + private int roleType; + /**禁言状态,false:未被禁言,true:已被禁言)*/ + private boolean bannedStatus; + + private long erbanNo; + + private long chatId; + /**是不是群管理*/ + public boolean isAdmin() { + return roleType == TYPE.TEAM_OWNER || roleType == TYPE.TEAM_ADMIN; + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallInfo.java new file mode 100644 index 0000000..a92dd21 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallInfo.java @@ -0,0 +1,45 @@ +package com.chwl.core.module_hall.hall.bean; + +import lombok.Data; + +/** + * 模厅信息 + * Created by lvzebiao on 2019/1/8. + */ +@Data +public class HallInfo { + + private long hallId; + + private String hallName; + /** + * 厅角色 {@link RoleType} + */ + private int roleType; + + /** + * 厅主Uid + */ + private long ownerUid; + + /** + * 厅主Id + */ + private long ownerErbanNo; + + /** + * 厅人数 + */ + private int memberCount; + + /** + * 厅主头像 + */ + private String ownerAvatar; + + /** + * 厅主昵称 + */ + private String ownerNick; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallMenuByUidResult.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallMenuByUidResult.java new file mode 100644 index 0000000..4007c75 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/HallMenuByUidResult.java @@ -0,0 +1,8 @@ +package com.chwl.core.module_hall.hall.bean; + +import com.chwl.core.bean.response.ServiceResult; + +import java.util.List; + +public class HallMenuByUidResult extends ServiceResult> { +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/JoinRoomInfo.kt b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/JoinRoomInfo.kt new file mode 100644 index 0000000..8c83d6d --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/JoinRoomInfo.kt @@ -0,0 +1,7 @@ +package com.chwl.core.module_hall.hall.bean + +data class JoinRoomInfo( + val recordId: Long = 0, + val hallMessageUid: Long = 0, + var hallBtnStatus: Int = 0//0=不显示 1=可申请 2=待审核 3通过邀请 +) \ No newline at end of file diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListHTeamMember.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListHTeamMember.java new file mode 100644 index 0000000..3619246 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListHTeamMember.java @@ -0,0 +1,22 @@ +package com.chwl.core.module_hall.hall.bean; + +import java.util.List; + +import lombok.Data; + +/** + * 厅群成员结构 + * Created by lvzebiao on 2019/1/14. + */ +@Data +public class ListHTeamMember { + + private List members; + + private int count; + /**已禁言人数*/ + private int muteCount; + /**群管理人数*/ + private int managerCount; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListMemberInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListMemberInfo.java new file mode 100644 index 0000000..2f0121f --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/ListMemberInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.module_hall.hall.bean; + +import java.util.List; + +import lombok.Data; + +/** + * Created by lvzebiao on 2019/1/8. + */ + +@Data +public class ListMemberInfo { + + private List members; + + private int count; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/MemberInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/MemberInfo.java new file mode 100644 index 0000000..fdaee79 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/MemberInfo.java @@ -0,0 +1,39 @@ +package com.chwl.core.module_hall.hall.bean; + +import com.chwl.core.user.bean.SimpleUserInfo; + +import java.io.Serializable; +import java.util.Objects; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class MemberInfo extends SimpleUserInfo implements Serializable { + + private String avatar; + /** + * 厅角色 {@link RoleType} + */ + private int roleType; + private long hallId; + private long erbanNo; + /**是否是选中*/ + private boolean select; + + private String hallName; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MemberInfo that = (MemberInfo) o; + return erbanNo == that.erbanNo; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), erbanNo); + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OptionInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OptionInfo.java new file mode 100644 index 0000000..048197d --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OptionInfo.java @@ -0,0 +1,70 @@ +package com.chwl.core.module_hall.hall.bean; + +import java.io.Serializable; + +public class OptionInfo implements Serializable { + /** 成员收入 */ + public final static String OPTION_LOOK_HALL_INCOME = "look_hall_income"; + + /** 公会收入 */ + public final static String OPTION_GUILD_INCOME = "guild_income"; + + /** 施工中 */ + public final static String OPTION_HALL_BUILD = "hall_build"; + /** + * 能通过暗号添加模厅成员 + */ + public final static String OPTION_ADD_HALL_MEMBER_WITH_PWD = "member_join_manager"; + /** + * 厅主房间流水 + * hall_owner_room_serial + */ + // TODO 替换正确的key + public final static String OPTION_HALL_OWNER_ROOM_SERIAL = "hall_owner_room_serial"; + + private String code; + private String name; + private String url; + private String minImage; + private String maxImage; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMinImage() { + return minImage; + } + + public void setMinImage(String minImage) { + this.minImage = minImage; + } + + public String getMaxImage() { + return maxImage; + } + + public void setMaxImage(String maxImage) { + this.maxImage = maxImage; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OwnerHallInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OwnerHallInfo.java new file mode 100644 index 0000000..ac6b379 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/OwnerHallInfo.java @@ -0,0 +1,57 @@ +package com.chwl.core.module_hall.hall.bean; + +import com.chwl.core.module_hall.team.bean.HTeamType; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class OwnerHallInfo implements Serializable { + + private long hallId; + private String hallName; + private boolean inHall; + /** + * 群聊列表 + */ + private List groupChats; + + /** + * 判断是否有公开群 + */ + public boolean isHasPublicChat() { + HTeamInfo info = getPublicChat(); + return info != null && info.getType() == HTeamType.PUBLIC; + } + + /** + * 获取公开群ID + */ + public long getPublicChatId() { + HTeamInfo info = getPublicChat(); + return info == null ? 0 : info.getChatId(); + } + + /** + * 获取公开群 云信Id + */ + public String getPublicTeamId() { + HTeamInfo info = getPublicChat(); + return info == null ? "" : info.getTid(); + } + + public HTeamInfo getPublicChat() { + if (groupChats == null) { + return null; + } + for (HTeamInfo info : groupChats) { + if (info.getType() == HTeamType.PUBLIC) { + return info; + } + } + return null; + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/RoleType.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/RoleType.java new file mode 100644 index 0000000..c6ad3a9 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/RoleType.java @@ -0,0 +1,34 @@ +package com.chwl.core.module_hall.hall.bean; + +/** + * 模厅角色 + * Created by lvzebiao on 2019/1/10. + */ + +public interface RoleType { + /** + * 厅主 + */ + int OWNER = 1; + /** + * 高管 + */ + int ADMIN = 2; + /** + * 普通成员 + */ + int NORMAL = 3; + /** + * 族长 + */ + int CLAN_OWNER = 4; + /** + * 族长,会长 + */ + int CLAN_HALL_OWNER = 5; + /** + * 超管 + */ + int CLAN_SUPER_ADMIN = 6; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminHall.kt b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminHall.kt new file mode 100644 index 0000000..fadea95 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminHall.kt @@ -0,0 +1,9 @@ +package com.chwl.core.module_hall.hall.bean + +data class SuperAdminHall( + val hallAvatar: String? = null, + val hallName: String? = null, + val hallRoomId: String? = null, + val hallRoomUid: Long = 0, + var hasManage: Boolean = false +) \ No newline at end of file diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminInfo.kt b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminInfo.kt new file mode 100644 index 0000000..c700ebf --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/SuperAdminInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.module_hall.hall.bean + +data class SuperAdminInfo( + val avatar: String? = "", + val erbanNo: String? = "", + val gender: Int = 0, + var hasSet: Boolean = false, + val nick: String? = "", + val uid: Long = 0, + val roomList: List? = null +) \ No newline at end of file diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/UserClanInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/UserClanInfo.java new file mode 100644 index 0000000..7c927cc --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/bean/UserClanInfo.java @@ -0,0 +1,29 @@ +package com.chwl.core.module_hall.hall.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +import lombok.Data; + +@Keep +@Data +public class UserClanInfo implements Serializable { + private ClanAndHallInfo clan; + private H5FamilyInfo family; + private String clanMode; + + public ClanAndHallInfo asClanHall() { + if (clanMode != null && clanMode.equals("clan_hall")) { + return clan; + } + return null; + } + + public H5FamilyInfo asFamily() { + if (clanMode != null && clanMode.equals("family")) { + return family; + } + return null; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/event/UserHallUpdateEvent.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/event/UserHallUpdateEvent.java new file mode 100644 index 0000000..d5a6879 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/hall/event/UserHallUpdateEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.module_hall.hall.event; + +/** + * 用户模厅更新事件 + * Created by lvzebiao on 2019/1/18. + */ + +public class UserHallUpdateEvent { +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanAttachment.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanAttachment.java new file mode 100644 index 0000000..3349079 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.module_hall.im; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; + +/** + * 公会消息 + * Created by wushaocheng on 2022/11/9. + */ + +public class ClanAttachment extends CustomAttachment { + + private ClanImMsgInfo clanImMsgInfo; + + public ClanAttachment() { + this(CUSTOM_MSG_CLAN); + } + + public ClanAttachment(int second) { + super(CUSTOM_MSG_CLAN, second); + } + + @Override + protected void parseData(JSONObject data) { + clanImMsgInfo = new Gson().fromJson(data.toJSONString(), ClanImMsgInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(clanImMsgInfo); + return JSONObject.parseObject(jsonStr); + } + + public ClanImMsgInfo getClanImMsgInfo() { + return clanImMsgInfo; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanImMsgInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanImMsgInfo.java new file mode 100644 index 0000000..8f94378 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/ClanImMsgInfo.java @@ -0,0 +1,69 @@ +package com.chwl.core.module_hall.im; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; + +/** + * Created by lvzebiao on 2019/1/8. + */ +@Data +public class ClanImMsgInfo implements Serializable{ + + /** + * 已过期 + */ + public final static int MSG_TYPE_OUT_OF_DATE = 1; + /** + * 已处理 + */ + public final static int MSG_TYPE_HAS_HANDLE = 2; + /** + * 已同意 + */ + public final static int MSG_TYPE_HAS_AGREE = 3; + /** + * 已拒绝 + */ + public final static int MSG_TYPE_HAS_REJECT = 4; + + private String url; + private int type; + /**后台给的显示内容*/ + private String layout; + /**{@link com.chwl.core.im.custom.bean.RouterType}*/ + private int routerType; + + private String routerValue; + + public static Map convertToMap(ClanImMsgInfo info) { + Map localExtension = new HashMap<>(); + localExtension.put("url", info.getUrl()); + localExtension.put("type", info.getType()); + localExtension.put("layout", info.getLayout()); + localExtension.put("routerType", info.getRouterType()); + localExtension.put("routerValue", info.getRouterValue()); + return localExtension; + } + + public static ClanImMsgInfo convertMapToObject(Map localExtension) { + ClanImMsgInfo info = new ClanImMsgInfo(); + if (localExtension != null) { + info.setUrl((String) localExtension.get("url")); + info.setType((Integer) localExtension.get("type")); + info.setLayout((String) localExtension.get("layout")); + Object routerType = localExtension.get("routerType"); + if (routerType != null) { + info.setRouterType((Integer) routerType); + } + Object routerValue = localExtension.get("routerValue"); + if (routerValue != null) { + info.setRouterValue((String) routerValue); + } + } + return info; + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyAttachment.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyAttachment.java new file mode 100644 index 0000000..da4b4c5 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyAttachment.java @@ -0,0 +1,49 @@ +package com.chwl.core.module_hall.im; + +import androidx.annotation.Keep; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.google.gson.Gson; + +/** + * 模厅消息 + * Created by lvzebiao on 2019/1/7. + */ +@Keep +public class FamilyAttachment extends CustomAttachment { + + private FamilyImMsgInfo familyImMsgInfo; + + public FamilyAttachment() { + this(CUSTOM_MSG_FAMILY); + } + + public FamilyAttachment(int second) { + super(CUSTOM_MSG_FAMILY, second); + } + + @Override + protected void parseData(JSONObject data) { + try { + familyImMsgInfo = new Gson().fromJson(data.toJSONString(), FamilyImMsgInfo.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + protected JSONObject packData() { + try { + String jsonStr = new Gson().toJson(familyImMsgInfo); + return JSONObject.parseObject(jsonStr); + } catch (Exception e) { + e.printStackTrace(); + return new JSONObject(); + } + } + + public FamilyImMsgInfo getFamilyImMsgInfo() { + return familyImMsgInfo; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyImMsgInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyImMsgInfo.java new file mode 100644 index 0000000..b570e78 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/FamilyImMsgInfo.java @@ -0,0 +1,72 @@ +package com.chwl.core.module_hall.im; + +import androidx.annotation.Keep; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; + +/** + * Created by lvzebiao on 2019/1/8. + */ +@Keep +@Data +public class FamilyImMsgInfo implements Serializable{ + + /** + * 已过期 + */ + public final static int MSG_TYPE_OUT_OF_DATE = 1; + /** + * 已处理 + */ + public final static int MSG_TYPE_HAS_HANDLE = 2; + /** + * 已同意 + */ + public final static int MSG_TYPE_HAS_AGREE = 3; + /** + * 已拒绝 + */ + public final static int MSG_TYPE_HAS_REJECT = 4; + + private String url; + private int type; + /**后台给的显示内容*/ + private String layout; + /**{@link com.chwl.core.im.custom.bean.RouterType}*/ + private int routerType; + + private String routerValue; + + public static Map convertToMap(FamilyImMsgInfo info) { + Map localExtension = new HashMap<>(); + localExtension.put("url", info.getUrl()); + localExtension.put("type", info.getType()); + localExtension.put("layout", info.getLayout()); + localExtension.put("routerType", info.getRouterType()); + localExtension.put("routerValue", info.getRouterValue()); + return localExtension; + } + + public static FamilyImMsgInfo convertMapToObject(Map localExtension) { + FamilyImMsgInfo info = new FamilyImMsgInfo(); + if (localExtension != null) { + info.setUrl((String) localExtension.get("url")); + info.setType((Integer) localExtension.get("type")); + info.setLayout((String) localExtension.get("layout")); + Object routerType = localExtension.get("routerType"); + if (routerType != null) { + info.setRouterType((Integer) routerType); + } + Object routerValue = localExtension.get("routerValue"); + if (routerValue != null) { + info.setRouterValue((String) routerValue); + } + } + return info; + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallAttachment.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallAttachment.java new file mode 100644 index 0000000..b6ff844 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.module_hall.im; + +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; + +/** + * 模厅消息 + * Created by lvzebiao on 2019/1/7. + */ + +public class HallAttachment extends CustomAttachment { + + private HallImMsgInfo hallImMsgInfo; + + public HallAttachment() { + this(CUSTOM_MSG_MODULE_HALL); + } + + public HallAttachment(int second) { + super(CUSTOM_MSG_MODULE_HALL, second); + } + + @Override + protected void parseData(JSONObject data) { + hallImMsgInfo = new Gson().fromJson(data.toJSONString(), HallImMsgInfo.class); + } + + @Override + protected JSONObject packData() { + String jsonStr = new Gson().toJson(hallImMsgInfo); + return JSONObject.parseObject(jsonStr); + } + + public HallImMsgInfo getHallImMsgInfo() { + return hallImMsgInfo; + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallImMsgInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallImMsgInfo.java new file mode 100644 index 0000000..7d9e7e2 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/HallImMsgInfo.java @@ -0,0 +1,69 @@ +package com.chwl.core.module_hall.im; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; + +/** + * Created by lvzebiao on 2019/1/8. + */ +@Data +public class HallImMsgInfo implements Serializable{ + + /** + * 已过期 + */ + public final static int MSG_TYPE_OUT_OF_DATE = 1; + /** + * 已处理 + */ + public final static int MSG_TYPE_HAS_HANDLE = 2; + /** + * 已同意 + */ + public final static int MSG_TYPE_HAS_AGREE = 3; + /** + * 已拒绝 + */ + public final static int MSG_TYPE_HAS_REJECT = 4; + + private String url; + private int type; + /**后台给的显示内容*/ + private String layout; + /**{@link com.chwl.core.im.custom.bean.RouterType}*/ + private int routerType; + + private String routerValue; + + public static Map convertToMap(HallImMsgInfo info) { + Map localExtension = new HashMap<>(); + localExtension.put("url", info.getUrl()); + localExtension.put("type", info.getType()); + localExtension.put("layout", info.getLayout()); + localExtension.put("routerType", info.getRouterType()); + localExtension.put("routerValue", info.getRouterValue()); + return localExtension; + } + + public static HallImMsgInfo convertMapToObject(Map localExtension) { + HallImMsgInfo info = new HallImMsgInfo(); + if (localExtension != null) { + info.setUrl((String) localExtension.get("url")); + info.setType((Integer) localExtension.get("type")); + info.setLayout((String) localExtension.get("layout")); + Object routerType = localExtension.get("routerType"); + if (routerType != null) { + info.setRouterType((Integer) routerType); + } + Object routerValue = localExtension.get("routerValue"); + if (routerValue != null) { + info.setRouterValue((String) routerValue); + } + } + return info; + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgComponent.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgComponent.java new file mode 100644 index 0000000..cd5b9a7 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgComponent.java @@ -0,0 +1,19 @@ +package com.chwl.core.module_hall.im.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * + * Created by lvzebiao on 2019/1/15. + */ +@Data +public class HallMsgComponent implements Serializable{ + private String content; + private float fontSize; + private String fontColor; + private boolean fontBold; + private int routerType; + private int routerValue; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgLayout.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgLayout.java new file mode 100644 index 0000000..46c7f53 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/im/bean/HallMsgLayout.java @@ -0,0 +1,15 @@ +package com.chwl.core.module_hall.im.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * Created by lvzebiao on 2019/1/15. + */ +@Data +public class HallMsgLayout implements Serializable{ + private HallMsgComponent title; + private List contents; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/IIncomeModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/IIncomeModel.java new file mode 100644 index 0000000..c8e1ec5 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/IIncomeModel.java @@ -0,0 +1,28 @@ +package com.chwl.core.module_hall.income; + +import com.chwl.core.base.IModel; +import com.chwl.core.module_hall.income.bean.ClanTotalIncomeInfo; +import com.chwl.core.module_hall.income.bean.HallTotalIncomeInfo; +import com.chwl.core.module_hall.income.bean.IncomeGiftInfo; +import com.chwl.core.module_hall.income.bean.IncomeTotalInfo; +import com.chwl.core.module_hall.income.bean.LiveTotalIncomeInfo; +import com.chwl.core.module_hall.income.bean.SingleRoomTotalIncomeInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IIncomeModel extends IModel { + + Single incomeTotal(long hallId, String startTimeStr, String endTimeStr); + + Single getClanIncomeList(long clanId, String startTimeStr, String endTimeStr); + + Single getHallIncomeList(long clanId, String startTimeStr, String endTimeStr); + + Single getLiveIncomeList(long clanId, String startTimeStr, String endTimeStr); + + Single getSingleRoomIncomeList(String hallId, String clanId,String startTime, String endTime); + + Single> incomeDetail(long memberId, long hallId, String startTimeStr, String endTimeStr); +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/IncomeModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/IncomeModel.java new file mode 100644 index 0000000..e87308b --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/IncomeModel.java @@ -0,0 +1,175 @@ +package com.chwl.core.module_hall.income; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.module_hall.income.bean.ClanTotalIncomeInfo; +import com.chwl.core.module_hall.income.bean.HallTotalIncomeInfo; +import com.chwl.core.module_hall.income.bean.IncomeGiftInfo; +import com.chwl.core.module_hall.income.bean.IncomeTotalInfo; +import com.chwl.core.module_hall.income.bean.LiveTotalIncomeInfo; +import com.chwl.core.module_hall.income.bean.SingleRoomTotalIncomeInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class IncomeModel extends BaseModel implements IIncomeModel { + private final Api api = RxNet.create(Api.class); + + public static IncomeModel get() { + return Helper.INSTANCE; + } + + @Override + public Single incomeTotal(long hallId, String startTimeStr, String endTimeStr) { + return api.incomeTotal(AuthModel.get().getCurrentUid(), hallId, startTimeStr, endTimeStr) + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function, SingleSource>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + @Override + public Single getClanIncomeList(long clanId, String startTime, String endTime) { + return api.getClanIncomeList(AuthModel.get().getCurrentUid(), clanId, startTime, endTime) + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function, SingleSource>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + /** + * 獲取主播收入流水 + * @param clanId + * @param startTime + * @param endTime + * @return + */ + @Override + public Single getLiveIncomeList(long clanId, String startTime, String endTime) { + return api.getLiveIncomeList(clanId, startTime, endTime) + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function, SingleSource>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + @Override + public Single getSingleRoomIncomeList(String clanId, String hallId, String startTime, String endTime) { + return api.getSingleRoomIncomeList(clanId, hallId, startTime, endTime) + .compose(RxHelper.handleSchAndExce()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single> incomeDetail(long memberId, long hallId, String startTimeStr, String endTimeStr) { + return api.incomeDetail(AuthModel.get().getCurrentUid(), memberId, hallId, startTimeStr, endTimeStr) + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function>, SingleSource>>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + @Override + public Single getHallIncomeList(long hallId, String startTime, String endTime) { + return api.getHallIncomeList(AuthModel.get().getCurrentUid(), hallId, startTime, endTime) + .compose(RxHelper.handleSchAndExce()) + .flatMap((Function, SingleSource>) response -> { + if (response.isSuccess()) { + return Single.just(response.getData()); + } else { + return Single.error(new Throwable(response.getMessage())); + } + + }); + } + + private interface Api { + + /** + * 收入统计 + */ + @POST("/income/incomeTotal") + Single> incomeTotal(@Query("uid") long uid, + @Query("hallId") long hallId, + @Query("startTimeStr") String startTimeStr, + @Query("endTimeStr") String endTimeStr); + + @POST("/income/incomeDetail") + Single>> incomeDetail(@Query("uid") long uid, + @Query("memberId") long memberId, + @Query("hallId") long hallId, + @Query("startTimeStr") String startTimeStr, + @Query("endTimeStr") String endTimeStr); + + /** + * 获取家族收入列表 + */ + @GET("/clan/income/totalList") + Single> getClanIncomeList(@Query("uid") long uid, + @Query("clanId") long clanId, + @Query("startTime") String startTime, + @Query("endTime") String endTime); + + /** + * 获取主播收入列表 + */ + @GET("/clan/income/hallMemberTotalList") + Single> getLiveIncomeList(@Query("clanId") long clanId, + @Query("startTime") String startTime, + @Query("endTime") String endTime); + + /** + * 获取公会收入列表 + */ + @GET("/income/totalList") + Single> getHallIncomeList(@Query("uid") long uid, + @Query("hallId") long hallId, + @Query("startTime") String startTime, + @Query("endTime") String endTime); + + /** + * 获取个播房收入列表 + */ + @FormUrlEncoded + @POST("/income/singleroom/incomeTotalV2") + Single> getSingleRoomIncomeList(@Field("clanId") String clanId, + @Field("hallId") String hallId, + @Field("startTime") String startTime, + @Field("endTime") String endTime); + } + + private static final class Helper { + public static final IncomeModel INSTANCE = new IncomeModel(); + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanIncomeInfo.java new file mode 100644 index 0000000..7ff89a8 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanIncomeInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.module_hall.income.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class ClanIncomeInfo implements Serializable { + private double bagIncome; + private String hallAvatar; + private String hallName; + private double roomIncome; + private double normalGiftIncome; + private String giftUv; + private String newUserSendGiftNum; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanTotalIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanTotalIncomeInfo.java new file mode 100644 index 0000000..2e38c9f --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/ClanTotalIncomeInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.module_hall.income.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class ClanTotalIncomeInfo { + + private double total; + private List income; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallIncomeInfo.java new file mode 100644 index 0000000..9e9b6c8 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallIncomeInfo.java @@ -0,0 +1,147 @@ +package com.chwl.core.module_hall.income.bean; + +import java.io.Serializable; + +public class HallIncomeInfo implements Serializable { + private double bagIncome; + private String hallAvatar; + private String hallName; + private double roomIncome; + private double normalGiftIncome; + private String giftUv; + private String newUserSendGiftNum; + + // + @SuppressWarnings("all") + public HallIncomeInfo() { + } + + @SuppressWarnings("all") + public double getBagIncome() { + return this.bagIncome; + } + + @SuppressWarnings("all") + public String getHallAvatar() { + return this.hallAvatar; + } + + @SuppressWarnings("all") + public String getHallName() { + return this.hallName; + } + + @SuppressWarnings("all") + public double getRoomIncome() { + return this.roomIncome; + } + + @SuppressWarnings("all") + public double getNormalGiftIncome() { + return this.normalGiftIncome; + } + + @SuppressWarnings("all") + public String getGiftUv() { + return this.giftUv; + } + + @SuppressWarnings("all") + public String getNewUserSendGiftNum() { + return this.newUserSendGiftNum; + } + + @SuppressWarnings("all") + public void setBagIncome(final double bagIncome) { + this.bagIncome = bagIncome; + } + + @SuppressWarnings("all") + public void setHallAvatar(final String hallAvatar) { + this.hallAvatar = hallAvatar; + } + + @SuppressWarnings("all") + public void setHallName(final String hallName) { + this.hallName = hallName; + } + + @SuppressWarnings("all") + public void setRoomIncome(final double roomIncome) { + this.roomIncome = roomIncome; + } + + @SuppressWarnings("all") + public void setNormalGiftIncome(final double normalGiftIncome) { + this.normalGiftIncome = normalGiftIncome; + } + + @SuppressWarnings("all") + public void setGiftUv(final String giftUv) { + this.giftUv = giftUv; + } + + @SuppressWarnings("all") + public void setNewUserSendGiftNum(final String newUserSendGiftNum) { + this.newUserSendGiftNum = newUserSendGiftNum; + } + + @Override + @SuppressWarnings("all") + public boolean equals(final Object o) { + if (o == this) return true; + if (!(o instanceof HallIncomeInfo)) return false; + final HallIncomeInfo other = (HallIncomeInfo) o; + if (!other.canEqual((Object) this)) return false; + if (Double.compare(this.getBagIncome(), other.getBagIncome()) != 0) return false; + if (Double.compare(this.getRoomIncome(), other.getRoomIncome()) != 0) return false; + if (Double.compare(this.getNormalGiftIncome(), other.getNormalGiftIncome()) != 0) return false; + final Object this$hallAvatar = this.getHallAvatar(); + final Object other$hallAvatar = other.getHallAvatar(); + if (this$hallAvatar == null ? other$hallAvatar != null : !this$hallAvatar.equals(other$hallAvatar)) return false; + final Object this$hallName = this.getHallName(); + final Object other$hallName = other.getHallName(); + if (this$hallName == null ? other$hallName != null : !this$hallName.equals(other$hallName)) return false; + final Object this$giftUv = this.getGiftUv(); + final Object other$giftUv = other.getGiftUv(); + if (this$giftUv == null ? other$giftUv != null : !this$giftUv.equals(other$giftUv)) return false; + final Object this$newUserSendGiftNum = this.getNewUserSendGiftNum(); + final Object other$newUserSendGiftNum = other.getNewUserSendGiftNum(); + if (this$newUserSendGiftNum == null ? other$newUserSendGiftNum != null : !this$newUserSendGiftNum.equals(other$newUserSendGiftNum)) return false; + return true; + } + + @SuppressWarnings("all") + protected boolean canEqual(final Object other) { + return other instanceof HallIncomeInfo; + } + + @Override + @SuppressWarnings("all") + public int hashCode() { + final int PRIME = 59; + int result = 1; + final long $bagIncome = Double.doubleToLongBits(this.getBagIncome()); + result = result * PRIME + (int) ($bagIncome >>> 32 ^ $bagIncome); + final long $roomIncome = Double.doubleToLongBits(this.getRoomIncome()); + result = result * PRIME + (int) ($roomIncome >>> 32 ^ $roomIncome); + final long $normalGiftIncome = Double.doubleToLongBits(this.getNormalGiftIncome()); + result = result * PRIME + (int) ($normalGiftIncome >>> 32 ^ $normalGiftIncome); + final Object $hallAvatar = this.getHallAvatar(); + result = result * PRIME + ($hallAvatar == null ? 43 : $hallAvatar.hashCode()); + final Object $hallName = this.getHallName(); + result = result * PRIME + ($hallName == null ? 43 : $hallName.hashCode()); + final Object $giftUv = this.getGiftUv(); + result = result * PRIME + ($giftUv == null ? 43 : $giftUv.hashCode()); + final Object $newUserSendGiftNum = this.getNewUserSendGiftNum(); + result = result * PRIME + ($newUserSendGiftNum == null ? 43 : $newUserSendGiftNum.hashCode()); + return result; + } + + @Override + @SuppressWarnings("all") + public String toString() { + return "ClanIncomeInfo(bagIncome=" + this.getBagIncome() + ", hallAvatar=" + this.getHallAvatar() + ", hallName=" + this.getHallName() + ", roomIncome=" + this.getRoomIncome() + ", normalGiftIncome=" + this.getNormalGiftIncome() + ", giftUv=" + this.getGiftUv() + ", newUserSendGiftNum=" + this.getNewUserSendGiftNum() + ")"; + } + // +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallTotalIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallTotalIncomeInfo.java new file mode 100644 index 0000000..70c87f1 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/HallTotalIncomeInfo.java @@ -0,0 +1,71 @@ +package com.chwl.core.module_hall.income.bean; + +import java.util.List; + +public class HallTotalIncomeInfo { + private double total; + private List income; + + // + @SuppressWarnings("all") + public HallTotalIncomeInfo() { + } + + @SuppressWarnings("all") + public double getTotal() { + return this.total; + } + + @SuppressWarnings("all") + public List getIncome() { + return this.income; + } + + @SuppressWarnings("all") + public void setTotal(final double total) { + this.total = total; + } + + @SuppressWarnings("all") + public void setIncome(final List income) { + this.income = income; + } + + @Override + @SuppressWarnings("all") + public boolean equals(final Object o) { + if (o == this) return true; + if (!(o instanceof HallTotalIncomeInfo)) return false; + final HallTotalIncomeInfo other = (HallTotalIncomeInfo) o; + if (!other.canEqual((Object) this)) return false; + if (Double.compare(this.getTotal(), other.getTotal()) != 0) return false; + final Object this$income = this.getIncome(); + final Object other$income = other.getIncome(); + if (this$income == null ? other$income != null : !this$income.equals(other$income)) return false; + return true; + } + + @SuppressWarnings("all") + protected boolean canEqual(final Object other) { + return other instanceof HallTotalIncomeInfo; + } + + @Override + @SuppressWarnings("all") + public int hashCode() { + final int PRIME = 59; + int result = 1; + final long $total = Double.doubleToLongBits(this.getTotal()); + result = result * PRIME + (int) ($total >>> 32 ^ $total); + final Object $income = this.getIncome(); + result = result * PRIME + ($income == null ? 43 : $income.hashCode()); + return result; + } + + @Override + @SuppressWarnings("all") + public String toString() { + return "ClanTotalIncomeInfo(total=" + this.getTotal() + ", income=" + this.getIncome() + ")"; + } + // +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeGiftInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeGiftInfo.java new file mode 100644 index 0000000..cc40a66 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeGiftInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.module_hall.income.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class IncomeGiftInfo implements Serializable { + + private long giftId; + private String giftName; + private long goldPrice; + private String picUrl; + private int giftNum; + private long totalGoldNum; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeInfo.java new file mode 100644 index 0000000..7b73a0e --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeInfo.java @@ -0,0 +1,21 @@ +package com.chwl.core.module_hall.income.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class IncomeInfo implements Serializable { + /** 序号 */ + private String rowNum; + /** uid */ + private long reciveUid; + /** 个人总计 */ + private long totalGoldNum; + /** 头像 */ + private String avatar; + /** 昵称 */ + private String nick; + /** 耳伴号 */ + private long erbanNo; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeTotalInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeTotalInfo.java new file mode 100644 index 0000000..38ef0a8 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/IncomeTotalInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.module_hall.income.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class IncomeTotalInfo { + + private long total; + private List vos; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveIncomeInfo.java new file mode 100644 index 0000000..86f42ec --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveIncomeInfo.java @@ -0,0 +1,18 @@ +package com.chwl.core.module_hall.income.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class LiveIncomeInfo implements Serializable { + private Long uid; + private String nick; + private String avatar; + private Double income; + + private Long hallId; + private Long hallOwnerUid; + private String hallAvatar; + private String hallName; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveTotalIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveTotalIncomeInfo.java new file mode 100644 index 0000000..9122ca5 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/LiveTotalIncomeInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.module_hall.income.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class LiveTotalIncomeInfo { + + private double total; + private List memberIncome; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomIncomeInfo.java new file mode 100644 index 0000000..9c12c48 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomIncomeInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.module_hall.income.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class SingleRoomIncomeInfo implements Serializable { + private String erbanNo; + private String uid; + private String nick; + private String avatar; + private double roomDiamondNum; + private double anchorDiamondNum; +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomTotalIncomeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomTotalIncomeInfo.java new file mode 100644 index 0000000..5973832 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/bean/SingleRoomTotalIncomeInfo.java @@ -0,0 +1,13 @@ +package com.chwl.core.module_hall.income.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class SingleRoomTotalIncomeInfo { + + private double totalDiamond; + private List incomes; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/income/event/UpdateMemberListEvent.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/event/UpdateMemberListEvent.java new file mode 100644 index 0000000..f5016ab --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/income/event/UpdateMemberListEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.module_hall.income.event; + +public class UpdateMemberListEvent { +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/ISecretCodeModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/ISecretCodeModel.java new file mode 100644 index 0000000..be1797c --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/ISecretCodeModel.java @@ -0,0 +1,26 @@ +package com.chwl.core.module_hall.secretcode; + +import com.chwl.core.module_hall.secretcode.bean.CheckCodeResult; +import com.chwl.core.module_hall.secretcode.bean.SecretCodeInfo; + +import io.reactivex.Single; + +/** + * Created by lvzebiao on 2019/2/22. + */ + +public interface ISecretCodeModel { + + /** + * 获取暗号 + */ + Single getSecretCodeInfo(); + + /** + * 暗号校验 + */ + Single checkCode(String code); + + Single joinByCode(String code); + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/SecretCodeModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/SecretCodeModel.java new file mode 100644 index 0000000..6b29903 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/SecretCodeModel.java @@ -0,0 +1,98 @@ +package com.chwl.core.module_hall.secretcode; + +import com.google.gson.JsonElement; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.module_hall.secretcode.bean.CheckCodeResult; +import com.chwl.core.module_hall.secretcode.bean.SecretCodeInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * 暗号相关的接口数据类 + * Created by lvzebiao on 2019/2/22. + */ + +public class SecretCodeModel extends BaseModel implements ISecretCodeModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final SecretCodeModel INSTANCE = new SecretCodeModel(); + } + + public static SecretCodeModel get() { + return Helper.INSTANCE; + } + + /** + * 获取暗号 + */ + @Override + public Single getSecretCodeInfo() { + return api.getEmojiCode(AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon()); + } + + /** + * 暗号校验 + */ + @Override + public Single checkCode(String code) { + return api.checkCode(AuthModel.get().getCurrentUid(), code) + .compose(RxHelper.handleCommon()); + } + + @Override + public Single joinByCode(String code) { + return api.joinByCode(AuthModel.get().getCurrentUid(), code) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_secretcode_secretcodemodel_01)); + } + return Single.error(RxHelper.createThrowable(result)); + }); + } + + private interface Api { + /** + * 获取emoji暗号邀请码 + * @param uid uid + */ + @GET("hall/getEmojiCode") + Single> getEmojiCode(@Query("uid") long uid); + + /** + * 校验暗号邀请码 + * + * @param code 包含暗号码的一段文本 + */ + @POST("hall/checkCode") + @FormUrlEncoded + Single> checkCode(@Field("uid") long uid, + @Field("code") String code); + + /** + * 校验暗号邀请码 + * + * @param code 校验成功服务端返回的暗号码 + */ + @POST("hall/joinByCode") + @FormUrlEncoded + Single> joinByCode(@Field("uid") long uid, + @Field("code") String code); + + + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/CheckCodeResult.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/CheckCodeResult.java new file mode 100644 index 0000000..d4cbd6b --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/CheckCodeResult.java @@ -0,0 +1,68 @@ +package com.chwl.core.module_hall.secretcode.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 暗号码检测结果 + * Created by lvzebiao on 2019/2/27. + */ +@Data +public class CheckCodeResult implements Serializable { + + /** + * 暗号已过期或不存在 + */ + public final static int CODE_OUT_OF_DATA_OR_NOEXIST = 90131; + /** + * 暗号不存在 + */ + public final static int TYPE_PWD_CODE_NO_EXIST = 0; + /** + * 模厅暗号 + */ + public final static int TYPE_PWD_CODE_HALL = 1; + + /** + * 校验不通过的code + * 90131 暗号已过期或不存在 + * 90106 该厅不存在 + * 90132 你已经是厅成员啦! + * 90107 只能加入一个厅哦! + * 90105 厅人数达到上限 + * 90109 退出7天后才可以重新加入 + */ + private int code; + /** + * 校验不通过的msg + */ + private String msg; + /** + * 转码之后的暗号,校验成功才会返回 + */ + private String emojiCode; + + private String nick; + /** + * 厅名字 + */ + private String hallName; + + /** + * 暗号类型 + */ + private int type; + /** + * 优先判断字段,为ture才弹框 + */ + private boolean showDialog; + + public String getMsg() { + if (msg == null) { + msg = ""; + } + return msg; + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/SecretCodeInfo.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/SecretCodeInfo.java new file mode 100644 index 0000000..e249426 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/secretcode/bean/SecretCodeInfo.java @@ -0,0 +1,36 @@ +package com.chwl.core.module_hall.secretcode.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by lvzebiao on 2019/2/22. + */ +@Data +public class SecretCodeInfo implements Serializable { + /** + * emoji暗号(含换行符) + */ + private String emojiCode; + /** + * 分享内容 + */ + private String shareContent; + /** + * 失效时间,拼接好的字符串 + */ + private String expireDateStr; + /** + * 失效时间戳 + */ + private long expireDate; + + /** + * 登录用户uid,如果uid不一致,则表示缓存无效 + */ + private long uid; + /**缓存的时候的时间戳*/ + private long saveTime; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/HTeamModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/HTeamModel.java new file mode 100644 index 0000000..33ae0a6 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/HTeamModel.java @@ -0,0 +1,411 @@ +package com.chwl.core.module_hall.team; + +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.module_hall.hall.HallModel; +import com.chwl.core.module_hall.hall.bean.HTeamInfo; +import com.chwl.core.module_hall.hall.bean.ListHTeamMember; +import com.chwl.core.module_hall.hall.bean.ListMemberInfo; +import com.chwl.core.module_hall.team.bean.HTeamChatLimit; +import com.chwl.core.module_hall.team.event.HteamInfoUpdateInfoEvent; +import com.chwl.core.module_hall.team.event.HteamListChangeEvent; +import com.chwl.core.module_hall.team.event.HteamMemberNumChangeEvent; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * HTeam = HallTeam 代表模厅群 + * Created by lvzebiao on 2019/1/7. + */ + +public class HTeamModel extends BaseModel implements IHTeamModel { + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final HTeamModel INSTANCE = new HTeamModel(); + } + + public static HTeamModel get() { + return Helper.INSTANCE; + } + + /** + * 清空群组的聊天记录(本地的) + * + * @param tid 云信群组 ID + */ + @Override + public void clearChattingHistory(String tid) { + NIMClient.getService(MsgService.class) + .clearChattingHistory(tid, SessionTypeEnum.Team); + } + + @Override + public Single getHTeamLimitInfo() { + return api.getGroupChatLimit().compose(RxHelper.handleCommon(HTeamChatLimit::new)); + } + + /** + * @param hallId 厅id + * @param icon 群头像 + * @param name 群名称 + * @param members 群成员 + * @param type 1公开群,2内部群 + */ + @Override + public Single createHTeam(long hallId, String icon, String name, String members, int type) { + return api.createHTeam( + AuthModel.get().getCurrentUid(), + hallId, + icon, + name, + members, + type, + "" + ) + .compose(RxHelper.handleCommon(null)) + .doOnSuccess(info -> EventBus.getDefault().post(new HteamListChangeEvent())); + } + + /** + * @param type 群聊类型:1:公开群,2:内部群,空:全部 + */ + @Override + public Single> getGroupChatList(String type) { + return api.getGroupChatList(HallModel.get().getHallId(), AuthModel.get().getCurrentUid(), type) + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + /** + * @param tid 云信群id + */ + @Override + public Single getDetailHTeamInfo(String tid) { + return api.getGroupChat(tid, AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleCommon()) + .doOnSuccess(hTeamInfo -> + EventBus.getDefault().post(new HteamInfoUpdateInfoEvent(hTeamInfo))); + } + + /** + * @param chatId 服务器群Id + * @param promptStatus true 开启免打扰 + */ + @Override + public Single updateTeamPrompt(long chatId, boolean promptStatus) { + return api.updateTeamPrompt(chatId, AuthModel.get().getCurrentUid(), promptStatus) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_01)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 更新群信息 + */ + @Override + public Single updateTeamInfo(long chatId, String icon, String name, String notice) { + return api.updateTeamInfo(AuthModel.get().getCurrentUid(), chatId, icon, name, notice) + .compose(RxHelper.handleCommon(() -> ResUtil.getString(R.string.module_hall_team_hteammodel_02))); + } + + + @Override + public Single getAllMembers(long chatId, int page, int pageSize) { + return api.getTeamAllMembers(chatId, page, pageSize) + .compose(RxHelper.handleCommon(ListHTeamMember::new)); + } + + /** + * 设置管理员 + */ + @Override + public Single setHteamManager(long chatId, long targetUid) { + return api.setHteamManager(chatId, AuthModel.get().getCurrentUid(), targetUid) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_03)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 取消管理员 + */ + @Override + public Single removeHteamManager(long chatId, long targetUid) { + return api.removeHteamManager(chatId, AuthModel.get().getCurrentUid(), targetUid) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_04)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 禁言/解禁群聊成员 + * + * @param mute 操作参数 true:禁言 false:解禁 + */ + @Override + public Single banHteamMember(long chatId, long targetUid, boolean mute) { + return api.banTeamMember(chatId, AuthModel.get().getCurrentUid(), targetUid, mute) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(mute ? ResUtil.getString(R.string.module_hall_team_hteammodel_05) : ResUtil.getString(R.string.module_hall_team_hteammodel_06)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 踢出群聊成员 + */ + @Override + public Single kickHteamMember(long chatId, String targetUids) { + return api.kickHteamMember(chatId, AuthModel.get().getCurrentUid(), targetUids) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_07)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 获取不在指定群聊里面的模厅成员 + */ + @Override + public Single getHallMemberButChat(long chatId, int page, int pageSize) { + return api.getHallMemberButChat(chatId, page, pageSize) + .compose(RxHelper.handleCommon(ListMemberInfo::new)); + } + + /** + * 邀请进群 + * + * @param targetUids 1001,1002 逗号分隔 + */ + @Override + public Single invateHteamMember(long chatId, String targetUids) { + return api.inviteHteamMember(chatId, AuthModel.get().getCurrentUid(), targetUids) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + EventBus.getDefault().post(new HteamMemberNumChangeEvent(chatId)); + EventBus.getDefault().post(new HteamListChangeEvent()); + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_08)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 解散群聊 + */ + @Override + public Single deleteHteam(long chatId) { + return api.deleteHteam(AuthModel.get().getCurrentUid(), chatId) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + EventBus.getDefault().post(new HteamListChangeEvent()); + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_09)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 成员退出群聊 + */ + @Override + public Single quitHteam(long chatId) { + return api.quitHteam(AuthModel.get().getCurrentUid(), chatId) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + EventBus.getDefault().post(new HteamListChangeEvent()); + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_010)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + /** + * 主动加入群 + */ + @Override + public Single joinHteam(long chatId) { + return api.joinHteam(AuthModel.get().getCurrentUid(), chatId) + .compose(RxHelper.handleSchAndExce()) + .flatMap(result -> { + if (result.isSuccess()) { + EventBus.getDefault().post(new HteamListChangeEvent()); + return Single.just(ResUtil.getString(R.string.module_hall_team_hteammodel_011)); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + }); + } + + private interface Api { + + /** + * 获取群聊数量限制配置 + */ + @GET("/hall/group/getGroupChatLimit") + Single> getGroupChatLimit(); + + /** + * 创建厅群 + */ + @POST("/hall/group/create") + Single> createHTeam(@Query("uid") long uid, + @Query("hallId") long hallId, + @Query("icon") String icon, + @Query("name") String name, + @Query("members") String members, + @Query("type") int type, + @Query("notice") String notice); + + /** + * 获取模厅群聊列表 + */ + @GET("/hall/group/getGroupChatList") + Single>> getGroupChatList(@Query("hallId") long hallId, + @Query("uid") long uid, + @Query("type") String type); + + /** + * 获取群聊资料 + */ + @GET("/hall/group/getGroupChat") + Single> getGroupChat(@Query("tid") String tid, + @Query("uid") long uid); + + /** + * 群消息免打扰 + */ + @POST("/hall/group/prompt") + Single> updateTeamPrompt(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("promptStatus") boolean promptStatus); + + /** + * 更新群信息 + */ + @POST("/hall/group/update") + Single> updateTeamInfo(@Query("uid") long uid, + @Query("chatId") long chatId, + @Query("icon") String icon, + @Query("name") String name, + @Query("notice") String notice); + + /** + * 获取群的成员列表 + */ + @GET("/hall/group/getAllMembers") + Single> getTeamAllMembers(@Query("chatId") long chatId, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 设置群管理 + */ + @POST("/hall/group/setManager") + Single> setHteamManager(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("targetUid") long targetUid); + + /** + * 取消群管理 + */ + @POST("/hall/group/unManager") + Single> removeHteamManager(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("targetUid") long targetUid); + + /** + * 禁言/解禁群聊成员 + * + * @param mute 操作参数 true:禁言 false:解禁 + */ + @POST("/hall/group/banned") + Single> banTeamMember(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("targetUid") long targetUid, + @Query("mute") boolean mute); + + /** + * 踢出群聊成员 + */ + @POST("/hall/group/kickMember") + Single> kickHteamMember(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("targetUids") String targetUids); + + /** + * 邀请进群 + */ + @POST("/hall/group/addMember") + Single> inviteHteamMember(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("targetUids") String targetUids); + + /** + * 获取不在指定群聊里面的模厅成员 + */ + @GET("/hall/getNotExistChat") + Single> getHallMemberButChat(@Query("chatId") long chatId, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 解散群聊 + */ + @POST("/hall/group/remove") + Single> deleteHteam(@Query("uid") long uid, + @Query("chatId") long chatId); + + /** + * 成员退出群聊 + */ + @POST("/hall/group/leave") + Single> quitHteam(@Query("uid") long uid, + @Query("chatId") long chatId); + + /** + * 成员主动加入群聊 + */ + @POST("/hall/group/join") + Single> joinHteam(@Query("uid") long uid, + @Query("chatId") long chatId); + + } + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/IHTeamModel.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/IHTeamModel.java new file mode 100644 index 0000000..b3f856b --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/IHTeamModel.java @@ -0,0 +1,124 @@ +package com.chwl.core.module_hall.team; + +import com.chwl.core.module_hall.hall.bean.HTeamInfo; +import com.chwl.core.module_hall.hall.bean.ListHTeamMember; +import com.chwl.core.module_hall.hall.bean.ListMemberInfo; +import com.chwl.core.module_hall.team.bean.HTeamChatLimit; + +import java.util.List; + +import io.reactivex.Single; + +/** + * 厅群接口类 + * Created by lvzebiao on 2019/1/7. + */ + +public interface IHTeamModel { + /** + * 清空群组的聊天记录(本地的) + * + * @param tid 群id + */ + void clearChattingHistory(String tid); + + /** + * 获取群聊数量限制配置 + */ + Single getHTeamLimitInfo(); + + /** + * 创建厅群 + * + * @param hallId 厅id + * @param icon 群头像 + * @param name 群名称 + * @param members 群成员 + * @param type 1公开群,2内部群 + */ + Single createHTeam(long hallId, + String icon, + String name, + String members, + int type); + + /** + * @param type 群聊类型:1:公开群,2:内部群,空:全部 + */ + Single> getGroupChatList(String type); + + /** + * 获取群资料 + * + * @param tid 云信群id + */ + Single getDetailHTeamInfo(String tid); + + /** + * 消息免打扰 + * + * @param chatId 服务器群Id + * @param promptStatus true 开启免打扰 + */ + Single updateTeamPrompt(long chatId, boolean promptStatus); + + /** + * 更新群信息 + */ + Single updateTeamInfo(long chatId, String icon, String name, String notice); + + /** + * 获取所有群成员 + */ + Single getAllMembers(long chatId, int page, int pageSize); + + /** + * 设置群管理 + */ + Single setHteamManager(long chatId, long targetUid); + + /** + * 取消群管理 + */ + Single removeHteamManager(long chatId, long targetUid); + + /** + * 禁言/解禁群聊成员 + * + * @param mute 操作参数 true:禁言 false:解禁 + */ + Single banHteamMember(long chatId, long targetUid, boolean mute); + + /** + * 踢出群聊成员 + */ + Single kickHteamMember(long chatId, String targetUids); + + /** + * 邀请进群 + * + * @param targetUids 1001,1002 逗号分隔 + */ + Single invateHteamMember(long chatId, String targetUids); + + /** + * 获取不在指定群聊里面的模厅成员 + */ + Single getHallMemberButChat(long chatId, int page, int pageSize); + + /** + * 群主解散群聊 + */ + Single deleteHteam(long chatId); + + /** + * 成员退出群聊 + */ + Single quitHteam(long chatId); + + /** + * 主动加入群 + */ + Single joinHteam(long chatId); + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamChatLimit.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamChatLimit.java new file mode 100644 index 0000000..352c35a --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamChatLimit.java @@ -0,0 +1,18 @@ +package com.chwl.core.module_hall.team.bean; + +import lombok.Data; + +/** + * 厅群数量限制信息 + * Created by lvzebiao on 2019/1/10. + */ +@Data +public class HTeamChatLimit { + /**公开群聊上限*/ + private int publicMax; + /**内部群聊上限*/ + private int privateMax; + /**群聊人数上限*/ + private int memberMax; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamType.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamType.java new file mode 100644 index 0000000..f277855 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/bean/HTeamType.java @@ -0,0 +1,14 @@ +package com.chwl.core.module_hall.team.bean; + +/** + * 群类型 + * Created by lvzebiao on 2019/1/11. + */ + +public interface HTeamType { + /**公开群*/ + int PUBLIC = 1; + /**内部群*/ + int PRIVATE = 2; + +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamInfoUpdateInfoEvent.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamInfoUpdateInfoEvent.java new file mode 100644 index 0000000..73eb4fd --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamInfoUpdateInfoEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.module_hall.team.event; + +import com.chwl.core.base.BaseBusEvent; +import com.chwl.core.module_hall.hall.bean.HTeamInfo; + +/** + * Created by lvzebiao on 2019/1/15. + */ + +public class HteamInfoUpdateInfoEvent extends BaseBusEvent { + public HteamInfoUpdateInfoEvent(HTeamInfo data) { + super(data); + } +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamListChangeEvent.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamListChangeEvent.java new file mode 100644 index 0000000..f39d2c7 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamListChangeEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.module_hall.team.event; + +/** + * 厅群列表改变的事件 + * Created by lvzebiao on 2019/1/15. + */ + +public class HteamListChangeEvent { +} diff --git a/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamMemberNumChangeEvent.java b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamMemberNumChangeEvent.java new file mode 100644 index 0000000..40b9d99 --- /dev/null +++ b/core/src/model_labour_union/java/com/chwl/core/module_hall/team/event/HteamMemberNumChangeEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.module_hall.team.event; + +import com.chwl.core.base.BaseBusEvent; + +/** + * 厅群的成员变动事件 + * Created by lvzebiao on 2019/1/16. + */ + +public class HteamMemberNumChangeEvent extends BaseBusEvent { + public HteamMemberNumChangeEvent(Long data) { + super(data); + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionFourAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionFourAttachment.java new file mode 100644 index 0000000..bf25f69 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionFourAttachment.java @@ -0,0 +1,13 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.chwl.core.im.custom.bean.CustomAttachment; + +public class MentoringApprenticeMissionFourAttachment extends MentoringMasterMissionFourAttachment { + + + public MentoringApprenticeMissionFourAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_APPRENTICE); + } + +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionOneAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionOneAttachment.java new file mode 100644 index 0000000..b38065f --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionOneAttachment.java @@ -0,0 +1,13 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.chwl.core.im.custom.bean.CustomAttachment; + +public class MentoringApprenticeMissionOneAttachment extends MentoringMasterMissionOneAttachment { + + + public MentoringApprenticeMissionOneAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_APPRENTICE); + } + +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionThreeAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionThreeAttachment.java new file mode 100644 index 0000000..b51aa26 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionThreeAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MissionVo; +import com.chwl.core.mentoring_relationship.bean.SimpleGiftVo; + +public class MentoringApprenticeMissionThreeAttachment extends MentoringMasterMissionThreeAttachment { + + private MissionVo simpleGiftVoMissionVo; + + public MentoringApprenticeMissionThreeAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_APPRENTICE); + } + + @Override + protected void parseData(JSONObject data) { + simpleGiftVoMissionVo = JSON.parseObject(String.valueOf(data), + new TypeReference>() { + }); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(simpleGiftVoMissionVo)); + } + + public MissionVo getSimpleGiftVoMissionVo() { + return simpleGiftVoMissionVo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionTwoAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionTwoAttachment.java new file mode 100644 index 0000000..b6f7fa8 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringApprenticeMissionTwoAttachment.java @@ -0,0 +1,11 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.chwl.core.im.custom.bean.CustomAttachment; + +public class MentoringApprenticeMissionTwoAttachment extends MentoringMasterMissionTwoAttachment { + + public MentoringApprenticeMissionTwoAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_APPRENTICE); + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringGrabApprenticesAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringGrabApprenticesAttachment.java new file mode 100644 index 0000000..e7e94f8 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringGrabApprenticesAttachment.java @@ -0,0 +1,31 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.GrabApprenticesMissionInfo; + +public class MentoringGrabApprenticesAttachment extends CustomAttachment { + + private GrabApprenticesMissionInfo grabApprenticesMissionInfo; + + public MentoringGrabApprenticesAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_GRAB_APPRENTICES); + } + + @Override + protected void parseData(JSONObject data) { + grabApprenticesMissionInfo = JSON.parseObject(String.valueOf(data), + GrabApprenticesMissionInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(grabApprenticesMissionInfo)); + } + + public GrabApprenticesMissionInfo getGrabApprenticesMissionInfo() { + return grabApprenticesMissionInfo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionFourAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionFourAttachment.java new file mode 100644 index 0000000..b82ef0f --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionFourAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MissionVo; + +public class MentoringMasterMissionFourAttachment extends CustomAttachment { + + private MissionVo missionVo; + + public MentoringMasterMissionFourAttachment(int first, int second) { + super(first, second); + } + + public MentoringMasterMissionFourAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_MASTER); + } + + @Override + protected void parseData(JSONObject data) { + missionVo = JSON.parseObject(String.valueOf(data), MissionVo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(missionVo)); + } + + public MissionVo getMissionVo() { + return missionVo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionOneAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionOneAttachment.java new file mode 100644 index 0000000..db96cd3 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionOneAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MissionVo; +import com.chwl.core.mentoring_relationship.bean.SimpleUserVo; + +public class MentoringMasterMissionOneAttachment extends CustomAttachment { + + private MissionVo simpleUserVoMissionVo; + + public MentoringMasterMissionOneAttachment(int first, int second) { + super(first, second); + } + + public MentoringMasterMissionOneAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER); + } + + @Override + protected void parseData(JSONObject data) { + simpleUserVoMissionVo = JSON.parseObject(String.valueOf(data), + new TypeReference>() { + }); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(simpleUserVoMissionVo)); + } + + public MissionVo getSimpleUserVoMissionVo() { + return simpleUserVoMissionVo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionThreeAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionThreeAttachment.java new file mode 100644 index 0000000..c763401 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionThreeAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MissionVo; + +public class MentoringMasterMissionThreeAttachment extends CustomAttachment { + + private MissionVo missionVo; + + public MentoringMasterMissionThreeAttachment(int first, int second) { + super(first, second); + } + + public MentoringMasterMissionThreeAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_MASTER); + } + + @Override + protected void parseData(JSONObject data) { + missionVo = JSON.parseObject(String.valueOf(data), MissionVo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(missionVo)); + } + + public MissionVo getMissionVo() { + return missionVo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionTwoAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionTwoAttachment.java new file mode 100644 index 0000000..8337524 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMasterMissionTwoAttachment.java @@ -0,0 +1,38 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MissionVo; +import com.chwl.core.mentoring_relationship.bean.SimpleGiftVo; + +public class MentoringMasterMissionTwoAttachment extends CustomAttachment { + + private MissionVo simpleGiftVoMissionVo; + + public MentoringMasterMissionTwoAttachment(int first, int second) { + super(first, second); + } + + public MentoringMasterMissionTwoAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_MASTER); + } + + @Override + protected void parseData(JSONObject data) { + simpleGiftVoMissionVo = JSON.parseObject(String.valueOf(data), + new TypeReference>() { + }); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(simpleGiftVoMissionVo)); + } + + public MissionVo getSimpleGiftVoMissionVo() { + return simpleGiftVoMissionVo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMissionTipsAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMissionTipsAttachment.java new file mode 100644 index 0000000..0b3a29a --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringMissionTipsAttachment.java @@ -0,0 +1,34 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MentoringTipsInfo; + +public class MentoringMissionTipsAttachment extends CustomAttachment { + + private MentoringTipsInfo mentoringTipsInfo; + + public MentoringMissionTipsAttachment(int second) { + super(CUSTOM_MSG_MENTORING_RELATIONSHIP, second); + } + + @Override + protected void parseData(JSONObject data) { + super.parseData(data); + mentoringTipsInfo = JSON.parseObject(String.valueOf(data), MentoringTipsInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(mentoringTipsInfo)); + } + + public MentoringTipsInfo getMentoringTipsInfo() { + return mentoringTipsInfo; + } + + public void setMentoringTipsInfo(MentoringTipsInfo mentoringTipsInfo) { + this.mentoringTipsInfo = mentoringTipsInfo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringSharingRoomAttachment.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringSharingRoomAttachment.java new file mode 100644 index 0000000..68ce6d8 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/attachment/MentoringSharingRoomAttachment.java @@ -0,0 +1,35 @@ +package com.chwl.core.mentoring_relationship.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.mentoring_relationship.bean.MentoringSharingRoomInfo; + +public class MentoringSharingRoomAttachment extends CustomAttachment { + + private MentoringSharingRoomInfo mentoringSharingRoomInfo; + + public MentoringSharingRoomAttachment() { + super(CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP, + CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_SHARE_ROOM); + } + + @Override + protected void parseData(JSONObject data) { + this.mentoringSharingRoomInfo = JSON.parseObject(String.valueOf(data), + MentoringSharingRoomInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(mentoringSharingRoomInfo)); + } + + public MentoringSharingRoomInfo getMentoringSharingRoomInfo() { + return mentoringSharingRoomInfo; + } + + public void setMentoringSharingRoomInfo(MentoringSharingRoomInfo mentoringSharingRoomInfo) { + this.mentoringSharingRoomInfo = mentoringSharingRoomInfo; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesInfo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesInfo.kt new file mode 100644 index 0000000..2e383f0 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesInfo.kt @@ -0,0 +1,28 @@ +package com.chwl.core.mentoring_relationship.bean + +data class GrabApprenticesInfo( + /** + * 用户uid + */ + val uid: Long = 0L, + /** + * MoliStar号 + */ + val erbanNo: Long = 0L, + /** + * 头像 + */ + val avatar: String = "", + /** + * 昵称 + */ + val nick: String = "", + /** + * 性别 1.男 2.女 + */ + val gender: Byte = 0, + /** + * 倒计时数值(仅客户端 UI 要用到) + */ + var countDown: Int = 0 +) \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesMissionInfo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesMissionInfo.kt new file mode 100644 index 0000000..0101a50 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/GrabApprenticesMissionInfo.kt @@ -0,0 +1,9 @@ +package com.chwl.core.mentoring_relationship.bean + +data class GrabApprenticesMissionInfo( + /** + * 倒计时数值 + */ + val countDown: Int = 0, + val apprentices: List? = null +) \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringRankingDataInfo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringRankingDataInfo.kt new file mode 100644 index 0000000..24b4eb2 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringRankingDataInfo.kt @@ -0,0 +1,174 @@ +package com.chwl.core.mentoring_relationship.bean + +data class MentoringRankingDataInfo( + /** + * masterVos : [{"uid":90001,"erbanNo":854623,"avatar":"shdlskdsjl.jpg","nick":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_01),"gender":2,"nobleUsers":{"uid":900014,"nobleId":3,"nobleName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_02),"expire":1621871997000,"badgeId":66,"badge":"badge_3_2","cardbgId":67,"cardbg":"https://image.zhongjialx.com/cardbg/cardbg_3_1.png","zonebgId":68,"zonebg":"https://image.zhongjialx.com//zonebg/zonebg_3_1.png","enterHide":0,"rankHide":0,"goodNum":0,"recomCount":0},"userLevelVo":{"experAmount":136493,"charmAmount":1314,"experUrl":"https://image.zhongjialx.com/new_ul_55.png","charmUrl":"https://image.zhongjialx.com/new_ml_3.png","experLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_03),"charmLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_04),"experLevelGrp":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_05),"experLevelSeq":55,"charmLevelSeq":3},"appreniceCount":10,"rank":2}] + * myRankVo : {"uid":90001,"erbanNo":854623,"avatar":"shdlskdsjl.jpg","nick":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_06),"gender":2,"nobleUsers":{"uid":900014,"nobleId":3,"nobleName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_07),"expire":1621871997000,"badgeId":66,"badge":"badge_3_2","cardbgId":67,"cardbg":"https://image.zhongjialx.com/cardbg/cardbg_3_1.png","zonebgId":68,"zonebg":"https://image.zhongjialx.com//zonebg/zonebg_3_1.png","enterHide":0,"rankHide":0,"goodNum":0,"recomCount":0},"userLevelVo":{"experAmount":136493,"charmAmount":1314,"experUrl":"https://image.zhongjialx.com/new_ul_55.png","charmUrl":"https://image.zhongjialx.com/new_ml_3.png","experLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_08),"charmLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_09),"experLevelGrp":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_010),"experLevelSeq":55,"charmLevelSeq":3},"appreniceCount":10,"rank":2} + */ + val myRankVo: MyRankVoBean? = null, + val masterVos: List? = null +) { + companion object { + const val TYPE_THIS_WEEK = 1 + const val TYPE_LAST_WEEK = 2 + } + + data class MyRankVoBean( + /** + * uid : 90001 + * erbanNo : 854623 + * avatar : shdlskdsjl.jpg + * nick : 小决绝 + * gender : 2 + * nobleUsers : {"uid":900014,"nobleId":3,"nobleName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_011),"expire":1621871997000,"badgeId":66,"badge":"badge_3_2","cardbgId":67,"cardbg":"https://image.zhongjialx.com/cardbg/cardbg_3_1.png","zonebgId":68,"zonebg":"https://image.zhongjialx.com//zonebg/zonebg_3_1.png","enterHide":0,"rankHide":0,"goodNum":0,"recomCount":0} + * userLevelVo : {"experAmount":136493,"charmAmount":1314,"experUrl":"https://image.zhongjialx.com/new_ul_55.png","charmUrl":"https://image.zhongjialx.com/new_ml_3.png","experLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_012),"charmLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_013),"experLevelGrp":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_014),"experLevelSeq":55,"charmLevelSeq":3} + * apprenticeCount : 10 + * rank : 2 + */ + val uid: Int = 0, + val erbanNo: Int = 0, + val avatar: String = "", + val nick: String = "", + val gender: Int = 0, + val nobleUsers: NobleUsersBean? = null, + val userLevelVo: UserLevelVoBean? = null, + val apprenticeCount: Int = 0, + val rank: Int = 0 + ) + + data class MasterVosBean( + /** + * uid : 90001 + * erbanNo : 854623 + * avatar : shdlskdsjl.jpg + * nick : 小决绝 + * gender : 2 + * nobleUsers : {"uid":900014,"nobleId":3,"nobleName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_015),"expire":1621871997000,"badgeId":66,"badge":"badge_3_2","cardbgId":67,"cardbg":"https://image.zhongjialx.com/cardbg/cardbg_3_1.png","zonebgId":68,"zonebg":"https://image.zhongjialx.com//zonebg/zonebg_3_1.png","enterHide":0,"rankHide":0,"goodNum":0,"recomCount":0} + * userLevelVo : {"experAmount":136493,"charmAmount":1314,"experUrl":"https://image.zhongjialx.com/new_ul_55.png","charmUrl":"https://image.zhongjialx.com/new_ml_3.png","experLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_016),"charmLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_017),"experLevelGrp":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringrankingdatainfo_018),"experLevelSeq":55,"charmLevelSeq":3} + * appreniceCount : 10 + * rank : 2 + */ + val uid: Int = 0, + val erbanNo: Int = 0, + val avatar: String = "", + val nick: String = "", + val gender: Int = 0, + val nobleUsers: NobleUsersBeanX? = null, + val userLevelVo: UserLevelVoBeanX? = null, + val appreniceCount: Int = 0, + val rank: Int = 0 + ) + + data class NobleUsersBean( + /** + * uid : 900014 + * nobleId : 3 + * nobleName : 伯爵 + * expire : 1621871997000 + * badgeId : 66 + * badge : badge_3_2 + * cardbgId : 67 + * cardbg : https://image.zhongjialx.com/cardbg/cardbg_3_1.png + * zonebgId : 68 + * zonebg : https://image.zhongjialx.com//zonebg/zonebg_3_1.png + * enterHide : 0 + * rankHide : 0 + * goodNum : 0 + * recomCount : 0 + */ + val uid: Int = 0, + val nobleId: Int = 0, + val nobleName: String = "", + val expire: Long = 0, + val badgeId: Int = 0, + val badge: String = "", + val cardbgId: Int = 0, + val cardbg: String = "", + val zonebgId: Int = 0, + val zonebg: String = "", + val enterHide: Int = 0, + val rankHide: Int = 0, + val goodNum: Int = 0, + val recomCount: Int = 0 + ) + + data class UserLevelVoBean( + /** + * experAmount : 136493 + * charmAmount : 1314 + * experUrl : https://image.zhongjialx.com/new_ul_55.png + * charmUrl : https://image.zhongjialx.com/new_ml_3.png + * experLevelName : 白金Lv5 + * charmLevelName : 初出茅庐LV3 + * experLevelGrp : 高阶石头 + * experLevelSeq : 55 + * charmLevelSeq : 3 + */ + val experAmount: Int = 0, + val charmAmount: Int = 0, + val experUrl: String = "", + val charmUrl: String = "", + val experLevelName: String = "", + val charmLevelName: String = "", + val experLevelGrp: String = "", + val experLevelSeq: Int = 0, + val charmLevelSeq: Int = 0 + ) + + data class NobleUsersBeanX( + /** + * uid : 900014 + * nobleId : 3 + * nobleName : 伯爵 + * expire : 1621871997000 + * badgeId : 66 + * badge : badge_3_2 + * cardbgId : 67 + * cardbg : https://image.zhongjialx.com/cardbg/cardbg_3_1.png + * zonebgId : 68 + * zonebg : https://image.zhongjialx.com//zonebg/zonebg_3_1.png + * enterHide : 0 + * rankHide : 0 + * goodNum : 0 + * recomCount : 0 + */ + val uid: Int = 0, + val nobleId: Int = 0, + val nobleName: String = "", + val expire: Long = 0, + val badgeId: Int = 0, + val badge: String = "", + val cardbgId: Int = 0, + val cardbg: String = "", + val zonebgId: Int = 0, + val zonebg: String = "", + val enterHide: Int = 0, + val rankHide: Int = 0, + val goodNum: Int = 0, + val recomCount: Int = 0 + ) + + data class UserLevelVoBeanX( + /** + * experAmount : 136493 + * charmAmount : 1314 + * experUrl : https://image.zhongjialx.com/new_ul_55.png + * charmUrl : https://image.zhongjialx.com/new_ml_3.png + * experLevelName : 白金Lv5 + * charmLevelName : 初出茅庐LV3 + * experLevelGrp : 高阶石头 + * experLevelSeq : 55 + * charmLevelSeq : 3 + */ + val experAmount: Int = 0, + val charmAmount: Int = 0, + val experUrl: String = "", + val charmUrl: String = "", + val experLevelName: String = "", + val charmLevelName: String = "", + val experLevelGrp: String = "", + val experLevelSeq: Int = 0, + val charmLevelSeq: Int = 0 + ) + +} \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringResultMarqueeInfo.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringResultMarqueeInfo.java new file mode 100644 index 0000000..d080550 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringResultMarqueeInfo.java @@ -0,0 +1,25 @@ +package com.chwl.core.mentoring_relationship.bean; + +import lombok.Data; + +/** + * 师徒页面 结果展示的跑马灯信息 + */ +@Data +public class MentoringResultMarqueeInfo { + + /** + * 师父昵称 + */ + private String masterNick; + + /** + * 徒弟昵称 + */ + private String apprenticeNick; + + /** + * 通知 + */ + private String notice; +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringSharingRoomInfo.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringSharingRoomInfo.java new file mode 100644 index 0000000..8445f6f --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringSharingRoomInfo.java @@ -0,0 +1,39 @@ +package com.chwl.core.mentoring_relationship.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class MentoringSharingRoomInfo implements Serializable { + + /** + * 师父的头像 + */ + private String avatar; + + /** + * 师父的昵称 + */ + private String nick; + + /** + * 师父的房间 UID + */ + private String roomUid; + + /** + * 消息是否已经过期(决定按钮是否能按) + */ + private boolean expired; + + /** + * 师父 UID + */ + private String masterUid; + + /** + * 徒弟 UID + */ + private String apprenticeUid; +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringTipsInfo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringTipsInfo.kt new file mode 100644 index 0000000..704ef7a --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringTipsInfo.kt @@ -0,0 +1,15 @@ +package com.chwl.core.mentoring_relationship.bean + +import java.io.Serializable + +data class MentoringTipsInfo( + /** + * 消息提示的内容 + */ + val tips: String = "", + + /** + * 对话窗口的 UID (正在与当前用户聊天的那个人的 UID) + */ + val sessionId: String = "" +) : Serializable \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringUserInfo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringUserInfo.kt new file mode 100644 index 0000000..2136b64 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MentoringUserInfo.kt @@ -0,0 +1,53 @@ +package com.chwl.core.mentoring_relationship.bean + +data class MentoringUserInfo( + /** + * uid : 900001 + * erbanNo : 564201 + * avatar : https://sjdksdlsskdsk.jpg + * nick : 小雪雪 + * gender : 2 + * userLevelVo : {"experAmount":136493,"charmAmount":1314,"experUrl":"https://image.zhongjialx.com/new_ul_55.png","charmUrl":"https://image.zhongjialx.com/new_ml_3.png","experLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringuserinfo_01),"charmLevelName":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringuserinfo_02),"experLevelGrp":ResUtil.getString(R.string.mentoring_relationship_bean_mentoringuserinfo_03),"experLevelSeq":55,"charmLevelSeq":3} + * type : 1 + */ + val uid: Int = 0, + val erbanNo: Int = 0, + val avatar: String = "", + val nick: String = "", + val gender: Int = 0, + val userLevelVo: UserLevelVoBean? = null, + + /** + * 用户类型(1:我的师傅,2:我的徒弟) + */ + val type: Int = 0 +) { + companion object { + const val TYPE_MASTER: Long = 1 + const val TYPE_APPRENTICE: Long = 2 + } + + data class UserLevelVoBean( + /** + * experAmount : 136493 + * charmAmount : 1314 + * experUrl : https://image.zhongjialx.com/new_ul_55.png + * charmUrl : https://image.zhongjialx.com/new_ml_3.png + * experLevelName : 白金Lv5 + * charmLevelName : 初出茅庐LV3 + * experLevelGrp : 高阶石头 + * experLevelSeq : 55 + * charmLevelSeq : 3 + */ + val experAmount: Int = 0, + val charmAmount: Int = 0, + val experUrl: String = "", + val charmUrl: String = "", + val experLevelName: String = "", + val charmLevelName: String = "", + val experLevelGrp: String = "", + val experLevelSeq: Int = 0, + val charmLevelSeq: Int = 0 + ) + +} \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MissionVo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MissionVo.kt new file mode 100644 index 0000000..07f620d --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/MissionVo.kt @@ -0,0 +1,48 @@ +package com.chwl.core.mentoring_relationship.bean + +import java.io.Serializable + +/** + * Created by chucheng on 2019/1/15. + */ +data class MissionVo( + /** + * 任务标号,任务1、2、3、4... + */ + val step: Int = 0, + + /** + * 标题 + */ + val title: String = "", + + /** + * 提示 + */ + val tips: String = "", + + /** + * 内容 + */ + val content: List? = null, + + /** + * 消息 + */ + val message: String = "", + + /** + * 师父uid + */ + val masterUid: Long = 0, + + /** + * 徒弟uid + */ + val apprenticeUid: Long = 0, + + /** + * 扩展字段,如:礼物信息 + */ + private val data: T? = null +) : Serializable \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/PickUpApprenticeInfo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/PickUpApprenticeInfo.kt new file mode 100644 index 0000000..fc524f2 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/PickUpApprenticeInfo.kt @@ -0,0 +1,23 @@ +package com.chwl.core.mentoring_relationship.bean + +data class PickUpApprenticeInfo( + /** + * 标题 + */ + val title: String = "", + + /** + * 内容 + */ + val content: String = "", + + /** + * 提示 + */ + val tips: String = "", + + /** + * 是否能收徒,true 表示能收徒,false 则不能 + */ + val can: Boolean = false +) \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleGiftVo.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleGiftVo.java new file mode 100644 index 0000000..17d16a4 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleGiftVo.java @@ -0,0 +1,25 @@ +package com.chwl.core.mentoring_relationship.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * Created by chucheng on 2019/1/18. + */ +@Data +public class SimpleGiftVo implements Serializable { + /** + * 礼物id + */ + private int giftId; + /** + * 名称 + */ + private String giftName; + /** + * 图片 + */ + private String picUrl; + +} \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleUserVo.kt b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleUserVo.kt new file mode 100644 index 0000000..1b0cfee --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/bean/SimpleUserVo.kt @@ -0,0 +1,33 @@ +package com.chwl.core.mentoring_relationship.bean + +import java.io.Serializable + +/** + * Created by chucheng on 2019/1/18. + */ +data class SimpleUserVo( + /** + * 用户uid + */ + val uid: Long = 0L, + + /** + * MoliStar号 + */ + val erbanNo: Long = 0L, + + /** + * 头像 + */ + val avatar: String = "", + + /** + * 昵称 + */ + val nick: String = "", + + /** + * 性别 1.男 2.女 + */ + val gender: Byte = 0 +) : Serializable \ No newline at end of file diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesDataEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesDataEvent.java new file mode 100644 index 0000000..dcdff9c --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesDataEvent.java @@ -0,0 +1,16 @@ +package com.chwl.core.mentoring_relationship.event; + +import com.chwl.core.mentoring_relationship.bean.GrabApprenticesInfo; + +import java.util.List; + +import lombok.Data; + +/** + * 抢徒弟消息到达时,消息页数据更新 + */ +@Data +public class GrabApprenticesDataEvent { + + private List grabApprenticesInfoList; +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesEvent.java new file mode 100644 index 0000000..e9a17a2 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/GrabApprenticesEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.mentoring_relationship.event; + +/** + * 抢徒弟消息到达时,在顶部出现一个 dialog 作为提示 + */ +public class GrabApprenticesEvent { +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingEvent.java new file mode 100644 index 0000000..f57b2c2 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.mentoring_relationship.event; + +import lombok.Data; + +@Data +public class MentoringCountingEvent { + + private long millisUntilFinished; + + public long getMillisUntilFinished() { + return millisUntilFinished; + } + + public MentoringCountingEvent setMillisUntilFinished(long millisUntilFinished) { + this.millisUntilFinished = millisUntilFinished; + return this; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingFinishEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingFinishEvent.java new file mode 100644 index 0000000..6a1bffc --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringCountingFinishEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.mentoring_relationship.event; + +public class MentoringCountingFinishEvent { +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringRelationshipMissionEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringRelationshipMissionEvent.java new file mode 100644 index 0000000..b273142 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringRelationshipMissionEvent.java @@ -0,0 +1,20 @@ +package com.chwl.core.mentoring_relationship.event; + +import com.chwl.core.im.custom.bean.CustomAttachment; + +import lombok.Data; + +@Data +public class MentoringRelationshipMissionEvent { + + private CustomAttachment customAttachment; + + public CustomAttachment getCustomAttachment() { + return customAttachment; + } + + public MentoringRelationshipMissionEvent setCustomAttachment(CustomAttachment customAttachment) { + this.customAttachment = customAttachment; + return this; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStartCountingEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStartCountingEvent.java new file mode 100644 index 0000000..28c6b03 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStartCountingEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.mentoring_relationship.event; + +public class MentoringStartCountingEvent { +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStopCountingEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStopCountingEvent.java new file mode 100644 index 0000000..9eba64d --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringStopCountingEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.mentoring_relationship.event; + +public class MentoringStopCountingEvent { +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringSuccessEvent.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringSuccessEvent.java new file mode 100644 index 0000000..0bb760f --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/event/MentoringSuccessEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.mentoring_relationship.event; + +public class MentoringSuccessEvent { +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringAlreadyHasMasterException.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringAlreadyHasMasterException.java new file mode 100644 index 0000000..42b6c99 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringAlreadyHasMasterException.java @@ -0,0 +1,19 @@ +package com.chwl.core.mentoring_relationship.exception; + +public class MentoringAlreadyHasMasterException extends Exception { + + private int code; + + public MentoringAlreadyHasMasterException(String message, int code) { + super(message); + this.code = code; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringCanNotPickUpApprenticeException.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringCanNotPickUpApprenticeException.java new file mode 100644 index 0000000..3dbaece --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringCanNotPickUpApprenticeException.java @@ -0,0 +1,4 @@ +package com.chwl.core.mentoring_relationship.exception; + +public class MentoringCanNotPickUpApprenticeException extends Exception { +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringLessThanFiveMinutesException.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringLessThanFiveMinutesException.java new file mode 100644 index 0000000..5329921 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringLessThanFiveMinutesException.java @@ -0,0 +1,15 @@ +package com.chwl.core.mentoring_relationship.exception; + +public class MentoringLessThanFiveMinutesException extends Exception { + + private int code; + + public MentoringLessThanFiveMinutesException(String message, int code) { + super(message); + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringMissionExpiredException.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringMissionExpiredException.java new file mode 100644 index 0000000..9ffaf61 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/exception/MentoringMissionExpiredException.java @@ -0,0 +1,15 @@ +package com.chwl.core.mentoring_relationship.exception; + +public class MentoringMissionExpiredException extends Exception { + + private int code; + + public MentoringMissionExpiredException(String message, int code) { + super(message); + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/IMentoringRelationshipModel.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/IMentoringRelationshipModel.java new file mode 100644 index 0000000..42cedbd --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/IMentoringRelationshipModel.java @@ -0,0 +1,55 @@ +package com.chwl.core.mentoring_relationship.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringRankingDataInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringResultMarqueeInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringUserInfo; +import com.chwl.core.mentoring_relationship.bean.PickUpApprenticeInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IMentoringRelationshipModel extends IModel { + + /** + * 查询是否能收徒 + */ + Single canPickUpApprentice(); + + /** + * 请求收徒 + */ + Single requestToPickUpApprentice(); + + Single sayHi(long masterUid, long apprenticeUid); + + Single> sendGift(int giftId, + long targetUid, int giftNum, + String msg); + + /** + * 师徒关系建立成功跑马灯信息 + * + * @param page + */ + Single> resultDisplay(int page); + + Single reportMissionThree(long masterUid, long apprenticeUid); + + Single buildMentoringRelationship(long masterUid, long apprenticeUid, int type); + + Single inviteEnable(long masterUid, long apprenticeUid); + + Single sendInvitation(long masterUid, long apprenticeUid); + + Single releaseMentoringRelationship(long masterUid, long apprenticeUid); + + Single getMentoringRankingData(int type, int page); + + Single> getMyMasterAndApprenticesList(int page); + + Single grabApprentices(long apprenticeUid); +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/MentoringRelationshipModel.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/MentoringRelationshipModel.java new file mode 100644 index 0000000..f3a2979 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/model/MentoringRelationshipModel.java @@ -0,0 +1,997 @@ +package com.chwl.core.mentoring_relationship.model; + +import android.os.CountDownTimer; +import android.util.Log; + +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.MsgDirectionEnum; +import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.chwl.core.Constants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.auth.event.LogoutEvent; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.exception.FailReasonException; +import com.chwl.core.exception.UnKnowException; +import com.chwl.core.gift.bean.GiftReceiveInfo; +import com.chwl.core.gift.exception.GiftOutOfDateException; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionFourAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionOneAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionThreeAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringApprenticeMissionTwoAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringGrabApprenticesAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionFourAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionOneAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionThreeAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMasterMissionTwoAttachment; +import com.chwl.core.mentoring_relationship.attachment.MentoringMissionTipsAttachment; +import com.chwl.core.mentoring_relationship.bean.GrabApprenticesInfo; +import com.chwl.core.mentoring_relationship.bean.GrabApprenticesMissionInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringRankingDataInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringResultMarqueeInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringTipsInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringUserInfo; +import com.chwl.core.mentoring_relationship.bean.MissionVo; +import com.chwl.core.mentoring_relationship.bean.PickUpApprenticeInfo; +import com.chwl.core.mentoring_relationship.bean.SimpleGiftVo; +import com.chwl.core.mentoring_relationship.bean.SimpleUserVo; +import com.chwl.core.mentoring_relationship.event.GrabApprenticesDataEvent; +import com.chwl.core.mentoring_relationship.event.GrabApprenticesEvent; +import com.chwl.core.mentoring_relationship.event.MentoringCountingEvent; +import com.chwl.core.mentoring_relationship.event.MentoringCountingFinishEvent; +import com.chwl.core.mentoring_relationship.event.MentoringRelationshipMissionEvent; +import com.chwl.core.mentoring_relationship.event.MentoringStartCountingEvent; +import com.chwl.core.mentoring_relationship.event.MentoringStopCountingEvent; +import com.chwl.core.mentoring_relationship.event.MentoringSuccessEvent; +import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; +import com.chwl.core.utils.SharedPreferenceUtils; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.rxbus.RxBus; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import io.reactivex.Single; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class MentoringRelationshipModel extends BaseModel implements IMentoringRelationshipModel { + + /** + * 记录最近一个徒弟的 UID + */ + public static final String SP_KEY_RECENT_APPRENTICE_UID = "sp_key_recent_apprentice_uid"; + + /** + * 打招呼类型 -- 师傅给徒弟打招呼 + */ + public static final int MASTER_SAY_HI_TO_APPRENTICE = 1; + + /** + * 打招呼类型 -- 徒弟给师傅打招呼 + */ + public static final int APPRENTICE_SAY_HI_TO_MASTER = 2; + + /** + * 建立师徒关系时的参数,表示同意建立师徒关系 + */ + public static final int TYPE_AGREE_BUILD_RELATIONSHIP = 1; + + /** + * 建立师徒关系时的参数,表示拒绝建立师徒关系 + */ + public static final int TYPE_REJECT_BUILD_RELATIONSHIP = 2; + + /** + * 是否已经关注了的标记 + */ + public static final String KEY_HAS_FOLLOWED = "key_has_followed"; + + /** + * 是否已经送出礼物的标记 + */ + public static final String KEY_HAS_HANDSEL_GIFT = "key_has_send_gift"; + + /** + * 是否已经答谢 + */ + public static final String KEY_HAS_THANKS = "key_has_thanks"; + + /** + * 是否已经发出邀请的标记 + */ + public static final String KEY_HAS_INVITED = "key_has_invited"; + + /** + * 是否已经处理了收徒邀请的标记 + */ + public static final String KEY_HAS_APPROVE = "key_has_approve"; + + /** + * 房间邀请链接是否过期 + */ + public static final String KEY_ROOM_INVITATION_EXPIRED = "key_room_invitation_expired"; + + /** + * 任务已过期 + */ + public static final int CODE_MISSION_ALREADY_EXPIRED = 90019; + + /** + * 未满五分钟 + */ + public static final int CODE_LESS_THAN_FIVE_MINUTE = 90014; + + /** + * 针对徒弟已被收走的时候点击任务四的同意或者拒绝进行提示 + */ + public static final int CODE_ALREADY_HAS_MASTER = 90020; + + private CountDownTimer timer; + // -1 表示未开始计时 + // 0 表示计时结束,等待上报任务三 + private volatile long millisUntilFinished = -1; + + private List grabApprenticesInfoList = new ArrayList<>(); + private CountDownTimer grabApprenticesTimer; + + private Api api = RxNet.create(Api.class); + + private MentoringRelationshipModel() { + super(); + EventBus.getDefault().register(this); + } + + private static final class Helper { + public static final MentoringRelationshipModel INSTANCE = new MentoringRelationshipModel(); + } + + public static MentoringRelationshipModel get() { + return MentoringRelationshipModel.Helper.INSTANCE; + } + + public List getGrabApprenticesInfoList() { + return grabApprenticesInfoList; + } + + /** + * 缓存最近一个徒弟的 UID + * + * @param apprenticeUid + */ + public void setRecentApprenticeUid(String apprenticeUid) { + SharedPreferenceUtils.put(SP_KEY_RECENT_APPRENTICE_UID, apprenticeUid); + } + + /** + * 获取最近一个徒弟的 UID + * + * @return + */ + public String getRecentApprenticeUid() { + return String.valueOf(SharedPreferenceUtils.get(SP_KEY_RECENT_APPRENTICE_UID, "")); + } + + /** + * 更新房间邀请状态 + * + * @param imMessage + * @return + */ + public Map updateRoomInvitationState(IMMessage imMessage) { + return updateLocalExtension(imMessage, KEY_ROOM_INVITATION_EXPIRED, true); + } + + /** + * 更新关注状态 + * + * @param imMessage + * @return + */ + public Map updateFollowState(IMMessage imMessage) { + return updateLocalExtension(imMessage, KEY_HAS_FOLLOWED, true); + } + + /** + * 更新赠送礼物的状态 + * + * @param imMessage + * @return + */ + public Map updateThanksState(IMMessage imMessage) { + return updateLocalExtension(imMessage, KEY_HAS_THANKS, true); + } + + /** + * 更新赠送礼物的状态 + * + * @param imMessage + * @return + */ + public Map updateHandselState(IMMessage imMessage) { + return updateLocalExtension(imMessage, KEY_HAS_HANDSEL_GIFT, true); + } + + /** + * 更新邀请的状态 + * + * @param imMessage + * @return + */ + public Map updateInviteState(IMMessage imMessage) { + return updateLocalExtension(imMessage, KEY_HAS_INVITED, true); + } + + /** + * 更新处理收徒邀请的状态 + * + * @param imMessage + * @param approveState 处理邀请的状态 + * {@link ErbanSysMsgInfo#STATE_UNTREATED} + * {@link ErbanSysMsgInfo#STATE_AGREE} + * {@link ErbanSysMsgInfo#STATE_REFUSED} + * @return + */ + public Map updateApproveState(IMMessage imMessage, int approveState) { + return updateLocalExtension(imMessage, KEY_HAS_APPROVE, approveState); + } + + /** + * 更新 IMMessage 的 LocalExtension 内部的 K-V 值 + * + * @param imMessage + * @param key + * @param value + * @return + */ + private Map updateLocalExtension(IMMessage imMessage, String key, Object value) { + Map localExtension = imMessage.getLocalExtension(); + if (localExtension == null) { + localExtension = new HashMap<>(); + } + localExtension.put(key, value); + return localExtension; + } + + /** + * 查询是否能收徒 + * + * @return + */ + @Override + public Single canPickUpApprentice() { + long currentUid = AuthModel.get().getCurrentUid(); + String masterUid = String.valueOf(currentUid); + return api.canPickUpApprentice(masterUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + PickUpApprenticeInfo data = stringServiceResult.getData(); + if (data == null) return Single.error(new Throwable("data is null")); + return Single.just(data); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 请求收徒 + * + * @return + */ + @Override + public Single requestToPickUpApprentice() { + long currentUid = AuthModel.get().getCurrentUid(); + String masterUid = String.valueOf(currentUid); + Single requestToPckUpApprentice = + api.requestToPickUpApprentice(masterUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData()); + } else { + if (stringServiceResult.getCode() == CODE_LESS_THAN_FIVE_MINUTE) { + return Single.error(new FailReasonException( + stringServiceResult.getMessage(), stringServiceResult.getCode())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } + }) + .compose(RxHelper.handleSchedulers()); + return canPickUpApprentice() + .flatMap(pickUpApprenticeInfo -> { + if (pickUpApprenticeInfo.getCan()) { + return requestToPckUpApprentice; + } else { + return Single.error(new FailReasonException("", CODE_LESS_THAN_FIVE_MINUTE)); + } + }); + } + + /** + * 打招呼 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @Override + public Single sayHi(long masterUid, long apprenticeUid) { + return api.sayHi(masterUid, apprenticeUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else if (stringServiceResult.getCode() == CODE_MISSION_ALREADY_EXPIRED) { + return Single.error(new FailReasonException( + stringServiceResult.getMessage(), + stringServiceResult.getCode())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 在单聊界面送礼物 + * + * @param giftId - + * @param targetUid - + * @param giftNum - + * @return - + */ + @Override + public Single> sendGift(final int giftId, + final long targetUid, final int giftNum, + String msg) { + + long uid = AuthModel.get().getCurrentUid(); + String ticket = AuthModel.get().getTicket(); + Single> single = api.sendP2PGift( + giftId, targetUid, uid, giftNum, ticket, 2, msg); + return single + .compose(new Transformer<>()).flatMap(giftReceiveInfoServiceResult -> { + if (giftReceiveInfoServiceResult.isSuccess()) { + return Single.just(giftReceiveInfoServiceResult); + } else if (giftReceiveInfoServiceResult.getCode() == BalanceNotEnoughExeption.code) { + return Single.error(new BalanceNotEnoughExeption(giftReceiveInfoServiceResult.getMessage())); + } else if (giftReceiveInfoServiceResult.getCode() == GiftOutOfDateException.code) { + return Single.error(new GiftOutOfDateException(giftReceiveInfoServiceResult.getMessage())); + } + return Single.error(new UnKnowException()); + }); + } + + /** + * 师徒关系建立成功跑马灯信息 + * + * @param page + * @return + */ + @Override + public Single> resultDisplay(int page) { + return api.resultDisplay(page, 10) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData()); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 上报任务3 + */ + @Override + public Single reportMissionThree(long masterUid, long apprenticeUid) { + return api.reportMissionThree(masterUid, apprenticeUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 建立师徒关系 + * + * @param masterUid + * @param apprenticeUid + * @param type 类型1=同意,2=拒绝 + * @return + */ + @Override + public Single buildMentoringRelationship(long masterUid, long apprenticeUid, int type) { + return api.buildMentoringRelationship(masterUid, apprenticeUid, type) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else if (stringServiceResult.getCode() == CODE_ALREADY_HAS_MASTER) { + return Single.error(new FailReasonException( + stringServiceResult.getMessage(), + stringServiceResult.getCode())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 邀请进房判断师徒任务是否有效 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @Override + public Single inviteEnable(long masterUid, long apprenticeUid) { + return api.inviteEnable(masterUid, apprenticeUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else if (stringServiceResult.getCode() == CODE_MISSION_ALREADY_EXPIRED) { + return Single.error(new FailReasonException( + stringServiceResult.getMessage(), + stringServiceResult.getCode())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 发送邀请 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @Override + public Single sendInvitation(long masterUid, long apprenticeUid) { + return api.sendInvitation(masterUid, apprenticeUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else if (stringServiceResult.getCode() == CODE_MISSION_ALREADY_EXPIRED) { + return Single.error(new FailReasonException( + stringServiceResult.getMessage(), + stringServiceResult.getCode())); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 解除师徒关系 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @Override + public Single releaseMentoringRelationship(long masterUid, long apprenticeUid) { + long currentUid = AuthModel.get().getCurrentUid(); + return api.releaseMentoringRelationship(currentUid, masterUid, apprenticeUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取名师榜数据 + * + * @param type 查询类型(1:本周名师榜,2:上周名师榜) + * @param page + * @return + */ + @Override + public Single getMentoringRankingData(int type, int page) { + long currentUid = AuthModel.get().getCurrentUid(); + return api.getMentoringRankingData(currentUid, type, page, 3) + .flatMap(mentoringRankingDataInfoServiceResult -> { + if (mentoringRankingDataInfoServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (mentoringRankingDataInfoServiceResult.isSuccess()) { + return Single.just(mentoringRankingDataInfoServiceResult.getData()); + } else { + return Single.error(new Throwable(mentoringRankingDataInfoServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取我的师徒列表 + */ + @Override + public Single> getMyMasterAndApprenticesList(int page) { + long currentUid = AuthModel.get().getCurrentUid(); + return api.getMyMasterAndApprenticesList(currentUid, page, Constants.PAGE_SIZE) + .flatMap(listServiceResult -> { + if (listServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 上报任务3 + */ + @Override + public Single grabApprentices(long apprenticeUid) { + long masterUid = AuthModel.get().getCurrentUid(); + return api.grabApprentices(masterUid, apprenticeUid) + .flatMap(stringServiceResult -> { + if (stringServiceResult == null) { + return Single.error(new Throwable("result is null")); + } + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + public void setMillisUntilFinished(long millisUntilFinished) { + this.millisUntilFinished = millisUntilFinished; + } + + public long getMillisUntilFinished() { + return millisUntilFinished; + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onReceiveStartTimerEvent(MentoringStartCountingEvent event) { + onReceiveStopTimerEvent(null); + // 改为共处一室3分钟 + timer = new CountDownTimer(3 * 60 * 1000, 1000) { + @Override + public void onTick(long millisUntilFinished) { + MentoringRelationshipModel.get().setMillisUntilFinished(millisUntilFinished); + EventBus.getDefault().post(new MentoringCountingEvent() + .setMillisUntilFinished(millisUntilFinished)); + } + + @Override + public void onFinish() { + MentoringRelationshipModel.get().setMillisUntilFinished(0); + EventBus.getDefault().post(new MentoringCountingFinishEvent()); + } + }; + timer.start(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onReceiveStopTimerEvent(MentoringStopCountingEvent event) { + if (timer != null) { + timer.cancel(); + timer = null; + } + MentoringRelationshipModel.get().setMillisUntilFinished(-1); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLogoutEvent(LogoutEvent event) { + // 退出登录,清除缓存数据,还原状态 + AvRoomDataManager.get().setMasterUid(0); + AvRoomDataManager.get().setFromMentoring(false); + onReceiveStopTimerEvent(null); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onReceiveCustiomNotification(MentoringRelationshipMissionEvent event) { + IMMessage imMessage = null; + CustomAttachment customAttachment = event.getCustomAttachment(); + int second = customAttachment.getSecond(); + switch (customAttachment.getFirst()) { + case CustomAttachment.CUSTOM_MSG_MENTORING_RELATIONSHIP: + switch (second) { + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER: + MentoringMasterMissionOneAttachment masterMissionOneAttachment = (MentoringMasterMissionOneAttachment) customAttachment; + MissionVo simpleUserVoMissionVo = masterMissionOneAttachment.getSimpleUserVoMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(simpleUserVoMissionVo.getApprenticeUid()), + SessionTypeEnum.P2P, masterMissionOneAttachment); + imMessage.setFromAccount(String.valueOf(simpleUserVoMissionVo.getApprenticeUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_APPRENTICE: + MentoringApprenticeMissionOneAttachment apprenticeMissionOneAttachment = (MentoringApprenticeMissionOneAttachment) customAttachment; + MissionVo apprenticeMissionOneInfo + = apprenticeMissionOneAttachment.getSimpleUserVoMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(apprenticeMissionOneInfo.getMasterUid()), + SessionTypeEnum.P2P, apprenticeMissionOneAttachment); + imMessage.setFromAccount(String.valueOf(apprenticeMissionOneInfo.getMasterUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_TIPS: + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_ONE_MASTER_TIPS: + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FAIL_TIPS: + MentoringMissionTipsAttachment apprenticeMissionOneTipsAttachment = (MentoringMissionTipsAttachment) customAttachment; + MentoringTipsInfo apprenticeMissionOneTipsData = apprenticeMissionOneTipsAttachment.getMentoringTipsInfo(); + imMessage = MessageBuilder.createTipMessage( + apprenticeMissionOneTipsData.getSessionId(), SessionTypeEnum.P2P); + imMessage.setContent(apprenticeMissionOneTipsData.getTips()); + imMessage.setFromAccount(String.valueOf(apprenticeMissionOneTipsData.getSessionId())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_MASTER: + MentoringMasterMissionTwoAttachment masterMissionTwoAttachment = (MentoringMasterMissionTwoAttachment) customAttachment; + MissionVo masterMissionTwoInfo = masterMissionTwoAttachment.getSimpleGiftVoMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(masterMissionTwoInfo.getApprenticeUid()), + SessionTypeEnum.P2P, masterMissionTwoAttachment); + imMessage.setFromAccount(String.valueOf(masterMissionTwoInfo.getApprenticeUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_TWO_APPRENTICE: + MentoringApprenticeMissionTwoAttachment apprenticeMissionTwoAttachment = (MentoringApprenticeMissionTwoAttachment) customAttachment; + MissionVo apprenticeMissionTwoInfo = apprenticeMissionTwoAttachment.getSimpleGiftVoMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(apprenticeMissionTwoInfo.getMasterUid()), + SessionTypeEnum.P2P, apprenticeMissionTwoAttachment); + imMessage.setFromAccount(String.valueOf(apprenticeMissionTwoInfo.getMasterUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_MASTER: + MentoringMasterMissionThreeAttachment masterMissionThreeAttachment = (MentoringMasterMissionThreeAttachment) customAttachment; + MissionVo masterMissionThreeInfo = masterMissionThreeAttachment.getMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(masterMissionThreeInfo.getApprenticeUid()), + SessionTypeEnum.P2P, masterMissionThreeAttachment); + imMessage.setFromAccount(String.valueOf(masterMissionThreeInfo.getApprenticeUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_THREE_APPRENTICE: + MentoringApprenticeMissionThreeAttachment apprenticeMissionThreeAttachment = (MentoringApprenticeMissionThreeAttachment) customAttachment; + MissionVo apprenticeMissionThreeIfo = apprenticeMissionThreeAttachment.getSimpleGiftVoMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(apprenticeMissionThreeIfo.getMasterUid()), + SessionTypeEnum.P2P, apprenticeMissionThreeAttachment); + imMessage.setFromAccount(String.valueOf(apprenticeMissionThreeIfo.getMasterUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_MASTER: + MentoringMasterMissionFourAttachment masterMissionFourAttachment = (MentoringMasterMissionFourAttachment) customAttachment; + MissionVo masterMissionFourInfo = masterMissionFourAttachment.getMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(masterMissionFourInfo.getApprenticeUid()), + SessionTypeEnum.P2P, masterMissionFourAttachment); + imMessage.setFromAccount(String.valueOf(masterMissionFourInfo.getApprenticeUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_FOUR_APPRENTICE: + MentoringApprenticeMissionFourAttachment apprenticeMissionFourAttachment = (MentoringApprenticeMissionFourAttachment) customAttachment; + MissionVo apprenticeMissionFourInfo = apprenticeMissionFourAttachment.getMissionVo(); + imMessage = MessageBuilder.createCustomMessage( + String.valueOf(apprenticeMissionFourInfo.getMasterUid()), + SessionTypeEnum.P2P, apprenticeMissionFourAttachment); + imMessage.setFromAccount(String.valueOf(apprenticeMissionFourInfo.getMasterUid())); + imMessage.setDirect(MsgDirectionEnum.In); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_MISSION_RESULT: + MentoringMissionTipsAttachment resultTipsAttachment = (MentoringMissionTipsAttachment) customAttachment; + MentoringTipsInfo resultTipsData = resultTipsAttachment.getMentoringTipsInfo(); + imMessage = MessageBuilder.createTipMessage( + resultTipsData.getSessionId(), SessionTypeEnum.P2P); + imMessage.setContent(resultTipsData.getTips()); + imMessage.setFromAccount(String.valueOf(resultTipsData.getSessionId())); + imMessage.setDirect(MsgDirectionEnum.In); + EventBus.getDefault().post(new MentoringSuccessEvent()); + break; + + case CustomAttachment.CUSTOM_MSG_SUB_MENTORING_RELATIONSHIP_GRAB_APPRENTICES: + MentoringGrabApprenticesAttachment grabApprenticesAttachment = (MentoringGrabApprenticesAttachment) customAttachment; + GrabApprenticesMissionInfo grabApprenticesMissionInfo = grabApprenticesAttachment.getGrabApprenticesMissionInfo(); + List userVoList = grabApprenticesMissionInfo.getApprentices(); + if (userVoList != null) { + for (SimpleUserVo simpleUserVo : userVoList) { + GrabApprenticesInfo grabApprenticesInfo = new GrabApprenticesInfo( + simpleUserVo.getUid(), + simpleUserVo.getErbanNo(), + simpleUserVo.getAvatar(), + simpleUserVo.getNick(), + simpleUserVo.getGender(), + grabApprenticesMissionInfo.getCountDown() + ); + grabApprenticesInfoList.add(grabApprenticesInfo); + } + if (grabApprenticesTimer != null) { + grabApprenticesTimer.cancel(); + grabApprenticesTimer = null; + } + grabApprenticesTimer = new CountDownTimer( + grabApprenticesMissionInfo.getCountDown() * 2 * 1000, + 1000) { + @Override + public void onTick(long millisUntilFinished) { + // 更新时间 + for (Iterator iterator = grabApprenticesInfoList.iterator(); iterator.hasNext(); ) { + GrabApprenticesInfo item = (GrabApprenticesInfo) iterator.next(); + int countDown = item.getCountDown(); + item.setCountDown(countDown-- > 0 ? countDown : 0); + if (countDown < 0) { + iterator.remove(); + } + } + EventBus.getDefault().post(new GrabApprenticesDataEvent()); + } + + @Override + public void onFinish() { + // do nothing + } + }; + Log.e("main", "onReceiveCustiomNotification: " + grabApprenticesInfoList.size()); + for (GrabApprenticesInfo grabApprenticesInfo : grabApprenticesInfoList) { + Log.e("main", "onReceiveCustiomNotification: " + grabApprenticesInfo.getUid()); + } + // 弹窗提示 + RxBus.get().post(new GrabApprenticesEvent()); + // 数据更新 + EventBus.getDefault().post(new GrabApprenticesDataEvent()); + // 开始计时 + grabApprenticesTimer.start(); + } + break; + } + if (imMessage != null) { + imMessage.setStatus(MsgStatusEnum.success); + IMNetEaseManager.get().saveMessageToLocal(imMessage, true); + } + break; + } + } + + interface Api { + + /** + * 查询是否能请求收徒 + * + * @param uid 师父 UID + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/enable") + Single> canPickUpApprentice(@Field("operUid") String uid); + + /** + * 请求收徒 + * + * @param uid 师父 UID + * @return 成功时返回徒弟的 UID + */ + @FormUrlEncoded + @POST("/master/apprentice/get/apprentice") + Single> requestToPickUpApprentice(@Field("operUid") String uid); + + /** + * 直接打招呼 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/greet") + Single> sayHi(@Field("masterUid") long masterUid, + @Field("apprenticeUid") long apprenticeUid); + + /** + * 发送礼物 + * + * @return - + */ + @POST("/gift/mentoring/send") + @FormUrlEncoded + Single> sendP2PGift(@Field("giftId") int giftId, + @Field("targetUid") long targetUid, + @Field("uid") long uid, + @Field("giftNum") int giftNum, + @Field("ticket") String ticket, + @Field("type") int type, + @Field("msg") String msg); + + /** + * 师徒关系建立成功跑马灯信息 + * + * @param page + * @param pageSize + * @return + */ + @GET("/master/apprentice/notice") + Single>> resultDisplay(@Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 上报任务3 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/report") + Single> reportMissionThree(@Field("masterUid") long masterUid, + @Field("apprenticeUid") long apprenticeUid); + + /** + * 建立师徒关系 + * + * @param masterUid + * @param apprenticeUid + * @param type 类型1=同意,2=拒绝 + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/build") + Single> buildMentoringRelationship(@Field("masterUid") long masterUid, + @Field("apprenticeUid") long apprenticeUid, + @Field("type") int type); + + /** + * 邀请进房判断师徒任务是否有效 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @GET("/master/apprentice/invite/enable") + Single> inviteEnable(@Query("masterUid") long masterUid, + @Query("apprenticeUid") long apprenticeUid); + + /** + * 发送邀请 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/invite") + Single> sendInvitation(@Field("masterUid") long masterUid, + @Field("apprenticeUid") long apprenticeUid); + + /** + * 获取名师榜数据 + * + * @param uid + * @param type 查询类型(1:本周名师榜,2:上周名师榜) + * @param page + * @param pageSize + * @return + */ + @GET("/master/apprentice/master/list") + Single> getMentoringRankingData(@Query("uid") long uid, + @Query("type") int type, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 获取我的师徒列表 + * + * @param uid + * @param page + * @param pageSize + * @return + */ + @GET("/master/apprentice/relations") + Single>> getMyMasterAndApprenticesList(@Query("uid") long uid, + @Query("page") int page, + @Query("pageSize") int pageSize); + + /** + * 解除师徒关系 + * + * @param uid + * @param masterUid + * @param apprenticeUid + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/relation/remove") + Single> releaseMentoringRelationship(@Field("operUid") long uid, + @Field("masterUid") long masterUid, + @Field("apprenticeUid") long apprenticeUid); + + + /** + * 抢徒弟 + * + * @param masterUid + * @param apprenticeUid + * @return + */ + @FormUrlEncoded + @POST("/master/apprentice/grab") + Single> grabApprentices(@Field("masterUid") long masterUid, + @Field("apprenticeUid") long apprenticeUid); + } +} diff --git a/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/view/IMentoringRelationshipView.java b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/view/IMentoringRelationshipView.java new file mode 100644 index 0000000..c9cba23 --- /dev/null +++ b/core/src/model_mentoring_relationship/java/com/chwl/core/mentoring_relationship/view/IMentoringRelationshipView.java @@ -0,0 +1,73 @@ +package com.chwl.core.mentoring_relationship.view; + +import com.chwl.core.mentoring_relationship.bean.MentoringRankingDataInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringResultMarqueeInfo; +import com.chwl.core.mentoring_relationship.bean.MentoringUserInfo; +import com.chwl.core.mentoring_relationship.bean.PickUpApprenticeInfo; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface IMentoringRelationshipView extends IMvpBaseView { + + /** + * 拉取全服师徒收取记录跑马灯信息时调用 + * + * @param data + */ + void onGetResultsMarquee(List data, int page); + + /** + * 获取数据错误时调用 + * + * @param errorMsg + */ + void onGetDataFail(String errorMsg); + + /** + * 请求收徒 + */ + void onGetApprentice(long apprenticeUid); + + /** + * 请求收徒失败时调用 + */ + void onGetApprenticeFail(String recentApprenticeUid, String errorMsg); + + /** + * 获取「我的师徒」数据成功时调用 + * + * @param data + * @param page + */ + void onGetMyMasterAndApprenticeData(List data, int page); + + /** + * 获取「我的师徒」数据失败时调用 + * + * @param errorMsg + * @param page + */ + void onGetMyMasterAndApprenticeDataFail(String errorMsg, int page); + + /** + * 获取排行榜前三名数据成功时调用 + * + * @param data + */ + void onGetRankingData(List data); + + /** + * 获取排行榜前三名数据失败时调用 + * + * @param errorMsg + */ + void onGetRankingDataFail(String errorMsg); + + /** + * 显示「去收徒」按钮上相关的元素 + * + * @param pickUpApprenticeInfo + */ + void onLoadTitle(PickUpApprenticeInfo pickUpApprenticeInfo); +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyInfo.java new file mode 100644 index 0000000..fd9b4b7 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyInfo.java @@ -0,0 +1,22 @@ +package com.chwl.core.miniworld.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class AudioPartyInfo implements Serializable { + private long worldId; //世界Id + private long roomId;// 房间id + private long roomUid; // 房间uid + private String title; // 房间名称 + private String avatar; // 房间缩略图 + private String roomDesc; // 房间描述 + private String roomTag; + private int tagId; + private String tagPict; + private String badge; + private int onlineNum; + private int gender; + private boolean ownerFlag; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyItem.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyItem.java new file mode 100644 index 0000000..5e96558 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyItem.java @@ -0,0 +1,83 @@ +package com.chwl.core.miniworld.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class AudioPartyItem implements MultiItemEntity, Parcelable, Serializable{ + + public static final transient int TYPE_DATA = 1; + public static final transient int TYPE_EMPTY = 2; + + + + + //类型 + private int itemType; + + //正常数据 + private T data; + + public AudioPartyItem(int itemType) { + this(itemType, null); + } + + + public AudioPartyItem(int itemType, T data) { + this(itemType, data, false); + } + + public AudioPartyItem(int itemType, T data, boolean isHotItem) { + this.itemType = itemType; + this.data = data; + } + + + protected AudioPartyItem(Parcel in) { + itemType = in.readInt(); + data = (T) in.readSerializable(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public AudioPartyItem createFromParcel(Parcel in) { + return new AudioPartyItem(in); + } + + @Override + public AudioPartyItem[] newArray(int size) { + return new AudioPartyItem[size]; + } + }; + + @Override + public int getItemType() { + return itemType; + } + + public void setData(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(itemType); + dest.writeSerializable(data); + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyListInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyListInfo.java new file mode 100644 index 0000000..367cfe6 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/AudioPartyListInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.miniworld.bean; + +import java.util.ArrayList; + +import lombok.Data; + +@Data +public class AudioPartyListInfo { + private boolean hasCurrentUserRoom; + private ArrayList worldRoomVoList; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatInfo.java new file mode 100644 index 0000000..bf5e09d --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatInfo.java @@ -0,0 +1,17 @@ +package com.chwl.core.miniworld.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class MWChatInfo { + private long chatId; // 服务端群聊id + private long worldId; // 话题id + private long uid; // 群主id + private String tid; // 云信去聊id + private String name; + private String topic; // 群聊话题 + private int count; // 当前派对总人数 + private List roomUids; // 当前群聊派对列表 +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatMemberCountAttachment.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatMemberCountAttachment.java new file mode 100644 index 0000000..22f0849 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatMemberCountAttachment.java @@ -0,0 +1,59 @@ +package com.chwl.core.miniworld.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; + +import java.util.List; + +public class MWChatMemberCountAttachment extends CustomAttachment { + + public long getWorldId() { + return worldId; + } + + public void setWorldId(long worldId) { + this.worldId = worldId; + } + + private long worldId; + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + private int count; + + public List getRoomUids() { + return roomUids; + } + + public void setRoomUids(List roomUids) { + this.roomUids = roomUids; + } + + private List roomUids; + + public MWChatMemberCountAttachment() { + super(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT); + } + + @Override + protected void parseData(JSONObject data) { + worldId = data.getLong("worldId"); + count = data.getIntValue("count"); + roomUids = data.getJSONArray("roomUids").toJavaList(Long.class); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("worldId", worldId); + object.put("count", count); + object.put("roomUids", roomUids); + return object; + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatTopicAttachment.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatTopicAttachment.java new file mode 100644 index 0000000..9ba0fc3 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MWChatTopicAttachment.java @@ -0,0 +1,43 @@ +package com.chwl.core.miniworld.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; + +public class MWChatTopicAttachment extends CustomAttachment { + public long getWorldId() { + return worldId; + } + + public void setWorldId(long worldId) { + this.worldId = worldId; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + private long worldId; + private String topic; + + public MWChatTopicAttachment() { + super(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_GROUP_CHAT_TOPIC); + } + + @Override + protected void parseData(JSONObject data) { + worldId = data.getLong("worldId"); + topic = data.getString("topic"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("worldId", worldId); + object.put("topic", topic); + return object; + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldCategoryInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldCategoryInfo.java new file mode 100644 index 0000000..6c5b7a6 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldCategoryInfo.java @@ -0,0 +1,32 @@ +package com.chwl.core.miniworld.bean; + +import java.util.List; + +import lombok.Data; + +/** + * 话题分类 + */ +@Data +public class MiniWorldCategoryInfo { + + /** + * 我的 + */ + public static final int CATEGORY_ID_MY = -1; + /** + * 推荐 + */ + public static final int CATEGORY_ID_RECOMMEND = -2; + + private int id; + /** + * 分类名称 + */ + private String typeName; + + /** + * 话题 + */ + private List worlds; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfo.java new file mode 100644 index 0000000..0177a65 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfo.java @@ -0,0 +1,38 @@ +package com.chwl.core.miniworld.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * 世界详细信息(世界客态页) + */ +@Data +public class MiniWorldDetailInfo implements Serializable { + + private long id;// 话题id + private long ownerUid;// 创建人uid + private String name;// 世界名 + private String icon;// 世界头像 + private String description;// 描述 + private String notice;// 公告 + private int seqNo;// 排序 + private int memberNum;// 话题人数 + private List members;// 话题成员,最多5人 + private boolean inGroupChat; // 当前用户是否在群聊中,true-是 false-否 + private boolean inWorld;// 当前用户是否在此话题中,true为是,false为否 + private long noticeUpdateTime;// 话题公告最后更新时间 + private boolean agreeFlag;// 进入时是否需要同意,true需要,false不需要 + private long typeId;// 话题分类id + private String typeName;// 话题分类名 + private int muteFlag;// 禁言状态,0.不禁言 1.禁言 + private String tid; // 云信群聊id + private Long chatId;// 话题群聊id + private String groupChatName; // 群聊名称 + + private long createTime; + private MiniWorldDetailInfoWithCurrentMember currentMember;// 当前用户 + private int createGroupChatNum;// 自动创建群聊的人数 + private int onlineNum; // 在线成员人数 +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithCurrentMember.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithCurrentMember.java new file mode 100644 index 0000000..c3d04ee --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithCurrentMember.java @@ -0,0 +1,21 @@ +package com.chwl.core.miniworld.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 世界详细信息(世界客态页)-当前用户 + */ +@Data +public class MiniWorldDetailInfoWithCurrentMember implements Serializable { + private String nick;// 昵称 + private int gender;// 性别 + private String avatar;// 头像 + private long uid;// uid + private int status;// 状态 + private int promtFlag;// 消息提醒状态,0.屏蔽消息 1.开启提醒 + private int muteFlag;// 禁言状态,0.不禁言 1.禁言 + private boolean ownerFlag;// 是否创始人 + private int memberNo;// 该世界的第几位成员 +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithMemberInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithMemberInfo.java new file mode 100644 index 0000000..59ede7b --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldDetailInfoWithMemberInfo.java @@ -0,0 +1,20 @@ +package com.chwl.core.miniworld.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 世界详细信息(世界客态页)-成员信息 + */ +@Data +public class MiniWorldDetailInfoWithMemberInfo implements Serializable { + private String nick;// 昵称 + private int gender;// 性别 + private String avatar;// 头像 + private long uid;// uid + private int status;// 状态 + private int promtFlag;// 消息提醒状态,0.屏蔽消息 1.开启提醒 + private int muteFlag;// 禁言状态,0.不禁言 1.禁言 + private boolean ownerFlag;// 是否创始人:true是 false不是 +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldEditClassifyInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldEditClassifyInfo.java new file mode 100644 index 0000000..0ebdedd --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldEditClassifyInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.miniworld.bean; + +import lombok.Data; + +/** + * 世界编辑资料-选择分类 + */ +@Data +public class MiniWorldEditClassifyInfo { + private int id;// 类型id + private String typeName;// 类型名 + private String pict;// 分类图片 + private String tagPic;// 客户端展示标签 + private int seqNo; + private long createTime; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInWorldInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInWorldInfo.java new file mode 100644 index 0000000..5f45bd4 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInWorldInfo.java @@ -0,0 +1,16 @@ +package com.chwl.core.miniworld.bean; + +import lombok.Data; + +/** + * 检查是否在话题里 + */ +@Data +public class MiniWorldInWorldInfo { + private long worldId; + private String worldName; + /** + * 是否在话题里 + */ + private boolean inWorld; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInfo.java new file mode 100644 index 0000000..4bdd43a --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldInfo.java @@ -0,0 +1,107 @@ +package com.chwl.core.miniworld.bean; + +import com.chwl.core.user.bean.UserInfo; + +import java.util.List; + +import lombok.Data; + +@Data +public class MiniWorldInfo { + + /** + * 新 + */ + public static transient final int TAG_NEW = 1; + + /** + * 热 + */ + public static transient final int TAG_HOT = 2; + + /** + * 官方 + */ + public static transient final int TAG_OFFICIAL = 4; + + /** + * 派对中 + */ + public static transient final int TAG_PARTYING = 8; + + /** + * 话题id + */ + private int id; + + /** + * 名称 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 图标 + */ + private String icon; + + /** + * 分类图片 + */ + private String typePict; + + /** + * 成员 + */ + private List members; + + /** + * 话题人数 + */ + private int memberNum; + + /** + * 用于显示标签 + * 标签, 转成二进制数据,1-新,2-热,4-官方,8-派对中 + */ + private int tag; + + /** + * 是否新标签 + * + * @return + */ + public boolean isNewTag() { + return (tag & TAG_NEW) == TAG_NEW; + } + + /** + * 是否热标签 + * + * @return + */ + public boolean isHotTag() { + return (tag & TAG_HOT) == TAG_HOT; + } + + /** + * 是否管标签 + * + * @return + */ + public boolean isOfficialTag() { + return (tag & TAG_OFFICIAL) == TAG_OFFICIAL; + } + + /** + * 是否派对中标签 + * + * @return + */ + public boolean isPartyingTag() { + return (tag & TAG_PARTYING) == TAG_PARTYING; + } + +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldListInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldListInfo.java new file mode 100644 index 0000000..b61cb5f --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldListInfo.java @@ -0,0 +1,11 @@ +package com.chwl.core.miniworld.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class MiniWorldListInfo { + private List records; + +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainInfo.java new file mode 100644 index 0000000..8b35635 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainInfo.java @@ -0,0 +1,21 @@ +package com.chwl.core.miniworld.bean; + +import com.chwl.core.home.bean.BannerInfo; + +import java.util.List; + +import lombok.Data; + +@Data +public class MiniWorldMainInfo { + /** + * 话题首页banner + */ + private List banners; + + /** + * 话题分类 + */ + private List types; + +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainItemInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainItemInfo.java new file mode 100644 index 0000000..d478e15 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMainItemInfo.java @@ -0,0 +1,35 @@ +package com.chwl.core.miniworld.bean; + +import com.chad.library.adapter.base.entity.MultiItemEntity; + +import lombok.Data; + +@Data +public class MiniWorldMainItemInfo implements MultiItemEntity { + + public static transient final int TYPE_BANNER = 1; + public static transient final int TYPE_TITLE = 2; + public static transient final int TYPE_ITEM = 3; + public static transient final int TYPE_FIND = 4; + public static transient final int TYPE_DIVIDER = 5; + public static transient final int TYPE_PLACEHOLDER = 6; + public static transient final int TYPE_BOTTOM_PADDING = 7; + private int type; + + private Object data; + + private int topDivider; + + private int bottomDivider; + + private int leftDivider; + private int rightDivider; + + + @Override + public int getItemType() { + return type; + } + + +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListInfo.java new file mode 100644 index 0000000..d23f183 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListInfo.java @@ -0,0 +1,15 @@ +package com.chwl.core.miniworld.bean; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +/** + * 世界成员列表 + */ +@Data +public class MiniWorldMemberListInfo implements Serializable { + private int total;// 总数 + private List records;// 世界成员集合 +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListMemberInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListMemberInfo.java new file mode 100644 index 0000000..671c036 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/MiniWorldMemberListMemberInfo.java @@ -0,0 +1,24 @@ +package com.chwl.core.miniworld.bean; + +import com.chwl.core.level.UserLevelVo; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 世界成员列表-成员信息 + */ +@Data +public class MiniWorldMemberListMemberInfo implements Serializable { + private long uid;// 用户uid + private String nick;// 昵称 + private int gender;// 性别1.男 2.女 + private String avatar;// 头像 + private int promtFlag;// 0.屏蔽消息 1.开启提醒 + private int muteFlag;// 0.不禁言 1.禁言 + private boolean ownerFlag;// 是否创始人:true是 false不是 + private boolean onlineFlag;// 是否在线 true在线 ,false不在线 + private Long currentRoomUid;// 在当前世界所在派对房间roomUid 如果用户不在派对中该字段为null + private UserLevelVo userLevelVo;// 等级魅力模型 +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenAudioPartyAttachment.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenAudioPartyAttachment.java new file mode 100644 index 0000000..9b6a602 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenAudioPartyAttachment.java @@ -0,0 +1,57 @@ +package com.chwl.core.miniworld.bean; + +import com.alibaba.fastjson2.JSONObject; +import com.chwl.core.im.custom.bean.CustomAttachment; + +public class OpenAudioPartyAttachment extends CustomAttachment { + + public long getWorldId() { + return worldId; + } + + public void setRoomUid(long roomUid) { + this.roomUid = roomUid; + } + + public void setOwnerFlag(boolean ownerFlag) { + this.ownerFlag = ownerFlag; + } + + public long getRoomUid() { + return roomUid; + } + + private long roomUid; + + public boolean isOwnerFlag() { + return ownerFlag; + } + + private boolean ownerFlag; + + public void setWorldId(long worldId) { + this.worldId = worldId; + } + + private long worldId; + + public OpenAudioPartyAttachment() { + super(CustomAttachment.CUSTOM_MSG_MINI_WORLD, CustomAttachment.CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY); + } + + @Override + protected void parseData(JSONObject data) { + roomUid = data.getLong("roomUid"); + ownerFlag = data.getBoolean("ownerFlag"); + worldId = data.getLong("worldId"); + } + + @Override + protected JSONObject packData() { + JSONObject object = new JSONObject(); + object.put("roomUid", roomUid); + object.put("ownerFlag", ownerFlag); + object.put("worldId", worldId); + return object; + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenSuccessInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenSuccessInfo.java new file mode 100644 index 0000000..244a9a8 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/OpenSuccessInfo.java @@ -0,0 +1,8 @@ +package com.chwl.core.miniworld.bean; + +import lombok.Data; + +@Data +public class OpenSuccessInfo { + private String warn; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/TopicInfo.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/TopicInfo.java new file mode 100644 index 0000000..4799501 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/bean/TopicInfo.java @@ -0,0 +1,8 @@ +package com.chwl.core.miniworld.bean; + +import lombok.Data; + +@Data +public class TopicInfo { + private String topic; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/AudioPartyOpenEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/AudioPartyOpenEvent.java new file mode 100644 index 0000000..7c00e6f --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/AudioPartyOpenEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.miniworld.event; + +public class AudioPartyOpenEvent { +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWChatTopicEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWChatTopicEvent.java new file mode 100644 index 0000000..f8e2ea5 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWChatTopicEvent.java @@ -0,0 +1,9 @@ +package com.chwl.core.miniworld.event; + +import lombok.Data; + +@Data +public class MWChatTopicEvent { + private long worldId; + private String topic; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWGroupChatMemberEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWGroupChatMemberEvent.java new file mode 100644 index 0000000..5c73a07 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWGroupChatMemberEvent.java @@ -0,0 +1,12 @@ +package com.chwl.core.miniworld.event; + +import java.util.List; + +import lombok.Data; + +@Data +public class MWGroupChatMemberEvent { + private long worldId; + private int count; + private List roomUids; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWOpenAudioPartyEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWOpenAudioPartyEvent.java new file mode 100644 index 0000000..c45b234 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MWOpenAudioPartyEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.miniworld.event; + +import lombok.Data; + +@Data +public class MWOpenAudioPartyEvent { + private long roomId; + private long roomUid; + private boolean ownerFlag; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldJoinVerifiedEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldJoinVerifiedEvent.java new file mode 100644 index 0000000..e9fa060 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldJoinVerifiedEvent.java @@ -0,0 +1,12 @@ +package com.chwl.core.miniworld.event; + +import lombok.Data; + +/** + * 加入话题审核通过事件 + */ +@Data +public class MiniWorldJoinVerifiedEvent { + private long worldId; + private int actionType; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldStateChangedEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldStateChangedEvent.java new file mode 100644 index 0000000..a8cc37c --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldStateChangedEvent.java @@ -0,0 +1,31 @@ +package com.chwl.core.miniworld.event; + +import lombok.Data; + +/** + * 话题加入和退出状态 + */ +@Data +public class MiniWorldStateChangedEvent { + /** + * 是否是加入还是退出 + * true 加入 + * false 退出 + */ + private boolean isJoin; + /** + * 受影响的话题信息 + */ + private int worldId; + + public static MiniWorldStateChangedEvent newInstance(boolean isJoin, int worldId) { + MiniWorldStateChangedEvent miniWorldStateChangedEvent = new MiniWorldStateChangedEvent(); + miniWorldStateChangedEvent.isJoin = isJoin; + miniWorldStateChangedEvent.worldId = worldId; + return miniWorldStateChangedEvent; + } + + public static MiniWorldStateChangedEvent newInstance(boolean isJoin) { + return newInstance(isJoin, -1); + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldTeamExitEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldTeamExitEvent.java new file mode 100644 index 0000000..ca3af89 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/MiniWorldTeamExitEvent.java @@ -0,0 +1,10 @@ +package com.chwl.core.miniworld.event; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class MiniWorldTeamExitEvent implements Serializable { + private long worldId; +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/event/OpenedMyMiniWorldEvent.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/OpenedMyMiniWorldEvent.java new file mode 100644 index 0000000..e1819ce --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/event/OpenedMyMiniWorldEvent.java @@ -0,0 +1,12 @@ +package com.chwl.core.miniworld.event; + +/** + * 打开我加入的事件 + */ +public class OpenedMyMiniWorldEvent { + public static OpenedMyMiniWorldEvent newInstance() { + OpenedMyMiniWorldEvent openedMyMiniWorldEvent = new OpenedMyMiniWorldEvent(); + return openedMyMiniWorldEvent; + + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/model/IMiniWorldModel.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/model/IMiniWorldModel.java new file mode 100644 index 0000000..a099bd2 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/model/IMiniWorldModel.java @@ -0,0 +1,145 @@ +package com.chwl.core.miniworld.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.miniworld.bean.AudioPartyInfo; +import com.chwl.core.miniworld.bean.AudioPartyListInfo; +import com.chwl.core.miniworld.bean.MWChatInfo; +import com.chwl.core.miniworld.bean.MiniWorldCategoryInfo; +import com.chwl.core.miniworld.bean.MiniWorldDetailInfo; +import com.chwl.core.miniworld.bean.MiniWorldEditClassifyInfo; +import com.chwl.core.miniworld.bean.MiniWorldInWorldInfo; +import com.chwl.core.miniworld.bean.MiniWorldInfo; +import com.chwl.core.miniworld.bean.MiniWorldMainInfo; +import com.chwl.core.miniworld.bean.MiniWorldMemberListInfo; +import com.chwl.core.miniworld.bean.TopicInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IMiniWorldModel extends IModel { + + /** + * 话题分类 + * + * @return + */ + Single> getCategoryList(); + + /** + * 获取话题首页 + * + * @return + */ + Single getMiniWorldMainData(long uid); + + /** + * 查询话题 + * + * @return + */ + Single> searchMiniWorldList(String searchKey, int page, int pageSize); + + /** + * 查询分类的话题 + * + * @return + */ + Single> getCategoryMiniWorldList(String worldTypeId, int page, int pageSize); + + + /** + * 话题详情 + */ + Single getWorldDetailInfo(String worldId, String uid); + + /** + * 获取世界分享图片 + */ + Single getWorldSharePicUrl(long worldId, long uid); + + /** + * 解散世界 + */ + Single dissolveWorld(String worldId, String uid); + + /** + * 话题分类列表 + */ + Single> getEditClassifyList(); + + /** + * 编辑话题 + */ + Single editWorld(String worldId, String uid, String worldTypeId, + String name, String description, String notice, + String icon, boolean agreeFlag); + + /** + * 话题成员列表 + */ + Single getMemberList(long worldId, int page, int pageSize); + + /** + * 话题成员列表-搜索成员(不分页) + */ + Single searchMember(long worldId, String searchKey); + + /** + * 话题群聊成员列表 + */ + Single getChatMemberList(long chatId, int page, int pageSize); + + /** + * 话题群聊成员列表-搜索成员(不分页) + */ + Single searchChatMember(long chatId, String searchKey); + + /** + * 移除成员(话题和群聊) + */ + Single removeMember(long worldId, long kickUid, long uid); + + /** + * 移除成员(话题和群聊) + */ + Single worldGroupChatKick(long chatId, long uid, long kickUid); + + /** + * 打开/关闭消息提醒 + */ + Single muteGroupChat(long chatId, long uid, boolean ope); + + Single groupChatGet(String tid); + + Single groupChatUpdate(long chatId, String name, String topic); + + Single> groupChatTopicList(int pageSize); + + Single roomWorldModeOpen(long worldId, long roomUid); + + Single roomWorldModeClose(long roomUid); + + + Single worldJoin(long worldId,String roomId); + Single worldExit(long worldId); + + Single worldRoomList(long worldId, int page, int pageSize); + + void worldApprove(long worldId, long uid, long recordId, int result); + + /** + * 查询用户是否在话题中 + * @param worldId + * @param uid + * @return + */ + Single checkInWorld(long worldId, long uid); + Single report(long worldId, int activeType); + Single worldGroupChatExit(long chatId, long uid); + Single worldGroupChatJoinByChatId(long chatId, long uid); + Single worldGroupChatJoinByWorldId(long worldId, long uid); + Single> worldRoomQuery(long worldId); + +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldHelper.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldHelper.java new file mode 100644 index 0000000..c50e788 --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldHelper.java @@ -0,0 +1,62 @@ +package com.chwl.core.miniworld.model; + +import com.chwl.core.auth.AuthModel; +import com.chwl.core.utils.SharedPreferenceUtils; + +import java.util.HashMap; +import java.util.Map; + +public class MiniWorldHelper { + public static final int TYPE_MESSAGE = 1; + public static final int TYPE_GIFT = 2; + public static final int TYPE_AUDIO_PARTY_CREATE = 3; + public static final int TYPE_AUDIO_PARTY_JOIN = 4; + + public static final String REPORT_MAP = "mw_rm_"; + + public static Map reportMap = new HashMap<>(); + + public static void getReportMap(long mwId) { + Long time = (Long) SharedPreferenceUtils.get(REPORT_MAP + AuthModel.get().getCurrentUid() + mwId, 0L); + if (time != null) { + reportMap.put(mwId + "", time); + } + + } + + public static void setReportMap(long mwId) { + long time = System.currentTimeMillis(); + reportMap.put(mwId + "", time); + SharedPreferenceUtils.put(REPORT_MAP + AuthModel.get().getCurrentUid() + mwId, System.currentTimeMillis()); + } + + public static boolean canReport(long mwId) { + if (reportMap.containsKey(mwId + "")) { + Long time = reportMap.get(mwId + ""); + if (time != null) { + if (System.currentTimeMillis() - time > 1000 * 60 * 24) { + return true; + } else { + return false; + } + + } else { + return true; + } + } else { + return true; + } + } + + /** + * 每天上报用户是否有在话题活跃; + * + * 服务端根据此上报判断用户五天内是否在话题活跃,不活跃则强制退出话题; + */ + public static void report(long mwId, int activeType) { + if (canReport(mwId)) { + setReportMap(mwId); + MiniWorldModel.getInstance().report(mwId, activeType).subscribe(); + } + } +} diff --git a/core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldModel.java b/core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldModel.java new file mode 100644 index 0000000..9bc07ac --- /dev/null +++ b/core/src/model_mini_world/java/com/chwl/core/miniworld/model/MiniWorldModel.java @@ -0,0 +1,633 @@ +package com.chwl.core.miniworld.model; + +import androidx.annotation.Nullable; + +import com.google.gson.JsonElement; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.exception.FailReasonException; +import com.chwl.core.miniworld.bean.AudioPartyInfo; +import com.chwl.core.miniworld.bean.AudioPartyListInfo; +import com.chwl.core.miniworld.bean.MWChatInfo; +import com.chwl.core.miniworld.bean.MiniWorldCategoryInfo; +import com.chwl.core.miniworld.bean.MiniWorldDetailInfo; +import com.chwl.core.miniworld.bean.MiniWorldEditClassifyInfo; +import com.chwl.core.miniworld.bean.MiniWorldInWorldInfo; +import com.chwl.core.miniworld.bean.MiniWorldInfo; +import com.chwl.core.miniworld.bean.MiniWorldListInfo; +import com.chwl.core.miniworld.bean.MiniWorldMainInfo; +import com.chwl.core.miniworld.bean.MiniWorldMemberListInfo; +import com.chwl.core.miniworld.bean.OpenSuccessInfo; +import com.chwl.core.miniworld.bean.TopicInfo; +import com.chwl.core.monsterhunting.model.MonsterHuntingModel; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class MiniWorldModel implements IMiniWorldModel { + + public static final int CODE_MINI_WORLD_NON_EXISTENT = 7903;// 话题不存在 + + private static MiniWorldModel instance; + + private Api api = RxNet.create(Api.class); + + public static IMiniWorldModel getInstance() { + if (instance == null) { + synchronized (MonsterHuntingModel.class) { + if (instance == null) { + instance = new MiniWorldModel(); + } + } + } + return instance; + } + + private MiniWorldModel() { +// try { +// java.lang.reflect.Field field = RxNet.class.getDeclaredField("sBuilder"); +// field.setAccessible(true); +// RxNetManager.Builder builder = (RxNetManager.Builder) field.get(null); +// Retrofit retrofit = builder.getRxNetManager().getRetrofit(); +// retrofit = retrofit.newBuilder().baseUrl("http://192.168.8.72:8085").build(); +// api = retrofit.create(Api.class); +// } catch (Exception e) { +// e.printStackTrace(); +// } + } + + @Override + public Single> getCategoryList() { + + return api.getCategoryList().compose(RxHelper.singleMainResult()); + //添加虚拟的 现在后台已经返回,不需要再添加虚拟 +// .map(new Function, List>() { +// @Override +// public List apply(List miniWorldCategoryInfos) throws Exception { +// if (miniWorldCategoryInfos == null) { +// miniWorldCategoryInfos = new ArrayList<>(2); +// } +// MiniWorldCategoryInfo miniWorldCategoryInfo; +// miniWorldCategoryInfo = new MiniWorldCategoryInfo(); +// miniWorldCategoryInfo.setTypeName(ResUtil.getString(R.string.miniworld_model_miniworldmodel_01)); +// miniWorldCategoryInfo.setId(-1); +// miniWorldCategoryInfos.add(0, miniWorldCategoryInfo); +// miniWorldCategoryInfo = new MiniWorldCategoryInfo(); +// miniWorldCategoryInfo.setTypeName(ResUtil.getString(R.string.miniworld_model_miniworldmodel_02)); +// miniWorldCategoryInfo.setId(-2); +// miniWorldCategoryInfos.add(1, miniWorldCategoryInfo); +// return miniWorldCategoryInfos; +// } +// }); + } + + @Override + public Single getMiniWorldMainData(long uid) { + return api.getMiniWorldMainData(uid).compose(RxHelper.singleMainResult()); + } + + @Override + public Single> searchMiniWorldList(String searchKey, int page, int pageSize) { + return api.getMiniWorldList(searchKey, null, null, page, pageSize).compose(RxHelper.singleMainResult()).map(new Function, List>() { + @Override + public List apply(MiniWorldListInfo miniWorldInfoMiniWorldListInfo) throws Exception { + if (miniWorldInfoMiniWorldListInfo == null) { + return Collections.emptyList(); + } + return miniWorldInfoMiniWorldListInfo.getRecords(); + } + }); + } + + @Override + public Single> getCategoryMiniWorldList(String worldTypeId, int page, int pageSize) { + String uid = null; + if ("-1".equals(worldTypeId)) { + uid = String.valueOf(AuthModel.get().getCurrentUid()); + } + return api.getMiniWorldList(null, worldTypeId, uid, page, pageSize).compose(RxHelper.singleMainResult()).map(new Function, List>() { + @Override + public List apply(MiniWorldListInfo miniWorldInfoMiniWorldListInfo) throws Exception { + if (miniWorldInfoMiniWorldListInfo == null) { + return Collections.emptyList(); + } + return miniWorldInfoMiniWorldListInfo.getRecords(); + } + }); + } + + @Override + public Single getWorldDetailInfo(String worldId, String uid) { + return api.getWorldDetailInfo(worldId, uid) + .compose(RxHelper.handleSchedulers()) + .flatMap(result -> { + if (result == null) { + return Single.error(new Throwable("no response")); + } else { + if (result.isSuccess()) { + if (result.getData() != null) { + return Single.just(result.getData()); + } else { + return Single.error(new Throwable("data is null")); + } + } else { + return Single.error(new FailReasonException(result.getMessage(), result.getCode())); + } + } + }); + } + + @Override + public Single getWorldSharePicUrl(long worldId, long uid) { + return api.getWorldSharePicUrl(worldId, uid) + .compose(RxHelper.handleCommon(String::new)); + } + + @Override + public Single dissolveWorld(String worldId, String uid) { + return api.dissolveWorld(worldId, uid) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single> getEditClassifyList() { + return api.getEditClassifyList() + .compose(RxHelper.handleCommon(ArrayList::new)); + } + + @Override + public Single editWorld(String worldId, String uid, String worldTypeId, + String name, String description, String notice, String icon, boolean agreeFlag) { + return api.editWorld(worldId, uid, worldTypeId, name, description, notice, icon, agreeFlag) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single getMemberList(long worldId, int page, int pageSize) { + return api.getMemberList(worldId, null, page, pageSize) + .compose(RxHelper.handleCommon(MiniWorldMemberListInfo::new)); + } + + @Override + public Single searchMember(long worldId, String searchKey) { + return api.getMemberList(worldId, searchKey, null, null) + .compose(RxHelper.handleCommon(MiniWorldMemberListInfo::new)); + } + + @Override + public Single getChatMemberList(long chatId, int page, int pageSize) { + return api.worldGroupChatMemberList(chatId, null, page, pageSize) + .compose(RxHelper.handleCommon(MiniWorldMemberListInfo::new)); + } + + @Override + public Single searchChatMember(long chatId, String searchKey) { + return api.worldGroupChatMemberList(chatId, searchKey, null, null) + .compose(RxHelper.handleCommon(MiniWorldMemberListInfo::new)); + } + + @Override + public Single removeMember(long worldId, long kickUid, long uid) { + return api.removeMember(worldId, kickUid, uid) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single worldGroupChatKick(long chatId, long uid, long kickUid) { + return api.worldGroupChatKick(chatId, uid, kickUid) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single muteGroupChat(long chatId, long uid, boolean ope) { + return api.muteGroupChat(chatId, uid, ope) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single groupChatGet(String tid) { + return api.groupChatGet(tid, AuthModel.get().getCurrentUid()).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult mwChatInfoServiceResult) throws Exception { + if (mwChatInfoServiceResult != null && mwChatInfoServiceResult.isSuccess()) { + return Single.just(mwChatInfoServiceResult.getData()); + } else + return Single.error(new Throwable("error")); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single groupChatUpdate(long chatId, String name, String topic) { + return api.groupChatUpdate(chatId, name, topic, AuthModel.get().getCurrentUid()).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult != null) { + if (objectServiceResult.isSuccess()) + return Single.just(ResUtil.getString(R.string.miniworld_model_miniworldmodel_03)); + else + return Single.error(new Throwable(objectServiceResult.getMessage())); + + } + return Single.error(new Throwable(ResUtil.getString(R.string.miniworld_model_miniworldmodel_04))); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single> groupChatTopicList(int pageSize) { + return api.groupChatTopicList(pageSize).compose(RxHelper.handleCommon()); + } + + @Override + public Single roomWorldModeOpen(long worldId, long roomUid) { + return api.roomWorldModeOpen(worldId, roomUid).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult openSuccessInfoServiceResult) throws Exception { + if (openSuccessInfoServiceResult != null) { + if (openSuccessInfoServiceResult.isSuccess()) { + return Single.just(openSuccessInfoServiceResult.getData().getWarn()); + + } else + return Single.error(new Throwable(openSuccessInfoServiceResult.getMessage())); + + + } else + return Single.error(new Throwable(ResUtil.getString(R.string.miniworld_model_miniworldmodel_05))); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single roomWorldModeClose(long roomUid) { + return api.roomWorldModeClose(roomUid).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult != null) { + if (objectServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.miniworld_model_miniworldmodel_06)); + } else + return Single.error(new Throwable(objectServiceResult.getMessage())); + } + return Single.error(new Throwable(ResUtil.getString(R.string.miniworld_model_miniworldmodel_07))); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single worldJoin(long worldId, @Nullable String roomUid) { + return api.worldJoinV2(worldId, AuthModel.get().getCurrentUid(), roomUid).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult != null) { + if (objectServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.miniworld_model_miniworldmodel_08)); + } else + return Single.error(new Throwable(objectServiceResult.getMessage())); + } + return Single.error(new Throwable(ResUtil.getString(R.string.miniworld_model_miniworldmodel_09))); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single worldExit(long worldId) { + return api.worldExit(worldId, AuthModel.get().getCurrentUid()).flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult objectServiceResult) throws Exception { + if (objectServiceResult != null) { + if (objectServiceResult.isSuccess()) { + return Single.just(ResUtil.getString(R.string.miniworld_model_miniworldmodel_010)); + } else + return Single.error(new Throwable(objectServiceResult.getMessage())); + } + return Single.error(new Throwable(ResUtil.getString(R.string.miniworld_model_miniworldmodel_011))); + } + }).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single worldRoomList(long worldId, int page, int pageSize) { + return api.worldRoomList(worldId, page, pageSize, AuthModel.get().getCurrentUid()).compose(RxHelper.handleCommon()); + } + + @Override + public void worldApprove(long worldId, long uid, long recordId, int result) { + api.worldApprove(worldId, uid, recordId, result).compose(RxHelper.handleSchAndExce()).subscribe(); + } + + @Override + public Single checkInWorld(long worldId, long uid) { + return api.checkInWorld(worldId, uid).compose(RxHelper.singleMainResult()); + } + + @Override + public Single report(long worldId, int activeType) { + return api.report(worldId, AuthModel.get().getCurrentUid(), activeType).compose(RxHelper.handleSchAndExce()); + } + public Single worldGroupChatExit(long chatId, long uid) { + return api.worldGroupChatExit(chatId, uid).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single worldGroupChatJoinByChatId(long chatId, long uid) { + return api.worldGroupChatJoinByChatId(chatId, uid).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single worldGroupChatJoinByWorldId(long worldId, long uid) { + return api.worldGroupChatJoinByWorldId(worldId, uid).compose(RxHelper.handleSchAndExce()); + } + + @Override + public Single> worldRoomQuery(long worldId) { + return api.worldRoomQuery(worldId).flatMap(new Function>, SingleSource>>() { + @Override + public SingleSource> apply(ServiceResult> listServiceResult) throws Exception { + if (listServiceResult.isSuccess()) { + return Single.just(listServiceResult.getData()); + + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + } + }).compose(RxHelper.handleSchAndExce()); + } + + private interface Api { + + /** + * 获取话题分类列表 + * + * @return + */ + @POST("world/type/listAll") + Single>> getCategoryList(); + + /** + * 获取话题首页 + * + * @param uid + * @return + */ + @GET("world/home") + Single> getMiniWorldMainData(@Query("uid") long uid); + + /** + * 查询列表接口 + * + * @param searchKey 关键字 + * @param worldTypeId 类型 + * @param uid + * @param page + * @param pageSize + * @return + */ + @POST("world/list") + @FormUrlEncoded + Single>> getMiniWorldList( + @Field("searchKey") String searchKey, + @Field("worldTypeId") String worldTypeId, + @Field("uid") String uid, + @Field("page") int page, + @Field("pageSize") int pageSize); + + + /** + * 话题详情 + * + * @param worldId 话题id + * @param uid 当前用户的uid + */ + @POST("world/detail") + Single> getWorldDetailInfo(@Query("worldId") String worldId, + @Query("uid") String uid); + + /** + * 获取世界分享图片 + * + * @param worldId 世界id + * @param uid 用户uid + */ + @POST("world/get/share/picture") + Single> getWorldSharePicUrl(@Query("worldId") long worldId, + @Query("uid") long uid); + + /** + * 解散话题 + * + * @param worldId 话题id + * @param uid 当前用户id,必须要话题的创建人id才能解散话题 + */ + @POST("world/dismiss") + Single> dissolveWorld(@Query("worldId") String worldId, + @Query("uid") String uid); + + /** + * 获取话题分类列表 + */ + @POST("world/type/list") + Single>> getEditClassifyList(); + + /** + * 编辑世界 + * + * @param worldId 话题id + * @param uid 世界创始人uid + * @param worldTypeId 话题类型ID + * @param name 名称,限16个字 + * @param description 描述 + * @param notice 公告 + * @param icon 头像 + * @param agreeFlag 进入时是否需要同意,true需要,false不需要 + */ + @POST("world/edit") + Single> editWorld(@Query("worldId") String worldId, + @Query("uid") String uid, + @Query("worldTypeId") String worldTypeId, + @Query("name") String name, + @Query("description") String description, + @Query("notice") String notice, + @Query("icon") String icon, + @Query("agreeFlag") boolean agreeFlag); + + /** + * 获取话题成员列表 + * + * @param worldId 世界id + * @param searchKey 搜索关键字(搜索时不分页) + * @param page 默认1 + * @param pageSize 默认10 + */ + @POST("world/member/list") + Single> getMemberList(@Query("worldId") long worldId, + @Query("searchKey") String searchKey, + @Query("page") Integer page, + @Query("pageSize") Integer pageSize); + + /** + * 移除成员 + * + * @param worldId 要退出的话题id + * @param kickUid 被移除用户id + * @param uid 操作人uid + */ + @POST("world/kick") + Single> removeMember(@Query("worldId") long worldId, + @Query("kickUid") long kickUid, + @Query("uid") long uid); + + /** + * 打开/关闭消息提醒 + * + * @param chatId 群聊id + * @param uid 操作人uid + * @param ope true=开启、false=关闭 + */ + @POST("world/group/chat/mute") + Single> muteGroupChat(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("ope") boolean ope); + + /** + * 获取话题群聊信息 + */ + @GET("world/group/chat/get") + Single> groupChatGet(@Query("tid") String tid, @Query("uid") long uid); + + /** + * 更新话题群聊名称、话题 + */ + @POST("world/group/chat/update") + Single> groupChatUpdate(@Query("chatId") long chatId, @Query("name") String name, + @Query("topic") String topic, @Query("uid") long uid); + + /** + * 随机获取话题 + */ + @GET("world/group/chat/topic/list") + Single>> groupChatTopicList(@Query("pageSize") int pageSize); + + /** + * 开启群聊派对模式(普通房——>群聊派对房) + */ + @POST("room/world/mode/open") + Single> roomWorldModeOpen(@Query("worldId") long worldId, @Query("roomUid") long roomUid); + + /** + * 退出话题 + */ + @POST("world/exit") + Single> worldExit(@Query("worldId") long worldId, @Query("uid") long uid); + + /** + * 语音派对列表 + */ + @POST("world/room/list") + Single> worldRoomList(@Query("worldId") long worldId, + @Query("page") int page, @Query("pageSize") int pageSize, + @Query("uid") long uid); + + /** + * 审核加入世界是否通过 + * + * @param uid 申请人 + * @param type 1-通过, 2-不通过 + */ + @POST("world/approve") + Single>> worldApprove(@Query("worldId") long worldId, @Query("uid") long uid, + @Query("recordId") long recordId, @Query("type") int type); + + /** + * 关闭群聊派对模式(群聊派对房——>普通房) + */ + @POST("room/world/mode/close") + Single> roomWorldModeClose(@Query("roomUid") long roomUid); + + /** + * 检查是否在话题中 + * + * @param worldId + * @param uid + * @return + */ + @POST("world/member/get/flag") + Single> checkInWorld(@Query("worldId") long worldId, @Query("uid") long uid); + + /** + * 话题成员活跃上报 + * + * @param activeType + * 1-消息 2-送礼 3-创建语音派对 4-加入语音派对 + */ + @POST("world/member/active/record/report") + Single report(@Query("worldId") long worldId, @Query("uid") long uid, + @Query("activeType") int activeType); + /** + * 退出群聊 + */ + @POST("world/group/chat/exit") + Single worldGroupChatExit(@Query("chatId") long chatId, @Query("uid") long uid); + + /** + * 加入话题群聊 + */ + @POST("world/group/chat/joinByChatId") + Single worldGroupChatJoinByChatId(@Query("chatId") long chatId, @Query("uid") long uid); + + /** + * 加入话题群聊 + */ + @POST("world/group/chat/joinByWorldId") + Single worldGroupChatJoinByWorldId(@Query("worldId") long worldId, @Query("uid") long uid); + + /** + * 加入话题(不加入群聊) + */ + @POST("world/join/v2") + Single> worldJoinV2(@Query("worldId") long worldId, @Query("uid") long uid, @Query("roomUid") String roomUid); + + /** + * 获取话题群聊成员列表 + * + * @param chatId 世界群聊id + * @param searchKey 搜索关键字(搜索时不分页) + * @param page 默认1 + * @param pageSize 默认10 + */ + @POST("world/group/chat/member/list") + Single> worldGroupChatMemberList(@Query("chatId") long chatId, + @Query("searchKey") String searchKey, + @Query("page") Integer page, + @Query("pageSize") Integer pageSize); + + /** + * 踢出群聊 + */ + @POST("world/group/chat/kick") + Single> worldGroupChatKick(@Query("chatId") long chatId, + @Query("uid") long uid, + @Query("toUid") long toUid); + + /** + * 查询嗨玩派对房间 + */ + @POST("world/room/query") + Single>> worldRoomQuery(@Query("worldId") long chatId); + + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/bean/BaseMusicInfo.java b/core/src/model_music/java/com/chwl/core/music/bean/BaseMusicInfo.java new file mode 100644 index 0000000..7e3bfe0 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/bean/BaseMusicInfo.java @@ -0,0 +1,218 @@ +package com.chwl.core.music.bean; + +import com.chwl.library.utils.BlankUtil; +import com.chwl.library.utils.json.JsonParser; + +import java.util.List; + +import io.realm.RealmObject; + +/** + * Created by chenran on 2017/10/30. + */ + +public class BaseMusicInfo extends RealmObject { + private long id; + + private String songId; + + private String songName; + + private String albumId; + + private String albumIndex; + + private String albumName; + + private String artistIdsJson; + + private String artistIndex; + + private String artistNamesJson; + + private String remoteUri; + + private String localUri; + + private String quality; + + private String year; + + private long duration; + + private boolean deleted; + + private boolean isInPlayerList; + + private long fileSize; + + private String lyricUrl; + + private String songAlbumCover; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getSongId() { + return songId; + } + + public void setSongId(String songId) { + this.songId = songId; + } + + public String getSongName() { + return songName; + } + + public void setSongName(String songName) { + this.songName = songName; + } + + public String getAlbumId() { + return albumId; + } + + public void setAlbumId(String albumId) { + this.albumId = albumId; + } + + public String getAlbumIndex() { + return albumIndex; + } + + public void setAlbumIndex(String albumIndex) { + this.albumIndex = albumIndex; + } + + public String getAlbumName() { + return albumName; + } + + public void setAlbumName(String albumName) { + this.albumName = albumName; + } + + public String getArtistIdsJson() { + return artistIdsJson; + } + + public void setArtistIdsJson(String artistIdsJson) { + this.artistIdsJson = artistIdsJson; + } + + public String getArtistIndex() { + return artistIndex; + } + + public void setArtistIndex(String artistIndex) { + this.artistIndex = artistIndex; + } + + public String getArtistNamesJson() { + return artistNamesJson; + } + + public void setArtistNamesJson(String artistNamesJson) { + this.artistNamesJson = artistNamesJson; + } + + public String getRemoteUri() { + return remoteUri; + } + + public void setRemoteUri(String remoteUri) { + this.remoteUri = remoteUri; + } + + public String getLocalUri() { + return localUri; + } + + public void setLocalUri(String localUri) { + this.localUri = localUri; + } + + public String getQuality() { + return quality; + } + + public void setQuality(String quality) { + this.quality = quality; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public long getDuration() { + return duration; + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public boolean isInPlayerList() { + return isInPlayerList; + } + + public void setInPlayerList(boolean inPlayerList) { + isInPlayerList = inPlayerList; + } + + public long getFileSize() { + return fileSize; + } + + public void setFileSize(long fileSize) { + this.fileSize = fileSize; + } + + public String getLyricUrl() { + return lyricUrl; + } + + public void setLyricUrl(String lyricUrl) { + this.lyricUrl = lyricUrl; + } + + public String getSongAlbumCover() { + return songAlbumCover; + } + + public void setSongAlbumCover(String songAlbumCover) { + this.songAlbumCover = songAlbumCover; + } + + public List getArtistNames() { + if (null != artistNamesJson) { + return JsonParser.parseJsonList(artistNamesJson, String.class); + } + + return null; + } + + public void setArtistName(List artistNames) { + if (!BlankUtil.isBlank(artistNames)) { + this.artistNamesJson = JsonParser.toJson(artistNames); + } + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/bean/LocalMusicInfo.java b/core/src/model_music/java/com/chwl/core/music/bean/LocalMusicInfo.java new file mode 100644 index 0000000..9ac4fa4 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/bean/LocalMusicInfo.java @@ -0,0 +1,281 @@ +package com.chwl.core.music.bean; + +import com.chwl.library.utils.BlankUtil; +import com.chwl.library.utils.json.JsonParser; + +import java.io.Serializable; +import java.util.List; + +import io.realm.RealmObject; +import io.realm.annotations.Ignore; +import io.realm.annotations.PrimaryKey; + +/** + * Created by chenran on 2017/10/28. + */ + +public class LocalMusicInfo extends RealmObject implements Serializable { + @PrimaryKey + private long localId; + + private String songId; + + private String songName; + + private String albumId; + + private String albumIndex; + + private String albumName; + + private String artistIdsJson; + + private String artistIndex; + + private String artistNamesJson; + + private String remoteUri; + + private String localUri; + + private String quality; + + private String year; + + private long duration; + + private boolean deleted; + + private boolean isInPlayerList; + + private long fileSize; + + private String lyricUrl; + + private String songAlbumCover; + + private String nick; + + private String author; + + @Ignore + private boolean isSelected; + + public String getSongId() { + return songId; + } + + public void setSongId(String songId) { + this.songId = songId; + } + + public String getSongName() { + return songName; + } + + public void setSongName(String songName) { + this.songName = songName; + } + + public String getAlbumId() { + return albumId; + } + + public void setAlbumId(String albumId) { + this.albumId = albumId; + } + + public String getAlbumIndex() { + return albumIndex; + } + + public void setAlbumIndex(String albumIndex) { + this.albumIndex = albumIndex; + } + + public String getAlbumName() { + return albumName; + } + + public void setAlbumName(String albumName) { + this.albumName = albumName; + } + + public String getArtistIdsJson() { + return artistIdsJson; + } + + public void setArtistIdsJson(String artistIdsJson) { + this.artistIdsJson = artistIdsJson; + } + + public String getArtistIndex() { + return artistIndex; + } + + public void setArtistIndex(String artistIndex) { + this.artistIndex = artistIndex; + } + + public String getArtistNamesJson() { + return artistNamesJson; + } + + public void setArtistNamesJson(String artistNamesJson) { + this.artistNamesJson = artistNamesJson; + } + + public String getRemoteUri() { + return remoteUri; + } + + public void setRemoteUri(String remoteUri) { + this.remoteUri = remoteUri; + } + + public String getLocalUri() { + return localUri; + } + + public void setLocalUri(String localUri) { + this.localUri = localUri; + } + + public String getQuality() { + return quality; + } + + public void setQuality(String quality) { + this.quality = quality; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public long getDuration() { + return duration; + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public boolean isInPlayerList() { + return isInPlayerList; + } + + public void setInPlayerList(boolean inPlayerList) { + isInPlayerList = inPlayerList; + } + + public long getFileSize() { + return fileSize; + } + + public void setFileSize(long fileSize) { + this.fileSize = fileSize; + } + + public String getLyricUrl() { + return lyricUrl; + } + + public void setLyricUrl(String lyricUrl) { + this.lyricUrl = lyricUrl; + } + + public String getSongAlbumCover() { + return songAlbumCover; + } + + public void setSongAlbumCover(String songAlbumCover) { + this.songAlbumCover = songAlbumCover; + } + + public String getNick() { + return nick; + } + + public void setNick(String nick) { + this.nick = nick; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public List getArtistNames() { + if (null != artistNamesJson) { + return JsonParser.parseJsonList(artistNamesJson, String.class); + } + + return null; + } + + public void setArtistName(List artistNames) { + if (!BlankUtil.isBlank(artistNames)) { + this.artistNamesJson = JsonParser.toJson(artistNames); + } + } + + public long getLocalId() { + return localId; + } + + public void setLocalId(long localId) { + this.localId = localId; + } + + public boolean isSelected() { + return isSelected; + } + + public void setSelected(boolean selected) { + isSelected = selected; + } + + @Override + public String toString() { + return "LocalMusicInfo{" + + "localId=" + localId + + ", songId='" + songId + '\'' + + ", songName='" + songName + '\'' + + ", albumId='" + albumId + '\'' + + ", albumIndex='" + albumIndex + '\'' + + ", albumName='" + albumName + '\'' + + ", artistIdsJson='" + artistIdsJson + '\'' + + ", artistIndex='" + artistIndex + '\'' + + ", artistNamesJson='" + artistNamesJson + '\'' + + ", remoteUri='" + remoteUri + '\'' + + ", localUri='" + localUri + '\'' + + ", quality='" + quality + '\'' + + ", year='" + year + '\'' + + ", duration=" + duration + + ", deleted=" + deleted + + ", isInPlayerList=" + isInPlayerList + + ", fileSize=" + fileSize + + ", lyricUrl='" + lyricUrl + '\'' + + ", songAlbumCover='" + songAlbumCover + '\'' + + ", nick='" + nick + '\'' + + ", author='" + author + '\'' + + '}'; + } +} + diff --git a/core/src/model_music/java/com/chwl/core/music/bean/ShareMusicInfo.java b/core/src/model_music/java/com/chwl/core/music/bean/ShareMusicInfo.java new file mode 100644 index 0000000..4d14a34 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/bean/ShareMusicInfo.java @@ -0,0 +1,64 @@ +package com.chwl.core.music.bean; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 对接接口的实体(UI 也能用) + */ +@Data +public class ShareMusicInfo implements Serializable { + + /** + * musicId : 3107 + * songName : Psycho (Pt. 2) + * musicName : Psycho (Pt. 2) + * author : Russ + * nick : 常发 + * album : Psycho (Pt. 2) + * localUri : https://vkiss.oss-cn-shenzhen.aliyuncs.com/music/share/Psycho+%28Pt.+2%29 + */ + + /** + * 歌曲 ID -- 服务器返回 + */ + private int musicId; + + /** + * 歌曲名称 + */ + private String songName; + + /** + * 歌曲名字 + */ + private String musicName; + + /** + * 歌手名字 + */ + private String author; + + /** + * 上传者的名字 + */ + private String nick; + + /** + * 专辑名字 + */ + private String album; + + /** + * MP3地址 + */ + private String localUri; + + /** + * 是否已经在本地 + */ + private boolean inLocalList; + +} + diff --git a/core/src/model_music/java/com/chwl/core/music/db/bean/LocalMusicBean.java b/core/src/model_music/java/com/chwl/core/music/db/bean/LocalMusicBean.java new file mode 100644 index 0000000..ac12ef9 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/bean/LocalMusicBean.java @@ -0,0 +1,56 @@ +package com.chwl.core.music.db.bean; + +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.Index; +import androidx.room.PrimaryKey; + +import lombok.Data; + +/** + * 本地音乐对应的数据库实体 + * Table: LocalSong + */ +@Data +@Entity(tableName = "local_songs", indices = {@Index("local_id")}) +public class LocalMusicBean { + + @PrimaryKey(autoGenerate = true) + private long id; + + @ColumnInfo(name = "local_id") + private long localId; + + @ColumnInfo(name = "song_id") + private String songId; + + @ColumnInfo(name = "song_name") + private String songName; + + @ColumnInfo(name = "album_name") + private String albumName; + + @ColumnInfo(name = "artist_name") + private String artistName; + + @ColumnInfo(name = "local_uri") + private String localUri; + + @ColumnInfo(name = "year") + private String year; + + @ColumnInfo(name = "duration") + private long duration; + + /** + * 新增uri适配安卓10.0 + */ + @ColumnInfo(name = "uri") + private String uri; + + /** + * 用于列表判断是否选中 + */ + private boolean selected; + +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/bean/SongBean.java b/core/src/model_music/java/com/chwl/core/music/db/bean/SongBean.java new file mode 100644 index 0000000..ba9547b --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/bean/SongBean.java @@ -0,0 +1,63 @@ +package com.chwl.core.music.db.bean; + +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.Index; +import androidx.room.PrimaryKey; + +import lombok.Data; + +/** + * 保存到数据库中的歌曲实体 + * Table: 「我的曲库」或者叫 播放列表 + */ +@Data +@Entity(tableName = "songs", indices = {@Index("music_id"), @Index("local_uri")}) +public class SongBean { + + @PrimaryKey(autoGenerate = true) + private long id; + + /** + * 歌曲 ID -- 服务器返回 + */ + @ColumnInfo(name = "music_id") + private int musicId; + + /** + * 歌曲名称 + */ + @ColumnInfo(name = "song_name") + private String songName; + + /** + * 歌曲名字 + */ + @ColumnInfo(name = "music_name") + private String musicName; + + /** + * 歌手名字 + */ + @ColumnInfo(name = "author") + private String author; + + /** + * 上传者的名字 + */ + @ColumnInfo(name = "nick") + private String nick; + + /** + * 专辑名字 + */ + @ColumnInfo(name = "album") + private String album; + + /** + * MP3地址 + */ + @ColumnInfo(name = "local_uri") + + private String localUri; +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/converter/LocalMusicBeanConverter.java b/core/src/model_music/java/com/chwl/core/music/db/converter/LocalMusicBeanConverter.java new file mode 100644 index 0000000..702eebb --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/converter/LocalMusicBeanConverter.java @@ -0,0 +1,28 @@ +package com.chwl.core.music.db.converter; + +import com.chwl.core.music.bean.LocalMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; + +/** + * 方便将 UI 实体 跟 数据库实体 互相转换的工具类 + */ +public class LocalMusicBeanConverter { + + public static LocalMusicBean toBean(LocalMusicInfo localMusicInfo) { + LocalMusicBean bean = new LocalMusicBean(); + return bean; + } + + public static LocalMusicInfo toInfo(LocalMusicBean localMusicBean) { + LocalMusicInfo info = new LocalMusicInfo(); + info.setLocalId(localMusicBean.getLocalId()); + info.setSongId(localMusicBean.getSongId()); + info.setSongName(localMusicBean.getSongName()); + info.setAlbumName(localMusicBean.getAlbumName()); + info.setArtistNamesJson(localMusicBean.getArtistName()); + info.setLocalUri(localMusicBean.getLocalUri()); + info.setYear(localMusicBean.getYear()); + info.setDuration(localMusicBean.getDuration()); + return info; + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/converter/ShareMusicConverter.java b/core/src/model_music/java/com/chwl/core/music/db/converter/ShareMusicConverter.java new file mode 100644 index 0000000..ab4c851 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/converter/ShareMusicConverter.java @@ -0,0 +1,20 @@ +package com.chwl.core.music.db.converter; + +import com.chwl.core.music.bean.ShareMusicInfo; +import com.chwl.core.music.db.bean.SongBean; + +/** + * 方便将 UI 实体 跟 数据库实体 互相转换的工具类 + */ +public class ShareMusicConverter { + + public static SongBean toBean(ShareMusicInfo shareMusicInfo) { + SongBean bean = new SongBean(); + return bean; + } + + public static ShareMusicInfo toInfo(SongBean songBean) { + ShareMusicInfo info = new ShareMusicInfo(); + return info; + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/dao/LocalMusicDao.java b/core/src/model_music/java/com/chwl/core/music/db/dao/LocalMusicDao.java new file mode 100644 index 0000000..c577066 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/dao/LocalMusicDao.java @@ -0,0 +1,61 @@ +package com.chwl.core.music.db.dao; + +import androidx.room.Dao; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import com.chwl.core.music.db.bean.LocalMusicBean; + +import java.util.List; + +import io.reactivex.Single; + +@Dao +public interface LocalMusicDao { + + @Query("SELECT * FROM local_songs ORDER BY ID DESC LIMIT :page, :size") + Single> getLocalMusicList(int page,int size); + + @Query("SELECT * FROM local_songs ORDER BY ID DESC") + Single> getLocalMusicList(); + + @Query("SELECT * FROM local_songs ORDER BY ID DESC") + List getLocalMusicListAsyn(); + + @Query("SELECT * FROM local_songs WHERE local_id = :localId") + Single findByLocalId(long localId); + + @Insert(onConflict = OnConflictStrategy.ROLLBACK) + Long insertLocalMusicBean(LocalMusicBean localMusicBean); + + @Insert(onConflict = OnConflictStrategy.ROLLBACK) + List batchInsertLocalMusicBean(List localMusicBeanList); + + @Query("DELETE FROM local_songs") + int clearAll(); + + /** + * 根据名称和localUri检查是否存在 + * @param songName + * @param localUri + * @return + */ + @Query("select id from local_songs where song_name = :songName and local_uri = :localUri") + List checkExist(String songName, String localUri); + + /** + * 删除 + * @param localUri + * @return + */ + @Query("delete from local_songs where local_uri=:localUri") + int deleteByLocalUri(String localUri); + + /** + * 获取列表数量 + * @return + */ + @Query("select count(*) from local_songs") + Single getCount(); +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/dao/SongDao.java b/core/src/model_music/java/com/chwl/core/music/db/dao/SongDao.java new file mode 100644 index 0000000..dd798bb --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/dao/SongDao.java @@ -0,0 +1,30 @@ +package com.chwl.core.music.db.dao; + +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.db.bean.SongBean; + +import java.util.List; + +import io.reactivex.Single; + +@Dao +public interface SongDao { + + @Query("SELECT * FROM songs ORDER BY ID LIMIT :page, :size") + Single> getPlayList(int page,int size); + + @Query("SELECT * FROM songs WHERE music_id = :musicId") + Single findByMusicId(long musicId); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insertSongBean(SongBean songBean); + + @Delete + void deleteSongBeanList(List localMusicBeanList); +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/model/ILocalMusicDbModel.java b/core/src/model_music/java/com/chwl/core/music/db/model/ILocalMusicDbModel.java new file mode 100644 index 0000000..ebe1fda --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/model/ILocalMusicDbModel.java @@ -0,0 +1,51 @@ +package com.chwl.core.music.db.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.music.bean.LocalMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; + +import java.util.List; + +import io.reactivex.Single; + +public interface ILocalMusicDbModel extends IModel { + + /** + * 扫描本地音乐 + */ + void scanLocalMusic(); + + boolean isRefresh(); + + /** + * 手动停止扫描 + */ + void stopScanLocalMusic(); + + /** + * 批量存储本地音乐 + * + */ + Single> batchAddToDB(List localMusicBeanList); + + /** + * 查询歌曲 + * + * @param localId + * @return + */ + Single queryByLocalId(long localId); + + /** + * 清除本地音乐的数据 + * + */ + Single clearAll(); + + Single> queryLocalMusicBeanList(); + + /** + * 查询本地音乐列表 + */ + Single> queryLocalMusicBeanList(int page); +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/model/IPlayerDbModel.java b/core/src/model_music/java/com/chwl/core/music/db/model/IPlayerDbModel.java new file mode 100644 index 0000000..ee4dacf --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/model/IPlayerDbModel.java @@ -0,0 +1,55 @@ +package com.chwl.core.music.db.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.music.bean.LocalMusicInfo; + +import java.util.List; + +import io.realm.RealmResults; + +/** + * Created by chenran on 2017/10/31. + */ + +public interface IPlayerDbModel extends IModel{ + + /** + * 存储本地音乐 + * @param localId + */ + public void addToPlayerList(long localId); + + /** + * 批量存储本地音乐 + * @param localMusicInfos + */ + void batchAddToPlayerList(List localMusicInfos); + + /** + * 查询歌曲 + * @param localId + * @return + */ + public LocalMusicInfo requestLocalMusicInfoByLocalId(long localId); + + /** + * 删除本地音乐 + * @param localId + */ + public void deleteFromPlayerList(long localId); + + /** + * 扫描本地音乐 + */ + public void replaceAllLocalMusics(List localMusicInfoList); + + /** + * 查询本地所有音乐 + */ + public RealmResults queryAllLocalMusicInfos(); + + /** + * 查询本地音乐播放列表音乐 + */ + public RealmResults queryPlayerListLocalMusicInfos(); +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/model/LocalMusicDbModel.java b/core/src/model_music/java/com/chwl/core/music/db/model/LocalMusicDbModel.java new file mode 100644 index 0000000..5447a80 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/model/LocalMusicDbModel.java @@ -0,0 +1,365 @@ +package com.chwl.core.music.db.model; + +import android.annotation.SuppressLint; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.MediaStore; + +import androidx.annotation.Nullable; + +import com.chwl.core.db.AppDataBase; +import com.chwl.core.base.BaseModel; +import com.chwl.core.music.bean.LocalMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.db.converter.LocalMusicBeanConverter; +import com.chwl.core.music.event.RefreshLocalMusicEvent; +import com.chwl.core.utils.AsyncTaskScanMusicFile; +import com.chwl.core.utils.SongUtils; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.config.BasicConfig; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; + +public class LocalMusicDbModel extends BaseModel implements ILocalMusicDbModel { + + public static final String SCHEME_FILE = "file://"; + public static final long DURATION_MIN = 1000; + + private Context context; + private AsyncTaskScanMusicFile scanMediaTask; + private volatile boolean isRefresh; + private List localMusicInfoList = new ArrayList<>(); + private CompositeDisposable compositeDisposable = new CompositeDisposable(); + private AtomicInteger page = new AtomicInteger(0); + + private LocalMusicDbModel() { + } + + public static LocalMusicDbModel getInstance() { + return SingletonHolder.INSTANCE; + } + + @Override + public void scanLocalMusic() { + if (isRefresh) { + return; + } + + isRefresh = true; + // 扫描本地的所有音乐 + scanMediaTask = new AsyncTaskScanMusicFile(BasicConfig.INSTANCE.getAppContext(), 0, new AsyncTaskScanMusicFile.ScanMediaCallback() { + @Override + public void onProgress(int progress, String message, int total) { + } + + @SuppressLint("CheckResult") + @Override + public void onComplete(boolean result) { + // 查询出第一页的内容放到界面上显示出来 + getInstance() + .queryLocalMusicBeanList(page.get()) + .doOnSubscribe(disposable -> { + compositeDisposable.add(disposable); + }) + .subscribe((localMusicInfos, throwable) -> { + if (throwable == null) { + isRefresh = false; + localMusicInfoList.clear(); + localMusicInfoList.addAll(localMusicInfos); + EventBus.getDefault().post(new RefreshLocalMusicEvent()); + } else { + throwable.printStackTrace(); + } + }); + } + }); + scanMediaTask.execute(BasicConfig.INSTANCE.getAppContext()); + } + + @Override + public boolean isRefresh() { + return isRefresh; + } + + @Override + public void stopScanLocalMusic() { + if (isRefresh) { + scanMediaTask.cancel(true); + compositeDisposable.clear(); + isRefresh = false; + } + } + + public List getLocalMusicInfoList() { + return localMusicInfoList; + } + + @Override + public Single> batchAddToDB(List localMusicBeanList) { + return Single.create(e -> { + AppDataBase.getInstance().beginTransaction(); + List list = AppDataBase.getInstance() + .localMusicDao() + .batchInsertLocalMusicBean(localMusicBeanList); + if (!ListUtils.isListEmpty(list)) { + AppDataBase.getInstance().setTransactionSuccessful(); + e.onSuccess(list); + } else { + e.onError(new Throwable("error in adding")); + } + AppDataBase.getInstance().endTransaction(); + }); + } + + @Override + public Single queryByLocalId(long localId) { + return AppDataBase.getInstance() + .localMusicDao() + .findByLocalId(localId) + .flatMap(localMusicBean -> Single.just(LocalMusicBeanConverter.toInfo(localMusicBean))) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single clearAll() { + return Single.create((SingleOnSubscribe) e -> { + AppDataBase.getInstance().beginTransaction(); + int rows = AppDataBase.getInstance() + .localMusicDao() + .clearAll(); + if (rows > 0) { + AppDataBase.getInstance().setTransactionSuccessful(); + e.onSuccess(rows); + } else { + e.onError(new Throwable("error delete")); + } + AppDataBase.getInstance().endTransaction(); + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取本地列表 + * + * @return + */ + @Override + public Single> queryLocalMusicBeanList() { + return AppDataBase.getInstance() + .localMusicDao() + .getLocalMusicList() + .map(new Function, List>() { + @Override + public List apply(List localMusicBeans) { + return localMusicBeans; + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 获取本地列表(分页) + * + * @return + */ + @Override + public Single> queryLocalMusicBeanList(int page) { + + return AppDataBase.getInstance() + .localMusicDao() + .getLocalMusicList((page - 1) * 300, 300); + } + + + /** + * 搜索本地数据库 + * + * @param filter + * @return + */ + public Single> scanLocalMusicBeans(boolean filter) { + Single> single = Single.just(BasicConfig.INSTANCE.getAppContext()).map(new Function>() { + @Override + public List apply(Context context) { + return queryLocalMusicList(context); + } + }); + //筛选本地没有的 + if (filter) { + return single.observeOn(Schedulers.io()).map(new Function, List>() { + @Override + public List apply(List localMusicBeans) { + Iterator iterator = localMusicBeans.iterator(); + while (iterator.hasNext()) { + LocalMusicBean localMusicBean = iterator.next(); + if (localMusicBean == null) { + iterator.remove(); + continue; + } + if (!ListUtils.isListEmpty(AppDataBase.getInstance().localMusicDao().checkExist(localMusicBean.getSongName(), localMusicBean.getLocalUri()))) { + iterator.remove(); + } + } + return localMusicBeans; + } + }); + } + return single; + } + + public Single> scanLocalMusicBeans() { + return scanLocalMusicBeans(true); + } + + /** + * 查询本地音乐列表 + * + * @param context + * @return + */ + private List queryLocalMusicList(Context context) { + List localMusicBeanList = new ArrayList<>(); + Cursor cursor = null; + try { + cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + , null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); + if (cursor != null) { + while (cursor.moveToNext()) { + LocalMusicBean localMusicBean = getLocalMusicBean(cursor); + localMusicBeanList.add(localMusicBean); + } + } + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } finally { + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + } + return localMusicBeanList; + } + + /** + * 获取本地音乐 + */ + private @Nullable + LocalMusicBean getLocalMusicBean(Cursor cursor) { + try { + LocalMusicBean song = new LocalMusicBean(); + + long duration = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); + + //检查时长 + if (!checkDuration(duration)) { + return null; + } + int isMusic = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_MUSIC)); + if (!checkMusic(isMusic)) { + return null; + } + String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); + if (data == null) { + return null; + } + //没有格式 + if (!data.contains(".")) { + return null; + } + int index = data.lastIndexOf("."); + //有.但没有格式 + if (index == data.length() - 1) { + return null; + } + String suffix = data.substring(data.lastIndexOf(".") + 1); + //非mp3格式 + if (!"mp3".equalsIgnoreCase(suffix)) { + return null; + } + + + String musicName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); + String artist = null; + if (musicName == null || musicName.trim().isEmpty()) { + musicName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); + } + if (musicName != null && musicName.contains("-")) { + String[] strs = musicName.split("-"); + musicName = strs[1].trim(); + artist = strs[0].trim(); + } + song.setSongName(musicName); + song.setYear(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.YEAR))); + song.setAlbumName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM))); + //与服务端统一精度 精确到毫秒 + song.setDuration(duration); + if (artist == null) { + artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); + } + song.setArtistName(artist); + + song.setLocalUri(data); + song.setLocalId(cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID))); + song.setSongId(SongUtils.generateThirdPartyId()); + + int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));// 歌曲的id + Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); + song.setUri(uri.toString()); + + return song; + } catch (Exception e) { + return null; + } + } + + /** + * 检查 + * + * @param duration + * @return + */ + private boolean checkDuration(long duration) { + return duration > DURATION_MIN; + } + + /** + * 判断是否是音乐 + * + * @param isMusic + * @return + */ + private boolean checkMusic(int isMusic) { + return isMusic == 1; + } + + public Single> getLocalMusicBeans(int page) { + return queryLocalMusicBeanList(page); + } + + /** + * 获取音乐数 + * + * @return + */ + public Single getLocalMusicCount() { + return AppDataBase.getInstance().localMusicDao().getCount(); + } + + + private static class SingletonHolder { + private static final LocalMusicDbModel INSTANCE = new LocalMusicDbModel(); + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/db/model/PlayerDbModel.java b/core/src/model_music/java/com/chwl/core/music/db/model/PlayerDbModel.java new file mode 100644 index 0000000..62e6747 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/db/model/PlayerDbModel.java @@ -0,0 +1,101 @@ +package com.chwl.core.music.db.model; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.music.bean.LocalMusicInfo; + +import java.util.List; + +import io.realm.Realm; +import io.realm.RealmResults; + +/** + * Created by chenran on 2017/10/31. + */ + +public class PlayerDbModel extends BaseModel implements IPlayerDbModel { + + private PlayerDbModel() { + + } + + private static final class Helper { + public static final PlayerDbModel INSTANCE = new PlayerDbModel(); + } + + public static PlayerDbModel get() { + return PlayerDbModel.Helper.INSTANCE; + } + + @Override + public void addToPlayerList(long localId) { + Realm mRealm = Realm.getDefaultInstance(); + mRealm.beginTransaction(); + LocalMusicInfo localMusicInfo = mRealm.where(LocalMusicInfo.class).equalTo("localId", localId).findFirst(); + localMusicInfo.setInPlayerList(true); + mRealm.copyToRealmOrUpdate(localMusicInfo); + mRealm.commitTransaction(); + } + + @Override + public void batchAddToPlayerList(List localMusicInfos) { + Realm mRealm = Realm.getDefaultInstance(); + mRealm.beginTransaction(); + for (LocalMusicInfo localMusicInfo : localMusicInfos) { + localMusicInfo = mRealm.where(LocalMusicInfo.class).equalTo("localId", localMusicInfo.getLocalId()).findFirst(); + if (localMusicInfo != null) { + localMusicInfo.setInPlayerList(true); + mRealm.copyToRealmOrUpdate(localMusicInfo); + } + } + mRealm.commitTransaction(); + } + + @Override + public LocalMusicInfo requestLocalMusicInfoByLocalId(long localId) { + Realm mRealm = Realm.getDefaultInstance(); + LocalMusicInfo localMusicInfo = mRealm.where(LocalMusicInfo.class).equalTo("localId", localId).findFirst(); + return localMusicInfo; + } + + @Override + public void deleteFromPlayerList(long localId) { + Realm mRealm = Realm.getDefaultInstance(); + mRealm.beginTransaction(); + LocalMusicInfo localMusicInfo = mRealm.where(LocalMusicInfo.class).equalTo("localId", localId).findFirst(); + localMusicInfo.setInPlayerList(false); + mRealm.copyToRealmOrUpdate(localMusicInfo); + mRealm.commitTransaction(); + } + + @Override + public void replaceAllLocalMusics(List localMusicInfoList) { + Realm mRealm = Realm.getDefaultInstance(); + if (localMusicInfoList != null) { + for (int i=0; i queryAllLocalMusicInfos() { + Realm mRealm = Realm.getDefaultInstance(); + RealmResults localMusicInfos = mRealm.where(LocalMusicInfo.class).findAll(); + return localMusicInfos; + } + + @Override + public RealmResults queryPlayerListLocalMusicInfos() { + Realm mRealm = Realm.getDefaultInstance(); + RealmResults localMusicInfos = mRealm.where(LocalMusicInfo.class).equalTo("isInPlayerList", true).findAll(); + return localMusicInfos; + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/CurrentMusicUpdateEvent.java b/core/src/model_music/java/com/chwl/core/music/event/CurrentMusicUpdateEvent.java new file mode 100644 index 0000000..56e8f07 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/CurrentMusicUpdateEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.event; + +/** + * create by lvzebiao on 2018/9/5 + */ +public class CurrentMusicUpdateEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/JumpToShareMusicListFragmentEvent.java b/core/src/model_music/java/com/chwl/core/music/event/JumpToShareMusicListFragmentEvent.java new file mode 100644 index 0000000..25f30eb --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/JumpToShareMusicListFragmentEvent.java @@ -0,0 +1,4 @@ +package com.chwl.core.music.event; + +public class JumpToShareMusicListFragmentEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/MusicAddEvent.java b/core/src/model_music/java/com/chwl/core/music/event/MusicAddEvent.java new file mode 100644 index 0000000..fcab6cb --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/MusicAddEvent.java @@ -0,0 +1,11 @@ +package com.chwl.core.music.event; + +import com.chwl.core.music.bean.LocalMusicInfo; + +import lombok.Data; + +@Data +public class MusicAddEvent { + + private LocalMusicInfo localMusicInfo; +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/MusicDeleteEvent.java b/core/src/model_music/java/com/chwl/core/music/event/MusicDeleteEvent.java new file mode 100644 index 0000000..19991eb --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/MusicDeleteEvent.java @@ -0,0 +1,11 @@ +package com.chwl.core.music.event; + +import com.chwl.core.music.bean.LocalMusicInfo; + +import lombok.Data; + +@Data +public class MusicDeleteEvent { + + private LocalMusicInfo localMusicInfo; +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/MusicPauseEvent.java b/core/src/model_music/java/com/chwl/core/music/event/MusicPauseEvent.java new file mode 100644 index 0000000..9c4ad20 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/MusicPauseEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.event; + +/** + * create by lvzebiao on 2018/9/6 + */ +public class MusicPauseEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/MusicPlayingEvent.java b/core/src/model_music/java/com/chwl/core/music/event/MusicPlayingEvent.java new file mode 100644 index 0000000..a54f3e9 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/MusicPlayingEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.event; + +/** + * create by lvzebiao on 2018/9/6 + */ +public class MusicPlayingEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/MusicStopEvent.java b/core/src/model_music/java/com/chwl/core/music/event/MusicStopEvent.java new file mode 100644 index 0000000..17120cb --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/MusicStopEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.event; + +/** + * create by lvzebiao on 2018/9/6 + */ +public class MusicStopEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/RefreshLocalMusicEvent.java b/core/src/model_music/java/com/chwl/core/music/event/RefreshLocalMusicEvent.java new file mode 100644 index 0000000..a567281 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/RefreshLocalMusicEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.event; + +/** + * create by lvzebiao on 2018/9/5 + */ +public class RefreshLocalMusicEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/event/RefreshPlayerListEvent.java b/core/src/model_music/java/com/chwl/core/music/event/RefreshPlayerListEvent.java new file mode 100644 index 0000000..90c9406 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/event/RefreshPlayerListEvent.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.event; + +/** + * create by lvzebiao on 2018/9/5 + */ +public class RefreshPlayerListEvent { +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/ILocalMusicListModel.java b/core/src/model_music/java/com/chwl/core/music/model/ILocalMusicListModel.java new file mode 100644 index 0000000..d54e60f --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/ILocalMusicListModel.java @@ -0,0 +1,6 @@ +package com.chwl.core.music.model; + +import com.chwl.core.base.IModel; + +public interface ILocalMusicListModel extends IModel { +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/IMusicListModel.java b/core/src/model_music/java/com/chwl/core/music/model/IMusicListModel.java new file mode 100644 index 0000000..72c22d8 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/IMusicListModel.java @@ -0,0 +1,6 @@ +package com.chwl.core.music.model; + +import com.chwl.core.base.IModel; + +public interface IMusicListModel extends IModel { +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java b/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java new file mode 100644 index 0000000..35f1333 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/IPlayerModel.java @@ -0,0 +1,73 @@ +package com.chwl.core.music.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.music.bean.LocalMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; + +import java.util.List; + +import io.reactivex.Single; + +/** + * Created by chenran on 2017/10/28. + */ + +public interface IPlayerModel extends IModel{ + public static final int STATE_STOP = 0; + public static final int STATE_PLAY = 1; + public static final int STATE_PAUSE = 2; + /** + * 刷新本地音乐库 + */ + void refreshLocalMusic(List lastScannedSongs); + + /** + * mengsheng + * 刷新本地音乐库 + */ + void refreshLocalMusic(); + + void addMusicToPlayerList(LocalMusicBean localMusicInfo); + + void deleteMusicFromPlayerList(LocalMusicBean localMusicInfo); + + /** + * 查询本地音乐列表 + */ + List requestLocalMusicInfos(); + + /** + * 查询本地播放器列表 + * @return + */ + Single> requestPlayerListLocalMusicInfos(); + + boolean isRefresh(); + + int getState(); + + LocalMusicBean getCurrent(); + + List getPlayerListMusicInfos(); + + int play(LocalMusicBean localMusicInfo); + + void pause(); + + void stop(); + + void seekVolume(int volume); + + void seekRecordingVolume(int volume); + + void seekRecordingVolumeForTemp(int volume); + + int getCurrentVolume(); + + int getCurrentRecordingVolume(); + + int playNext(); + + List getLocalMusicBeanList(); + +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/IShareMusicListModel.java b/core/src/model_music/java/com/chwl/core/music/model/IShareMusicListModel.java new file mode 100644 index 0000000..5d7c856 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/IShareMusicListModel.java @@ -0,0 +1,16 @@ +package com.chwl.core.music.model; + +import com.chwl.core.base.IModel; +import com.chwl.core.music.bean.ShareMusicInfo; + +import java.util.List; + +import io.reactivex.Single; + +public interface IShareMusicListModel extends IModel { + Single> getShareMusicList(int page); + + Single> searchShareMusicList(String songName, int page); + + Single addMusic(long musicId); +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/LocalMusicListModel.java b/core/src/model_music/java/com/chwl/core/music/model/LocalMusicListModel.java new file mode 100644 index 0000000..c23949a --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/LocalMusicListModel.java @@ -0,0 +1,7 @@ +package com.chwl.core.music.model; + +import com.chwl.core.base.BaseModel; +import com.chwl.core.base.IModel; + +public class LocalMusicListModel extends BaseModel implements IModel { +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/MusicListModel.java b/core/src/model_music/java/com/chwl/core/music/model/MusicListModel.java new file mode 100644 index 0000000..03d665e --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/MusicListModel.java @@ -0,0 +1,17 @@ +package com.chwl.core.music.model; + +import com.chwl.core.base.BaseModel; + +public class MusicListModel extends BaseModel implements IMusicListModel { + + private MusicListModel() { + } + + public static MusicListModel getInstance() { + return SingletonHolder.INSTANCE; + } + + private static class SingletonHolder { + private static final MusicListModel INSTANCE = new MusicListModel(); + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java b/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java new file mode 100644 index 0000000..233aaf5 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/PlayerModel.java @@ -0,0 +1,372 @@ +package com.chwl.core.music.model; + +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; + +import com.chwl.core.DemoCache; +import com.chwl.core.base.BaseModel; +import com.chwl.core.manager.AudioEngineManager; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.manager.RoomEvent; +import com.chwl.core.manager.VolumeSetting; +import com.chwl.core.music.bean.LocalMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.music.db.model.LocalMusicDbModel; +import com.chwl.core.music.db.model.PlayerDbModel; +import com.chwl.core.music.event.MusicPauseEvent; +import com.chwl.core.music.event.MusicPlayingEvent; +import com.chwl.core.music.event.MusicStopEvent; +import com.chwl.library.utils.config.BasicConfig; +import com.chwl.library.utils.pref.CommonPref; + +import org.greenrobot.eventbus.EventBus; + +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; +import io.realm.RealmResults; + +/** + * Created by chenran on 2017/10/28. + */ + +public class PlayerModel extends BaseModel implements IPlayerModel { + private final String AUDIO_SUFFIX_MP3 = ".mp3"; + private boolean isRefresh; + private List playerListMusicInfos; + private LocalMusicBean current; + private List localMusicBeanList; + private long currentLocalId; + private int state; + private int volume; + private int recordingVolume; + private Disposable mDisposable; + private PlayHandler handler = new PlayHandler(this); + + private PlayerModel() { + playerListMusicInfos = new ArrayList<>(); + state = STATE_STOP; +// volume = CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("volume", 50); +// recordingVolume = CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("recordingVolume", 50); + volume = VolumeSetting.getMusicVolume(); + recordingVolume = VolumeSetting.getVoiceVolume(); + + mDisposable = IMNetEaseManager.get().getChatRoomEventObservable() + .subscribe(new Consumer() { + @Override + public void accept(RoomEvent roomEvent) throws Exception { + if (roomEvent == null) return; + int event = roomEvent.getEvent(); + if (event == RoomEvent.ROOM_EXIT + || event == RoomEvent.KICK_OUT_ROOM + || event == RoomEvent.ADD_BLACK_LIST) { + state = STATE_STOP; + current = null; + currentLocalId = 0; + } else if (event == RoomEvent.DOWN_MIC + || event == RoomEvent.KICK_DOWN_MIC) { + if (AvRoomDataManager.get().isOwner(roomEvent.getAccount())) + stop(); + } else if (event == RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED) { + handler.sendEmptyMessage(0); + } + } + }); + } + + public static PlayerModel get() { + return Helper.INSTANCE; + } + + @Override + public boolean isRefresh() { + return isRefresh; + } + + @Override + public int getState() { + return state; + } + + @Override + public LocalMusicBean getCurrent() { + return current; + } + + @Override + public List getPlayerListMusicInfos() { + return playerListMusicInfos; + } + + @Override + public void refreshLocalMusic(List lastScannedSongs) { + if (isRefresh) { + return; + } + + isRefresh = true; +// scanMediaTask = new AsyncTaskScanMusicFile(BasicConfig.INSTANCE.getAppContext(), 0, new AsyncTaskScanMusicFile.ScanMediaCallback() { +// @Override +// public void onProgress(int progress, String message, int total) { +// } +// +// @Override +// public void onComplete(boolean result) { +// isRefresh = false; +// if (currentLocalId > 0) { +// current = PlayerDbModel.get().requestLocalMusicInfoByLocalId(currentLocalId); +// //notifyClients(IPlayerCoreClient.class, IPlayerCoreClient.METHOD_ON_CURRENT_MUSIC_UPDATE, current); +// EventBus.getDefault().post(new CurrentMusicUpdateEvent()); +// } +// localMusicBeanList = requestLocalMusicInfos(); +// //notifyClients(IPlayerCoreClient.class, IPlayerCoreClient.METHOD_ON_REFRESH_LOCAL_MUSIC, localMusicBeanList); +// EventBus.getDefault().post(new RefreshLocalMusicEvent()); +// List playerList = requestPlayerListLocalMusicInfos(); +// playerListMusicInfos = playerList; +// //notifyClients(IPlayerCoreClient.class, IPlayerCoreClient.METHOD_ON_REFRESH_PLAYER_LIST, playerList); +// EventBus.getDefault().post(new RefreshPlayerListEvent()); +// } +// }); +// scanMediaTask.execute(BasicConfig.INSTANCE.getAppContext()); + } + + @Override + public void refreshLocalMusic() { + refreshLocalMusic(null); + } + + @Override + public void addMusicToPlayerList(LocalMusicBean localMusicInfo) { + PlayerDbModel.get().addToPlayerList(localMusicInfo.getLocalId()); +// LocalMusicDbModel.getInstance(). +// localMusicBeanList = requestLocalMusicInfos(); +// EventBus.getDefault().post(new RefreshLocalMusicEvent()); +// List playerList = requestPlayerListLocalMusicInfos(); +// playerListMusicInfos = playerList; +// EventBus.getDefault().post(new RefreshPlayerListEvent()); + } + + @Override + public void deleteMusicFromPlayerList(LocalMusicBean localMusicInfo) { + if (current != null && localMusicInfo.getLocalId() == current.getLocalId()) { + stop(); + } + PlayerDbModel.get().deleteFromPlayerList(localMusicInfo.getLocalId()); +// localMusicBeanList = requestLocalMusicInfos(); +// EventBus.getDefault().post(new RefreshLocalMusicEvent()); +// List playerList = requestPlayerListLocalMusicInfos(); +// playerListMusicInfos = playerList; +// EventBus.getDefault().post(new RefreshPlayerListEvent()); + } + + @Override + public List requestLocalMusicInfos() { + RealmResults localMusicInfos = PlayerDbModel.get().queryAllLocalMusicInfos(); + List localMusicInfoList = new ArrayList<>(); + if (localMusicInfos != null && localMusicInfos.size() > 0) { + for (int i = 0; i < localMusicInfos.size(); i++) { + LocalMusicInfo localMusicInfo = localMusicInfos.get(i); + // 过滤掉已经在播放列表里的歌曲 + if (localMusicInfo != null && !localMusicInfo.isInPlayerList()) { + localMusicInfoList.add(localMusicInfo); + } + } + } + return localMusicInfoList; + } + + @Override + public Single> requestPlayerListLocalMusicInfos() { + return LocalMusicDbModel.getInstance().queryLocalMusicBeanList(); + } + + @Override + public synchronized int play(LocalMusicBean localMusicBean) { + if (localMusicBean == null) { + localMusicBean = current; + } + if (current != null && state == STATE_PAUSE && current.getLocalUri().equals(localMusicBean.getLocalUri())) { + state = STATE_PLAY; + AudioEngineManager.get().resumeAudioMixing(); + EventBus.getDefault().post(new MusicPlayingEvent()); + return 0; + } + + if (localMusicBean == null) { + return -2; + } + + String localUri = localMusicBean.getLocalUri(); + //如果是本地文件,进行文件存在校验 + if (!TextUtils.isEmpty(localUri) && !localUri.startsWith("https://")) { + if (localUri.startsWith(LocalMusicDbModel.SCHEME_FILE)) { + // 如果已经存在协议头,则去掉 + localUri = localUri.substring(LocalMusicDbModel.SCHEME_FILE.length()); + } + File file = new File(localUri); + if (!file.exists()) { + return -1; + } + } + AudioEngineManager.get().adjustAudioMixingVolume(volume); + AudioEngineManager.get().adjustRecordingSignalVolume(recordingVolume); + int result = AudioEngineManager.get().startAudioMixing(localUri, false, 1); + if (result == -1) { + return -1; + } + current = localMusicBean; + currentLocalId = current.getLocalId(); + state = STATE_PLAY; + EventBus.getDefault().post(new MusicPlayingEvent()); + return 0; + } + + @Override + public synchronized void pause() { + if (state == STATE_PLAY) { + AudioEngineManager.get().pauseAudioMixing(); + state = STATE_PAUSE; + EventBus.getDefault().post(new MusicPauseEvent()); + } + } + + @Override + public synchronized void stop() { + if (state != STATE_STOP) { + AudioEngineManager.get().stopAudioMixing(); + state = STATE_STOP; + current = null; + currentLocalId = 0; + EventBus.getDefault().post(new MusicStopEvent()); + } + } + + @Override + public synchronized int playNext() { + if (playerListMusicInfos == null || playerListMusicInfos.isEmpty()) { + return -3; + } + if (current == null) { + if (playerListMusicInfos.size() > 0) { + return play(playerListMusicInfos.get(0)); + } else { + return -3; + } + } else { + int index = playerListMusicInfos.indexOf(current); + if (index == playerListMusicInfos.size() - 1) { + index = 0; + } else { + index += 1; + } + if (index >= playerListMusicInfos.size()) { + index = 0; + } + return play(playerListMusicInfos.get(index)); + } + } + + @Override + public void seekVolume(int volume) { + this.volume = volume; +// CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("volume", volume); + VolumeSetting.putMusicVolume(volume); + AudioEngineManager.get().adjustAudioMixingVolume(volume); + } + + /** + * 此方法是 音乐播放处的 音量调节弹窗 ,音量进度条回调那里 调用 + */ + @Override + public void seekRecordingVolume(int volume) { + this.recordingVolume = volume; +// CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("recordingVolume", volume); + if (AudioEngineManager.get().isNotRecord()){ + AudioEngineManager.get().setNotRecord(false); + } + VolumeSetting.putVoiceVolume(volume); + AudioEngineManager.get().adjustRecordingSignalVolume(volume); + } + + @Override + public void seekRecordingVolumeForTemp(int volume) { + AudioEngineManager.get().adjustRecordingSignalVolume(volume); + } + + @Override + public int getCurrentVolume() { + return volume; + } + + @Override + public int getCurrentRecordingVolume() { + return recordingVolume; + } + + @Override + public List getLocalMusicBeanList() { + if (localMusicBeanList == null) { + localMusicBeanList = new ArrayList<>(); + } + return localMusicBeanList; + } + + public void setLocalMusicBeanList(List localMusicBeanList) { + this.playerListMusicInfos = localMusicBeanList; + } + + public void addLocalMusicBeanList(List localMusicBeanList) { + this.playerListMusicInfos.addAll(localMusicBeanList); + } + + public boolean isCurrent(LocalMusicBean localMusicBean) { + if (localMusicBean == null || current == null) { + return false; + } + try { + return localMusicBean == current || localMusicBean.getLocalUri().equals(current.getLocalUri()); + } catch (Exception e) { + return false; + } + + } + + private static final class Helper { + public static final PlayerModel INSTANCE = new PlayerModel(); + } + + static class PlayHandler extends Handler { + private WeakReference mWeakReference; + + PlayHandler(PlayerModel playerCore) { + mWeakReference = new WeakReference<>(playerCore); + } + + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case 0: + PlayerModel playerCore = mWeakReference.get(); + if (playerCore != null) { + if (DemoCache.readBgmSingleCycle()) { + playerCore.play(playerCore.getCurrent()); + } else { + playerCore.playNext(); + } + } + break; + case 1: + break; + default: + } + } + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/model/ShareMusicListModel.java b/core/src/model_music/java/com/chwl/core/music/model/ShareMusicListModel.java new file mode 100644 index 0000000..0cbdb85 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/model/ShareMusicListModel.java @@ -0,0 +1,162 @@ +package com.chwl.core.music.model; + +import com.chwl.core.R; +import com.chwl.core.db.AppDataBase; +import com.chwl.core.Constants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.music.bean.ShareMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; + +import java.net.URL; +import java.net.URLConnection; +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public class ShareMusicListModel extends BaseModel implements IShareMusicListModel { + + private Api api = RxNet.create(Api.class); + + private ShareMusicListModel() { + } + + public static ShareMusicListModel getInstance() { + return SingletonHolder.INSTANCE; + } + + @Override + public Single> getShareMusicList(int page) { + return searchShareMusicList("", page); + } + + @Override + public Single> searchShareMusicList(String songName, int page) { + return api.getMusicList(songName, page, Constants.PAGE_SIZE) + .flatMap(listServiceResult -> { + if (listServiceResult != null) { + if (listServiceResult.isSuccess()) { + if (listServiceResult.getData() != null) { + return Single.just(listServiceResult.getData()); + } else { + return Single.error(new Throwable("null data")); + } + } else { + return Single.error(new Throwable(listServiceResult.getMessage())); + } + } else { + return Single.error(new Throwable("error response")); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single addMusic(long musicId) { + return api.addMusic(AuthModel.get().getCurrentUid(), musicId) + .flatMap(stringServiceResult -> { + if (stringServiceResult != null) { + if (stringServiceResult.isSuccess()) { + return Single.just(stringServiceResult.getData() != null ? + stringServiceResult.getData() : ""); + } else { + return Single.error(new Throwable(stringServiceResult.getMessage())); + } + } else { + return Single.error(new Throwable("error response")); + } + }) + .compose(RxHelper.handleSchedulers()); + } + + /** + * 把分享列表的添加到本地 + * + * @param shareMusicInfo + * @return + */ + public Single addToLocalMusic(ShareMusicInfo shareMusicInfo) { + return Single.create((SingleOnSubscribe) e -> { + if (!checkUrl(shareMusicInfo.getLocalUri())) { + e.onError(new RuntimeException(ResUtil.getString(R.string.music_model_sharemusiclistmodel_01))); + return; + } + LocalMusicBean localMusicBean = convertToLocalMusicBean(shareMusicInfo); + AppDataBase.getInstance().beginTransaction(); + List ids = AppDataBase.getInstance() + .localMusicDao() + .checkExist(localMusicBean.getSongName(), localMusicBean.getLocalUri()); + if (!ListUtils.isListEmpty(ids)) { + e.onError(new RuntimeException(ResUtil.getString(R.string.music_model_sharemusiclistmodel_02))); + AppDataBase.getInstance().endTransaction(); + return; + } + long rows = AppDataBase.getInstance() + .localMusicDao() + .insertLocalMusicBean(localMusicBean); + if (rows <= 0) { + e.onError(new RuntimeException(ResUtil.getString(R.string.music_model_sharemusiclistmodel_03))); + } else { + e.onSuccess(localMusicBean); + AppDataBase.getInstance().setTransactionSuccessful(); + } + AppDataBase.getInstance().endTransaction(); + }).compose(RxHelper.handleSchedulers()); + + } + + /** + * 检查URL是否有效 + * + * @param localUri + * @return + */ + private boolean checkUrl(String localUri) { + try { + URL url = new URL(localUri); + URLConnection urlConnection = url.openConnection(); + // urlConnection.getInputStream(); + long totalSize = urlConnection.getContentLength(); + if ("audio/mpeg".equals(urlConnection.getContentType()) && totalSize > 0) { + return true; + } + } catch (Exception e) { + } + return false; + } + + private LocalMusicBean convertToLocalMusicBean(ShareMusicInfo shareMusicInfo) { + LocalMusicBean localMusicBean = new LocalMusicBean(); + localMusicBean.setLocalUri(shareMusicInfo.getLocalUri()); + localMusicBean.setSongName(shareMusicInfo.getSongName()); + localMusicBean.setAlbumName(shareMusicInfo.getAlbum()); + localMusicBean.setArtistName(shareMusicInfo.getAuthor()); + return localMusicBean; + } + + interface Api { + @FormUrlEncoded + @POST("/api/music/list") + Single>> getMusicList(@Field("songName") String songName, + @Field("pageNum") int pageNum, + @Field("pageSize") int pageSize); + + @FormUrlEncoded + @POST("/api/music/add") + Single> addMusic(@Field("uid") long uid, + @Field("musicId") long musicId); + } + + private static class SingletonHolder { + private static final ShareMusicListModel INSTANCE = new ShareMusicListModel(); + } +} diff --git a/core/src/model_music/java/com/chwl/core/music/view/IAddLocalMusicListView.java b/core/src/model_music/java/com/chwl/core/music/view/IAddLocalMusicListView.java new file mode 100644 index 0000000..3d9873b --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/view/IAddLocalMusicListView.java @@ -0,0 +1,49 @@ +package com.chwl.core.music.view; + +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface IAddLocalMusicListView extends IMvpBaseView { + + /** + * 开始扫描时调用的动画 + */ + void startAnimation(); + + /** + * 提示信息 + * @param msg + */ + void toastMessage(String msg); + + /** + * 扫描完成,无论扫描成功与失败 + */ + void onScanningComplete(); + + /** + * 扫描到本地音乐列表 + * @param localMusicBeans + */ + void onScanningLocalMusicSuccess(List localMusicBeans); + + /** + * 扫描本地音乐列表报错 + * @param throwable + */ + void onScanningLocalMusicFail(Throwable throwable); + + /** + * 添加本地列表音乐至我的列表成功 + * @param ids + */ + void addAllSuccess(List ids); + + /** + * 添加本地列表音乐至我的列表失败 + * @param throwable + */ + void addAllFail(Throwable throwable); +} diff --git a/core/src/model_music/java/com/chwl/core/music/view/ILocalMusicListView.java b/core/src/model_music/java/com/chwl/core/music/view/ILocalMusicListView.java new file mode 100644 index 0000000..3815e2e --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/view/ILocalMusicListView.java @@ -0,0 +1,46 @@ +package com.chwl.core.music.view; + +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface ILocalMusicListView extends IMvpBaseView { + /** + * 获取列表成功 + * @param list + * @param page + */ + void onGetListSuccess(List list, int page); + + /** + * 获取列表失败 + * @param message + */ + void onGetListFail(String message); + + /** + * 删除成功 + * @param localMusicBean + * @param position + */ + void onDeleteSuccess(LocalMusicBean localMusicBean, int position); + + /** + * 删除失败的监听 + * @param message + */ + void onDeleteFail(String message); + + /** + * 获取歌曲数量 + * @param integer + */ + void onGetCountSuccess(int integer); + + /** + * 获取歌曲数量失败 + * @param message + */ + void onGetCountFail(String message); +} diff --git a/core/src/model_music/java/com/chwl/core/music/view/IMusicListView.java b/core/src/model_music/java/com/chwl/core/music/view/IMusicListView.java new file mode 100644 index 0000000..5b9d056 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/view/IMusicListView.java @@ -0,0 +1,6 @@ +package com.chwl.core.music.view; + +import com.chwl.library.base.IMvpBaseView; + +public interface IMusicListView extends IMvpBaseView { +} diff --git a/core/src/model_music/java/com/chwl/core/music/view/IShareMusicListView.java b/core/src/model_music/java/com/chwl/core/music/view/IShareMusicListView.java new file mode 100644 index 0000000..73ba4d7 --- /dev/null +++ b/core/src/model_music/java/com/chwl/core/music/view/IShareMusicListView.java @@ -0,0 +1,47 @@ +package com.chwl.core.music.view; + +import com.chwl.core.music.bean.ShareMusicInfo; +import com.chwl.core.music.db.bean.LocalMusicBean; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface IShareMusicListView extends IMvpBaseView { + + /** + * 获取数据错误时调用 + * + * @param errorMsg + */ + void onGetDataFail(String errorMsg); + + /** + * 加载数据成功时调用 + * + * @param data + */ + void onGetDataSuccess(List data, int page); + + /** + * 搜索歌曲成功的时候调用 + * + * @param data + */ + void onSearchSongSuccess(List data, int page); + + /** + * 添加成功的回调 + * + * @param shareMusicInfo + * @param localMusicBean + */ + void onAddSuccess(ShareMusicInfo shareMusicInfo, LocalMusicBean localMusicBean); + + /** + * 添加失败的回调 + * + * @param shareMusicInfo + * @param throwable + */ + void onAddFail(ShareMusicInfo shareMusicInfo, Throwable throwable); +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitFriendsAttachment.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitFriendsAttachment.java new file mode 100644 index 0000000..f176a5a --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitFriendsAttachment.java @@ -0,0 +1,35 @@ +package com.chwl.core.public_chat_hall.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.public_chat_hall.bean.AitFriendsInfo; + +public class AitFriendsAttachment extends CustomAttachment { + + private AitFriendsInfo aitFriendsInfo; + + public AitFriendsAttachment() { + super(CustomAttachment.CUSTOM_MSG_PUBLIC_CHAT_HALL, + CustomAttachment.CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT); + } + + public AitFriendsInfo getAitFriendsInfo() { + return aitFriendsInfo; + } + + public void setAitFriendsInfo(AitFriendsInfo aitFriendsInfo) { + this.aitFriendsInfo = aitFriendsInfo; + } + + @Override + protected void parseData(JSONObject data) { + aitFriendsInfo = new Gson().fromJson(data.toJSONString(), AitFriendsInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(aitFriendsInfo)); + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitMeAttachment.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitMeAttachment.java new file mode 100644 index 0000000..7caa4c0 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/attachment/AitMeAttachment.java @@ -0,0 +1,35 @@ +package com.chwl.core.public_chat_hall.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.public_chat_hall.bean.AitMeInfo; + +public class AitMeAttachment extends CustomAttachment { + + private AitMeInfo aitMeInfo; + + public AitMeAttachment() { + super(CustomAttachment.CUSTOM_MSG_PUBLIC_CHAT_HALL, + CustomAttachment.CUSTOM_MSG_SUB_PUBLIC_CHAT_HALL_AIT_ME); + } + + public AitMeInfo getAitMeInfo() { + return aitMeInfo; + } + + public void setAitMeInfo(AitMeInfo aitMeInfo) { + this.aitMeInfo = aitMeInfo; + } + + @Override + protected void parseData(JSONObject data) { + aitMeInfo = new Gson().fromJson(data.toJSONString(), AitMeInfo.class); + } + + @Override + protected JSONObject packData() { + return JSON.parseObject(JSON.toJSONString(aitMeInfo)); + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitFriendsInfo.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitFriendsInfo.java new file mode 100644 index 0000000..b594fc3 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitFriendsInfo.java @@ -0,0 +1,38 @@ +package com.chwl.core.public_chat_hall.bean; + +import java.util.List; + +import lombok.Data; + +@Data +public class AitFriendsInfo { + + /** + * 聊天室 id + */ + private String roomId; + + /** + * 聊天室消息(ChatRoomMessage) 的 ID + */ + private String messageId; + + /** + * 被 @ 人的名字数组 such as: [ResUtil.getString(R.string.public_chat_hall_bean_aitfriendsinfo_01), ResUtil.getString(R.string.public_chat_hall_bean_aitfriendsinfo_02)] 要带上 @ 符号 + */ + private List atNames; + + /** + * 被 @ 人的 uid 数组 需要跟名字对上位置 + */ + private List atUids; + + private int routerType; + + private String routerValue; + + /** + * 内容 + */ + private String content; +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitMeInfo.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitMeInfo.java new file mode 100644 index 0000000..55f31c2 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/AitMeInfo.java @@ -0,0 +1,39 @@ +package com.chwl.core.public_chat_hall.bean; + +import java.io.Serializable; + +import lombok.Data; + +@Data +public class AitMeInfo implements Serializable { + + /** + * 聊天室 id + */ + private String roomId; + + /** + * @ 人的 UID + */ + private String atUid; + + /** + * @ 人的名字 + */ + private String atName; + + /** + * 聊天室消息(ChatRoomMessage) 的 ID + */ + private String messageId; + + private int routerType; + + private String routerValue; + + /** + * 内容 + */ + private String content; + +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt new file mode 100644 index 0000000..8fbda18 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/HeadlineBean.kt @@ -0,0 +1,21 @@ +package com.chwl.core.public_chat_hall.bean + +import androidx.annotation.Keep +import java.io.Serializable + +@Keep +class HeadlineBean : Serializable { + val content: String? = null + val id: Long? = null + val uid: Long? = null + val nick: String? = null + + // 0 有效 1 过期 + val recordStatus: Int? = null + val avatar: String? = null + val payMoneyNum: Long? = null + + fun isValid(): Boolean { + return recordStatus == 0 + } +} \ No newline at end of file diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt new file mode 100644 index 0000000..1202800 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/bean/PublicChatMessageBean.kt @@ -0,0 +1,10 @@ +package com.chwl.core.public_chat_hall.bean + +import androidx.annotation.Keep + +@Keep +class PublicChatMessageBean { + val content: String? = null + val fromAvatar: String? = null + val fromNick: String? = null +} \ No newline at end of file diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallAitMeEvent.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallAitMeEvent.java new file mode 100644 index 0000000..7ac5384 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallAitMeEvent.java @@ -0,0 +1,14 @@ +package com.chwl.core.public_chat_hall.event; + +import lombok.Data; + +@Data +public class PublicChatHallAitMeEvent { + + private String nick; + + public PublicChatHallAitMeEvent setNick(String nick) { + this.nick = nick; + return this; + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallHistoryEvent.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallHistoryEvent.java new file mode 100644 index 0000000..dcb2231 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallHistoryEvent.java @@ -0,0 +1,18 @@ +package com.chwl.core.public_chat_hall.event; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; + +import java.util.List; + +import lombok.Data; + +@Data +public class PublicChatHallHistoryEvent { + + private List messages; + + public PublicChatHallHistoryEvent setMessages(List messages) { + this.messages = messages; + return this; + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgCountingDownEvent.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgCountingDownEvent.java new file mode 100644 index 0000000..707e581 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgCountingDownEvent.java @@ -0,0 +1,21 @@ +package com.chwl.core.public_chat_hall.event; + +import lombok.Data; + +@Data +public class PublicChatHallMsgCountingDownEvent { + + private long millisUntilFinished; + + private boolean isFinish; + + public PublicChatHallMsgCountingDownEvent setMillisUntilFinished(long millisUntilFinished) { + this.millisUntilFinished = millisUntilFinished; + return this; + } + + public PublicChatHallMsgCountingDownEvent setFinish(boolean finish) { + isFinish = finish; + return this; + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgIncomingEvent.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgIncomingEvent.java new file mode 100644 index 0000000..b0875a5 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallMsgIncomingEvent.java @@ -0,0 +1,15 @@ +package com.chwl.core.public_chat_hall.event; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; + +import lombok.Data; + +@Data +public class PublicChatHallMsgIncomingEvent { + private ChatRoomMessage chatRoomMessage; + + public PublicChatHallMsgIncomingEvent setChatRoomMessage(ChatRoomMessage chatRoomMessage) { + this.chatRoomMessage = chatRoomMessage; + return this; + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallPlayGiftAnimationEvent.java b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallPlayGiftAnimationEvent.java new file mode 100644 index 0000000..1151cc1 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/event/PublicChatHallPlayGiftAnimationEvent.java @@ -0,0 +1,16 @@ +package com.chwl.core.public_chat_hall.event; + +import com.chwl.core.gift.bean.GiftReceiveInfo; + +import lombok.Data; + +@Data +public class PublicChatHallPlayGiftAnimationEvent { + + private GiftReceiveInfo giftReceiveInfo; + + public PublicChatHallPlayGiftAnimationEvent setGiftReceiveInfo(GiftReceiveInfo giftReceiveInfo) { + this.giftReceiveInfo = giftReceiveInfo; + return this; + } +} diff --git a/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt new file mode 100644 index 0000000..8218bf5 --- /dev/null +++ b/core/src/model_public_chat_hall/java/com/chwl/core/public_chat_hall/model/PublicChatModel.kt @@ -0,0 +1,66 @@ +package com.chwl.core.public_chat_hall.model + +import com.chwl.core.base.BaseModel +import com.chwl.core.bean.response.ServiceResult +import com.chwl.core.public_chat_hall.bean.HeadlineBean +import com.chwl.core.public_chat_hall.bean.PublicChatMessageBean +import com.chwl.core.utils.net.launchRequest +import com.chwl.library.net.rxnet.RxNet +import retrofit2.http.Field +import retrofit2.http.FormUrlEncoded +import retrofit2.http.GET +import retrofit2.http.POST + +object PublicChatModel : BaseModel() { +// private val api = RxNet.create(PublicChatModel.Api::class.java) +// +// suspend fun getTopMessage(): List? = +// launchRequest { +//// api.getTopMessage() +// } +// +// suspend fun getCurrentHeadline(): HeadlineBean? = +// launchRequest { +// api.getCurrentHeadline() +// } +// +// suspend fun sendHeadline(message: String): Any? = +// launchRequest { +// api.sendHeadline(message) +// } +// +// suspend fun getHeadlinePayMoney(): Long? = +// launchRequest { +// api.getHeadlinePayMoney() +// } +// +// interface Api { +// +// /** +// * 获取前几条数据 +// */ +// @GET("publicChatTopRecord/getChatForTop50") +// suspend fun getTopMessage(): ServiceResult> +// +// /** +// * 获取头条 +// */ +// @GET("publicChatTopRecord/getTop") +// suspend fun getCurrentHeadline(): ServiceResult +// +// /** +// * 发送头条 +// * +// * @return +// */ +// @FormUrlEncoded +// @POST("publicChatTopRecord/send") +// suspend fun sendHeadline(@Field("content") content: String): ServiceResult +// +// /** +// * 获取头条支付金额 +// */ +// @GET("publicChatTopRecord/payMoney") +// suspend fun getHeadlinePayMoney(): ServiceResult +// } +} \ No newline at end of file diff --git a/core/src/model_smscode/java/com/chwl/core/code/CodeModel.java b/core/src/model_smscode/java/com/chwl/core/code/CodeModel.java new file mode 100644 index 0000000..fe4c26c --- /dev/null +++ b/core/src/model_smscode/java/com/chwl/core/code/CodeModel.java @@ -0,0 +1,78 @@ +package com.chwl.core.code; + +import android.text.TextUtils; + +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.codec.DESUtils; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * 哈哈app,发送验证码,统一接口,废弃以前的接口 + * create by lvzebiao on 2018/9/12 + */ +public class CodeModel extends BaseModel implements ICodeModel { + + private final Api api = RxNet.create(Api.class); + + private static final class Helper { + public static final ICodeModel INSTANCE = new CodeModel(); + } + + public static ICodeModel get() { + return Helper.INSTANCE; + } + + /** + * 发送验证码 + * @param phone + * @param type + * @return + */ + @Override + public Single sendCode(String phone, int type) { + return api.code(DESUtils.DESAndBase64(phone), AuthModel.get().getCurrentUid(), type) + .onErrorResumeNext(this.getSingleCommonExceptionFunction()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult result) throws Exception { + if (result != null && result.isSuccess()) { + return Single.just(ResUtil.getString(R.string.xchat_android_core_code_codemodel_01)); + } + String msg = ResUtil.getString(R.string.xchat_android_core_code_codemodel_02); + if (result != null && !TextUtils.isEmpty(result.getMessage())) { + msg = result.getMessage(); + } + return Single.error(new Throwable(msg)); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + private interface Api { + /** + * 发送验证码 + * @param phone phone + * @param uid uid + * @param type {@link CodeType} + * @return void + */ + @POST("sms/code") + Single> code(@Query("phone") String phone, + @Query("uid") long uid, + @Query("type") int type); + } + +} diff --git a/core/src/model_smscode/java/com/chwl/core/code/CodeType.java b/core/src/model_smscode/java/com/chwl/core/code/CodeType.java new file mode 100644 index 0000000..33a6beb --- /dev/null +++ b/core/src/model_smscode/java/com/chwl/core/code/CodeType.java @@ -0,0 +1,22 @@ +package com.chwl.core.code; + +/** + * 验证码类型 + * create by lvzebiao on 2018/9/12 + */ +public interface CodeType { + /** + * 1注册,2登录,3重设密码,4绑定手机,5绑定支付宝,6重设支付密码,7解绑手机,10超管登录, + * 11-绑定提现银行卡 13,ResUtil.getString(R.string.xchat_android_core_code_codetype_01) 14,ResUtil.getString(R.string.xchat_android_core_code_codetype_02) + */ + int REGISTER = 1; + int LOGIN = 2; + int RESET_PSW = 3; + int BIND_PHONE = 4; + int BIND_ALI = 5; + int RESET_PAY_PSW = 6; + int UNBIND_PHONE = 7; + int SUPER_ADMIN = 10; + int RESET_PSW_NOT_LOGIN = 13; + int RESET_PSW_LOGIN = 14; +} diff --git a/core/src/model_smscode/java/com/chwl/core/code/ICodeModel.java b/core/src/model_smscode/java/com/chwl/core/code/ICodeModel.java new file mode 100644 index 0000000..d0aaf43 --- /dev/null +++ b/core/src/model_smscode/java/com/chwl/core/code/ICodeModel.java @@ -0,0 +1,18 @@ +package com.chwl.core.code; + +import com.chwl.core.base.IModel; + +import io.reactivex.Single; + +/** + * create by lvzebiao on 2018/9/12 + */ +public interface ICodeModel extends IModel{ + /** + * 发送验证码 + * @param phone + * @param type + * @return + */ + Single sendCode(String phone, int type); +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGCache.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGCache.java new file mode 100644 index 0000000..7ee3f97 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGCache.java @@ -0,0 +1,231 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.decorator; + +import androidx.annotation.Keep; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Objects; + +import com.chwl.core.sud.state.SudMGPMGState; + +/** + * 游戏回调数据缓存 + * Game callback data cache. + */ +public class SudFSMMGCache { + + /** + * 记录当前队长的用户id + * Record the user ID of the current team captain. + */ + private String captainUserId; + + /** + * 全局游戏状态 + * Global game state. + */ + private SudMGPMGState.MGCommonGameState mgCommonGameStateModel; + + /** + * 是否数字炸弹 + * Is it a numeric bomb? + */ + private boolean isHitBomb = false; + + /** + * 记录已经加入了游戏的玩家 + * Record the players who have already joined the game. + */ + private final HashSet playerInSet = new HashSet<>(); + + /** + * 记录已经准备好的游戏玩家 + * Keep track of the game players who are already ready. + */ + private final HashSet playerReadySet = new HashSet<>(); + + /** + * 记录玩家的游戏状态 + * Record the game state of the player. + */ + private final HashMap playerPlayingMap = new HashMap<>(); + + /** + * 队长状态 处理 + * Captain's status handling. + */ + public void onPlayerMGCommonPlayerCaptain(String userId, SudMGPMGState.MGCommonPlayerCaptain model) { + if (model != null) { + if (model.isCaptain) { + captainUserId = userId; + } else { + if (Objects.equals(captainUserId, userId)) { + captainUserId = null; + } + } + } + } + + /** + * 游戏状态 处理 + * Game state processing. + */ + public void onGameMGCommonGameState(SudMGPMGState.MGCommonGameState model) { + mgCommonGameStateModel = model; + } + + /** + * 玩家加入状态处理 + * Player join status processing. + */ + public void onPlayerMGCommonPlayerIn(String userId, SudMGPMGState.MGCommonPlayerIn model) { + if (model != null) { + if (model.isIn) { + playerInSet.add(userId); + } else { + playerInSet.remove(userId); + playerReadySet.remove(userId); + } + } + } + + /** + * 玩家准备状态 + * Player readiness status. + */ + public void onPlayerMGCommonPlayerReady(String userId, SudMGPMGState.MGCommonPlayerReady model) { + if (model != null) { + if (model.isReady) { + playerReadySet.add(userId); + } else { + playerReadySet.remove(userId); + } + } + } + + /** + * 玩家游戏状态 + * Player game status. + */ + public void onPlayerMGCommonPlayerPlaying(String userId, SudMGPMGState.MGCommonPlayerPlaying model) { + if (model != null) { + playerPlayingMap.put(userId, model); + } + } + + /** + * 关键词状态 + * Keyword status. + */ + public void onGameMGCommonKeyWordToHit(SudMGPMGState.MGCommonKeyWordToHit model) { + if (model != null) { + isHitBomb = model.wordType.equals("number"); + } + } + + /** + * 返回该玩家是否正在游戏中 + * Return whether the player is currently in-game. + */ + public boolean playerIsPlaying(String userId) { + SudMGPMGState.MGCommonPlayerPlaying mgCommonPlayerPlaying = playerPlayingMap.get(userId); + if (mgCommonPlayerPlaying != null) { + return mgCommonPlayerPlaying.isPlaying; + } + return false; + } + + /** + * 返回该玩家是否已准备 + * Return whether the player is ready. + */ + public boolean playerIsReady(String userId) { + return playerReadySet.contains(userId); + } + + /** + * 返回该玩家是否已加入了游戏 + * Return whether the player has joined the game. + */ + public boolean playerIsIn(String userId) { + return playerInSet.contains(userId); + } + + /** + * 获取当前游戏中的人数 + * Retrieve the current number of players in the game. + */ + public int getPlayerInNumber() { + return playerInSet.size(); + } + + /** + * 是否数字炸弹 + * Is it a numeric bomb? + */ + public boolean isHitBomb() { + return isHitBomb; + } + + /** + * 销毁游戏 + * Destroy the game. + */ + public void destroyMG() { + captainUserId = null; + mgCommonGameStateModel = null; + isHitBomb = false; + playerInSet.clear(); + playerReadySet.clear(); + playerPlayingMap.clear(); + } + + /** + * 获取队长userId + * Get the captain's user ID. + */ + public String getCaptainUserId() { + return captainUserId; + } + + /** + * 获取当前已加入游戏的玩家集合 + * Retrieve the current set of players who have joined the game. + */ + public HashSet getPlayerInSet() { + return new HashSet<>(playerInSet); + } + + /** + * 获取当前已准备的玩家集合 + * Retrieve the current set of players who are ready. + */ + public HashSet getPlayerReadySet() { + return new HashSet<>(playerReadySet); + } + + /** + * 获取玩家游戏状态集合 + * Retrieve the set of player game states. + */ + public HashMap getPlayerPlayingMap() { + return new HashMap<>(playerPlayingMap); + } + + /** + * 返回当前游戏的状态,数值参数{@link SudMGPMGState.MGCommonGameState} + * Return the current game state, numerical parameter {@link SudMGPMGState.MGCommonGameState}. + */ + public int getGameState() { + if (mgCommonGameStateModel != null) { + return mgCommonGameStateModel.gameState; + } + return SudMGPMGState.MGCommonGameState.UNKNOW; + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGDecorator.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGDecorator.java new file mode 100644 index 0000000..b3e6bca --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGDecorator.java @@ -0,0 +1,1126 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.decorator; + +import androidx.annotation.Keep; + +import com.chwl.core.sud.state.SudMGPMGState; +import com.chwl.core.sud.utils.ISudFSMStateHandleUtils; +import com.chwl.core.sud.utils.SudJsonUtils; +import tech.sud.mgp.core.ISudFSMMG; +import tech.sud.mgp.core.ISudFSMStateHandle; + +/** + * ISudFSMMG 游戏调APP回调装饰类 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG.html + */ +public class SudFSMMGDecorator implements ISudFSMMG { + + // 回调 + private SudFSMMGListener sudFSMMGListener; + + // 数据状态封装 + private final SudFSMMGCache sudFSMMGCache = new SudFSMMGCache(); + + /** + * 设置回调 + * + * @param listener 监听器 + */ + public void setSudFSMMGListener(SudFSMMGListener listener) { + sudFSMMGListener = listener; + } + + /** + * 游戏日志 + * 最低版本:v1.1.30.xx + */ + @Override + public void onGameLog(String dataJson) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onGameLog(dataJson); + } + } + + /** + * 游戏加载进度 + * + * @param stage 阶段:start=1,loading=2,end=3 + * @param retCode 错误码:0成功 + * @param progress 进度:[0, 100] + */ + @Override + public void onGameLoadingProgress(int stage, int retCode, int progress) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onGameLoadingProgress(stage, retCode, progress); + } + } + + /** + * 游戏开始 + * 最低版本:v1.1.30.xx + */ + @Override + public void onGameStarted() { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onGameStarted(); + } + } + + /** + * 游戏销毁 + * 最低版本:v1.1.30.xx + */ + @Override + public void onGameDestroyed() { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onGameDestroyed(); + } + } + + /** + * Code过期,需要实现 + * APP接入方需要调用handle.success或handle.fail + * + * @param dataJson {"code":"value"} + */ + @Override + public void onExpireCode(ISudFSMStateHandle handle, String dataJson) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onExpireCode(handle, dataJson); + } + } + + /** + * 获取游戏View信息,需要实现 + * APP接入方需要调用handle.success或handle.fail + * + * @param handle 操作 + * @param dataJson {} + */ + @Override + public void onGetGameViewInfo(ISudFSMStateHandle handle, String dataJson) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onGetGameViewInfo(handle, dataJson); + } + } + + /** + * 获取游戏Config,需要实现 + * APP接入方需要调用handle.success或handle.fail + * + * @param handle 操作 + * @param dataJson {} + * 最低版本:v1.1.30.xx + */ + @Override + public void onGetGameCfg(ISudFSMStateHandle handle, String dataJson) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null) { + listener.onGetGameCfg(handle, dataJson); + } + } + + /** + * 游戏状态变化 + * APP接入方需要调用handle.success或handle.fail + * + * @param handle 操作 + * @param state 状态命令 + * @param dataJson 状态值 + */ + @Override + public void onGameStateChange(ISudFSMStateHandle handle, String state, String dataJson) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null && listener.onGameStateChange(handle, state, dataJson)) { + return; + } + switch (state) { + case SudMGPMGState.MG_COMMON_PUBLIC_MESSAGE: // 1. 公屏消息 + SudMGPMGState.MGCommonPublicMessage mgCommonPublicMessage = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPublicMessage.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonPublicMessage(handle, mgCommonPublicMessage); + } + break; + case SudMGPMGState.MG_COMMON_KEY_WORD_TO_HIT: // 2. 关键词状态 + SudMGPMGState.MGCommonKeyWordToHit mgCommonKeyWordToHit = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonKeyWordToHit.class); + sudFSMMGCache.onGameMGCommonKeyWordToHit(mgCommonKeyWordToHit); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonKeyWordToHit(handle, mgCommonKeyWordToHit); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SETTLE: // 3. 游戏结算状态 + SudMGPMGState.MGCommonGameSettle mgCommonGameSettle = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSettle.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSettle(handle, mgCommonGameSettle); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_JOIN_BTN: // 4. 加入游戏按钮点击状态 + SudMGPMGState.MGCommonSelfClickJoinBtn mgCommonSelfClickJoinBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickJoinBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickJoinBtn(handle, mgCommonSelfClickJoinBtn); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_CANCEL_JOIN_BTN: // 5. 取消加入(退出)游戏按钮点击状态 + SudMGPMGState.MGCommonSelfClickCancelJoinBtn selfClickCancelJoinBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickCancelJoinBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickCancelJoinBtn(handle, selfClickCancelJoinBtn); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_READY_BTN: // 6. 准备按钮点击状态 + SudMGPMGState.MGCommonSelfClickReadyBtn mgCommonSelfClickReadyBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickReadyBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickReadyBtn(handle, mgCommonSelfClickReadyBtn); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_CANCEL_READY_BTN: // 7. 取消准备按钮点击状态 + SudMGPMGState.MGCommonSelfClickCancelReadyBtn mgCommonSelfClickCancelReadyBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickCancelReadyBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickCancelReadyBtn(handle, mgCommonSelfClickCancelReadyBtn); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_START_BTN: // 8. 开始游戏按钮点击状态 + SudMGPMGState.MGCommonSelfClickStartBtn mgCommonSelfClickStartBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickStartBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickStartBtn(handle, mgCommonSelfClickStartBtn); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_SHARE_BTN: // 9. 分享按钮点击状态 + SudMGPMGState.MGCommonSelfClickShareBtn mgCommonSelfClickShareBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickShareBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickShareBtn(handle, mgCommonSelfClickShareBtn); + } + break; + case SudMGPMGState.MG_COMMON_GAME_STATE: // 10. 游戏状态 + SudMGPMGState.MGCommonGameState mgCommonGameState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameState.class); + sudFSMMGCache.onGameMGCommonGameState(mgCommonGameState); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameState(handle, mgCommonGameState); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_SETTLE_CLOSE_BTN: // 11. 结算界面关闭按钮点击状态(2021-12-27新增) + SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn mgCommonSelfClickGameSettleCloseBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickGameSettleCloseBtn(handle, mgCommonSelfClickGameSettleCloseBtn); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_SETTLE_AGAIN_BTN: // 12. 结算界面再来一局按钮点击状态(2021-12-27新增) + SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn mgCommonSelfClickGameSettleAgainBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickGameSettleAgainBtn(handle, mgCommonSelfClickGameSettleAgainBtn); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SOUND_LIST: // 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强) + SudMGPMGState.MGCommonGameSoundList mgCommonGameSoundList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSoundList.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSoundList(handle, mgCommonGameSoundList); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SOUND: // 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强) + SudMGPMGState.MGCommonGameSound mgCommonGameSound = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSound.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSound(handle, mgCommonGameSound); + } + break; + case SudMGPMGState.MG_COMMON_GAME_BG_MUSIC_STATE: // 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强) + SudMGPMGState.MGCommonGameBgMusicState mgCommonGameBgMusicState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameBgMusicState.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameBgMusicState(handle, mgCommonGameBgMusicState); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SOUND_STATE: // 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强) + SudMGPMGState.MGCommonGameSoundState mgCommonGameSoundState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSoundState.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSoundState(handle, mgCommonGameSoundState); + } + break; + case SudMGPMGState.MG_COMMON_GAME_ASR: // 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增) + SudMGPMGState.MGCommonGameASR mgCommonGameASR = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameASR.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameASR(handle, mgCommonGameASR); + } + break; + case SudMGPMGState.MG_COMMON_SELF_MICROPHONE: // 18. 麦克风状态(2022-02-08新增) + SudMGPMGState.MGCommonSelfMicrophone mgCommonSelfMicrophone = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfMicrophone.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfMicrophone(handle, mgCommonSelfMicrophone); + } + break; + case SudMGPMGState.MG_COMMON_SELF_HEADPHONE: // 19. 耳机(听筒,扬声器)状态(2022-02-08新增) + SudMGPMGState.MGCommonSelfHeadphone mgCommonSelfHeadphone = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfHeadphone.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfHeadphone(handle, mgCommonSelfHeadphone); + } + break; + case SudMGPMGState.MG_COMMON_APP_COMMON_SELF_X_RESP: // 20. App通用状态操作结果错误码(2022-05-10新增) + SudMGPMGState.MGCommonAPPCommonSelfXResp mgCommonAPPCommonSelfXResp = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonAPPCommonSelfXResp.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonAPPCommonSelfXResp(handle, mgCommonAPPCommonSelfXResp); + } + break; + case SudMGPMGState.MG_COMMON_GAME_ADD_AI_PLAYERS: // 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增) + SudMGPMGState.MGCommonGameAddAIPlayers mgCommonGameAddAIPlayers = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameAddAIPlayers.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameAddAIPlayers(handle, mgCommonGameAddAIPlayers); + } + break; + case SudMGPMGState.MG_COMMON_GAME_NETWORK_STATE: // 22. 游戏通知app层添当前网络连接状态(2022-06-21新增) + SudMGPMGState.MGCommonGameNetworkState mgCommonGameNetworkState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameNetworkState.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameNetworkState(handle, mgCommonGameNetworkState); + } + break; + case SudMGPMGState.MG_COMMON_GAME_GET_SCORE: // 23. 游戏通知app获取积分 + SudMGPMGState.MGCommonGameGetScore mgCommonGameScore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameGetScore.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameGetScore(handle, mgCommonGameScore); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SET_SCORE: // 24. 游戏通知app带入积分 + SudMGPMGState.MGCommonGameSetScore mgCommonGameSetScore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSetScore.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSetScore(handle, mgCommonGameSetScore); + } + break; + case SudMGPMGState.MG_COMMON_GAME_CREATE_ORDER: // 25. 创建订单 + SudMGPMGState.MGCommonGameCreateOrder mgCommonGameCreateOrder = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameCreateOrder.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameCreateOrder(handle, mgCommonGameCreateOrder); + } + break; + case SudMGPMGState.MG_COMMON_PLAYER_ROLE_ID: // 26. 游戏通知app玩家角色(仅对狼人杀有效) + SudMGPMGState.MGCommonPlayerRoleId mgCommonPlayerRoleId = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerRoleId.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonPlayerRoleId(handle, mgCommonPlayerRoleId); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_POOP: // 27. 游戏通知app玩家被扔便便(你画我猜,你说我猜,友尽闯关有效) + SudMGPMGState.MGCommonSelfClickPoop mgCommonSelfClickPoop = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickPoop.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickPoop(handle, mgCommonSelfClickPoop); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_GOOD: // 28. 游戏通知app玩家被点赞(你画我猜,你说我猜,友尽闯关有效) + SudMGPMGState.MGCommonSelfClickGood mgCommonSelfClickGood = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGood.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickGood(handle, mgCommonSelfClickGood); + } + break; + case SudMGPMGState.MG_COMMON_GAME_FPS: // 29. 游戏通知app游戏FPS(仅对碰碰,多米诺骨牌,飞镖达人生效) + SudMGPMGState.MGCommonGameFps mgCommonGameFps = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameFps.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameFps(handle, mgCommonGameFps); + } + break; + case SudMGPMGState.MG_COMMON_ALERT: // 30. 游戏通知app游戏弹框 + SudMGPMGState.MGCommonAlert mgCommonAlert = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonAlert.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonAlert(handle, mgCommonAlert); + } + break; + case SudMGPMGState.MG_COMMON_WORST_TEAMMATE: // 31. 游戏通知app最坑队友(只支持友尽闯关) + SudMGPMGState.MGCommonWorstTeammate mgCommonWorstTeammate = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonWorstTeammate.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonWorstTeammate(handle, mgCommonWorstTeammate); + } + break; + case SudMGPMGState.MG_COMMON_GAME_OVER_TIP: // 32. 游戏通知app因玩家逃跑导致游戏结束(只支持友尽闯关) + SudMGPMGState.MGCommonGameOverTip mgCommonGameOverTip = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameOverTip.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameOverTip(handle, mgCommonGameOverTip); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_COLOR: // 33. 游戏通知app玩家颜色(只支持友尽闯关) + SudMGPMGState.MGCommonGamePlayerColor mgCommonGamePlayerColor = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerColor.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerColor(handle, mgCommonGamePlayerColor); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_ICON_POSITION: // 34. 游戏通知app玩家头像的坐标(只支持ludo) + SudMGPMGState.MGCommonGamePlayerIconPosition mgCommonGamePlayerIconPosition = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerIconPosition.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerIconPosition(handle, mgCommonGamePlayerIconPosition); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_EXIT_GAME_BTN: // 35. 游戏通知app退出游戏(只支持teenpattipro 与 德州pro) + SudMGPMGState.MGCommonSelfClickExitGameBtn mgCommonSelfClickExitGameBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickExitGameBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickExitGameBtn(handle, mgCommonSelfClickExitGameBtn); + } + break; + case SudMGPMGState.MG_COMMON_GAME_IS_APP_CHIP: // 36. 游戏通知app是否要开启带入积分(只支持teenpattipro 与 德州pro) + SudMGPMGState.MGCommonGameIsAppChip mgCommonGameIsAppChip = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameIsAppChip.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameIsAppChip(handle, mgCommonGameIsAppChip); + } + break; + case SudMGPMGState.MG_COMMON_GAME_RULE: // 37. 游戏通知app当前游戏的设置信息(只支持德州pro,teenpatti pro) + SudMGPMGState.MGCommonGameRule mgCommonGameRule = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameRule.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameRule(handle, mgCommonGameRule); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SETTINGS: // 38. 游戏通知app进行玩法设置(只支持德州pro,teenpatti pro) + SudMGPMGState.MGCommonGameSettings mgCommonGameSettings = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSettings.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSettings(handle, mgCommonGameSettings); + } + break; + case SudMGPMGState.MG_COMMON_GAME_MONEY_NOT_ENOUGH: // 39. 游戏通知app钱币不足(只支持德州pro,teenpatti pro) + SudMGPMGState.MGCommonGameMoneyNotEnough mgCommonGameMoneyNotEnough = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameMoneyNotEnough.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameMoneyNotEnough(handle, mgCommonGameMoneyNotEnough); + } + break; + case SudMGPMGState.MG_COMMON_GAME_UI_CUSTOM_CONFIG: // 40. 游戏通知app下发定制ui配置表(只支持ludo) + SudMGPMGState.MGCommonGameUiCustomConfig mgCommonGameUiCustomConfig = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameUiCustomConfig.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameUiCustomConfig(handle, mgCommonGameUiCustomConfig); + } + break; + case SudMGPMGState.MG_COMMON_SET_CLICK_RECT: // 41. 设置app提供给游戏可点击区域(赛车) + SudMGPMGState.MGCommonSetClickRect mgCommonSetClickRect = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSetClickRect.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSetClickRect(handle, mgCommonSetClickRect); + } + break; + case SudMGPMGState.MG_COMMON_USERS_INFO: // 42. 通知app提供对应uids列表玩家的数据(赛车) + SudMGPMGState.MGCommonUsersInfo mgCommonUsersInfo = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonUsersInfo.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonUsersInfo(handle, mgCommonUsersInfo); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PREPARE_FINISH: // 43. 通知app游戏前期准备完成(赛车) + SudMGPMGState.MGCommonGamePrepareFinish mgCommonGamePrepareFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePrepareFinish.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePrepareFinish(handle, mgCommonGamePrepareFinish); + } + break; + case SudMGPMGState.MG_COMMON_SHOW_GAME_SCENE: // 44. 通知app游戏主界面已显示(赛车) + SudMGPMGState.MGCommonShowGameScene mgCommonShowGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonShowGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonShowGameScene(handle, mgCommonShowGameScene); + } + break; + case SudMGPMGState.MG_COMMON_HIDE_GAME_SCENE: // 45. 通知app游戏主界面已隐藏(赛车) + SudMGPMGState.MGCommonHideGameScene mgCommonHideGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonHideGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonHideGameScene(handle, mgCommonHideGameScene); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_GOLD_BTN: // 46. 通知app点击了游戏的金币按钮(赛车) + SudMGPMGState.MGCommonSelfClickGoldBtn mgCommonSelfClickGoldBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGoldBtn.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonSelfClickGoldBtn(handle, mgCommonSelfClickGoldBtn); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PIECE_ARRIVE_END: // 47. 通知app棋子到达终点(ludo) + SudMGPMGState.MGCommonGamePieceArriveEnd mgCommonGamePieceArriveEnd = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePieceArriveEnd.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePieceArriveEnd(handle, mgCommonGamePieceArriveEnd); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_MANAGED_STATE: // 48. 通知app玩家是否托管 + SudMGPMGState.MGCommonGamePlayerManagedState mgCommonGamePlayerManagedState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerManagedState.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerManagedState(handle, mgCommonGamePlayerManagedState); + } + break; + case SudMGPMGState.MG_COMMON_GAME_SEND_BURST_WORD: // 49. 游戏向app发送爆词 + SudMGPMGState.MGCommonGameSendBurstWord mgCommonGameSendBurstWord = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSendBurstWord.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameSendBurstWord(handle, mgCommonGameSendBurstWord); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_RANKS: // 50. 游戏向app发送玩家实时排名(只支持怪物消消乐) + SudMGPMGState.MGCommonGamePlayerRanks mgCommonGamePlayerRanks = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerRanks.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerRanks(handle, mgCommonGamePlayerRanks); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_PAIR_SINGULAR: // 51. 游戏向app发送玩家即时变化的单双牌(只支持okey101) + SudMGPMGState.MGCommonGamePlayerPairSingular mgCommonGamePlayerPairSingular = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerPairSingular.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerPairSingular(handle, mgCommonGamePlayerPairSingular); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_MONOPOLY_CARDS: // 52. 游戏向app发送获取玩家持有的道具卡(只支持大富翁) + SudMGPMGState.MGCommonGamePlayerMonopolyCards mgCommonGamePlayerMonopolyCards = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerMonopolyCards.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerMonopolyCards(handle, mgCommonGamePlayerMonopolyCards); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_SCORES: // 53. 游戏向app发送玩家实时积分(只支持怪物消消乐) + SudMGPMGState.MGCommonGamePlayerScores mgCommonGamePlayerScores = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerScores.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerScores(handle, mgCommonGamePlayerScores); + } + break; + case SudMGPMGState.MG_COMMON_DESTROY_GAME_SCENE: // 54. 游戏通知app销毁游戏(只支持部分概率类游戏) + SudMGPMGState.MGCommonDestroyGameScene mgCommonDestroyGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonDestroyGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonDestroyGameScene(handle, mgCommonDestroyGameScene); + } + break; + case SudMGPMGState.MG_COMMON_GAME_BILLIARDS_HIT_STATE: // 55. 游戏通知app击球状态(只支持桌球) + SudMGPMGState.MGCommonGameBilliardsHitState mgCommonGameBilliardsHitState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameBilliardsHitState.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameBilliardsHitState(handle, mgCommonGameBilliardsHitState); + } + break; + case SudMGPMGState.MG_COMMON_GAME_PLAYER_PROPS_CARDS: // 56. 游戏向app发送获取玩家持有的指定点数道具卡(只支持飞行棋) + SudMGPMGState.MGCommonGamePlayerPropsCards mgCommonGamePlayerPropsCards = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGamePlayerPropsCards.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGamePlayerPropsCards(handle, mgCommonGamePlayerPropsCards); + } + break; + case SudMGPMGState.MG_COMMON_GAME_DISCO_ACTION: // 1. 元宇宙砂砂舞指令回调 + SudMGPMGState.MGCommonGameDiscoAction mgCommonGameDiscoAction = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameDiscoAction.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameDiscoAction(handle, mgCommonGameDiscoAction); + } + break; + case SudMGPMGState.MG_COMMON_GAME_DISCO_ACTION_END: // 2. 元宇宙砂砂舞指令动作结束通知 + SudMGPMGState.MGCommonGameDiscoActionEnd mgCommonGameDiscoActionEnd = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameDiscoActionEnd.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCommonGameDiscoActionEnd(handle, mgCommonGameDiscoActionEnd); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_CONFIG: // 1. 礼物配置文件(火箭) + SudMGPMGState.MGCustomRocketConfig mgCustomRocketConfig = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketConfig.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketConfig(handle, mgCustomRocketConfig); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_MODEL_LIST: // 2. 拥有模型列表(火箭) + SudMGPMGState.MGCustomRocketModelList mgCustomRocketModelList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketModelList.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketModelList(handle, mgCustomRocketModelList); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_COMPONENT_LIST: // 3. 拥有组件列表(火箭) + SudMGPMGState.MGCustomRocketComponentList mgCustomRocketComponentList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketComponentList.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketComponentList(handle, mgCustomRocketComponentList); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_USER_INFO: // 4. 获取用户信息(火箭) + SudMGPMGState.MGCustomRocketUserInfo mgCustomRocketUserInfo = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketUserInfo.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketUserInfo(handle, mgCustomRocketUserInfo); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_ORDER_RECORD_LIST: // 5. 订单记录列表(火箭) + SudMGPMGState.MGCustomRocketOrderRecordList mgCustomRocketOrderRecordList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketOrderRecordList.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketOrderRecordList(handle, mgCustomRocketOrderRecordList); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_ROOM_RECORD_LIST: // 6. 展馆内列表(火箭) + SudMGPMGState.MGCustomRocketRoomRecordList mgCustomRocketRoomRecordList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketRoomRecordList.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketRoomRecordList(handle, mgCustomRocketRoomRecordList); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_USER_RECORD_LIST: // 7. 展馆内玩家送出记录(火箭) + SudMGPMGState.MGCustomRocketUserRecordList mgCustomRocketUserRecordList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketUserRecordList.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketUserRecordList(handle, mgCustomRocketUserRecordList); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_SET_DEFAULT_MODEL: // 8. 设置默认模型(火箭) + SudMGPMGState.MGCustomRocketSetDefaultModel mgCustomRocketSetDefaultSeat = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketSetDefaultModel.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketSetDefaultModel(handle, mgCustomRocketSetDefaultSeat); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_DYNAMIC_FIRE_PRICE: // 9. 动态计算一键发送价格(火箭) + SudMGPMGState.MGCustomRocketDynamicFirePrice mgCustomRocketDynamicFirePrice = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketDynamicFirePrice.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketDynamicFirePrice(handle, mgCustomRocketDynamicFirePrice); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_FIRE_MODEL: // 10. 一键发送(火箭) + SudMGPMGState.MGCustomRocketFireModel mGCustomRocketFireModel = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketFireModel.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketFireModel(handle, mGCustomRocketFireModel); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_CREATE_MODEL: // 11. 新组装模型(火箭) + SudMGPMGState.MGCustomRocketCreateModel mgCustomRocketCreateModel = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketCreateModel.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketCreateModel(handle, mgCustomRocketCreateModel); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_REPLACE_COMPONENT: // 12. 模型更换组件(火箭) + SudMGPMGState.MGCustomRocketReplaceComponent mgCustomRocketReplaceComponent = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketReplaceComponent.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketReplaceComponent(handle, mgCustomRocketReplaceComponent); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_BUY_COMPONENT: // 13. 购买组件(火箭) + SudMGPMGState.MGCustomRocketBuyComponent mgCustomRocketBuyComponent = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketBuyComponent.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketBuyComponent(handle, mgCustomRocketBuyComponent); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_PLAY_EFFECT_START: // 14. 播放效果开始(火箭) + SudMGPMGState.MGCustomRocketPlayEffectStart mgCustomRocketPlayEffectStart = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketPlayEffectStart.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketPlayEffectStart(handle, mgCustomRocketPlayEffectStart); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_PLAY_EFFECT_FINISH: // 15. 播放效果完成(火箭) + SudMGPMGState.MGCustomRocketPlayEffectFinish mgCustomRocketPlayEffectFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketPlayEffectFinish.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketPlayEffectFinish(handle, mgCustomRocketPlayEffectFinish); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_VERIFY_SIGN: // 16. 验证签名合规(火箭) + SudMGPMGState.MGCustomRocketVerifySign mgCustomRocketVerifySign = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketVerifySign.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketVerifySign(handle, mgCustomRocketVerifySign); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_UPLOAD_MODEL_ICON: // 17. 上传icon(火箭) + SudMGPMGState.MGCustomRocketUploadModelIcon mgCustomRocketUploadModelIcon = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketUploadModelIcon.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketUploadModelIcon(handle, mgCustomRocketUploadModelIcon); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_PREPARE_FINISH: // 18. 前期准备完成(火箭) + SudMGPMGState.MGCustomRocketPrepareFinish mgCustomRocketPrepareFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketPrepareFinish.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketPrepareFinish(handle, mgCustomRocketPrepareFinish); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_SHOW_GAME_SCENE: // 19. 火箭主界面已显示(火箭) + SudMGPMGState.MGCustomRocketShowGameScene mgCustomRocketShowGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketShowGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketShowGameScene(handle, mgCustomRocketShowGameScene); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_HIDE_GAME_SCENE: // 20. 火箭主界面已隐藏(火箭) + SudMGPMGState.MGCustomRocketHideGameScene mgCustomRocketHideGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketHideGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketHideGameScene(handle, mgCustomRocketHideGameScene); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_CLICK_LOCK_COMPONENT: // 21. 点击锁住组件(火箭) + SudMGPMGState.MGCustomRocketClickLockComponent mgCustomRocketClickLockComponent = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketClickLockComponent.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketClickLockComponent(handle, mgCustomRocketClickLockComponent); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_FLY_CLICK: // 22. 火箭效果飞行点击(火箭) + SudMGPMGState.MGCustomRocketFlyClick mgCustomRocketFlyClick = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketFlyClick.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketFlyClick(handle, mgCustomRocketFlyClick); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_FLY_END: // 23. 火箭效果飞行结束(火箭) + SudMGPMGState.MGCustomRocketFlyEnd mgCustomRocketFlyEnd = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketFlyEnd.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketFlyEnd(handle, mgCustomRocketFlyEnd); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_SET_CLICK_RECT: // 24. 设置点击区域(火箭) + SudMGPMGState.MGCustomRocketSetClickRect mgCustomRocketSetClickRect = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketSetClickRect.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketSetClickRect(handle, mgCustomRocketSetClickRect); + } + break; + case SudMGPMGState.MG_CUSTOM_ROCKET_SAVE_SIGN_COLOR: // 25. 颜色和签名自定义改到装配间的模式,保存颜色或签名 模型 + SudMGPMGState.MGCustomRocketSaveSignColor mgCustomRocketSaveSignColor = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketSaveSignColor.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomRocketSaveSignColor(handle, mgCustomRocketSaveSignColor); + } + break; + case SudMGPMGState.MG_BASEBALL_DEFUALT_STATE: // 1. 设置界面默认状态(棒球) + SudMGPMGState.MGBaseballDefaultState mgBaseballDefaultState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballDefaultState.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballDefaultState(handle, mgBaseballDefaultState); + } + break; + case SudMGPMGState.MG_BASEBALL_PREPARE_FINISH: // 2. 前期准备完成(棒球) + SudMGPMGState.MGBaseballPrepareFinish mgBaseballPrepareFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballPrepareFinish.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballPrepareFinish(handle, mgBaseballPrepareFinish); + } + break; + case SudMGPMGState.MG_BASEBALL_SHOW_GAME_SCENE: // 3. 主界面已显示(棒球) + SudMGPMGState.MGBaseballShowGameScene mgBaseballShowGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballShowGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballShowGameScene(handle, mgBaseballShowGameScene); + } + break; + case SudMGPMGState.MG_BASEBALL_HIDE_GAME_SCENE: // 4. 主界面已隐藏(棒球) + SudMGPMGState.MGBaseballHideGameScene mgBaseballHideGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballHideGameScene.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballHideGameScene(handle, mgBaseballHideGameScene); + } + break; + case SudMGPMGState.MG_BASEBALL_RANKING: // 5. 查询排行榜数据(棒球) + SudMGPMGState.MGBaseballRanking mgBaseballRanking = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballRanking.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballRanking(handle, mgBaseballRanking); + } + break; + case SudMGPMGState.MG_BASEBALL_MY_RANKING: // 6. 查询我的排名(棒球) + SudMGPMGState.MGBaseballMyRanking mgBaseballMyRanking = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballMyRanking.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballMyRanking(handle, mgBaseballMyRanking); + } + break; + case SudMGPMGState.MG_BASEBALL_RANGE_INFO: // 7. 查询当前距离我的前后玩家数据(棒球) + SudMGPMGState.MGBaseballRangeInfo mgBaseballRangeInfo = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballRangeInfo.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballRangeInfo(handle, mgBaseballRangeInfo); + } + break; + case SudMGPMGState.MG_BASEBALL_SET_CLICK_RECT: // 8. 设置app提供给游戏可点击区域(棒球) + SudMGPMGState.MGBaseballSetClickRect mgBaseballSetClickRect = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballSetClickRect.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballSetClickRect(handle, mgBaseballSetClickRect); + } + break; + case SudMGPMGState.MG_BASEBALL_TEXT_CONFIG: // 9. 获取文本配置数据(棒球) + SudMGPMGState.MGBaseballTextConfig mgBaseballTextConfig = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballTextConfig.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballTextConfig(handle, mgBaseballTextConfig); + } + break; + case SudMGPMGState.MG_BASEBALL_SEND_DISTANCE: // 10. 球落地, 通知距离(棒球) + SudMGPMGState.MGBaseballSendDistance mgBaseballSendDistance = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballSendDistance.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGBaseballSendDistance(handle, mgBaseballSendDistance); + } + break; + case SudMGPMGState.MG_CUSTOM_CR_ROOM_INIT_DATA: // 1. 请求房间数据 + SudMGPMGState.MGCustomCrRoomInitData mgCustomCrRoomInitData = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomCrRoomInitData.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomCrRoomInitData(handle, mgCustomCrRoomInitData); + } + break; + case SudMGPMGState.MG_CUSTOM_CR_CLICK_SEAT: // 2. 点击主播位或老板位通知 + SudMGPMGState.MGCustomCrClickSeat mgCustomCrClickSeat = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomCrClickSeat.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onGameMGCustomCrClickSeat(handle, mgCustomCrClickSeat); + } + break; + default: + ISudFSMStateHandleUtils.handleSuccess(handle); + break; + } + } + + /** + * 游戏玩家状态变化 + * APP接入方需要调用handle.success或handle.fail + * + * @param handle 操作 + * @param userId 用户id + * @param state 状态命令 + * @param dataJson 状态值 + */ + @Override + public void onPlayerStateChange(ISudFSMStateHandle handle, String userId, String state, String dataJson) { + SudFSMMGListener listener = sudFSMMGListener; + if (listener != null && listener.onPlayerStateChange(handle, userId, state, dataJson)) { + return; + } + switch (state) { + case SudMGPMGState.MG_COMMON_PLAYER_IN: // 1.加入状态(已修改) + SudMGPMGState.MGCommonPlayerIn mgCommonPlayerIn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerIn.class); + sudFSMMGCache.onPlayerMGCommonPlayerIn(userId, mgCommonPlayerIn); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonPlayerIn(handle, userId, mgCommonPlayerIn); + } + break; + case SudMGPMGState.MG_COMMON_PLAYER_READY: // 2.准备状态(已修改) + SudMGPMGState.MGCommonPlayerReady mgCommonPlayerReady = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerReady.class); + sudFSMMGCache.onPlayerMGCommonPlayerReady(userId, mgCommonPlayerReady); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonPlayerReady(handle, userId, mgCommonPlayerReady); + } + break; + case SudMGPMGState.MG_COMMON_PLAYER_CAPTAIN: // 3.队长状态(已修改) + SudMGPMGState.MGCommonPlayerCaptain mgCommonPlayerCaptain = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerCaptain.class); + sudFSMMGCache.onPlayerMGCommonPlayerCaptain(userId, mgCommonPlayerCaptain); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonPlayerCaptain(handle, userId, mgCommonPlayerCaptain); + } + break; + case SudMGPMGState.MG_COMMON_PLAYER_PLAYING: // 4.游戏状态(已修改) + SudMGPMGState.MGCommonPlayerPlaying mgCommonPlayerPlaying = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerPlaying.class); + sudFSMMGCache.onPlayerMGCommonPlayerPlaying(userId, mgCommonPlayerPlaying); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonPlayerPlaying(handle, userId, mgCommonPlayerPlaying); + } + break; + case SudMGPMGState.MG_COMMON_PLAYER_ONLINE: // 5.玩家在线状态 + SudMGPMGState.MGCommonPlayerOnline mgCommonPlayerOnline = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerOnline.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonPlayerOnline(handle, userId, mgCommonPlayerOnline); + } + break; + case SudMGPMGState.MG_COMMON_PLAYER_CHANGE_SEAT: // 6.玩家换游戏位状态 + SudMGPMGState.MGCommonPlayerChangeSeat mgCommonPlayerChangeSeat = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerChangeSeat.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonPlayerChangeSeat(handle, userId, mgCommonPlayerChangeSeat); + } + break; + case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_PLAYER_ICON: // 7. 游戏通知app点击玩家头像 + SudMGPMGState.MGCommonSelfClickGamePlayerIcon mgCommonSelfClickGamePlayerIcon = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGamePlayerIcon.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonSelfClickGamePlayerIcon(handle, userId, mgCommonSelfClickGamePlayerIcon); + } + break; + case SudMGPMGState.MG_COMMON_SELF_DIE_STATUS: // 8. 游戏通知app玩家死亡状态(2022-04-24新增) + SudMGPMGState.MGCommonSelfDieStatus mgCommonSelfDieStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfDieStatus.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonSelfDieStatus(handle, userId, mgCommonSelfDieStatus); + } + break; + case SudMGPMGState.MG_COMMON_SELF_TURN_STATUS: // 9. 游戏通知app轮到玩家出手状态(2022-04-24新增) + SudMGPMGState.MGCommonSelfTurnStatus mgCommonSelfTurnStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfTurnStatus.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonSelfTurnStatus(handle, userId, mgCommonSelfTurnStatus); + } + break; + case SudMGPMGState.MG_COMMON_SELF_SELECT_STATUS: // 10. 游戏通知app玩家选择状态(2022-04-24新增) + SudMGPMGState.MGCommonSelfSelectStatus mgCommonSelfSelectStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfSelectStatus.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonSelfSelectStatus(handle, userId, mgCommonSelfSelectStatus); + } + break; + case SudMGPMGState.MG_COMMON_GAME_COUNTDOWN_TIME: // 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效) + SudMGPMGState.MGCommonGameCountdownTime mgCommonGameCountdownTime = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameCountdownTime.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonGameCountdownTime(handle, userId, mgCommonGameCountdownTime); + } + break; + case SudMGPMGState.MG_COMMON_SELF_OB_STATUS: // 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效) + SudMGPMGState.MGCommonSelfObStatus mgCommonSelfObStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfObStatus.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGCommonSelfObStatus(handle, userId, mgCommonSelfObStatus); + } + break; + case SudMGPMGState.MG_DG_SELECTING: // 1. 选词中状态(已修改) + SudMGPMGState.MGDGSelecting mgdgSelecting = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGSelecting.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGDGSelecting(handle, userId, mgdgSelecting); + } + break; + case SudMGPMGState.MG_DG_PAINTING: // 2. 作画中状态(已修改) + SudMGPMGState.MGDGPainting mgdgPainting = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGPainting.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGDGPainting(handle, userId, mgdgPainting); + } + break; + case SudMGPMGState.MG_DG_ERRORANSWER: // 3. 显示错误答案状态(已修改) + SudMGPMGState.MGDGErroranswer mgdgErroranswer = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGErroranswer.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGDGErroranswer(handle, userId, mgdgErroranswer); + } + break; + case SudMGPMGState.MG_DG_TOTALSCORE: // 4. 显示总积分状态(已修改) + SudMGPMGState.MGDGTotalscore mgdgTotalscore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGTotalscore.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGDGTotalscore(handle, userId, mgdgTotalscore); + } + break; + case SudMGPMGState.MG_DG_SCORE: // 5. 本次获得积分状态(已修改) + SudMGPMGState.MGDGScore mgdgScore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGScore.class); + if (listener == null) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } else { + listener.onPlayerMGDGScore(handle, userId, mgdgScore); + } + break; + default: + ISudFSMStateHandleUtils.handleSuccess(handle); + break; + } + } + + /** 获取队长userId */ + public String getCaptainUserId() { + return sudFSMMGCache.getCaptainUserId(); + } + + // 返回该玩家是否正在游戏中 + public boolean playerIsPlaying(String userId) { + return sudFSMMGCache.playerIsPlaying(userId); + } + + // 返回该玩家是否已准备 + public boolean playerIsReady(String userId) { + return sudFSMMGCache.playerIsReady(userId); + } + + // 返回该玩家是否已加入了游戏 + public boolean playerIsIn(String userId) { + return sudFSMMGCache.playerIsIn(userId); + } + + // 获取当前游戏中的人数 + public int getPlayerInNumber() { + return sudFSMMGCache.getPlayerInNumber(); + } + + // 是否数字炸弹 + public boolean isHitBomb() { + return sudFSMMGCache.isHitBomb(); + } + + // 销毁游戏 + public void destroyMG() { + sudFSMMGCache.destroyMG(); + sudFSMMGListener = null; + } + + /** + * 返回当前游戏的状态,数值参数{@link SudMGPMGState.MGCommonGameState} + */ + public int getGameState() { + return sudFSMMGCache.getGameState(); + } + + /** 获取缓存的状态 */ + public SudFSMMGCache getSudFSMMGCache() { + return sudFSMMGCache; + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGListener.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGListener.java new file mode 100644 index 0000000..1a0c937 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSMMGListener.java @@ -0,0 +1,1154 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.decorator; + +import com.chwl.core.sud.state.SudMGPMGState; +import com.chwl.core.sud.utils.ISudFSMStateHandleUtils; +import tech.sud.mgp.core.ISudFSMStateHandle; + +/** + * {@link SudFSMMGDecorator} 回调定义 + * {@link SudFSMMGDecorator} Callback definition. + */ +public interface SudFSMMGListener { + + /** + * 游戏日志回调 + * 最低版本:v1.1.30.xx + *

+ * Game log + * Minimum version: v1.1.30.xx + */ + default void onGameLog(String str) { + } + + /** + * 游戏加载进度回调 + * Game loading progress + * + * @param stage 阶段:start=1,loading=2,end=3 + * Stage: start=1, loading=2, end=3 + * @param retCode 错误码:0成功 + * Error code: 0 for success + * @param progress 进度:[0, 100] + * Progress: [0, 100] + */ + default void onGameLoadingProgress(int stage, int retCode, int progress) { + } + + /** + * 游戏开始的回调 + * 最低版本:v1.1.30.xx + *

+ * Callback for game start + * Minimum version: v1.1.30.xx + */ + void onGameStarted(); + + /** + * 游戏销毁的回调 + * 最低版本:v1.1.30.xx + *

+ * Callback for game destruction + * Minimum version: v1.1.30.xx + */ + void onGameDestroyed(); + + /** + * Code过期的回调 + * APP接入方需要调用handle.success或handle.fail + *

+ * Callback for expired code + * The APP integration partner needs to call handle.success or handle.fail + * + * @param dataJson {"code":"value"} + */ + void onExpireCode(ISudFSMStateHandle handle, String dataJson); + + /** + * 获取游戏View信息的回调 + * APP接入方需要调用handle.success或handle.fail + *

+ * Callback for obtaining game View information + * The APP integration partner needs to call handle.success or handle.fail + */ + void onGetGameViewInfo(ISudFSMStateHandle handle, String dataJson); + + /** + * 获取游戏配置的回调 + * APP接入方需要调用handle.success或handle.fail + *

+ * Callback for obtaining game configuration + * The APP integration partner needs to call handle.success or handle.fail + */ + void onGetGameCfg(ISudFSMStateHandle handle, String dataJson); + + // region 游戏回调APP 通用状态 English: Game callback to APP for general state. + // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/CommonStateGame.html + // Reference documentation:https://docs.sud.tech/en-US/app/Client/MGFSM/CommonStateGame.html + + /** + * 1.游戏公屏消息 + * 1. Public screen messages (modified) + * mg_common_public_message + */ + default void onGameMGCommonPublicMessage(ISudFSMStateHandle handle, SudMGPMGState.MGCommonPublicMessage model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2. 关键词状态 + * 2. Keyword + * mg_common_key_word_to_hit + */ + default void onGameMGCommonKeyWordToHit(ISudFSMStateHandle handle, SudMGPMGState.MGCommonKeyWordToHit model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 3. 游戏结算状态 + * 3. Post-game + * mg_common_game_settle + */ + default void onGameMGCommonGameSettle(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSettle model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 4. 加入游戏按钮点击状态 + * 4. Tapping the Join button + * mg_common_self_click_join_btn + */ + default void onGameMGCommonSelfClickJoinBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickJoinBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 5. 取消加入(退出)游戏按钮点击状态 + * 5. Tapping the Cancel Join button + * mg_common_self_click_cancel_join_btn + */ + default void onGameMGCommonSelfClickCancelJoinBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickCancelJoinBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 6. 准备按钮点击状态 + * 6. Tapping the Ready button + * mg_common_self_click_ready_btn + */ + default void onGameMGCommonSelfClickReadyBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickReadyBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 7. 取消准备按钮点击状态 + * 7. Tapping the Cancel Ready button + * mg_common_self_click_cancel_ready_btn + */ + default void onGameMGCommonSelfClickCancelReadyBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickCancelReadyBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 8. 开始游戏按钮点击状态 + * 8. Tapping the Start button + * mg_common_self_click_start_btn + */ + default void onGameMGCommonSelfClickStartBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickStartBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 9. 分享按钮点击状态 + * 9. Tapping the Share button + * mg_common_self_click_share_btn + */ + default void onGameMGCommonSelfClickShareBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickShareBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 10. 游戏状态 + * 10. Gaming + * mg_common_game_state + */ + default void onGameMGCommonGameState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 11. 结算界面关闭按钮点击状态(2021-12-27新增) + * 11. Tapping the Close button on the post-game screen (added on December 27, 2021) + * mg_common_self_click_game_settle_close_btn + */ + default void onGameMGCommonSelfClickGameSettleCloseBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 12. 结算界面再来一局按钮点击状态(2021-12-27新增) + * 12. Tapping the Play Again button on the post-game screen (added on December 27, 2021) + * mg_common_self_click_game_settle_again_btn + */ + default void onGameMGCommonSelfClickGameSettleAgainBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强) + * 13. Reporting the sound list in a game (added on December 30, 2021) + * mg_common_game_sound_list + */ + default void onGameMGCommonGameSoundList(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSoundList model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强) + * 14. Notifying the app layer of playing sound (added on December 30, 2021) + * mg_common_game_sound + */ + default void onGameMGCommonGameSound(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSound model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强) + * 15. Notifying the app layer of playing background music (added on January 7, 2022) + * mg_common_game_bg_music_state + */ + default void onGameMGCommonGameBgMusicState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameBgMusicState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强) + * 16. Notifying the app layer of playing sound effect (added on January 7, 2022) + * mg_common_game_sound_state + */ + default void onGameMGCommonGameSoundState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSoundState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增) + * 17. ASR (enabling/disabling voice recognition, added in SudMGP V1.1.45.xx) + * mg_common_game_asr + */ + default void onGameMGCommonGameASR(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameASR model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 18. 麦克风状态(2022-02-08新增) + * 18. Microphone (added on March 4, 2022) + * mg_common_self_microphone + */ + default void onGameMGCommonSelfMicrophone(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfMicrophone model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 19. 耳机(听筒,扬声器)状态(2022-02-08新增) + * 19. Headphone (receiver and speaker) (added on March 4, 2022) + * mg_common_self_headphone + */ + default void onGameMGCommonSelfHeadphone(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfHeadphone model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 20. App通用状态操作结果错误码(2022-05-10新增) + * 20. app_common_self_x response error code(added on May 10, 2022) + * mg_common_app_common_self_x_resp + */ + default void onGameMGCommonAPPCommonSelfXResp(ISudFSMStateHandle handle, SudMGPMGState.MGCommonAPPCommonSelfXResp model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增) + * 21. Whether the game notifies the app layer of the success of adding the robot players (added on May 17, 2022) + * mg_common_game_add_ai_players + */ + default void onGameMGCommonGameAddAIPlayers(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameAddAIPlayers model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 22. 游戏通知app层添当前网络连接状态(2022-06-21新增) + * 22. The game notifies the app layer to add the current network connection status (added on June 21, 2022) + * mg_common_game_network_state + */ + default void onGameMGCommonGameNetworkState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameNetworkState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 23. 游戏通知app获取积分 + * 23. Game notification app to get score + * mg_common_game_score + */ + default void onGameMGCommonGameGetScore(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameGetScore model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 24. 游戏通知app带入积分 + * 24. score brought in by game notification app + * mg_common_game_set_score + */ + default void onGameMGCommonGameSetScore(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSetScore model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 25. 创建订单 + * 25. create order in game + * mg_common_game_create_order + */ + default void onGameMGCommonGameCreateOrder(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameCreateOrder model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 26. 游戏通知app玩家角色(仅对狼人杀有效) + * 26. Game notification app player role (only valid for werewolf killing) + * mg_common_player_role_id + */ + default void onGameMGCommonPlayerRoleId(ISudFSMStateHandle handle, SudMGPMGState.MGCommonPlayerRoleId model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 27. 游戏通知app玩家被扔便便(你画我猜,你说我猜,友尽闯关有效) + * 27. The game notifies app players that they are thrown poop (only valid for you to draw, I guess) + * mg_common_self_click_poop + */ + default void onGameMGCommonSelfClickPoop(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickPoop model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 28. 游戏通知app玩家被点赞(你画我猜,你说我猜,友尽闯关有效) + * 28. The game notifies app players that they are liked (only valid for you to draw and guess) + * mg_common_self_click_good + */ + default void onGameMGCommonSelfClickGood(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGood model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 29. 游戏通知app游戏FPS(仅对碰碰,多米诺骨牌,飞镖达人生效) + * 29. Game Notification App Game FPS (Only effective for bumper, Dominoes, and knifeMasters) + * mg_common_game_fps + */ + default void onGameMGCommonGameFps(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameFps model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 30. 游戏通知app游戏弹框 + * 30. Game Notification App Game Pop-up + * mg_common_alert + */ + default void onGameMGCommonAlert(ISudFSMStateHandle handle, SudMGPMGState.MGCommonAlert model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 31. 游戏通知app最坑队友(只支持友尽闯关) + * 31. Game Notification App: Most Annoying Teammate (Supports only pickpark) + * mg_common_worst_teammate + */ + default void onGameMGCommonWorstTeammate(ISudFSMStateHandle handle, SudMGPMGState.MGCommonWorstTeammate model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 32. 游戏通知app因玩家逃跑导致游戏结束(只支持友尽闯关) + * 32. Game Notification App: Game Ended Due to Player Quitting(Supports only pickpark) + * mg_common_game_over_tip + */ + default void onGameMGCommonGameOverTip(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameOverTip model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 33. 游戏通知app玩家颜色(只支持友尽闯关) + * 33. Game Notification App: Player Color(Supports pickpark and ludo) + * mg_common_game_player_color + */ + default void onGameMGCommonGamePlayerColor(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerColor model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 34. 游戏通知app玩家头像的坐标(只支持ludo) + * 34. Game Notification App: Player Avatar Coordinates (ludo, knife, umo, dominos, teenpatti, texasholdem, drawAndGuess) + * mg_common_game_player_icon_position + */ + default void onGameMGCommonGamePlayerIconPosition(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerIconPosition model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 35. 游戏通知app退出游戏(只支持teenpattipro 与 德州pro) + * 35. Game Notification App: click exit game button (Only supports Teen Patti Pro and Texas Hold'em Pro) + * mg_common_self_click_exit_game_btn + */ + default void onGameMGCommonSelfClickExitGameBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickExitGameBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 36. 游戏通知app是否要开启带入积分(只支持teenpattipro 与 德州pro) + * 36. Game Notification App: Enable Buy-in Points (Only supports Teen Patti Pro and Texas Hold'em Pro) + * mg_common_game_is_app_chip + */ + default void onGameMGCommonGameIsAppChip(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameIsAppChip model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 37. 游戏通知app当前游戏的设置信息(只支持德州pro,teenpatti pro) + * 37. Game Notification App: Current Game Settings Information (Only supports Texas Hold'em Pro and Teen Patti Pro) + * mg_common_game_rule + */ + default void onGameMGCommonGameRule(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameRule model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 38. 游戏通知app进行玩法设置(只支持德州pro,teenpatti pro) + * 38. Game Notification App: Game Mode Settings (Only supports Texas Hold'em Pro and Teen Patti Pro) + * mg_common_game_settings + */ + default void onGameMGCommonGameSettings(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSettings model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 39. 游戏通知app钱币不足(只支持德州pro,teenpatti pro) + * 39. Game Notification App: Insufficient Coins (Only supports Texas Hold'em Pro and Teen Patti Pro) + * mg_common_game_money_not_enough + */ + default void onGameMGCommonGameMoneyNotEnough(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameMoneyNotEnough model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 40. 游戏通知app下发定制ui配置表(只支持ludo) + * 40. Game Notification App: Send Custom UI Configuration Table (supports Ludo, fir) + * mg_common_game_ui_custom_config + */ + default void onGameMGCommonGameUiCustomConfig(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameUiCustomConfig model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 41. 设置app提供给游戏可点击区域(赛车) + * 41. Set clickable areas provided by the app for the game (crazyracing) + * mg_common_set_click_rect + */ + default void onGameMGCommonSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSetClickRect model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 42. 通知app提供对应uids列表玩家的数据(赛车) + * 42. Notify the app to provide data for the corresponding list of UIDs' players (crazyracing). + * mg_common_users_info + */ + default void onGameMGCommonUsersInfo(ISudFSMStateHandle handle, SudMGPMGState.MGCommonUsersInfo model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 43. 通知app游戏前期准备完成(赛车) + * 43. Notify the app that the game's preliminary preparations are complete.(crazyracing) + * mg_common_game_prepare_finish + */ + default void onGameMGCommonGamePrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePrepareFinish model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 44. 通知app游戏主界面已显示(赛车) + * 44. Notify the app that the game's main interface has been displayed.(crazyracing) + * mg_common_show_game_scene + */ + default void onGameMGCommonShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCommonShowGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 45. 通知app游戏主界面已隐藏(赛车) + * 45. Notify the app that the game's main interface has been hidden.(crazyracing) + * mg_common_hide_game_scene + */ + default void onGameMGCommonHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCommonHideGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 46. 通知app点击了游戏的金币按钮(赛车) + * 46. Notify the app that the game's coin button has been clicked.(crazyracing) + * mg_common_self_click_gold_btn + */ + default void onGameMGCommonSelfClickGoldBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGoldBtn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 47. 通知app棋子到达终点(ludo) + * 47. Notify app reaches the destination (ludo) + * mg_common_game_piece_arrive_end + */ + default void onGameMGCommonGamePieceArriveEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePieceArriveEnd model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 48. 通知app玩家是否托管 + * 48. Notify App the player is auto Managed + * mg_common_game_player_managed_state + */ + default void onGameMGCommonGamePlayerManagedState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerManagedState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 49. 游戏向app发送爆词 + * 49. Notify App the baochi (whoisspy) + * mg_common_game_send_burst_word + */ + default void onGameMGCommonGameSendBurstWord(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSendBurstWord model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 50. 游戏向app发送玩家实时排名(只支持怪物消消乐) + * 50. Game sends real-time player rankings to the app (only supported in Monster Smash). + * mg_common_game_player_ranks + */ + default void onGameMGCommonGamePlayerRanks(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerRanks model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 51. 游戏向app发送玩家即时变化的单双牌(只支持okey101) + * 51. Game sends real-time changes of odd and even cards to the app (only supported in Okey101). + * mg_common_game_player_pair_singular + */ + default void onGameMGCommonGamePlayerPairSingular(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerPairSingular model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 52. 游戏向app发送获取玩家持有的道具卡(只支持大富翁) + * 52. Game sends the app a request for obtaining the player's held property cards (only supported in Monopoly). + * mg_common_game_player_monopoly_cards + */ + default void onGameMGCommonGamePlayerMonopolyCards(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerMonopolyCards model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 53. 游戏向app发送玩家实时积分(只支持怪物消消乐) + * 53. Game sends real-time player scores to the app (only supported in Monster Smash). + * mg_common_game_player_scores + */ + default void onGameMGCommonGamePlayerScores(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerScores model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 54. 游戏通知app销毁游戏(只支持部分概率类游戏) + * 54. The game informs the app to destroy the game + * mg_common_destroy_game_scene + */ + default void onGameMGCommonDestroyGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCommonDestroyGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 55. 游戏通知app击球状态(只支持桌球) + * 55. Game notification app Batting status (only table tennis is supported) + * mg_common_game_billiards_hit_state + */ + default void onGameMGCommonGameBilliardsHitState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameBilliardsHitState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 56. 游戏向app发送获取玩家持有的指定点数道具卡(只支持飞行棋) + * 56. The game sends the item card to the app to obtain the specified points held by the player (only flying chess is supported) + * mg_common_game_player_props_cards + */ + default void onGameMGCommonGamePlayerPropsCards(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGamePlayerPropsCards model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + // endregion 游戏回调APP 通用状态 English: Game callback to APP for general state. + + // region 游戏回调APP 玩家状态 English: Game callback to APP for player state. + // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/CommonStatePlayer.html + // Reference documentation:https://docs.sud.tech/en-US/app/Client/MGFSM/CommonStatePlayer.html + + /** + * 1.加入状态(已修改) + * 1. Joining (modified) + * mg_common_player_in + */ + default void onPlayerMGCommonPlayerIn(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerIn model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2.准备状态(已修改) + * 2. Ready (modified) + * mg_common_player_ready + */ + default void onPlayerMGCommonPlayerReady(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerReady model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 3.队长状态(已修改) + * 3. Captain (modified) + * mg_common_player_captain + */ + default void onPlayerMGCommonPlayerCaptain(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerCaptain model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 4.游戏状态(已修改) + * 4. Gaming (modified) + * mg_common_player_playing + */ + default void onPlayerMGCommonPlayerPlaying(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerPlaying model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 5.玩家在线状态 + * 5. Changing the game seat + * mg_common_player_online + */ + default void onPlayerMGCommonPlayerOnline(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerOnline model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 6.玩家换游戏位状态 + * 6. Notifying the app of tapping a player's avatar (Added on February 9, 2022. This state applies only to player avatars in game scenes.) + * mg_common_player_change_seat + */ + default void onPlayerMGCommonPlayerChangeSeat(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerChangeSeat model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 7. 游戏通知app点击玩家头像 + * 7. Click the player's Avatar on the game notification app + * mg_common_self_click_game_player_icon + */ + default void onPlayerMGCommonSelfClickGamePlayerIcon(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfClickGamePlayerIcon model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 8. 游戏通知app玩家死亡状态(2022-04-24新增) + * 8. Game notification app player death status (added on April 24, 2022) + * mg_common_self_die_status + */ + default void onPlayerMGCommonSelfDieStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfDieStatus model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 9. 游戏通知app轮到玩家出手状态(2022-04-24新增) + * 9. Game notification app player's turn (added on April 24, 2022) + * mg_common_self_turn_status + */ + default void onPlayerMGCommonSelfTurnStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfTurnStatus model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 10. 游戏通知app玩家选择状态(2022-04-24新增) + * 10. Game notification app player selection status (added on April 24, 2022) + * mg_common_self_select_status + */ + default void onPlayerMGCommonSelfSelectStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfSelectStatus model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效) + * 11. The game notifies the app layer of the remaining time of the current game (added on May 23, 2022, and UMO takes effect at present) + * mg_common_game_countdown_time + */ + default void onPlayerMGCommonGameCountdownTime(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonGameCountdownTime model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效) + * 12. The game notifies the app layer that the current player will become an OB perspective after death (added on August 23, 2022, and now the werewolf ) + * mg_common_self_ob_status + */ + default void onPlayerMGCommonSelfObStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfObStatus model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + // endregion 游戏回调APP 玩家状态 English: Game callback to APP for player state. + + // region 游戏回调APP 玩家状态 你画我猜 English: Game callback to APP for player state in 'You Draw, I Guess'. + // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/DrawGuess.html + // Reference documentation:https://docs.sud.tech/en-US/app/Client/MGFSM/DrawGuess.html + + /** + * 1. 选词中状态(已修改) + * 1. Selecting words (modified) + * mg_dg_selecting + */ + default void onPlayerMGDGSelecting(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGSelecting model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2. 作画中状态(已修改) + * 2. Drawing (modified) + * mg_dg_painting + */ + default void onPlayerMGDGPainting(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGPainting model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 3. 显示错误答案状态(已修改) + * 3. Displaying incorrect answers (modified) + * mg_dg_erroranswer + */ + default void onPlayerMGDGErroranswer(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGErroranswer model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 4. 显示总积分状态(已修改) + * 4. Displaying the total points (modified) + * mg_dg_totalscore + */ + default void onPlayerMGDGTotalscore(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGTotalscore model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 5. 本次获得积分状态(已修改) + * 5. Displaying the points obtained from this round (modified) + * mg_dg_score + */ + default void onPlayerMGDGScore(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGScore model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + // endregion 游戏回调APP 玩家状态 你画我猜 English: Game callback to APP for player state in 'You Draw, I Guess'. + + // region 游戏回调APP 通用状态 元宇宙砂砂舞 English: Game callback to APP for general state in Metaverse Sand Dance. + + /** + * 1. 元宇宙砂砂舞指令回调 + * 1. Callback for instructions in the Metaverse Sand Dance game. + * mg_common_game_disco_action + */ + default void onGameMGCommonGameDiscoAction(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameDiscoAction model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2. 元宇宙砂砂舞指令动作结束通知 + * 2. Notification for the completion of actions in the Metaverse Sand Dance game. + * mg_common_game_disco_action_end + */ + default void onGameMGCommonGameDiscoActionEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameDiscoActionEnd model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + // endregion 游戏回调APP 通用状态 元宇宙砂砂舞 English: Game callback to APP for general state in Metaverse Sand Dance. + + // region 游戏回调APP 通用状态 定制火箭 English: Game callback to APP for general state in Custom Rocket. + + /** + * 1. 礼物配置文件(火箭) + * 1. Gift Configuration File (Rocket) + * mg_custom_rocket_config + */ + default void onGameMGCustomRocketConfig(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketConfig model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2. 拥有模型列表(火箭) + * 2. List of Owned Models (Rocket) + * mg_custom_rocket_model_list + */ + default void onGameMGCustomRocketModelList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketModelList model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 3. 拥有组件列表(火箭) + * 3. List of Owned Components (Rocket) + * mg_custom_rocket_component_list + */ + default void onGameMGCustomRocketComponentList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketComponentList model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 4. 获取用户信息(火箭) + * 4. Get User Information (Rocket) + * mg_custom_rocket_user_info + */ + default void onGameMGCustomRocketUserInfo(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUserInfo model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 5. 订单记录列表(火箭) + * 5. Order History List (Rocket) + * mg_custom_rocket_order_record_list + */ + default void onGameMGCustomRocketOrderRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketOrderRecordList model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 6. 展馆内列表(火箭) + * 6. Exhibition Hall List (Rocket) + * mg_custom_rocket_room_record_list + */ + default void onGameMGCustomRocketRoomRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketRoomRecordList model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 7. 展馆内玩家送出记录(火箭) + * 7. Game client notifies the app to fetch the player gifting records in the exhibition hall.(Rocket) + * mg_custom_rocket_user_record_list + */ + default void onGameMGCustomRocketUserRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUserRecordList model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 8. 设置默认模型(火箭) + * 8. Set default model (Rocket) + * mg_custom_rocket_set_default_model + */ + default void onGameMGCustomRocketSetDefaultModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSetDefaultModel model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 9. 动态计算一键发送价格(火箭) + * 9. Dynamic calculation of one-click sending price(Rocket) + * mg_custom_rocket_dynamic_fire_price + */ + default void onGameMGCustomRocketDynamicFirePrice(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketDynamicFirePrice model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 10. 一键发送(火箭) + * 10. One-click sending(Rocket) + * mg_custom_rocket_fire_model + */ + default void onGameMGCustomRocketFireModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFireModel model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 11. 新组装模型(火箭) + * 11. Newly assembled model.(Rocket) + * mg_custom_rocket_create_model + */ + default void onGameMGCustomRocketCreateModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketCreateModel model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 12. 模型更换组件(火箭) + * 12. Model Component Replacement(Rocket) + * mg_custom_rocket_replace_component + */ + default void onGameMGCustomRocketReplaceComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketReplaceComponent model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 13. 购买组件(火箭) + * 13. Buy component(Rocket) + * mg_custom_rocket_buy_component + */ + default void onGameMGCustomRocketBuyComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketBuyComponent model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 14. 播放效果开始(火箭) + * 14. Play effect start(Rocket) + * mg_custom_rocket_play_effect_start + */ + default void onGameMGCustomRocketPlayEffectStart(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPlayEffectStart model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 15. 播放效果完成(火箭) + * 15. Play effect finished(Rocket) + * mg_custom_rocket_play_effect_finish + */ + default void onGameMGCustomRocketPlayEffectFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPlayEffectFinish model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 16. 验证签名合规(火箭) + * 16. To verify the compliance of a signature(Rocket) + * mg_custom_rocket_verify_sign + */ + default void onGameMGCustomRocketVerifySign(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketVerifySign model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 17. 上传icon(火箭) + * 17. upload icon(Rocket) + * mg_custom_rocket_upload_model_icon + */ + default void onGameMGCustomRocketUploadModelIcon(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUploadModelIcon model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 18. 前期准备完成(火箭) + * 18. Preparation is complete.(Rocket) + * mg_custom_rocket_prepare_finish + */ + default void onGameMGCustomRocketPrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPrepareFinish model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 19. 火箭主界面已显示(火箭) + * 19. Rocket main interface has been displayed(Rocket) + * mg_custom_rocket_show_game_scene + */ + default void onGameMGCustomRocketShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketShowGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 20. 火箭主界面已隐藏(火箭) + * 20. The rocket main interface has been hidden(Rocket) + * mg_custom_rocket_hide_game_scene + */ + default void onGameMGCustomRocketHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketHideGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 21. 点击锁住组件(火箭) + * 21. Click to lock the component(Rocket) + * mg_custom_rocket_click_lock_component + */ + default void onGameMGCustomRocketClickLockComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketClickLockComponent model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 22. 火箭效果飞行点击(火箭) + * 22. Rocket effect fly click(Rocket) + * mg_custom_rocket_fly_click + */ + default void onGameMGCustomRocketFlyClick(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFlyClick model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 23. 火箭效果飞行结束(火箭) + * 23. Rocket effect fly finished(Rocket) + * mg_custom_rocket_fly_end + */ + default void onGameMGCustomRocketFlyEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFlyEnd model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 24. 设置点击区域(火箭) + * 24. Set clickable area provided by the app for the game(Rocket) + * mg_custom_rocket_set_click_rect + */ + default void onGameMGCustomRocketSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSetClickRect model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 25. 颜色和签名自定义改到装配间的模式,保存颜色或签名 + * 25. Save rocket signature or color.(Rocket) + * mg_custom_rocket_save_sign_color + */ + default void onGameMGCustomRocketSaveSignColor(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSaveSignColor model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + // endregion 游戏回调APP 通用状态 定制火箭 English: Game callback to APP for general state in Custom Rocket. + + // region 游戏回调APP 通用状态 棒球 English: Game callback to APP for general state in Baseball. + + /** + * 1. 设置界面默认状态(棒球) + * 1. Set Default State of Interface (Baseball) + * mg_baseball_defualt_state + */ + default void onGameMGBaseballDefaultState(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballDefaultState model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2. 前期准备完成(棒球) + * 2. Preparation is complete (Baseball) + * mg_baseball_prepare_finish + */ + default void onGameMGBaseballPrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballPrepareFinish model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 3. 主界面已显示(棒球) + * 3. The main interface is now displayed (Baseball) + * mg_baseball_show_game_scene + */ + default void onGameMGBaseballShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballShowGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 4. 主界面已隐藏(棒球) + * 4. The game client has notified the app that the main interface is now hidden (Baseball) + * mg_baseball_hide_game_scene + */ + default void onGameMGBaseballHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballHideGameScene model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 5. 查询排行榜数据(棒球) + * 5. To query the ranks data (Baseball) + * mg_baseball_ranking + */ + default void onGameMGBaseballRanking(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballRanking model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 6. 查询我的排名(棒球) + * 6. Querying my ranking (baseball) + * mg_baseball_my_ranking + */ + default void onGameMGBaseballMyRanking(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballMyRanking model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 7. 查询当前距离我的前后玩家数据(棒球) + * 7. The game client notifies the app to query the data of players before and after me in the current distance (Baseball) + * mg_baseball_range_info + */ + default void onGameMGBaseballRangeInfo(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballRangeInfo model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 8. 设置app提供给游戏可点击区域(棒球) + * 8. Set the clickable area provided by the app for the game (baseball) + * mg_baseball_set_click_rect + */ + default void onGameMGBaseballSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballSetClickRect model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 9. 获取文本配置数据(棒球) + * 9. Retrieve Text Configuration Data (Baseball) + * mg_baseball_text_config + */ + default void onGameMGBaseballTextConfig(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballTextConfig model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 10. 球落地, 通知距离(棒球) + * 10. Ball landed, notify distance (Baseball) + * mg_baseball_send_distance + */ + default void onGameMGBaseballSendDistance(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballSendDistance model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + // endregion 游戏回调APP 通用状态 棒球 English: Game callback to APP for general state in Baseball. + + // region 游戏回调APP 3D语聊房 + + /** + * 1. 请求房间数据 + * mg_custom_cr_room_init_data + */ + default void onGameMGCustomCrRoomInitData(ISudFSMStateHandle handle, SudMGPMGState.MGCustomCrRoomInitData model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + + /** + * 2. 点击主播位或老板位通知 + * mg_custom_cr_click_seat + */ + default void onGameMGCustomCrClickSeat(ISudFSMStateHandle handle, SudMGPMGState.MGCustomCrClickSeat model) { + ISudFSMStateHandleUtils.handleSuccess(handle); + } + // endregion 游戏回调APP 3D语聊房 + + /** + * 游戏状态变化 + * 透传游戏向App发送的游戏通用状态消息 + * **********使用此方法可先看下此方法的使用逻辑************* + * + * @param handle 回调操作 + * @param state 状态命令 + * @param dataJson 状态值 + * @return 返回true,表示由此方法接管该状态处理,此时需注意调用:ISudFSMStateHandleUtils.handleSuccess(handle); + */ + default boolean onGameStateChange(ISudFSMStateHandle handle, String state, String dataJson) { + return false; + } + + /** + * 游戏玩家状态变化 + * 透传游戏向App发送的玩家状态变化 + * **********使用此方法可先看下此方法的使用逻辑************* + * + * @param handle 回调操作 + * @param userId 用户Id + * @param state 状态命令 + * @param dataJson 状态值 + * @return 返回true,表示由此方法接管该状态处理,此时需注意调用:ISudFSMStateHandleUtils.handleSuccess(handle); + */ + default boolean onPlayerStateChange(ISudFSMStateHandle handle, String userId, String state, String dataJson) { + return false; + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSTAPPDecorator.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSTAPPDecorator.java new file mode 100644 index 0000000..5f76c43 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/decorator/SudFSTAPPDecorator.java @@ -0,0 +1,415 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.decorator; + +import java.nio.ByteBuffer; +import java.util.List; + +import com.chwl.core.sud.state.SudMGPAPPState; +import com.chwl.core.sud.utils.SudJsonUtils; +import tech.sud.mgp.core.ISudFSTAPP; +import tech.sud.mgp.core.ISudListenerNotifyStateChange; + +/** + * ISudFSTAPP的装饰类,接近于业务 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSTAPP.html + * 注意: + * 1,向游戏侧发送状态之后,不能立即调用destroyMG()方法,也不能立即finish Activity。例如:{@link SudFSTAPPDecorator#notifyAPPCommonSelfEnd()} + */ +public class SudFSTAPPDecorator { + + /** + * APP调用游戏的接口 + */ + private ISudFSTAPP iSudFSTAPP; + private OnNotifyStateChangeListener onNotifyStateChangeListener; + + /** + * 设置app调用sdk的对象 + * + * @param iSudFSTAPP + */ + public void setISudFSTAPP(ISudFSTAPP iSudFSTAPP) { + this.iSudFSTAPP = iSudFSTAPP; + } + + // region 状态通知,ISudFSTAPP.notifyStateChange + + /** + * 发送 + * 1. 加入状态 + * + * @param isIn true 加入游戏,false 退出游戏 + * @param seatIndex 加入的游戏位(座位号) 默认传seatIndex = -1 随机加入,seatIndex 从0开始,不可大于座位数 + * @param isSeatRandom 默认为ture, 带有游戏位(座位号)的时候,如果游戏位(座位号)已经被占用,是否随机分配一个空位坐下 isSeatRandom=true 随机分配空位坐下,isSeatRandom=false 不随机分配 + * @param teamId 不支持分队的游戏:数值填1;支持分队的游戏:数值填1或2(两支队伍); + */ + public void notifyAPPCommonSelfIn(boolean isIn, int seatIndex, boolean isSeatRandom, int teamId) { + SudMGPAPPState.APPCommonSelfIn state = new SudMGPAPPState.APPCommonSelfIn(); + state.isIn = isIn; + state.seatIndex = seatIndex; + state.isSeatRandom = isSeatRandom; + state.teamId = teamId; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_IN, state); + } + + /** + * 发送 + * 2. 准备状态 + * 用户(本人)准备/取消准备 + * + * @param isReady true 准备,false 取消准备 + */ + public void notifyAPPCommonSelfReady(boolean isReady) { + SudMGPAPPState.APPCommonSelfReady state = new SudMGPAPPState.APPCommonSelfReady(); + state.isReady = isReady; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_READY, state); + } + + /** + * 发送 + * 3. 游戏状态 模型 + * 用户游戏状态,如果用户在游戏中,建议: + * a.空出屏幕中心区: + * 关闭全屏礼物特效; + * b.部分强操作类小游戏(spaceMax为true),尽量收缩原生UI,给游戏留出尽量大的操作空间: + * 收缩公屏; + * 收缩麦位; + * 如果不在游戏中,则恢复。 + * + * @param isPlaying true 开始游戏,false 结束游戏 + * @param reportGameInfoExtras string类型,Https服务回调report_game_info参数,最大长度1024字节,超过则截断(2022-01-21) + */ + public void notifyAPPCommonSelfPlaying(boolean isPlaying, String reportGameInfoExtras, String reportGameInfoKey) { + SudMGPAPPState.APPCommonSelfPlaying state = new SudMGPAPPState.APPCommonSelfPlaying(); + state.isPlaying = isPlaying; + state.reportGameInfoExtras = reportGameInfoExtras; + state.reportGameInfoKey = reportGameInfoKey; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_PLAYING, state); + } + + /** + * 发送 + * 4. 队长状态 + * 用户是否为队长,队长在游戏中会有开始游戏的权利。 + * 发送此状态后,会把队长身份转移到另一名用户身上。 + * 注意:必须是队长发送才有效果。可通过{@link SudFSMMGDecorator#getCaptainUserId()}拿到当前队长id + * + * @param curCaptainUID 必填,指定队长uid + */ + public void notifyAPPCommonSelfCaptain(String curCaptainUID) { + SudMGPAPPState.APPCommonSelfCaptain state = new SudMGPAPPState.APPCommonSelfCaptain(); + state.curCaptainUID = curCaptainUID; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_CAPTAIN, state); + } + + /** + * 发送 + * 5. 踢人 + * 用户(本人,队长)踢其他玩家; + * 队长才能踢人; + * + * @param kickedUID 被踢用户uid + */ + public void notifyAPPCommonSelfKick(String kickedUID) { + SudMGPAPPState.APPCommonSelfKick state = new SudMGPAPPState.APPCommonSelfKick(); + state.kickedUID = kickedUID; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_KICK, state); + } + + /** + * 发送 + * 6. 结束游戏 + * 用户(本人,队长)结束(本局)游戏 + * 注意:必须是队长发送才有效果。可通过{@link SudFSMMGDecorator#getCaptainUserId()}拿到当前队长id + */ + public void notifyAPPCommonSelfEnd() { + SudMGPAPPState.APPCommonSelfEnd state = new SudMGPAPPState.APPCommonSelfEnd(); + // 使用iSudFSTAPP.notifyStateChange方法向游戏侧发送状态时,因为大部分状态都需要通过网络向后端发送状态指令 + // 所以如果发送状态后,马上就销毁游戏或者Activity,那么状态指令大概率会不生效 + // *** 如果要确保指令能到达后端,那么发送指令后不要立即destroyMG()或finish Activity,可在发送后delay一定时间(如300 or 500 ms)再销毁 + // *** 如果不在乎指令是否能成功到达,可忽略delay + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_END, state); + } + + /** + * 发送 + * 9. 麦克风状态 + * 用户(本人)麦克风状态,建议: + * 进入房间后初始通知一次; + * 每次变更(开麦/闭麦/禁麦/解麦)通知一次; + * + * @param isOn true 开麦,false 闭麦 + * @param isDisabled true 被禁麦,false 未被禁麦 + */ + public void notifyAPPCommonSelfMicrophone(boolean isOn, boolean isDisabled) { + SudMGPAPPState.APPCommonSelfMicrophone state = new SudMGPAPPState.APPCommonSelfMicrophone(); + state.isOn = isOn; + state.isDisabled = isDisabled; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_MICROPHONE, state); + } + + /** + * 发送 + * 10. 文字命中状态 + * 用户(本人)聊天信息命中关键词状态,建议: + * 精确匹配; + * 首次聊天内容命中关键词之后,后续聊天内容不翻转成未命中; + * 直至小游戏侧关键词更新,再将状态翻转为未命中; + * + * @param isHit true 命中,false 未命中 + * @param keyWord 关键词 + * @param text 聊天原始内容 + */ + public void notifyAPPCommonSelfTextHitState(boolean isHit, String keyWord, String text) { + SudMGPAPPState.APPCommonSelfTextHitState state = new SudMGPAPPState.APPCommonSelfTextHitState(); + state.isHit = isHit; + state.keyWord = keyWord; + state.text = text; + notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_TEXT_HIT, state); + } + + /** + * 发送 + * 11. 打开或关闭背景音乐(2021-12-27新增) + * + * @param isOpen true 打开背景音乐,false 关闭背景音乐 + */ + public void notifyAPPCommonOpenBgMusic(boolean isOpen) { + SudMGPAPPState.APPCommonOpenBgMusic state = new SudMGPAPPState.APPCommonOpenBgMusic(); + state.isOpen = isOpen; + notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_BG_MUSIC, state); + } + + /** + * 发送 + * 12. 打开或关闭音效(2021-12-27新增) + * + * @param isOpen true 打开音效,false 关闭音效 + */ + public void notifyAPPCommonOpenSound(boolean isOpen) { + SudMGPAPPState.APPCommonOpenSound state = new SudMGPAPPState.APPCommonOpenSound(); + state.isOpen = isOpen; + notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_SOUND, state); + } + + /** + * 发送 + * 13. 打开或关闭游戏中的振动效果(2021-12-27新增) + * + * @param isOpen 打开振动效果,false 关闭振动效果 + */ + public void notifyAPPCommonOpenVibrate(boolean isOpen) { + SudMGPAPPState.APPCommonOpenVibrate state = new SudMGPAPPState.APPCommonOpenVibrate(); + state.isOpen = isOpen; + notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_VIBRATE, state); + } + + /** + * 发送 + * 14. 设置游戏的音量大小(2021-12-31新增) + * + * @param volume 音量大小 0 到 100 + */ + public void notifyAPPCommonGameSoundVolume(int volume) { + SudMGPAPPState.APPCommonGameSoundVolume state = new SudMGPAPPState.APPCommonGameSoundVolume(); + state.volume = volume; + notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SOUND_VOLUME, state); + } + + /** + * 发送 + * 15. 设置游戏玩法选项(2022-05-10新增) + * + * @param ludo ludo游戏 + */ + public void notifyAPPCommonGameSettingSelectInfo(SudMGPAPPState.Ludo ludo) { + SudMGPAPPState.APPCommonGameSettingSelectInfo state = new SudMGPAPPState.APPCommonGameSettingSelectInfo(); + state.ludo = ludo; + notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SETTING_SELECT_INFO, state); + } + + /** + * 发送 + * 16. 设置游戏中的AI玩家(2022-05-11新增) + * + * @param aiPlayers AI玩家 + * @param isReady 机器人加入后是否自动准备 1:自动准备,0:不自动准备 默认为1 + */ + public void notifyAPPCommonGameAddAIPlayers(List aiPlayers, int isReady) { + SudMGPAPPState.APPCommonGameAddAIPlayers state = new SudMGPAPPState.APPCommonGameAddAIPlayers(); + state.aiPlayers = aiPlayers; + state.isReady = isReady; + notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_ADD_AI_PLAYERS, state); + } + + /** + * 发送 + * 17. app在收到游戏断开连接通知后,通知游戏重试连接(2022-06-21新增,暂时支持ludo) + */ + public void notifyAPPCommonGameReconnect() { + SudMGPAPPState.APPCommonGameReconnect state = new SudMGPAPPState.APPCommonGameReconnect(); + notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_RECONNECT, state); + } + + /** + * 发送 + * 18. app返回玩家当前积分 + */ + public void notifyAPPCommonGameScore(long score) { + SudMGPAPPState.APPCommonGameScore state = new SudMGPAPPState.APPCommonGameScore(); + state.score = score; + notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SCORE, state); + } + // endregion 状态通知,ISudFSTAPP.notifyStateChange + + // region 生命周期 + public void startMG() { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.startMG(); + } + } + + public void pauseMG() { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.pauseMG(); + } + } + + public void playMG() { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.playMG(); + } + } + + public void stopMG() { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.stopMG(); + } + } + + public void destroyMG() { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.destroyMG(); + this.iSudFSTAPP = null; + } + } + + // endregion 生命周期 + + /** + * 更新code + * + * @param code + * @param listener + */ + public void updateCode(String code, ISudListenerNotifyStateChange listener) { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.updateCode(code, listener); + } + } + + /** + * 音频流数据 + */ + public void pushAudio(ByteBuffer buffer, int bufferLength) { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.pushAudio(buffer, bufferLength); + } + } + + // region 元宇宙砂砂舞 + + /** + * 发送 + * 1. 元宇宙砂砂舞相关设置 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonStateForDisco.html + * + * @param actionId 必传的参数,用于指定类型的序号,不同序号用于区分游戏内的不同功能,不传则会判断为无效指令,具体序号代表的功能见下表 + * @param cooldown 持续时间,单位秒,部分功能有持续时间就需要传对应的数值,不传或传错则会按各自功能的默认值处理(见下表) + * @param isTop 是否置顶,针对部分功能可排队置顶(false:不置顶;true:置顶;默认为false) + * @param field1 额外参数1,针对部分功能有具体的意义 + * @param field2 额外参数2,针对部分功能有具体的意义 + */ + public void notifyAppCommonGameDiscoAction(int actionId, Integer cooldown, Boolean isTop, String field1, String field2) { + SudMGPAPPState.AppCommonGameDiscoAction state = new SudMGPAPPState.AppCommonGameDiscoAction(); + state.actionId = actionId; + state.cooldown = cooldown; + state.isTop = isTop; + state.field1 = field1; + state.field2 = field2; + notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_DISCO_ACTION, state); + } + // endregion 元宇宙砂砂舞 + + /** + * APP状态通知给小游戏 + * + * @param state 状态标识 + * @param dataJson 数据 + * @param listener 回调监听 + */ + public void notifyStateChange(String state, String dataJson, ISudListenerNotifyStateChange listener) { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.notifyStateChange(state, dataJson, listener); + if (onNotifyStateChangeListener != null) { + onNotifyStateChangeListener.onNotifyStateChange(state, dataJson); + } + } + } + + /** + * APP状态通知给小游戏 + * + * @param state 状态标识 + * @param dataJson 数据 + */ + public void notifyStateChange(String state, String dataJson) { + notifyStateChange(state, dataJson, null); + } + + /** + * APP状态通知给小游戏 + * + * @param state 状态标识 + * @param obj 数据 + */ + public void notifyStateChange(String state, Object obj) { + notifyStateChange(state, SudJsonUtils.toJson(obj), null); + } + + /** + * 自定义进度条 + * 在游戏加载失败时,调用此方法可重新加载游戏 + */ + public void reloadMG() { + ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP; + if (iSudFSTAPP != null) { + iSudFSTAPP.reloadMG(); + } + } + + public void setOnNotifyStateChangeListener(OnNotifyStateChangeListener onNotifyStateChangeListener) { + this.onNotifyStateChangeListener = onNotifyStateChangeListener; + } + + /** + * 此接口是监听{iSudFSTAPP.notifyStateChange}的接口调用 + */ + public interface OnNotifyStateChangeListener { + /** 此接口回调用于监控app向游戏发送的消息,可将其打印到控制台,尽量不要在此做其他业务性的操作 */ + void onNotifyStateChange(String state, String dataJson); + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameConfigModel.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameConfigModel.java new file mode 100644 index 0000000..00a5a02 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameConfigModel.java @@ -0,0 +1,351 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.model; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +/** + * 游戏配置模型 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameCfg.html + */ +@Keep +public class GameConfigModel implements Serializable { + + public int gameMode = 1; // 游戏模式(每个游戏默认模式是1,不填是1) + public int gameCPU = 0; // 游戏CPU(值为0和1;0:CPU正常功耗,1:CPU低功耗;默认是0,CPU正常功耗) + public int gameSoundControl = 0; // 游戏中声音的播放是否被app层接管(值为0和1;0:游戏播放声音,1:app层播放声音,游戏中不播放任何声音;默认是0) + public int gameSoundVolume = 100; // 游戏中音量的大小(值为0到100;默认是100) + public GameUi ui = new GameUi(); // 对游戏ui界面的配置,可定制ui界面的显示与不显示 + + // 游戏配置中,ui部分 + @Keep + public static class GameUi implements Serializable { + public GameSettle gameSettle = new GameSettle(); // 结算界面 + public GamePing ping = new GamePing(); // 界面中的ping值 + public GameVersion version = new GameVersion(); // 界面中的版本信息值 + public GameLevel level = new GameLevel(); // 大厅中的段位信息 + public GameLobbySettingBtn lobby_setting_btn = new GameLobbySettingBtn(); // 大厅的设置按钮 + public GameLobbyHelpBtn lobby_help_btn = new GameLobbyHelpBtn(); // 大厅的帮助按钮 + public GameLobbyPlayers lobby_players = new GameLobbyPlayers(); // 大厅玩家展示位 + public GameLobbyPlayerCaptainIcon lobby_player_captain_icon = new GameLobbyPlayerCaptainIcon(); // 大厅玩家展示位上队长标识 + public GameLobbyPlayerKickoutIcon lobby_player_kickout_icon = new GameLobbyPlayerKickoutIcon(); // 大厅玩家展示位上踢人标识 + public GameLobbyRule lobby_rule = new GameLobbyRule(); // 大厅的玩法规则描述文字 + public GameLobbyGameSetting lobby_game_setting = new GameLobbyGameSetting(); // 玩法设置 + public GameJoinBtn join_btn = new GameJoinBtn(); // 加入按钮 + public GameCancelJoinBtn cancel_join_btn = new GameCancelJoinBtn(); // 取消加入按钮 + public GameReadyBtn ready_btn = new GameReadyBtn(); // 准备按钮 + public GameCancelReadyBtn cancel_ready_btn = new GameCancelReadyBtn(); // 取消准备按钮 + public GameStartBtn start_btn = new GameStartBtn(); // 开始按钮 + public GameShareBtn share_btn = new GameShareBtn(); // 分享 + public GameSttingBtn game_setting_btn = new GameSttingBtn(); // 游戏场景中的设置按钮 + public GameHelpBtn game_help_btn = new GameHelpBtn(); // 游戏场景中的帮助按钮 + public GameSettleCloseBtn game_settle_close_btn = new GameSettleCloseBtn(); // 游戏结算界面中的关闭按钮 + public GameSettleAgainBtn game_settle_again_btn = new GameSettleAgainBtn(); // 游戏结算界面中的再来一局按钮 + public GameBg game_bg = new GameBg();// 是否隐藏背景图,包括大厅和战斗 + public BlockChangeSeat block_change_seat = new BlockChangeSeat(); // 自定义阻止换座位 + public GameSettingSelectPnl game_setting_select_pnl = new GameSettingSelectPnl(); // 大厅中的玩法选择设置面板 + public GameManagedImage game_managed_image = new GameManagedImage(); // 游戏中的托管图标 + public GameTableImage game_table_image = new GameTableImage(); // 游戏中牌桌背景图 (注:只对某些带牌桌类游戏有作用) + public GameCountdownTime game_countdown_time = new GameCountdownTime(); // 游戏中游戏倒计时显示 (注:现在只针对umo生效) + public GameSelectedTips game_selected_tips = new GameSelectedTips(); // 游戏中所选择的玩法提示文字 (注:现在只针对ludo生效) + public NFTAvatar nft_avatar = new NFTAvatar(); // 控制NFT头像的开关 + public GameOpening game_opening = new GameOpening(); // 控制开场动画的开关 + public GameMvp game_mvp = new GameMvp(); // 游戏结算前的mvp动画 + public UmoIcon umo_icon = new UmoIcon(); // 游戏中动画和头像右上角的UMO图标 + public Logo logo = new Logo(); // 大厅中的logo + public GamePlayers game_players = new GamePlayers(); // 游戏中的游戏位 + public BulletScreensBtn bullet_screens_btn = new BulletScreensBtn(); // 你画我猜,你说我猜『弹幕开关』按钮 + public RoundOverPoopBtn round_over_poop_btn = new RoundOverPoopBtn(); // 你画我猜,小局结算界面点击扔大便按钮 + public RoundOverGoodBtn round_over_good_btn = new RoundOverGoodBtn(); // 你画我猜,小局结算界面点击点赞按钮 + public Mask mask = new Mask(); // 游戏中所有蒙版 + public WorstTeammateTip worst_teammate_tip = new WorstTeammateTip(); // 友尽闯关中最坑队友的弹框 + public GameOverTip game_over_tip = new GameOverTip(); // 友尽闯关中玩家逃跑导致游戏结束弹框 + public LobbyAnimation lobby_animation = new LobbyAnimation(); // 碰碰我最强大厅动画 + } + + // 结算界面 + @Keep + public static class GameSettle implements Serializable { + public boolean hide = false; // 是否隐藏结算界面(false: 显示; true: 隐藏,默认为 false) + } + + // 界面中的ping值 + @Keep + public static class GamePing implements Serializable { + public boolean hide = false; // 是否隐藏ping值(false: 显示;true: 隐藏,默认为false) + } + + // 界面中的版本信息值 + @Keep + public static class GameVersion implements Serializable { + public boolean hide = false; // 是否隐藏版本信息(false: 显示; true: 隐藏,默认为false) + } + + // 大厅中的段位信息 + @Keep + public static class GameLevel implements Serializable { + public boolean hide = false; // 是否隐藏段位信息(false: 显示; true: 隐藏,默认为false) + } + + // 大厅的设置按钮 + @Keep + public static class GameLobbySettingBtn implements Serializable { + public boolean hide = false; // 是否隐藏大厅的设置按钮(false: 显示; true: 隐藏,默认为false) + } + + // 大厅的帮助按钮 + @Keep + public static class GameLobbyHelpBtn implements Serializable { + public boolean hide = false; // 是否隐藏大厅的帮助按钮(false: 显示; true: 隐藏,默认为false) + } + + // 大厅玩家展示位 + @Keep + public static class GameLobbyPlayers implements Serializable { + public boolean custom = false; // 大厅玩家展示位头像点击加入(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = false; // 是否隐藏大厅玩家展示位(false: 显示; true: 隐藏,默认为false) + } + + // 大厅玩家展示位上队长标识 + @Keep + public static class GameLobbyPlayerCaptainIcon implements Serializable { + public boolean hide = false; // 是否隐藏大厅玩家展示位上队长标识(false: 显示; true: 隐藏,默认为false) + } + + // 大厅玩家展示位上踢人标识 + @Keep + public static class GameLobbyPlayerKickoutIcon implements Serializable { + public boolean hide = false; // 是否隐藏大厅玩家展示位上踢人标识(false: 显示; true: 隐藏,默认为false) + } + + // 大厅的玩法规则描述文字 + @Keep + public static class GameLobbyRule implements Serializable { + public boolean hide = false; // 是否隐藏大厅的玩法规则描述文字(false: 显示; true: 隐藏,默认为false) + } + + // 玩法设置 + @Keep + public static class GameLobbyGameSetting implements Serializable { + public boolean hide = false; // 是否隐藏玩法设置(false: 显示; true: 隐藏,默认为false) + } + + // 加入按钮 + @Keep + public static class GameJoinBtn implements Serializable { + public boolean custom = false; // 加入按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = false; // 是否隐藏加入按钮(false: 显示; true: 隐藏,默认为false) + } + + // 取消加入按钮 + @Keep + public static class GameCancelJoinBtn implements Serializable { + public boolean custom = false; // 取消加入按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = false; // 是否隐藏取消加入按钮(false: 显示; true: 隐藏,默认为false) + } + + // 准备按钮 + @Keep + public static class GameReadyBtn implements Serializable { + public boolean custom = false; // 准备按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = false; // 是否隐藏准备按钮(false: 显示; true: 隐藏,默认为false) + } + + // 取消准备按钮 + @Keep + public static class GameCancelReadyBtn implements Serializable { + public boolean custom = false; // 取消准备按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = false; // 是否隐藏取消准备按钮(false: 显示; true: 隐藏,默认为false) + } + + // 开始游戏按钮 + @Keep + public static class GameStartBtn implements Serializable { + public boolean custom = false; // 开始游戏按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = false; // 是否隐藏开始游戏按钮(false: 显示; true: 隐藏,默认为false) + } + + // 分享按钮 + @Keep + public static class GameShareBtn implements Serializable { + public boolean custom = false; // 分享按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false) + public boolean hide = true; // 是否隐藏分享按钮(false: 显示; true: 隐藏,默认为true) + } + + // 游戏场景中的设置按钮 + @Keep + public static class GameSttingBtn implements Serializable { + public boolean hide = false; // 是否隐藏游戏场景中的设置按钮(false: 显示; true: 隐藏,默认为false) + } + + // 游戏场景中的帮助按钮 + @Keep + public static class GameHelpBtn implements Serializable { + public boolean hide = false; // 是否隐藏游戏场景中的帮助按钮(false: 显示; true: 隐藏,默认为false) + } + + // 游戏结算界面中的关闭按钮 + @Keep + public static class GameSettleCloseBtn implements Serializable { + public boolean custom = false; // 游戏结算界面中的关闭按钮(false: 关闭结算界面返回大厅; true: 游戏通知按钮点击事件,并关闭结算界面返回大厅;默认为false) + public boolean hide = false; // 是否隐藏结算界面中的『关闭』按钮(false: 显示; true: 隐藏,默认为true) + } + + // 游戏结算界面中的再来一局按钮 + @Keep + public static class GameSettleAgainBtn implements Serializable { + // 游戏结算界面中的再来一局按钮 + // (false: 关闭结算界面返回大厅并将玩家设置为准备状态; true: 游戏通知按钮点击事件,并关闭结算界面返回大厅(不将玩家设置为准备状态);默认为false) + public boolean custom = false; + + // 是否隐藏结算界面中的『再来一局』按钮(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 是否隐藏背景图,包括大厅和战斗 + // !!!这里只隐藏加载完成后的背景图,加载中背景图如需隐藏则调用:{SudMGP.getCfg().setShowLoadingGameBg(false); } + @Keep + public static class GameBg implements Serializable { + //(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 自定义阻止换座位 + @Keep + public static class BlockChangeSeat implements Serializable { + //(false: 可以换座位; true: 不可以换座位;默认为false) + public boolean custom = false; + } + + // 大厅中的玩法选择设置面板 + @Keep + public static class GameSettingSelectPnl implements Serializable { + // 是否隐藏大厅中的玩法选择设置面板(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 游戏中的托管图标 + @Keep + public static class GameManagedImage implements Serializable { + // 是否隐藏游戏中的托管图标(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 游戏中牌桌背景图 (注:只对某些带牌桌类游戏有作用) + @Keep + public static class GameTableImage implements Serializable { + // 是否隐藏游戏牌桌背景图(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 游戏中游戏倒计时显示 (注:现在只针对umo生效) + @Keep + public static class GameCountdownTime implements Serializable { + // 是否隐藏游戏中游戏倒计时显示(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 游戏中所选择的玩法提示文字 (注:现在只针对ludo生效) + @Keep + public static class GameSelectedTips implements Serializable { + // 是否隐藏游戏中所选择的玩法提示文字显示(false: 显示; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 控制NFT头像的开关 + @Keep + public static class NFTAvatar implements Serializable { + // true隐藏 false显示 + public boolean hide = true; + } + + // 控制开场动画的开关 + @Keep + public static class GameOpening implements Serializable { + // true隐藏 false显示 + public boolean hide = true; + } + + // 游戏结算前的mvp动画 + @Keep + public static class GameMvp implements Serializable { + // true隐藏 false显示 + public boolean hide = true; + } + + // 游戏中动画和头像右上角的UMO图标 + @Keep + public static class UmoIcon implements Serializable { + // 是否隐藏游戏中动画和头像右上角的UMO图标并改为UNO(false: 不隐藏,依然显示UMO; true: 隐藏,改为显示UNO,默认为false) + public boolean hide = false; + } + + // 大厅中的logo + @Keep + public static class Logo implements Serializable { + // 是否隐藏大厅中的logo(false: 不隐藏; true: 隐藏,默认为false) + public boolean hide = false; + } + + // 游戏中的游戏位 + @Keep + public static class GamePlayers implements Serializable { + // 是否隐藏游戏中的游戏位(false: 不隐藏; true: 隐藏,默认为false,暂时只支持你画我猜) + public boolean hide = false; + } + + // 你画我猜,你说我猜『弹幕开关』按钮 + @Keep + public static class BulletScreensBtn implements Serializable { + // 是否隐藏 你画我猜,你说我猜『弹幕开关』按钮(false: 显示; true: 隐藏;默认为true) + public boolean hide = true; + } + + // 你画我猜,小局结算界面点击扔大便按钮 + @Keep + public static class RoundOverPoopBtn implements Serializable { + // 你画我猜,小局结算点击扔大便按钮抛事件(false: 正常点击; true: 游戏通知app按钮点击事件;默认为false) + public boolean custom = false; + } + + // 你画我猜,小局结算界面点击点赞按钮 + @Keep + public static class RoundOverGoodBtn implements Serializable { + // 你画我猜,小局结算点击点赞按钮抛事件(false: 正常点击; true: 游戏通知app按钮点击事件;默认为false) + public boolean custom = false; + } + + // 游戏中所有蒙版 + @Keep + public static class Mask implements Serializable { + // 游戏中的所有蒙版是否透明(false: 不透明,按默认显示; true: 完全透明,默认为false;暂时只支持部分游戏) + public boolean transparent = false; + } + + // 友尽闯关中最坑队友的弹框 + @Keep + public static class WorstTeammateTip implements Serializable { + // 是否隐藏最坑队友弹框(false: 显示; true: 隐藏,默认为false;)只支持友尽闯关 + public boolean hide = false; + } + + // 友尽闯关中玩家逃跑导致游戏结束弹框 + @Keep + public static class GameOverTip implements Serializable { + // 是否隐藏玩家逃跑导致游戏结束弹框(false: 显示; true: 隐藏,默认为false;)只支持友尽闯关 + public boolean hide = false; + } + + // 碰碰我最强大厅动画 + @Keep + public static class LobbyAnimation implements Serializable { + // 是否隐藏碰碰我最强大厅动画(false: 显示; true: 隐藏,默认为false;)只支持碰碰我最强 + public boolean hide = false; + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameViewInfoModel.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameViewInfoModel.java new file mode 100644 index 0000000..b6d95fe --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/model/GameViewInfoModel.java @@ -0,0 +1,49 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.model; + +import androidx.annotation.Keep; + +/** + * 游戏视图 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameViewInfo.html + */ +@Keep +public class GameViewInfoModel { + // 返回码 + public int ret_code; + + // 返回消息 + public String ret_msg; + + // 游戏View的大小 + public GameViewSizeModel view_size = new GameViewSizeModel(); + + // 游戏安全操作区域 + public GameViewRectModel view_game_rect = new GameViewRectModel(); + + @Keep + public static class GameViewSizeModel { + // 游戏View的宽 (单位像素) + public int width; + + // 游戏View的高 (单位像素) + public int height; + } + + @Keep + public static class GameViewRectModel { + // 相对于view_size左边框偏移(单位像素) + public int left; + // 相对于view_size上边框偏移(单位像素) + public int top; + // 相对于view_size右边框偏移(单位像素) + public int right; + // 相对于view_size下边框偏移(单位像素) + public int bottom; + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/MGStateResponse.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/MGStateResponse.java new file mode 100644 index 0000000..73b4055 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/MGStateResponse.java @@ -0,0 +1,35 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.state; + +import androidx.annotation.Keep; + +import com.chwl.core.sud.utils.SudJsonUtils; + +/** + * mg2app,状态响应 + */ +@Keep +public class MGStateResponse { + + // 返回码,成功 + public static final int SUCCESS = 0; + + public static MGStateResponse success() { + MGStateResponse response = new MGStateResponse(); + response.ret_code = SUCCESS; + response.ret_msg = "success"; + return new MGStateResponse(); + } + + + public int ret_code; // 返回码 + public String ret_msg; // 返回消息 + + public String toJson() { + return SudJsonUtils.toJson(this); + } +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPAPPState.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPAPPState.java new file mode 100644 index 0000000..5974f4e --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPAPPState.java @@ -0,0 +1,1321 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.state; + +import androidx.annotation.Keep; + +import java.io.Serializable; +import java.util.List; + +/** + * APP to MG 的通用状态定义 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/APPFST/ + */ +@Keep +public class SudMGPAPPState implements Serializable { + + // region 通用状态 + /** + * 1. 加入状态 + * 最低版本: v1.1.30.xx + */ + public static final String APP_COMMON_SELF_IN = "app_common_self_in"; + + /** + * 1. 加入状态 模型 + * 用户(本人)加入游戏/退出游戏 + * 正确流程: + * 1.isIn=true: 加入游戏=>准备游戏=>开始游戏; + * 2.isIn=false: 结束=>取消准备=>退出游戏; + */ + @Keep + public static class APPCommonSelfIn implements Serializable { + // rue 加入游戏,false 退出游戏 + public boolean isIn; + + // 加入的游戏位(座位号) 默认传seatIndex = -1 随机加入,seatIndex 从0开始,不可大于座位数 + public int seatIndex; + + // 默认为ture, 带有游戏位(座位号)的时候,如果游戏位(座位号)已经被占用,是否随机分配一个空位坐下 isSeatRandom=true 随机分配空位坐下,isSeatRandom=false 不随机分配 + public boolean isSeatRandom; + + // 不支持分队的游戏:数值填1;支持分队的游戏:数值填1或2(两支队伍); + public int teamId; + } + + /** + * 2. 准备状态 + * 最低版本: v1.1.30.xx + */ + public static final String APP_COMMON_SELF_READY = "app_common_self_ready"; + + /** + * 2. 准备状态 模型 + * 用户(本人)准备/取消准备 + */ + @Keep + public static class APPCommonSelfReady implements Serializable { + // true 准备,false 取消准备 + public boolean isReady; + } + + /** + * 3. 游戏状态 + * 最低版本: v1.1.30.xx + */ + public static final String APP_COMMON_SELF_PLAYING = "app_common_self_playing"; + + /** + * 3. 游戏状态 模型 + * 用户游戏状态,如果用户在游戏中,建议: + * a.空出屏幕中心区: + * 关闭全屏礼物特效; + * b.部分强操作类小游戏(spaceMax为true),尽量收缩原生UI,给游戏留出尽量大的操作空间: + * 收缩公屏; + * 收缩麦位; + * 如果不在游戏中,则恢复。 + */ + @Keep + public static class APPCommonSelfPlaying implements Serializable { + // true 开始游戏,false 结束游戏 + public boolean isPlaying; + + // string类型,Https服务回调report_game_info参数,最大长度1024字节,超过则截断(2022-01-21) + public String reportGameInfoExtras; + + // string类型,最大长度64字节,接入方服务端,可以根据这个字段来查询一局游戏的数据 + public String reportGameInfoKey; + } + + /** + * 4. 队长状态 + * 最低版本: v1.1.30.xx + */ + public static final String APP_COMMON_SELF_CAPTAIN = "app_common_self_captain"; + + /** + * 4. 队长状态 模型 + * 用户是否为队长,队长在游戏中会有开始游戏的权利。 + */ + @Keep + public static class APPCommonSelfCaptain implements Serializable { + // 必填,指定队长uid + public String curCaptainUID; + } + + /** + * 5. 踢人 + * v1.1.30.xx + */ + public static final String APP_COMMON_SELF_KICK = "app_common_self_kick"; + + /** + * 5. 踢人 模型 + * 用户(本人,队长)踢其他玩家; + * 队长才能踢人; + */ + @Keep + public static class APPCommonSelfKick implements Serializable { + // 被踢用户uid + public String kickedUID; + } + + /** + * 6. 结束游戏 + * v1.1.30.xx + */ + public static final String APP_COMMON_SELF_END = "app_common_self_end"; + + /** + * 6. 结束游戏 模型 + * 用户(本人,队长)结束(本局)游戏 + */ + @Keep + public static class APPCommonSelfEnd implements Serializable { + // 当前不需要传参 + } + + /** + * 7. 房间状态(depreated 已废弃v1.1.30.xx) + */ + public static final String APP_COMMON_SELF_ROOM = "app_common_self_room"; + + /** + * 8. 麦位状态(depreated 已废弃v1.1.30.xx) + */ + public static final String APP_COMMON_SELF_SEAT = "app_common_self_seat"; + + /** + * 9. 麦克风状态 + */ + public static final String APP_COMMON_SELF_MICROPHONE = "app_common_self_microphone"; + + /** + * 9. 麦克风状态 模型 + * 用户(本人)麦克风状态,建议: + * 进入房间后初始通知一次; + * 每次变更(开麦/闭麦/禁麦/解麦)通知一次; + */ + @Keep + public static class APPCommonSelfMicrophone implements Serializable { + // true 开麦,false 闭麦 + public boolean isOn; + + // true 被禁麦,false 未被禁麦 + public boolean isDisabled; + } + + /** + * 10. 文字命中状态 + */ + public static final String APP_COMMON_SELF_TEXT_HIT = "app_common_self_text_hit"; + + /** + * 10. 文字命中状态 模型 + * 用户(本人)聊天信息命中关键词状态,建议: + * 精确匹配; + * 首次聊天内容命中关键词之后,后续聊天内容不翻转成未命中; + * 直至小游戏侧关键词更新,再将状态翻转为未命中; + */ + @Keep + public static class APPCommonSelfTextHitState implements Serializable { + // true 命中,false 未命中 + public boolean isHit; + + // 关键词 + public String keyWord; + + // 聊天原始内容 + public String text; + } + + /** + * 11. 打开或关闭背景音乐(2021-12-27新增) + */ + public static final String APP_COMMON_OPEN_BG_MUSIC = "app_common_open_bg_music"; + + /** + * 11. 打开或关闭背景音乐(2021-12-27新增) 模型 + */ + @Keep + public static class APPCommonOpenBgMusic implements Serializable { + // true 打开背景音乐,false 关闭背景音乐 + public boolean isOpen; + } + + /** + * 12. 打开或关闭音效(2021-12-27新增) + */ + public static final String APP_COMMON_OPEN_SOUND = "app_common_open_sound"; + + /** + * 12. 打开或关闭音效(2021-12-27新增) 模型 + */ + @Keep + public static class APPCommonOpenSound implements Serializable { + // true 打开音效,false 关闭音效 + public boolean isOpen; + } + + /** + * 13. 打开或关闭游戏中的振动效果(2021-12-27新增) + */ + public static final String APP_COMMON_OPEN_VIBRATE = "app_common_open_vibrate"; + + /** + * 13. 打开或关闭游戏中的振动效果(2021-12-27新增)模型 + */ + @Keep + public static class APPCommonOpenVibrate implements Serializable { + // true 打开振动效果,false 关闭振动效果 + public boolean isOpen; + } + + /** + * 14. 设置游戏的音量大小(2021-12-31新增) + */ + public static final String APP_COMMON_GAME_SOUND_VOLUME = "app_common_game_sound_volume"; + + /** + * 14. 设置游戏的音量大小(2021-12-31新增)模型 + */ + @Keep + public static class APPCommonGameSoundVolume implements Serializable { + // 音量大小 0 到 100 + public int volume; + } + + /** + * 15. 设置游戏玩法选项(2022-05-10新增) + */ + public static final String APP_COMMON_GAME_SETTING_SELECT_INFO = "app_common_game_setting_select_info"; + + /** + * 15. 设置游戏玩法选项(2022-05-10新增) 模型 + */ + @Keep + public static class APPCommonGameSettingSelectInfo implements Serializable { + public Ludo ludo; // 游戏名称 + } + + @Keep + public static class Ludo implements Serializable { + public int mode; // mode: 默认赛制,0: 快速, 1: 经典; + public int chessNum; // chessNum: 默认棋子数量, 2: 对应2颗棋子; 4: 对应4颗棋子; + public int item; // item: 默认道具, 1: 有道具, 0: 没有道具 + } + + /** + * 16. 设置游戏中的AI玩家(2022-05-11新增) + */ + public static final String APP_COMMON_GAME_ADD_AI_PLAYERS = "app_common_game_add_ai_players"; + + /** + * 16. 设置游戏中的AI玩家(2022-05-11新增) 模型 + */ + @Keep + public static class APPCommonGameAddAIPlayers implements Serializable { + public List aiPlayers; // AI玩家 + public int isReady = 1; // 机器人加入后是否自动准备 1:自动准备,0:不自动准备 默认为1 + } + + @Keep + public static class AIPlayers implements Serializable { + public static final int LEVEL_SIMPLE = 1; // 机器人等级:简单 + public static final int LEVEL_MODERATE = 2; // 机器人等级:适中 + public static final int LEVEL_DIFFICULTY = 3; // 机器人等级:困难 + + public String userId; // 玩家id + public String avatar; // 头像url + public String name; // 名字 + public String gender; // 性别 male:男,female:女 + public int level; // 机器人等级 1:简单 2:适中 3:困难 + } + + /** + * 17. app在收到游戏断开连接通知后,通知游戏重试连接(2022-06-21新增,暂时支持ludo) + */ + public static final String APP_COMMON_GAME_RECONNECT = "app_common_game_reconnect"; + + /** + * 17. app在收到游戏断开连接通知后,通知游戏重试连接(2022-06-21新增,暂时支持ludo) 模型 + */ + @Keep + public static class APPCommonGameReconnect implements Serializable { + } + + /** + * 18. app返回玩家当前积分 + */ + public static final String APP_COMMON_GAME_SCORE = "app_common_game_score"; + + /** + * 18. app返回玩家当前积分 模型 + */ + @Keep + public static class APPCommonGameScore implements Serializable { + public long score; // 玩家当前积分 + } + + /** + * 23. app通知游戏创建订单的结果 + */ + public static final String APP_COMMON_GAME_CREATE_ORDER_RESULT = "app_common_game_create_order_result"; + + /** + * 23. app通知游戏创建订单的结果 模型 + */ + @Keep + public static class APPCommonGameCreateOrderResult implements Serializable { + public int result; // app通知游戏创建订单的结果0:失败 1:成功 + } + + /** + * 24. app通知游戏设置玩法(只支持 德州pro和teenpattipro) + */ + public static final String APP_COMMON_GAME_SETTINGS = "app_common_game_settings"; + + /** + * 24. app通知游戏设置玩法(只支持 德州pro和teenpattipro) 模型 + */ + @Keep + public static class APPCommonGameSettings implements Serializable { + public int smallBlind; // 1 配置小盲,大盲为小盲的2倍[1,2,5,10,20,50,100,200,500,1000] + public int ante; // 0 前注 + public int sBuyIn; // 100 带入值/最小带入配置[100,200,100,200,500,1000,2000,5000,100000] + public int bBuyIn; // 200 最大带入,无限(0) + public int isAutoStart; // 2 0表示关闭自动开始 [0,2,6,7,8,9] + public int isStraddle; // 0 0:关闭,1自由,2强制 + public double tableDuration; // 0.05 牌桌时长配置(小时)[0.5,1,2,4,6,8] + public int thinkTime; // 20 思考时间(秒)[10,15,20] + } + + /** + * 25. app通知返回大厅 + */ + public static final String APP_COMMON_GAME_BACK_LOBBY = "app_common_game_back_lobby"; + + /** + * 25. app通知返回大厅 模型 + */ + @Keep + public static class APPCommonGameBackLobby implements Serializable { + } + + /** + * 26. app通知游戏定制UI配置表 (仅支持ludo) + */ + public static final String APP_COMMON_GAME_UI_CUSTOM_CONFIG = "app_common_game_ui_custom_config"; + + /** + * 26. app通知游戏定制UI配置表 (仅支持ludo) 模型 + */ + @Keep + public static class APPCommonGameUiCustomConfig implements Serializable { + public String gameBoard01; // 棋盘底 + public String gameBoard02; // 棋盘 + public String diceBg; // 骰子白底 + public String diceBgGold; // 黄金骰子底 + public String dice01; // 骰子1 + public String dice02; // 骰子2 + public String dice03; // 骰子3 + public String dice04; // 骰子4 + public String dice05; // 骰子5 + public String dice06; // 骰子6 + public String diceCrown; // 骰子皇冠 + public String chessYellow; // 黄色棋子 + public String chessBlue; // 蓝色棋子 + public String chessGreen; // 绿色棋子 + public String chessRed; // 红色棋子 + } + + /** + * 27. app通知游戏玩家信息列表 (赛车) + */ + public static final String APP_COMMON_USERS_INFO = "app_common_users_info"; + + /** + * 27. app通知游戏玩家信息列表 (赛车) 模型 + */ + @Keep + public static class APPCommonUsersInfo implements Serializable { + public List infos; + + @Keep + public static class UserInfoModel { + public String uid; // 玩家id + public String avatar; // 玩家头像url + public String name; // 玩家名字 + } + } + + /** + * 28. app通知游戏自定义帮助内容 (赛车) + */ + public static final String APP_COMMON_CUSTOM_HELP_INFO = "app_common_custom_help_info"; + + /** + * 28. app通知游戏自定义帮助内容 (赛车) 模型 + */ + @Keep + public static class APPCommonCustomHelpInfo implements Serializable { + public List content; + } + + /** + * 29. app主动调起主界面(赛车) + */ + public static final String APP_COMMON_SHOW_GAME_SCENE = "app_common_show_game_scene"; + + /** + * 29. app主动调起主界面(赛车) 模型 + */ + @Keep + public static class APPCommonShowGameScene implements Serializable { + } + + /** + * 30. app主动隐藏主界面(赛车) + */ + public static final String APP_COMMON_HIDE_GAME_SCENE = "app_common_hide_game_scene"; + + /** + * 30. app主动隐藏主界面(赛车) 模型 + */ + @Keep + public static class APPCommonHideGameScene implements Serializable { + } + + /** + * 31. app通知游戏爆词内容(谁是卧底) + */ + public static final String APP_COMMON_GAME_SEND_BURST_WORD = "app_common_game_send_burst_word"; + + /** + * 31. app通知游戏爆词内容(谁是卧底) 模型 + */ + @Keep + public static class APPCommonGameSendBurstWord implements Serializable { + public String text; // 爆词内容 + } + + /** + * 32. app通知游戏玩家所持有的道具卡(大富翁) + */ + public static final String APP_COMMON_GAME_PLAYER_MONOPOLY_CARDS = "app_common_game_player_monopoly_cards"; + + /** + * 32. app通知游戏玩家所持有的道具卡(大富翁) 模型 + */ + @Keep + public static class APPCommonGamePlayerMonopolyCards implements Serializable { + public int reroll_card_count; // 重摇卡的数量 + public int free_rent_card_count; // 免租卡的数量 + public int ctrl_dice_card_count; // 购买指定骰子点数卡的数量 + } + + /** + * 33. app通知游戏获取到道具卡(大富翁) + */ + public static final String APP_COMMON_GAME_SHOW_MONOPOLY_CARD_EFFECT = "app_common_game_show_monopoly_card_effect"; + + /** + * 33. app通知游戏获取到道具卡(大富翁) 模型 + */ + @Keep + public static class APPCommonGameShowMonopolyCardEffect implements Serializable { + public int type; // 1:重摇卡,2:免租卡,3:指定点数卡 + public String fromUid; // 发送的玩家id + public String toUid; // 接收方玩家id + public int count; // 数量 + } + + /** + * 34. app通知游戏侧更新游戏币(概率游戏相关玩法) + */ + public static final String APP_COMMON_UPDATE_GAME_MONEY = "app_common_update_game_money"; + + /** + * 34. app通知游戏侧更新游戏币(概率游戏相关玩法) 模型 + */ + @Keep + public static class AppCommonUpdateGameMoney implements Serializable { + } + + /** + * 35. app通知游戏玩家所持有的道具卡(只支持飞行棋) + */ + public static final String APP_COMMON_GAME_PLAYER_PROPS_CARDS = "app_common_game_player_props_cards"; + + /** + * 35. app通知游戏玩家所持有的道具卡(只支持飞行棋) 模型 + */ + @Keep + public static class AppCommonGamePlayerPropsCards implements Serializable { + /** + * 道具卡数量结构的json字符串 + *

+ * ludo 返回字符串结构说明 + * 注:返回的是一个json数据的字符串,specify_dice_roll是遥控骰子字段对应的数量 + * {"props": "{"specify_dice_roll":0}"} + */ + public String props; + } + + /** + * 36. app通知游戏播放玩家所获得的道具卡的特效(只支持飞行棋) + */ + public static final String APP_COMMON_GAME_PLAYER_PROPS_CARDS_EFFECT = "app_common_game_player_props_cards_effect"; + + /** + * 36. app通知游戏播放玩家所获得的道具卡的特效(只支持飞行棋) 模型 + */ + @Keep + public static class AppCommonGamePlayerPropsCardsEffect implements Serializable { + /** + * 获得的道具卡名字 + *

+ * 飞行棋(ludo) + * paid_events_type: "specify_dice_roll" // 控制指定摇出骰子点数的道具 + */ + public String paid_events_type; + public String fromUid; // 发送的玩家id + public String toUid; // 接收方玩家id + public int count; // 数量 + } + // endregion 通用状态 + + // region 元宇宙砂砂舞 + /** + * 1. 元宇宙砂砂舞相关设置 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonStateForDisco.html + */ + public static final String APP_COMMON_GAME_DISCO_ACTION = "app_common_game_disco_action"; + + /** + * 1. 元宇宙砂砂舞相关设置 模型 + */ + @Keep + public static class AppCommonGameDiscoAction implements Serializable { + public int actionId; // 必传的参数,用于指定类型的序号,不同序号用于区分游戏内的不同功能,不传则会判断为无效指令,具体序号代表的功能见下表 + public Integer cooldown; // 持续时间,单位秒,部分功能有持续时间就需要传对应的数值,不传或传错则会按各自功能的默认值处理(见下表) + public Boolean isTop; // 是否置顶,针对部分功能可排队置顶(false:不置顶;true:置顶;默认为false) + public String field1; // 额外参数1,针对部分功能有具体的意义 + public String field2; // 额外参数2,针对部分功能有具体的意义 + } + // endregion 元宇宙砂砂舞 + + // region 定制火箭 + /** + * 1. 礼物配置文件回调 + */ + public static final String APP_CUSTOM_ROCKET_CONFIG = "app_custom_rocket_config"; + + /** + * 1. 礼物配置文件回调 模型 + */ + @Keep + public static class AppCustomRocketConfig implements Serializable { + public int maxSeat; // 最大机位 + public double firePrice; // 发射的静态价格 + public int isDynamicPrice; // 发射价格是否动态开关 0:静态 1动态 + public String gameIntroduce; // 玩法介绍 + public String monetaryUnit; // 货币的单位 + public long serverTime; // 服务器时间戳,单位秒 + public List filterModel; // 过滤不显示的模块(默认是为空) + public List filterLayer; // 过滤不显示的页面(默认是为空) + public List componentList; // 组件列表 1套装,2主仓,3尾翼,4头像,5签名,6颜色 + public List headList; // 组件列表 + public List extraList; // 专属配置 + + @Keep + public static class ComponentModel { + public String componentId; // 组件的ID + public int type; // 1套装,2主仓,3尾翼 + public String name; // 显示名称(商城+装配间+购买记录+...) + public double price; // 价格 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期:单位是秒 + public String imageId; // 图片ID + public int isLock; // 锁:0不锁 1锁 + public int isShow; // 展示:0不展示 1展示 + } + + @Keep + public static class HeadModel { + public String componentId; // 组件的ID + public int type; // 4头像(商城+装配间+购买记录+...) + public String name; // 显示名称 + public double price; // 价格 暂时不考虑小数 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期:单位是秒 + public String userId; // 用户的userId + public String nickname; // 昵称 + public int sex; // 性别 0:男 1:女 + public String url; // 头像URL + } + + @Keep + public static class ExtraModel { + public String componentId; // 组件的ID + public int type; // 5签名,6颜色 + public String name; // 显示名称(商城+装配间+购买记录+...) + public double price; // 价格 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期:单位是秒 + public String desc; // 描述 + } + } + + /** + * 2. 拥有模型列表回调(火箭) + */ + public static final String APP_CUSTOM_ROCKET_MODEL_LIST = "app_custom_rocket_model_list"; + + /** + * 2. 拥有模型列表回调(火箭) 模型 + */ + @Keep + public static class AppCustomRocketModelList implements Serializable { + public String defaultModelId; // 默认模型 + public int isScreenshot; // 截图:0不截图 1截图(app上传失败或者过期时,被动截图) + public List list; + + @Keep + public static class Model { + public String modelId; // 模型Id + public int isAvatar; // 可以换装:0不可以 1可以 + public String serviceFlag; // 服务标识 + public List componentList; // 列表 + + @Keep + public static class ComponentModel { + public String itemId; // 唯一标识 + public int type; // 类型 + public String value; // 值 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期时间戳:单位是秒 + } + } + } + + /** + * 3. 拥有组件列表回调(火箭) + */ + public static final String APP_CUSTOM_ROCKET_COMPONENT_LIST = "app_custom_rocket_component_list"; + + /** + * 3. 拥有组件列表回调(火箭) 模型 + */ + @Keep + public static class AppCustomRocketComponentList implements Serializable { + public List defaultList; // 默认组件列表 + public List list; // 组件列表 + + @Keep + public static class ComponentModel { + public String itemId; // 唯一标识 + public int type; // 类型 + public String value; // 值 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期时间戳:单位是秒 + public long date; // 购买时间:1970年1月1日开始。时间戳:单位是秒 + public String extra; // (可选择) 字段存在显示内容,字段不存在显示时间或者永久 + } + } + + /** + * 4. 获取用户信息回调(火箭) + */ + public static final String APP_CUSTOM_ROCKET_USER_INFO = "app_custom_rocket_user_info"; + + /** + * 4. 获取用户信息回调(火箭) 模型 + */ + @Keep + public static class AppCustomRocketUserInfo implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public List userList; // 用户信息列表 + } + + /** + * 5. 订单记录列表回调 + */ + public static final String APP_CUSTOM_ROCKET_ORDER_RECORD_LIST = "app_custom_rocket_order_record_list"; + + /** + * 5. 订单记录列表回调 模型 + */ + @Keep + public static class AppCustomRocketOrderRecordList implements Serializable { + public int pageIndex; // 第几页 + public int pageCount; // 总页数 + public List list; // 列表 + + /** + * 定制火箭,订单组件 模型 + */ + @Keep + public static class ComponentModel { + public int type; // 类型 + public String value; // 值 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期时间戳:单位是秒 + public long date; // 有效期时间戳:单位是秒 + } + } + + /** + * 6. 展馆内列表回调 + */ + public static final String APP_CUSTOM_ROCKET_ROOM_RECORD_LIST = "app_custom_rocket_room_record_list"; + + /** + * 6. 展馆内列表回调 模型 + */ + @Keep + public static class AppCustomRocketRoomRecordList implements Serializable { + public int pageIndex; // 第几页 + public int pageCount; // 总页数 + public List list; // 列表 + + @Keep + public static class RoomRecordModel { + public CustomRocketUserInfoModel fromUser; // 送礼人 + public int number; // 火箭数量 + } + } + + /** + * 7. 展馆内玩家送出记录回调 + */ + public static final String APP_CUSTOM_ROCKET_USER_RECORD_LIST = "app_custom_rocket_user_record_list"; + + /** + * 7. 展馆内玩家送出记录回调 模型 + */ + @Keep + public static class AppCustomRocketUserRecordList implements Serializable { + public int pageIndex; // 第几页 + public int pageCount; // 总页数 + public CustomRocketUserInfoModel fromUser; // 送礼人 + public List list; // 列表 + + @Keep + public static class UserRecordModel { + public long date; // 订单时间戳: 单位是秒 + public int number; // 个数 + public CustomRocketUserInfoModel toUser; // 收礼人 + public List componentList; // 列表 + + @Keep + public static class ComponentModel { + public int type; // 类型 + public String value; // 值 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期时间戳:单位是秒 + } + } + } + + /** + * 8. 设置默认模型(火箭) + */ + public static final String APP_CUSTOM_ROCKET_SET_DEFAULT_MODEL = "app_custom_rocket_set_default_model"; + + /** + * 8. 设置默认模型(火箭) 模型 + */ + @Keep + public static class AppCustomRocketSetDefaultModel implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; // 数据 + + @Keep + public static class Data { + public String modelId; // 默认模型 + } + } + + /** + * 9. 动态计算一键发送价格回调 + */ + public static final String APP_CUSTOM_ROCKET_DYNAMIC_FIRE_PRICE = "app_custom_rocket_dynamic_fire_price"; + + /** + * 9. 动态计算一键发送价格回调 模型 + */ + @Keep + public static class AppCustomRocketDynamicFirePrice implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; // 数据 + + @Keep + public static class Data { + public double price; // 发送的价格 + } + } + + /** + * 10. 一键发送回调 + */ + public static final String APP_CUSTOM_ROCKET_FIRE_MODEL = "app_custom_rocket_fire_model"; + + /** + * 10. 一键发送回调 模型 + */ + @Keep + public static class AppCustomRocketFireModel implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + } + + /** + * 11. 新组装模型 回调 + */ + public static final String APP_CUSTOM_ROCKET_CREATE_MODEL = "app_custom_rocket_create_model"; + + /** + * 11. 新组装模型 回调 模型 + */ + @Keep + public static class AppCustomRocketCreateModel implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; + + @Keep + public static class Data { + public String modelId; // 模型Id + public int isAvatar; // 可以换装:0不可以 1可以 + public String serviceFlag; // 服务标识 + public List componentList; + + @Keep + public static class ComponentModel { + public String itemId; // 模型Id + } + } + } + + /** + * 12. 更换组件 回调 + */ + public static final String APP_CUSTOM_ROCKET_REPLACE_COMPONENT = "app_custom_rocket_replace_component"; + + /** + * 12. 更换组件 回调 模型 + */ + @Keep + public static class AppCustomRocketReplaceComponent implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; + + @Keep + public static class Data { + public String modelId; // 模型Id + public List componentList; + + @Keep + public static class ComponentModel { + public String itemId; + } + } + } + + /** + * 13. 购买组件 回调 + */ + public static final String APP_CUSTOM_ROCKET_BUY_COMPONENT = "app_custom_rocket_buy_component"; + + /** + * 13. 购买组件 回调 模型 + */ + @Keep + public static class AppCustomRocketBuyComponent implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; + + @Keep + public static class Data { + public List componentList; + + @Keep + public static class ComponentModel { + public String itemId; // 唯一标识 + public int type; // 类型 + public String value; // 值 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期时间戳:单位是秒 + public long date; // 有效期时间戳:单位是秒 + } + } + } + + /** + * 14. app播放火箭发射动效(火箭) + */ + public static final String APP_CUSTOM_ROCKET_PLAY_MODEL_LIST = "app_custom_rocket_play_model_list"; + + /** + * 14. app播放火箭发射动效(火箭) 模型 + */ + @Keep + public static class AppCustomRocketPlayModelList implements Serializable { + public String orderId; // 订单号 + public InteractConfigModel interactConfig; // 可选配置 + public List componentList; // 组件列表 + + @Keep + public static class ComponentModel { + public int type; // 类型 + public String value; // 值 + } + + @Keep + public static class InteractConfigModel { + public int interactivePlay; // 互动玩法默认状态,1是关闭,0是打开,默认打开; + public List gear; // 每个档位需要点击的次数; + public int nicknameTips; // 昵称飘字是否显示,1是隐藏,0是显示,默认0; + public int uiSwitche; // 左上角UI信息是否显示,1是隐藏,0是显示,默认0; + public int guide; // 新手引导是否显示,1是隐藏,0是显示,默认0; + } + } + + /** + * 15. app推送主播信息(火箭) + */ + public static final String APP_CUSTOM_ROCKET_NEW_USER_INFO = "app_custom_rocket_new_user_info"; + + /** + * 15. app推送主播信息(火箭) 模型 + */ + @Keep + public static class AppCustomRocketNewUserInfo implements Serializable { + public List userList; // 用户信息列表 + } + + /** + * 16. 验证签名合规(火箭) + */ + public static final String APP_CUSTOM_ROCKET_VERIFY_SIGN = "app_custom_rocket_verify_sign"; + + /** + * 16. 验证签名合规(火箭) 回调 模型 + */ + @Keep + public static class AppCustomRocketVerifySign implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; + + @Keep + public static class Data { + public String sign; // 验证的签名 + } + } + + /** + * 17. app主动调起火箭主界面(火箭) + */ + public static final String APP_CUSTOM_ROCKET_SHOW_GAME_SCENE = "app_custom_rocket_show_game_scene"; + + /** + * 17. app主动调起火箭主界面(火箭) 模型 + */ + @Keep + public static class AppCustomRocketShowGameScene implements Serializable { + } + + /** + * 18. app主动隐藏火箭主界面(火箭) + */ + public static final String APP_CUSTOM_ROCKET_HIDE_GAME_SCENE = "app_custom_rocket_hide_game_scene"; + + /** + * 18. app主动隐藏火箭主界面(火箭) 模型 + */ + @Keep + public static class AppCustomRocketHideGameScene implements Serializable { + } + + /** + * 19. app推送解锁组件(火箭) + */ + public static final String APP_CUSTOM_ROCKET_UNLOCK_COMPONENT = "app_custom_rocket_unlock_component"; + + /** + * 19. app推送解锁组件(火箭) 模型 + */ + @Keep + public static class AppCustomRocketUnlockComponent implements Serializable { + public int type; // 组件类型 + public String componentId; // 组件ID + } + + /** + * 20. app推送火箭效果飞行点击(火箭) + */ + public static final String APP_CUSTOM_ROCKET_FLY_CLICK = "app_custom_rocket_fly_click"; + + /** + * 20. app推送火箭效果飞行点击(火箭) 模型 + */ + @Keep + public static class AppCustomRocketFlyClick implements Serializable { + } + + /** + * 21. app推送关闭火箭播放效果(火箭) + */ + public static final String APP_CUSTOM_ROCKET_CLOSE_PLAY_EFFECT = "app_custom_rocket_close_play_effect"; + + /** + * 21. app推送关闭火箭播放效果(火箭) 模型 + */ + @Keep + public static class AppCustomRocketClosePlayEffect implements Serializable { + } + + /** + * 22. 颜色和签名自定义改到装配间的模式,保存颜色或签名回调 + */ + public static final String APP_CUSTOM_ROCKET_SAVE_SIGN_COLOR = "app_custom_rocket_save_sign_color"; + + /** + * 22. 颜色和签名自定义改到装配间的模式,保存颜色或签名回调 模型 + */ + @Keep + public static final class AppCustomRocketSaveSignColor implements Serializable { + public int resultCode; // 0: 请求成功,1:请求失败 + public String error; // 错误描述 + public Data data; // 数据 + + @Keep + public static class Data { + public List componentList; + } + + @Keep + public static class ComponentModel { + public String itemId; // 唯一标识 + public int type; // 签名 + public String value; // 签名的值 + public int isForever; // 永久:0非永久 1永久 + public long validTime; // 有效期时间戳:单位是秒 + } + } + + /** + * 定制火箭,用户信息 模型 + */ + @Keep + public static class CustomRocketUserInfoModel { + public String userId; // 用户的userId + public String nickname; // 昵称 + public int sex; // 性别 0:男 1:女 + public String url; // 头像URL + } + // endregion 定制火箭 + + // region 棒球 + /** + * 1. 下发游戏客户端查询排行榜数据(棒球) + */ + public static final String APP_BASEBALL_RANKING = "app_baseball_ranking"; + + /** + * 1. 下发游戏客户端查询排行榜数据(棒球) 模型 + */ + @Keep + public static class AppBaseballRanking implements Serializable { + public List data; + } + + /** + * 2. 下发游戏客户端查询我的排名数据(棒球) + */ + public static final String APP_BASEBALL_MY_RANKING = "app_baseball_my_ranking"; + + /** + * 2. 下发游戏客户端查询我的排名数据(棒球) 模型 + */ + @Keep + public static class AppBaseballMyRanking implements Serializable { + public AppBaseballPlayerInfo data; + } + + /** + * 3. 下发游戏客户端查询排在自己前后的玩家数据(棒球) + */ + public static final String APP_BASEBALL_RANGE_INFO = "app_baseball_range_info"; + + /** + * 3. 下发游戏客户端查询排在自己前后的玩家数据(棒球) 模型 + */ + @Keep + public static class AppBaseballRangeInfo implements Serializable { + public AppBaseballPlayerInfo before; // 前一名 + public AppBaseballPlayerInfo after; // 后一名 + } + + /** + * 4. app主动调起主界面(棒球) + */ + public static final String APP_BASEBALL_SHOW_GAME_SCENE = "app_baseball_show_game_scene"; + + /** + * 4. app主动调起主界面(棒球) 模型 + */ + @Keep + public static class AppBaseballShowGameScene implements Serializable { + } + + /** + * 5. app主动隐藏主界面(棒球) + */ + public static final String APP_BASEBALL_HIDE_GAME_SCENE = "app_baseball_hide_game_scene"; + + /** + * 5. app主动隐藏主界面(棒球) 模型 + */ + @Keep + public static class AppBaseballHideGameScene implements Serializable { + } + + /** + * 6. app推送需要的文本数据(棒球) + */ + public static final String APP_BASEBALL_TEXT_CONFIG = "app_baseball_text_config"; + + /** + * 6. app推送需要的文本数据(棒球) 模型 + */ + @Keep + public static class AppBaseballTextConfig implements Serializable { + public String mode1; + public String mode2; + public String mode3; + } + + @Keep + public static class AppBaseballPlayerInfo implements Serializable { + public String playerId; // 玩家Id + public String name; // 玩家昵称 + public String avatar; // 头像 + public long distance; // 距离 + public int rank; // 排名 + } + // endregion 棒球 + + // region 3D语聊房 + /** + * 1. 设置房间配置 + * 收到游戏发过来的mg_custom_cr_room_init_data状态后 + * App把房间配置以及主播位数据发送给游戏 + */ + public static final String APP_CUSTOM_CR_SET_ROOM_CONFIG = "app_custom_cr_set_room_config"; + + /** + * 1. 设置房间配置 模型 + */ + @Keep + public static class AppCustomCrSetRoomConfig implements Serializable { + public int platformRotate; // 立方体是否自转 0:不旋转 1:旋转 + public int rotateDir; // 立方体自转方向 0:从右往左转 1:从左往右转 + public int rotateSpeed; // 立方体自转速度(整形类型)0:使用默认速度每秒6度 x>0:每秒旋转x度 + public int gameMusic; // 音乐控制 0:关 1:开 + public int gameSound; // 音效控制 0:关 1:开 + public int flashVFX; // 是否开启爆灯边框效果 0:关 1:开 + public int micphoneWave; // 是否开启麦浪边框效果 0:关 1:开 + public int showGiftValue; // 是否显示心动值 0:隐藏 1:显示 + } + + /** + * 2. 设置主播位数据 + * 收到游戏发过来的mg_custom_cr_room_init_data状态后 + * App把房间配置以及主播位数据发送给游戏 + *

+ * 初始化时,需要发送5个主播位的全量数据 + * 后续如果某个主播位有变化,可只传一个或多个主播位的数据(需要该主播位的全量数据) + */ + public static final String APP_CUSTOM_CR_SET_SEATS = "app_custom_cr_set_seats"; + + /** + * 2. 设置主播位数据 模型 + */ + @Keep + public static class AppCustomCrSetSeats implements Serializable { + public List seats; // 主播位数据 + + /** + * 3D语聊房主播位 模型 + */ + @Keep + public static class CrSeatModel implements Serializable { + public static final int MICRO_STATE_SOMEONE = 1; + public static final int MICRO_STATE_NO_ONE = 2; + public static final int MICRO_STATE_LOCKED = 3; + + public int seatIndex; // 0~4一共5个麦位,0为老板位,1~4为四个面主播位 + public int level; // 四个面场景等级 0~2 + public int microState; // 麦位状态 1:有人 2:空位 3:麦位被锁 + public String userId; // 当前麦位用户id(如果有) + public int gender; // 性别 0:男 1:女 + public String name; // 名字 + public String photoUrl; // 头像链接 + public int micphoneState; // 麦克风状态 -1:禁麦 0:闭麦 1:开麦 + public int giftValue; // 心动值 + } + } + + /** + * 3. 播放收礼效果 + */ + public static final String APP_CUSTOM_CR_PLAY_GIFT_EFFECT = "app_custom_cr_play_gift_effect"; + + /** + * 3. 播放收礼效果 模型 + */ + @Keep + public static class AppCustomCrPlayGiftEffect implements Serializable { + public String giverUserId; // 送礼人的userId + public boolean isAllSeat; // 标识是否是全麦 + public List giftList; // 礼物列表,可送给一个或者多个主播 + + @Keep + public static class CrGiftModel implements Serializable { + public int seatIndex; // 0~4一共5个麦位,0为老板位,1~4为四个面主播位 + public int level; // 礼物档位,1 ~ 30 + public int count; // 礼物数量 + } + } + + /** + * 4. 通知播放爆灯特效 + */ + public static final String APP_CUSTOM_CR_SET_LIGHT_FLASH = "app_custom_cr_set_light_flash"; + + /** + * 4. 通知播放爆灯特效 模型 + */ + @Keep + public static class AppCustomCrSetLightFlash implements Serializable { + public int seatIndex; // 主播位index + } + + /** + * 5. 通知主播播放指定动作 + */ + public static final String APP_CUSTOM_CR_PLAY_ANIM = "app_custom_cr_play_anim"; + + /** + * 5. 通知主播播放指定动作 模型 + */ + @Keep + public static class AppCustomCrPlayAnim implements Serializable { + public int seatIndex; // 主播位index + public int animId; // 动作id 1:跳舞 2:飞吻 3:感谢 4:鼓掌 5:害羞 6:欢呼 7:伤心 8:生气 + } + + /** + * 6. 通知麦浪值变化 + */ + public static final String APP_CUSTOM_CR_MICPHONE_VALUE_SEAT = "app_custom_cr_micphone_value_seat"; + + /** + * 6. 通知麦浪值变化 模型 + */ + @Keep + public static class AppCustomCrMicphoneValueSeat implements Serializable { + public int seatIndex; // 主播位index + public int value; // 麦浪值,请映射到区间0~100 + } + + /** + * 7. 通知暂停或恢复立方体自转 + */ + public static final String APP_CUSTOM_CR_PAUSE_ROTATE = "app_custom_cr_pause_rotate"; + + /** + * 7. 通知暂停或恢复立方体自转 模型 + */ + @Keep + public static class AppCustomCrPauseRotate implements Serializable { + /** + * 0:恢复自转(若旋转配置启用自转,则收到0时恢复自转,若旋转配置不启用自转,则无效果) + * 1:暂停自转(若旋转配置启用自转,则收到1时暂定自转,若旋转配置不启用自转,则无效果) + */ + public int pause; + } + // endregion 3D语聊房 + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPMGState.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPMGState.java new file mode 100644 index 0000000..c34c0c9 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/state/SudMGPMGState.java @@ -0,0 +1,1870 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.state; + +import androidx.annotation.Keep; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.List; + +/** + * MG to APP 的状态定义 + * 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/ + */ +@Keep +public class SudMGPMGState implements Serializable { + + // region MG状态机-通用状态-游戏 + // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/CommonStateGame.html + /** + * 1. 公屏消息(已修改) + * 最低版本: v1.1.30.xx + */ + public static final String MG_COMMON_PUBLIC_MESSAGE = "mg_common_public_message"; + + /** + * 1. 公屏消息(已修改) + * 向公屏发送消息,字段含义如下 + * type + * 0 通知 + * 1 提醒 + * 2 结算 + * 3 其他 + * msg + * 内为转义字段: + * + * 其中name/uid/color均为可选字段,字段为空的情况如下: + * + * SDK仅会缓存最新一条。 + */ + @Keep + public static class MGCommonPublicMessage implements Serializable { + // 0 通知 + // 1 提醒 + // 2 结算 + // 3 其他 + public int type; + + // 消息内容 + public List msg; + + @Keep + public static class MGCommonPublicMessageMsg implements Serializable { + // 词组类型 当phrase=1时,会返回text; 当phrase=2时,会返回user + public int phrase; + public MGCommonPublicMessageMsgText text; + public MGCommonPublicMessageMsgUser user; + } + + @Keep + public static class MGCommonPublicMessageMsgText implements Serializable { + @SerializedName(value = "default") + public String defaultStr; // 默认文本 + + @SerializedName(value = "zh-CN") + public String zh_CN; // 中文(简体) + + @SerializedName(value = "zh-HK") + public String zh_HK; // 中文(香港) + + @SerializedName(value = "zh-MO") + public String zh_MO; // 中文(澳门) + + @SerializedName(value = "zh-SG") + public String zh_SG; // 中文(新加坡) + + @SerializedName(value = "zh-TW") + public String zh_TW; // 中文(繁体) + + @SerializedName(value = "en-US") + public String en_US; // 英语(美国) + + @SerializedName(value = "en-GB") + public String en_GB; // 英语(英国) + + @SerializedName(value = "ms-BN") + public String ms_BN; // 马来语(文莱达鲁萨兰) + + @SerializedName(value = "ms-MY") + public String ms_MY; // 马来语(马来西亚) + + @SerializedName(value = "vi-VN") + public String vi_VN; // 越南语 + + @SerializedName(value = "id-ID") + public String id_ID; // 印度尼西亚语 + + @SerializedName(value = "es-ES") + public String es_ES; // 西班牙语(传统) + + @SerializedName(value = "ja-JP") + public String ja_JP; // 日语 + + @SerializedName(value = "ko-KR") + public String ko_KR; // 朝鲜语 + + @SerializedName(value = "th-TH") + public String th_TH; // 泰语 + + @SerializedName(value = "ar-SA") + public String ar_SA; // 阿拉伯语(沙特阿拉伯) + + @SerializedName(value = "ur-PK") + public String ur_PK; // 乌都语 + + @SerializedName(value = "tr-TR") + public String tr_TR; // 土耳其语 + + @SerializedName(value = "pt-PT") + public String pt_PT; // 葡萄语 + + @SerializedName(value = "hi-IN") + public String hi_IN; // 印地语 + + @SerializedName(value = "bn-BD") + public String bn_BD; // 孟加拉语 + + @SerializedName(value = "tl-PH") + public String tl_PH; // 塔加路语(菲律宾) + + @SerializedName(value = "fa-IR") + public String fa_IR; // 波斯语(伊朗) + + @SerializedName(value = "ru-RU") + public String ru_RU; // 俄罗斯语 + } + + @Keep + public static class MGCommonPublicMessageMsgUser implements Serializable { + // 默认内容 + public String defaultStr; + // 用户名称 + public String name; + // 用户id + public String uid; + // 颜色值 + public String color; + } + } + + /** + * 2. 关键词状态 + */ + public static final String MG_COMMON_KEY_WORD_TO_HIT = "mg_common_key_word_to_hit"; + + /** + * 2. 关键词状态 + */ + @Keep + public static class MGCommonKeyWordToHit implements Serializable { + // 必填字段;text:文本包含匹配; number:数字等于匹配(必填字段);默认:text(你画我猜、你说我猜);数字炸弹填number; + public String wordType; + + // 单个关键词,兼容老版本。轮到自己猜词时才有值,否则为null + public String word; + + // 关键词,每一轮都会下发,不区分角色 + public String realWord; + + // 必填字段;关键词列表,可以传送多个关键词。轮到自己猜词时才有值,否则为null + public List wordList; + + // 必填字段;关键词语言,默认:zh-CN; + public String wordLanguage; + } + + /** + * 3. 游戏结算状态 + */ + public static final String MG_COMMON_GAME_SETTLE = "mg_common_game_settle"; + + /** + * 3. 游戏结算状态 + */ + @Keep + public static class MGCommonGameSettle implements Serializable { + // 游戏模式默认为1 + public int gameMode; + + // 本局游戏的id + public String gameRoundId; + + // 游戏结果玩家列表 + public List results; + + /** + * 游戏结果玩家定义 + */ + @Keep + public static class PlayerResult implements Serializable { + public String uid; // 用户id + public int rank; // 排名 从 1 开始 + public int award; // 奖励 + public int score; // 积分 + public int isEscaped; // 是否逃跑 1:逃跑 0:非逃跑 + public String killerId; // 杀自己的玩家的id + public int isAI; // 是否是AI玩家,1为AI + } + } + + /** + * 4. 加入游戏按钮点击状态 + */ + public static final String MG_COMMON_SELF_CLICK_JOIN_BTN = "mg_common_self_click_join_btn"; + + /** + * 4. 加入游戏按钮点击状态 模型 + * 用户(本人)点击加入按钮,或者点击头像加入 + */ + @Keep + public static class MGCommonSelfClickJoinBtn implements Serializable { + // 点击头像加入游戏对应的座位号,int 类型,从0开始, 如果seatIndex=-1,则是随机加入一个空位,如果seatIndex 大于座位数,则加入不成功 + public int seatIndex; + } + + /** + * 5. 取消加入(退出)游戏按钮点击状态 + */ + public static final String MG_COMMON_SELF_CLICK_CANCEL_JOIN_BTN = "mg_common_self_click_cancel_join_btn"; + + /** + * 5. 取消加入(退出)游戏按钮点击状态 模型 + * 用户(本人)点击取消加入按钮 + */ + @Keep + public static class MGCommonSelfClickCancelJoinBtn implements Serializable { + } + + /** + * 6. 准备按钮点击状态 + */ + public static final String MG_COMMON_SELF_CLICK_READY_BTN = "mg_common_self_click_ready_btn"; + + /** + * 6. 准备按钮点击状态 模型 + */ + @Keep + public static class MGCommonSelfClickReadyBtn implements Serializable { + } + + /** + * 7. 取消准备按钮点击状态 + */ + public static final String MG_COMMON_SELF_CLICK_CANCEL_READY_BTN = "mg_common_self_click_cancel_ready_btn"; + + /** + * 7. 取消准备按钮点击状态 模型 + */ + @Keep + public static class MGCommonSelfClickCancelReadyBtn implements Serializable { + } + + /** + * 8. 开始游戏按钮点击状态 + */ + public static final String MG_COMMON_SELF_CLICK_START_BTN = "mg_common_self_click_start_btn"; + + /** + * 8. 开始游戏按钮点击状态 模型 + */ + @Keep + public static class MGCommonSelfClickStartBtn implements Serializable { + } + + /** + * 9. 分享按钮点击状态 + */ + public static final String MG_COMMON_SELF_CLICK_SHARE_BTN = "mg_common_self_click_share_btn"; + + /** + * 9. 分享按钮点击状态 模型 + * 用户(本人)点击分享按钮 + */ + @Keep + public static class MGCommonSelfClickShareBtn implements Serializable { + } + + /** + * 10. 游戏状态 + */ + public static final String MG_COMMON_GAME_STATE = "mg_common_game_state"; + + /** + * 10. 游戏状态 模型 + */ + @Keep + public static class MGCommonGameState implements Serializable { + public static final int UNKNOW = -1; // 未知 + public static final int IDLE = 0; + public static final int LOADING = 1; + public static final int PLAYING = 2; + + // gameState=0 (idle 状态,游戏未开始,空闲状态); + // gameState=1(loading 状态,所有玩家都准备好,队长点击了开始游戏按钮,等待加载游戏场景开始游戏,游戏即将开始提示阶段); + // gameState=2(playing状态,游戏进行中状态) + public int gameState; + } + + /** + * 11. 结算界面关闭按钮点击状态(2021-12-27新增) + */ + public static final String MG_COMMON_SELF_CLICK_GAME_SETTLE_CLOSE_BTN = "mg_common_self_click_game_settle_close_btn"; + + /** + * 11. 结算界面关闭按钮点击状态(2021-12-27新增) 模型 + * 用户(本人)点击结算界面关闭按钮 + */ + @Keep + public static class MGCommonSelfClickGameSettleCloseBtn implements Serializable { + } + + /** + * 12. 结算界面再来一局按钮点击状态(2021-12-27新增) + */ + public static final String MG_COMMON_SELF_CLICK_GAME_SETTLE_AGAIN_BTN = "mg_common_self_click_game_settle_again_btn"; + + /** + * 12. 结算界面再来一局按钮点击状态(2021-12-27新增)模型 + * 用户(本人)点击结算界面再来一局按钮 + */ + @Keep + public static class MGCommonSelfClickGameSettleAgainBtn implements Serializable { + } + + /** + * 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强) + */ + public static final String MG_COMMON_GAME_SOUND_LIST = "mg_common_game_sound_list"; + + /** + * 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强) 模型 + * 游戏上报本游戏中所有的声音资源列表 + */ + @Keep + public static class MGCommonGameSoundList implements Serializable { + // 声音资源列表 + public List list; + + @Keep + public static class MGCommonGameSound implements Serializable { + // 声音资源的名字 + public String name; + // 声音资源的URL链接 + public String url; + // 声音资源类型 + public String type; + } + } + + /** + * 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强) + */ + public static final String MG_COMMON_GAME_SOUND = "mg_common_game_sound"; + + /** + * 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强) 模型 + * 游戏通知app层播放背景音乐的开关状态 + */ + @Keep + public static class MGCommonGameSound implements Serializable { + // 是否播放 isPlay==true(播放),isPlay==false(停止) + public boolean isPlay; + // 要播放的声音文件名,不带后缀 + public String name; + // 声音资源类型 + public String type; + // 播放次数;注:times == 0 为循环播放 + public String times; + // https://www.xxxx.xx/xxx.mp3" 声音资源的url链接 + public String url; + } + + /** + * 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强) + */ + public static final String MG_COMMON_GAME_BG_MUSIC_STATE = "mg_common_game_bg_music_state"; + + /** + * 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强) 模型 + * 游戏通知app层播放背景音乐的开关状态 + */ + @Keep + public static class MGCommonGameBgMusicState implements Serializable { + // 背景音乐的开关状态 true: 开,false: 关 + public boolean state; + } + + /** + * 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强) + */ + public static final String MG_COMMON_GAME_SOUND_STATE = "mg_common_game_sound_state"; + + /** + * 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强) 模型 + * 游戏通知app层播放音效的状态 + */ + @Keep + public static class MGCommonGameSoundState implements Serializable { + // 背景音乐的开关状态 true: 开,false: 关 + public boolean state; + } + + /** + * 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增) + */ + public static final String MG_COMMON_GAME_ASR = "mg_common_game_asr"; + + /** + * 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增) 模型 + */ + @Keep + public static class MGCommonGameASR implements Serializable { + // true:打开语音识别 false:关闭语音识别 + public boolean isOpen; + } + + /** + * 18. 麦克风状态(2022-02-08新增) + */ + public static final String MG_COMMON_SELF_MICROPHONE = "mg_common_self_microphone"; + + /** + * 18. 麦克风状态(2022-02-08新增) 模型 + * 游戏通知app麦克风状态 + */ + @Keep + public static class MGCommonSelfMicrophone implements Serializable { + // 麦克风开关状态 true: 开,false: 关 + public boolean isOn; + } + + /** + * 19. 耳机(听筒,扬声器)状态(2022-02-08新增) + */ + public static final String MG_COMMON_SELF_HEADPHONE = "mg_common_self_headphone"; + + /** + * 19. 耳机(听筒,扬声器)状态(2022-02-08新增) 模型 + */ + @Keep + public static class MGCommonSelfHeadphone implements Serializable { + // 耳机(听筒,喇叭)开关状态 true: 开,false: 关 + public boolean isOn; + } + + /** + * 20. App通用状态操作结果错误码(2022-05-10新增) + */ + public static final String MG_COMMON_APP_COMMON_SELF_X_RESP = "mg_common_app_common_self_x_resp"; + + /** + * 20. App通用状态操作结果错误码(2022-05-10新增) 模型 + */ + @Keep + public static class MGCommonAPPCommonSelfXResp implements Serializable { + public String state; // 字段必填, 参考:游戏业务错误 https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonState.html + public int resultCode; // 字段必填,参考:游戏业务错误 https://docs.sud.tech/zh-CN/app/Server/ErrorCode.html + public boolean isIn; // 当state=app_common_self_in时,字段必填 + public boolean isReady; // 当state=app_common_self_ready时,字段必填 + public boolean isPlaying; // 当state=app_common_self_playing时,字段必填 + public String reportGameInfoExtras; // 当state=app_common_self_playing时,字段必填 + public String curCaptainUID; // 当state=app_common_self_captain时,字段必填 + public String kickedUID; // 当state=app_common_self_kick时,字段必填 + } + + /** + * 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增) + */ + public static final String MG_COMMON_GAME_ADD_AI_PLAYERS = "mg_common_game_add_ai_players"; + + /** + * 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增) 模型 + */ + @Keep + public static class MGCommonGameAddAIPlayers implements Serializable { + public int resultCode; // 返回码 0:成功,非0:不成功 + public List userIds; // 加入成功的playerId列表 + } + + /** + * 22. 游戏通知app层添当前网络连接状态(2022-06-21新增) + */ + public static final String MG_COMMON_GAME_NETWORK_STATE = "mg_common_game_network_state"; + + /** + * 22. 游戏通知app层添当前网络连接状态(2022-06-21新增) 模型 + */ + @Keep + public static class MGCommonGameNetworkState implements Serializable { + public int state; // 0:closed, 1: connected + } + + /** + * 23. 游戏通知app获取积分 + */ + public static final String MG_COMMON_GAME_GET_SCORE = "mg_common_game_get_score"; + + /** + * 23. 游戏通知app获取积分 模型 + */ + @Keep + public static class MGCommonGameGetScore implements Serializable { + } + + /** + * 24. 游戏通知app带入积分 + */ + public static final String MG_COMMON_GAME_SET_SCORE = "mg_common_game_set_score"; + + /** + * 24. 游戏通知app带入积分 模型 + */ + @Keep + public static class MGCommonGameSetScore implements Serializable { + public String roundId; // 局id + public long lastRoundScore; // 本人当前积分 + public long incrementalScore; // 充值积分 + public long totalScore; // 充值后总积分 + } + + /** + * 25. 创建订单 + */ + public static final String MG_COMMON_GAME_CREATE_ORDER = "mg_common_game_create_order"; + + /** + * 25. 创建订单 模型 + */ + @Keep + public static class MGCommonGameCreateOrder implements Serializable { + public String cmd; // 触发的行为动作,比如打赏,购买等 + public String fromUid; // 付费用户uid + public String toUid; // 目标用户uid + public long value; // 所属的游戏价值 + public String payload; // 扩展数据 json 字符串, 特殊可选 + } + + /** + * 26. 游戏通知app玩家角色(仅对狼人杀有效) + */ + public static final String MG_COMMON_PLAYER_ROLE_ID = "mg_common_player_role_id"; + + /** + * 26. 游戏通知app玩家角色(仅对狼人杀有效) 模型 + */ + @Keep + public static class MGCommonPlayerRoleId implements Serializable { + public List playersRoleId; // 列表 + + @Keep + public static class MGCommonPlayerModel implements Serializable { + public String uid; // 玩家id + public int roleId; // 角色id + } + } + + /** + * 27. 游戏通知app玩家被扔便便(你画我猜,你说我猜,友尽闯关有效) + */ + public static final String MG_COMMON_SELF_CLICK_POOP = "mg_common_self_click_poop"; + + /** + * 27. 游戏通知app玩家被扔便便(你画我猜,你说我猜,友尽闯关有效) 模型 + */ + @Keep + public static class MGCommonSelfClickPoop implements Serializable { + } + + /** + * 28. 游戏通知app玩家被点赞(你画我猜,你说我猜,友尽闯关有效) + */ + public static final String MG_COMMON_SELF_CLICK_GOOD = "mg_common_self_click_good"; + + /** + * 28. 游戏通知app玩家被点赞(你画我猜,你说我猜,友尽闯关有效) 模型 + */ + @Keep + public static class MGCommonSelfClickGood implements Serializable { + } + + /** + * 29. 游戏通知app游戏FPS(仅对碰碰,多米诺骨牌,飞镖达人生效) + */ + public static final String MG_COMMON_GAME_FPS = "mg_common_game_fps"; + + /** + * 29. 游戏通知app游戏FPS(仅对碰碰,多米诺骨牌,飞镖达人生效) 模型 + */ + @Keep + public static class MGCommonGameFps implements Serializable { + public int fps; + } + + /** + * 30. 游戏通知app游戏弹框 + */ + public static final String MG_COMMON_ALERT = "mg_common_alert"; + + /** + * 30. 游戏通知app游戏弹框 模型 + */ + @Keep + public static class MGCommonAlert implements Serializable { + public String state; // show:显示,close:关闭 + } + + /** + * 31. 游戏通知app最坑队友(只支持友尽闯关) + */ + public static final String MG_COMMON_WORST_TEAMMATE = "mg_common_worst_teammate"; + + /** + * 31. 游戏通知app最坑队友(只支持友尽闯关) 模型 + */ + @Keep + public static class MGCommonWorstTeammate implements Serializable { + public String uid; // 最坑队友的uid + } + + /** + * 32. 游戏通知app因玩家逃跑导致游戏结束(只支持友尽闯关) + */ + public static final String MG_COMMON_GAME_OVER_TIP = "mg_common_game_over_tip"; + + /** + * 32. 游戏通知app因玩家逃跑导致游戏结束(只支持友尽闯关) 模型 + */ + @Keep + public static class MGCommonGameOverTip implements Serializable { + public List uids; // 逃跑玩家的uid数组 + } + + /** + * 33. 游戏通知app玩家颜色(只支持友尽闯关) + */ + public static final String MG_COMMON_GAME_PLAYER_COLOR = "mg_common_game_player_color"; + + /** + * 33. 游戏通知app玩家颜色(只支持友尽闯关) 模型 + */ + @Keep + public static class MGCommonGamePlayerColor implements Serializable { + public List players; + + @Keep + public static class PlayerColorModel { + public String uid; // 用户id + public int color; // color:1是粉色,2是紫色,3是绿色,4是蓝色,5是黄色,6是橙色 + } + } + + /** + * 34. 游戏通知app玩家头像的坐标(只支持ludo) + */ + public static final String MG_COMMON_GAME_PLAYER_ICON_POSITION = "mg_common_game_player_icon_position"; + + /** + * 34. 游戏通知app玩家头像的坐标(只支持ludo) 模型 + */ + @Keep + public static class MGCommonGamePlayerIconPosition implements Serializable { + public String uid; + public PlayerIconPositionModel position; + + @Keep + public static class PlayerIconPositionModel { + // 头像坐标和宽高,坐标为头像中心 + public double x; + public double y; + public double width; + public double height; + } + } + + /** + * 35. 游戏通知app退出游戏(只支持teenpattipro 与 德州pro) + */ + public static final String MG_COMMON_SELF_CLICK_EXIT_GAME_BTN = "mg_common_self_click_exit_game_btn"; + + /** + * 35. 游戏通知app退出游戏(只支持teenpattipro 与 德州pro) 模型 + */ + @Keep + public static class MGCommonSelfClickExitGameBtn implements Serializable { + } + + /** + * 36. 游戏通知app是否要开启带入积分(只支持teenpattipro 与 德州pro) + */ + public static final String MG_COMMON_GAME_IS_APP_CHIP = "mg_common_game_is_app_chip"; + + /** + * 36. 游戏通知app是否要开启带入积分(只支持teenpattipro 与 德州pro) 模型 + */ + @Keep + public static class MGCommonGameIsAppChip implements Serializable { + public int isAppChip; // 0:不开启,1:开启 + } + + /** + * 37. 游戏通知app当前游戏的设置信息(只支持德州pro,teenpatti pro) + */ + public static final String MG_COMMON_GAME_RULE = "mg_common_game_rule"; + + /** + * 37. 游戏通知app当前游戏的设置信息(只支持德州pro,teenpatti pro) 模型 + */ + @Keep + public static class MGCommonGameRule implements Serializable { + public GameRuleModel gameMode; + + // 德州与teenpatti的结构融合在一起 + @Keep + public static class GameRuleModel { + public Integer smallBlind; // 小盲 + public Integer ante; // 前注 + public Integer isStraddle; // 0:关闭,1自由,2强制 + public Integer sBuyIn; // 带入值/最小带入配置 + public Integer bBuyIn; // 最大带入,无限(0) + public Integer isAutoStart; // 是否自动开始 + public Double tableDuration; // 牌桌时长配置(小时) + public Integer thinkTime; // 思考时间(秒) + public Integer darkCard; // 暗牌回合 + public Integer potLimit; // 最大带入 + public Integer round; // 最大回合 + public Integer singleLimit; // 单注限 + } + } + + /** + * 38. 游戏通知app进行玩法设置(只支持德州pro,teenpatti pro) + */ + public static final String MG_COMMON_GAME_SETTINGS = "mg_common_game_settings"; + + /** + * 38. 游戏通知app进行玩法设置(只支持德州pro,teenpatti pro) 模型 + */ + @Keep + public static class MGCommonGameSettings implements Serializable { + } + + /** + * 39. 游戏通知app钱币不足(只支持德州pro,teenpatti pro) + */ + public static final String MG_COMMON_GAME_MONEY_NOT_ENOUGH = "mg_common_game_money_not_enough"; + + /** + * 39. 游戏通知app钱币不足(只支持德州pro,teenpatti pro) 模型 + */ + @Keep + public static class MGCommonGameMoneyNotEnough implements Serializable { + } + + /** + * 40. 游戏通知app下发定制ui配置表(只支持ludo) + */ + public static final String MG_COMMON_GAME_UI_CUSTOM_CONFIG = "mg_common_game_ui_custom_config"; + + /** + * 40. 游戏通知app下发定制ui配置表(只支持ludo) 模型 + */ + @Keep + public static class MGCommonGameUiCustomConfig implements Serializable { + } + + /** + * 41. 设置app提供给游戏可点击区域(赛车) + */ + public static final String MG_COMMON_SET_CLICK_RECT = "mg_common_set_click_rect"; + + /** + * 41. 设置app提供给游戏可点击区域(赛车) 模型 + */ + @Keep + public static class MGCommonSetClickRect implements Serializable { + public List list; // 游戏的点击区域 + } + + /** + * 42. 通知app提供对应uids列表玩家的数据(赛车) + */ + public static final String MG_COMMON_USERS_INFO = "mg_common_users_info"; + + /** + * 42. 通知app提供对应uids列表玩家的数据(赛车) 模型 + */ + @Keep + public static class MGCommonUsersInfo implements Serializable { + public List uids; + } + + /** + * 43. 通知app游戏前期准备完成(赛车) + */ + public static final String MG_COMMON_GAME_PREPARE_FINISH = "mg_common_game_prepare_finish"; + + /** + * 43. 通知app游戏前期准备完成(赛车) 模型 + */ + @Keep + public static class MGCommonGamePrepareFinish implements Serializable { + } + + /** + * 44. 通知app游戏主界面已显示(赛车) + */ + public static final String MG_COMMON_SHOW_GAME_SCENE = "mg_common_show_game_scene"; + + /** + * 44. 通知app游戏主界面已显示(赛车) 模型 + */ + @Keep + public static class MGCommonShowGameScene implements Serializable { + } + + /** + * 45. 通知app游戏主界面已隐藏(赛车) + */ + public static final String MG_COMMON_HIDE_GAME_SCENE = "mg_common_hide_game_scene"; + + /** + * 45. 通知app游戏主界面已隐藏(赛车) 模型 + */ + @Keep + public static class MGCommonHideGameScene implements Serializable { + } + + /** + * 46. 通知app点击了游戏的金币按钮(赛车) + */ + public static final String MG_COMMON_SELF_CLICK_GOLD_BTN = "mg_common_self_click_gold_btn"; + + /** + * 46. 通知app点击了游戏的金币按钮(赛车) 模型 + */ + @Keep + public static class MGCommonSelfClickGoldBtn implements Serializable { + } + + /** + * 47. 通知app棋子到达终点(ludo) + */ + public static final String MG_COMMON_GAME_PIECE_ARRIVE_END = "mg_common_game_piece_arrive_end"; + + /** + * 47. 通知app棋子到达终点(ludo) 模型 + */ + @Keep + public static class MGCommonGamePieceArriveEnd implements Serializable { + public String uid; // 玩家id + public int pieceIndex; // 棋子编号 0 ~ 3 + } + + /** + * 48. 通知app玩家是否托管 + */ + public static final String MG_COMMON_GAME_PLAYER_MANAGED_STATE = "mg_common_game_player_managed_state"; + + /** + * 48. 通知app玩家是否托管 模型 + */ + @Keep + public static class MGCommonGamePlayerManagedState implements Serializable { + public String uid; // 玩家id + public int managed; // 0: 未托管 1:托管 + } + + /** + * 49. 游戏向app发送爆词 + */ + public static final String MG_COMMON_GAME_SEND_BURST_WORD = "mg_common_game_send_burst_word"; + + /** + * 49. 游戏向app发送爆词 模型 + */ + @Keep + public static class MGCommonGameSendBurstWord implements Serializable { + public String text; // 爆词 + } + + /** + * 50. 游戏向app发送玩家实时排名(只支持怪物消消乐) + */ + public static final String MG_COMMON_GAME_PLAYER_RANKS = "mg_common_game_player_ranks"; + + /** + * 50. 游戏向app发送玩家实时排名(只支持怪物消消乐) 模型 + */ + @Keep + public static class MGCommonGamePlayerRanks implements Serializable { + public List ranks; // 所有玩家排名变化推送 + + @Keep + public static class RanksModel implements Serializable { + public String uid; // 用户id + public int rank; // 排名 + } + } + + /** + * 51. 游戏向app发送玩家即时变化的单双牌(只支持okey101) + */ + public static final String MG_COMMON_GAME_PLAYER_PAIR_SINGULAR = "mg_common_game_player_pair_singular"; + + /** + * 51. 游戏向app发送玩家即时变化的单双牌(只支持okey101) 模型 + */ + @Keep + public static class MGCommonGamePlayerPairSingular implements Serializable { + public List pairs; // 玩家单双牌推送 + + @Keep + public static class SingularModel implements Serializable { + public String uid; // 用户id + public int pair; // pair: 1 双,0 单 + } + } + + /** + * 52. 游戏向app发送获取玩家持有的道具卡(只支持大富翁) + */ + public static final String MG_COMMON_GAME_PLAYER_MONOPOLY_CARDS = "mg_common_game_player_monopoly_cards"; + + /** + * 52. 游戏向app发送获取玩家持有的道具卡(只支持大富翁) 模型 + */ + @Keep + public static class MGCommonGamePlayerMonopolyCards implements Serializable { + } + + /** + * 53. 游戏向app发送玩家实时积分(只支持怪物消消乐) + */ + public static final String MG_COMMON_GAME_PLAYER_SCORES = "mg_common_game_player_scores"; + + /** + * 53. 游戏向app发送玩家实时积分(只支持怪物消消乐) 模型 + */ + @Keep + public static class MGCommonGamePlayerScores implements Serializable { + public List scores; // 所有玩家积分变化推送 + + @Keep + public static class ScoresModel implements Serializable { + public String uid; // 用户id + public int score; // 积分 + } + } + + /** + * 54. 游戏通知app销毁游戏(只支持部分概率类游戏) + */ + public static final String MG_COMMON_DESTROY_GAME_SCENE = "mg_common_destroy_game_scene"; + + /** + * 54. 游戏通知app销毁游戏(只支持部分概率类游戏) 模型 + */ + @Keep + public static class MGCommonDestroyGameScene implements Serializable { + } + + /** + * 55. 游戏通知app击球状态(只支持桌球) + */ + public static final String MG_COMMON_GAME_BILLIARDS_HIT_STATE = "mg_common_game_billiards_hit_state"; + + /** + * 55. 游戏通知app击球状态(只支持桌球) 模型 + */ + @Keep + public static class MGCommonGameBilliardsHitState implements Serializable { + public String uid; // 操作玩家的id + /** + * state状态说明: + * 0: 母球击空或者第一击没击中目标球 + * 2-7: 连杆 + * 8: 白球进洞 + * 9: 没有足够的撞库数量 + * 10: 开球时进了黑八 + * 11: 提前进了黑八 + * 12: 没有有效进球 + * 13: 有有效进球 + * 14: 超时 + */ + public int state; + } + + /** + * 56. 游戏向app发送获取玩家持有的指定点数道具卡(只支持飞行棋) + */ + public static final String MG_COMMON_GAME_PLAYER_PROPS_CARDS = "mg_common_game_player_props_cards"; + + /** + * 56. 游戏向app发送获取玩家持有的指定点数道具卡(只支持飞行棋) 模型 + */ + @Keep + public static class MGCommonGamePlayerPropsCards implements Serializable { + } + + // endregion 通用状态-游戏 + + // region MG状态机-通用状态-玩家 + // 参考:https://docs.sud.tech/zh-CN/app/Client/MGFSM/CommonStatePlayer.html + + /** + * 1.加入状态(已修改) + * 最低版本: v1.1.30.xx + */ + public static final String MG_COMMON_PLAYER_IN = "mg_common_player_in"; + + /** + * 1.加入状态(已修改) 模型 + * 用户是否加入游戏; + * 游戏开始后,未加入的用户为OB视角。 + */ + @Keep + public static class MGCommonPlayerIn implements Serializable { + // true 已加入,false 未加入 + public boolean isIn; + + // 加入哪支队伍 + public int teamId; + + // 当isIn==false时有效;0 主动退出,1 被踢;(reason默认-1,无意义便于处理) + public int reason; + + // 当reason==1时有效;kickUID为踢人的用户uid;判断被踢的人是本人条件(onPlayerStateChange(userId==kickedUID == selfUID);(kickUID默认"",无意义便于处理) + public String kickUID; + } + + /** + * 2.准备状态(已修改) + * 最低版本: v1.1.30.xx + */ + public static final String MG_COMMON_PLAYER_READY = "mg_common_player_ready"; + + /** + * 2.准备状态(已修改) 模型 + * 用户是否为队长,队长在游戏中会有开始游戏的权利。 + */ + @Keep + public static class MGCommonPlayerReady implements Serializable { + // 当retCode==0时有效;true 已准备,false 未准备 + public boolean isReady; + } + + /** + * 3.队长状态(已修改) + * 最低版本: v1.1.30.xx + */ + public static final String MG_COMMON_PLAYER_CAPTAIN = "mg_common_player_captain"; + + /** + * 3.队长状态(已修改) 模型 + * 用户是否为队长,队长在游戏中会有开始游戏的权利。 + */ + @Keep + public static class MGCommonPlayerCaptain implements Serializable { + // true 是队长,false 不是队长; + public boolean isCaptain; + } + + /** + * 4.游戏状态(已修改) + * 最低版本: v1.1.30.xx + */ + public static final String MG_COMMON_PLAYER_PLAYING = "mg_common_player_playing"; + + /** + * 4.游戏状态(已修改)模型 + * 用户游戏状态,如果用户在游戏中,建议: + * a.空出屏幕中心区: + * 关闭全屏礼物特效; + * b.部分强操作类小游戏(spaceMax为true),尽量收缩原生UI,给游戏留出尽量大的操作空间: + * 收缩公屏; + * 收缩麦位; + * 如果不在游戏中,则恢复。 + */ + @Keep + public static class MGCommonPlayerPlaying implements Serializable { + // true 游戏中,false 未在游戏中; + public boolean isPlaying; + // 本轮游戏id,当isPlaying==true时有效 + public String gameRoundId; + // 当isPlaying==false时有效;isPlaying=false, 0:正常结束 1:提前结束(自己不玩了)2:无真人可以提前结束(无真人,只有机器人) 3:所有人都提前结束;(reason默认-1,无意义便于处理) + public int reason; + // true 建议尽量收缩原生UI,给游戏留出尽量大的操作空间 false 初始状态; + public Boolean spaceMax; + } + + /** + * 5.玩家在线状态 + */ + public static final String MG_COMMON_PLAYER_ONLINE = "mg_common_player_online"; + + /** + * 5.玩家在线状态 模型 + */ + @Keep + public static class MGCommonPlayerOnline implements Serializable { + // true:在线,false: 离线 + public boolean isOnline; + } + + /** + * 6.玩家换游戏位状态 + */ + public static final String MG_COMMON_PLAYER_CHANGE_SEAT = "mg_common_player_change_seat"; + + /** + * 6.玩家换游戏位状态 模型 + */ + @Keep + public static class MGCommonPlayerChangeSeat implements Serializable { + // 换位前的游戏位(座位号) + public int preSeatIndex; + // 换位成功后的游戏位(座位号) + public int currentSeatIndex; + } + + /** + * 7. 游戏通知app点击玩家头像 + */ + public static final String MG_COMMON_SELF_CLICK_GAME_PLAYER_ICON = "mg_common_self_click_game_player_icon"; + + /** + * 7. 游戏通知app点击玩家头像 模型 + */ + @Keep + public static class MGCommonSelfClickGamePlayerIcon implements Serializable { + // 被点击头像的用户id + public String uid; + } + + /** + * 8. 游戏通知app玩家死亡状态(2022-04-24新增) + */ + public static final String MG_COMMON_SELF_DIE_STATUS = "mg_common_self_die_status"; + + /** + * 8. 游戏通知app玩家死亡状态(2022-04-24新增)模型 + */ + @Keep + public static class MGCommonSelfDieStatus implements Serializable { + public String uid; // 用户id + public boolean isDeath; // 玩家是否死亡 true:死亡, false: 未死亡;默认 false + } + + /** + * 9. 游戏通知app轮到玩家出手状态(2022-04-24新增) + */ + public static final String MG_COMMON_SELF_TURN_STATUS = "mg_common_self_turn_status"; + + /** + * 9. 游戏通知app轮到玩家出手状态(2022-04-24新增)模型 + */ + @Keep + public static class MGCommonSelfTurnStatus implements Serializable { + public String uid; // 用户id + public boolean isTurn; // 是否轮到玩家出手 true:是上面uid玩家的出手回合, false: 不是上面uid玩家的出手回合;默认false + } + + /** + * 10. 游戏通知app玩家选择状态(2022-04-24新增) + */ + public static final String MG_COMMON_SELF_SELECT_STATUS = "mg_common_self_select_status"; + + /** + * 10. 游戏通知app玩家选择状态(2022-04-24新增)模型 + */ + @Keep + public static class MGCommonSelfSelectStatus implements Serializable { + public String uid; // 用户id + public boolean isSelected; // 玩家是否选择 true:选择, false: 未选择; 默认false + } + + /** + * 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效) + */ + public static final String MG_COMMON_GAME_COUNTDOWN_TIME = "mg_common_game_countdown_time"; + + /** + * 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效)模型 + */ + @Keep + public static class MGCommonGameCountdownTime implements Serializable { + public int countdown;// 剩余时间,单位为秒 + } + + /** + * 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效) + */ + public static final String MG_COMMON_SELF_OB_STATUS = "mg_common_self_ob_status"; + + /** + * 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效)模型 + */ + @Keep + public static class MGCommonSelfObStatus implements Serializable { + public boolean isOb;// 是否成为ob视角 + } + + // endregion 通用状态-玩家 + + + // region 碰碰我最强 + // endregion 碰碰我最强 + + // region 飞刀达人 + // endregion 飞刀达人 + + // region 你画我猜 + // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/DrawGuess.html + + /** + * 1. 选词中状态(已修改) + */ + public static final String MG_DG_SELECTING = "mg_dg_selecting"; + + /** + * 1. 选词中状态(已修改) 模型 + * 选词中,头像正下方 + */ + @Keep + public static class MGDGSelecting implements Serializable { + // bool 类型 true:正在选词中,false: 不在选词中 + public boolean isSelecting; + } + + /** + * 2. 作画中状态(已修改) + */ + public static final String MG_DG_PAINTING = "mg_dg_painting"; + + /** + * 2. 作画中状态(已修改) 模型 + * 作画中,头像正下方 + */ + @Keep + public static class MGDGPainting implements Serializable { + // true: 绘画中,false: 取消绘画 + public boolean isPainting; + } + + /** + * 3. 显示错误答案状态(已修改) + */ + public static final String MG_DG_ERRORANSWER = "mg_dg_erroranswer"; + + /** + * 3. 显示错误答案状态(已修改) 模型 + * 错误的答案,最多6中文,头像正下方 + */ + @Keep + public static class MGDGErroranswer implements Serializable { + // 字符串类型,展示错误答案 + public String msg; + } + + /** + * 4. 显示总积分状态(已修改) + */ + public static final String MG_DG_TOTALSCORE = "mg_dg_totalscore"; + + /** + * 4. 显示总积分状态(已修改) 模型 + * 总积分,位于头像右上角 + */ + @Keep + public static class MGDGTotalscore implements Serializable { + // 字符串类型 总积分 + public String msg; + } + + /** + * 5. 本次获得积分状态(已修改) + */ + public static final String MG_DG_SCORE = "mg_dg_score"; + + /** + * 5. 本次获得积分状态(已修改) 模型 + * 本次积分,头像正下方 + */ + @Keep + public static final class MGDGScore implements Serializable { + // string类型,展示本次获得积分 + public String msg; + } + + // endregion 你画我猜 + + // region 元宇宙砂砂舞 + /** + * 1. 元宇宙砂砂舞指令回调 + */ + public static final String MG_COMMON_GAME_DISCO_ACTION = "mg_common_game_disco_action"; + + /** + * 1. 元宇宙砂砂舞指令回调 模型 + * app指令请求游戏客户端成功与否的回调 + */ + @Keep + public static final class MGCommonGameDiscoAction implements Serializable { + public int actionId; // 指令序号类型 + public boolean isSuccess; // true 指令成功,false 指令失败 + } + + /** + * 2. 元宇宙砂砂舞指令动作结束通知 + */ + public static final String MG_COMMON_GAME_DISCO_ACTION_END = "mg_common_game_disco_action_end"; + + /** + * 2. 元宇宙砂砂舞指令动作结束通知 模型 + * 游戏客户端通知APP指令动作结束 + */ + @Keep + public static final class MGCommonGameDiscoActionEnd implements Serializable { + public int actionId; // 指令序号类型 + public String playerId; // // 玩家ID string 类型 + } + // endregion 元宇宙砂砂舞 + + // region 定制火箭 + /** + * 1. 礼物配置文件(火箭) + */ + public static final String MG_CUSTOM_ROCKET_CONFIG = "mg_custom_rocket_config"; + + /** + * 1. 礼物配置文件(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketConfig implements Serializable { + } + + /** + * 2. 拥有模型列表(火箭) + */ + public static final String MG_CUSTOM_ROCKET_MODEL_LIST = "mg_custom_rocket_model_list"; + + /** + * 2. 拥有模型列表(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketModelList implements Serializable { + } + + /** + * 3. 拥有组件列表(火箭) + */ + public static final String MG_CUSTOM_ROCKET_COMPONENT_LIST = "mg_custom_rocket_component_list"; + + /** + * 3. 拥有组件列表(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketComponentList implements Serializable { + } + + /** + * 4. 获取用户信息(火箭) + */ + public static final String MG_CUSTOM_ROCKET_USER_INFO = "mg_custom_rocket_user_info"; + + /** + * 4. 获取用户信息 模型 + */ + @Keep + public static final class MGCustomRocketUserInfo implements Serializable { + public List userIdList; + } + + /** + * 5. 订单记录列表(火箭) + */ + public static final String MG_CUSTOM_ROCKET_ORDER_RECORD_LIST = "mg_custom_rocket_order_record_list"; + + /** + * 5. 订单记录列表(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketOrderRecordList implements Serializable { + public int pageIndex; // 第几页 + public int pageSize; // 每页多少条数据 + } + + /** + * 6. 展馆内列表(火箭) + */ + public static final String MG_CUSTOM_ROCKET_ROOM_RECORD_LIST = "mg_custom_rocket_room_record_list"; + + /** + * 6. 展馆内列表(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketRoomRecordList implements Serializable { + public int pageIndex; // 第几页 + public int pageSize; // 每页多少条数据 + } + + /** + * 7. 展馆内玩家送出记录(火箭) + */ + public static final String MG_CUSTOM_ROCKET_USER_RECORD_LIST = "mg_custom_rocket_user_record_list"; + + /** + * 7. 展馆内玩家送出记录(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketUserRecordList implements Serializable { + public String userId; // 用户id + public int pageIndex; // 第几页 + public int pageSize; // 每页多少条数据 + } + + /** + * 8. 设置默认模型(火箭) + */ + public static final String MG_CUSTOM_ROCKET_SET_DEFAULT_MODEL = "mg_custom_rocket_set_default_model"; + + /** + * 8. 设置默认模型(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketSetDefaultModel implements Serializable { + public String modelId; // 默认模型 + } + + /** + * 9. 动态计算一键发送价格(火箭) + */ + public static final String MG_CUSTOM_ROCKET_DYNAMIC_FIRE_PRICE = "mg_custom_rocket_dynamic_fire_price"; + + /** + * 9. 动态计算一键发送价格(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketDynamicFirePrice implements Serializable { + public List componentList; // 组件列表 + + @Keep + public static class ComponentModel { + public String itemId; // 已购买的唯一标识 + } + } + + /** + * 10. 一键发送(火箭) + */ + public static final String MG_CUSTOM_ROCKET_FIRE_MODEL = "mg_custom_rocket_fire_model"; + + /** + * 10. 一键发送(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketFireModel implements Serializable { + public List componentList; // 组件列表 + + @Keep + public static class ComponentModel { + public int type; // 类型 + public String itemId; // 已购买的唯一标识 + } + } + + /** + * 11. 新组装模型(火箭) + */ + public static final String MG_CUSTOM_ROCKET_CREATE_MODEL = "mg_custom_rocket_create_model"; + + /** + * 11. 新组装模型(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketCreateModel implements Serializable { + public List componentList; // 组件列表 + + @Keep + public static class ComponentModel { + public String itemId; // 模型Id + } + } + + /** + * 12. 模型更换组件(火箭) + */ + public static final String MG_CUSTOM_ROCKET_REPLACE_COMPONENT = "mg_custom_rocket_replace_component"; + + /** + * 12. 模型更换组件(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketReplaceComponent implements Serializable { + public String modelId; // 模型ID + public List componentList; // 组件列表 + + @Keep + public static class ComponentModel { + public String itemId; // 已购买的唯一标识 + } + } + + /** + * 13. 购买组件(火箭) + */ + public static final String MG_CUSTOM_ROCKET_BUY_COMPONENT = "mg_custom_rocket_buy_component"; + + /** + * 13. 购买组件(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketBuyComponent implements Serializable { + public List componentList; // 组件列表 + + @Keep + public static class ComponentModel { + public String componentId; // 已购买的唯一标识 + public String value; // 值 + } + } + + /** + * 14. 播放效果开始(火箭) + */ + public static final String MG_CUSTOM_ROCKET_PLAY_EFFECT_START = "mg_custom_rocket_play_effect_start"; + + /** + * 14. 播放效果开始(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketPlayEffectStart implements Serializable { + } + + /** + * 15. 播放效果完成(火箭) + */ + public static final String MG_CUSTOM_ROCKET_PLAY_EFFECT_FINISH = "mg_custom_rocket_play_effect_finish"; + + /** + * 15. 播放效果完成(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketPlayEffectFinish implements Serializable { + } + + /** + * 16. 验证签名合规(火箭) + */ + public static final String MG_CUSTOM_ROCKET_VERIFY_SIGN = "mg_custom_rocket_verify_sign"; + + /** + * 16. 验证签名合规(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketVerifySign implements Serializable { + public String sign; // 验证的内容 + } + + /** + * 17. 上传icon(火箭) + */ + public static final String MG_CUSTOM_ROCKET_UPLOAD_MODEL_ICON = "mg_custom_rocket_upload_model_icon"; + + /** + * 17. 上传icon(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketUploadModelIcon implements Serializable { + public String data; // 图片base64数据 + } + + /** + * 18. 前期准备完成(火箭) + * 表示app此时可以向火箭发出指令了 + */ + public static final String MG_CUSTOM_ROCKET_PREPARE_FINISH = "mg_custom_rocket_prepare_finish"; + + /** + * 18. 前期准备完成(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketPrepareFinish implements Serializable { + } + + /** + * 19. 火箭主界面已显示(火箭) + */ + public static final String MG_CUSTOM_ROCKET_SHOW_GAME_SCENE = "mg_custom_rocket_show_game_scene"; + + /** + * 19. 火箭主界面已显示(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketShowGameScene implements Serializable { + } + + /** + * 20. 火箭主界面已隐藏(火箭) + */ + public static final String MG_CUSTOM_ROCKET_HIDE_GAME_SCENE = "mg_custom_rocket_hide_game_scene"; + + /** + * 20. 火箭主界面已隐藏(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketHideGameScene implements Serializable { + } + + /** + * 21. 点击锁住组件(火箭) + */ + public static final String MG_CUSTOM_ROCKET_CLICK_LOCK_COMPONENT = "mg_custom_rocket_click_lock_component"; + + /** + * 21. 点击锁住组件(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketClickLockComponent implements Serializable { + public int type; // 组件类型 + public String componentId; // 组件ID + } + + /** + * 22. 火箭效果飞行点击(火箭) + */ + public static final String MG_CUSTOM_ROCKET_FLY_CLICK = "mg_custom_rocket_fly_click"; + + /** + * 22. 火箭效果飞行点击(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketFlyClick implements Serializable { + } + + /** + * 23. 火箭效果飞行结束(火箭) + */ + public static final String MG_CUSTOM_ROCKET_FLY_END = "mg_custom_rocket_fly_end"; + + /** + * 23. 火箭效果飞行结束(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketFlyEnd implements Serializable { + public long clickNumber; // 点击多少次 + public long flyNumber; // 飞行多远 + } + + /** + * 24. 设置点击区域(火箭) + */ + public static final String MG_CUSTOM_ROCKET_SET_CLICK_RECT = "mg_custom_rocket_set_click_rect"; + + /** + * 24. 设置点击区域(火箭) 模型 + */ + @Keep + public static final class MGCustomRocketSetClickRect implements Serializable { + public List list; // 游戏的点击区域 + } + + /** + * 25. 颜色和签名自定义改到装配间的模式,保存颜色或签名 + */ + public static final String MG_CUSTOM_ROCKET_SAVE_SIGN_COLOR = "mg_custom_rocket_save_sign_color"; + + /** + * 25. 颜色和签名自定义改到装配间的模式,保存颜色或签名 模型 + */ + @Keep + public static final class MGCustomRocketSaveSignColor implements Serializable { + public List componentList; + + @Keep + public static class ComponentModel { + public String componentId; // 组件的ID + public String value; // 颜色值,采用十六进制 + public String modelId; // 模型id (更新模型时使用) + } + } + // endregion 定制火箭 + + // region 棒球 + /** + * 1. 设置界面默认状态(棒球) + */ + public static final String MG_BASEBALL_DEFUALT_STATE = "mg_baseball_defualt_state"; + + /** + * 1. 设置界面默认状态(棒球) 模型 + */ + @Keep + public static final class MGBaseballDefaultState implements Serializable { + } + + /** + * 2. 前期准备完成(棒球) + * 游戏客户端通知APP指令动作前期准备完成 + */ + public static final String MG_BASEBALL_PREPARE_FINISH = "mg_baseball_prepare_finish"; + + /** + * 2. 前期准备完成(棒球) 模型 + */ + @Keep + public static final class MGBaseballPrepareFinish implements Serializable { + } + + /** + * 3. 主界面已显示(棒球) + * 游戏客户端通知APP指令动作主界面已显示 + */ + public static final String MG_BASEBALL_SHOW_GAME_SCENE = "mg_baseball_show_game_scene"; + + /** + * 3. 主界面已显示(棒球) 模型 + */ + @Keep + public static final class MGBaseballShowGameScene implements Serializable { + } + + /** + * 4. 主界面已隐藏(棒球) + * 游戏客户端通知APP指令动作主界面已隐藏 + */ + public static final String MG_BASEBALL_HIDE_GAME_SCENE = "mg_baseball_hide_game_scene"; + + /** + * 4. 主界面已隐藏(棒球) 模型 + */ + @Keep + public static final class MGBaseballHideGameScene implements Serializable { + } + + /** + * 5. 查询排行榜数据(棒球) + * 游戏客户端通知APP查询排行榜数据 + */ + public static final String MG_BASEBALL_RANKING = "mg_baseball_ranking"; + + /** + * 5. 查询排行榜数据(棒球) 模型 + */ + @Keep + public static final class MGBaseballRanking implements Serializable { + public int page; // 页数 + public int size; // 每页显示的数量 + } + + /** + * 6. 查询我的排名(棒球) + * 游戏客户端通知APP查询我的排名 + */ + public static final String MG_BASEBALL_MY_RANKING = "mg_baseball_my_ranking"; + + /** + * 6. 查询我的排名(棒球) 模型 + */ + @Keep + public static final class MGBaseballMyRanking implements Serializable { + } + + /** + * 7. 查询当前距离我的前后玩家数据(棒球) + * 游戏客户端通知APP查询当前距离我的前后玩家数据(需要排除自己) + */ + public static final String MG_BASEBALL_RANGE_INFO = "mg_baseball_range_info"; + + /** + * 7. 查询当前距离我的前后玩家数据(棒球) 模型 + */ + @Keep + public static final class MGBaseballRangeInfo implements Serializable { + public long distance; // 自己当前的距离 + } + + /** + * 8. 设置app提供给游戏可点击区域(棒球) + * 游戏客户端通知APP指令动作设置点击区域 + */ + public static final String MG_BASEBALL_SET_CLICK_RECT = "mg_baseball_set_click_rect"; + + /** + * 8. 设置app提供给游戏可点击区域(棒球) 模型 + */ + @Keep + public static final class MGBaseballSetClickRect implements Serializable { + public List list; + } + + /** + * 9. 获取文本配置数据(棒球) + */ + public static final String MG_BASEBALL_TEXT_CONFIG = "mg_baseball_text_config"; + + /** + * 9. 获取文本配置数据(棒球) 模型 + */ + @Keep + public static final class MGBaseballTextConfig implements Serializable { + } + + /** + * 10. 球落地, 通知距离(棒球) + */ + public static final String MG_BASEBALL_SEND_DISTANCE = "mg_baseball_send_distance"; + + /** + * 10. 球落地, 通知距离(棒球) 模型 + */ + @Keep + public static final class MGBaseballSendDistance implements Serializable { + public int[] distances; + } + // endregion 棒球 + + /** + * 点击区域定义 + */ + @Keep + public static class InteractionClickRect { + public float x; // 区域的x + public float y; // 区域的y + public float width; // 区域的width + public float height; // 区域的height + } + + // region 3D语聊房 + /** + * 1. 请求房间数据 + */ + public static final String MG_CUSTOM_CR_ROOM_INIT_DATA = "mg_custom_cr_room_init_data"; + + /** + * 1. 请求房间数据 模型 + */ + @Keep + public static final class MGCustomCrRoomInitData implements Serializable { + } + + /** + * 2. 点击主播位或老板位通知 + */ + public static final String MG_CUSTOM_CR_CLICK_SEAT = "mg_custom_cr_click_seat"; + + /** + * 2. 点击主播位或老板位通知 模型 + */ + @Keep + public static final class MGCustomCrClickSeat implements Serializable { + public int seatIndex; // 0~4一共5个麦位,0为老板位,1~4为四个面主播位 + } + // endregion 3D语聊房 + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/GameCommonStateUtils.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/GameCommonStateUtils.java new file mode 100644 index 0000000..0c61571 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/GameCommonStateUtils.java @@ -0,0 +1,138 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.utils; + +import android.text.TextUtils; + +import com.chwl.core.sud.state.SudMGPMGState; + +/** + * 游戏通用状态工具类 + */ +public class GameCommonStateUtils { + + /** + * 解析公屏消息 + * + * @param publicMessage 游戏发送过来的公屏消息对象 + * @param languageCode 需要提取的语言,比如zh-CN、en-US等等 + * @return 拼接起来的公屏文本 + */ + public static String parseMGCommonPublicMessage(SudMGPMGState.MGCommonPublicMessage publicMessage, String languageCode) { + if (publicMessage == null || publicMessage.msg == null || publicMessage.msg.size() == 0) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 解析数组,拼接消息 + for (SudMGPMGState.MGCommonPublicMessage.MGCommonPublicMessageMsg msgModel : publicMessage.msg) { + switch (msgModel.phrase) { // 词组类型 当phrase=1时,会返回text; 当phrase=2时,会返回user + case 1: // 文本 + String text = parseI18nText(languageCode, msgModel.text); + if (text != null) { + sb.append(text); + } + break; + case 2: // 用户 + if (msgModel.user != null && msgModel.user.name != null) { + sb.append(msgModel.user.name); + } + break; + } + } + return sb.toString(); + } + + /** + * 根据当前的语言码,选择对应语言的文字 + * + * @param languageCode 语言代码 + * @param model 游戏发过来的文本对象 + * @return 返回选择的字符串 + */ + public static String parseI18nText(String languageCode, SudMGPMGState.MGCommonPublicMessage.MGCommonPublicMessageMsgText model) { + if (model == null) return null; + if (languageCode == null) return model.defaultStr; + + // 精准匹配 + String text = i18nPrecise(languageCode, model); + + if (TextUtils.isEmpty(text)) { + // 如果未匹配到,则尝试模糊匹配 + if (isMatchLanguage(languageCode, "zh")) { + return model.zh_CN; + } + return model.en_US; + } else { + return text; + } + } + + /** 精准匹配 */ + private static String i18nPrecise(String languageCode, SudMGPMGState.MGCommonPublicMessage.MGCommonPublicMessageMsgText model) { + switch (languageCode) { + case "zh-CN": + return model.zh_CN; + case "zh-HK": + return model.zh_HK; + case "zh-MO": + return model.zh_MO; + case "zh-SG": + return model.zh_SG; + case "zh-TW": + return model.zh_TW; + case "en-US": + return model.en_US; + case "en-GB": + return model.en_GB; + case "ms-BN": + return model.ms_BN; + case "ms-MY": + return model.ms_MY; + case "vi-VN": + return model.vi_VN; + case "id-ID": + return model.id_ID; + case "es-ES": + return model.es_ES; + case "ja-JP": + return model.ja_JP; + case "ko-KR": + return model.ko_KR; + case "th-TH": + return model.th_TH; + case "ar-SA": + return model.ar_SA; + case "ur-PK": + return model.ur_PK; + case "tr-TR": + return model.tr_TR; + case "pt-PT": + return model.pt_PT; + case "hi-IN": + return model.hi_IN; + case "bn-BD": + return model.bn_BD; + case "tl-PH": + return model.tl_PH; + case "fa-IR": + return model.fa_IR; + case "ru-RU": + return model.ru_RU; + } + return null; + } + + /** + * 判断是否是该语言 + */ + private static boolean isMatchLanguage(String languageCode, String matchLanguageCode) { + if (languageCode != null && matchLanguageCode != null) { + return matchLanguageCode.equals(languageCode) || languageCode.startsWith(matchLanguageCode + "-"); + } + return false; + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/ISudFSMStateHandleUtils.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/ISudFSMStateHandleUtils.java new file mode 100644 index 0000000..844e14a --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/ISudFSMStateHandleUtils.java @@ -0,0 +1,25 @@ +/* + * Copyright © Sud.Tech + * https://sud.tech + */ + +package com.chwl.core.sud.utils; + +import tech.sud.mgp.core.ISudFSMStateHandle; +import com.chwl.core.sud.state.MGStateResponse; + +public class ISudFSMStateHandleUtils { + + /** + * 回调游戏,成功 + * + * @param handle + */ + public static void handleSuccess(ISudFSMStateHandle handle) { + MGStateResponse response = new MGStateResponse(); + response.ret_code = MGStateResponse.SUCCESS; + response.ret_msg = "success"; + handle.success(SudJsonUtils.toJson(response)); + } + +} diff --git a/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/SudJsonUtils.java b/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/SudJsonUtils.java new file mode 100644 index 0000000..7c71578 --- /dev/null +++ b/core/src/model_sud_wrapper/java/com/chwl/core/sud/utils/SudJsonUtils.java @@ -0,0 +1,43 @@ +package com.chwl.core.sud.utils; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +/** + * json解析工具 + */ +public class SudJsonUtils { + + /** + * 解析json + * + * @return 如果解析出错,则返回空对象 + */ + public static T fromJson(final String json, final Class type) { + try { + return getGson().fromJson(json, type); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 对象解析成json + * + * @param object + * @return + */ + public static String toJson(final Object object) { + return getGson().toJson(object); + } + + public static Gson getGson() { + return InnerClass.gson; + } + + public static class InnerClass { + public static Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + } + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/SaConstant.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/SaConstant.java new file mode 100644 index 0000000..2d57c03 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/SaConstant.java @@ -0,0 +1,11 @@ +package com.chwl.core.super_admin; + +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; + +/** + * create by lvzebiao @2019/8/21 + */ +public class SaConstant { + public final static String TOAST_ERROR_TIPS = ResUtil.getString(R.string.xchat_android_core_super_admin_saconstant_01); +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/SuperAdminDataMrg.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/SuperAdminDataMrg.java new file mode 100644 index 0000000..5bd7f86 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/SuperAdminDataMrg.java @@ -0,0 +1,162 @@ +package com.chwl.core.super_admin; + +import android.annotation.SuppressLint; +import android.text.TextUtils; + +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomInfo; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.room.model.AvRoomModel; +import com.chwl.core.room.model.RoomBaseModel; +import com.chwl.core.super_admin.util.SuperAdminUtil; +import com.chwl.core.utils.ExtensionUtil; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.library.utils.ListUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import lombok.Getter; + +/** + * create by lvzebiao @2019/8/27 + */ +public class SuperAdminDataMrg { + + /** + * 当房间人数<=这个值的时候,才做处理 + */ + public static final int OFFSET_COUNT = 10; + + /** + * 用于保留超管的账号 + */ + @Getter + private List sAdminList = new ArrayList<>(); + + private int count = 0; + + private RoomBaseModel model = new RoomBaseModel(); + + private static final class Helper { + public static final SuperAdminDataMrg INSTANCE = new SuperAdminDataMrg(); + } + + public static SuperAdminDataMrg get() { + return Helper.INSTANCE; + } + + /** + * 成员进房时,如果是超管,则add + */ + public void handleMemberInRoom(ChatRoomMessage msg, String account) { + if (msg == null || TextUtils.isEmpty(account)) { + return; + } + Map map = ExtensionUtil.getExtension(msg, account); + if (map != null && map.containsKey(SuperAdminUtil.PLATFORM_ROLE)) { + Object role = map.get(SuperAdminUtil.PLATFORM_ROLE); + if (role instanceof Integer) { + if ((Integer) role == 1 && !sAdminList.contains(account)) { + sAdminList.add(account); + } + } + } + LogUtil.print("handleMemberInRoom:" + sAdminList.toString()); + } + + /** + * 成员进房时,如果是超管,则remove + */ + public void handleMemberOutRoom(String account) { + if (!ListUtils.isListEmpty(sAdminList) && !TextUtils.isEmpty(account)) { + if (sAdminList.contains(account)) { + sAdminList.remove(account); + } + } + } + + public void updateList(int onlineCount) { + if (onlineCount > OFFSET_COUNT) { + return; + } + //大约每3分钟刷新一次超管列表 + if (count < 18) { + count ++; + return; + } + count = 0; + updateCode(); + } + + @SuppressLint("CheckResult") + public void firstInitList() { + LogUtil.print("firstInitList......."); + AvRoomModel.get().startGetOnlineMemberNumberJob(AvRoomDataManager.get().getRoomId()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + @Override + public void accept(ChatRoomInfo chatRoomInfo) throws Exception { + if (chatRoomInfo != null && chatRoomInfo.getOnlineUserCount() < 20) { + LogUtil.print("init list if online less 20"); + updateCode(); + } + } + }); + } + + /** + * 更新超管列表 + */ + private void updateCode() { + Single.zip(model.queryOnlineList(20), model.queryGuestList(20), (onlineList, guestList) -> { + List allList = new ArrayList<>(); + getSAdminListFromNim(allList, onlineList); + getSAdminListFromNim(allList, guestList); + return allList; + }) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new DontWarnObserver>() { + @Override + public void acceptThrowable(List strings, Throwable throwable) { + super.acceptThrowable(strings, throwable); + if (strings == null) { + return; + } + sAdminList.clear(); + sAdminList.addAll(strings); + LogUtil.print("updateCode super list:" + sAdminList.toString()); + } + }); + + } + + private void getSAdminListFromNim(List saveList, List nimList) { + if (saveList == null || ListUtils.isListEmpty(nimList)) { + return; + } + for (ChatRoomMember member : nimList) { + if (member == null || TextUtils.isEmpty(member.getAccount())) { + continue; + } + if (SuperAdminUtil.isSuperAdmin(member)) { + saveList.add(member.getAccount()); + } + } + } + + /** + * 自己退出房间时,则清除掉所有缓存 + */ + public void clearData() { + LogUtil.print("clear super list cache"); + sAdminList.clear(); + } + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/attachment/SuperAdminOpAttachment.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/attachment/SuperAdminOpAttachment.java new file mode 100644 index 0000000..3af9e4c --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/attachment/SuperAdminOpAttachment.java @@ -0,0 +1,53 @@ +package com.chwl.core.super_admin.attachment; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.google.gson.Gson; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.super_admin.bean.SaOpInfo; + +import lombok.Getter; +import lombok.Setter; + +/** + * 超管的自定义消息 + * + * 所以超管的公屏都是这个,拓展的时候,注意旧版兼容 + * + * create by lvzebiao @2019/8/21 + */ +public class SuperAdminOpAttachment extends CustomAttachment { + + @Getter + @Setter + private SaOpInfo info; + + public SuperAdminOpAttachment(int first, int second) { + super(first, second); + } + + @Override + protected JSONObject packData() { + JSONObject object = null; + try { + if (info != null) { + object = JSON.parseObject(new Gson().toJson(info)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + if (object == null) { + object = new JSONObject(); + } + return object; + } + + @Override + protected void parseData(JSONObject data) { + try { + info = new Gson().fromJson(JSON.toJSONString(data), SaOpInfo.class); + } catch (Exception ex) { + ex.printStackTrace(); + } + } +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/bean/KickOutExtBean.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/bean/KickOutExtBean.java new file mode 100644 index 0000000..3b101d8 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/bean/KickOutExtBean.java @@ -0,0 +1,26 @@ +package com.chwl.core.super_admin.bean; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/8/23 + */ +@Setter +@Getter +public class KickOutExtBean { + + + public final static String KEY_ROLE = "role"; + public final static String KEY_UID = "handleUid"; + + /** + * 操作者/超管 Uid + */ + private String handleUid; + /** + * 1、表示超管 2、房间管理员或房主 + */ + private int role; + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/bean/SaOpInfo.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/bean/SaOpInfo.java new file mode 100644 index 0000000..0d95203 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/bean/SaOpInfo.java @@ -0,0 +1,26 @@ +package com.chwl.core.super_admin.bean; + +import java.io.Serializable; + +import lombok.Getter; +import lombok.Setter; + +/** + * 超管操作时,需要保存的信息 + * create by lvzebiao @2019/8/21 + */ +@Setter +@Getter +public class SaOpInfo implements Serializable { + + private String handleUid; + + private String handleNick; + + private String targetUid; + + private String targetNick; + + private int micNumber; + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/model/ISuperAdminModel.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/model/ISuperAdminModel.java new file mode 100644 index 0000000..4df0428 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/model/ISuperAdminModel.java @@ -0,0 +1,21 @@ +package com.chwl.core.super_admin.model; + +import com.chwl.core.base.IModel; + +import io.reactivex.Single; + +public interface ISuperAdminModel extends IModel { + + Single hideRoom(int type); + + /** + * 解除限制 + * @return - + */ + Single removeLimit(); + + Single roomOperate(int operate); + + Single roomOperate(int operate, long targetUid); + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/model/SuperAdminModel.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/model/SuperAdminModel.java new file mode 100644 index 0000000..b987f45 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/model/SuperAdminModel.java @@ -0,0 +1,99 @@ +package com.chwl.core.super_admin.model; + +import com.google.gson.JsonElement; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; + +import io.reactivex.Single; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class SuperAdminModel extends BaseModel implements ISuperAdminModel{ + + public static final int REMOVE_ROOM_LIMIT = 1; + public static final int LOCK_MIC = 2; + public static final int CLOSE_MIC = 3; + public static final int TAKE_OUT_MIC = 4; + public static final int KICK_OUT_ROOM = 5; + public static final int ADD_BLACK_LIST = 6; + public static final int CLOSE_ROOM = 7; + public static final int HIDE_ROOM = 8; + public static final int CLOSE_PUBLIC_SCREEN = 9; + public static final int OPEN_PUBLIC_SCREEN = 10; + public static final int REMOVE_BLACK_LIST = 11; + + private Api api; + + public SuperAdminModel() { + api = RxNet.create(Api.class); + } + + /** + * 隐藏房间 + * @param type 0.关闭隐藏 1.开启隐藏 + */ + @Override + public Single hideRoom(int type) { + return api.hideRoom(AvRoomDataManager.get().getRoomUid(), type) + .compose(RxHelper.handleIgnoreData()); + } + + /** + * 解除限制 + * @return - + */ + @Override + public Single removeLimit() { + return api.roomLimit(AvRoomDataManager.get().getRoomUid(), null, null) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single roomOperate(int operate) { + return api.roomOperate(AuthModel.get().getCurrentUid(), AvRoomDataManager.get().getRoomUid(), 0L, operate) + .compose(RxHelper.handleIgnoreData()); + } + + @Override + public Single roomOperate(int operate, long targetUid) { + return api.roomOperate(AuthModel.get().getCurrentUid(), AvRoomDataManager.get().getRoomUid(), targetUid, operate) + .compose(RxHelper.handleIgnoreData()); + } + + interface Api { + + /** + * 隐藏房间 + * @param type 0.关闭隐藏 1.开启隐藏 + */ + @POST("/super/hide/room") + Single> hideRoom(@Query("roomUid") long roomUid, + @Query("type") long type); + + /** + * 更新房间限制 + * @param limitType 限制类型:lock=房间加锁,isFriend=好友可进,isInvite=邀请可进。 + * (当传null或空字符串时视为取消限制) + */ + @POST("/super/update/room/limit") + Single> roomLimit(@Query("roomUid") long roomUid, + @Query("limitType") String limitType, + @Query("roomPwd") String roomPwd); + + /** + * 保存超管操作记录 + * @param operateType 操作类型 1、解除进房限制;2、锁麦;3、闭麦;4、抱TA下麦;5、踢出房间;6、加入黑名单;7、关闭房间;8、隐藏房间;9、关闭公屏消息;10、开启公屏消息;11、移除黑名单 + * @param uid 当前超管uid + * @param targetUid 目标用户uid + */ + @POST("/super/admin/operate/save") + Single> roomOperate(@Query("uid") long uid, + @Query("roomUid") long roomUid, + @Query("targetUid") long targetUid, + @Query("operateType") int operateType); + } +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/model/exception/SAdminCannotGameException.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/model/exception/SAdminCannotGameException.java new file mode 100644 index 0000000..5f0d02f --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/model/exception/SAdminCannotGameException.java @@ -0,0 +1,15 @@ +package com.chwl.core.super_admin.model.exception; + +/** + * 超管不能玩游戏 + * create by lvzebiao @2019/8/30 + */ +public class SAdminCannotGameException extends Throwable{ + + public final static int ERROR_CODE = 18008; + + public SAdminCannotGameException(String msg) { + super(msg); + } + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java new file mode 100644 index 0000000..0d06245 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SAdminOptUtil.java @@ -0,0 +1,118 @@ +package com.chwl.core.super_admin.util; + +import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.kick.KickModel; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.manager.IMNetEaseManager; +import com.chwl.core.room.model.AvRoomModel; +import com.chwl.core.super_admin.bean.KickOutExtBean; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.library.utils.JavaUtil; +import com.chwl.library.utils.SingleToastUtil; + +import java.util.Map; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2019/8/23 + */ +public class SAdminOptUtil { + + /** + * 判断该操作,是不是超管发起的 + * + * @param reason - + * @return - + */ + public static boolean isOptBySAdmin(ChatRoomKickOutEvent reason) { + if (reason == null || reason.getExtension() == null) { + return false; + } + Map map = reason.getExtension(); + + if (map.containsKey(KickOutExtBean.KEY_UID)) { + Object handleUid = map.get(KickOutExtBean.KEY_UID); + if (handleUid instanceof String && AvRoomDataManager.get().isSuperAdmin((String) handleUid)) { + return false; + } + } + + if (map.containsKey(KickOutExtBean.KEY_ROLE)) { + Object role = map.get(KickOutExtBean.KEY_ROLE); + if (role instanceof Integer) { + return 1 == (Integer) role; + } + } + return false; + } + + + /** + * 超管踢普通用户 + */ + public static boolean kickOutNormalUser(String kickUid, String nick, Map reason) { + if (!SuperAdminUtil.isSuperAdmin()) { + return false; + } + if (AvRoomDataManager.get().isRoomAdmin(kickUid)) { + return false; + } + //先判断超管是不是管理员 + Single single; + if (!AvRoomDataManager.get().isRoomAdmin()) { + //将超管设置为房间管理员 + single = AvRoomModel.get().markManager(AuthModel.get().getCurrentUid(), true); + } else { + single = Single.just(""); + } + long roomId = AvRoomDataManager.get().getRoomId(); + single.flatMap(s -> IMNetEaseManager.get().kickMemberFromRoomBySdk(roomId, + JavaUtil.str2long(kickUid), reason)) + //发公屏 + .flatMap(s -> { + ChatRoomMessage chatRoomMessage = SaAttachmentFactory + .createBlackOrKickOutChatRoomMsg(kickUid, nick, 2); + return IMNetEaseManager.get().sendChatRoomMessage(chatRoomMessage, false); + }) + .subscribe(new DontWarnObserver() { + @Override + public void accept(ChatRoomMessage chatRoomMessage, String error) { + super.accept(chatRoomMessage, error); + if (chatRoomMessage != null) { + KickModel.get().onSendRoomMessageSuccess(chatRoomMessage); + } else { + SingleToastUtil.showToast(error); + } + } + }); + return true; + } + + /** + * 超管踢 房间管理员 + * + * @param kickUid - + * @param nick - + * @return - + */ + public static boolean kickOutRoomAdmin(String kickUid, String nick) { + if (!SuperAdminUtil.isSuperAdmin() && !AvRoomDataManager.get().isSuperAdmin()) { + return false; + } + if (!AvRoomDataManager.get().isRoomAdmin(kickUid)) { + return false; + } + ChatRoomMessage message = SaAttachmentFactory.createBlackOrKickOutChatRoomMsg(kickUid, nick, 3); + IMNetEaseManager.get().sendChatRoomMessage(message, false) + .doOnSuccess(chatRoomMessage ->{ + KickModel.get().onSendRoomMessageSuccess(chatRoomMessage); + AvRoomModel.get().kickUser(JavaUtil.str2long(kickUid)).subscribe(); + }) + .subscribe(); + return true; + } + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaAttachmentFactory.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaAttachmentFactory.java new file mode 100644 index 0000000..8d85deb --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaAttachmentFactory.java @@ -0,0 +1,89 @@ +package com.chwl.core.super_admin.util; + +import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.im.custom.bean.CustomAttachment; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.super_admin.attachment.SuperAdminOpAttachment; +import com.chwl.core.super_admin.bean.SaOpInfo; +import com.chwl.core.user.UserModel; + +/** + * create by lvzebiao @2019/8/22 + */ +public class SaAttachmentFactory { + + /** + * 解除cp房限制 + * @return - + */ + public static ChatRoomMessage createRemoveLimitChatRoomMessage() { + SaOpInfo info = new SaOpInfo(); + return createSaChatRoomMessage(CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_CP_ROOM_LIMIT, info); + } + + /** + * 解除多人房密码 + * @return - + */ + public static ChatRoomMessage createRemoveRoomPwdChatRoomMessage() { + SaOpInfo info = new SaOpInfo(); + return createSaChatRoomMessage(CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_ROOM_PWD, info); + } + + /** + * + * @param micNumber - + * @param type 1 闭麦 2 锁麦 + * @return - + */ + public static ChatRoomMessage createMuteOrLockChatRoomMessage(int micNumber, int type) { + SaOpInfo info = new SaOpInfo(); + info.setMicNumber(micNumber); + int second; + if (type == 1) { + second = CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MUTE_MIC; + } else { + second = CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_LOCK_MIC; + } + return createSaChatRoomMessage(second, info); + } + + /** + * + * @param targetUid - + * @param targetNick - + * @param type 1 拉黑 2 踢普通人出房间 3 踢管理员出房间 + * @return - + */ + public static ChatRoomMessage createBlackOrKickOutChatRoomMsg(String targetUid, String targetNick, int type) { + SaOpInfo info = new SaOpInfo(); + info.setHandleUid(String.valueOf(AuthModel.get().getCurrentUid())); + info.setHandleNick(UserModel.get().getNick()); + info.setTargetUid(targetUid); + info.setTargetNick(targetNick); + int second; + if (type == 1) { + second = CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MARK_BLACK; + } else if (type == 2){ + second = CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ROOM; + } else { + second = CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ADMIN; + } + return createSaChatRoomMessage(second, info); + } + + private static ChatRoomMessage createSaChatRoomMessage(int second, SaOpInfo info) { + SuperAdminOpAttachment attachment = new SuperAdminOpAttachment( + CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN, + second + ); + if (info != null) { + attachment.setInfo(info); + } + return ChatRoomMessageBuilder.createChatRoomCustomMessage( + String.valueOf(AvRoomDataManager.get().getRoomId()), attachment); + } + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaMsgUtil.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaMsgUtil.java new file mode 100644 index 0000000..aa17931 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SaMsgUtil.java @@ -0,0 +1,31 @@ +package com.chwl.core.super_admin.util; + +import com.chwl.core.im.custom.bean.CustomAttachment; + +/** + * 判断超管的自定义消息 是否需要加入公屏 + * create by lvzebiao @2019/8/21 + */ +public class SaMsgUtil { + + public static boolean isNeedAddToMsgView(CustomAttachment attachment) { + if (attachment == null) { + return false; + } + int second = attachment.getSecond(); + return attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN && + secondIsValid(second); + } + + public static boolean secondIsValid(int second) { + return second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_DOWN_MIC + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MUTE_MIC + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_LOCK_MIC + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_MARK_BLACK + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ROOM + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_KICK_OUT_ADMIN + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_CP_ROOM_LIMIT + || second == CustomAttachment.CUSTOM_MSG_SUB_TYPE_SUPER_ADMIN_REMOVE_ROOM_PWD; + } + +} diff --git a/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SuperAdminUtil.java b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SuperAdminUtil.java new file mode 100644 index 0000000..acce652 --- /dev/null +++ b/core/src/model_super_admin/java/com.chwl.core.super_admin/util/SuperAdminUtil.java @@ -0,0 +1,69 @@ +package com.chwl.core.super_admin.util; + +import android.text.TextUtils; + +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; +import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.ExtensionUtil; + +import java.util.Map; + +public class SuperAdminUtil { + public static final String PLATFORM_ROLE = "platformRole"; + + /** + * 云信自定义消息判断是否是超管 + */ + public static boolean isSuperAdmin(ChatRoomMessage chatRoomMessage) { + if (chatRoomMessage == null) { + return false; + } + Map extension = ExtensionUtil.getExtension(chatRoomMessage, ExtensionUtil.getAccount(chatRoomMessage)); + if (extension == null) + return false; + + Object platformRole = extension.get(PLATFORM_ROLE); + if (platformRole == null) + return false; + if (!(platformRole instanceof Integer)) { + return false; + } + return ((int) platformRole) == 1; + } + + /** + * 判断登录用户是否是超管 + * @return - + */ + public static boolean isSuperAdmin() { + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + return userInfo != null && userInfo.isSuperAdmin(); + } + + /** + * 判断聊天室用户,是不是超管 + * @param chatRoomMember - + * @return - + */ + public static boolean isSuperAdmin(ChatRoomMember chatRoomMember) { + if (chatRoomMember == null || TextUtils.isEmpty(chatRoomMember.getAccount())) { + return false; + } + Map contentMap = ExtensionUtil.getExtension(chatRoomMember); + if (contentMap == null) { + return false; + } + if (contentMap.containsKey(SuperAdminUtil.PLATFORM_ROLE)) { + Object role = contentMap.get(SuperAdminUtil.PLATFORM_ROLE); + if (role instanceof Integer) { + LogUtil.print(chatRoomMember.getAccount() + " role is " + role); + return (Integer) role == 1; + } + } + return false; + } + +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/BoxOpenStatusInfo.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/BoxOpenStatusInfo.java new file mode 100644 index 0000000..70e26d6 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/BoxOpenStatusInfo.java @@ -0,0 +1,46 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +/** + * 宝箱开放状态 + */ +@Keep +public class BoxOpenStatusInfo implements Serializable{ + + /** + * opening : false + * startTime : 12:00 + * endTime : 02:00 + */ + + private boolean opening; + private String startTime; + private String endTime; + + public boolean isOpening() { + return opening; + } + + public void setOpening(boolean opening) { + this.opening = opening; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/ConfigImgUrl.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/ConfigImgUrl.java new file mode 100644 index 0000000..659572a --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/ConfigImgUrl.java @@ -0,0 +1,33 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; +@Keep +public class ConfigImgUrl implements Serializable { + + + /** + * ruleUrl : xxxx + * backgroundUrl : + */ + + private String ruleUrl; + private String backgroundUrl; + + public String getRuleUrl() { + return ruleUrl; + } + + public void setRuleUrl(String ruleUrl) { + this.ruleUrl = ruleUrl; + } + + public String getBackgroundUrl() { + return backgroundUrl; + } + + public void setBackgroundUrl(String backgroundUrl) { + this.backgroundUrl = backgroundUrl; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourBuyKeyResultInfo.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourBuyKeyResultInfo.java new file mode 100644 index 0000000..04334bb --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourBuyKeyResultInfo.java @@ -0,0 +1,36 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +/** + * 购买钻石宝箱钥匙 + */ +@Keep +public class HonourBuyKeyResultInfo implements Serializable { + + /** + * keyNum : 11 + * goldNum : 11 + */ + + private int keyNum; + private int goldNum; + + public int getKeyNum() { + return keyNum; + } + + public void setKeyNum(int keyNum) { + this.keyNum = keyNum; + } + + public int getGoldNum() { + return goldNum; + } + + public void setGoldNum(int goldNum) { + this.goldNum = goldNum; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourKeyInfo.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourKeyInfo.java new file mode 100644 index 0000000..5b7007a --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/HonourKeyInfo.java @@ -0,0 +1,36 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +/** + * 获取用户钻石宝箱钥匙数+钻石宝箱钥匙价格 + */ +@Keep +public class HonourKeyInfo implements Serializable { + + /** + * keyPrice : 11 + * keyNum : 11 + */ + + private int keyPrice; + private int keyNum; + + public int getKeyPrice() { + return keyPrice; + } + + public void setKeyPrice(int keyPrice) { + this.keyPrice = keyPrice; + } + + public int getKeyNum() { + return keyNum; + } + + public void setKeyNum(int keyNum) { + this.keyNum = keyNum; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/KeyInfo.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/KeyInfo.java new file mode 100644 index 0000000..a037549 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/KeyInfo.java @@ -0,0 +1,51 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; + +@Keep +public class KeyInfo implements Serializable { + + /** + * keyPrice : 11 + * keyNum : 11 + */ + + private int keyPrice; + private int keyNum; + private double goldNum;//用户余额 + private int sendMessageSwitchLevel; + + public int getKeyPrice() { + return keyPrice; + } + + public void setKeyPrice(int keyPrice) { + this.keyPrice = keyPrice; + } + + public int getKeyNum() { + return keyNum; + } + + public void setKeyNum(int keyNum) { + this.keyNum = keyNum; + } + + public double getGoldNum() { + return goldNum; + } + + public void setGoldNum(double goldNum) { + this.goldNum = goldNum; + } + + public int getSendMessageSwitchLevel() { + return sendMessageSwitchLevel; + } + + public void setSendMessageSwitchLevel(int sendMessageSwitchLevel) { + this.sendMessageSwitchLevel = sendMessageSwitchLevel; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxHonourResult.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxHonourResult.java new file mode 100644 index 0000000..69473ab --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxHonourResult.java @@ -0,0 +1,36 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; +import java.util.List; +@Keep +public class OpenBoxHonourResult implements Serializable { + private List prizeItemList; + private int remainKeyNum; + private int spendGold;// 花费钻石数(能量值) + + public List getPrizeItemList() { + return prizeItemList; + } + + public void setPrizeItemList(List prizeItemList) { + this.prizeItemList = prizeItemList; + } + + public int getRemainKeyNum() { + return remainKeyNum; + } + + public void setRemainKeyNum(int remainKeyNum) { + this.remainKeyNum = remainKeyNum; + } + + public int getSpendGold() { + return spendGold; + } + + public void setSpendGold(int spendGold) { + this.spendGold = spendGold; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxResult.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxResult.java new file mode 100644 index 0000000..93659f2 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/OpenBoxResult.java @@ -0,0 +1,37 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; +import java.util.List; +@Keep +public class OpenBoxResult implements Serializable { + + private List prizeItemList; + private int remainKeyNum; + private boolean specialStatus; + + public List getPrizeItemList() { + return prizeItemList; + } + + public void setPrizeItemList(List prizeItemList) { + this.prizeItemList = prizeItemList; + } + + public int getRemainKeyNum() { + return remainKeyNum; + } + + public void setRemainKeyNum(int remainKeyNum) { + this.remainKeyNum = remainKeyNum; + } + + public boolean isSpecialStatus() { + return specialStatus; + } + + public void setSpecialStatus(boolean specialStatus) { + this.specialStatus = specialStatus; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeInfo.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeInfo.java new file mode 100644 index 0000000..466d206 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeInfo.java @@ -0,0 +1,97 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; +@Keep +public class PrizeInfo implements Serializable { + + + /** + * prizeName : + * prizeImgUrl : + * prizeLevel : 1 + * drawTime : 11111 + */ + + private String prizeName; + private String prizeImgUrl; + private int prizeLevel; + private String createTime; + private int keyNum; + private int platformValue; + private int prizeNum; + private String showRate; + + public PrizeInfo() { + } + + public int getPlatformValue() { + return platformValue; + } + + public void setPlatformValue(int platformValue) { + this.platformValue = platformValue; + } + + public PrizeInfo(String prizeImgUrl, int prizeLevel) { + this.prizeImgUrl = prizeImgUrl; + this.prizeLevel = prizeLevel; + } + + public String getPrizeName() { + return prizeName; + } + + public void setPrizeName(String prizeName) { + this.prizeName = prizeName; + } + + public String getPrizeImgUrl() { + return prizeImgUrl; + } + + public void setPrizeImgUrl(String prizeImgUrl) { + this.prizeImgUrl = prizeImgUrl; + } + + public int getPrizeLevel() { + return prizeLevel; + } + + public void setPrizeLevel(int prizeLevel) { + this.prizeLevel = prizeLevel; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getPrizeNum() { + return prizeNum; + } + + public void setPrizeNum(int prizeNum) { + this.prizeNum = prizeNum; + } + + public int getKeyNum() { + return keyNum; + } + + public void setKeyNum(int keyNum) { + this.keyNum = keyNum; + } + + public String getShowRate() { + return showRate; + } + + public void setShowRate(String showRate) { + this.showRate = showRate; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeNewInfo.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeNewInfo.java new file mode 100644 index 0000000..6bec1c8 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/PrizeNewInfo.java @@ -0,0 +1,71 @@ +package com.chwl.core.treasure_box.bean; + +import androidx.annotation.Keep; + +import java.io.Serializable; +@Keep +public class PrizeNewInfo implements Serializable { + + + /** + * prizeName : + * prizeImgUrl : + * prizeLevel : 1 + * drawTime : 11111 + */ + + private int rewardId; + private String rewardName; + private String picUrl; + private int diamonds; + private int num; + private int level; + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public int getRewardId() { + return rewardId; + } + + public void setRewardId(int rewardId) { + this.rewardId = rewardId; + } + + public String getRewardName() { + return rewardName; + } + + public void setRewardName(String rewardName) { + this.rewardName = rewardName; + } + + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + + public int getDiamonds() { + return diamonds; + } + + public void setDiamonds(int diamonds) { + this.diamonds = diamonds; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/UserTicketInfo.kt b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/UserTicketInfo.kt new file mode 100644 index 0000000..adbacf0 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/bean/UserTicketInfo.kt @@ -0,0 +1,11 @@ +package com.chwl.core.treasure_box.bean + +import androidx.annotation.Keep + +@Keep +data class UserTicketInfo( + val diamond: Double = 0.0, + var ticketNum: Int = 0, + val ticketPrice: Double = 0.0, + val uid: Int = 0 +) \ No newline at end of file diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenBoxEvent.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenBoxEvent.java new file mode 100644 index 0000000..4b7e103 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenBoxEvent.java @@ -0,0 +1,22 @@ +package com.chwl.core.treasure_box.event; + +import com.chwl.core.treasure_box.bean.OpenBoxResult; + +import lombok.Data; + +@Data +public class AutoOpenBoxEvent { + + private boolean isRunning; + private OpenBoxResult openBoxResult; + + public AutoOpenBoxEvent setRunning(boolean running) { + isRunning = running; + return this; + } + + public AutoOpenBoxEvent setOpenBoxResult(OpenBoxResult openBoxResult) { + this.openBoxResult = openBoxResult; + return this; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenHonourBoxEvent.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenHonourBoxEvent.java new file mode 100644 index 0000000..829558d --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/AutoOpenHonourBoxEvent.java @@ -0,0 +1,22 @@ +package com.chwl.core.treasure_box.event; + +import com.chwl.core.treasure_box.bean.OpenBoxHonourResult; + +import lombok.Data; + +@Data +public class AutoOpenHonourBoxEvent { + + private boolean isRunning; + private OpenBoxHonourResult openBoxResult; + + public AutoOpenHonourBoxEvent setRunning(boolean running) { + isRunning = running; + return this; + } + + public AutoOpenHonourBoxEvent setOpenBoxResult(OpenBoxHonourResult openBoxResult) { + this.openBoxResult = openBoxResult; + return this; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/BoxBuyKeyEvent.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/BoxBuyKeyEvent.java new file mode 100644 index 0000000..69de27e --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/BoxBuyKeyEvent.java @@ -0,0 +1,40 @@ +package com.chwl.core.treasure_box.event; + +import com.chwl.core.treasure_box.bean.KeyInfo; + +import lombok.Data; + +@Data +public class BoxBuyKeyEvent { + + private boolean isSuccess; + private boolean isKeyDeficiency; + private int count; + private int code; + private KeyInfo keyInfo; + + public BoxBuyKeyEvent setSuccess(boolean success) { + isSuccess = success; + return this; + } + + public BoxBuyKeyEvent setKeyDeficiency(boolean keyDeficiency) { + isKeyDeficiency = keyDeficiency; + return this; + } + + public BoxBuyKeyEvent setCount(int count) { + this.count = count; + return this; + } + + public BoxBuyKeyEvent setCode(int code) { + this.code = code; + return this; + } + + public BoxBuyKeyEvent setKeyInfo(KeyInfo keyInfo) { + this.keyInfo = keyInfo; + return this; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/HonourBoxBuyKeyEvent.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/HonourBoxBuyKeyEvent.java new file mode 100644 index 0000000..c1a5f5c --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/event/HonourBoxBuyKeyEvent.java @@ -0,0 +1,40 @@ +package com.chwl.core.treasure_box.event; + +import com.chwl.core.treasure_box.bean.HonourBuyKeyResultInfo; + +import lombok.Data; + +@Data +public class HonourBoxBuyKeyEvent { + + private boolean isSuccess; + private boolean isKeyDeficiency; + private int count; + private int code; + private HonourBuyKeyResultInfo keyInfo; + + public HonourBoxBuyKeyEvent setSuccess(boolean success) { + isSuccess = success; + return this; + } + + public HonourBoxBuyKeyEvent setKeyDeficiency(boolean keyDeficiency) { + isKeyDeficiency = keyDeficiency; + return this; + } + + public HonourBoxBuyKeyEvent setCount(int count) { + this.count = count; + return this; + } + + public HonourBoxBuyKeyEvent setCode(int code) { + this.code = code; + return this; + } + + public HonourBoxBuyKeyEvent setKeyInfo(HonourBuyKeyResultInfo keyInfo) { + this.keyInfo = keyInfo; + return this; + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/BoxModel.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/BoxModel.java new file mode 100644 index 0000000..ccc5643 --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/BoxModel.java @@ -0,0 +1,339 @@ +package com.chwl.core.treasure_box.model; + +import com.chwl.core.treasure_box.bean.BoxOpenStatusInfo; +import com.chwl.core.treasure_box.bean.ConfigImgUrl; +import com.chwl.core.treasure_box.bean.HonourBuyKeyResultInfo; +import com.chwl.core.treasure_box.bean.HonourKeyInfo; +import com.chwl.core.treasure_box.bean.KeyInfo; +import com.chwl.core.treasure_box.bean.OpenBoxHonourResult; +import com.chwl.core.treasure_box.bean.OpenBoxResult; +import com.chwl.core.treasure_box.bean.PrizeInfo; +import com.chwl.core.treasure_box.bean.PrizeNewInfo; +import com.chwl.core.treasure_box.bean.UserTicketInfo; +import com.chwl.core.R; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.exception.FailReasonException; +import com.chwl.core.manager.AvRoomDataManager; +import com.chwl.core.utils.net.BalanceNotEnoughExeption; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public class BoxModel extends BaseModel implements IBoxModel { + + /** + * 钻石不足 + */ + public static final int ERROR_CODE_DIAMOND = 31005; + + private Api api; + + private BoxModel() { + api = RxNet.create(Api.class); + } + + public static IBoxModel get() { + return BoxModelHelper.instance; + } + + private static class BoxModelHelper { + private static IBoxModel instance = new BoxModel(); + } + + @Override + public Single getRule() { + return api.getRule() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single> openBoxDraw(int keyNum, boolean sendMessage) { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.treasure_box_model_boxmodel_01))); + } + return api.openBoxDraw(keyNum, sendMessage, AvRoomDataManager.get().mCurrentRoomInfo.getUid()) + .compose(RxHelper.handleSchedulers()) + .flatMap(openBoxResultServiceResult -> { + if (openBoxResultServiceResult == null) { + return Single.error(new Throwable("no response")); + } + if (openBoxResultServiceResult.isSuccess()) { + if (openBoxResultServiceResult.getData() != null) { + return Single.just(openBoxResultServiceResult.getData()); + } else { + return Single.error(new Throwable("data is null")); + } + } + return Single.error(new FailReasonException(openBoxResultServiceResult.getMessage(), + openBoxResultServiceResult.getCode())); + }); + } + + @Override + public Single getUserTicket() { + return api.getUserTicket() + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single buyTicket(int num) { + return api.buyTicket(num) + .compose(RxHelper.handleCommon()) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single openBox(int boxType, int keyNum, boolean sendMessage) { + if (AvRoomDataManager.get().mCurrentRoomInfo == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.treasure_box_model_boxmodel_01))); + } + return api.openBox(boxType, keyNum, sendMessage, AuthModel.get().getCurrentUid(), + AvRoomDataManager.get().mCurrentRoomInfo.getUid()) + .compose(RxHelper.handleSchedulers()) + .flatMap(openBoxResultServiceResult -> { + if (openBoxResultServiceResult == null) { + return Single.error(new Throwable("no response")); + } + if (openBoxResultServiceResult.isSuccess()) { + if (openBoxResultServiceResult.getData() != null) { + return Single.just(openBoxResultServiceResult.getData()); + } else { + return Single.error(new Throwable("data is null")); + } + } + return Single.error(new FailReasonException(openBoxResultServiceResult.getMessage(), + openBoxResultServiceResult.getCode())); + }); + } + + @Override + public Single>> getPrizeRecord(int page, + int pageSize, + String sortType, + long uid) { + return api.getPrizeRecord(page, pageSize, sortType, uid) + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single buyKey(int keyNum) { + return api.buyKey(keyNum, AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleSchedulers()) + .flatMap(new Function, SingleSource>() { + @Override + public SingleSource apply(ServiceResult result) throws Exception { + if (result.isSuccess() && result.getData() != null) { + return Single.just(result.getData()); + } + if (result.getCode() == BalanceNotEnoughExeption.code) { + return Single.error(new BalanceNotEnoughExeption(ResUtil.getString(R.string.treasure_box_model_boxmodel_02))); + } + return Single.error(new Throwable(RxHelper.getValidMessage(result))); + } + }); + + + } + + @Override + public Single getKeyInfo(int boxType) { + return api.getKeyInfo(boxType, AuthModel.get().getCurrentUid()) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single>> getPrizes() { + return api.getPrizes() + .compose(RxHelper.handleSchedulers()); + } + + @Override + public Single getBoxOpenStatusInfo(int type) { + return api.getBoxOpenStatusInfo(type) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single getHonourKeyInfo(long uid) { + return api.getHonourKeyInfo(uid) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single openHonourBox(long uid, boolean sendMessage, long roomUid, + int keyNum, String ticket) { + return api.openHonourBox(uid, sendMessage, roomUid, keyNum, ticket) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single buyHonourKey(long uid, int keyNum, String ticket) { + return api.buyHonourKey(uid, keyNum, ticket) + .compose(RxHelper.handleSchedulers()) + .compose(RxHelper.handleBeanData()); + } + + @Override + public Single>> getHonourBoxJackpotInfo() { + return api.getHonourBoxJackpotInfo() + .compose(RxHelper.handleSchedulers()); + } + + private interface Api { + /** + * 中奖记录列表 + * + * @param page + * @param pageSize + * @param sortType 排序类型:按时间:time,按价值:worth + * @param uid + * @return 中奖纪录列表 + */ + @GET("box/drawrecord") + Single>> getPrizeRecord(@Query("page") int page, + @Query("pageSize") int pageSize, + @Query("sortType") String sortType, + @Query("uid") long uid); + + /** + * 获取用户vo(门票) + * + */ + @GET("/findLove/user") + Single> getUserTicket(); + + /** + * 购买门票 + * + */ + @FormUrlEncoded + @POST("/findLove/buyTicket") + Single> buyTicket(@Field("num") int num); + + /** + * 寻爱抽奖 + * + * @param num + * @param sendMessage + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("/findLove/draw") + Single>> openBoxDraw(@Field("num") int num, + @Field("sendMessage") boolean sendMessage, + @Field("roomUid") long roomUid); + + /** + * 开宝箱 + * + * @param keyNum + * @param sendMessage + * @param uid + * @param roomUid + * @return + */ + @FormUrlEncoded + @POST("box/draw") + Single> openBox(@Field("boxType") int boxType, + @Field("keyNum") int keyNum, + @Field("sendMessage") boolean sendMessage, + @Field("uid") long uid, + @Field("roomUid") long roomUid); + + /** + * 购买钥匙 + * + * @param keyNum + * @param uid + * @return + */ + @FormUrlEncoded + @POST("box/buykey") + Single> buyKey(@Field("keyNum") int keyNum, + @Field("uid") long uid); + + /** + * 获取用户钥匙数 + 钥匙价格 + * + * @param uid + * @return + */ + @GET("box/userkey") + Single> getKeyInfo(@Query("boxType") int boxType, + @Query("uid") long uid); + + /** + * 获取开箱子配置图片 + * + * @return + */ + @GET("box/configimgurl") + Single> getRule(); + + /** + * 获取奖品列表 + * + * @return + */ + @GET("box/prizes/withRate") + Single>> getPrizes(); + + /** + * 宝箱开放状态 + */ + @GET("box/open/status") + Single> getBoxOpenStatusInfo(@Query("type") int type); + + /** + * 获取用户至尊宝箱钥匙数+至尊宝箱钥匙价格 + */ + @GET("box/diamond/userkey") + Single> getHonourKeyInfo(@Query("uid") long uid); + + /** + * 至尊蛋抽奖 + */ + @FormUrlEncoded + @POST("box/diamond/draw") + Single> openHonourBox(@Field("uid") long uid, + @Field("sendMessage") boolean sendMessage, + @Field("roomUid") long roomUid, + @Field("keyNum") int keyNum, + @Field("ticket") String ticket); + + /** + * 购买钻石宝箱钥匙 + */ + @FormUrlEncoded + @POST("box/diamond/buykey") + Single> buyHonourKey(@Field("uid") long uid, + @Field("keyNum") int keyNum, + @Field("ticket") String ticket); + + /** + * 至尊蛋本期奖池 + */ + @GET("box/diamond/prizes/withRate") + Single>> getHonourBoxJackpotInfo(); + } +} diff --git a/core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/IBoxModel.java b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/IBoxModel.java new file mode 100644 index 0000000..77b3ccc --- /dev/null +++ b/core/src/model_treasure_box/java/com/chwl/core/treasure_box/model/IBoxModel.java @@ -0,0 +1,130 @@ +package com.chwl.core.treasure_box.model; + +import com.chwl.core.treasure_box.bean.BoxOpenStatusInfo; +import com.chwl.core.treasure_box.bean.ConfigImgUrl; +import com.chwl.core.treasure_box.bean.HonourBuyKeyResultInfo; +import com.chwl.core.treasure_box.bean.HonourKeyInfo; +import com.chwl.core.treasure_box.bean.KeyInfo; +import com.chwl.core.treasure_box.bean.OpenBoxHonourResult; +import com.chwl.core.treasure_box.bean.OpenBoxResult; +import com.chwl.core.treasure_box.bean.PrizeInfo; +import com.chwl.core.treasure_box.bean.PrizeNewInfo; +import com.chwl.core.treasure_box.bean.UserTicketInfo; +import com.chwl.core.base.IModel; +import com.chwl.core.bean.response.ServiceResult; + +import java.util.List; + +import io.reactivex.Single; + +public interface IBoxModel extends IModel { + + /** + * 获取开箱子配置图片 + * + * @return + */ + Single getRule(); + + /** + * 寻爱抽奖 + * + * @param keyNum + * @param sendMessage + * @return + */ + Single> openBoxDraw(int keyNum, boolean sendMessage); + + /** + * 获取用户vo(门票) + * + * @return + */ + Single getUserTicket(); + + /** + * 购买门票 + * + * @return + */ + Single buyTicket(int num); + + /** + * 开箱子 + * + * @param keyNum + * @param sendMessage + * @return + */ + Single openBox(int boxType,int keyNum, boolean sendMessage); + + /** + * 获取中奖记录 + * + * @param page + * @param pageSize + * @param sortType + * @param uid + * @return + */ + Single>> getPrizeRecord(int page, + int pageSize, + String sortType, + long uid); + + /** + * 购买钥匙 + * + * @param keyNum + * @return + */ + Single buyKey(int keyNum); + + /** + * 获取用户钥匙数 + 钥匙价格 + * + * @return + */ + Single getKeyInfo(int boxType); + + /** + * 获取奖品列表 + * + * @return + */ + Single>> getPrizes(); + + int BOX_TYPE_NORMAL = 1;// 普通蛋 + int BOX_TYPE_HONOUR = 2;// 至尊蛋 + + /** + * 蛋开放状态 + */ + Single getBoxOpenStatusInfo(int type); + + /** + * 获取用户至尊蛋钥匙数+至尊蛋钥匙价格 + */ + Single getHonourKeyInfo(long uid); + + /** + * 至尊蛋抽奖 + */ + Single openHonourBox(long uid, + boolean sendMessage, + long roomUid, + int keyNum, + String ticket); + + /** + * 购买至尊蛋钥匙 + */ + Single buyHonourKey(long uid, + int keyNum, + String ticket); + + /** + * 至尊蛋本期奖池 + */ + Single>> getHonourBoxJackpotInfo(); +} diff --git a/core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/NewestVersionInfo.java b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/NewestVersionInfo.java new file mode 100644 index 0000000..bb5440d --- /dev/null +++ b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/NewestVersionInfo.java @@ -0,0 +1,42 @@ +package com.chwl.core.upgrade.bean; + +import lombok.Data; + +@Data +public class NewestVersionInfo { + + public static final int STATUS_ONLINE = 1; + public final static int STATUS_MARKET_CHECKING = 2; + public static final int STATUS_FORCE_UPDATE = 3; + public static final int STATUS_RECOMMEND_UPDATE = 4; + public static final int STATUS_DELETED = 5; + + /** + * updateVersion : 2.9.0 + * updateDownloadLink : https://image.zhongjialx.com/tutu_client-release_2.9.0_72_aligned_signed-official.apk + * updateFileMd5 : 1d0193e0547f92c8e2a238d1f0ea2cd6 + * updateStatus : 1 + * updateOs : android + */ + + private String updateVersion; + private String updateDownloadLink; + private String updateFileMd5; + private int updateStatus; + private String updateOs; + private String updateVersionDesc; + private String updateChannel; + + @Override + public String toString() { + return "NewestVersionInfo{" + + "updateVersion='" + updateVersion + '\'' + + ", updateDownloadLink='" + updateDownloadLink + '\'' + + ", updateFileMd5='" + updateFileMd5 + '\'' + + ", updateStatus=" + updateStatus + + ", updateOs='" + updateOs + '\'' + + ", updateVersionDesc='" + updateVersionDesc + '\'' + + ", updateChannel='" + updateChannel + '\'' + + '}'; + } +} diff --git a/core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/UpgradeCache.java b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/UpgradeCache.java new file mode 100644 index 0000000..f238190 --- /dev/null +++ b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/bean/UpgradeCache.java @@ -0,0 +1,19 @@ +package com.chwl.core.upgrade.bean; + +import lombok.Getter; +import lombok.Setter; + +/** + * create by lvzebiao @2019/8/15 + */ +@Getter +@Setter +public class UpgradeCache { + + private long time; + + private int count; + + private String version; + +} diff --git a/core/src/model_upgrade_app/java/com/chwl/core/upgrade/event/ImPushUpdateAppEvent.java b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/event/ImPushUpdateAppEvent.java new file mode 100644 index 0000000..6f237a1 --- /dev/null +++ b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/event/ImPushUpdateAppEvent.java @@ -0,0 +1,24 @@ +package com.chwl.core.upgrade.event; + +import com.chwl.core.upgrade.bean.NewestVersionInfo; + +/** + * IM推送全局广播-发出事件-用户请求更新接口 + * create by lvzebiao @2019/8/14 + */ +public class ImPushUpdateAppEvent { + + private NewestVersionInfo info; + + public ImPushUpdateAppEvent(NewestVersionInfo info) { + this.info = info; + } + + public NewestVersionInfo getInfo() { + return info; + } + + public void setInfo(NewestVersionInfo info) { + this.info = info; + } +} diff --git a/core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/IUpgradeModel.java b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/IUpgradeModel.java new file mode 100644 index 0000000..b7c5d83 --- /dev/null +++ b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/IUpgradeModel.java @@ -0,0 +1,24 @@ +package com.chwl.core.upgrade.model; + +import com.chwl.core.upgrade.bean.NewestVersionInfo; + +import io.reactivex.Single; + +/** + * @author jack + * @Description + * @Date 2018/12/13 + */ +public interface IUpgradeModel { + + /** + * 获取最新版本信息,后台会根据我们的公参获取到我们的版本号渠道号 + * + * @return + */ + Single checkUpgrade(); + + void setHasShowDialog(boolean flag); + + boolean isHasShowDialog(); +} diff --git a/core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/UpgradeModel.java b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/UpgradeModel.java new file mode 100644 index 0000000..a6b6503 --- /dev/null +++ b/core/src/model_upgrade_app/java/com/chwl/core/upgrade/model/UpgradeModel.java @@ -0,0 +1,89 @@ +package com.chwl.core.upgrade.model; + +import com.chwl.core.R; +import com.chwl.core.base.BaseModel; +import com.chwl.core.bean.response.ServiceResult; +import com.chwl.core.upgrade.bean.NewestVersionInfo; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.net.rxnet.RxNet; +import com.chwl.library.utils.ResUtil; + +import io.reactivex.Single; +import io.reactivex.SingleSource; +import io.reactivex.functions.Function; +import retrofit2.http.GET; + +/** + * @author jack + * @Description + * @Date 2018/12/13 + */ +public class UpgradeModel extends BaseModel implements IUpgradeModel { + + private static final String TAG = "UpgradeModel"; + + private final Api api; + private static IUpgradeModel model; + + /** + * 如果已经弹窗过,则不再弹,保证一次使用过程中 + * 只弹一次 + */ + private boolean hasShowDialog = false; + + public static IUpgradeModel get() { + if (model == null) { + synchronized (UpgradeModel.class) { + if (model == null) { + model = new UpgradeModel(); + } + } + } + return model; + } + + private UpgradeModel() { + api = RxNet.create(Api.class); + } + + /** + * 获取最新版本信息,后台会根据我们的公参获取到我们的版本号渠道号 + * + * @return + */ + @Override + public Single checkUpgrade() { + return api.loadNewestVersion() + .compose(RxHelper.handleSchedulers()) + .flatMap((Function, SingleSource>) respone -> { + if (respone.isSuccess() && respone.getData() == null) { + return Single.error(new Throwable(ResUtil.getString(R.string.upgrade_model_upgrademodel_07))); + } + if (respone.isSuccess() && respone.getData() != null) { + return Single.just(respone.getData()); + } + return Single.error(new Throwable(respone.getMessage())); + }); + + } + + @Override + public void setHasShowDialog(boolean flag) { + this.hasShowDialog = flag; + } + + @Override + public boolean isHasShowDialog() { + return hasShowDialog; + } + + private interface Api { + /** + * 获取最新版本信息 + * + * @return + */ + @GET("/version/getNewestVersion") + Single> loadNewestVersion(); + } +}