66陪玩-origin

This commit is contained in:
oujunhui
2020-04-02 10:43:40 +08:00
commit 2f9d26fd7e
6758 changed files with 480551 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
package com.yizhuan.xchat_android_core;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.yizhuan.xchat_android_core.test", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,259 @@
package com.yizhuan.xchat_android_constants;
import com.yizhuan.xchat_android_core.BuildConfig;
/**
* Created by MadisonRong on 09/08/2018.
*/
public class XChatConstants {
/**
* 包名(各种缓存目录的根目录)
*/
public static final String XCHAT_DIR_NAME = "com.wudoo.qingxun";
/**
* sp名字
*/
public static final String XCHAT_SHARE_PREFERENCE_NAME = "qx_share_data";
/**
* 加密接口参数
*/
public static final String DES_ENCRYPT_KEY_SMS_PARAMS = "70d26f6a5c214d3b858f3f8daad7a161";
/**
* 加密接口签名
*/
public static final String DES_ENCRYPT_KEY_SMS_SIGN = "c8d514b3cdc44e898e027940e84f036c";
/**
* 本地数据库的名字(目前是用 realm 数据库)
*/
public static final String XCHAT_DATABASE_NAME = "qx.db";
/**
* 微信支付 APP ID
*/
public static final String WX_APP_ID = "";
/**
* bugly key (DEBUG)
*/
public static final String BUGLY_KEY_DEBUG = "0a1c8049b9";
/**
* bugly key (RELEASE)
*/
public static final String BUGLY_KEY_RELEASE = "3ffe6f95c2";
/**
* 云信 key (DEBUG)
*/
public static final String NIM_KEY_DEBUG = "2c375581f900a7b4ea3922fa7643f307";
/**
* 云信 key (RELEASE)
*/
public static final String NIM_KEY_RELEASE = "ca46478c438dda51d25306f52fe7506b";
/**
* 网易易盾 productNumber
*/
public static final String YI_DUN_PRODUCT_NUMBER = "YD00937811914948";
/**
* 网易易盾 业务 ID 注册
*/
public static final String YI_DUN_BUSINESS_ID = "af43d0f8752147c48f8281800da6049e";
/**
* 网易易盾 业务 ID 注册
*/
public static final String YI_DUN_LOGIN_BUSINESS_ID = "67881c7a69764c058435ba93a51b1285";
/**
* 数美-天网 的 organization
*/
public static final String SHU_MEI_TIAN_WANG_ORGANIZATION = "2qjgWI5tyNipa08YPjOt";
/**
* 声网 key
*/
public static final String AGORA_KEY = "c5f1fa4878d141f99f3e86ec59f619d9";
/**
* 七牛 access_url
*/
public static final String QINIU_ACCESS_URL = "https://img.erbanyy.com/";
/**
* 七牛 access_bucket
*/
public static final String QINIU_ACCESS_BUCKET = "erban-img";
/**
* 七牛 access_key
*/
public static final String QINIU_ACCESS_KEY = "_yrUANU6t3YGhNXZzdMNt03EhqDKUvFZ3oSbAAKJ";
/**
* 七牛 secret_key
*/
public static final String QINIU_SECRET_KEY = "PJ-NZ_qc0cabSebH2A9eYsodgRMFqV3tOFbP2Grr";
/**
* 阿里云日志空间名字
*/
public static final String ALIYUN_LOG_NAME = "qingxunlog";
/**
* 阿里云日志空间名字
*/
public static final String ALIYUN_LOG_STORE = "qingxunlog";
/**
* 百度统计 key
*/
public static final String BAIDU_APP_KEY = "a9d2302aef";
/**
* 友盟统计 key
*/
public static final String UMENG_APP_KEY = "5d3ac7853fc19591d2000384";
/**
* linkedMe key
*/
public static final String LINKED_ME_KEY = "978cd79c98264f836450afda1228762e";
/**
* 公屏第一条提示消息
*/
public static final String MESSAGE_VIEW_FIRST_MSG = "封面、背景及内容含低俗、引导、暴露等都会被屏蔽处理,泄露用户隐私、导流第三方平台、欺诈用户等将被封号处理。请珍惜自己的房间哦!";
/**
* 龙珠表情 ID
*/
public static final int DRAGON_BALL_ID = 40;
/**
* 分享 H5 的 URL
*/
public static final String SHARE_H5_URL = "/activity/double12/index.html";
/**
* 分享房间文本
*/
public static final String SHARE_ROOM_TEXT = "带你走进Ta的房间——";
/**
* 分享房间标题
*/
public static final String SHARE_ROOM_TITLE = "上轻寻轻松寻觅对的TA";
/**
* 分享房间 URL
*/
public static final String SHARE_ROOM_URL = "/modules/share/share_room.html?shareUid=";
/**
* 分享家族文本
*/
public static final String SHARE_FAMILY_TEXT = "加入家族,和你兴趣相投的小伙伴一起玩耍吧~";
/**
* 分享家族标题
*/
public static final String SHARE_FAMILY_TITLE = "hi,我想邀请您加入我的轻寻家族:";
/**
* 分享家族 URL
*/
public static final String SHARE_FAMILY_URL = "/modules/share/share_family.html";
/**
* 分享群组文本
*/
public static final String SHARE_TEAM_TEXT = "加入家族,和你兴趣相投的小伙伴一起玩耍吧~";
/**
* 分享群组标题
*/
public static final String SHARE_TEAM_TITLE = "hi,我想邀请您加入我的轻寻群聊:";
/**
* 分享群组 URL
*/
public static final String SHARE_TEAM_URL = "/modules/share/share_family.html";
/**
* 分享群组 URL
*/
public static final String SHARE_WORLD_DYNAMIC_URL = "/modules/world/share-page/index.html";
/**
* 游戏排行榜 URL
*/
public static final String GAME_ROOK = "/modules/erbanRank/game_rank.html?type=week";
/**
* 系统消息那个用户的UID
*/
public static final long SYSTEM_MESSAGER_UID = 90295478;
/**
* 测试环境系统消息那个用户的UID
*/
public static final long SYSTEM_MESSAGER_UID_DEBUG = 94188;
/**
* 小秘书那个用户的UID
*/
public static final long SECRETARY_UID = 90003989;
/**
* 测试小秘书那个用户的UID
*/
public static final long SECRETARY_UID_DEBUG = 91333;
/**
* 登录页面「如何登录」对应的 H5 页面
*/
public static final String LOGIN_ERBAN_ACCOUNT_URL = "/modules/rule/login_tips.html";
public static final String ROOM_INTRODUCTION = "可点击房间话题查看本房间公告";
public static final String SHOW = "show";
public static final String HIDE = "hide";
/**
* 网易七鱼客服系统key
*/
public static final String QI_YU_KF_KEY = BuildConfig.DEBUG ? "411661bd233f0805626044b6d65fa74a" : "411661bd233f0805626044b6d65fa74a";
public static final String UPDATE_VERSION_TIPS = "版本过旧,请下载最新版本哦";
public static final String NET_ERROR = "网络错误";
public static final String UNKOWN_ERROR = "未知错误";
public static final String EMPTY_USER_INFO_TIPS = "用户信息为空,请重新登录";
/**
* 当布局记录为空时的提示,比如礼物,充值
*/
public static final String EMPTY_RECORD_AND_THREE_MONTHS_TIPSS = "仅支持查看3个月内记录";
// 举报入口标识
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_WORLD = "world"; // 小世界
public static final String REPORT_TYPE_VOICE = "voice"; // 声音瓶子
public static final String REPORT_TYPE_MISSION = ""; // 师徒
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";//广场动态
}

View File

@@ -0,0 +1,272 @@
package com.yizhuan.xchat_android_core;
import android.text.TextUtils;
/**
* 请求接口接口地址
*/
public class UriProvider {
public static String SERVER_DEBUG = "http://beta.tutuyuyin.com/";
public static String SERVER_STAGING = "http://staging.tutuyuyin.com/";
public static String SERVER_RELEASE = "https://www.tutuyuyin.com/";
/**
* 初始化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;
}
/**
* 默认以下生产环境地址
*/
public static String JAVA_WEB_URL = "http://www.daxiaomao.com";
public static String IM_SERVER_URL = "https://www.daxiaomao.com";
public static String getGroupResourceBaseUri() {
return JAVA_WEB_URL.concat("/app/service/resource/list");
}
/**
* @return
*/
public static String getLotteryActivityPage() {
return IM_SERVER_URL.concat("/activity/double12/index.html");
}
/**
* 贵族订单页面
*
* @return -
*/
public static String getNobleOrderPage() {
return IM_SERVER_URL.concat("/modules/noble/order.html");
}
/**
* 获取房间背景(有动效)
*
* @return -
*/
public static String getRoomBg() {
return IM_SERVER_URL.concat("/modules/noble/roomBgList.html");
}
/**
* 获取贵族推荐页面
*
* @return -
*/
public static String getNobleIntroducePage() {
return IM_SERVER_URL.concat("/modules/noble/intro.html");
}
/**
* 贵族介绍页
*/
public static String getNobleIntro() {
return IM_SERVER_URL.concat("/modules/nobles/intro.html");
}
/**
* 等级界面
*/
public static String getUserLevelUrl() {
return JAVA_WEB_URL.concat("/modules/level/my-level.html?type=user");
}
/**
* 等级界面
*/
public static String getUserCharmLevelUrl() {
return JAVA_WEB_URL.concat("/modules/level/my-level.html?type=charm");
}
/**
* 耳伴头条 http://beta.tutuyuyin.com/modules/headNews/index.html
*
* @return
*/
public static String getErbanTopMessageUrl() {
return JAVA_WEB_URL.concat("/modules/headNews/index.html");
}
/**
* 耳伴头条(与我相关) http://beta.tutuyuyin.com/modules/headNews/index.html
*
* @return
*/
public static String getRelatedToMeHeadLineUrl() {
return JAVA_WEB_URL.concat("/modules/headNews/index.html?atMe=1");
}
/**
* 创建家族
*
* @return
*/
public static String getCreateFamilyUrl() {
return JAVA_WEB_URL.concat("/modules/family/create.html");
}
/**
* 家族指南
*
* @return
*/
public static String getFamilyInstructionUrl() {
return JAVA_WEB_URL.concat("/modules/family/handbook.html");
}
/**
* 家族币获取帮助
*
* @return
*/
public static String getFamilyCurrencyHelpUrl() {
return JAVA_WEB_URL.concat("/modules/family/faq.html");
}
/**
* 举报页
*
* @return
*/
public static String getReportPageUrl() {
return JAVA_WEB_URL.concat("/modules/report/index.html");
}
/**
* 公聊大厅 --> 面壁墙
*
* @return
*/
public static String getReportWallUrl() {
return JAVA_WEB_URL.concat("/modules/inform/inform-list.html ");
}
/**
* 公聊大厅 --> 帮助
*
* @return
*/
public static String getPublicChatHallHelpUrl() {
return JAVA_WEB_URL.concat("/modules/inform/help.html");
}
/**
* 用户协议H5
*
* @return
*/
public static String getUserProtocolUrl() {
return JAVA_WEB_URL.concat("/modules/guide/protocol.html");
}
/**
* 举报H5
*
* @return
*/
public static String getUserReportUrl() {
return JAVA_WEB_URL.concat("/modules/inform/index.html");
}
/**
* 小世界-说明
*/
public static String getMiniWorldRuleUrl() {
return JAVA_WEB_URL.concat("/modules/world-rule/index.html");
}
/**
* 轻寻专属,实名认证页面
*
* @return
*/
public static String getTutuRealNamePage() {
return JAVA_WEB_URL.concat("/modules/identity/new.html");
}
/**
* 轻寻专属101技能认证页面
*
* @return
*/
public static String getTutuAprove() {
return JAVA_WEB_URL.concat("/activity/tutu101-2/index.html");
}
/**
* 师徒攻略
*
* @return
*/
public static String getMentoringRelationshipGuide() {
return JAVA_WEB_URL.concat("/modules/strategy/strategy.html");
}
/**
* 名师排行榜
*
* @return
*/
public static String getMentorRankingList() {
return JAVA_WEB_URL.concat("/modules/strategy/teacher-list.html");
}
public static String getCommnunityNorms() {
return JAVA_WEB_URL.concat("/modules/rule/community-norms.html");
}
/**
* 隐私协议
*
* @return
*/
public static String getPrivacyAgreement() {
return JAVA_WEB_URL.concat("/modules/rule/privacy-wap.html");
}
public static String getUserAgreement() {
return JAVA_WEB_URL.concat("/modules/guide/protocol.html");
}
public static String getLinkUrl(String linkUrl) {
if (TextUtils.isEmpty(linkUrl)) {
return JAVA_WEB_URL;
}
return JAVA_WEB_URL.concat(linkUrl);
}
}

View File

@@ -0,0 +1,159 @@
package com.yizhuan.xchat_android_core.audio;
import com.google.gson.JsonElement;
import com.yizhuan.xchat_android_core.audio.bean.HistoryVoiceInfo;
import com.yizhuan.xchat_android_core.audio.bean.SaveVoiceSuccessResultInfo;
import com.yizhuan.xchat_android_core.audio.bean.UserVoiceInfo;
import com.yizhuan.xchat_android_core.audio.bean.VoiceCardInfo;
import com.yizhuan.xchat_android_core.audio.bean.VoiceMatchInfo;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_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<List<UserVoiceInfo>> getMyVoiceInfoList(long uid) {
return api.getMyVoiceInfoList(uid)
.compose(RxHelper.handleCommon(ArrayList::new));
}
@Override
public Single<List<VoiceCardInfo>> getVoiceCardInfoList(long uid, Integer type, int pageSize) {
return api.getVoiceCardInfoList(uid, type, pageSize)
.compose(RxHelper.handleCommon(ArrayList::new));
}
@Override
public Single<SaveVoiceSuccessResultInfo> 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<List<VoiceMatchInfo>> getVoiceMatchList(int gender, int pageSize) {
return api.apiVoiceMatchList(AuthModel.get().getCurrentUid(), gender, pageSize)
.compose(RxHelper.handleCommon(ArrayList::new));
}
@Override
public Single<String> likeOrUnlikeVoice(long uid, long voiceId, int type) {
return api.likeOrUnlikeVoice(uid, voiceId, type)
.compose(RxHelper.handleIgnoreData());
}
@Override
public Single<String> syncHistoryVoice(long uid, long voiceId) {
return api.syncHistoryVoice(uid, voiceId)
.compose(RxHelper.handleIgnoreData());
}
@Override
public Single<HistoryVoiceInfo> queryHistoryVoice(long uid) {
return api.queryHistoryVoice(uid)
.compose(RxHelper.handleCommon(HistoryVoiceInfo::new));
}
@Override
public Single<String> addPlayCount(long uid, Long voiceId, long voiceUid) {
return api.addPlayCount(uid, voiceId, voiceUid)
.compose(RxHelper.handleIgnoreData());
}
private interface Api {
/**
* 我的声音列表
*/
@POST("/voice/my")
Single<ServiceResult<List<UserVoiceInfo>>> getMyVoiceInfoList(@Query("uid") long uid);
/**
* 随机获取pia剧本
*/
@GET("/voice/pia/get")
Single<ServiceResult<List<VoiceCardInfo>>> getVoiceCardInfoList(@Query("uid") long uid,
@Query("type") Integer type,
@Query("pageSize") int pageSize);
/**
* 保存声音
*/
@POST("/voice/save")
Single<ServiceResult<SaveVoiceSuccessResultInfo>> 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<ServiceResult<List<VoiceMatchInfo>>> apiVoiceMatchList(@Query("uid") long uid,
@Query("gender") int gender,
@Query("pageSize") int pageSize);
/**
* 喜欢/不喜欢 声音
*/
@POST("/voice/like")
Single<ServiceResult<JsonElement>> likeOrUnlikeVoice(@Query("uid") long uid,
@Query("voiceId") long voiceId,
@Query("type") int type);
/**
* 同步旧版本个人介绍声音到声音瓶子
*/
@POST("/voice/history/sync")
Single<ServiceResult<JsonElement>> syncHistoryVoice(@Query("uid") long uid,
@Query("voiceId") long voiceId);
/**
* 查询旧版本个人介绍声音
*/
@POST("/voice/history/query")
Single<ServiceResult<HistoryVoiceInfo>> queryHistoryVoice(@Query("uid") long uid);
/**
* 增加播放次数
*/
@POST("/voice/add/play/count")
Single<ServiceResult<JsonElement>> addPlayCount(@Query("uid") long uid,
@Query("voiceId") Long voiceId,
@Query("voiceUid") long voiceUid);
}
}

View File

@@ -0,0 +1,87 @@
package com.yizhuan.xchat_android_core.audio;
import com.yizhuan.xchat_android_core.audio.bean.HistoryVoiceInfo;
import com.yizhuan.xchat_android_core.audio.bean.SaveVoiceSuccessResultInfo;
import com.yizhuan.xchat_android_core.audio.bean.UserVoiceInfo;
import com.yizhuan.xchat_android_core.audio.bean.VoiceCardInfo;
import com.yizhuan.xchat_android_core.audio.bean.VoiceMatchInfo;
import com.yizhuan.xchat_android_core.base.IModel;
import java.util.List;
import io.reactivex.Single;
public interface IAudioModel extends IModel {
/**
* 我的声音列表
*
* @param uid 用户Uid
*/
Single<List<UserVoiceInfo>> getMyVoiceInfoList(long uid);
/**
* 随机获取pia剧本(声音卡片)
*
* @param uid 用户Uid
* @param type 1.歌词 2.情话 (不传则全部)
* @param pageSize 一页大小默认10
*/
Single<List<VoiceCardInfo>> 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<SaveVoiceSuccessResultInfo> saveVoice(long uid, String voiceUrl, int voiceLength,
Long voiceId, Long piaId, int type);
/**
* 声音匹配列表
*
* @param gender 性别
*/
Single<List<VoiceMatchInfo>> getVoiceMatchList(int gender, int pageSize);
/**
* 喜欢/不喜欢 声音
*
* @param uid 听者Uid
* @param voiceId 声音id
* @param type 0.不喜欢 1.喜欢
*/
Single<String> likeOrUnlikeVoice(long uid, long voiceId, int type);
/**
* 同步旧版本个人介绍声音到声音瓶子
*
* @param uid 用户Uid
* @param voiceId 声音id
*/
Single<String> syncHistoryVoice(long uid, long voiceId);
/**
* 查询旧版本个人介绍声音
*
* @param uid 用户Uid
*/
Single<HistoryVoiceInfo> queryHistoryVoice(long uid);
/**
* 增加播放次数
*
* @param uid 听者Uid
* @param voiceId 声音id不传时为voiceUid对应的默认声音
* @param voiceUid 声音所属用户Uid
*/
Single<String> addPlayCount(long uid, Long voiceId, long voiceUid);
}

View File

@@ -0,0 +1,137 @@
package com.yizhuan.xchat_android_core.audio.bean;
/**
* 查询旧版本个人介绍声音
*/
public class HistoryVoiceInfo {
/**
* historyVoice : {"id":14,"uid":900005,"defFlag":true,"status":2,"playCount":0,"likeCount":0,"gender":1,"voiceUrl":"https://img.erbanyy.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://img.erbanyy.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;
}
}
}

View File

@@ -0,0 +1,110 @@
package com.yizhuan.xchat_android_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;
}
}

View File

@@ -0,0 +1,109 @@
package com.yizhuan.xchat_android_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;
}
}

View File

@@ -0,0 +1,54 @@
package com.yizhuan.xchat_android_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;
}
}

View File

@@ -0,0 +1,41 @@
package com.yizhuan.xchat_android_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://img.erbanyy.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;
}

View File

@@ -0,0 +1,85 @@
package com.yizhuan.xchat_android_core.channel;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.user.event.CurrentUserInfoCompleteEvent;
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
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<String>() {
@Override
public void subscribe(SingleEmitter<String> e) throws Exception {
//这里判断新设备,新用户
UserInfo userInfo = UserModel.get().getUserInfo(uid).blockingGet();
if (!userInfo.isNewUser()) {
e.onSuccess("不是新用户。");
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("请求成功->"+respCode );
e.onSuccess("请求成功");
}else {
Logger.i("请求成功->" + respCode);
e.onError(new Throwable("请求异常 code:"+respCode));
}
httpURLConnection.disconnect();
}
}).subscribeOn(Schedulers.io())
.subscribe();
}
}
/**
* 获取WM_cpa渠道的统计连接
* @return
*/
private String getWMCPAChannelStatisticUrl() {
return "http://veim.lrswl.com/effect.php?type=ef&pid=2735";
}
}

View File

@@ -0,0 +1,6 @@
package com.yizhuan.xchat_android_core.channel;
import com.yizhuan.xchat_android_core.base.IModel;
public interface IChannelModel extends IModel {
}

View File

@@ -0,0 +1,7 @@
package com.yizhuan.xchat_android_core.constant;
public class SharePreferenceKey {
/**是否显示首页的遮罩*/
public static final String KEY_SHOW_HOME_COVER = "SHOW_HOME_COVER";
}

View File

@@ -0,0 +1,53 @@
package com.yizhuan.xchat_android_core.home;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import com.yizhuan.xchat_android_library.coremanager.IBaseCore;
import java.util.List;
/**
* 主页接口逻辑处理
* Created by zhouxiangfeng on 2017/5/17.
*/
public interface IHomeCore extends IBaseCore {
//全局数据--------------------------
List<TabInfo> getMainTabInfos();
void setMainTabInfos(List<TabInfo> tabInfoList);
//接口数据------------------------------
void getHomeData(int page, int pageSize);
void getLightChatData(int tabType);
void getHotData(int tabType);
void getHomePartyData(int tabType);
void commitFeedback(long uid, String feedbackDesc, String contact);
void getHomeBanner();
/** 获取首页排行数据 */
void getRankingData();
/** 获取首页tab数据 */
void getMainTabData();
/**
* 获取tab下的数据
*
* @param tagId tab的id
* @param pageNum 当前页数
* @param pageSize 页的总数
*/
void getMainDataByTab(int tagId, int pageNum, int pageSize);
/**
* 获取发现页数据
* @param udi
*/
void loadFindPage(String udi);
}

View File

@@ -0,0 +1,75 @@
package com.yizhuan.xchat_android_core.home;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.home.bean.FindInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.HomeRoomList;
import com.yizhuan.xchat_android_library.coremanager.ICoreClient;
import java.util.List;
/**
*
* @author zhouxiangfeng
* @date 2017/5/17
*/
public interface IHomeCoreClient extends ICoreClient {
String METHOD_ON_GET_HOME_DATA = "onGetHomeData";
String METHOD_GET_HOME_LIST_ERROR = "onGetHomeListFail";
String METHOD_ON_GET_DATA_BY_TAB = "onGetHomeDataByTab";
String METHOD_ON_GET_DATA_BY_TAB_ERROR = "onGetHomeDataByTabFail";
public static final String METHOD_ON_GET_HOT_DATA = "onGetHotData";
public static final String METHOD_ON_GET_HOT_DATA_FAIL = "onGetHotDataFail";
public static final String METHOD_ON_GET_LIGHT_CHAT_DATA = "onGetLightChatData";
public static final String METHOD_ON_GET_LIGHT_CHAT_DATA_FAIL = "onGetLightChatDataFail";
public static final String METHOD_ON_GET_HOME_PARTY_DATA = "onGetHomePartyData";
public static final String METHOD_ON_GET_HOME_PARTY_DATA_FAIL = "onGetHomePartyDataFail";
public static final String METHOD_ON_COMMIT_BACK = "onCommitFeedback";
public static final String METHOD_ON_COMMIT_BACK_FAIL = "onCommitFeedbackFail";
public static final String METHOD_ON_GET_BANNER_LIST = "onGetBannerList";
public static final String METHOD_ON_GET_BANNER_LIST_FAIL = "onGetBannerListFail";
String METHOD_ON_GET_HOME_RANKING_LIST = "onGetHomeRankingList";
String METHOD_ON_GET_HOME_RANKING_LIST_ERROR = "onGetHomeRankingListFail";
String METHOD_ON_GET_HOME_TAB_LIST = "onGetHomeTabList";
String METHOD_ON_GET_HOME_TAB_LIST_ERROR = "onGetHomeTabListFail";
public void onGetHomeData(List<HomeRoom> homeDataList);
public void onGetHomeListFail(String error);
public void onGetHotData(HomeRoomList homeRoomList);
public void onGetHotDataFail(String error);
public void onGetLightChatData(HomeRoomList homeRoomList);
public void onGetLightChatDataFail(String error);
public void onGetHomePartyData(HomeRoomList homeRoomList);
public void onGetHomePartyDataFail(String error);
void onGetBannerList(List<BannerInfo> bannerInfoList);
void onGetBannerListFail();
void onCommitFeedback();
void onCommitFeedbackFail(String error);
String METHOD_ON_LOAD_FIND_PAGE_DATA = "onLoadFindPageData";
void onLoadFindPageData(FindInfo findInfo);
String METHOD_ON_LOAD_FIND_PAGE_DATA_FAIL = "onLoadFindPageDataFail";
void onLoadFindPageDataFail(String error);
}

View File

@@ -0,0 +1,89 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import lombok.Data;
/**
* Created by Administrator on 2017/8/7.
*/
@Data
public class BannerInfo implements Parcelable, Serializable {
/**
* 跳转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;
/**
* routerhandler跳转规则
*/
public final static transient int SKIP_TYPE_ROUTER = 5;
/*
bannerId1 //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;
protected BannerInfo(Parcel in) {
bannerId = in.readInt();
bannerName = in.readString();
bannerPic = in.readString();
skipType = in.readInt();
skipUri = 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);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<BannerInfo> CREATOR = new Creator<BannerInfo>() {
@Override
public BannerInfo createFromParcel(Parcel in) {
return new BannerInfo(in);
}
@Override
public BannerInfo[] newArray(int size) {
return new BannerInfo[size];
}
};
}

View File

@@ -0,0 +1,57 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/17
*/
@Data
public class CategoryInfo implements Parcelable,Serializable {
private String icon;
private String title;
private List<TabInfo> tabInfos;
public CategoryInfo() {
}
protected CategoryInfo(Parcel in) {
icon = in.readString();
title = in.readString();
tabInfos = in.createTypedArrayList(TabInfo.CREATOR);
}
public static final Creator<CategoryInfo> CREATOR = new Creator<CategoryInfo>() {
@Override
public CategoryInfo createFromParcel(Parcel in) {
return new CategoryInfo(in);
}
@Override
public CategoryInfo[] newArray(int size) {
return new CategoryInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(icon);
dest.writeString(title);
dest.writeTypedList(tabInfos);
}
}

View File

@@ -0,0 +1,17 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/11/15
*/
@Data
public class ClassifiedRoomInfo {
private List<HomeRoom> rooms;
private ArrayList<BannerInfo> banners;
}

View File

@@ -0,0 +1,68 @@
package com.yizhuan.xchat_android_core.home.bean;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/5/24
*/
@Data
public class FindEntranceInfo {
public final static int TYPE_H5 = 1;
public final static int TYPE_ROOM = 2;
public final static int TYPE_GAME = 3;
public final static int TYPE_DECORATION = 4;
/**
* 如果type=5表示转到{@link com.yizhuan.xchat_android_core.im.custom.bean.RouterType} 处理
*/
public final static int TYPE_TO_ROUTERTYPE = 5;
/**
* 签到入口
*/
public final static int ACTIVITYTYPE_SIGN_IN = 1;
/**
* 任务入口
*/
public final static int ACTIVITYTYPE_TASK = 2;
private int id;
private String pic;
private int type;//'跳转类型1是链接 2是房间 3是游戏 4是装扮商城',
private String param;
//start**********以下3.2.4之后接入
/**
* {@link com.yizhuan.xchat_android_core.im.custom.bean.RouterType}
*/
private int routerType;//3.2.4之后接入优先获取旧版的type得不到结果再处理routerType
private String routerValue;
/**
* 今日未完成的任务数量,任务和签到的时候用到
*/
private int missionNum;
/**
* 活动类型1签到2任务
*/
private int activityType;
/**
* 今日是否已经签到
*/
private boolean signStatus;
/**
* 小图
*/
private String minPic;
/**
* 名称
*/
private String name;
//end********
}

View File

@@ -0,0 +1,24 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.yizhuan.xchat_android_core.family.bean.FamilyInfo;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/5/31
*/
@Data
public class FindInfo {
private List<FindEntranceInfo> banners;
private FamilyInfo family;
/**
* 发现也banner
*/
private List<BannerInfo> bannerVos;
private List<TopMessage> topLineVos;
}

View File

@@ -0,0 +1,554 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.util.List;
public class GameHomeInfo {
private List<RoomVosBean> roomVos;
public List<RoomVosBean> getRoomVos() {
return roomVos;
}
public void setRoomVos(List<RoomVosBean> roomVos) {
this.roomVos = roomVos;
}
public static class RoomVosBean {
/**
* data : [{"uid":902385,"officeUser":1,"roomId":59451609,"title":"神啊救救我啊的房间","type":3,"meetingName":"5521f0cd18c142cdacb64b4914d164af","valid":true,"operatorStatus":1,"avatar":"https://img.erbanyy.com/picture_1552544625116.jpg?imageslim","roomDesc":"","backPic":"","openTime":"Mar 20, 2019 5:21:48 PM","onlineNum":0,"abChannelType":1,"gender":2,"nick":"神啊救救我啊","erbanNo":9090518,"roomPwd":"","roomTag":"聊天","calcSumDataIndex":0,"tagId":8,"tagPict":"https://img.erbanyy.com/new_tag_%E8%81%8A%E5%A4%A9@3x.png","recomSeq":0,"badge":"https://img.erbanyy.com/Fs-YL5F0qpA2bZbmRcwQInh12NXg?imageslim","isPermitRoom":1,"isRecom":0,"count":0,"hasAnimationEffect":true,"audioQuality":1,"isCloseScreen":false,"hasDragonGame":false,"hasKTVPriv":true,"isOpenKTV":false,"isOpenGame":false,"roomModeType":3,"limitType":"lock","roomGame":{"roomId":59451609,"uid":902385,"startUid":0,"gameId":"","gameName":"","status":2,"createTime":"Mar 19, 2019 10:59:43 AM","updateTime":"Mar 20, 2019 11:01:57 AM"},"isPureMode":false,"isExceptionClose":false}]
* title : 102
* type : 3
* moduleId : 42
* seqNo : 1
*/
private String title;
private int type;
private int moduleId;
private int seqNo;
private List<DataBean> data;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getModuleId() {
return moduleId;
}
public void setModuleId(int moduleId) {
this.moduleId = moduleId;
}
public int getSeqNo() {
return seqNo;
}
public void setSeqNo(int seqNo) {
this.seqNo = seqNo;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* uid : 902385
* officeUser : 1
* roomId : 59451609
* title : 神啊救救我啊的房间
* type : 3
* meetingName : 5521f0cd18c142cdacb64b4914d164af
* valid : true
* operatorStatus : 1
* avatar : https://img.erbanyy.com/picture_1552544625116.jpg?imageslim
* roomDesc :
* backPic :
* openTime : Mar 20, 2019 5:21:48 PM
* onlineNum : 0
* abChannelType : 1
* gender : 2
* nick : 神啊救救我啊
* erbanNo : 9090518
* roomPwd :
* roomTag : 聊天
* calcSumDataIndex : 0
* tagId : 8
* tagPict : https://img.erbanyy.com/new_tag_%E8%81%8A%E5%A4%A9@3x.png
* recomSeq : 0
* badge : https://img.erbanyy.com/Fs-YL5F0qpA2bZbmRcwQInh12NXg?imageslim
* isPermitRoom : 1
* isRecom : 0
* count : 0
* hasAnimationEffect : true
* audioQuality : 1
* isCloseScreen : false
* hasDragonGame : false
* hasKTVPriv : true
* isOpenKTV : false
* isOpenGame : false
* roomModeType : 3
* limitType : lock
* roomGame : {"roomId":59451609,"uid":902385,"startUid":0,"gameId":"","gameName":"","status":2,"createTime":"Mar 19, 2019 10:59:43 AM","updateTime":"Mar 20, 2019 11:01:57 AM"}
* isPureMode : false
* isExceptionClose : false
*/
private int uid;
private int officeUser;
private int roomId;
private String title;
private int type;
private String meetingName;
private boolean valid;
private int operatorStatus;
private String avatar;
private String roomDesc;
private String backPic;
private String openTime;
private int onlineNum;
private int abChannelType;
private int gender;
private String nick;
private int erbanNo;
private String roomPwd;
private String roomTag;
private int calcSumDataIndex;
private int tagId;
private String tagPict;
private int recomSeq;
private String badge;
private int isPermitRoom;
private int isRecom;
private int count;
private boolean hasAnimationEffect;
private int audioQuality;
private boolean isCloseScreen;
private boolean hasDragonGame;
private boolean hasKTVPriv;
private boolean isOpenKTV;
private boolean isOpenGame;
private int roomModeType;
private String limitType;
private RoomGameBean roomGame;
private boolean isPureMode;
private boolean isExceptionClose;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public int getOfficeUser() {
return officeUser;
}
public void setOfficeUser(int officeUser) {
this.officeUser = officeUser;
}
public int getRoomId() {
return roomId;
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getMeetingName() {
return meetingName;
}
public void setMeetingName(String meetingName) {
this.meetingName = meetingName;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
public int getOperatorStatus() {
return operatorStatus;
}
public void setOperatorStatus(int operatorStatus) {
this.operatorStatus = operatorStatus;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getRoomDesc() {
return roomDesc;
}
public void setRoomDesc(String roomDesc) {
this.roomDesc = roomDesc;
}
public String getBackPic() {
return backPic;
}
public void setBackPic(String backPic) {
this.backPic = backPic;
}
public String getOpenTime() {
return openTime;
}
public void setOpenTime(String openTime) {
this.openTime = openTime;
}
public int getOnlineNum() {
return onlineNum;
}
public void setOnlineNum(int onlineNum) {
this.onlineNum = onlineNum;
}
public int getAbChannelType() {
return abChannelType;
}
public void setAbChannelType(int abChannelType) {
this.abChannelType = abChannelType;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
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 String getRoomPwd() {
return roomPwd;
}
public void setRoomPwd(String roomPwd) {
this.roomPwd = roomPwd;
}
public String getRoomTag() {
return roomTag;
}
public void setRoomTag(String roomTag) {
this.roomTag = roomTag;
}
public int getCalcSumDataIndex() {
return calcSumDataIndex;
}
public void setCalcSumDataIndex(int calcSumDataIndex) {
this.calcSumDataIndex = calcSumDataIndex;
}
public int getTagId() {
return tagId;
}
public void setTagId(int tagId) {
this.tagId = tagId;
}
public String getTagPict() {
return tagPict;
}
public void setTagPict(String tagPict) {
this.tagPict = tagPict;
}
public int getRecomSeq() {
return recomSeq;
}
public void setRecomSeq(int recomSeq) {
this.recomSeq = recomSeq;
}
public String getBadge() {
return badge;
}
public void setBadge(String badge) {
this.badge = badge;
}
public int getIsPermitRoom() {
return isPermitRoom;
}
public void setIsPermitRoom(int isPermitRoom) {
this.isPermitRoom = isPermitRoom;
}
public int getIsRecom() {
return isRecom;
}
public void setIsRecom(int isRecom) {
this.isRecom = isRecom;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public boolean isHasAnimationEffect() {
return hasAnimationEffect;
}
public void setHasAnimationEffect(boolean hasAnimationEffect) {
this.hasAnimationEffect = hasAnimationEffect;
}
public int getAudioQuality() {
return audioQuality;
}
public void setAudioQuality(int audioQuality) {
this.audioQuality = audioQuality;
}
public boolean isIsCloseScreen() {
return isCloseScreen;
}
public void setIsCloseScreen(boolean isCloseScreen) {
this.isCloseScreen = isCloseScreen;
}
public boolean isHasDragonGame() {
return hasDragonGame;
}
public void setHasDragonGame(boolean hasDragonGame) {
this.hasDragonGame = hasDragonGame;
}
public boolean isHasKTVPriv() {
return hasKTVPriv;
}
public void setHasKTVPriv(boolean hasKTVPriv) {
this.hasKTVPriv = hasKTVPriv;
}
public boolean isIsOpenKTV() {
return isOpenKTV;
}
public void setIsOpenKTV(boolean isOpenKTV) {
this.isOpenKTV = isOpenKTV;
}
public boolean isIsOpenGame() {
return isOpenGame;
}
public void setIsOpenGame(boolean isOpenGame) {
this.isOpenGame = isOpenGame;
}
public int getRoomModeType() {
return roomModeType;
}
public void setRoomModeType(int roomModeType) {
this.roomModeType = roomModeType;
}
public String getLimitType() {
return limitType;
}
public void setLimitType(String limitType) {
this.limitType = limitType;
}
public RoomGameBean getRoomGame() {
return roomGame;
}
public void setRoomGame(RoomGameBean roomGame) {
this.roomGame = roomGame;
}
public boolean isIsPureMode() {
return isPureMode;
}
public void setIsPureMode(boolean isPureMode) {
this.isPureMode = isPureMode;
}
public boolean isIsExceptionClose() {
return isExceptionClose;
}
public void setIsExceptionClose(boolean isExceptionClose) {
this.isExceptionClose = isExceptionClose;
}
public static class RoomGameBean {
/**
* roomId : 59451609
* uid : 902385
* startUid : 0
* gameId :
* gameName :
* status : 2
* createTime : Mar 19, 2019 10:59:43 AM
* updateTime : Mar 20, 2019 11:01:57 AM
*/
private int roomId;
private int uid;
private int startUid;
private String gameId;
private String gameName;
private int status;
private String createTime;
private String updateTime;
public int getRoomId() {
return roomId;
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public int getStartUid() {
return startUid;
}
public void setStartUid(int startUid) {
this.startUid = startUid;
}
public String getGameId() {
return gameId;
}
public void setGameId(String gameId) {
this.gameId = gameId;
}
public String getGameName() {
return gameName;
}
public void setGameName(String gameName) {
this.gameName = gameName;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
}
}
}
}

View File

@@ -0,0 +1,51 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.io.Serializable;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/11/22
*/
@Data
public class HomeHallMsgInfo implements Serializable, MultiItemEntity {
public static final transient int ITEM_TYPE_LEFT = 1;
public static final transient int ITEM_TYPE_RIGHT = 2;
public static final transient int ITEM_TYPE_TIP = 3;
public static final transient int MESSAGE_TYPE_TEXT = 1;
public static final transient int MESSAGE_TYPE_GIFT = 2;
public static final transient int MESSAGE_TYPE_TIME = 3;
private String fromAccount;
private String senderAvatar;
private String nick;
private CharSequence content;
private String userLevelUrl;
private String userCharmLevelUrl;
private String nobleLevel;
private boolean isOfficial;
private boolean isNewUser;
private boolean isPrettyErbanNo;
private String targetNick;
private String giftImage;
private int giftCount;
private String giftName;
private String formatTime;
private int messageType = MESSAGE_TYPE_TEXT;
private int itemType;
@Override
public int getItemType() {
return itemType;
}
}

View File

@@ -0,0 +1,26 @@
package com.yizhuan.xchat_android_core.home.bean;
/**
* 首页接口数据类型,主要用于区分客户端页面处理类型
* Created by lvzebiao on 2019/2/20.
*/
public interface HomeImpDataType {
/**
* 墙裂推荐
*/
int RECOMENDED = 1;
/**
* 热门
*/
int HOT = 2;
/**
* 后台可任意配置模块
*/
int CONFIG = 3;
/**
* banner信息
*/
int BANNER = 4;
}

View File

@@ -0,0 +1,37 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.google.gson.JsonElement;
import java.util.List;
import lombok.Data;
/**
* <p> 首页数据 </p>
*
* @author Administrator
* @date 2017/11/22
*/
@Data
public class HomeInfo {
private int type;
private String title;
private String icon;
private JsonElement data;
/**
* 表示大图的数量
*/
private int maxNum;
/**
* 表示小图的数量
*/
private int listNum;
private String tagId;
public List<BannerInfo> banners;
/** 排行数据 */
public RankingInfo rankHome;
/** 热门推荐 */
public List<HomeRoom> hotRooms;
/** 房间推荐 */
public List<HomeRoom> listRoom;
}

View File

@@ -0,0 +1,148 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.io.Serializable;
import lombok.Data;
/**
* <p> 首页View model </p>
*
* @author jack
* @date 2017/11/16
*/
@Data
public class HomeItem<T extends Serializable> implements MultiItemEntity, Parcelable, Serializable{
//
public static final transient int TYPE_DIV_1 = -100;//分割线类型1
public static final transient int TYPE_DIV_2 = -102;//分割线类型2
public static final transient int TYPE_BANNER = 4;//首页banner
public static final transient int TYPE_RECOMMEND = 1; //耳伴推荐
//显示方式是3N+M的方式即是1行3列和1行1列混排
public static final transient int TYPE_CONFIG = 3; //运营可配置模块
//显示方式是2*N的方式即是n行2列
public static final transient int TYPE_TWO_LINES = 5; //运营可配置模块
public static final transient int TYPE_TOP_MESSAGE = 8;//耳伴头条
public static final transient int TYPE_MONSTER = -10;//怪兽
public static final transient int TYPE_KTV = 9; //ktv房间列表
public static final transient int TYPE_HALL = -20;//交友大厅
public static final transient int TYPE_MAKE_FRIENDS = 7;//交友
public static final transient int TYPE_SQUARE_PIC = 21;//首页显示的正方形图的item
public static final transient int TYPE_LINEAR_LITTLE_PIC = 22;//首页显示的横向小图普通item
public static final transient int TYPE_SQUARE_EMPTY = 23;//虚位以待
public static final transient int TYPE_BLOCK_TITLE = 24;//每个模块对应的标题
/**
* 两列单个显示
*/
public static final transient int TYPE_BLOCK_SINGLE = 25;
/**
* banner 不带顶部背景
*/
public static final transient int TYPE_BANNER_NO_TOP_BG = 26;
/**
* 新版首页用户列表
*/
public static final transient int TYPE_USER_LINEAR = 27;
/**
* 两列数据的虚位以待
*/
public static final transient int TYPE_DOUBLE_SQUARE_EMPTY = 28;//虚位以待
//类型
private int itemType;
//正常数据
private T data;
//分割线描述0、1、2代表格子第几列
//-1代表需要底部划线-2代表不需要
//-3是其他头部
private int dividerDesc;
private boolean isShowRankHalfIcon; // 推荐位第三位显示半小时榜图标
private boolean isHotItem;
public HomeItem(int itemType) {
this(itemType, null);
}
public HomeItem(int itemType, T data) {
this(itemType, data, false);
}
public HomeItem(int itemType, T data, boolean isHotItem) {
this.itemType = itemType;
this.data = data;
this.dividerDesc = -3;
this.isHotItem = isHotItem;
}
protected HomeItem(Parcel in) {
itemType = in.readInt();
data = (T) in.readSerializable();
dividerDesc = in.readInt();
isHotItem = in.readByte() != 0;
isShowRankHalfIcon = in.readByte() != 0;
}
public static final Creator<HomeItem> CREATOR = new Creator<HomeItem>() {
@Override
public HomeItem createFromParcel(Parcel in) {
return new HomeItem(in);
}
@Override
public HomeItem[] newArray(int size) {
return new HomeItem[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);
dest.writeInt(dividerDesc);
dest.writeByte((byte) (isHotItem ? 1 : 0));
dest.writeByte((byte) (isShowRankHalfIcon ? 1 : 0));
}
}

View File

@@ -0,0 +1,17 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* 首页更多数据
* Created by lvzebiao on 2019/2/21.
*/
@Data
public class HomeMoreData implements Serializable {
private List<HomeRoom> rooms;
}

View File

@@ -0,0 +1,103 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import com.yizhuan.xchat_android_core.level.UserLevelVo;
import com.yizhuan.xchat_android_core.noble.NobleInfo;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author zhouxiangfeng
* @date 2017/5/17
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HomeRoom extends RoomInfo implements Parcelable, Serializable, MultiItemEntity {
/**格子布局*/
public final static int TYPE_GIRD = 1;
/**格子布局不足3个时的填充布局*/
public final static int TYPE_GIRD_EMPTY = 2;
/**线性横向布局*/
public final static int TYPE_LINEAR = 3;
//性别 1:男 2女 0 :未知
// private int gender;
//
//
// private String nick;
private long erbanNo;
//角标相关的
public String badge;
/** 是否是靓号1靓号 */
public boolean hasPrettyErbanNo;
public NobleInfo nobleUsers;
public UserLevelVo userLevelVo;
public boolean newUser;
/**首页星推荐的类型*/
private int itemStarType = TYPE_LINEAR;
/**房间描述*/
private String description;
/** 房间技能标签 */
private String skillTag;
/** 背景图标 */
private String icon;
public HomeRoom() {
super();
}
protected HomeRoom(Parcel in) {
super(in);
// gender = in.readInt();
// nick = in.readString();
erbanNo = in.readLong();
badge = in.readString();
hasPrettyErbanNo = in.readByte() != 0;
newUser = in.readByte() != 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
// dest.writeInt(gender);
// dest.writeString(nick);
dest.writeLong(erbanNo);
dest.writeString(badge);
dest.writeByte((byte) (hasPrettyErbanNo ? 1 : 0));
dest.writeByte((byte) (newUser ? 1 : 0));
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<HomeRoom> CREATOR = new Creator<HomeRoom>() {
@Override
public HomeRoom createFromParcel(Parcel in) {
return new HomeRoom(in);
}
@Override
public HomeRoom[] newArray(int size) {
return new HomeRoom[size];
}
};
@Override
public int getItemType() {
return itemStarType;
}
}

View File

@@ -0,0 +1,38 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.io.Serializable;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/11/2
*/
@Data
public class HomeRoomItem<T extends Serializable> implements MultiItemEntity, Serializable {
public static final transient int TYPE_HOME_ROOM = 1;//房间
public static final transient int TYPE_BANNER = 2;//banner
public static final transient int TYPE_TOP_THREE = 3;
public static final transient int TYPE_TOP_EMPTY = 4;
private boolean isBannerInTop = false;
//类型
private int itemType;
//正常数据
private T data;
public HomeRoomItem(int itemType, T data) {
this.itemType = itemType;
this.data = data;
}
@Override
public int getItemType() {
return itemType;
}
}

View File

@@ -0,0 +1,40 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import java.io.Serializable;
import java.util.List;
/**
* Created by chenran on 2017/10/4.
*/
public class HomeRoomList implements Serializable{
private List<HomeRoom> recomRooms;
private List<HomeRoom> gameRooms;
private List<HomeRoom> chatRooms;
public List<HomeRoom> getRecomRooms() {
return recomRooms;
}
public void setRecomRooms(List<HomeRoom> recomRooms) {
this.recomRooms = recomRooms;
}
public List<HomeRoom> getGameRooms() {
return gameRooms;
}
public void setGameRooms(List<HomeRoom> gameRooms) {
this.gameRooms = gameRooms;
}
public List<HomeRoom> getChatRooms() {
return chatRooms;
}
public void setChatRooms(List<HomeRoom> chatRooms) {
this.chatRooms = chatRooms;
}
}

View File

@@ -0,0 +1,19 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.util.List;
/**
* @author jack
* @Description
* @Date 2018/4/23
*/
public class HotInfo {
// public List<BannerInfo> banners;
// /** 排行数据 */
// public RankingInfo rankHome;
// /** 热门推荐 */
// public List<HomeRoom> hotRooms;
/** 房间推荐 */
public List<HomeRoom> listRoom;
}

View File

@@ -0,0 +1,42 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.io.Serializable;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/11/20
*/
@Data
public class KTVRoom implements Serializable, MultiItemEntity {
/**
* 格子布局
*/
public final static transient int TYPE_GIRD = 1;
/**
* 格子布局虚位以待
*/
public final static transient int TYPE_GIRD_EMPTY = 2;
private long roomUid;
private long roomId;
private String avatar;
private String title;
private String roomDesc;
private String singingMusicName;
private int onlineNum;
private String roomPwd;
private int itemType = TYPE_GIRD_EMPTY;
@Override
public int getItemType() {
return itemType;
}
}

View File

@@ -0,0 +1,25 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/10/30
*/
@Data
public class KTVRoomInfo implements Serializable{
private String title;
private String subTitle;
private List<List<KTVRoom>> roomList;
public KTVRoomInfo() {
}
}

View File

@@ -0,0 +1,24 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/10/30
*/
@Data
public class MakeFriendsHallInfo implements Serializable {
private String title;
private String subTitle;
private String aitUserName;
private List<HomeHallMsgInfo> msgList;
public MakeFriendsHallInfo() {
}
}

View File

@@ -0,0 +1,26 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/19
*/
@Data
public class MakeFriendsInfo implements Serializable{
private String title;
private String subTitle;
private List<HomeRoom> roomList;
private boolean vmIsLoading;
public MakeFriendsInfo() {
}
}

View File

@@ -0,0 +1,63 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/19
*/
@Data
public class NormalItemInfo implements Parcelable,Serializable{
public final static transient int TOP = 1;
public final static transient int BOTTOM = 2;
private int position;
private int type;
private String icon;
private String title;
private HomeRoom homeRoom;
/**表示第几列*/
private int row;
public NormalItemInfo() {
}
protected NormalItemInfo(Parcel in) {
position = in.readInt();
type = in.readInt();
icon = in.readString();
title = in.readString();
homeRoom = in.readParcelable(HomeRoom.class.getClassLoader());
}
public static final Creator<NormalItemInfo> CREATOR = new Creator<NormalItemInfo>() {
@Override
public NormalItemInfo createFromParcel(Parcel in) {
return new NormalItemInfo(in);
}
@Override
public NormalItemInfo[] newArray(int size) {
return new NormalItemInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(position);
dest.writeInt(type);
dest.writeString(icon);
dest.writeString(title);
dest.writeParcelable(homeRoom, flags);
}
}

View File

@@ -0,0 +1,54 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/17
*/
@Data
public class OtherBannerInfo implements Parcelable,Serializable {
private String title;
private List<BannerInfo> data;
public OtherBannerInfo() {
}
protected OtherBannerInfo(Parcel in) {
title = in.readString();
data = in.createTypedArrayList(BannerInfo.CREATOR);
}
public static final Creator<OtherBannerInfo> CREATOR = new Creator<OtherBannerInfo>() {
@Override
public OtherBannerInfo createFromParcel(Parcel in) {
return new OtherBannerInfo(in);
}
@Override
public OtherBannerInfo[] newArray(int size) {
return new OtherBannerInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeTypedList(data);
}
}

View File

@@ -0,0 +1,65 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/17
*/
@Data
public class QuickEntranceInfo implements Parcelable, Serializable {
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;
private String panelId;
private String panelName;
private int skipType;//跳转类型 1跳app页面2跳聊天室3跳h5页面
private String skipUrl;
private String panelPic;
private int seqNo;//排序
protected QuickEntranceInfo(Parcel in) {
panelId = in.readString();
panelName = in.readString();
skipType = in.readInt();
skipUrl = in.readString();
panelPic = in.readString();
seqNo = in.readInt();
}
public static final Creator<QuickEntranceInfo> CREATOR = new Creator<QuickEntranceInfo>() {
@Override
public QuickEntranceInfo createFromParcel(Parcel in) {
return new QuickEntranceInfo(in);
}
@Override
public QuickEntranceInfo[] newArray(int size) {
return new QuickEntranceInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(panelId);
dest.writeString(panelName);
dest.writeInt(skipType);
dest.writeString(skipUrl);
dest.writeString(panelPic);
dest.writeInt(seqNo);
}
}

View File

@@ -0,0 +1,140 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
/**
* <p> 首页排行信息 </p>
* Created by Administrator on 2017/11/8.
*/
public class RankingInfo implements Parcelable {
public List<Ranking> starList;
public List<Ranking> nobleList;
public List<Ranking> roomList;
public static class Ranking implements Parcelable {
/**
* erbanNo : 850379
* avatar : https://nos.netease.com/nim/NDI3OTA4NQ==/bmltYV83Nzg4MzQyNDJfMTUwNzIwMzM4NTc2N184YmJlZmQ4ZS01YzdiLTRmMWMtYmFhOC0xMWRlNzg3MzRlMzk=
* nick : 阿拉善
* gender : 1
* totalNum : 9988923
*/
private int erbanNo;
private String avatar;
private String nick;
private int gender;
private int totalNum;
protected Ranking(Parcel in) {
erbanNo = in.readInt();
avatar = in.readString();
nick = in.readString();
gender = in.readInt();
totalNum = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(erbanNo);
dest.writeString(avatar);
dest.writeString(nick);
dest.writeInt(gender);
dest.writeInt(totalNum);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Ranking> CREATOR = new Creator<Ranking>() {
@Override
public Ranking createFromParcel(Parcel in) {
return new Ranking(in);
}
@Override
public Ranking[] newArray(int size) {
return new Ranking[size];
}
};
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;
}
}
protected RankingInfo(Parcel in) {
starList = in.createTypedArrayList(Ranking.CREATOR);
nobleList = in.createTypedArrayList(Ranking.CREATOR);
roomList = in.createTypedArrayList(Ranking.CREATOR);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(starList);
dest.writeTypedList(nobleList);
dest.writeTypedList(roomList);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<RankingInfo> CREATOR = new Creator<RankingInfo>() {
@Override
public RankingInfo createFromParcel(Parcel in) {
return new RankingInfo(in);
}
@Override
public RankingInfo[] newArray(int size) {
return new RankingInfo[size];
}
};
}

View File

@@ -0,0 +1,22 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/17
*/
@Data
public class RecommendInfo implements Serializable {
private String title;
private List<HomeRoom> roomList;
public RecommendInfo() {
}
}

View File

@@ -0,0 +1,28 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import lombok.Data;
@Data
public class RoomGameInfo implements Serializable {
/**
* roomId : 58892673
* uid : 2
* startUid : 2
* gameId : doushouqi1
* gameName : doushouqi1
* status : 5
* createTime : 1548856711000
* updateTime : 1548856711000
*/
private long roomId;
private long uid;
private long startUid;
private String gameId;
private String gameName;
private int status;
private long createTime;
private long updateTime;
}

View File

@@ -0,0 +1,81 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import lombok.Data;
@Data
public class RoomTabInfo implements Serializable {
/**
* uid : 2
* officeUser : 1
* roomId : 58892673
* title : 轻寻张展伟的房间
* type : 5
* meetingName : edc36c59bc9b449bb5bb58ac17b9c0b4
* valid : true
* operatorStatus : 1
* avatar : https://img.erbanyy.com/FikxU2u59uOjPVS1Sv_zfu4icqMS?imageslim
* roomDesc :
* backPic :
* openTime : 1545018501000
* onlineNum : 1
* abChannelType : 1
* roomPwd :
* roomTag : 聊天
* calcSumDataIndex : 0
* tagId : 8
* tagPict : https://img.erbanyy.com/new_tag_%E8%81%8A%E5%A4%A9@3x.png
* badge :
* isPermitRoom : 2
* isRecom : 0
* count : 0
* hasAnimationEffect : true
* audioQuality : 1
* isCloseScreen : false
* hasDragonGame : true
* hasKTVPriv : true
* isOpenKTV : false
* isOpenGame : true
* roomModeType : 0
* roomGame : {"roomId":58892673,"uid":2,"startUid":2,"gameId":"doushouqi1","gameName":"doushouqi1","status":5,"createTime":1548856711000,"updateTime":1548856711000}
* isExceptionClose : false
* exceptionClose : false
*/
private long uid;
private int officeUser;
private long roomId;
private String title;
private int type;
private String meetingName;
private boolean valid;
private int operatorStatus;
private String avatar;
private String roomDesc;
private String backPic;
private long openTime;
private int onlineNum;
private int abChannelType;
private String roomPwd;
private String roomTag;
private int calcSumDataIndex;
private int tagId;
private String tagPict;
private String badge;
private int isPermitRoom;
private int isRecom;
private int count;
private boolean hasAnimationEffect;
private int audioQuality;
private boolean isCloseScreen;
private boolean hasDragonGame;
private boolean hasKTVPriv;
private boolean isOpenKTV;
private boolean isOpenGame;
private int roomModeType;
private RoomGameInfo roomGame;
private boolean isExceptionClose;
private boolean exceptionClose;
}

View File

@@ -0,0 +1,107 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
/**
* <p> tab 标签数据 </p>
*
* @author Administrator
* @date 2017/11/21
*/
@Data
public class TabInfo implements Parcelable,Serializable {
/**
* id : 8
* name : 聊天
* pict : https://img.erbanyy.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 type;
protected boolean status;
protected boolean istop;
protected long createTime;
public TabInfo() {
}
public TabInfo(int id, String name) {
this.id = id;
this.name = name;
}
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<TabInfo> CREATOR = new Creator<TabInfo>() {
@Override
public TabInfo createFromParcel(Parcel in) {
return new TabInfo(in);
}
@Override
public TabInfo[] newArray(int size) {
return new TabInfo[size];
}
};
public static List<TabInfo> getTabDefaultList() {
List<TabInfo> tabInfoList = new ArrayList<>();
tabInfoList.add(new TabInfo(14, "新秀"));
tabInfoList.add(new TabInfo(12, "交友"));
tabInfoList.add(new TabInfo(13, "娱乐"));
tabInfoList.add(new TabInfo(5, "电台"));
tabInfoList.add(new TabInfo(10, "陪玩"));
tabInfoList.add(new TabInfo(11, "音乐"));
return tabInfoList;
}
@Override
public String toString() {
return "TabInfo{" +
"name='" + name + '\'' +
'}';
}
}

View File

@@ -0,0 +1,13 @@
package com.yizhuan.xchat_android_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;
}

View File

@@ -0,0 +1,482 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.util.List;
public class Test {
/**
* data : [{"uid":2,"officeUser":1,"roomId":58892673,"title":"轻寻张展伟的房间","type":5,"meetingName":"edc36c59bc9b449bb5bb58ac17b9c0b4","valid":true,"operatorStatus":1,"avatar":"https://img.erbanyy.com/FikxU2u59uOjPVS1Sv_zfu4icqMS?imageslim","roomDesc":"","backPic":"","openTime":1545018501000,"onlineNum":1,"abChannelType":1,"roomPwd":"","roomTag":"聊天","calcSumDataIndex":0,"tagId":8,"tagPict":"https://img.erbanyy.com/new_tag_%E8%81%8A%E5%A4%A9@3x.png","badge":"","isPermitRoom":2,"isRecom":0,"count":0,"hasAnimationEffect":true,"audioQuality":1,"isCloseScreen":false,"hasDragonGame":true,"hasKTVPriv":true,"isOpenKTV":false,"isOpenGame":true,"roomModeType":0,"roomGame":{"roomId":58892673,"uid":2,"startUid":2,"gameId":"doushouqi1","gameName":"doushouqi1","status":5,"createTime":1548856711000,"updateTime":1548856711000},"isExceptionClose":false,"exceptionClose":false}]
* title : 墙裂推荐
* type : 1
* maxNum : 3
*/
private String title;
private int type;
private int maxNum;
private List<DataBean> data;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getMaxNum() {
return maxNum;
}
public void setMaxNum(int maxNum) {
this.maxNum = maxNum;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* uid : 2
* officeUser : 1
* roomId : 58892673
* title : 轻寻张展伟的房间
* type : 5
* meetingName : edc36c59bc9b449bb5bb58ac17b9c0b4
* valid : true
* operatorStatus : 1
* avatar : https://img.erbanyy.com/FikxU2u59uOjPVS1Sv_zfu4icqMS?imageslim
* roomDesc :
* backPic :
* openTime : 1545018501000
* onlineNum : 1
* abChannelType : 1
* roomPwd :
* roomTag : 聊天
* calcSumDataIndex : 0
* tagId : 8
* tagPict : https://img.erbanyy.com/new_tag_%E8%81%8A%E5%A4%A9@3x.png
* badge :
* isPermitRoom : 2
* isRecom : 0
* count : 0
* hasAnimationEffect : true
* audioQuality : 1
* isCloseScreen : false
* hasDragonGame : true
* hasKTVPriv : true
* isOpenKTV : false
* isOpenGame : true
* roomModeType : 0
* roomGame : {"roomId":58892673,"uid":2,"startUid":2,"gameId":"doushouqi1","gameName":"doushouqi1","status":5,"createTime":1548856711000,"updateTime":1548856711000}
* isExceptionClose : false
* exceptionClose : false
*/
private int uid;
private int officeUser;
private int roomId;
private String title;
private int type;
private String meetingName;
private boolean valid;
private int operatorStatus;
private String avatar;
private String roomDesc;
private String backPic;
private long openTime;
private int onlineNum;
private int abChannelType;
private String roomPwd;
private String roomTag;
private int calcSumDataIndex;
private int tagId;
private String tagPict;
private String badge;
private int isPermitRoom;
private int isRecom;
private int count;
private boolean hasAnimationEffect;
private int audioQuality;
private boolean isCloseScreen;
private boolean hasDragonGame;
private boolean hasKTVPriv;
private boolean isOpenKTV;
private boolean isOpenGame;
private int roomModeType;
private RoomGameBean roomGame;
private boolean isExceptionClose;
private boolean exceptionClose;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public int getOfficeUser() {
return officeUser;
}
public void setOfficeUser(int officeUser) {
this.officeUser = officeUser;
}
public int getRoomId() {
return roomId;
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getMeetingName() {
return meetingName;
}
public void setMeetingName(String meetingName) {
this.meetingName = meetingName;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
public int getOperatorStatus() {
return operatorStatus;
}
public void setOperatorStatus(int operatorStatus) {
this.operatorStatus = operatorStatus;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getRoomDesc() {
return roomDesc;
}
public void setRoomDesc(String roomDesc) {
this.roomDesc = roomDesc;
}
public String getBackPic() {
return backPic;
}
public void setBackPic(String backPic) {
this.backPic = backPic;
}
public long getOpenTime() {
return openTime;
}
public void setOpenTime(long openTime) {
this.openTime = openTime;
}
public int getOnlineNum() {
return onlineNum;
}
public void setOnlineNum(int onlineNum) {
this.onlineNum = onlineNum;
}
public int getAbChannelType() {
return abChannelType;
}
public void setAbChannelType(int abChannelType) {
this.abChannelType = abChannelType;
}
public String getRoomPwd() {
return roomPwd;
}
public void setRoomPwd(String roomPwd) {
this.roomPwd = roomPwd;
}
public String getRoomTag() {
return roomTag;
}
public void setRoomTag(String roomTag) {
this.roomTag = roomTag;
}
public int getCalcSumDataIndex() {
return calcSumDataIndex;
}
public void setCalcSumDataIndex(int calcSumDataIndex) {
this.calcSumDataIndex = calcSumDataIndex;
}
public int getTagId() {
return tagId;
}
public void setTagId(int tagId) {
this.tagId = tagId;
}
public String getTagPict() {
return tagPict;
}
public void setTagPict(String tagPict) {
this.tagPict = tagPict;
}
public String getBadge() {
return badge;
}
public void setBadge(String badge) {
this.badge = badge;
}
public int getIsPermitRoom() {
return isPermitRoom;
}
public void setIsPermitRoom(int isPermitRoom) {
this.isPermitRoom = isPermitRoom;
}
public int getIsRecom() {
return isRecom;
}
public void setIsRecom(int isRecom) {
this.isRecom = isRecom;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public boolean isHasAnimationEffect() {
return hasAnimationEffect;
}
public void setHasAnimationEffect(boolean hasAnimationEffect) {
this.hasAnimationEffect = hasAnimationEffect;
}
public int getAudioQuality() {
return audioQuality;
}
public void setAudioQuality(int audioQuality) {
this.audioQuality = audioQuality;
}
public boolean isIsCloseScreen() {
return isCloseScreen;
}
public void setIsCloseScreen(boolean isCloseScreen) {
this.isCloseScreen = isCloseScreen;
}
public boolean isHasDragonGame() {
return hasDragonGame;
}
public void setHasDragonGame(boolean hasDragonGame) {
this.hasDragonGame = hasDragonGame;
}
public boolean isHasKTVPriv() {
return hasKTVPriv;
}
public void setHasKTVPriv(boolean hasKTVPriv) {
this.hasKTVPriv = hasKTVPriv;
}
public boolean isIsOpenKTV() {
return isOpenKTV;
}
public void setIsOpenKTV(boolean isOpenKTV) {
this.isOpenKTV = isOpenKTV;
}
public boolean isIsOpenGame() {
return isOpenGame;
}
public void setIsOpenGame(boolean isOpenGame) {
this.isOpenGame = isOpenGame;
}
public int getRoomModeType() {
return roomModeType;
}
public void setRoomModeType(int roomModeType) {
this.roomModeType = roomModeType;
}
public RoomGameBean getRoomGame() {
return roomGame;
}
public void setRoomGame(RoomGameBean roomGame) {
this.roomGame = roomGame;
}
public boolean isIsExceptionClose() {
return isExceptionClose;
}
public void setIsExceptionClose(boolean isExceptionClose) {
this.isExceptionClose = isExceptionClose;
}
public boolean isExceptionClose() {
return exceptionClose;
}
public void setExceptionClose(boolean exceptionClose) {
this.exceptionClose = exceptionClose;
}
public static class RoomGameBean {
/**
* roomId : 58892673
* uid : 2
* startUid : 2
* gameId : doushouqi1
* gameName : doushouqi1
* status : 5
* createTime : 1548856711000
* updateTime : 1548856711000
*/
private int roomId;
private int uid;
private int startUid;
private String gameId;
private String gameName;
private int status;
private long createTime;
private long updateTime;
public int getRoomId() {
return roomId;
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public int getStartUid() {
return startUid;
}
public void setStartUid(int startUid) {
this.startUid = startUid;
}
public String getGameId() {
return gameId;
}
public void setGameId(String gameId) {
this.gameId = gameId;
}
public String getGameName() {
return gameName;
}
public void setGameName(String gameName) {
this.gameName = gameName;
}
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 long getUpdateTime() {
return updateTime;
}
public void setUpdateTime(long updateTime) {
this.updateTime = updateTime;
}
}
}
}

View File

@@ -0,0 +1,13 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class TitleIndexInfo implements Serializable {
private List<HomeRoom> rooms;
private ArrayList<BannerInfo> banner;
}

View File

@@ -0,0 +1,53 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/4/17
*/
@Data
public class TopBannerInfo implements Parcelable,Serializable {
private List<BannerInfo> topBannerList;
private List<QuickEntranceInfo> panelList;
public TopBannerInfo() {
}
protected TopBannerInfo(Parcel in) {
panelList = in.createTypedArrayList(QuickEntranceInfo.CREATOR);
topBannerList = in.createTypedArrayList(BannerInfo.CREATOR);
}
public static final Creator<TopBannerInfo> CREATOR = new Creator<TopBannerInfo>() {
@Override
public TopBannerInfo createFromParcel(Parcel in) {
return new TopBannerInfo(in);
}
@Override
public TopBannerInfo[] newArray(int size) {
return new TopBannerInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(panelList);
dest.writeTypedList(topBannerList);
}
}

View File

@@ -0,0 +1,43 @@
package com.yizhuan.xchat_android_core.home.bean;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.io.Serializable;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/5/3
*/
@Data
public class TopMessage implements Serializable, MultiItemEntity {
public final static transient int TYPE_LAYOUT_1 = 0;
public final static transient int TIP_TYPE_ABOUT_ME = 1;//是@我
public final static transient int TIP_TYPE_NEW = 2;//是最新
public final static transient int TIP_TYPE_MONSTER = 3;//是打怪
private String id;
private String title;
private String img;
private int tipType;
private int paramType;
private String param;
private long time;
//类型
private int itemType;
public TopMessage(int itemType) {
this.itemType = itemType;
}
@Override
public int getItemType() {
return this.itemType;
}
}

View File

@@ -0,0 +1,19 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/5/3
*/
@Data
public class VMTopMessage implements Serializable {
private List<TopMessage> topMessageList;
}

View File

@@ -0,0 +1,18 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
/**
* @author jack
* @Description
* @Date 2018/5/3
*/
@Data
public class VMTopMessageInfo implements Serializable{
private String title;
private List<VMTopMessage> vmTopMessageList;
}

View File

@@ -0,0 +1,80 @@
package com.yizhuan.xchat_android_core.home.model;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.community.bean.CommunityNoticeInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_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<List<CommunityNoticeInfo>> getMsg(long uid, Long id, int pageSize) {
return api.getMsgList(uid, id, pageSize).flatMap(new Function<ServiceResult<List<CommunityNoticeInfo>>, SingleSource<List<CommunityNoticeInfo>>>() {
@Override
public SingleSource<List<CommunityNoticeInfo>> apply(ServiceResult<List<CommunityNoticeInfo>> 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<String> delete(long uid) {
return api.clear(uid).flatMap(new Function<ServiceResult, SingleSource<String>>() {
@Override
public SingleSource<String> 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<ServiceResult<List<CommunityNoticeInfo>>> getMsgList(@Query("uid") long uid,
@Query("id") Long id, @Query("pageSize") int pageSize);
/**
* 清空互动消息
*/
@POST("interactive/clear")
Single<ServiceResult> clear(@Query("uid") long uid);
}
}

View File

@@ -0,0 +1,817 @@
package com.yizhuan.xchat_android_core.home.model;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.community.bean.UnReadCountInfo;
import com.yizhuan.xchat_android_core.family.bean.HomeBannerInfo;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.home.bean.ClassifiedRoomInfo;
import com.yizhuan.xchat_android_core.home.bean.FindInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeItem;
import com.yizhuan.xchat_android_core.home.bean.HomeMoreData;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.KTVRoom;
import com.yizhuan.xchat_android_core.home.bean.RecommendInfo;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import com.yizhuan.xchat_android_core.home.bean.TagListInfo;
import com.yizhuan.xchat_android_core.home.bean.TitleIndexInfo;
import com.yizhuan.xchat_android_core.user.bean.RecommendationUserInfo;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.user.bean.UserRecommendRoomInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import com.yizhuan.xchat_android_library.utils.ListUtils;
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.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;
import retrofit2.http.Query;
public class HomeModel extends BaseModel implements IHomeModel {
private static final String TAG = "HomeModel";
private volatile static IHomeModel instance;
private Api api;
private List<TabInfo> mTabInfoList;
public static IHomeModel get() {
if (instance == null) {
synchronized (HomeModel.class) {
if (instance == null) {
instance = new HomeModel();
}
}
}
return instance;
}
private HomeModel() {
api = RxNet.create(Api.class);
}
/**
* 获取缓存的房间分类数据
*
* @return
*/
@Override
public List<TabInfo> getmTabInfoList() {
return mTabInfoList;
}
/**
* 获取首页数据
*
* @param uid
* @return
*/
@Override
public Single<ServiceResult<List<HomeInfo>>> loadHomeList(String uid) {
return api.getHomeList(uid)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 3.1.2之后改版首页v4
*
* @param uid
* @return
*/
@Override
public Single<ServiceResult<List<HomeInfo>>> loadHomeListV4(String uid) {
return api.getHomeListV4(uid)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 首页加载更多
*/
@Override
public Single<List<HomeRoom>> loadMoreHomeData(int page, int pageSize) {
return api.getMoreHomeListV4(
String.valueOf(AuthModel.get().getCurrentUid()),
page,
pageSize
)
.compose(RxHelper.handleCommon(HomeMoreData::new))
.flatMap(homeMoreData -> {
List<HomeRoom> list = homeMoreData.getRooms();
if (list == null) {
list = new ArrayList<>();
}
return Single.just(list);
});
}
/**
* 获取佛系交友的列表
*
* @return
*/
@Override
public Single<ServiceResult<List<HomeRoom>>> loadMakeFriendList() {
return api.loadMakeFriendList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 提交反馈
*
* @param uid
* @param feedbackDesc
* @param contact
* @return
*/
@Override
public Single<String> commitFeedback(long uid, String feedbackDesc, String contact) {
return api.commitFeedback(
String.valueOf(uid),
feedbackDesc,
contact,
AuthModel.get().getTicket()
)
.flatMap(new Function<ServiceResult, SingleSource<String>>() {
@Override
public SingleSource<String> apply(ServiceResult serviceResult) throws Exception {
if (serviceResult.isSuccess()) {
return Single.just("反馈成功");
} else {
return Single.error(new Throwable(serviceResult.getMessage()));
}
}
})
.compose(RxHelper.handleSchedulers());
}
/**
* 获取首页房间 分类 tab 数据
*
* @return
*/
@Override
public Single<List<TabInfo>> getMainTabData() {
return api.getMainTabList()
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers())
.doOnSuccess(new Consumer<List<TabInfo>>() {
@Override
public void accept(List<TabInfo> tabInfos) throws Exception {
if (ListUtils.isListEmpty(tabInfos)) {
return;
}
mTabInfoList = tabInfos;
}
})
.doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Logger.e("启动获取首页Tab失败......");
}
});
}
/**
* 根据分类 获取房间列表
*
* @param tagId
* @param pageNum
* @param pageSize
*/
@Override
public Single<ClassifiedRoomInfo> getMainDataByTab(final int tagId, final int pageNum, int pageSize) {
return api.getMainDataByTab(
String.valueOf(tagId),
String.valueOf(pageNum),
String.valueOf(pageSize)
)
.flatMap(new Function<ServiceResult<ClassifiedRoomInfo>, SingleSource<ClassifiedRoomInfo>>() {
@Override
public SingleSource<ClassifiedRoomInfo> apply(ServiceResult<ClassifiedRoomInfo> classifiedRoomInfoServiceResult) throws Exception {
if (classifiedRoomInfoServiceResult.isSuccess()) {
if (null == classifiedRoomInfoServiceResult.getData()) {
ClassifiedRoomInfo classifiedRoomInfo = new ClassifiedRoomInfo();
classifiedRoomInfo.setRooms(new ArrayList<>());
return Single.just(classifiedRoomInfo);
} else {
return Single.just(classifiedRoomInfoServiceResult.getData());
}
} else {
return Single.error(new Throwable(classifiedRoomInfoServiceResult.getMessage()));
}
}
})
.compose(RxHelper.handleException())
.compose(RxHelper.handleSchedulers())
;
}
@Override
public Single<FindInfo> loadFindPage(String uid) {
return api.loadFindPage(
uid
)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
@Override
public Single<FindInfo> loadFindPageV2(String uid) {
return api.loadFindPageV2(
uid
)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
/**
* 获取首页KTV 房间列表
*
* @param page
* @param pageSize
* @param orderType 排序方式1最新2最热
* @return
*/
@Override
public Single<List<KTVRoom>> loadKTVList(String page,
String pageSize,
String orderType) {
return api.loadKTVList(
page,
pageSize,
orderType
)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
/**
* 获取新人列表
*
* @param page
* @param pageSize
* @return
*/
@Override
public Single<List<UserInfo>> loadNewUserList(String page,
String pageSize) {
return api.loadNewUserList(
page,
pageSize
)
.compose(RxHelper.handleSchedulers())
.flatMap(listServiceResult -> {
if (listServiceResult != null) {
if (listServiceResult.isSuccess()) {
return Single.just(listServiceResult.getData() != null ?
listServiceResult.getData() : new ArrayList<>());
} else {
return Single.error(new Throwable(listServiceResult.getMessage()));
}
} else {
return Single.error(new Throwable("发生异常"));
}
});
}
/**
* 导流-获取推荐的房间
*
* @param uid
* @return
*/
@Override
public Single<UserRecommendRoomInfo> loadRecommendRoom(String uid) {
return api.loadRecommendRoom(
uid
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<ServiceResult<UserRecommendRoomInfo>, SingleSource<? extends UserRecommendRoomInfo>>() {
@Override
public SingleSource<? extends UserRecommendRoomInfo> apply(ServiceResult<UserRecommendRoomInfo> response) throws Exception {
if (response.isSuccess()) {
return Single.just(response.getData());
} else {
return Single.error(new Throwable(response.getMessage()));
}
}
});
}
@Override
public Single<List<TagListInfo>> tagList(long uid) {
return api.titleList(uid)
.compose(RxHelper.handleSchAndExce())
.flatMap(new Function<ServiceResult<List<TagListInfo>>, SingleSource<? extends List<TagListInfo>>>() {
@Override
public SingleSource<? extends List<TagListInfo>> apply(ServiceResult<List<TagListInfo>> response) throws Exception {
if (response.isSuccess()) {
return Single.just(response.getData());
} else {
return Single.error(new Throwable(response.getMessage()));
}
}
});
}
@Override
public Single<TitleIndexInfo> titleIndex(long titleId, int pageNum, int pageSize) {
return api.titleIndex(titleId, pageNum, pageSize)
.compose(RxHelper.handleSchAndExce())
.flatMap(new Function<ServiceResult<TitleIndexInfo>, SingleSource<? extends TitleIndexInfo>>() {
@Override
public SingleSource<? extends TitleIndexInfo> apply(ServiceResult<TitleIndexInfo> response) throws Exception {
if (response.isSuccess()) {
return Single.just(response.getData());
} else {
return Single.error(new Throwable(response.getMessage()));
}
}
});
}
@Override
public Single<String> getGuildRoomId() {
return api.getGuildRoomId(AuthModel.get().getCurrentUid())
.compose(RxHelper.handleRoomPmLimit())
.compose(RxHelper.singleMainResult(true));
}
public Single<String> addIsomerism() {
return api.addIsomerism(AuthModel.get().getCurrentUid())
.compose(RxHelper.handleRoomPmLimit())
.compose(RxHelper.handleCommon(() -> ""));
}
public Single<String> removeIsomerism() {
return api.removeIsomerism(AuthModel.get().getCurrentUid())
.compose(RxHelper.singleMainResult());
}
@Override
public Single<List<HomeItem>> getGameHomeInfo() {
return api.getGameHomeRoom()
.compose(RxHelper.singleMainResult())
.flatMap(homeInfos -> {
List<HomeItem> configList = new ArrayList<>();
for (HomeInfo homeInfo : homeInfos) {
if (homeInfo.getType() == HomeItem.TYPE_TWO_LINES) {
List<HomeRoom> homeRoomList = new Gson().fromJson(homeInfo.getData(),
new TypeToken<List<HomeRoom>>() {
}.getType());
RecommendInfo recommendInfo = new RecommendInfo();
recommendInfo.setTitle(homeInfo.getTitle());
recommendInfo.setRoomList(homeRoomList);
HomeItem<RecommendInfo> homeItem = new HomeItem<RecommendInfo>(HomeItem.TYPE_TWO_LINES, recommendInfo);
configList.add(homeItem);
} else {
HomeItem<String> titleItem = new HomeItem<>(HomeItem.TYPE_BLOCK_TITLE,
homeInfo.getTitle());
List<HomeItem> tmpList = handleSubListToMainList(homeInfo, -1);
if (!ListUtils.isListEmpty(tmpList)) {
if (!ListUtils.isListEmpty(tmpList)) {
configList.add(titleItem);
}
configList.addAll(tmpList);
}
}
}
return Single.just(configList);
});
}
/**
* 由于接口的数据是分模块返回的,
* 所以将模块的数据处理后合成一条list
*/
private List<HomeItem> handleSubListToMainList(HomeInfo homeInfo, int customSquareNum) {
List<HomeItem> resultList = new ArrayList<>();
if (null != homeInfo.getData() && homeInfo.getData().isJsonArray()
&& homeInfo.getData().getAsJsonArray().size() > 0) {
//判断不为空
List<HomeRoom> homeRoomList = new Gson().fromJson(homeInfo.getData(),
new TypeToken<List<HomeRoom>>() {
}.getType());
if (homeRoomList == null) {
homeRoomList = new ArrayList<>();
}
int maxNum;
//表示方格子的个数如果不足3的倍数则补足3的倍数
//处理热门数据,前三个为格子,其他为普通布局,如果不足三个,则补虚位以待
if (customSquareNum >= 0) {
maxNum = customSquareNum;
} else {
maxNum = homeInfo.getMaxNum();
}
List<HomeItem> squareList = new ArrayList<>();
List<HomeItem> linearList = new ArrayList<>();
for (int i = 0; i < homeRoomList.size(); i++) {
HomeItem<HomeRoom> item;
HomeRoom room = homeRoomList.get(i);
if (i < maxNum) {
item = new HomeItem<>(HomeItem.TYPE_SQUARE_PIC, room);
squareList.add(item);
} else if (homeInfo.getListNum() == 0 || linearList.size() < homeInfo.getListNum()) {
item = new HomeItem<>(HomeItem.TYPE_LINEAR_LITTLE_PIC, room);
linearList.add(item);
}
}
//添加虚位以待
int needEmptySize;
if (squareList.size() == 0) {
//如果方形推荐位为空添加3个虚位以待
//如果方块列表为空maxnum = 0不配置虚位以待
needEmptySize = 0;
} else if (squareList.size() % 3 == 0) {
//如果刚好是3的倍数则不需要添加
needEmptySize = 0;
} else {
//其余情况补足
needEmptySize = 3 - squareList.size() % 3;
}
//添加虚位以待
if (needEmptySize > 0) {
for (int i = 0; i < needEmptySize; i++) {
HomeItem item = new HomeItem<>(HomeItem.TYPE_SQUARE_EMPTY, new HomeRoom());
squareList.add(item);
}
}
//加个防错机制保证方形是3的倍数
while (squareList.size() % 3 != 0) {
if (squareList.size() > 0) {
squareList.remove(squareList.size() - 1);
}
}
//添加分割线
for (int i = 0; i < squareList.size(); i++) {
squareList.get(i).setDividerDesc(i % 3);
}
//分割线
for (int i = 0; i < linearList.size(); i++) {
if (i == linearList.size() - 1) {
linearList.get(i).setDividerDesc(-2);
} else {
linearList.get(i).setDividerDesc(-1);
}
}
resultList.addAll(squareList);
resultList.addAll(linearList);
}
return resultList;
}
@Override
public Single<HomeBannerInfo> getHomeBannerInfo() {
return api.getHomeBannerInfo(1)
.compose(RxHelper.handleSchedulers())
.compose(RxHelper.handleException())
.compose(RxHelper.singleMainResult())
;
}
@Override
public Single<Object> uploadAddress(long uid, String address, int adcode, double longitude, double latitude) {
return api.uploadAddress(uid, address, adcode, longitude, latitude)
.compose(RxHelper.handleSchedulers())
.compose(RxHelper.handleException())
.compose(RxHelper.singleMainResult());
}
@Override
public Single<List<RecommendationUserInfo>> getGodList(long uid, int pageIndex, int pageSize, String type) {
return api.getHomeListV5(uid, pageIndex, pageSize, type)
.compose(RxHelper.handleException())
.compose(RxHelper.singleMainResult());
}
@Override
public Single<ArrayList<BannerInfo>> getGodBannerInfo() {
return api.getHomeBannerInfo(2)
.compose(RxHelper.handleSchedulers())
.compose(RxHelper.handleException())
.compose(RxHelper.singleMainResult())
.map(new Function<HomeBannerInfo, ArrayList<BannerInfo>>() {
@Override
public ArrayList<BannerInfo> apply(HomeBannerInfo homeBannerInfo) throws Exception {
ArrayList<BannerInfo> list;
if (homeBannerInfo != null) {
list = homeBannerInfo.getFirstPageBannerVos();
} else {
list = new ArrayList<>();
}
return list;
}
});
}
@Override
public Single<ArrayList<BannerInfo>> getTabBanner(String tabId) {
return api.getTabBanner(tabId)
.compose(RxHelper.handleException())
.compose(RxHelper.singleMainResult());
}
@Override
public Single<List<HomeRoom>> getTabRoomList(int pageIndex, int pageSize, String tabId) {
return api.getTabRoomList(pageIndex, pageSize, tabId)
.compose(RxHelper.handleException())
.compose(RxHelper.singleMainResult());
}
@Override
public Single<HomeBannerInfo> getQxBannerInfo() {
return api.getHomeBannerInfo(3)
.compose(RxHelper.handleCommon());
}
@Override
public Single<Integer> getUnreadCount(long uid) {
return api.getUnreadCount(uid).flatMap(new Function<ServiceResult<UnReadCountInfo>, SingleSource<Integer>>() {
@Override
public SingleSource<Integer> apply(ServiceResult<UnReadCountInfo> unReadCountInfoServiceResult) throws Exception {
if (unReadCountInfoServiceResult.isSuccess()) {
UnReadCountInfo unReadCountInfo = unReadCountInfoServiceResult.getData();
if (unReadCountInfo != null) {
return Single.just(unReadCountInfoServiceResult.getData().getTotal());
} else {
return Single.just(0);
}
} else {
return Single.just(0);
}
}
}).compose(RxHelper.handleSchAndExce());
}
private interface Api {
/**
* 获取首页数据接口V42019.02.19改版
*
* @param uid
* @return
*/
@GET("/home/v4/home")
Single<ServiceResult<List<HomeInfo>>> getHomeListV4(@Query("uid") String uid);
/**
* 获取首页分页数据接口V42019.02.19改版
*
* @param uid
* @return
*/
@GET("/home/v4/topic")
Single<ServiceResult<HomeMoreData>> getMoreHomeListV4(@Query("uid") String uid,
@Query("page") int page,
@Query("pageSize") int pageSize);
/**
* 获取首页数据接口
*
* @param uid
* @return
*/
@GET("/home/v3/home")
Single<ServiceResult<List<HomeInfo>>> getHomeList(@Query("uid") String uid);
/**
* 佛系交友
*/
@GET("/home/v3/findByPermit")
Single<ServiceResult<List<HomeRoom>>> loadMakeFriendList();
/**
* 提交反馈
*
* @param uid
* @param feedbackDesc
* @param contact
* @param ticket
* @return
*/
@POST("/feedback")
Single<ServiceResult> commitFeedback(@Query("uid") String uid,
@Query("feedbackDesc") String feedbackDesc,
@Query("contact") String contact,
@Query("ticket") String ticket);
/**
* 获取首页tab数据
*
* @return
*/
@GET("/room/tag/v3/top")
Single<ServiceResult<List<TabInfo>>> getMainTabList();
/**
* 通过tag获取首页数据
*
* @param tagId
* @param pageNum
* @param pageSize
* @return
*/
@GET("/home/v3/tagindex")
Single<ServiceResult<ClassifiedRoomInfo>> getMainDataByTab(@Query("tagId") String tagId,
@Query("pageNum") String pageNum,
@Query("pageSize") String pageSize);
/**
* 获取发现页面数据
*
* @param uid
* @return
*/
@GET("/discovery")
Single<ServiceResult<FindInfo>> loadFindPage(@Query("uid") String uid);
/**
* 获取发现页面数据V2
*
* @param uid
* @return
*/
@GET("/discovery/v2/get")
Single<ServiceResult<FindInfo>> loadFindPageV2(@Query("uid") String uid);
/**
* 获取首页KTV 房间列表
*
* @param page
* @param pageSize
* @param orderType 排序方式1最新2最热
* @return
*/
@GET("/room/listKTVRooms")
Single<ServiceResult<List<KTVRoom>>> loadKTVList(@Query("page") String page,
@Query("pageSize") String pageSize,
@Query("orderType") String orderType);
/**
* 获取新人列表
*
* @param page
* @param pageSize
* @return
*/
@GET("/user/list/new")
Single<ServiceResult<List<UserInfo>>> loadNewUserList(@Query("page") String page,
@Query("pageSize") String pageSize);
/**
* 导流-获取推荐的房间
*
* @param uid
* @return
*/
@GET("/user/recommend/room")
Single<ServiceResult<UserRecommendRoomInfo>> loadRecommendRoom(@Query("uid") String uid);
/**
* 获取首页房间标签列表
*/
@GET("/home/v4/titleList")
Single<ServiceResult<List<TagListInfo>>> titleList(@Query("uid") long uid);
/**
* 分页获取标题对应列表数据
*/
@GET("/home/v4/titleIndex")
Single<ServiceResult<TitleIndexInfo>> titleIndex(@Query("titleId") long titleId,
@Query("page") int page,
@Query("pageSize") int pageSize);
/**
* 获取游戏首页可配置模块数据
*/
@GET("/home/v4/getModuleRooms")
Single<ServiceResult<List<HomeInfo>>> getGameHomeRoom();
/**
* 嗨聊派对--随机获取一个牌照房id返回
*/
@FormUrlEncoded
@POST("/room/getGuildRoomId")
Single<ServiceResult<String>> getGuildRoomId(@Field("uid") long uid);
/**
* 添加进异性匹配池
*
* @return -
*/
@FormUrlEncoded
@POST("game/v4/match/addIsomerism")
Single<ServiceResult<String>> addIsomerism(@Field("uid") long uid);
/**
* 移除异性匹配池
*
* @return -
*/
@FormUrlEncoded
@POST("game/v4/match/removeIsomerism")
Single<ServiceResult<String>> removeIsomerism(@Field("uid") long uid);
/**
* 新版首页获取导航栏列表和下拉选择列表
*
* @param type 1-导航栏 2-首页下方的banner 3 轻寻的banner
* @return
*/
@GET("home/v5/getFirstPageBanner")
Single<ServiceResult<HomeBannerInfo>> getHomeBannerInfo(@Query("type") long type);
/**
* 上传地理位置信息
*
* @param uid
* @param address
* @param adcode
* @param longitude
* @param latitude
* @return
*/
@FormUrlEncoded
@POST("user/address/save")
Single<ServiceResult<Object>> uploadAddress(@Field("uid") long uid, @Field("address") String address, @Field("adcode") int adcode, @Field("longitude") double longitude, @Field("latitude") double latitude);
/**
* 获取语音派对里面的banner
*
* @param tabId
* @return
*/
@GET("home/v5/getTabBanner")
Single<ServiceResult<ArrayList<BannerInfo>>> getTabBanner(@Query("tabId") String tabId);
/**
* 获取语音派对房间列表(分页)
*
* @param pageIndex
* @param pageSize
* @param tabId
* @return
*/
@GET("home/v5/getTabRoomList")
Single<ServiceResult<List<HomeRoom>>> getTabRoomList(@Query("currentPage") int pageIndex, @Query("pageSize") int pageSize, @Query("tabId") String tabId);
/**
* 获取语音派对房间列表(分页)
*
* @param pageIndex
* @param pageSize
* @param tabId
* @return
*/
@GET("home/v6/user/list")
Single<ServiceResult<List<RecommendationUserInfo>>> getHomeListV5(@Query("uid") long uid, @Query("page") int pageIndex, @Query("pageSize") int pageSize, @Query("labelType") String tabId);
/**
* 获取互动消息未读数量
* @param uid
* @return
*/
@POST("interactive/unreadCount")
Single<ServiceResult<UnReadCountInfo>> getUnreadCount(@Query("uid") long uid);
}
}

View File

@@ -0,0 +1,14 @@
package com.yizhuan.xchat_android_core.home.model;
import com.yizhuan.xchat_android_core.community.bean.CommunityNoticeInfo;
import com.yizhuan.xchat_android_library.base.IMvpBaseView;
import java.util.List;
import io.reactivex.Single;
public interface ICommunityNoticeModel extends IMvpBaseView {
Single<List<CommunityNoticeInfo>> getMsg(long uid, Long id, int pageSize);
Single<String> delete(long uid);
}

View File

@@ -0,0 +1,190 @@
package com.yizhuan.xchat_android_core.home.model;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.family.bean.HomeBannerInfo;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.home.bean.ClassifiedRoomInfo;
import com.yizhuan.xchat_android_core.home.bean.FindInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeItem;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.KTVRoom;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import com.yizhuan.xchat_android_core.home.bean.TagListInfo;
import com.yizhuan.xchat_android_core.home.bean.TitleIndexInfo;
import com.yizhuan.xchat_android_core.user.bean.RecommendationUserInfo;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.user.bean.UserRecommendRoomInfo;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Single;
public interface IHomeModel extends IModel {
List<TabInfo> getmTabInfoList();
/**
* 获取首页数据
*
* @param uid
* @return
*/
Single<ServiceResult<List<HomeInfo>>> loadHomeList(String uid);
/**
* 3.1.2之后改版首页v4
*
* @param uid
* @return
*/
Single<ServiceResult<List<HomeInfo>>> loadHomeListV4(String uid);
/**
* 首页加载更多
*/
Single<List<HomeRoom>> loadMoreHomeData(int page, int pageSize);
/**
* 获取佛系交友的列表
*
* @return
*/
Single<ServiceResult<List<HomeRoom>>> loadMakeFriendList();
/**
* 提交反馈
*
* @param uid
* @param feedbackDesc
* @param contact
* @return
*/
Single<String> commitFeedback(long uid, String feedbackDesc, String contact);
/**
* 获取首页房间 分类 tab 数据
*
* @return
*/
Single<List<TabInfo>> getMainTabData();
/**
* 根据分类 获取房间列表
*
* @param tagId
* @param pageNum
* @param pageSize
*/
Single<ClassifiedRoomInfo> getMainDataByTab(int tagId, int pageNum, int pageSize);
Single<FindInfo> loadFindPage(String uid);
Single<FindInfo> loadFindPageV2(String uid);
/**
* 获取首页KTV 房间列表
*
* @param page
* @param pageSize
* @param orderType 排序方式1最新2最热
* @return
*/
Single<List<KTVRoom>> loadKTVList(String page,
String pageSize,
String orderType);
/**
* 获取新人列表
*
* @param page
* @param pageSize
* @return
*/
Single<List<UserInfo>> loadNewUserList(String page,
String pageSize);
Single<UserRecommendRoomInfo> loadRecommendRoom(String uid);
/**
* 获取首页房间标签列表
*/
Single<List<TagListInfo>> tagList(long uid);
/**
* 分页获取标题对应列表数据
*/
Single<TitleIndexInfo> titleIndex(long titleId,
int pageNum,
int pageSize);
/**
* 获取游戏首页运营配置数据
*/
Single<List<HomeItem>> getGameHomeInfo();
/**
* 获取嗨聊派对id
*/
Single<String> getGuildRoomId();
Single<String> addIsomerism();
Single<String> removeIsomerism();
/**
* 获取首页banner
*
* @return
*/
Single<HomeBannerInfo> getHomeBannerInfo();
/**
* 上传用户位置信息
* @param uid
* @param address
* @param adcode
* @param longitude
* @param latitude
* @return
*/
Single<Object> uploadAddress(long uid, String address, int adcode, double longitude, double latitude);
/**
* 获取男神女神数据和banner信息
* @return
*/
Single<List<RecommendationUserInfo>> getGodList(long uid,int pageIndex,int pageSize,String type);
/**
* 获取男神女神的banner
* @return
*/
Single<ArrayList<BannerInfo>> getGodBannerInfo();
/**
* 获取语音派对房间列表(分页)
* @param pageIndex
* @param pageSize
* @param tabId
* @return
*/
Single<List<HomeRoom>> getTabRoomList(int pageIndex, int pageSize, String tabId);
/**
* 获取语音派对里面的banner
* @param tabId
* @return
*/
Single<ArrayList<BannerInfo>> getTabBanner(String tabId);
/**
* 轻寻顶部 banner信息
* 包含3部分顶部banner测一测那个列表标签页
*/
Single<HomeBannerInfo> getQxBannerInfo();
Single<Integer> getUnreadCount(long uid);
}

View File

@@ -0,0 +1,694 @@
package com.yizhuan.xchat_android_core.manager;
import android.annotation.SuppressLint;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.ktv.event.RemoteVideoEvent;
import com.yizhuan.xchat_android_core.statistic.LogFactory;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.LogProtocol;
import com.yizhuan.xchat_android_library.rxbus.RxBus;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import io.agora.ktvkit.IKTVKitEventHandler;
import io.agora.ktvkit.KTVKit;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
import io.agora.rtc.RtcEngine;
import io.agora.rtc.video.VideoCanvas;
import static io.agora.rtc.Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO;
import static io.agora.rtc.Constants.AUDIO_PROFILE_MUSIC_STANDARD;
import static io.agora.rtc.Constants.AUDIO_RECORDING_QUALITY_LOW;
import static io.agora.rtc.Constants.AUDIO_SCENARIO_GAME_STREAMING;
/**
* <p> 声网管理类 </p>
*
* @author jiahui
* @date 2017/12/12
*/
public final class RtcEngineManager {
private static volatile RtcEngineManager sEngineManager;
private static final Object SYNC_OBJECT = new Object();
@Nullable
private RtcEngine mRtcEngine;
private Map<String, Integer> speakers;
/**
* 说话列表
*/
private List<Integer> speakMembersPosition;
/**
* 队列说话列表
*/
private List<Integer> speakQueueMembersPosition;
private String uid;
public boolean isAudienceRole;
/**
* 麦上是否闭麦true闭麦false开麦
*/
public boolean isMute;
/**
* 听筒是否关闭
*/
public boolean isRemoteMute;
private boolean needRecord;
private boolean isOpenAVRoomActivity;
private boolean isOpenVoiceMatchActivity;
//是否在房间,判断是切换品质还是第一次进
private boolean inRoom;
private EngineEventHandler eventHandler;
private static final class Helper {
private static final RtcEngineManager INSTANCE = new RtcEngineManager();
}
private RtcEngineManager() {
System.out.println("hehehehe" + RtcEngine.getSdkVersion());
speakMembersPosition = new ArrayList<>();
speakQueueMembersPosition = new ArrayList<>();
}
public static RtcEngineManager get() {
return Helper.INSTANCE;
}
public void startRtcEngine(long uid) {
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
// if (curRoomInfo.getAudioQuality() == RoomInfo.ROOMTYPE_LIGHT_CHAT) {
// joinHighQualityChannel(curRoomInfo.getRoomId(), uid,true);
// } else {
joinChannel(curRoomInfo.getRoomId(), uid);
// }
if (curRoomInfo.getUid() == uid && curRoomInfo.getType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
//设置用户角色为主播,轰趴房不能默认设置房主为主播
setRole(Constants.CLIENT_ROLE_BROADCASTER);
} else {
setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
}
public void joinChannel(long channelId, long uid) {
initRtcEngine(channelId, uid, AUDIO_PROFILE_MUSIC_STANDARD, AUDIO_SCENARIO_GAME_STREAMING);
}
public void joinHighQualityChannel(long channelId, long uid, boolean record) {
this.needRecord = record;
initRtcEngine(channelId, uid, AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, AUDIO_SCENARIO_GAME_STREAMING);
}
public void reJoinChannel(long channelId, long uid) {
enterChannel(channelId, (int) uid, AUDIO_PROFILE_MUSIC_STANDARD, AUDIO_SCENARIO_GAME_STREAMING);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
public void reJoinHighQualityChannel(long channelId, long uid, boolean record) {
this.needRecord = record;
enterChannel(channelId, (int) uid, AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, AUDIO_SCENARIO_GAME_STREAMING);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
private void initRtcEngine(long channelId, long uid, int quality, int audioShowRoom) {
this.uid = uid + "";
this.isMute = false;
this.isRemoteMute = false;
enterChannel(channelId, (int) uid, quality, audioShowRoom);
}
private void enterChannel(long channelId, int uid, int quality, int audioShowRoom) {
if (eventHandler == null) {
eventHandler = new EngineEventHandler(this);
}
eventHandler.isEnter = true;
if (mRtcEngine == null) {
try {
mRtcEngine = RtcEngine.create(BasicConfig.INSTANCE.getAppContext(), XChatConstants.AGORA_KEY, eventHandler);
} 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(quality, audioShowRoom);
mRtcEngine.enableAudioVolumeIndication(600, 3);
mRtcEngine.setDefaultAudioRoutetoSpeakerphone(true);
mRtcEngine.setExternalVideoSource(true, false, true);
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(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName() + "/log/agora-rtc.log");
}
//创建并加入频道
mRtcEngine.joinChannel(null, String.valueOf(channelId), null, uid);
}
public int stopAudioMixing() {
if (mRtcEngine != null) {
return mRtcEngine.stopAudioMixing();
}
return -1;
}
public void resetChannel() {
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (handler != null)
handler.removeCallbacksAndMessages(null);
}
public void leaveChannel() {
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (handler != null)
handler.removeCallbacksAndMessages(null);
// isAudienceRole = true;
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
}
public boolean isSpeaking(int position) {
if (speakMembersPosition != null) {
if (speakMembersPosition.contains(position)) {
return true;
}
}
return false;
}
public boolean isQueueSpeaking(int position) {
if (speakQueueMembersPosition != null) {
if (speakQueueMembersPosition.contains(position)) {
return true;
}
}
return false;
}
public void setOpenAVRoomActivity(boolean openAVRoomActivity) {
isOpenAVRoomActivity = openAVRoomActivity;
setRemoteMute(isRemoteMute);
setMute(isMute);
}
public void setOpenVoiceMatchActivity(boolean openVoiceMatchActivity) {
isOpenVoiceMatchActivity = openVoiceMatchActivity;
setRemoteMute(isRemoteMute);
setMute(isMute);
}
//设置静音
public void setRemoteMute(boolean mute) {
if (mRtcEngine != null) {
int result = mRtcEngine.muteAllRemoteAudioStreams(mute || (isOpenVoiceMatchActivity && !isOpenAVRoomActivity));
if (result == 0) {
isRemoteMute = mute;
}
}
}
public void setRemoteMute(int uid, boolean mute) {
if (mRtcEngine != null) {
mRtcEngine.muteRemoteAudioStream(uid, mute);
}
}
public void setRemoteMute(ChatRoomMember chatRoomMember, boolean mute) {
if (chatRoomMember != null && !TextUtils.isEmpty(chatRoomMember.getAccount())) {
String account = chatRoomMember.getAccount();
Integer uid = Integer.valueOf(account);
if (uid != 0)
RtcEngineManager.get().setRemoteMute(uid, false);
}
}
/**
* 设置角色,上麦,下麦(调用)
*
* @param role CLIENT_ROLE_AUDIENCE: 听众 CLIENT_ROLE_BROADCASTER: 主播
*/
public void setRole(int role) {
if (mRtcEngine != null) {
//先已是否静音为准
mRtcEngine.setClientRole(role);
isAudienceRole = role != Constants.CLIENT_ROLE_BROADCASTER;
}
}
/**
* 设置是否能说话,静音,人自己的行为
*
* @param mute true静音false不静音
*/
@SuppressLint("CheckResult")
public void setMute(boolean mute) {
if (mRtcEngine != null) {
int result = mRtcEngine.muteLocalAudioStream(mute || (isOpenVoiceMatchActivity && !isOpenAVRoomActivity));
if (result == 0) {
isMute = mute;
}
}
}
private Handler handler = new RtcEngineHandler(this);
private static class RtcEngineHandler extends Handler {
private WeakReference<RtcEngineManager> mReference;
RtcEngineHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
RtcEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager == null) return;
if (msg.what == 0) {
if (!RtcEngineManager.get().inRoom) {
IMNetEaseManager.get().joinAvRoom();
}
RtcEngineManager.get().inRoom = true;
if (rtcEngineManager.needRecord && rtcEngineManager.mRtcEngine != null) {
rtcEngineManager.mRtcEngine.startAudioRecording(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName()
+ "/audio/" + System.currentTimeMillis() + ".aac", AUDIO_RECORDING_QUALITY_LOW);
}
} else if (msg.what == 1) {//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
int uid = speaker.uid == 0 ? Integer.valueOf(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()) {
// 如果麦上没有自己,并且自己在说话,要把自己变成听众
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
} else if (micPosition == Integer.MIN_VALUE &&
uid != AuthModel.get().getCurrentUid()) {
// 如果麦上没有这个人,要把他静音
RtcEngineManager.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)
);
} else if (msg.what == 2) {//onUserMuteAudio 用户静音回调
Integer uid = (Integer) msg.obj;
}
}
}
private static class EngineEventHandler extends IRtcEngineEventHandler {
private WeakReference<RtcEngineManager> mReference;
private boolean isEnter;
EngineEventHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
isEnter = true;
}
@Override
public void onJoinChannelSuccess(String channel, int uid, int elapsed) {
super.onJoinChannelSuccess(channel, uid, elapsed);
//声网进入频道成功日志
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,
LogProtocol.Topic.TOPIC_AUDIO_LOG,
LogProtocol.Event.EVENT_AUDIO_CHANNEL
)
.append("uid", String.valueOf(AuthModel.get().getCurrentUid()))
.append("type", "1")
.append("room_id", channel));
if (mReference.get() != null && isEnter) {
isEnter = false;
mReference.get().handler.sendEmptyMessage(0);
}
}
@Override
public void onRejoinChannelSuccess(String channel, int uid, int elapsed) {
super.onRejoinChannelSuccess(channel, uid, elapsed);
//声网重新链接频道成功日志
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,
LogProtocol.Topic.TOPIC_AUDIO_LOG,
LogProtocol.Event.EVENT_AUDIO_CHANNEL
)
.append("uid", String.valueOf(AuthModel.get().getCurrentUid()))
.append("type", "3")
.append("room_id", channel));
}
@Override
public void onLeaveChannel(RtcStats stats) {
super.onLeaveChannel(stats);
//声网离开频道成功日志
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,
LogProtocol.Topic.TOPIC_AUDIO_LOG,
LogProtocol.Event.EVENT_AUDIO_CHANNEL
)
.append("uid", String.valueOf(AuthModel.get().getCurrentUid()))
.append("type", "2"));
}
@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));
}
@Override
public void onAudioVolumeIndication(AudioVolumeInfo[] speakers, int totalVolume) {
super.onAudioVolumeIndication(speakers, totalVolume);
RtcEngineManager manager = mReference.get();
if (manager != null) {
Message message = manager.handler.obtainMessage();
message.what = 1;
message.obj = speakers;
manager.handler.sendMessage(message);
}
}
@Override
public void onUserMuteAudio(int uid, boolean muted) {
super.onUserMuteAudio(uid, muted);
RtcEngineManager manager = mReference.get();
if (manager != null) {
if (muted) {
Message message = manager.handler.obtainMessage();
message.what = 2;
message.obj = uid;
manager.handler.sendMessage(message);
}
}
}
@Override
public void onClientRoleChanged(int oldRole, int newRole) {
super.onClientRoleChanged(oldRole, newRole);
if (newRole==1)
get().setMute(get().isMute);
}
@Override
public void onAudioMixingFinished() {//伴奏播放已结束回调
super.onAudioMixingFinished();
IMNetEaseManager.get().getChatRoomEventObservable().onNext(
new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED)
);
}
@Override
public void onFirstRemoteVideoDecoded(final int uid, int width, int height, int elapsed) {
RxBus.get().post(new RemoteVideoEvent(uid));
get().remoteUid = uid;
}
}
//音乐播放相关---------------begin--------------------------
public void adjustAudioMixingVolume(int volume) {
if (mRtcEngine != null) {
mRtcEngine.adjustAudioMixingVolume(volume);
}
}
public void adjustRecordingSignalVolume(int volume) {
if (mRtcEngine != null) {
mRtcEngine.adjustRecordingSignalVolume(volume);
}
}
public int resumeAudioMixing() {
if (mRtcEngine != null) {
int result = mRtcEngine.resumeAudioMixing();
return result;
}
return -1;
}
public int pauseAudioMixing() {
if (mRtcEngine != null) {
int result = mRtcEngine.pauseAudioMixing();
return result;
}
return -1;
}
public int startAudioMixing(String filePath, boolean loopback, int cycle) {
if (mRtcEngine != null) {
mRtcEngine.stopAudioMixing();
int result = 0;
try {
result = mRtcEngine.startAudioMixing(filePath, loopback, false, cycle);
} catch (Exception e) {
return -1;
}
return result;
}
return -1;
}
public int getAudioMixingCurrentPosition() {
return mRtcEngine.getAudioMixingCurrentPosition();
}
public int getAudioMixingDuration() {
return mRtcEngine.getAudioMixingDuration();
}
//音乐播放相关---------------end--------------------------
//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;
@Nullable
private KTVKit ktvKit;
public synchronized void openKtvModel() {
if (mRtcEngine == null || isOpenKtv) return;
try {
ktvKit = KTVKit.create(mRtcEngine, BasicConfig.INSTANCE.getAppContext(), new IKTVKitEventHandler() {
@Override
public void onPlayerError(int error) {
SingleToastUtil.showToast("MV播放出现未知错误,可以点击报错向我们反馈哦~~");
}
});
} catch (Exception e) {
e.printStackTrace();
}
mRtcEngine.enableVideo();
mRtcEngine.enableLocalVideo(false);
isOpenKtv = true;
}
public synchronized void closeKtvModel() {
if (!isOpenKtv) return;
stopPush();
isPlaying = false;
isOpenKtv = false;
isLive = false;
if (mRtcEngine != null) {
mRtcEngine.disableVideo();
}
if (ktvKit != null) {
KTVKit.destroy();
ktvKit = null;
}
}
public void stopPush() {
if (isPush){
isPush = false;
if (mRtcEngine != null) {
mRtcEngine.muteLocalVideoStream(true);
mRtcEngine.enableLocalVideo(false);
// mRtcEngine.enableInEarMonitoring(false);
}
if (ktvKit != null) ktvKit.stopPlayVideoFile();
}
}
public synchronized void startMv(String url) {
if (ktvKit == null || mRtcEngine == null || !isOpenKtv || !AvRoomDataManager.get().isOwnerOnMic())
return;
mRtcEngine.enableLocalVideo(true);
//mRtcEngine.enableInEarMonitoring(true);
mRtcEngine.muteLocalVideoStream(false);
ktvKit.openAndPlayVideoFile(url);
setAccompanyVoice(accompanyVoice);
setPersonVoice(personVoice);
isPlaying = true;
isPush = true;
isLive = true;
}
public synchronized void setupRemoteVideo(VideoCanvas canvas, int remoteUid) {
if (mRtcEngine != null && isOpenKtv) {
isPlaying = true;
isLive = true;
mRtcEngine.setupRemoteVideo(canvas);
}
}
public void playOrPause() {
if (ktvKit != null) ktvKit.pause();
isPlaying = !isPlaying;
}
public void changeAudioStream() {
if (ktvKit != null) ktvKit.switchAudioTrack();
isAccompany = !isAccompany;
}
public void setAccompanyVoice(double progress) {
if (progress < 0 || progress > 1) {
return;
}
accompanyVoice = progress;
if (ktvKit != null) ktvKit.adjustAccompanyVolume(progress);
}
public void setPersonVoice(double progress) {
if (progress < 0 || progress > 1) {
return;
}
personVoice = progress;
if (ktvKit != null) ktvKit.adjustVoiceVolume(personVoice);
}
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;
}
@Nullable
public KTVKit getKtvKit() {
return ktvKit;
}
public double getPlayPos() {
return ktvKit == null ? 0 : ktvKit.getCurrentPosition();
}
public int getPlayDuration() {
return ktvKit == null ? 0 : ktvKit.getDuration();
}
//ktv相关---------------end--------------------------
}

View File

@@ -0,0 +1,29 @@
package com.yizhuan.xchat_android_core.market_verify;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.LoginTipsInfo;
import io.reactivex.Single;
public interface IMarketVerifyModel extends IModel {
/**
* 当前版本当前渠道的市场是否正常审核中
* @return
*/
boolean isMarketChecking();
/**
* 从服务器获取当前市场审核状态
* @param uid
* @return
*/
Single<Boolean> loadVersionConfigFromServer(String uid);
void setMarketChecking(boolean isMarketChecking);
/**
* 从服务器登录界面的提示语
* @return
*/
Single<LoginTipsInfo> loadLoginTip();
}

View File

@@ -0,0 +1,151 @@
package com.yizhuan.xchat_android_core.market_verify;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.auth.event.LoginEvent;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.LoginTipsInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.market_verify.bean.VersionConfig;
import com.yizhuan.xchat_android_core.market_verify.event.MarketVerifyUpdateEvent;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.SingleSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
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;
}
}
}
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){
loadVersionConfigFromServer(
String.valueOf(AuthModel.get().getCurrentUid())
)
.subscribe(new SingleObserver<Boolean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(Boolean aBoolean) {
EventBus.getDefault().post(new MarketVerifyUpdateEvent());
}
@Override
public void onError(Throwable e) {
}
});
}
@Override
public void setMarketChecking(boolean isMarketChecking) {
this.isMarketChecking = isMarketChecking;
}
/**
* 当前版本当前渠道的市场是否正常审核中
* @return
*/
@Override
public boolean isMarketChecking() {
return isMarketChecking;
}
/**
* 从服务器获取当前市场审核状态
* @param uid
* @return
*/
@Override
public Single<Boolean> loadVersionConfigFromServer(String uid){
return api.loadVersionConfig(
uid
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<ServiceResult<VersionConfig>, SingleSource<? extends Boolean>>() {
@Override
public SingleSource<? extends Boolean> apply(ServiceResult<VersionConfig> 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<LoginTipsInfo> loadLoginTip(){
return api.loadLoginTip().compose(RxHelper.handleSchAndExce()).compose(RxHelper.handleBeanData());
}
private interface Api {
/**
* 获取版本审核配置
* @return
*/
@GET("/version/get")
Single<ServiceResult<VersionConfig>> loadVersionConfig(@Query("uid") String uid);
/**
* 获取登录提示
* @return
*/
@GET("/version/get/tips")
Single<ServiceResult<LoginTipsInfo>> loadLoginTip();
}
}

View File

@@ -0,0 +1,24 @@
package com.yizhuan.xchat_android_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;//描述信息
}

View File

@@ -0,0 +1,4 @@
package com.yizhuan.xchat_android_core.market_verify.event;
public class MarketVerifyUpdateEvent {
}

View File

@@ -0,0 +1,81 @@
package com.yizhuan.xchat_android_core.retry;
import android.text.TextUtils;
import android.util.Log;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
import io.reactivex.Single;
import io.reactivex.SingleEmitter;
import io.reactivex.SingleOnSubscribe;
/**
* 云信消息重发的一个管理
* 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<RetryChatRoomMessage> 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 = "房间礼物消息发送失败, error:" + error;
ImRetryManager.log(log);
StatisticManager.Instance().onEvent(
StatisticsProtocol.Event.EVENT_ROOM_GIFT_FAILED, log);
} else if (failedCount == MAX_RETRY_COUNT + 1) {
String log = "房间礼物消息重发失败, error:" + error;
ImRetryManager.log(log);
StatisticManager.Instance().onEvent(
StatisticsProtocol.Event.EVENT_ROOM_GIFT_RETRY_FAILED, log);
}
}
})
.doOnSuccess(param -> {
ImRetryManager.log("success and connect count:" + param.getRetryCount());
if (param.getRetryCount() > 1) {
String log = "房间礼物消息重发成功-区分重连次数:" + (param.getRetryCount() - 1);
ImRetryManager.log(log);
StatisticManager.Instance().onEvent(
StatisticsProtocol.Event.EVENT_ROOM_GIFT_RETRY_SUCCEED, 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);
}
}

View File

@@ -0,0 +1,15 @@
package com.yizhuan.xchat_android_core.retry;
/**
* 重发的回调,暂时引入是为了埋点
* Created by @lvzebiao on 2020/2/20.
*/
public interface ReconnectListener {
/**
* 失败的回调
* @param failedCount 标识第几次失败
*/
void onFailed(int failedCount, String error);
}

View File

@@ -0,0 +1,17 @@
package com.yizhuan.xchat_android_core.retry;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import lombok.Getter;
import lombok.Setter;
/**
*
* Created by @lvzebiao on 2020/2/20.
*/
@Setter
@Getter
public class RetryChatRoomMessage {
private ChatRoomMessage message;
private int retryCount;
}

View File

@@ -0,0 +1,152 @@
package com.yizhuan.xchat_android_core;
import android.text.TextUtils;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref;
/**
* 请求接口接口地址
*/
public class UriProvider {
public static void init(Env.UriSetting uriSetting, String url) {
if (uriSetting == Env.UriSetting.Product) {
//生产环境地址
initProductUri(url);
} else if (uriSetting == Env.UriSetting.Test) {
//测试环境地址
initTestUri(url);
}
}
private static String DEBUG_URL;
public static void initDevUri(String url) {
DEBUG_URL = url;
JAVA_WEB_URL = url;
IM_SERVER_URL = url;
}
private static void initProductUri(String url) {
JAVA_WEB_URL = url;
IM_SERVER_URL = url;
}
private static void initTestUri(String url) {
int enviroment = CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("enviroment");
if (enviroment == 0) {
initProductUri(url);//其他使用DEV的配置就神曲这个跟新一下
} else {
if (!TextUtils.isEmpty(DEBUG_URL))
initDevUri(DEBUG_URL);
else
initDevUri(url);
}
}
/**
* 默认以下生产环境地址
*/
public static String JAVA_WEB_URL = "http://www.daxiaomao.com";
public static String IM_SERVER_URL = "https://www.daxiaomao.com";
public static String getGroupResourceBaseUri() {
return JAVA_WEB_URL.concat("/app/service/resource/list");
}
/**
*
* @return
*/
public static String getLotteryActivityPage() {
return IM_SERVER_URL.concat("/activity/double12/index.html");
}
/**
* 贵族订单页面
*
* @return -
*/
public static String getNobleOrderPage() {
return IM_SERVER_URL.concat("/modules/noble/order.html");
}
/**
* 获取房间背景(有动效)
*
* @return -
*/
public static String getRoomBg() {
return IM_SERVER_URL.concat("/modules/noble/roomBgList.html");
}
/**
* 获取贵族推荐页面
*
* @return -
*/
public static String getNobleIntroducePage() {
return IM_SERVER_URL.concat("/modules/noble/intro.html");
}
/**
* 获取贵族个人管理页面
*
* @return -
*/
public static String getNobleHomePage() {
return IM_SERVER_URL.concat("/modules/noble/homepage.html");
}
/** 贵族介绍页 */
public static String getNobleIntro() {
return "modules/noble/intro.html";
}
/** 等级界面 */
public static String getUserLevelUrl() {
return "modules/level/levelExper.html";
}
/** 等级界面 */
public static String getUserCUrl() {
return "modules/level/levelCharm.html";
}
/**
* 耳伴头条 http://beta.erbanyy.com/modules/headNews/index.html
* @return
*/
public static String getErbanTopMessageUrl() {
return JAVA_WEB_URL.concat("/modules/headNews/index.html");
}
/**
* 创建家族
* @return
*/
public static String getCreateFamilyUrl() {
return JAVA_WEB_URL.concat("/modules/family/create.html");
}
/**
* 家族指南
* @return
*/
public static String getFamilyInstructionUrl() {
return JAVA_WEB_URL.concat("/modules/family/handbook.html");
}
/**
* 家族币获取帮助
* @return
*/
public static String getFamilyCurrencyHelpUrl() {
return JAVA_WEB_URL.concat("/modules/family/faq.html");
}
}

View File

@@ -0,0 +1,51 @@
package com.yizhuan.xchat_android_core.find;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.find.bean.FindWeekStarInfo;
import com.yizhuan.xchat_android_core.find.bean.FindInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import java.util.List;
import io.reactivex.Single;
import retrofit2.http.GET;
/**
* create by lvzebiao on 2018/9/13
*/
public class FindModel extends BaseModel implements IFindModel {
private final Api api = RxNet.create(Api.class);
private static final class Helper {
public static final FindModel INSTANCE = new FindModel();
}
public static FindModel get() {
return Helper.INSTANCE;
}
@Override
public Single<ServiceResult<List<FindInfo>>> getFindInfo() {
return api.getFindInfo()
.compose(RxHelper.handleSchedulers());
}
@Override
public Single<List<FindWeekStarInfo>> getFindWeekStar() {
return api.getFindWeekStar()
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
private interface Api{
@GET("week/star/previous")
Single<ServiceResult<List<FindWeekStarInfo>>> getFindWeekStar();
@GET("discovery/items")
Single<ServiceResult<List<FindInfo>>> getFindInfo();
}
}

View File

@@ -0,0 +1,21 @@
package com.yizhuan.xchat_android_core.find;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.find.bean.FindInfo;
import com.yizhuan.xchat_android_core.find.bean.FindWeekStarInfo;
import java.util.List;
import io.reactivex.Single;
/**
* create by lvzebiao on 2018/9/13
*/
public interface IFindModel extends IModel {
Single<ServiceResult<List<FindInfo>>> getFindInfo();
Single<List<FindWeekStarInfo>> getFindWeekStar();
}

View File

@@ -0,0 +1,28 @@
package com.yizhuan.xchat_android_core.find.bean;
import lombok.Data;
@Data
public class FindInfo {
/**
* id : 3
* name : 邀请好友来玩哈哈
* routerType : 14
* seqNo : 3
* status : 1
* createTime : 1535528000000
* updateTime : 1535528003000
*/
private int id;
private String name;
private String subheading;
private String icon;
private String routerValue;
private int routerType;
private int seqNo;
private int status;
private long createTime;
private long updateTime;
}

View File

@@ -0,0 +1,292 @@
package com.yizhuan.xchat_android_core.find.bean;
import java.util.List;
public class FindWeekStarInfo {
/**
* stars : [{"erbanNo":6666,"nick":"虎爷套现85卖靓号","avatar":"https://img.erbanyy.com/FroBcMNb5ya6FzRenQYJd-SN9m1f?imageslim","totalCount":506418,"seqNo":0,"uid":90004445}]
* gift : {"giftId":1149,"giftName":"爱情锁","goldPrice":66,"seqNo":10,"nobleId":0,"nobleName":"","isNobleGift":false,"giftType":2,"giftStatus":1,"picUrl":"https://img.erbanyy.com/Fhf25vW7zxeq96Tp510ffEGgDwyc?imageslim","hasVggPic":false,"vggUrl":"","isLatest":true,"isTimeLimit":false,"hasEffect":false,"isWholeServer":false,"notifyStaySecond":0,"isSendMsg":false,"isSkipRoom":false}
*/
private GiftBean gift;
private List<StarsBean> stars;
public GiftBean getGift() {
return gift;
}
public void setGift(GiftBean gift) {
this.gift = gift;
}
public List<StarsBean> getStars() {
return stars;
}
public void setStars(List<StarsBean> stars) {
this.stars = stars;
}
public static class GiftBean {
/**
* giftId : 1149
* giftName : 爱情锁
* goldPrice : 66
* seqNo : 10
* nobleId : 0
* nobleName :
* isNobleGift : false
* giftType : 2
* giftStatus : 1
* picUrl : https://img.erbanyy.com/Fhf25vW7zxeq96Tp510ffEGgDwyc?imageslim
* hasVggPic : false
* vggUrl :
* isLatest : true
* isTimeLimit : false
* hasEffect : false
* isWholeServer : false
* notifyStaySecond : 0
* isSendMsg : false
* isSkipRoom : false
*/
private int giftId;
private String giftName;
private int goldPrice;
private int seqNo;
private int nobleId;
private String nobleName;
private boolean isNobleGift;
private int giftType;
private int giftStatus;
private String picUrl;
private boolean hasVggPic;
private String vggUrl;
private boolean isLatest;
private boolean isTimeLimit;
private boolean hasEffect;
private boolean isWholeServer;
private int notifyStaySecond;
private boolean isSendMsg;
private boolean isSkipRoom;
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 int getGoldPrice() {
return goldPrice;
}
public void setGoldPrice(int goldPrice) {
this.goldPrice = goldPrice;
}
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 String getNobleName() {
return nobleName;
}
public void setNobleName(String nobleName) {
this.nobleName = nobleName;
}
public boolean isIsNobleGift() {
return isNobleGift;
}
public void setIsNobleGift(boolean isNobleGift) {
this.isNobleGift = isNobleGift;
}
public int getGiftType() {
return giftType;
}
public void setGiftType(int giftType) {
this.giftType = giftType;
}
public int getGiftStatus() {
return giftStatus;
}
public void setGiftStatus(int giftStatus) {
this.giftStatus = giftStatus;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public boolean isHasVggPic() {
return hasVggPic;
}
public void setHasVggPic(boolean hasVggPic) {
this.hasVggPic = hasVggPic;
}
public String getVggUrl() {
return vggUrl;
}
public void setVggUrl(String vggUrl) {
this.vggUrl = vggUrl;
}
public boolean isIsLatest() {
return isLatest;
}
public void setIsLatest(boolean isLatest) {
this.isLatest = isLatest;
}
public boolean isIsTimeLimit() {
return isTimeLimit;
}
public void setIsTimeLimit(boolean isTimeLimit) {
this.isTimeLimit = isTimeLimit;
}
public boolean isHasEffect() {
return hasEffect;
}
public void setHasEffect(boolean hasEffect) {
this.hasEffect = hasEffect;
}
public boolean isIsWholeServer() {
return isWholeServer;
}
public void setIsWholeServer(boolean isWholeServer) {
this.isWholeServer = isWholeServer;
}
public int getNotifyStaySecond() {
return notifyStaySecond;
}
public void setNotifyStaySecond(int notifyStaySecond) {
this.notifyStaySecond = notifyStaySecond;
}
public boolean isIsSendMsg() {
return isSendMsg;
}
public void setIsSendMsg(boolean isSendMsg) {
this.isSendMsg = isSendMsg;
}
public boolean isIsSkipRoom() {
return isSkipRoom;
}
public void setIsSkipRoom(boolean isSkipRoom) {
this.isSkipRoom = isSkipRoom;
}
}
public static class StarsBean {
/**
* erbanNo : 6666
* nick : 虎爷套现85卖靓号
* avatar : https://img.erbanyy.com/FroBcMNb5ya6FzRenQYJd-SN9m1f?imageslim
* totalCount : 506418
* seqNo : 0
* uid : 90004445
*/
private int erbanNo;
private String nick;
private String avatar;
private int totalCount;
private int seqNo;
private int 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 getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getSeqNo() {
return seqNo;
}
public void setSeqNo(int seqNo) {
this.seqNo = seqNo;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
}
}

View File

@@ -0,0 +1,221 @@
package com.yizhuan.xchat_android_core.home;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.HomeInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import java.util.ArrayList;
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.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public class HomeModel extends BaseModel implements IHomeModel {
private volatile static IHomeModel instance;
private Api api;
private List<TabInfo> mTabInfoList;
public static IHomeModel get() {
if (instance == null){
synchronized (HomeModel.class){
if (instance == null){
instance = new HomeModel();
}
}
}
return instance;
}
private HomeModel(){
api = RxNet.create(Api.class);
}
/**
* 获取缓存的房间分类数据
* @return
*/
@Override
public List<TabInfo> getmTabInfoList() {
return mTabInfoList;
}
/**
* 获取首页Tab失败
* @return
*/
@Override
public Single<List<TabInfo>> getMainTabData() {
return api.getMainTabList(AuthModel.get().getCurrentUid())
.compose(RxHelper.handleSchedulers())
.compose(RxHelper.handleBeanData())
.doOnSuccess(new Consumer<List<TabInfo>>() {
@Override
public void accept(List<TabInfo> tabInfos) throws Exception {
mTabInfoList = tabInfos;
}
})
.doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Logger.e("获取首页Tab失败......");
}
});
}
/**
* 获取首页数据
* @param page
* @param pageSize
* @return
*/
@Override
public Single<HomeInfo> getHomeData(final int page, int pageSize) {
return api.getMainHotData(
String.valueOf(AuthModel.get().getCurrentUid()),
String.valueOf(page),
String.valueOf(pageSize)
)
.flatMap(new Function<ServiceResult<HomeInfo>, SingleSource<HomeInfo>>() {
@Override
public SingleSource<HomeInfo> apply(ServiceResult<HomeInfo> result) throws Exception {
if (result == null || !result.isSuccess()) {
return Single.error(new Throwable(RxHelper.getValidMessage(result)));
}
HomeInfo homeInfo = result.getData();
//如果为null也需要返回成功否则加载更多的逻辑就无法执行
if (homeInfo == null) {
homeInfo = new HomeInfo();
}
return Single.just(homeInfo);
}
})
.compose(RxHelper.handleSchedulers());
}
/**
* 反馈
* @param feedbackDesc
* @param contact
* @return
*/
@Override
public Single<String> commitFeedback(String feedbackDesc, String contact) {
return api.commitFeedback(
String.valueOf(AuthModel.get().getCurrentUid()),
feedbackDesc,
contact,
AuthModel.get().getTicket()
)
.flatMap(new Function<ServiceResult, SingleSource<String>>() {
@Override
public SingleSource<String> apply(ServiceResult serviceResult) throws Exception {
if (serviceResult.isSuccess()) {
return Single.just("反馈成功");
} else {
return Single.error(new Throwable(serviceResult.getMessage()));
}
}
})
.compose(RxHelper.handleSchedulers());
}
/**
* 根据分类 获取房间列表
* @param tagId
* @param pageNum
* @param pageSize
*/
@Override
public Single<List<HomeRoom>> getMainDataByTab(final int tagId, final int pageNum, int pageSize) {
return api.getMainDataByTab(
String.valueOf(tagId),
String.valueOf(pageNum),
String.valueOf(pageSize)
)
.flatMap(new Function<ServiceResult<List<HomeRoom>>, SingleSource<List<HomeRoom>>>() {
@Override
public SingleSource<List<HomeRoom>> apply(ServiceResult<List<HomeRoom>> listServiceResult) throws Exception {
if (listServiceResult.isSuccess()){
if (listServiceResult.getData() == null){
return Single.just(new ArrayList<HomeRoom>());
}
return Single.just(listServiceResult.getData());
}else {
return Single.error(new Throwable(listServiceResult.getMessage()));
}
}
})
.compose(RxHelper.handleSchedulers());
}
private interface Api{
/**
* 获取首页热门数据
*
* @param uid
* @param pageNum
* @param pageSize
* @return
*/
@GET("/home/v2/hotindex")
Single<ServiceResult<HomeInfo>> getMainHotData(@Query("uid") String uid,
@Query("pageNum") String pageNum,
@Query("pageSize") String pageSize);
/**
* 提交反馈
*
* @param uid
* @param feedbackDesc
* @param contact
* @param ticket
* @return
*/
@POST("/feedback")
Single<ServiceResult> commitFeedback(@Query("uid") String uid,
@Query("feedbackDesc") String feedbackDesc,
@Query("contact") String contact,
@Query("ticket") String ticket);
/**
* 获取首页tab数据
*
* @return
*/
@GET("/room/tag/top")
Single<ServiceResult<List<TabInfo>>> getMainTabList(@Query("uid") long uid);
/**
* 获取
* @param tagId
* @param pageNum
* @param pageSize
* @return
*/
@POST("home/v2/tagindex")
Single<ServiceResult<List<HomeRoom>>> getMainDataByTab(@Query("tagId") String tagId,
@Query("pageNum") String pageNum,
@Query("pageSize") String pageSize);
}
}

View File

@@ -0,0 +1,48 @@
package com.yizhuan.xchat_android_core.home;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.home.bean.HomeInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import java.util.List;
import io.reactivex.Single;
public interface IHomeModel extends IModel {
/**
* 获取缓存的房间分类数据
* @return
*/
List<TabInfo> getmTabInfoList();
/**
* 获取首页Tab失败
* @return
*/
Single<List<TabInfo>> getMainTabData();
/**
* 获取首页数据
* @param page
* @param pageSize
* @return
*/
Single<HomeInfo> getHomeData(int page, int pageSize);
/**
* 反馈
* @param feedbackDesc
* @param contact
* @return
*/
Single<String> commitFeedback(String feedbackDesc, String contact);
/**
* 根据分类 获取房间列表
* @param tagId
* @param pageNum
* @param pageSize
*/
Single<List<HomeRoom>> getMainDataByTab(int tagId, int pageNum, int pageSize);
}

View File

@@ -0,0 +1,75 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import lombok.Data;
/**
* Created by Administrator on 2017/8/7.
*/
@Data
public class BannerInfo implements Parcelable {
/*
bannerId1 //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 BannerInfo(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<BannerInfo> CREATOR = new Creator<BannerInfo>() {
@Override
public BannerInfo createFromParcel(Parcel in) {
return new BannerInfo(in);
}
@Override
public BannerInfo[] newArray(int size) {
return new BannerInfo[size];
}
};
}

View File

@@ -0,0 +1,61 @@
package com.yizhuan.xchat_android_core.home.bean;
/**
* Created by huangmeng1 on 2018/1/31.
*/
public class FindInfo {
/**
* advName : 测试啊
* advIcon : http://img.letusmix.com/FvbRJRJgufTpntjatyfL8xx1yBQ5?imageslim
* skipType : 3
* skipUri : www.baidu.com
*/
private String advName;
private String advIcon;
private int skipType;
private String skipUri;
@Override
public String toString() {
return "FindInfo{" +
"advName='" + advName + '\'' +
", advIcon='" + advIcon + '\'' +
", skipType=" + skipType +
", skipUri='" + skipUri + '\'' +
'}';
}
public String getAdvName() {
return advName;
}
public void setAdvName(String advName) {
this.advName = advName;
}
public String getAdvIcon() {
return advIcon;
}
public void setAdvIcon(String advIcon) {
this.advIcon = advIcon;
}
public int getSkipType() {
return skipType;
}
public void setSkipType(int skipType) {
this.skipType = skipType;
}
public String getSkipUri() {
return skipUri;
}
public void setSkipUri(String skipUri) {
this.skipUri = skipUri;
}
}

View File

@@ -0,0 +1,29 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.util.List;
/**
* <p> 首页数据 </p>
*
* @author Administrator
* @date 2017/11/22
*/
public class HomeInfo {
public List<BannerInfo> banners;
/** 排行数据 */
public RankingInfo rankHome;
/** 热门推荐 */
public List<HomeRoom> hotRooms;
/** 房间推荐 */
public List<HomeRoom> listRoom;
@Override
public String toString() {
return "HomeInfo{" +
"banners=" + banners +
", rankHome=" + rankHome +
", hotRooms=" + hotRooms +
", listRoom=" + listRoom +
'}';
}
}

View File

@@ -0,0 +1,82 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.util.List;
/**
* <p> 首页热门实体u </p>
*
* @author Administrator
* @date 2017/11/16
*/
public class HomeItem implements MultiItemEntity, Parcelable {
public static final int BANNER = 1;
public static final int RANKING = 2;
public static final int RECOMMEND = 3;
public static final int NORMAL = 4;
private int itemType;
//正常数据
public List<HomeRoom> recomList;
public List<HomeRoom> homeItemRoomList;
public List<BannerInfo> bannerInfoList;
public RankingInfo mRankingInfo;
public HomeItem(int itemType) {
this.itemType = itemType;
}
public HomeItem(int itemType, RankingInfo rankingInfo) {
this.itemType = itemType;
mRankingInfo = rankingInfo;
}
protected HomeItem(Parcel in) {
itemType = in.readInt();
recomList = in.createTypedArrayList(HomeRoom.CREATOR);
homeItemRoomList = in.createTypedArrayList(HomeRoom.CREATOR);
bannerInfoList = in.createTypedArrayList(BannerInfo.CREATOR);
mRankingInfo = in.readParcelable(RankingInfo.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(itemType);
dest.writeTypedList(recomList);
dest.writeTypedList(homeItemRoomList);
dest.writeTypedList(bannerInfoList);
dest.writeParcelable(mRankingInfo, flags);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<HomeItem> CREATOR = new Creator<HomeItem>() {
@Override
public HomeItem createFromParcel(Parcel in) {
return new HomeItem(in);
}
@Override
public HomeItem[] newArray(int size) {
return new HomeItem[size];
}
};
@Override
public int getItemType() {
return itemType;
}
}

View File

@@ -0,0 +1,164 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import com.yizhuan.xchat_android_core.level.UserLevelVo;
import com.yizhuan.xchat_android_core.noble.NobleInfo;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_library.utils.ListUtils;
import java.util.ArrayList;
/**
* @author zhouxiangfeng
* @date 2017/5/17
*/
public class HomeRoom 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;
/** 是否是靓号1靓号 */
public boolean hasPrettyErbanNo;
public NobleInfo nobleUsers;
public UserLevelVo userLevelVo;
public boolean newUser;
private ArrayList<BannerInfo> bannerInfos;
public HomeRoom() {
}
protected HomeRoom(Parcel in) {
super(in);
gender = in.readInt();
nick = in.readString();
defUser = in.readInt();
erbanNo = in.readLong();
badge = in.readString();
hasPrettyErbanNo = in.readByte() != 0;
bannerInfos = in.createTypedArrayList(BannerInfo.CREATOR);
newUser = in.readByte() != 0;
}
@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.writeByte((byte) (hasPrettyErbanNo ? 1 : 0));
dest.writeTypedList(bannerInfos);
dest.writeByte((byte) (newUser ? 1 : 0));
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<HomeRoom> CREATOR = new Creator<HomeRoom>() {
@Override
public HomeRoom createFromParcel(Parcel in) {
return new HomeRoom(in);
}
@Override
public HomeRoom[] newArray(int size) {
return new HomeRoom[size];
}
};
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public int getDefUser() {
return defUser;
}
public void setDefUser(int defUser) {
this.defUser = defUser;
}
public long getErbanNo() {
return erbanNo;
}
public void setErbanNo(long erbanNo) {
this.erbanNo = erbanNo;
}
public String getBadge() {
return badge;
}
public void setBadge(String badge) {
this.badge = badge;
}
public boolean isHasPrettyErbanNo() {
return hasPrettyErbanNo;
}
public void setHasPrettyErbanNo(boolean hasPrettyErbanNo) {
this.hasPrettyErbanNo = hasPrettyErbanNo;
}
public NobleInfo getNobleUsers() {
return nobleUsers;
}
public void setNobleUsers(NobleInfo nobleUsers) {
this.nobleUsers = nobleUsers;
}
public UserLevelVo getUserLevelVo() {
return userLevelVo;
}
public void setUserLevelVo(UserLevelVo userLevelVo) {
this.userLevelVo = userLevelVo;
}
public ArrayList<BannerInfo> getBannerInfos() {
return bannerInfos;
}
public void setBannerInfos(ArrayList<BannerInfo> bannerInfos) {
this.bannerInfos = bannerInfos;
}
@Override
public int getItemType() {
return ListUtils.isListEmpty(bannerInfos)?NORMAL:BANNER;
}
}

View File

@@ -0,0 +1,38 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
/**
* Created by chenran on 2017/10/4.
*/
public class HomeRoomList implements Serializable{
private List<HomeRoom> recomRooms;
private List<HomeRoom> gameRooms;
private List<HomeRoom> chatRooms;
public List<HomeRoom> getRecomRooms() {
return recomRooms;
}
public void setRecomRooms(List<HomeRoom> recomRooms) {
this.recomRooms = recomRooms;
}
public List<HomeRoom> getGameRooms() {
return gameRooms;
}
public void setGameRooms(List<HomeRoom> gameRooms) {
this.gameRooms = gameRooms;
}
public List<HomeRoom> getChatRooms() {
return chatRooms;
}
public void setChatRooms(List<HomeRoom> chatRooms) {
this.chatRooms = chatRooms;
}
}

View File

@@ -0,0 +1,158 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
/**
* <p> 首页排行信息 </p>
* Created by Administrator on 2017/11/8.
*/
public class RankingInfo implements Parcelable {
public List<Ranking> starList;
public List<Ranking> nobleList;
public List<Ranking> roomList;
@Override
public String toString() {
return "RankingInfo{" +
"starList=" + starList +
", nobleList=" + nobleList +
", roomList=" + roomList +
'}';
}
public static class Ranking implements Parcelable {
@Override
public String toString() {
return "Ranking{" +
"erbanNo=" + erbanNo +
", avatar='" + avatar + '\'' +
", nick='" + nick + '\'' +
", gender=" + gender +
", totalNum=" + totalNum +
'}';
}
/**
* erbanNo : 850379
* avatar : https://nos.netease.com/nim/NDI3OTA4NQ==/bmltYV83Nzg4MzQyNDJfMTUwNzIwMzM4NTc2N184YmJlZmQ4ZS01YzdiLTRmMWMtYmFhOC0xMWRlNzg3MzRlMzk=
* nick : 阿拉善
* gender : 1
* totalNum : 9988923
*/
private int erbanNo;
private String avatar;
private String nick;
private int gender;
private int totalNum;
protected Ranking(Parcel in) {
erbanNo = in.readInt();
avatar = in.readString();
nick = in.readString();
gender = in.readInt();
totalNum = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(erbanNo);
dest.writeString(avatar);
dest.writeString(nick);
dest.writeInt(gender);
dest.writeInt(totalNum);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Ranking> CREATOR = new Creator<Ranking>() {
@Override
public Ranking createFromParcel(Parcel in) {
return new Ranking(in);
}
@Override
public Ranking[] newArray(int size) {
return new Ranking[size];
}
};
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;
}
}
protected RankingInfo(Parcel in) {
starList = in.createTypedArrayList(Ranking.CREATOR);
nobleList = in.createTypedArrayList(Ranking.CREATOR);
roomList = in.createTypedArrayList(Ranking.CREATOR);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(starList);
dest.writeTypedList(nobleList);
dest.writeTypedList(roomList);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<RankingInfo> CREATOR = new Creator<RankingInfo>() {
@Override
public RankingInfo createFromParcel(Parcel in) {
return new RankingInfo(in);
}
@Override
public RankingInfo[] newArray(int size) {
return new RankingInfo[size];
}
};
}

View File

@@ -0,0 +1,119 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
/**
* <p> tab 标签数据 </p>
*
* @author Administrator
* @date 2017/11/21
*/
@Data
public class TabInfo implements Parcelable, Serializable{
/**
* id : 8
* name : 聊天
* pict : https://img.erbanyy.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 TabInfo(int id, String name) {
this.id = id;
this.name = name;
}
public TabInfo(int id, String name,String icon) {
this(id, name);
this.icon=icon;
}
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<TabInfo> CREATOR = new Creator<TabInfo>() {
@Override
public TabInfo createFromParcel(Parcel in) {
return new TabInfo(in);
}
@Override
public TabInfo[] newArray(int size) {
return new TabInfo[size];
}
};
public static List<TabInfo> getTabDefaultList() {
List<TabInfo> tabInfoList = new ArrayList<>();
tabInfoList.add(new TabInfo(1, "新秀","https://img.letusmix.com/xinxiu_tag_icon.png"));
tabInfoList.add(new TabInfo(2, "遇见","https://img.letusmix.com/xiehou_tag_icon.png"));
tabInfoList.add(new TabInfo(3, "交友","https://img.letusmix.com/jiaoyou_tag_icon.png"));
tabInfoList.add(new TabInfo(4, "娱乐","https://img.letusmix.com/yule_tag_icon.png"));
tabInfoList.add(new TabInfo(5, "音乐","https://img.letusmix.com/yinyue_tag_icon.png"));
tabInfoList.add(new TabInfo(6, "电台","https://img.letusmix.com/diantai_tag_icon.png"));
return tabInfoList;
}
public static List<TabInfo> getTabCheckVersion() {
List<TabInfo> tabInfoList = new ArrayList<>();
tabInfoList.add(new TabInfo(16, "邂逅","https://img.letusmix.com/xiehou_tag_icon.png"));
return tabInfoList;
}
@Override
public String toString() {
return "TabInfo{" +
"name='" + name + '\'' +
'}';
}
}

View File

@@ -0,0 +1,679 @@
package com.yizhuan.xchat_android_core.manager;
import android.annotation.SuppressLint;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.ktv.event.RemoteVideoEvent;
import com.yizhuan.xchat_android_core.statistic.LogFactory;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.LogProtocol;
import com.yizhuan.xchat_android_library.rxbus.RxBus;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import io.agora.ktvkit.IKTVKitEventHandler;
import io.agora.ktvkit.KTVKit;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
import io.agora.rtc.RtcEngine;
import io.agora.rtc.video.VideoCanvas;
import static io.agora.rtc.Constants.AUDIO_PROFILE_DEFAULT;
import static io.agora.rtc.Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO;
import static io.agora.rtc.Constants.AUDIO_PROFILE_SPEECH_STANDARD;
import static io.agora.rtc.Constants.AUDIO_RECORDING_QUALITY_LOW;
import static io.agora.rtc.Constants.AUDIO_SCENARIO_GAME_STREAMING;
/**
* <p> 声网管理类 </p>
*
* @author jiahui
* @date 2017/12/12
*/
public final class RtcEngineManager {
private static volatile RtcEngineManager sEngineManager;
private static final Object SYNC_OBJECT = new Object();
@Nullable
private RtcEngine mRtcEngine;
private Map<String, Integer> speakers;
/**
* 说话列表
*/
private List<Integer> speakMembersPosition;
/**
* 队列说话列表
*/
private List<Integer> speakQueueMembersPosition;
private String uid;
public boolean isAudienceRole;
/**
* 麦上是否闭麦true闭麦false开麦
*/
public boolean isMute;
/**
* 听筒是否关闭
*/
public boolean isRemoteMute;
private boolean needRecord;
//是否在房间,判断是切换品质还是第一次进
private boolean inRoom;
private EngineEventHandler eventHandler;
private static final class Helper {
private static final RtcEngineManager INSTANCE = new RtcEngineManager();
}
private RtcEngineManager() {
System.out.println("hehehehe" + RtcEngine.getSdkVersion());
speakMembersPosition = new ArrayList<>();
speakQueueMembersPosition = new ArrayList<>();
}
public static RtcEngineManager get() {
return Helper.INSTANCE;
}
public void startRtcEngine(long uid) {
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
// if (curRoomInfo.getAudioQuality() == RoomInfo.ROOMTYPE_LIGHT_CHAT) {
// joinHighQualityChannel(curRoomInfo.getRoomId(), uid,true);
// } else {
joinChannel(curRoomInfo.getRoomId(), uid);
// }
if (curRoomInfo.getUid() == uid && curRoomInfo.getType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
//设置用户角色为主播,轰趴房不能默认设置房主为主播
setRole(Constants.CLIENT_ROLE_BROADCASTER);
} else {
setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
}
public void joinChannel(long channelId, long uid) {
initRtcEngine(channelId, uid, AUDIO_PROFILE_DEFAULT, AUDIO_PROFILE_SPEECH_STANDARD);
}
public void joinHighQualityChannel(long channelId, long uid, boolean record) {
this.needRecord = record;
initRtcEngine(channelId, uid, AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, AUDIO_SCENARIO_GAME_STREAMING);
}
public void reJoinChannel(long channelId, long uid) {
enterChannel(channelId, (int) uid, AUDIO_PROFILE_DEFAULT, AUDIO_PROFILE_SPEECH_STANDARD);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
public void reJoinHighQualityChannel(long channelId, long uid, boolean record) {
this.needRecord = record;
enterChannel(channelId, (int) uid, AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, AUDIO_SCENARIO_GAME_STREAMING);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
private void initRtcEngine(long channelId, long uid, int quality, int audioShowRoom) {
this.uid = uid + "";
this.isMute = false;
this.isRemoteMute = false;
enterChannel(channelId, (int) uid, quality, audioShowRoom);
}
private void enterChannel(long channelId, int uid, int quality, int audioShowRoom) {
if (mRtcEngine == null) {
try {
eventHandler = new EngineEventHandler(this);
mRtcEngine = RtcEngine.create(BasicConfig.INSTANCE.getAppContext(), XChatConstants.AGORA_KEY, eventHandler);
} 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(quality, audioShowRoom);
mRtcEngine.enableAudioVolumeIndication(600, 3);
mRtcEngine.setDefaultAudioRoutetoSpeakerphone(true);
mRtcEngine.setExternalVideoSource(true, false, true);
mRtcEngine.setRecordingAudioFrameParameters(48000, 2, 2, 960);
mRtcEngine.setVideoProfile(Constants.VIDEO_PROFILE_360P, false);
mRtcEngine.enableDualStreamMode(true);
mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.profile\":{\"scenario\":%d}}", 1));
mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.headset.monitoring,true\"}"));
mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.enable.androidlowlatencymode,true\"}"));
mRtcEngine.setLogFile(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName() + "/log/agora-rtc.log");
}
//创建并加入频道
mRtcEngine.joinChannel(null, String.valueOf(channelId), null, uid);
}
public int stopAudioMixing() {
if (mRtcEngine != null) {
return mRtcEngine.stopAudioMixing();
}
return -1;
}
public void resetChannel() {
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (handler != null)
handler.removeCallbacksAndMessages(null);
}
public void leaveChannel() {
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (handler != null)
handler.removeCallbacksAndMessages(null);
// isAudienceRole = true;
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
}
public boolean isSpeaking(int position) {
if (speakMembersPosition != null) {
if (speakMembersPosition.contains(position)) {
return true;
}
}
return false;
}
public boolean isQueueSpeaking(int position) {
if (speakQueueMembersPosition != null) {
if (speakQueueMembersPosition.contains(position)) {
return true;
}
}
return false;
}
//设置静音
public void setRemoteMute(boolean mute) {
if (mRtcEngine != null) {
int result = mRtcEngine.muteAllRemoteAudioStreams(mute);
if (result == 0) {
isRemoteMute = mute;
}
}
}
public void setRemoteMute(int uid, boolean mute) {
if (mRtcEngine != null) {
mRtcEngine.muteRemoteAudioStream(uid, mute);
}
}
public void setRemoteMute(ChatRoomMember chatRoomMember, boolean mute) {
if (chatRoomMember != null && !TextUtils.isEmpty(chatRoomMember.getAccount())) {
String account = chatRoomMember.getAccount();
Integer uid = Integer.valueOf(account);
if (uid != 0)
RtcEngineManager.get().setRemoteMute(uid, false);
}
}
/**
* 设置角色,上麦,下麦(调用)
*
* @param role CLIENT_ROLE_AUDIENCE: 听众 CLIENT_ROLE_BROADCASTER: 主播
*/
public void setRole(int role) {
if (mRtcEngine != null) {
//先已是否静音为准
mRtcEngine.setClientRole(role);
//isAudienceRole = role != Constants.CLIENT_ROLE_BROADCASTER;
}
}
/**
* 设置是否能说话,静音,人自己的行为
*
* @param mute true静音false不静音
*/
@SuppressLint("CheckResult")
public void setMute(boolean mute) {
if (mRtcEngine != null) {
int result = mRtcEngine.muteLocalAudioStream(mute);
if (result == 0) {
isMute = mute;
}
}
}
private Handler handler = new RtcEngineHandler(this);
private static class RtcEngineHandler extends Handler {
private WeakReference<RtcEngineManager> mReference;
RtcEngineHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
RtcEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager == null) return;
if (msg.what == 0) {
if (!RtcEngineManager.get().inRoom) {
IMNetEaseManager.get().joinAvRoom();
}
RtcEngineManager.get().inRoom = true;
if (rtcEngineManager.needRecord && rtcEngineManager.mRtcEngine != null) {
rtcEngineManager.mRtcEngine.startAudioRecording(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName()
+ "/audio/" + System.currentTimeMillis() + ".aac", AUDIO_RECORDING_QUALITY_LOW);
}
} else if (msg.what == 1) {//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
int uid = speaker.uid == 0 ? Integer.valueOf(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()) {
// 如果麦上没有自己,并且自己在说话,要把自己变成听众
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
} else if (micPosition == Integer.MIN_VALUE &&
uid != AuthModel.get().getCurrentUid()) {
// 如果麦上没有这个人,要把他静音
RtcEngineManager.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)
);
} else if (msg.what == 2) {//onUserMuteAudio 用户静音回调
Integer uid = (Integer) msg.obj;
}
}
}
private static class EngineEventHandler extends IRtcEngineEventHandler {
private WeakReference<RtcEngineManager> mReference;
private boolean isEnter;
EngineEventHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
isEnter = true;
}
@Override
public void onJoinChannelSuccess(String channel, int uid, int elapsed) {
super.onJoinChannelSuccess(channel, uid, elapsed);
//声网进入频道成功日志
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,
LogProtocol.Topic.TOPIC_AUDIO_LOG,
LogProtocol.Event.EVENT_AUDIO_CHANNEL
)
.append("uid", String.valueOf(AuthModel.get().getCurrentUid()))
.append("type", "1")
.append("room_id", channel));
if (mReference.get() != null && isEnter) {
isEnter = false;
mReference.get().handler.sendEmptyMessage(0);
}
}
@Override
public void onRejoinChannelSuccess(String channel, int uid, int elapsed) {
super.onRejoinChannelSuccess(channel, uid, elapsed);
//声网重新链接频道成功日志
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,
LogProtocol.Topic.TOPIC_AUDIO_LOG,
LogProtocol.Event.EVENT_AUDIO_CHANNEL
)
.append("uid", String.valueOf(AuthModel.get().getCurrentUid()))
.append("type", "3")
.append("room_id", channel));
}
@Override
public void onLeaveChannel(RtcStats stats) {
super.onLeaveChannel(stats);
//声网离开频道成功日志
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,
LogProtocol.Topic.TOPIC_AUDIO_LOG,
LogProtocol.Event.EVENT_AUDIO_CHANNEL
)
.append("uid", String.valueOf(AuthModel.get().getCurrentUid()))
.append("type", "2"));
}
@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));
}
@Override
public void onAudioVolumeIndication(AudioVolumeInfo[] speakers, int totalVolume) {
super.onAudioVolumeIndication(speakers, totalVolume);
RtcEngineManager manager = mReference.get();
if (manager != null) {
Message message = manager.handler.obtainMessage();
message.what = 1;
message.obj = speakers;
manager.handler.sendMessage(message);
}
}
@Override
public void onUserMuteAudio(int uid, boolean muted) {
super.onUserMuteAudio(uid, muted);
RtcEngineManager manager = mReference.get();
if (manager != null) {
if (muted) {
Message message = manager.handler.obtainMessage();
message.what = 2;
message.obj = uid;
manager.handler.sendMessage(message);
}
}
}
@Override
public void onClientRoleChanged(int oldRole, int newRole) {
super.onClientRoleChanged(oldRole, newRole);
if (newRole==1)
get().setMute(get().isMute);
}
@Override
public void onAudioMixingFinished() {//伴奏播放已结束回调
super.onAudioMixingFinished();
IMNetEaseManager.get().getChatRoomEventObservable().onNext(
new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED)
);
}
@Override
public void onFirstRemoteVideoDecoded(final int uid, int width, int height, int elapsed) {
RxBus.get().post(new RemoteVideoEvent(uid));
get().remoteUid = uid;
}
}
//音乐播放相关---------------begin--------------------------
public void adjustAudioMixingVolume(int volume) {
if (mRtcEngine != null) {
mRtcEngine.adjustAudioMixingVolume(volume);
}
}
public void adjustRecordingSignalVolume(int volume) {
if (mRtcEngine != null) {
mRtcEngine.adjustRecordingSignalVolume(volume);
}
}
public int resumeAudioMixing() {
if (mRtcEngine != null) {
int result = mRtcEngine.resumeAudioMixing();
return result;
}
return -1;
}
public int pauseAudioMixing() {
if (mRtcEngine != null) {
int result = mRtcEngine.pauseAudioMixing();
return result;
}
return -1;
}
public int startAudioMixing(String filePath, boolean loopback, int cycle) {
if (mRtcEngine != null) {
mRtcEngine.stopAudioMixing();
int result = 0;
try {
result = mRtcEngine.startAudioMixing(filePath, loopback, false, cycle);
} catch (Exception e) {
return -1;
}
return result;
}
return -1;
}
public int getAudioMixingCurrentPosition() {
return mRtcEngine.getAudioMixingCurrentPosition();
}
public int getAudioMixingDuration() {
return mRtcEngine.getAudioMixingDuration();
}
//音乐播放相关---------------end--------------------------
//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;
@Nullable
private KTVKit ktvKit;
public synchronized void openKtvModel() {
if (mRtcEngine == null || isOpenKtv) return;
try {
ktvKit = KTVKit.create(mRtcEngine, BasicConfig.INSTANCE.getAppContext(), new IKTVKitEventHandler() {
@Override
public void onPlayerError(int error) {
SingleToastUtil.showToast("MV播放出现未知错误,可以点击报错向我们反馈哦~~");
}
});
} catch (Exception e) {
e.printStackTrace();
}
mRtcEngine.enableVideo();
mRtcEngine.enableLocalVideo(false);
isOpenKtv = true;
}
public synchronized void closeKtvModel() {
if (!isOpenKtv) return;
stopPush();
isPlaying = false;
isOpenKtv = false;
isLive = false;
if (mRtcEngine != null) {
mRtcEngine.disableVideo();
}
if (ktvKit != null) {
KTVKit.destroy();
ktvKit = null;
}
}
public void stopPush() {
if (isPush){
isPush = false;
if (mRtcEngine != null) {
mRtcEngine.muteLocalVideoStream(true);
mRtcEngine.enableLocalVideo(false);
// mRtcEngine.enableInEarMonitoring(false);
}
if (ktvKit != null) ktvKit.stopPlayVideoFile();
}
}
public synchronized void startMv(String url) {
if (ktvKit == null || mRtcEngine == null || !isOpenKtv || !AvRoomDataManager.get().isOwnerOnMic())
return;
mRtcEngine.enableLocalVideo(true);
//mRtcEngine.enableInEarMonitoring(true);
mRtcEngine.muteLocalVideoStream(false);
ktvKit.openAndPlayVideoFile(url);
setAccompanyVoice(accompanyVoice);
setPersonVoice(personVoice);
isPlaying = true;
isPush = true;
isLive = true;
}
public synchronized void setupRemoteVideo(VideoCanvas canvas, int remoteUid) {
if (mRtcEngine != null && isOpenKtv) {
isPlaying = true;
isLive = true;
mRtcEngine.setupRemoteVideo(canvas);
}
}
public void playOrPause() {
if (ktvKit != null) ktvKit.pause();
isPlaying = !isPlaying;
}
public void changeAudioStream() {
if (ktvKit != null) ktvKit.switchAudioTrack();
isAccompany = !isAccompany;
}
public void setAccompanyVoice(double progress) {
if (progress < 0 || progress > 1) {
return;
}
accompanyVoice = progress;
if (ktvKit != null) ktvKit.adjustAccompanyVolume(progress);
}
public void setPersonVoice(double progress) {
if (progress < 0 || progress > 1) {
return;
}
personVoice = progress;
if (ktvKit != null) ktvKit.adjustVoiceVolume(personVoice);
}
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;
}
@Nullable
public KTVKit getKtvKit() {
return ktvKit;
}
public double getPlayPos() {
return ktvKit == null ? 0 : ktvKit.getCurrentPosition();
}
public int getPlayDuration() {
return ktvKit == null ? 0 : ktvKit.getDuration();
}
//ktv相关---------------end--------------------------
}

View File

@@ -0,0 +1,17 @@
package com.yizhuan.xchat_android_core.version;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.VersionInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import io.reactivex.Single;
import retrofit2.http.Query;
/**
* create by lvzebiao on 2018/9/14
*/
public interface IVersionModel extends IModel{
Single<VersionInfo> getVersion(@Query("version") String version);
}

View File

@@ -0,0 +1,39 @@
package com.yizhuan.xchat_android_core.version;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.VersionInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import io.reactivex.Single;
import retrofit2.http.GET;
import retrofit2.http.Query;
/**
* create by lvzebiao on 2018/9/14
*/
public class VersionModel extends BaseModel implements IVersionModel{
private Api api;
public VersionModel() {
api = RxNet.create(Api.class);
}
@Override
public Single<VersionInfo> getVersion(String version) {
return api.getVersion(version)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
private interface Api {
/**
*版本
*/
@GET("version/get")
Single<ServiceResult<VersionInfo>> getVersion(@Query("version") String version);
}
}

View File

@@ -0,0 +1,152 @@
package com.yizhuan.xchat_android_core;
import android.text.TextUtils;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref;
/**
* 请求接口接口地址
*/
public class UriProvider {
public static void init(Env.UriSetting uriSetting, String url) {
if (uriSetting == Env.UriSetting.Product) {
//生产环境地址
initProductUri(url);
} else if (uriSetting == Env.UriSetting.Test) {
//测试环境地址
initTestUri(url);
}
}
private static String DEBUG_URL;
public static void initDevUri(String url) {
DEBUG_URL = url;
JAVA_WEB_URL = url;
IM_SERVER_URL = url;
}
private static void initProductUri(String url) {
JAVA_WEB_URL = url;
IM_SERVER_URL = url;
}
private static void initTestUri(String url) {
int enviroment = CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("enviroment");
if (enviroment == 0) {
initProductUri(url);//其他使用DEV的配置就神曲这个跟新一下
} else {
if (!TextUtils.isEmpty(DEBUG_URL))
initDevUri(DEBUG_URL);
else
initDevUri(url);
}
}
/**
* 默认以下生产环境地址
*/
public static String JAVA_WEB_URL = "http://www.daxiaomao.com";
public static String IM_SERVER_URL = "https://www.daxiaomao.com";
public static String getGroupResourceBaseUri() {
return JAVA_WEB_URL.concat("/app/service/resource/list");
}
/**
*
* @return
*/
public static String getLotteryActivityPage() {
return IM_SERVER_URL.concat("/ms/modules/userDraw/index.html");
}
/**
* 贵族订单页面
*
* @return -
*/
public static String getNobleOrderPage() {
return IM_SERVER_URL.concat("/modules/noble/order.html");
}
/**
* 获取房间背景(有动效)
*
* @return -
*/
public static String getRoomBg() {
return IM_SERVER_URL.concat("/modules/noble/roomBgList.html");
}
/**
* 获取贵族推荐页面
*
* @return -
*/
public static String getNobleIntroducePage() {
return IM_SERVER_URL.concat("/modules/noble/intro.html");
}
/**
* 获取贵族个人管理页面
*
* @return -
*/
public static String getNobleHomePage() {
return IM_SERVER_URL.concat("/modules/noble/homepage.html");
}
/** 贵族介绍页 */
public static String getNobleIntro() {
return "modules/noble/intro.html";
}
/** 等级界面 */
public static String getUserLevelUrl() {
return "modules/level/levelExper.html";
}
/** 等级界面 */
public static String getUserCUrl() {
return "modules/level/levelCharm.html";
}
/**
* 耳伴头条 http://beta.erbanyy.com/modules/headNews/index.html
* @return
*/
public static String getErbanTopMessageUrl() {
return JAVA_WEB_URL.concat("/modules/headNews/index.html");
}
/**
* 创建家族
* @return
*/
public static String getCreateFamilyUrl() {
return JAVA_WEB_URL.concat("/ms/modules/family/create.html");
}
/**
* 家族指南
* @return
*/
public static String getFamilyInstructionUrl() {
return JAVA_WEB_URL.concat("/ms/modules/family/handbook.html");
}
/**
* 家族币获取帮助
* @return
*/
public static String getFamilyCurrencyHelpUrl() {
return JAVA_WEB_URL.concat("/ms/modules/family/faq.html");
}
}

View File

@@ -0,0 +1,45 @@
package com.yizhuan.xchat_android_core.find;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.FindInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import java.util.List;
import io.reactivex.Single;
import retrofit2.http.GET;
public class FindModel extends BaseModel implements IFindModel {
private Api api;
private FindModel() {
api = RxNet.create(Api.class);
}
public static FindModel get() {
return FindModelHolder.instance;
}
private static class FindModelHolder {
private static FindModel instance = new FindModel();
}
@Override
public Single<ServiceResult<List<FindInfo>>> getFindInfo() {
return api.getFindInfo()
.compose(RxHelper.handleSchedulers());
}
interface Api {
/**
* 获取发现页广告位的列表
* @return
*/
@GET("advertise/getList")
Single<ServiceResult<List<FindInfo>>> getFindInfo();
}
}

View File

@@ -0,0 +1,18 @@
package com.yizhuan.xchat_android_core.find;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.FindInfo;
import java.util.List;
import io.reactivex.Single;
public interface IFindModel extends IModel {
/**
* 发现页广告位列表
* @return
*/
Single<ServiceResult<List<FindInfo>>> getFindInfo();
}

View File

@@ -0,0 +1,208 @@
package com.yizhuan.xchat_android_core.home;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.HomeInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import java.util.ArrayList;
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.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public class HomeModel extends BaseModel implements IHomeModel {
private volatile static IHomeModel instance;
private Api api;
private List<TabInfo> mTabInfoList;
public static IHomeModel get() {
if (instance == null){
synchronized (HomeModel.class){
if (instance == null){
instance = new HomeModel();
}
}
}
return instance;
}
private HomeModel(){
api = RxNet.create(Api.class);
}
/**
* 获取缓存的房间分类数据
* @return
*/
@Override
public List<TabInfo> getmTabInfoList() {
return mTabInfoList;
}
/**
* 获取首页Tab失败
* @return
*/
@Override
public Single<List<TabInfo>> getMainTabData() {
return api.getMainTabList()
.compose(RxHelper.handleSchedulers())
.compose(RxHelper.handleBeanData())
.doOnSuccess(new Consumer<List<TabInfo>>() {
@Override
public void accept(List<TabInfo> tabInfos) throws Exception {
mTabInfoList = tabInfos;
}
})
.doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Logger.e("获取首页Tab失败......");
}
});
}
/**
* 获取首页数据
* @param page
* @param pageSize
* @return
*/
@Override
public Single<HomeInfo> getHomeData(final int page, int pageSize) {
return api.getMainHotData(
String.valueOf(AuthModel.get().getCurrentUid()),
String.valueOf(page),
String.valueOf(pageSize)
)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
/**
* 反馈
* @param feedbackDesc
* @param contact
* @return
*/
@Override
public Single<String> commitFeedback(String feedbackDesc, String contact) {
return api.commitFeedback(
String.valueOf(AuthModel.get().getCurrentUid()),
feedbackDesc,
contact,
AuthModel.get().getTicket()
)
.flatMap(new Function<ServiceResult, SingleSource<String>>() {
@Override
public SingleSource<String> apply(ServiceResult serviceResult) throws Exception {
if (serviceResult.isSuccess()) {
return Single.just("反馈成功");
} else {
return Single.error(new Throwable(serviceResult.getMessage()));
}
}
})
.compose(RxHelper.handleSchedulers());
}
/**
* 根据分类 获取房间列表
* @param tagId
* @param pageNum
* @param pageSize
*/
@Override
public Single<List<HomeRoom>> getMainDataByTab(final int tagId, final int pageNum, int pageSize) {
return api.getMainDataByTab(
String.valueOf(tagId),
String.valueOf(pageNum),
String.valueOf(pageSize)
)
.flatMap(new Function<ServiceResult<List<HomeRoom>>, SingleSource<List<HomeRoom>>>() {
@Override
public SingleSource<List<HomeRoom>> apply(ServiceResult<List<HomeRoom>> listServiceResult) throws Exception {
if (listServiceResult.isSuccess()){
if (listServiceResult.getData() == null){
return Single.just(new ArrayList<HomeRoom>());
}
return Single.just(listServiceResult.getData());
}else {
return Single.error(new Throwable(listServiceResult.getMessage()));
}
}
})
.compose(RxHelper.handleSchedulers());
}
private interface Api{
/**
* 获取首页热门数据
*
* @param uid
* @param pageNum
* @param pageSize
* @return
*/
@GET("/home/v2/hotindex")
Single<ServiceResult<HomeInfo>> getMainHotData(@Query("uid") String uid,
@Query("pageNum") String pageNum,
@Query("pageSize") String pageSize);
/**
* 提交反馈
*
* @param uid
* @param feedbackDesc
* @param contact
* @param ticket
* @return
*/
@POST("/feedback")
Single<ServiceResult> commitFeedback(@Query("uid") String uid,
@Query("feedbackDesc") String feedbackDesc,
@Query("contact") String contact,
@Query("ticket") String ticket);
/**
* 获取首页tab数据
*
* @return
*/
@GET("/room/tag/top")
Single<ServiceResult<List<TabInfo>>> getMainTabList();
/**
* 获取
* @param tagId
* @param pageNum
* @param pageSize
* @return
*/
@POST("home/v2/tagindex")
Single<ServiceResult<List<HomeRoom>>> getMainDataByTab(@Query("tagId") String tagId,
@Query("pageNum") String pageNum,
@Query("pageSize") String pageSize);
}
}

View File

@@ -0,0 +1,48 @@
package com.yizhuan.xchat_android_core.home;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.home.bean.HomeInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeRoom;
import com.yizhuan.xchat_android_core.home.bean.TabInfo;
import java.util.List;
import io.reactivex.Single;
public interface IHomeModel extends IModel {
/**
* 获取缓存的房间分类数据
* @return
*/
List<TabInfo> getmTabInfoList();
/**
* 获取首页Tab失败
* @return
*/
Single<List<TabInfo>> getMainTabData();
/**
* 获取首页数据
* @param page
* @param pageSize
* @return
*/
Single<HomeInfo> getHomeData(int page, int pageSize);
/**
* 反馈
* @param feedbackDesc
* @param contact
* @return
*/
Single<String> commitFeedback( String feedbackDesc, String contact);
/**
* 根据分类 获取房间列表
* @param tagId
* @param pageNum
* @param pageSize
*/
Single<List<HomeRoom>> getMainDataByTab(int tagId, int pageNum, int pageSize);
}

View File

@@ -0,0 +1,75 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import lombok.Data;
/**
* Created by Administrator on 2017/8/7.
*/
@Data
public class BannerInfo implements Parcelable {
/*
bannerId1 //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 BannerInfo(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<BannerInfo> CREATOR = new Creator<BannerInfo>() {
@Override
public BannerInfo createFromParcel(Parcel in) {
return new BannerInfo(in);
}
@Override
public BannerInfo[] newArray(int size) {
return new BannerInfo[size];
}
};
}

View File

@@ -0,0 +1,61 @@
package com.yizhuan.xchat_android_core.home.bean;
/**
* Created by huangmeng1 on 2018/1/31.
*/
public class FindInfo {
/**
* advName : 测试啊
* advIcon : http://img.letusmix.com/FvbRJRJgufTpntjatyfL8xx1yBQ5?imageslim
* skipType : 3
* skipUri : www.baidu.com
*/
private String advName;
private String advIcon;
private int skipType;
private String skipUri;
@Override
public String toString() {
return "FindInfo{" +
"advName='" + advName + '\'' +
", advIcon='" + advIcon + '\'' +
", skipType=" + skipType +
", skipUri='" + skipUri + '\'' +
'}';
}
public String getAdvName() {
return advName;
}
public void setAdvName(String advName) {
this.advName = advName;
}
public String getAdvIcon() {
return advIcon;
}
public void setAdvIcon(String advIcon) {
this.advIcon = advIcon;
}
public int getSkipType() {
return skipType;
}
public void setSkipType(int skipType) {
this.skipType = skipType;
}
public String getSkipUri() {
return skipUri;
}
public void setSkipUri(String skipUri) {
this.skipUri = skipUri;
}
}

View File

@@ -0,0 +1,29 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.util.List;
/**
* <p> 首页数据 </p>
*
* @author Administrator
* @date 2017/11/22
*/
public class HomeInfo {
public List<BannerInfo> banners;
/** 排行数据 */
public RankingInfo rankHome;
/** 热门推荐 */
public List<HomeRoom> hotRooms;
/** 房间推荐 */
public List<HomeRoom> listRoom;
@Override
public String toString() {
return "HomeInfo{" +
"banners=" + banners +
", rankHome=" + rankHome +
", hotRooms=" + hotRooms +
", listRoom=" + listRoom +
'}';
}
}

View File

@@ -0,0 +1,82 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import java.util.List;
/**
* <p> 首页热门实体u </p>
*
* @author Administrator
* @date 2017/11/16
*/
public class HomeItem implements MultiItemEntity, Parcelable {
public static final int BANNER = 1;
public static final int RANKING = 2;
public static final int RECOMMEND = 3;
public static final int NORMAL = 4;
private int itemType;
//正常数据
public List<HomeRoom> recomList;
public List<HomeRoom> homeItemRoomList;
public List<BannerInfo> bannerInfoList;
public RankingInfo mRankingInfo;
public HomeItem(int itemType) {
this.itemType = itemType;
}
public HomeItem(int itemType, RankingInfo rankingInfo) {
this.itemType = itemType;
mRankingInfo = rankingInfo;
}
protected HomeItem(Parcel in) {
itemType = in.readInt();
recomList = in.createTypedArrayList(HomeRoom.CREATOR);
homeItemRoomList = in.createTypedArrayList(HomeRoom.CREATOR);
bannerInfoList = in.createTypedArrayList(BannerInfo.CREATOR);
mRankingInfo = in.readParcelable(RankingInfo.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(itemType);
dest.writeTypedList(recomList);
dest.writeTypedList(homeItemRoomList);
dest.writeTypedList(bannerInfoList);
dest.writeParcelable(mRankingInfo, flags);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<HomeItem> CREATOR = new Creator<HomeItem>() {
@Override
public HomeItem createFromParcel(Parcel in) {
return new HomeItem(in);
}
@Override
public HomeItem[] newArray(int size) {
return new HomeItem[size];
}
};
@Override
public int getItemType() {
return itemType;
}
}

View File

@@ -0,0 +1,165 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import com.yizhuan.xchat_android_core.level.UserLevelVo;
import com.yizhuan.xchat_android_core.noble.NobleInfo;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_library.utils.ListUtils;
import java.util.ArrayList;
/**
* @author zhouxiangfeng
* @date 2017/5/17
*/
public class HomeRoom 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;
/** 是否是靓号1靓号 */
public boolean hasPrettyErbanNo;
public NobleInfo nobleUsers;
public UserLevelVo userLevelVo;
public boolean newUser;
private ArrayList<BannerInfo> bannerInfos;
public HomeRoom() {
}
protected HomeRoom(Parcel in) {
super(in);
gender = in.readInt();
nick = in.readString();
defUser = in.readInt();
erbanNo = in.readLong();
badge = in.readString();
hasPrettyErbanNo = in.readByte() != 0;
bannerInfos = in.createTypedArrayList(BannerInfo.CREATOR);
newUser = in.readByte() != 0;
}
@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.writeByte((byte) (hasPrettyErbanNo ? 1 : 0));
dest.writeTypedList(bannerInfos);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<HomeRoom> CREATOR = new Creator<HomeRoom>() {
@Override
public HomeRoom createFromParcel(Parcel in) {
return new HomeRoom(in);
}
@Override
public HomeRoom[] newArray(int size) {
return new HomeRoom[size];
}
};
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public int getDefUser() {
return defUser;
}
public void setDefUser(int defUser) {
this.defUser = defUser;
}
public long getErbanNo() {
return erbanNo;
}
public void setErbanNo(long erbanNo) {
this.erbanNo = erbanNo;
}
public String getBadge() {
return badge;
}
public void setBadge(String badge) {
this.badge = badge;
}
public boolean isHasPrettyErbanNo() {
return hasPrettyErbanNo;
}
public void setHasPrettyErbanNo(boolean hasPrettyErbanNo) {
this.hasPrettyErbanNo = hasPrettyErbanNo;
}
public NobleInfo getNobleUsers() {
return nobleUsers;
}
public void setNobleUsers(NobleInfo nobleUsers) {
this.nobleUsers = nobleUsers;
}
public UserLevelVo getUserLevelVo() {
return userLevelVo;
}
public void setUserLevelVo(UserLevelVo userLevelVo) {
this.userLevelVo = userLevelVo;
}
public ArrayList<BannerInfo> getBannerInfos() {
return bannerInfos;
}
public void setBannerInfos(ArrayList<BannerInfo> bannerInfos) {
this.bannerInfos = bannerInfos;
}
@Override
public int getItemType() {
return ListUtils.isListEmpty(bannerInfos)?NORMAL:BANNER;
}
}

View File

@@ -0,0 +1,38 @@
package com.yizhuan.xchat_android_core.home.bean;
import java.io.Serializable;
import java.util.List;
/**
* Created by chenran on 2017/10/4.
*/
public class HomeRoomList implements Serializable{
private List<HomeRoom> recomRooms;
private List<HomeRoom> gameRooms;
private List<HomeRoom> chatRooms;
public List<HomeRoom> getRecomRooms() {
return recomRooms;
}
public void setRecomRooms(List<HomeRoom> recomRooms) {
this.recomRooms = recomRooms;
}
public List<HomeRoom> getGameRooms() {
return gameRooms;
}
public void setGameRooms(List<HomeRoom> gameRooms) {
this.gameRooms = gameRooms;
}
public List<HomeRoom> getChatRooms() {
return chatRooms;
}
public void setChatRooms(List<HomeRoom> chatRooms) {
this.chatRooms = chatRooms;
}
}

View File

@@ -0,0 +1,158 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.List;
/**
* <p> 首页排行信息 </p>
* Created by Administrator on 2017/11/8.
*/
public class RankingInfo implements Parcelable {
public List<Ranking> starList;
public List<Ranking> nobleList;
public List<Ranking> roomList;
@Override
public String toString() {
return "RankingInfo{" +
"starList=" + starList +
", nobleList=" + nobleList +
", roomList=" + roomList +
'}';
}
public static class Ranking implements Parcelable {
@Override
public String toString() {
return "Ranking{" +
"erbanNo=" + erbanNo +
", avatar='" + avatar + '\'' +
", nick='" + nick + '\'' +
", gender=" + gender +
", totalNum=" + totalNum +
'}';
}
/**
* erbanNo : 850379
* avatar : https://nos.netease.com/nim/NDI3OTA4NQ==/bmltYV83Nzg4MzQyNDJfMTUwNzIwMzM4NTc2N184YmJlZmQ4ZS01YzdiLTRmMWMtYmFhOC0xMWRlNzg3MzRlMzk=
* nick : 阿拉善
* gender : 1
* totalNum : 9988923
*/
private int erbanNo;
private String avatar;
private String nick;
private int gender;
private int totalNum;
protected Ranking(Parcel in) {
erbanNo = in.readInt();
avatar = in.readString();
nick = in.readString();
gender = in.readInt();
totalNum = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(erbanNo);
dest.writeString(avatar);
dest.writeString(nick);
dest.writeInt(gender);
dest.writeInt(totalNum);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Ranking> CREATOR = new Creator<Ranking>() {
@Override
public Ranking createFromParcel(Parcel in) {
return new Ranking(in);
}
@Override
public Ranking[] newArray(int size) {
return new Ranking[size];
}
};
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;
}
}
protected RankingInfo(Parcel in) {
starList = in.createTypedArrayList(Ranking.CREATOR);
nobleList = in.createTypedArrayList(Ranking.CREATOR);
roomList = in.createTypedArrayList(Ranking.CREATOR);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(starList);
dest.writeTypedList(nobleList);
dest.writeTypedList(roomList);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<RankingInfo> CREATOR = new Creator<RankingInfo>() {
@Override
public RankingInfo createFromParcel(Parcel in) {
return new RankingInfo(in);
}
@Override
public RankingInfo[] newArray(int size) {
return new RankingInfo[size];
}
};
}

View File

@@ -0,0 +1,118 @@
package com.yizhuan.xchat_android_core.home.bean;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
/**
* <p> tab 标签数据 </p>
*
* @author Administrator
* @date 2017/11/21
*/
@Data
public class TabInfo implements Parcelable {
/**
* id : 8
* name : 聊天
* pict : https://img.erbanyy.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 TabInfo(int id, String name) {
this.id = id;
this.name = name;
}
public TabInfo(int id, String name,String icon) {
this(id, name);
this.icon=icon;
}
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<TabInfo> CREATOR = new Creator<TabInfo>() {
@Override
public TabInfo createFromParcel(Parcel in) {
return new TabInfo(in);
}
@Override
public TabInfo[] newArray(int size) {
return new TabInfo[size];
}
};
public static List<TabInfo> getMsTabDefaultList() {
List<TabInfo> tabInfoList = new ArrayList<>();
tabInfoList.add(new TabInfo(1, "新秀","https://img.letusmix.com/xinxiu_tag_icon.png"));
tabInfoList.add(new TabInfo(2, "遇见","https://img.letusmix.com/xiehou_tag_icon.png"));
tabInfoList.add(new TabInfo(3, "交友","https://img.letusmix.com/jiaoyou_tag_icon.png"));
tabInfoList.add(new TabInfo(4, "娱乐","https://img.letusmix.com/yule_tag_icon.png"));
tabInfoList.add(new TabInfo(5, "音乐","https://img.letusmix.com/yinyue_tag_icon.png"));
tabInfoList.add(new TabInfo(6, "电台","https://img.letusmix.com/diantai_tag_icon.png"));
return tabInfoList;
}
public static List<TabInfo> getTabCheckVersion() {
List<TabInfo> tabInfoList = new ArrayList<>();
tabInfoList.add(new TabInfo(16, "邂逅","https://img.letusmix.com/xiehou_tag_icon.png"));
return tabInfoList;
}
@Override
public String toString() {
return "TabInfo{" +
"name='" + name + '\'' +
'}';
}
}

View File

@@ -0,0 +1,17 @@
package com.yizhuan.xchat_android_core.version;
import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.VersionInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import io.reactivex.Single;
import retrofit2.http.Query;
/**
* create by lvzebiao on 2018/9/14
*/
public interface IVersionModel extends IModel{
Single<VersionInfo> getVersion(@Query("version") String version);
}

View File

@@ -0,0 +1,48 @@
package com.yizhuan.xchat_android_core.version;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.VersionInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import io.reactivex.Single;
import retrofit2.http.GET;
import retrofit2.http.Query;
/**
* create by lvzebiao on 2018/9/14
* updated by MadisonRong on 2018/9/26
*/
public class VersionModel extends BaseModel implements IVersionModel{
private Api api;
private VersionModel() {
api = RxNet.create(Api.class);
}
public static VersionModel get() {
return VersionModelHolder.instance;
}
private static class VersionModelHolder {
private static VersionModel instance = new VersionModel();
}
@Override
public Single<VersionInfo> getVersion(String version) {
return api.getVersion(version)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
private interface Api {
/**
*版本
*/
@GET("version/get")
Single<ServiceResult<VersionInfo>> getVersion(@Query("version") String version);
}
}

View File

@@ -0,0 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yizhuan.xchat_android_core" >
</manifest>

View File

@@ -0,0 +1,104 @@
package com.yizhuan.xchat_android_core;
import com.yizhuan.xchat_android_constants.XChatConstants;
import java.io.File;
/**
* <p> 常量集合 </p>
* Created by Administrator on 2017/11/9.
*/
public class Constants {
public static final String ERBAN_DIR_NAME = XChatConstants.XCHAT_DIR_NAME;
public static final String nimAppKey = Env.isDebug() ?
XChatConstants.NIM_KEY_DEBUG : XChatConstants.NIM_KEY_RELEASE;
public static final String nimAppSecret = "da03b83af84a";
/**
* 百度统计
*/
public static final String BAIDU_APPKEY = XChatConstants.BAIDU_APP_KEY;
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_WX = "wx";
public static final String CHARGE_ALIPAY = "alipay";
public static final String CHARGE_UNION_PAY = "fastpay";
public static final String CHARGE_WX_MP = "wx_mp";
public static final String QUESTION_MARK = "?";
public static final int PAGE_TYPE_AV_ROOM_ACTIVITY = 100;
public static final int PAGE_TYPE_USER_INFO_ACTIVITY = 101;
public static final int PAGE_TYPE_MAIN_FRAGMENT = 102;
public static final String KEY_ROOM_IS_SHOW_ONLINE = "is_show_online";
public static final String KEY_ROOM_INFO = "key_room_info";
/**
* 房间相关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 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://img.erbanyy.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 = XChatConstants.DRAGON_BALL_ID;
public static final byte TYPE_JOINED = 1;
public static final byte TYPE_RECOMMEND = 2;
public static final byte TYPE_ALL = 0;
}

View File

@@ -0,0 +1,269 @@
package com.yizhuan.xchat_android_core;
import android.content.Context;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.yizhuan.xchat_android_core.auth.entity.AccountInfo;
import com.yizhuan.xchat_android_core.auth.entity.ThirdUserInfo;
import com.yizhuan.xchat_android_core.auth.entity.TicketInfo;
import com.yizhuan.xchat_android_core.gift.bean.GiftListInfo;
import com.yizhuan.xchat_android_core.initial.SplashComponent;
import com.yizhuan.xchat_android_core.initial.bean.InitInfo;
import com.yizhuan.xchat_android_core.noble.NobleConfig;
import com.yizhuan.xchat_android_core.noble.NobleRight;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.ObjectPref;
import com.yizhuan.xchat_android_library.utils.pref.SettingsPref;
import java.util.List;
import java.util.Map;
/**
* Created by zhouxiangfeng on 2017/5/6.
*/
public class DemoCache {
private static StatusBarNotificationConfig notificationConfig;
private static final String KEY_TICKET_INFO = "TicketInfo";
private static final String KEY_ACCOUNT_INFO = "AccountInfo";
private static final String KEY_THIRD_USER_INFO = "ThirdUserInfo";
private static final String KEY_LOGIN_INFO = "LoginInfo";
private static final String KEY_NOTI_TOGGLE = "NotiToggle";
private static final String KEY_NOTI_CONFIG = "StatusBarNotificationConfig";
private static final String KEY_GIFT_LIST_INFO = "GiftListInfo";
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_IS_FIRST_EXIT_ROOM = "IsFirstExitRoom";
private static final String KEY_IS_FIRST_MATCH_DIALOG = "IsFirstMatchDialog";
private static final String KEY_IS_FIRST_HIGH_PARTY_DIALOG = "IsFirstHighPartyDialog";
private static final String KEY_FILTRATE_TYPE = "FilTrateType";
public static final String KEY_IS_FIRST_HOME_HIGH_PARTY_DIALOG = "IsFirstHomeHighPartyDialog";
/**保存网页域名*/
private static final String KEY_INIT_DATA_WEBHOSTNAME = "InitDataWebHostName";
/**
* 从 cilent/init 里拿到的候选域名
*/
private static final String KEY_INIT_DATA_API_HOST = "InitDataApiHost";
public static Map<String, NobleRight> readNobleRights() {
String string = SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getString(KEY_INIT_DATA_NOBLE_RIGHTS, null);
if (TextUtils.isEmpty(string)) return null;
return new Gson().fromJson(string,
new TypeToken<Map<String, NobleRight>>() {
}.getType());
}
public static void saveNobleRights(String json) {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putString(KEY_INIT_DATA_NOBLE_RIGHTS, json);
}
public static void saveNobleConfigs(String json) {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putString(KEY_INIT_DATA_NOBLE_CONFIGS, json);
}
public static Map<String, NobleConfig> readNobleConfigs() {
String string = SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getString(KEY_INIT_DATA_NOBLE_CONFIGS, null);
if (TextUtils.isEmpty(string)) return null;
return new Gson().fromJson(string,
new TypeToken<Map<String, NobleConfig>>() {
}.getType());
}
public static void saveBoolean(String key, boolean value) {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(key, value);
}
public static Boolean readBoolean(String key, boolean defult) {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(key, defult);
}
public static void saveFilTrateType(int type) {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt(KEY_FILTRATE_TYPE, type);
}
public static int readFilTrateType() {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt(KEY_FILTRATE_TYPE, 3);
}
public static void saveFirstHighPartyDialog() {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(KEY_IS_FIRST_HIGH_PARTY_DIALOG, false);
}
public static boolean readFirstHighPartyDialog() {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(KEY_IS_FIRST_HIGH_PARTY_DIALOG, true);
}
public static void saveFirstMatchDialog() {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(KEY_IS_FIRST_MATCH_DIALOG, false);
}
public static boolean readFirstMatchDialog() {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(KEY_IS_FIRST_MATCH_DIALOG, true);
}
public static void saveFirstExitRoom() {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putBoolean(KEY_IS_FIRST_EXIT_ROOM, false);
}
public static boolean readFirstExitRoom() {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getBoolean(KEY_IS_FIRST_EXIT_ROOM, true);
}
public static String readNobleVersion() {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getString(KEY_INIT_DATA_NOBLE_VERSION);
}
public static void saveNobleVersion(String version) {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putString(KEY_INIT_DATA_NOBLE_VERSION, version);
}
public static String readSplashPicture() {
return SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).getString(KEY_INIT_DATA_SPLASH_PICTURE);
}
public static void saveSplashPicture(String path) {
SettingsPref.instance(BasicConfig.INSTANCE.getAppContext()).putString(KEY_INIT_DATA_SPLASH_PICTURE, path);
}
public static Long readInitInfoSavingTime() {
return (Long) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).get(KEY_INIT_DATA_SAVE_TIME, System.currentTimeMillis());
}
public static void saveInitInfoSavingTime(Long savingTime) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).put(KEY_INIT_DATA_SAVE_TIME, savingTime);
}
public static SplashComponent readSplashInfo() {
return (SplashComponent) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_INIT_DATA_SPLASH_DATA);
}
public static void saveSplashInfo(SplashComponent splashComponent) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_INIT_DATA_SPLASH_DATA, splashComponent);
}
public static InitInfo readInitInfo() {
return (InitInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_INIT_DATA);
}
public static void saveInitInfo(InitInfo initInfo) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_INIT_DATA, initInfo);
}
@Nullable
public static String readFaceList() {
return (String) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).get(KEY_FACE_LIST_INFO, null);
}
public static void saveFaceList(String encrypt) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).put(KEY_FACE_LIST_INFO, encrypt);
}
public static void saveGiftList(GiftListInfo giftListInfo) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_GIFT_LIST_INFO, giftListInfo);
}
public static GiftListInfo readGiftList() {
return (GiftListInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_GIFT_LIST_INFO);
}
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 saveThirdUserInfo(ThirdUserInfo accountInfo) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_THIRD_USER_INFO, accountInfo);
}
public static void saveLoginInfo(LoginInfo loginInfo) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_LOGIN_INFO, loginInfo);
}
public static AccountInfo readCurrentAccountInfo() {
return (AccountInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_ACCOUNT_INFO);
}
public static ThirdUserInfo readThirdUserInfo() {
return (ThirdUserInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_THIRD_USER_INFO);
}
public static TicketInfo readTicketInfo() {
return (TicketInfo) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_TICKET_INFO);
}
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 void setNotificationConfig(StatusBarNotificationConfig notificationConfig) {
DemoCache.notificationConfig = notificationConfig;
}
public static StatusBarNotificationConfig getNotificationConfig() {
return notificationConfig;
}
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);
}
private LoginInfo loginInfo() {
// 从本地读取上次登录成功时保存的用户登录信息
LoginInfo loginInfo = DemoCache.readLoginInfo(BasicConfig.INSTANCE.getAppContext());
// 如果已经存在用户登录信息返回LoginInfo否则返回null即可
if (null != loginInfo) {
if (!TextUtils.isEmpty(loginInfo.getAccount()) && !TextUtils.isEmpty(loginInfo.getToken())) {
return loginInfo;
} else {
return null;
}
} else {
return null;
}
}
public static String readWebHostName() {
return (String) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_INIT_DATA_WEBHOSTNAME);
}
public static void saveWebHostName(String webHostName) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_INIT_DATA_WEBHOSTNAME, webHostName);
}
public static List<String> readInitDataApiHost() {
return (List<String>) ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).readObject(KEY_INIT_DATA_API_HOST);
}
public static void saveInitDataApiHost(List<String> initDataApiHost) {
ObjectPref.instance(BasicConfig.INSTANCE.getAppContext()).saveObject(KEY_INIT_DATA_API_HOST, initDataApiHost);
}
}

View File

@@ -0,0 +1,145 @@
package com.yizhuan.xchat_android_core;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref;
/**
* 环境配置类
*/
public class Env {
public static final String KEY_ENVIRONMENT = "environment";
/**
* 当前环境
*/
private static EnvType mEnvType;
/**
* 真实环境
*/
private static boolean mRealDebug;
private Env() {
}
public enum EnvType {
/**
* 测试环境
*/
Debug(0),
/**
* 待发布环境
*/
Staging(1),
/**
* 线上环境
*/
Release(2);
public int code;
EnvType(int code) {
this.code = code;
}
public static EnvType create(int code) {
EnvType env = null;
if (code == EnvType.Debug.code) {
env = Debug;
} else if (code == EnvType.Staging.code) {
env = Staging;
} else if (code == EnvType.Release.code) {
env = Release;
}
return env;
}
}
/**
* 初始化环境参数
*
* @param defaultEnv 用于初始化最初环境
* @param isRealDebug 判断是否是真的debug模式不受环境影响
*/
public static void initEnv(String defaultEnv, boolean isRealDebug) {
if (defaultEnv == null || defaultEnv.isEmpty()) {
throw new RuntimeException("请输入正确的环境");
}
int environment = CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt(KEY_ENVIRONMENT);
EnvType envType;
if (environment == -1) {
envType = EnvType.valueOf(firstChar2Up(defaultEnv));
changeEnv(envType);
} else {
envType = EnvType.create(environment);
}
if (envType == null) {
throw new RuntimeException("请输入正确的环境");
}
mEnvType = envType;
mRealDebug = isRealDebug;
}
/**
* 第一个字符大写,用于把字符串转成类名
*
* @param s
* @return
*/
private static String firstChar2Up(String s) {
if (s == null || s.length() < 1) {
return null;
}
String newStr = s.substring(0, 1).toUpperCase() + s.substring(1);
return newStr;
}
/**
* 修改偏好设置里面的值
*
* @param env
*/
public static void changeEnv(EnvType env) {
CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt(KEY_ENVIRONMENT, env.code);
}
/**
* 受到环境印象(和实验室有关)
*
* @return
*/
public static boolean isDebug() {
return mEnvType == EnvType.Debug && mRealDebug;
}
/**
* 真实包环境(不受实验室环境影响)
*
* @return
*/
public static boolean isRealDebug() {
return mRealDebug;
}
/**
* 获取当前环境
* @return
*/
public static EnvType getCurrentEnv() {
if (mEnvType == null) {
throw new RuntimeException("请先初始化环境");
}
return mEnvType;
}
}

Some files were not shown because too many files have changed in this diff Show More