113 Commits

Author SHA1 Message Date
Max
515912b40a chore:调整jvm配置(解决butterknife导致打包失败问题) 2024-06-11 11:12:25 +08:00
Max
bf492ed403 同步PIKO修复bug(fix:修复相亲房送礼导致闭麦、结束导致闭麦问题(只是临时补救,具体看注释)
fix:移除BaseRoomFragment中更新麦克风状态的某些判断(isNoProhibitMic),不知道之前为何加这段判断,但这段判断风险较大,某些情况导致麦克风状态一直显示未关闭(去掉后经测试验收,未发现问题)
)
2024-05-15 10:25:03 +08:00
Max
5ea7426e7d fix:替换新用户打招呼弹窗的图片 2024-04-19 11:48:01 +08:00
Max
013ed0a39d fix:修复文件上传回调不在主线程导致的上传特权卡流程失败问题(文件上传统一回调主线程) 2024-04-09 15:00:10 +08:00
Max
1e80959db6 fix:修复发布动态上传失败后子线程回调更新UI导致崩溃问题 2024-04-03 11:19:10 +08:00
Max
06f31c3e9c fix:技能卡-声音秀增加权限申请逻辑 2024-03-28 19:13:24 +08:00
Max
1bb3bb1c3e feat:新增荣誉渠道 2024-03-28 12:00:55 +08:00
Max
3d478a5017 feat:增加debug环境是否混淆配置 2024-03-27 19:34:06 +08:00
Max
d329c97f03 feat:移除个人主页-公会icon 2024-03-27 19:27:42 +08:00
Max
d1fd822c42 feat:完成补填邀请码功能 2024-03-27 19:27:42 +08:00
Max
f86fea11b8 feat:完成补填邀请码UI部分 2024-03-27 19:27:41 +08:00
Max
e707da25a8 feat:适配网页实名认证的权限申请 2024-03-27 19:27:41 +08:00
Max
4af7fcf877 feat:文件上传支持自定义域名替换 2024-03-27 19:25:36 +08:00
Max
0695a74520 feat:新增渠道:fir 2024-03-18 18:44:30 +08:00
Max
fced114686 feat:移除AVRoomActivity中的全服礼物飘屏逻辑到BaseActivity 2024-03-18 14:44:44 +08:00
Max
3181a115d8 feat:同步peko完成礼物飘窗UI优化(同步peko:去掉普通礼物飘窗) 2024-03-18 14:44:43 +08:00
Max
4c48bef21b feat:移除七牛云,改用腾讯COS 2024-03-18 14:43:56 +08:00
Max
60d274c79a feat:客服中心改为私聊 2024-03-14 14:31:12 +08:00
Max
a48440209a fix:修复首页默认选中Tab-bug 2024-03-13 17:39:25 +08:00
Max
65bcf7a7ca fix:修复【一键登录不可用时按钮改为手机号登录功能】部分场景未失效bug 2024-02-04 17:11:48 +08:00
Max
b307db446d fix:修复UI反馈问题(礼物面板) 2024-02-04 11:52:02 +08:00
Max
bed3184df9 fix:修复赠送背包TAB的解锁礼物后,未更新顶部提示面板数量问题 2024-02-02 18:04:12 +08:00
Max
2c4fb0e056 fix:修复公屏-装扮礼物icon展示大小问题 2024-02-02 10:56:23 +08:00
Max
784aeebdf4 feat:修改资料页UI调整:增加箭头icon 2024-02-01 15:50:34 +08:00
Max
043e79681d fix:修复背包礼物显示锁问题 2024-02-01 15:22:11 +08:00
Max
b6972ee445 fix:修复装扮公屏展示问题 2024-02-01 14:58:16 +08:00
Max
4fd1bd73ea fix:装扮礼物点击banner增加空值判断 2024-02-01 14:33:53 +08:00
Max
afab35a691 fix:修复我的头饰状态判断错误问题 2024-02-01 14:33:30 +08:00
Max
d508912a9c feat:设置SplashScreen默认背景色(部分手机默认黑色) 2024-02-01 09:39:19 +08:00
Max
ec2e46b0a4 fix:调整礼物墙等级背景展示错误问题 2024-01-31 17:23:54 +08:00
Max
e2cf045ab7 fix:修复已解锁后文案展示问题 2024-01-31 16:16:49 +08:00
Max
c2cdd5d6f1 feat:去掉年度盛典icon 2024-01-31 11:38:59 +08:00
Max
5bacadf9df Merge branch 'feature/gift' into develop 2024-01-30 17:06:22 +08:00
Max
eb81154c1c feat:替换新人标签icon 2024-01-30 17:03:22 +08:00
Max
ae19a0c653 feat:修改注册默认头像地址 2024-01-30 17:01:58 +08:00
Max
44787e5041 feat:完成礼物墙优化(用户主页展示所有礼物) 2024-01-30 16:12:46 +08:00
Max
a8f12371a7 feat:调整装扮礼物banner字段 2024-01-30 11:03:53 +08:00
Max
950ce098dc feat:解锁礼物&装扮礼物,增加气泡展示逻辑 2024-01-29 19:32:55 +08:00
Max
720cf52fd0 feat:调整礼物面板-tab-new图标 2024-01-29 18:59:19 +08:00
Max
5d4aa38b93 feat:完成我的装扮下各个Tab的过期时间展示规则调整; 2024-01-29 18:41:10 +08:00
Max
a2faf14901 fix:优化解锁提示面板体验(模糊背景偶尔加载慢,改为动态添加View,有所改善) 2024-01-29 17:33:24 +08:00
Max
665fecb427 feat:完成解锁礼物与装扮礼物公屏展示逻辑 2024-01-29 16:51:19 +08:00
Max
6fb428b536 feat:补充解锁礼物点击联动逻辑 2024-01-29 15:32:44 +08:00
Max
a01a362506 feat:完成装扮礼物banner展示逻辑 2024-01-29 14:47:59 +08:00
Max
44ad80c708 feat:完成送礼后的解锁礼物本地状态更新逻辑 2024-01-29 11:51:46 +08:00
Max
f212af49f1 feat:完成趣味礼物展示 2024-01-26 18:50:22 +08:00
Max
3bcac093c7 feat:完成装扮商城、我的装扮 部分UI调整 2024-01-26 15:16:09 +08:00
Max
dd87492ffb feat:完善礼物面板底部UI调整
feat:初步完成解锁信息条目UI部分
2024-01-26 11:44:48 +08:00
Max
de79e73c9a feat:完成礼物面板-条目部分的UI调整 2024-01-25 19:46:34 +08:00
Max
fac1497de3 feat:修改开通房间时的实名认证文案 2024-01-25 15:36:56 +08:00
Max
a8335e915c feat:优化用户修改昵称、简介体验(在当前页完成网络请求) 2024-01-25 15:08:45 +08:00
Max
53820a23c7 feat:优化一键登录获取失败后展示手机号登录 2024-01-25 14:49:25 +08:00
Max
8016cc860a fix:修复后台无法show弹窗问题 2024-01-25 14:21:48 +08:00
Max
95e3e0768c fix:修复小米推送集成配置问题 2024-01-24 18:15:27 +08:00
Max
6f73f3f4fb Merge branch 'fix/agroa' into develop 2024-01-24 18:00:07 +08:00
Max
b6524ad94f feat:删除调试日志 2024-01-24 17:59:57 +08:00
Max
f5fc2f9d79 fix:修复离开模式下管理可以点击主麦操作问题(改为点击toast提示) 2024-01-24 17:56:52 +08:00
Max
be28ed2509 fix:修复Pk结束后底部麦克风图标状态无法更新问题 2024-01-24 16:46:24 +08:00
Max
5be60fe7b2 fix:修复Pk面包拖拽问题(适配父容器内边距) 2024-01-24 16:07:59 +08:00
Max
522c4a9f6f fix:修复声网上麦后自动开麦问题 2024-01-23 15:22:46 +08:00
Max
e478c9c202 feat:针对华为市场审核 补充权限申请提示 2024-01-15 11:58:22 +08:00
Max
3ac10340d6 feat:调整多渠道方式(换gradle默认方式) 2024-01-09 15:33:37 +08:00
Max
a10471d1c2 feat:完成华为应用市场权限申请适配(增加提示) 2024-01-09 14:46:05 +08:00
Max
d47536cc13 fix:修复房间榜单数据展示问题(榜二、榜三,数值未渲染) 2024-01-05 10:09:28 +08:00
Max
641c15a91e fix:删减部分代码 2024-01-04 16:02:41 +08:00
Max
f29dc93faa feat:调整客服中心权限拒绝提示判断;增加私聊图片权限检测与提示; 2024-01-04 15:57:29 +08:00
Max
42afa779db feat:调整首页部分文案提示 2024-01-04 14:01:32 +08:00
Max
d300ef179d feat:完善部分场景的权限拒绝提示 2024-01-04 12:14:34 +08:00
Max
ecd6b8da81 feat:调整应用启动图标(年度盛典) 2024-01-04 10:20:32 +08:00
Max
dec6e5e0c1 feat:完成年度庆典:应用logo、首页Tab 图标替换 2024-01-03 14:21:17 +08:00
Max
18b680db70 feat:删除首页-交友列表 无用的样式属性 2023-12-28 20:22:28 +08:00
Max
0fd330848c feat:大富翁游戏隐藏背景 2023-12-28 19:32:23 +08:00
Max
d0d2418dbf fix:修复交友页UI问题 2023-12-28 18:46:20 +08:00
Max
a129fb405e fix:修复首页-交友-数据未正常请求问题 2023-12-28 16:44:16 +08:00
Max
91b006422c feat:首页广场的下拉刷新组件换新样式 2023-12-28 15:49:05 +08:00
Max
d83dbe2337 fix:修复游戏房打开消息弹窗回来导致的闪烁问题:因为生命周期变化调用游戏暂停恢复导致,目前把游戏暂停恢复已到onStart,onStop中 2023-12-28 15:34:52 +08:00
Max
ce27034ca6 feat:恢复房间顶部排行榜入口:游戏房显示一个,其他房间三个 2023-12-28 14:36:20 +08:00
Max
340403fe0d fix:修复TRTC 上麦闭麦状态下还有声音光波问题,参考peko同步调整部分配置 2023-12-28 14:21:41 +08:00
Max
ac8dc50955 fix:调整埋点问题:eventLable为空被拦截问题 2023-12-28 11:06:56 +08:00
Max
32ef74df3a fix:调整游戏房间列表样式问题 2023-12-28 10:55:21 +08:00
Max
e4cb690b68 fix:调整UI问题 2023-12-27 21:15:00 +08:00
Max
96de9e153c feat:优化房间布局(动态状态栏高度) 2023-12-27 20:01:31 +08:00
Max
35032c1f8e feat:调整首页派对-礼物消息-房间上锁的处理 2023-12-27 17:39:01 +08:00
Max
3e1ab090aa feat:完成数据埋点需求 2023-12-27 17:14:07 +08:00
Max
95aeda920a Merge branch 'develop' into test/2.0.0 2023-12-27 15:07:12 +08:00
Max
60d6bbeae8 Merge branch 'feature/game' into test/2.0.0 2023-12-27 15:07:07 +08:00
Max
0b339136cc feat:去掉本地一键匹配的忽略私聊限制:由后端处理 2023-12-27 15:04:40 +08:00
Max
6e7743960c fix:修复首页房间条目点击进房参数问题 2023-12-27 14:57:54 +08:00
Max
7709020221 feat:完成用户资料页优化需求 2023-12-27 14:47:59 +08:00
Max
b9d59e9477 feat:拆分首页ViewModel 2023-12-27 11:22:00 +08:00
Max
321fa1b9ea feat:完成一键匹配入口进私聊:忽略限制功能 2023-12-26 23:22:04 +08:00
Max
ff746b5a11 feat:调整首页下拉刷新UI效果 2023-12-26 22:09:06 +08:00
Max
802383b9e8 feat:初步完成首页下拉动画 2023-12-26 20:20:31 +08:00
Max
b41a2e0376 feat:完成首页-交友UI与数据联调
feat:完成更多游戏房间页面功能
2023-12-26 19:23:15 +08:00
Max
732cea412c feat:调整首页部分类命名与目录结构、删除部分无用类 2023-12-26 10:56:05 +08:00
Max
52db404fc0 Merge branch 'fix/speaker' into develop 2023-12-26 09:53:49 +08:00
Max
2d954d21ef feat:调整TRTC音质级别 2023-12-25 20:56:10 +08:00
Max
b7eb1e66fa fix:修复声网上麦后导致静音失效问题 2023-12-25 20:20:09 +08:00
Max
6491efe708 feat:完善首页交友页UI与数据
feat:删除无用代码(旧首页)
2023-12-25 18:34:22 +08:00
Max
37ed8facf3 feat:完善首页-交友UI 2023-12-22 20:21:50 +08:00
Max
6becbb6226 fix:调整派对-房间-条目边框加载策略 2023-12-22 19:00:06 +08:00
Max
ea19645fe8 feat:删除无用代码 2023-12-22 18:08:58 +08:00
Max
d48844dc14 temp:增加打印ABI信息 2023-12-22 17:09:00 +08:00
Max
a939c29e3e feat:升级TRTC版本(abi开放x86) 2023-12-22 16:24:20 +08:00
Max
e55b4d7348 fix:增加异常捕获打印 2023-12-22 14:56:59 +08:00
Max
583d5a139b feat:调整派对-房间条目样式尺寸
feat:完善交友UI
2023-12-22 12:11:45 +08:00
Max
c7dd6ec61c feat:调整首页相关类命名 2023-12-22 10:08:38 +08:00
Max
a58165213d feat:增加首页动态切换Tab 2023-12-22 09:50:24 +08:00
Max
f21e117e7f feat:首页资源位增加本地缓存 2023-12-22 09:32:22 +08:00
Max
f9bd5b7a9f feat:初步完善【首页-派对】数据与UI对接 2023-12-21 20:24:05 +08:00
Max
b9251a89a5 feat:完成【首页-派对】部分UI 2023-12-20 20:00:39 +08:00
Max
e81d75a8b8 feat:升级最新SUD游戏SDK版本1.3.6.1181,完善房间入口等功能 2023-12-19 18:27:42 +08:00
Max
c691e5f570 feat:初步搭建新版首页页面(未实现功能) 2023-12-19 10:42:53 +08:00
385 changed files with 9707 additions and 8796 deletions

View File

@@ -3,12 +3,9 @@ apply plugin: 'com.android.application'
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.huawei.agconnect'
apply plugin: 'com.tencent.vasdolly'
apply from: '../mob.gradle'
apply plugin: 'android-junk-code'
def onlyArm64 = Boolean.parseBoolean(only_arm64)
android {
compileSdkVersion COMPILE_SDK_VERSION.toInteger()
@@ -21,20 +18,20 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
// ndk {
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86'
// }
flavorDimensions 'default'
}
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a'
universalApk true
}
}
// splits {
// abi {
// enable true
// reset()
// include 'armeabi-v7a', 'arm64-v8a', 'x86'
// universalApk true
// }
// }
//在apk文件后边生成版本号信息
android.applicationVariants.configureEach { variant ->
@@ -50,7 +47,7 @@ android {
if (abi == null) {
abi = "universal"
}
outputFileName = "yinmeng_${buildType.name}_v${defaultConfig.versionName}_${abi}_${date}.apk"
outputFileName = "yinmeng_${variant.flavorName}_${buildType.name}_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${abi}_${date}.apk"
}
}
@@ -159,12 +156,13 @@ android {
}
debug {
println("minifyEnabled = " + minify_enabled)
buildConfigField "String", "BASE_URL", "\"http://beta.api.nnbc123.cn/\""
buildConfigField "String", "WEB_URL", "\"http://beta.api.nnbc123.cn\""
buildConfigField "String", "BASE_URL_DEBUG", "BASE_URL"
buildConfigField "String", "BASE_URL_STAGING", "\"https://api.nnbc123.cn/\""
buildConfigField "String", "BASE_URL_RELEASE", "\"https://api.nnbc123.cn/\""
minifyEnabled false
minifyEnabled minify_enabled.toBoolean() // 是否混淆
shrinkResources false
signingConfig signingConfigs.v2
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
@@ -182,6 +180,64 @@ android {
buildToolsVersion = '30.0.3'
productFlavors {
official {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
fir {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
mlq {
ndk {
abiFilters 'x86'
}
}
yingyongbao {
ndk {
abiFilters 'armeabi-v7a'
}
}
vivo {
ndk {
abiFilters 'arm64-v8a'
}
}
oppo {
ndk {
abiFilters 'arm64-v8a'
}
}
xiaomi {
ndk {
abiFilters 'arm64-v8a'
}
}
huawei {
ndk {
abiFilters 'arm64-v8a'
}
}
rongyao {
ndk {
abiFilters 'arm64-v8a'
}
}
kuaishou_01 {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [
// 渠道
CHANNEL_VALUE : name,
]
}
}
@@ -258,7 +314,7 @@ dependencies {
//oppo推送需要
implementation 'commons-codec:commons-codec:1.6'
api 'com.tencent.vasdolly:helper:3.0.3'
// api 'com.tencent.vasdolly:helper:3.0.3'
implementation "io.github.tencent:vap:2.0.24"
implementation 'com.github.mmin18:realtimeblurview:1.2.1'
@@ -276,36 +332,20 @@ repositories {
}
channel {
//多渠道包的输出目录默认为new File(project.buildDir,"channel")
outputDir = new File(project.buildDir, "channelapk")
//多渠道包的命名规则,默认为:${appName}-${versionName}-${versionCode}-${flavorName}-${buildType}-${buildTime}
def only64 = onlyArm64 ? "-only64" : ""
apkNameFormat = 'yinmeng-${buildType}only64-${flavorName}-v${versionName}-${buildTime}'.replace("only64", only64)
//快速模式生成渠道包时不进行校验速度可以提升10倍以上默认为false
fastMode = false
//buildTime的时间格式默认格式yyyyMMdd-HHmmss
buildTimeDateFormat = 'MMddHHmm'
//低内存模式仅针对V2签名默认为false只把签名块、中央目录和EOCD读取到内存不把最大头的内容块读取到内存在手机上合成APK时可以使用该模式
lowMemory = false
}
android.applicationVariants.all { variant ->
print("variant.name=" + variant.name)
switch (variant.name) {//变体名称如果没有设置productFlavors就是buildType名称如果有设置productFlavors就是flavor+buildType例如freeRelease、proRelease
case "release":
androidJunkCode.configMap.put(variant.name, {
packageBase = "com.nnbc123.plugin.ui" //生成java类根包名
packageCount = 30 //生成包数量
activityCountPerPackage = 30 //每个包下生成Activity类数量
excludeActivityJavaFile = false
//是否排除生成Activity的Java文件,默认false(layout和写入AndroidManifest.xml还会执行),主要用于处理类似神策全埋点编译过慢问题
otherCountPerPackage = 50 //每个下生成其它类的数量
methodCountPerClass = 20 //每个类下生成方法数量
resPrefix = "mango_" //生成的layout、drawable、string等资源名前缀
drawableCount = 300 //生成drawable资源数量
stringCount = 300 //生成string数量
})
break
if (variant.name.contains("release") || variant.name.contains("Release")) {
androidJunkCode.configMap.put(variant.name, {
packageBase = "com.nnbc123.plugin.ui" //生成java类根包名
packageCount = 30 //生成包数量
activityCountPerPackage = 30 //每个包下生成Activity类数量
excludeActivityJavaFile = false
//是否排除生成ActivityJava文件,默认false(layout和写入AndroidManifest.xml还会执行),主要用于处理类似神策全埋点编译过慢问题
otherCountPerPackage = 50 //每个包下生成其它类的数量
methodCountPerClass = 20 //每个下生成方法数量
resPrefix = "mango_" //生成的layout、drawable、string等资源名前缀
drawableCount = 300 //生成drawable资源数量
stringCount = 300 //生成string数量
})
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -86,6 +86,10 @@
android:theme="@style/MyMaterialTheme"
android:usesCleartextTraffic="true"
tools:replace="android:name,android:allowBackup">
<!-- 多渠道 -->
<meta-data
android:name="CHANNEL"
android:value="${CHANNEL_VALUE}" />
<!-- 刘海屏适配 begin -->
<!-- 小米 -->
<meta-data
@@ -212,14 +216,14 @@
<service
android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
android:enabled="true"
android:exported="false" />
android:exported="true" />
<service
android:name="com.xiaomi.mipush.sdk.MessageHandleService"
android:enabled="true" /> <!--此service必须在2.2.5版本以后包括2.2.5版本)加入 -->
<receiver
android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
android:exported="true"
tools:node="remove">>
tools:node="remove">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
@@ -1177,7 +1181,7 @@
android:name="com.nnbc123.app.shipantics.RadishRankingActivity"
android:theme="@style/room_message_activity" />
<activity
android:name="com.nnbc123.app.home.activity.MoreRoomActivity"
android:name="com.nnbc123.app.game_room.GameRoomActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.nnbc123.app.avroom.wishlist.WishListCreateActivity"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -2,12 +2,10 @@ package com.nnbc123.app;
import static com.nnbc123.core.channel_page.model.ChannelPageModel.KEY_FLAG_VALID_CHANNEL_PAGE;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
@@ -16,7 +14,6 @@ import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -43,7 +40,6 @@ import com.nnbc123.app.application.ActivityStackManager;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
import com.nnbc123.app.avroom.newuserchargegift.NewUserChargeGiftDialog;
import com.nnbc123.app.base.BaseMvpActivity;
import com.nnbc123.app.common.widget.CircleImageView;
import com.nnbc123.app.common.widget.DragLayout;
import com.nnbc123.app.community.dynamic.view.DynamicDetailActivity;
import com.nnbc123.app.community.publish.view.PublishActivity;
@@ -52,10 +48,9 @@ import com.nnbc123.app.family.view.activity.FamilyHomeActivity;
import com.nnbc123.app.home.HomeViewModel;
import com.nnbc123.app.home.dialog.NewUserHelloDialog;
import com.nnbc123.app.home.dialog.ProtocolUpdateDialog;
import com.nnbc123.app.home.fragment.HomeFragment;
import com.nnbc123.app.home.fragment.home.HomeFragment;
import com.nnbc123.app.home.fragment.MeFragment;
import com.nnbc123.app.home.fragment.MsgFragment;
import com.nnbc123.app.home.fragment.PartyFragment;
import com.nnbc123.app.home.fragment.PmModeFragment;
import com.nnbc123.app.home.presenter.MainPresenter;
import com.nnbc123.app.home.view.IMainView;
@@ -77,7 +72,6 @@ import com.nnbc123.app.ui.patriarch.help.PmDialogShowMrg;
import com.nnbc123.app.ui.utils.ImageLoadUtils;
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2;
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
import com.nnbc123.app.ui.widget.LivingIconView;
import com.nnbc123.app.ui.widget.MainTabLayout;
import com.nnbc123.app.utils.CleanLeakUtils;
import com.nnbc123.app.utils.PushMessageHandler;
@@ -176,7 +170,6 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
private Runnable touchRunnable;
{
fragmentArray.put(MainTabType.TAB_TYPE_PARTY, new PartyFragment());
fragmentArray.put(MainTabType.TAB_TYPE_HOME, new HomeFragment());
fragmentArray.put(MainTabType.TAB_TYPE_MSG, new MsgFragment());
fragmentArray.put(MainTabType.TAB_TYPE_SQUARE, new SquareFragment());
@@ -508,7 +501,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
getMvpPresenter().exitRoom();
QuickPassLoginAct.start(MainActivity.this);
PmDialogShowMrg.get().onLogout();
CustomerServerHelper.logout();
// CustomerServerHelper.logout();
}
public void onNeedLogin() {
@@ -664,7 +657,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
onTabClick(mCurrentTabType);
CustomerServerHelper.onLoginInfoUpdate(UserUtils.getUserInfo());
// CustomerServerHelper.onLoginInfoUpdate(UserUtils.getUserInfo());
}

View File

@@ -28,6 +28,7 @@ import androidx.multidex.MultiDex;
import com.bumptech.glide.request.target.ViewTarget;
import com.bytedance.hume.readapk.HumeSDK;
import com.chuhai.utils.MetaDataUtils;
import com.coorchice.library.utils.LogUtils;
import com.facebook.stetho.Stetho;
import com.heytap.msp.push.HeytapPushManager;
@@ -61,7 +62,6 @@ import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.beta.Beta;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.vasdolly.helper.ChannelReaderUtil;
import com.umeng.analytics.MobclickAgent;
import com.umeng.commonsdk.UMConfigure;
import com.nnbc123.app.BuildConfig;
@@ -213,12 +213,12 @@ public class XChatApplication extends BaseApp {
// 初始化 sp
long startTime = System.currentTimeMillis();
String channel = "";
channel = ChannelReaderUtil.getChannel(instance);
String channel;
channel = MetaDataUtils.INSTANCE.getStringData(Constants.CHANNEL_KEY, application);
if (TextUtils.isEmpty(channel)) {
channel = "official";
}
Log.d("XChatApplication", "channel:" + channel);
BasicConfig.INSTANCE.setOriginalChannel(channel);
//头条分包渠道
@@ -228,6 +228,7 @@ public class XChatApplication extends BaseApp {
channel = byteDanceChannel;
}
}
Log.d("XChatApplication", "channel2:" + channel);
BasicConfig.INSTANCE.setChannel(channel);
initEnv();
@@ -306,7 +307,7 @@ public class XChatApplication extends BaseApp {
// 集成测试
UMConfigure.setLogEnabled(BuildConfig.DEBUG);
} else {
CustomerServerHelper.init(instance, null);
// CustomerServerHelper.init(instance, null);
}
LogUtils.d("init time = " + (System.currentTimeMillis() - startTime) + "ms");

View File

@@ -93,7 +93,7 @@ public class AudioPlayerHelper {
try {
player.setDataSource(filePath);
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}
preparing = true;
@@ -122,6 +122,9 @@ public class AudioPlayerHelper {
}
public void endPlay() {
if (listener != null) {
listener.onCompletion();
}
handler.removeMessages(WHAT_STATUS.COUNT_PLAY);
if (player != null) {
if (preparing) {

View File

@@ -2,15 +2,12 @@ package com.nnbc123.app.avroom.activity;
import static android.view.View.VISIBLE;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ALL_SERVICE_GIFT;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_LUCKY_GIFT;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ROOM_PK;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_ROOM_PK_NOTIFY;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
@@ -65,10 +62,6 @@ import com.nnbc123.app.ui.user.UserInfoActivity;
import com.nnbc123.app.ui.utils.ImageLoadUtils;
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
import com.nnbc123.app.ui.widget.NobleOpenNoticeView;
import com.nnbc123.app.ui.widget.dialog.AllServiceGiftDialog;
import com.nnbc123.app.ui.widget.dialog.AllServiceGiftLevelOneDialog;
import com.nnbc123.app.ui.widget.dialog.AllServiceGiftLevelThreeDialog;
import com.nnbc123.app.ui.widget.dialog.AllServiceGiftLevelTwoDialog;
import com.nnbc123.app.ui.widget.dialog.MonsterDialog;
import com.nnbc123.app.ui.widget.marqueeview.Utils;
import com.nnbc123.app.utils.UserUtils;
@@ -92,7 +85,6 @@ import com.nnbc123.core.monsterhunting.bean.MonsterHuntingResult;
import com.nnbc123.core.monsterhunting.bean.MonsterInfo;
import com.nnbc123.core.monsterhunting.bean.MonsterProtocol;
import com.nnbc123.core.monsterhunting.manager.MonsterDataManager;
import com.nnbc123.core.noble.AllServiceGiftProtocol;
import com.nnbc123.core.noble.NobleInfo;
import com.nnbc123.core.noble.NobleResourceType;
import com.nnbc123.core.noble.NobleUtil;
@@ -119,7 +111,6 @@ import com.nnbc123.core.utils.LogUtils;
import com.nnbc123.core.utils.StringUtils;
import com.nnbc123.library.base.factory.CreatePresenter;
import com.nnbc123.library.rxbus.RxBus;
import com.nnbc123.library.utils.JavaUtil;
import com.nnbc123.library.utils.SingleToastUtil;
import com.nnbc123.library.utils.UIUtils;
import com.opensource.svgaplayer.SVGADrawable;
@@ -137,7 +128,6 @@ import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -197,8 +187,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
/*********************************显示全服礼物***************************************/
private GiftBroadcastObserver giftObserver;
private Dialog giftDialog;
private LinkedList<AllServiceGiftProtocol.DataBean> giftList;
private boolean isResume = true;
@Nullable
private SingleRoomTipDialog singleRoomTipDialog;
@@ -501,9 +489,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
super.onResume();
AvRoomDataManager.get().roomNoDestory = true;
registerGiftBroadcastMessage(true);
if (giftList != null) {
giftList.clear();
}
isResume = true;
}
@@ -904,12 +889,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
monsterDialog.dismiss();
monsterDialog = null;
}
if (giftDialog != null && giftDialog.isShowing()) {
giftDialog.setOnDismissListener(null);
giftDialog.dismiss();
giftDialog = null;
}
if (limitEnterRoomHelper != null) {
limitEnterRoomHelper.release();
}
@@ -1190,30 +1169,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
if (baseProtocol == null) return;
switch (baseProtocol.getFirst()) {
case CUSTOM_MSG_HEADER_TYPE_GIFT:
if (!isValid()) return;
if (giftList == null) {
giftList = new LinkedList<>();
}
int second2 = baseProtocol.getSecond();
AllServiceGiftProtocol.DataBean data = JSON.parseObject(String.valueOf(baseProtocol.getData()), AllServiceGiftProtocol.DataBean.class);
if (data == null || data.getGiftUrl() == null || data.isCeremonyGift())
return;
giftList.add(data);
if (second2 == CUSTOM_MSG_ALL_SERVICE_GIFT) {
if (giftDialog != null && giftDialog.isShowing()) {
// 如果当前以及有礼物弹窗在展示,则需要等到他 dismiss 后再显示下一个
AllServiceGiftProtocol.DataBean dataBean = giftList.peekFirst();
if (dataBean != null) {
return;
} else {
giftDialog.dismiss();
}
} else {
showGiftDialog();
}
}
break;
case CUSTOM_MSG_LUCKY_GIFT:
if (baseProtocol.getSecond() == CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY) {
RoomReceivedLuckyGiftAttachment attachment = new RoomReceivedLuckyGiftAttachment(CUSTOM_MSG_LUCKY_GIFT_SERVER_NOTIFY);
@@ -1236,39 +1191,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
}
}
private void showGiftDialog() {
if (giftList.size() == 0) return;
giftDialog = generateAllServiceGiftDialog(this, giftList.peekFirst());
giftDialog.setOnDismissListener(dialog -> {
giftList.pollFirst();
AllServiceGiftProtocol.DataBean dataBean = giftList.peekFirst();
if (dataBean != null) {
if (isValid()) {
showGiftDialog();
} else {
giftList.clear();
}
}
});
giftDialog.show();
}
private AllServiceGiftDialog generateAllServiceGiftDialog(Context context, AllServiceGiftProtocol.DataBean dataBean) {
switch (JavaUtil.str2int(dataBean.getLevelNum())) {
default:
case AllServiceGiftDialog.ALL_SERVICE_GIFT_LEVEL_1:
return new AllServiceGiftLevelOneDialog(context, dataBean);
case AllServiceGiftDialog.ALL_SERVICE_GIFT_LEVEL_2:
return new AllServiceGiftLevelTwoDialog(context, dataBean);
case AllServiceGiftDialog.ALL_SERVICE_GIFT_LEVEL_3:
return new AllServiceGiftLevelThreeDialog(context, dataBean);
}
}
@Override
protected void onPause() {
super.onPause();

View File

@@ -3,13 +3,16 @@ package com.nnbc123.app.avroom.fragment
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils
import android.text.style.ForegroundColorSpan
import android.view.*
@@ -115,6 +118,7 @@ import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder
import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage
import com.nnbc123.app.avroom.hour_rank.RoomHourRankWidget
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.orhanobut.logger.Logger
import com.tbruyelle.rxpermissions2.RxPermissions
import com.trello.rxlifecycle3.android.FragmentEvent
@@ -673,10 +677,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
} else {
val roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByAccount(myUid.toString())
if (roomQueueInfo?.mChatRoomMember?.isNoProhibitMic == true && roomQueueInfo.mRoomMicInfo?.isMicMute == false) {
bottomView.setMicBtnEnable(true)
bottomView.setMicBtnOpen(true)
} else if (roomQueueInfo?.mChatRoomMember != null
if (roomQueueInfo?.mChatRoomMember != null
&& myUid.toString() == roomQueueInfo.mChatRoomMember.account
&& roomQueueInfo.mRoomMicInfo?.isMicMute == true
) {
@@ -996,7 +997,15 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
(roomInfo.isLeaveMode || AvRoomDataManager.get().isSingleRoom)
&& position == -1
) {
showUserCardDialog(roomInfo.uid.toString())
val currentUid = AuthModel.get().currentUid.toString()
if (roomInfo.isLeaveMode && !AvRoomDataManager.get().isSingleRoom && (AvRoomDataManager.get()
.isRoomOwner(currentUid) || AvRoomDataManager.get().isRoomAdmin(currentUid)
|| SuperAdminUtil.isSuperAdmin())
) {
SingleToastUtil.showToast("请先关闭离开模式")
} else {
showUserCardDialog(roomInfo.uid.toString())
}
} else {
val roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByMicPosition(position)
@@ -1146,11 +1155,37 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
if (result) {
mvpPresenter?.upMicroPhone(micPosition, currentUid, b)
} else {
toast("请给予麦克风权限后再试!")
showDeniedTips(
requireContext(),
ResUtil.getString(R.string.permission_denied_tips_mic)
)
}
}, { throwable: Throwable? -> toast("发生一些异常,请稍后重试!") })
}
private fun showDeniedTips(context: Context, message: String) {
CommonTipDialog(context).apply {
setTipMsg(message)
setOkText("去设置")
setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
val packageUri =
Uri.parse("package:${context.packageName}")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
)
(context as? Activity)?.startActivityForResult(
intent, 0
)
}
}
)
}.show()
}
/**
* 是否有麦克风权限
*

View File

@@ -6,6 +6,7 @@ import android.view.View
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.gyf.immersionbar.ImmersionBar
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.GameMicroViewAdapter
import com.nnbc123.app.avroom.adapter.GameMiniMicroViewAdapter
@@ -58,6 +59,7 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
override fun onFindViews() {
super.onFindViews()
gameBinding = DataBindingUtil.bind(mView)!!
ImmersionBar.with(this).titleBarMarginTop(gameBinding.spaceTitleBar).init()
gameBinding.lifecycleOwner = this
gameBinding.click = this
gameBinding.ktvModel = false
@@ -169,22 +171,13 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
override fun onStart() {
super.onStart()
gameDelegate.onStart()
}
override fun onResume() {
super.onResume()
gameDelegate.onResume()
}
override fun onPause() {
super.onPause()
gameDelegate.onPause()
gameDelegate.onStart()
}
override fun onStop() {
super.onStop()
gameDelegate.onPause()
gameDelegate.onStop()
}

View File

@@ -8,11 +8,13 @@ import android.view.View
import android.view.ViewConfiguration
import android.widget.ImageView
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import cn.sharesdk.framework.Platform
import com.chad.library.adapter.base.BaseQuickAdapter
import com.gyf.immersionbar.ImmersionBar
import com.netease.nim.uikit.common.util.string.StringUtil
import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage
@@ -53,6 +55,9 @@ import com.nnbc123.core.room.anotherroompk.ShowUserInfoDialogEvent
import com.nnbc123.core.room.bean.RoomContributeDataInfo
import com.nnbc123.core.room.bean.RoomContributeUserInfo
import com.nnbc123.core.room.bean.RoomInfo
import com.nnbc123.core.room.bean.RoomModeType
import com.nnbc123.core.room.game.GameInfo
import com.nnbc123.core.room.game.GameModel
import com.nnbc123.core.room.model.RoomContributeListModel
import com.nnbc123.core.room.queuing_mic.event.HasAnimationEffect
import com.nnbc123.core.share.ShareModel
@@ -66,6 +71,7 @@ import com.nnbc123.core.utils.net.RxHelper
import com.nnbc123.library.rxbus.RxBus
import com.nnbc123.library.utils.FormatUtils
import com.nnbc123.library.utils.JavaUtil
import com.nnbc123.library.utils.ResUtil
import com.nnbc123.library.utils.SingleToastUtil
import com.trello.rxlifecycle3.android.FragmentEvent
import io.reactivex.SingleObserver
@@ -119,6 +125,7 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
override fun onFindViews() {
_binding = DataBindingUtil.bind(mView)
ImmersionBar.with(this).titleBarMarginTop(binding.layoutTitleBar).init()
setupRoomTitleMarquee()
}
@@ -240,16 +247,16 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
}
//这里的2和4是服务端定义的错误状态 关闭排麦模式和关闭PK模式!
private val isShowChangeGame: Boolean
get() = false
/* RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
private val isShowChangeGame: Boolean get() {
val currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
return currentRoomInfo != null &&
AvRoomDataManager.get().isRoomOwner() &&
currentRoomInfo.getIsPermitRoom() != 1 &&
currentRoomInfo.getType() != RoomInfo.ROOM_TYPE_SINGLE &&
(currentRoomInfo.getRoomModeType() == RoomModeType.NORMAL_MODE ||
currentRoomInfo.getRoomModeType() == 2 ||
currentRoomInfo.getRoomModeType() == 4);*/
currentRoomInfo.getRoomModeType() == 4)
}
fun setRoomBg(roomInfo: RoomInfo?) {
if (_binding == null) return
@@ -421,6 +428,38 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
setupFollowRoom()
FOLLOW_ROOM_TYPE = if (AvRoomDataManager.get().isRoomFans) "2" else "1"
setIdOnlineData()
if (isShowChangeGame) {
initRvGame()
binding.layoutRankTop1.isVisible = false
binding.layoutRankTop2.isVisible = false
binding.llChangeGame.visibility = View.VISIBLE
if (AvRoomDataManager.get().isOpenGame) {
binding.tvCurrGame.text = it.mgName
} else {
binding.tvCurrGame.text = "扩列交友"
}
GameModel.getGameList()
.compose(bindToLifecycle())
.subscribe { gameInfos ->
if (AvRoomDataManager.get().isOpenGame) {
for (i in gameInfos.indices) {
val gameInfo: GameInfo = gameInfos[i]
if (gameInfo.mgId.toLongOrNull() == it.mgId) {
gameInfos.removeAt(i)
break
}
}
val gameInfo = GameInfo()
gameInfo.name = "扩列交友"
gameInfos.add(gameInfo)
}
gameAdapter?.setNewData(gameInfos)
}
} else {
binding.llChangeGame.setVisibility(View.GONE)
binding.layoutRankTop1.isVisible = true
binding.layoutRankTop2.isVisible = true
}
}
}
@@ -515,23 +554,7 @@ class HomePartyFragment : BaseFragment(), View.OnClickListener, OnShareDialogIte
.compose(bindToLifecycle())
.compose(RxHelper.handleBeanData())
.subscribe { roomContributeDataInfo: RoomContributeDataInfo ->
val rankings = roomContributeDataInfo.rankings
updateRoomRanks(roomContributeDataInfo.rankings)
var imageView: ImageView
val avatarList = listOf(
binding.ivRank0,
binding.ivRank1,
binding.ivRank2
)
for (i in avatarList.indices) {
imageView = avatarList[i]
if (rankings.size > i) {
val info = rankings[i]
imageView.loadAvatar(info.avatar)
} else {
imageView.setImageResource(R.drawable.default_avatar)
}
}
}
}

View File

@@ -8,6 +8,7 @@ import android.widget.ImageView;
import androidx.databinding.DataBindingUtil;
import com.gyf.immersionbar.ImmersionBar;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.nnbc123.app.R;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
@@ -133,6 +134,7 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
public void onFindViews() {
super.onFindViews();
gameBinding = DataBindingUtil.bind(mView);
ImmersionBar.with(this).titleBarMarginTop(gameBinding.layoutRoot).init();
gameBinding.setLifecycleOwner(this);
gameBinding.setClick(this);
gameBinding.setKtvModel(false);

View File

@@ -9,6 +9,7 @@ import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.viewModels
import com.gyf.immersionbar.ImmersionBar
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.OnMicroItemClickListener
@@ -86,6 +87,7 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
override fun onFindViews() {
super.onFindViews()
gameBinding = DataBindingUtil.bind(mView)!!
ImmersionBar.with(this).titleBarMarginTop(gameBinding.spaceTitleBar).init()
gameBinding.lifecycleOwner = this
gameBinding.click = this
}
@@ -265,13 +267,13 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
gameBinding.microView.bindAdapter(SingleRoomPKMicroViewAdapter(context))
gameBinding.viewPkBoard.isVisible = true
gameBinding.microView.updateLayoutParams<ConstraintLayout.LayoutParams> {
topMargin = ScreenUtil.dip2px(140f)
topMargin = ScreenUtil.dip2px(50f)
}
} else if (!AvRoomDataManager.get().isOpenAnotherPKMode && gameBinding.microView.adapter !is SingleAnchorMicroViewAdapter) {
gameBinding.microView.bindAdapter(SingleAnchorMicroViewAdapter(context))
gameBinding.viewPkBoard.isVisible = false
gameBinding.microView.updateLayoutParams<ConstraintLayout.LayoutParams> {
topMargin = ScreenUtil.dip2px(110f)
topMargin = ScreenUtil.dip2px(10f)
}
} else {
gameBinding.microView.adapter?.notifyDataSetChanged()

View File

@@ -8,8 +8,8 @@ import com.nnbc123.app.BuildConfig;
public class AppConfig {
protected static final String APP_ID = "1467745235064848385";
protected static final String APP_KEY = "BvjLDpWol7OihaYeFebuepx1bZu6cxU5";
protected static final String APP_ID = "1735573973195948033";
protected static final String APP_KEY = "r23OylNqnjOBPM0SDgVBfq6RCKMWAc0X";
protected static boolean isTestEnv = BuildConfig.DEBUG;
}

View File

@@ -34,7 +34,7 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
private val TAG = "GameDelegate"
private var APP_CODE = ""
private val mRoomID = AvRoomDataManager.get().roomUid.toString()
private val mRoomID :String get() = AvRoomDataManager.get().roomUid.toString()
private val mLanguage = "zh-CN" //语言
//调用游戏SDK的接口,成功加载游戏后可用:
@@ -84,7 +84,10 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
}
fun updateGame(mgId: Long?) {
if (mgId == null || mgId == 0L || mgId == mMGID || iSudFSTAPP == null) return
if (mgId == null || mgId == 0L) return
if (mgId == mMGID && iSudFSTAPP != null) {
return
}
mMGID = mgId
updateMyMicQueue(GameStatus.STATUS_NOT_JOIN)
loadMG(activity, mUid, mRoomID, APP_CODE, mMGID, mLanguage)
@@ -164,8 +167,11 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
language: String
) {
iSudFSTAPP?.destroyMG()
SudMGP.getCfg().showLoadingGameBg = !isHideLoadingBg()
iSudFSTAPP = SudMGP.loadMG(activity, userID, roomID, code, mgID, language, mISudFSMMG)
addGameView(iSudFSTAPP!!.gameView)
iSudFSTAPP?.apply {
addGameView(gameView)
}
}
/**
@@ -226,6 +232,9 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
LogUtils.d(p0)
}
override fun onGameLoadingProgress(p0: Int, p1: Int, p2: Int) {
}
override fun onGameStarted() {
}
@@ -285,7 +294,11 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
}
override fun onGetGameCfg(handle: ISudFSMStateHandle?, p1: String?) {
handle?.success(gson.toJson(GameCfg()))
val config = GameCfg()
if (isHideGameBg()) {
config.ui.game_bg.hide = true
}
handle?.success(gson.toJson(config))
}
/**
@@ -313,9 +326,9 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
//游戏安全操作区域
val viewGameRect = JSONObject()
viewGameRect.put("left", 0)
viewGameRect.put("top", ScreenUtil.dip2px(200f))
viewGameRect.put("top", ScreenUtil.dip2px(180f))
viewGameRect.put("right", 0)
viewGameRect.put("bottom", ScreenUtil.dip2px(200f))
viewGameRect.put("bottom", ScreenUtil.dip2px(150f))
jsonObject.put("view_game_rect", viewGameRect)
//通知游戏
@@ -655,6 +668,12 @@ class GameDelegate(val activity: Activity, val container: FrameLayout, var mgId:
iSudFSTAPP?.destroyMG()
}
private fun isHideLoadingBg(): Boolean {
return mMGID == 1704460412809043970
}
private fun isHideGameBg(): Boolean {
return mMGID == 1704460412809043970
}
}
internal interface AppLoginListener {

View File

@@ -125,59 +125,6 @@ public class GiftEffectView extends RelativeLayout implements SVGACallback {
giftInfo = giftEffectInfo.getGift();
}
if (giftInfo != null) {
int totalCoin = giftInfo.getGoldPrice() * giftEffectInfo.getGiftNum() * giftEffectInfo.getTargetUsers().size();
if (totalCoin >= 520 &&
giftEffectInfo.getGiftReceiveType() != GiftEffectInfo.GIFT_RECEIVE_TYPE_LUCKY
&& !AvRoomDataManager.get().isSelfGamePlaying()) {//礼物栏
ImageLoadUtils.loadImage(benefactorAvatar.getContext(), giftEffectInfo.getAvatar(), benefactorAvatar);
ImageLoadUtils.loadImage(giftImg.getContext(), giftInfo.getGiftUrl(), giftImg);
benefactorNick.setText(giftEffectInfo.getNick());
giftNumber.setText("X" + giftEffectInfo.getGiftNum());
giftName.setText(giftInfo.getGiftName());
container.setVisibility(VISIBLE);
if (giftEffectInfo.getGiftReceiveType() == GiftEffectInfo.GIFT_RECEIVE_TYPE_SINGLE) {
GiftReceiver giftReceiver = giftEffectInfo.getTargetUsers().get(0);
ImageLoadUtils.loadAvatar(receiverAvatar.getContext(), giftReceiver.getAvatar(), receiverAvatar);
receiverNick.setText(giftReceiver.getNick());
} else if (giftEffectInfo.getGiftReceiveType() == GiftEffectInfo.GIFT_RECEIVE_TYPE_ALL) {
receiverAvatar.setImageResource(R.mipmap.app_logo);
receiverNick.setText("全麦");
} else if (giftEffectInfo.getGiftReceiveType() == GiftEffectInfo.GIFT_RECEIVE_TYPE_MULTI) {
receiverAvatar.setImageResource(R.mipmap.app_logo);
StringBuilder sb = new StringBuilder();
for (GiftReceiver targetUser : giftEffectInfo.getTargetUsers()) {
RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(targetUser.getUid() + "");
if (roomQueueInfo == null) continue;
sb.append(roomQueueInfo.mRoomMicInfo.getPosition() + 1).append("").append(",");
}
if (sb.length() > 0) {
sb.replace(sb.lastIndexOf(","), sb.length(), "");
}
receiverNick.setText(sb.toString());
}
Animation operatingAnim = AnimationUtils.loadAnimation(getContext(), R.anim.light_bg_rotate_anim);
LinearInterpolator lin = new LinearInterpolator();
operatingAnim.setInterpolator(lin);
giftLightBg.setAnimation(operatingAnim);
final Point center = new Point();
center.x = ResolutionUtils.getScreenWidth(getContext()) / 2;
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(container, "translationX", -UIUtil.dip2px(getContext(), 400), center.x - container.getWidth() / 2).setDuration(500);
objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
objectAnimator.start();
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(container, "alpha", 0.0F, 1.0F).setDuration(500);
objectAnimator1.setInterpolator(new AccelerateDecelerateInterpolator());
objectAnimator1.start();
if (totalCoin < 4999) {
imgBg.setImageResource(R.drawable.icon_gift_effect_bg_1);
} else if (totalCoin < 9999) {
imgBg.setImageResource(R.drawable.icon_gift_effect_bg_2);
} else {
imgBg.setImageResource(R.drawable.icon_gift_effect_bg_3);
}
}
effectHandler.sendEmptyMessageDelayed(0, 6000);
if (giftInfo.getOtherViewType() == 1 && !TextUtils.isEmpty(giftInfo.getViewUrl())) {
drawVAPEffect(giftInfo.getViewUrl());

View File

@@ -1,5 +1,6 @@
package com.nnbc123.app.avroom.widget;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GIFT;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GIFT_COMPOUND;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_KITCHEN;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_PRIVILEGE;
@@ -93,6 +94,7 @@ import com.nnbc123.core.im.custom.bean.CarveUpGoldAttachment;
import com.nnbc123.core.im.custom.bean.CleanScreenAttachment;
import com.nnbc123.core.im.custom.bean.CustomAttachment;
import com.nnbc123.core.im.custom.bean.DatingAttachment;
import com.nnbc123.core.im.custom.bean.DressUpGiftAttachment;
import com.nnbc123.core.im.custom.bean.FaceAttachment;
import com.nnbc123.core.im.custom.bean.FansTeamMsgAttachment;
import com.nnbc123.core.im.custom.bean.GiftAttachment;
@@ -121,6 +123,7 @@ import com.nnbc123.core.im.custom.bean.RoomReceivedLuckyGiftAttachment;
import com.nnbc123.core.im.custom.bean.RoomTipAttachment;
import com.nnbc123.core.im.custom.bean.TarotAttachment;
import com.nnbc123.core.im.custom.bean.TarotMsgBean;
import com.nnbc123.core.im.custom.bean.UnLockGiftAttachment;
import com.nnbc123.core.im.custom.bean.VipMessageAttachment;
import com.nnbc123.core.im.custom.bean.WelcomeAttachment;
import com.nnbc123.core.im.custom.bean.WishListAttachment;
@@ -215,6 +218,7 @@ public class MessageView extends FrameLayout {
private int whiteColor;
private int greyColor;
private int appColor;
private int giftColor;
private int badgeWidth;
private int badgeHeight;
private int sysIconHeight;
@@ -277,6 +281,7 @@ public class MessageView extends FrameLayout {
whiteColor = ContextCompat.getColor(context, R.color.white);
greyColor = ContextCompat.getColor(context, R.color.white_transparent_50);
appColor = ContextCompat.getColor(context, R.color.app_color);
giftColor = ContextCompat.getColor(context, R.color.color_5CEFFF);
paddingWidth = Utils.dip2px(context, 10);
paddingHeight = Utils.dip2px(context, 8);
badgeWidth = Utils.dip2px(context, 15);
@@ -1011,6 +1016,13 @@ public class MessageView extends FrameLayout {
if (second == CustomAttachment.CUSTOM_MSG_PRIVILEGE_SECOND || second == CustomAttachment.CUSTOM_MSG_PRIVILEGE_SECOND_VIDEO) {
setPrivilegeNoticeMessage(chatRoomMessage, tvContent);
}
} else if (first == CUSTOM_MSG_GIFT) {
setVIPMessageBackground(chatRoomMessage, tvContent);
if (second == CustomAttachment.CUSTOM_MSG_GIFT_UNLOCK) {
setUnLockGiftMsg(tvContent, (UnLockGiftAttachment) attachment, chatRoomMessage);
} else if (second == CustomAttachment.CUSTOM_MSG_GIFT_DRESS) {
setDressGiftMsg(tvContent, (DressUpGiftAttachment) attachment, chatRoomMessage);
}
} else {
tvContent.setTextColor(Color.WHITE);
tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip));
@@ -2928,6 +2940,53 @@ public class MessageView extends FrameLayout {
}
private void setUnLockGiftMsg(TextView tvContent, UnLockGiftAttachment attachment, ChatRoomMessage chatRoomMessage) {
if (attachment == null) return;
String nick = RegexUtil.getPrintableString(attachment.getNick());
String giftName = attachment.getGiftNameNotNull();
String giftImage = attachment.getGiftUrlNotNull();
SpannableBuilder text = new SpannableBuilder(tvContent)
.append(getNewUserDrawable(chatRoomMessage), badgeWidth, badgeHeight)
.append(nick, new ForegroundColorSpan(appColor), new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {
if (clickConsumer != null) {
Single.just(chatRoomMessage.getFromAccount()).subscribe(clickConsumer);
}
}
})
.append(" 已解锁礼物 ", new ForegroundColorSpan(whiteColor))
.append(giftImage, giftLength, giftLength)
.append(giftName, new ForegroundColorSpan(giftColor));
tvContent.setText(text.build());
tvContent.setOnClickListener(null);
tvContent.setMovementMethod(new LinkMovementMethod());
}
private void setDressGiftMsg(TextView tvContent, DressUpGiftAttachment attachment, ChatRoomMessage chatRoomMessage) {
if (attachment == null) return;
String nick = RegexUtil.getPrintableString(attachment.getNick());
String dressName = attachment.getDressNameNotNull();
String dressImage = attachment.getDressUrlNotNull();
SpannableBuilder text = new SpannableBuilder(tvContent)
.append(getNewUserDrawable(chatRoomMessage), badgeWidth, badgeHeight)
.append(nick, new ForegroundColorSpan(appColor), new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {
if (clickConsumer != null) {
Single.just(chatRoomMessage.getFromAccount()).subscribe(clickConsumer);
}
}
})
.append(" 获得 " + dressName + " ", new ForegroundColorSpan(whiteColor))
.append(dressImage, giftLength);
tvContent.setText(text.build());
tvContent.setOnClickListener(null);
tvContent.setMovementMethod(new LinkMovementMethod());
}
@Nullable
private Drawable getNewUserDrawable(ChatRoomMessage chatRoomMessage) {
boolean newUser = NobleUtil.getIsNewUser(UserInfo.IS_NEW_USER, chatRoomMessage);

View File

@@ -4,6 +4,7 @@ import static com.nnbc123.core.Constants.DEBUG_MAX_UID;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_HEAD_NOBLE;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_SUB_OPENNOBLE;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_SUB_RENEWNOBLE;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_ALL_SERVICE_GIFT;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_HEADER_TYPE_GIFT;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_RED_PACKAGE;
import static com.nnbc123.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_RED_PACKAGE_RECEIVE_ALL_DIAMOND;
@@ -13,6 +14,7 @@ import static com.nnbc123.library.utils.UIUtils.getActivityByContext;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -34,6 +36,7 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import androidx.annotation.ColorInt;
import androidx.core.util.Consumer;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -68,7 +71,7 @@ import com.nnbc123.app.ui.login.LoginPhoneActivity;
import com.nnbc123.app.ui.pay.ChargeActivity;
import com.nnbc123.app.ui.setting.ResetPasswordActivity;
import com.nnbc123.app.ui.widget.DefaultToolBar;
import com.nnbc123.app.ui.widget.dialog.AllServiceGiftLevelCeremonyDialog;
import com.nnbc123.app.ui.widget.dialog.AllServiceGiftLevelDialog;
import com.nnbc123.app.ui.widget.dialog.AllServiceVipLevelUPDialog;
import com.nnbc123.app.ui.widget.dialog.GameInviteDialog;
import com.nnbc123.app.ui.widget.dialog.OpenNobleGlobalNoticeDialog;
@@ -113,6 +116,7 @@ import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import io.reactivex.Observable;
@@ -133,7 +137,7 @@ public abstract class BaseActivity extends RxAppCompatActivity
*/
protected static final String STATUS_TAG = "STATUS_TAG";
private final RxPermissions rxPermissions = new RxPermissions(this);
public final RxPermissions rxPermissions = new RxPermissions(this);
protected TitleBar mTitleBar;
protected DefaultToolBar mToolBar;
protected CompositeDisposable mCompositeDisposable;
@@ -144,6 +148,8 @@ public abstract class BaseActivity extends RxAppCompatActivity
private OpenNobleGlobalNoticeDialog mNoticeDialog;
private boolean isShowingChargeDialog;
private Dialog giftDialog;
private LinkedList<AllServiceGiftProtocol.DataBean> giftList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -339,7 +345,14 @@ public abstract class BaseActivity extends RxAppCompatActivity
mNoticeDialog.dismiss();
mNoticeDialog = null;
}
if (giftDialog != null && giftDialog.isShowing()) {
giftDialog.setOnDismissListener(null);
giftDialog.dismiss();
giftDialog = null;
}
if (giftList != null) {
giftList.clear();
}
super.onDestroy();
LogUtil.i(this.getClass().getName(), "onDestroy");
/* ImageLoadUtils.clearMemory(this);*/
@@ -507,7 +520,6 @@ public abstract class BaseActivity extends RxAppCompatActivity
.compose(bindUntilEvent(ActivityEvent.PAUSE))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onRoomEventReceived);
}
@Override
@@ -821,6 +833,17 @@ public abstract class BaseActivity extends RxAppCompatActivity
}, Throwable::printStackTrace);
}
@SuppressLint("CheckResult")
public void checkPermission(Consumer<Boolean> consumer, String... mPerms) {
rxPermissions.request(mPerms)
.subscribe(aBoolean -> {
if (consumer != null) {
consumer.accept(aBoolean);
}
}, Throwable::printStackTrace);
}
@SuppressLint("CheckResult")
public Observable<Boolean> checkPermission(String... mPerms) {
return rxPermissions.request(mPerms);
@@ -918,15 +941,53 @@ public abstract class BaseActivity extends RxAppCompatActivity
UserUtils.getUserInfo() == null)
return;
AllServiceGiftProtocol.DataBean data = JSON.parseObject(String.valueOf(baseProtocol.getData()), AllServiceGiftProtocol.DataBean.class);
if (data == null || data.getGiftUrl() == null || !data.isCeremonyGift())
if (data == null || data.getGiftUrl() == null)
return;
new AllServiceGiftLevelCeremonyDialog(context, data).show();
if (giftList == null) {
giftList = new LinkedList<>();
}
int second2 = baseProtocol.getSecond();
if (second2 == CUSTOM_MSG_ALL_SERVICE_GIFT) {
giftList.add(data);
if (giftDialog != null && giftDialog.isShowing()) {
// 如果当前以及有礼物弹窗在展示,则需要等到他 dismiss 后再显示下一个
AllServiceGiftProtocol.DataBean dataBean = giftList.peekFirst();
if (dataBean != null) {
return;
} else {
giftDialog.dismiss();
}
} else {
showGiftDialog();
}
}
break;
default:
break;
}
}
private void showGiftDialog() {
if (giftList.size() == 0) return;
giftDialog = generateAllServiceGiftDialog(this, giftList.peekFirst());
giftDialog.setOnDismissListener(dialog -> {
giftList.pollFirst();
AllServiceGiftProtocol.DataBean dataBean = giftList.peekFirst();
if (dataBean != null) {
if (isValid()) {
showGiftDialog();
} else {
giftList.clear();
}
}
});
giftDialog.show();
}
private AllServiceGiftLevelDialog generateAllServiceGiftDialog(Context context, AllServiceGiftProtocol.DataBean dataBean) {
return new AllServiceGiftLevelDialog(context, dataBean);
}
public void onGrabApprenticesEvent(GrabApprenticesEvent event) {
if (!isTopActivity()) return;
if (dialog != null && dialog.isAdded()) {

View File

@@ -5,13 +5,17 @@ import android.content.DialogInterface
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.*
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import androidx.viewbinding.ViewBinding
import com.nnbc123.app.ui.utils.getActivityContext
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.ui.utils.getActivityContext
import com.trello.rxlifecycle3.components.support.RxDialogFragment
import java.lang.Exception
import java.lang.reflect.ParameterizedType
abstract class BaseDialog<T : ViewBinding> : RxDialogFragment() {
@@ -57,9 +61,13 @@ abstract class BaseDialog<T : ViewBinding> : RxDialogFragment() {
}
fun show(context: Context?) {
if (context == null) {
return
}
try {
context?.let {
show((getActivityContext(it) as FragmentActivity).supportFragmentManager, null)
val fragmentActivity = getActivityContext(context) as? FragmentActivity
fragmentActivity?.lifecycleScope?.launchWhenResumed {
show(fragmentActivity.supportFragmentManager, null)
}
} catch (e: Exception) {
e.printStackTrace()

View File

@@ -0,0 +1,38 @@
package com.nnbc123.app.common.permission
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import com.tbruyelle.rxpermissions2.RxPermissions
/**
* Created by Max on 2024/1/8 10:25
* Desc:
**/
object PermissionHelper {
fun isGranted(context: Context, permission: String): Boolean {
return ContextCompat.checkSelfPermission(
context,
permission
) == PackageManager.PERMISSION_GRANTED
}
/**
* 检查权限是否都授权
*/
fun isAllGranted(context: Context, vararg permissions: String): Boolean {
return permissions.firstOrNull {
!isGranted(context, it)
} == null
}
/**
* 检查权限是否都授权
*/
fun isAllGranted(rxPermissions: RxPermissions, vararg perms: String): Boolean {
return perms.firstOrNull {
!rxPermissions.isGranted(it)
} == null
}
}

View File

@@ -3,7 +3,9 @@ package com.nnbc123.app.common.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
@@ -67,22 +69,26 @@ public class DragLayout extends RelativeLayout {
parentHeight = parent.getHeight();
}
if (left < 0) {
left = 0;
int parentPaddingLeft = getParentPaddingLeft();
if (left < parentPaddingLeft) {
left = parentPaddingLeft;
right = left + getWidth();
}
if (right > parentWidth) {
right = parentWidth;
int paddingPaddingRight = getParentPaddingRight();
if (right > (parentWidth - paddingPaddingRight)) {
right = (parentWidth - paddingPaddingRight);
left = right - getWidth();
}
if (top < 0) {
top = 0;
int parentPaddingTop = getParentPaddingTop();
if (top < parentPaddingTop) {
top = parentPaddingTop;
bottom = top + getHeight();
}
if (bottom > parentHeight) {
bottom = parentHeight;
int paddingPaddingBottom = getParentPaddingBottom();
if (bottom > (parentHeight - paddingPaddingBottom)) {
bottom = (parentHeight - paddingPaddingBottom);
top = bottom - getHeight();
}
@@ -117,8 +123,8 @@ public class DragLayout extends RelativeLayout {
}
if (layoutParams != null) {
layoutParams.leftMargin = left;
layoutParams.topMargin = top;
layoutParams.leftMargin = left - getParentPaddingLeft();
layoutParams.topMargin = top - getParentPaddingTop();
layoutParams.width = getWidth();
layoutParams.height = getHeight();
setLayoutParams(layoutParams);
@@ -150,22 +156,26 @@ public class DragLayout extends RelativeLayout {
parentHeight = parent.getHeight();
}
if (left < 0) {
left = 0;
int parentPaddingLeft = getParentPaddingLeft();
if (left < parentPaddingLeft) {
left = parentPaddingLeft;
right = left + getWidth();
}
if (right > parentWidth) {
right = parentWidth;
int paddingPaddingRight = getParentPaddingRight();
if (right > (parentWidth - paddingPaddingRight)) {
right = (parentWidth - paddingPaddingRight);
left = right - getWidth();
}
if (top < 0) {
top = 0;
int parentPaddingTop = getParentPaddingTop();
if (top < parentPaddingTop) {
top = parentPaddingTop;
bottom = top + getHeight();
}
if (bottom > parentHeight) {
bottom = parentHeight;
int paddingPaddingBottom = getParentPaddingBottom();
if (bottom > (parentHeight - paddingPaddingBottom)) {
bottom = (parentHeight - paddingPaddingBottom);
top = bottom - getHeight();
}
@@ -192,4 +202,36 @@ public class DragLayout extends RelativeLayout {
return super.performClick();
}
protected int getParentPaddingLeft() {
ViewParent viewParent = getParent();
if (viewParent instanceof View) {
return ((View) viewParent).getPaddingLeft();
}
return 0;
}
protected int getParentPaddingRight() {
ViewParent viewParent = getParent();
if (viewParent instanceof View) {
return ((View) viewParent).getPaddingRight();
}
return 0;
}
protected int getParentPaddingTop() {
ViewParent viewParent = getParent();
if (viewParent instanceof View) {
return ((View) viewParent).getPaddingTop();
}
return 0;
}
protected int getParentPaddingBottom() {
ViewParent viewParent = getParent();
if (viewParent instanceof View) {
return ((View) viewParent).getPaddingBottom();
}
return 0;
}
}

View File

@@ -2,33 +2,24 @@ package com.nnbc123.app.common.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.Outline;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ImageView;
import android.view.View;
import android.view.ViewOutlineProvider;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.shape.CornerFamily;
import com.google.android.material.shape.ShapeAppearanceModel;
import com.nnbc123.app.R;
import java.io.InputStream;
/**
* 自定义View实现圆角圆形等效果
*
* @author zhy
*/
public class RectRoundImageView extends ImageView {
public class RectRoundImageView extends ShapeableImageView {
/**
* TYPE_CIRCLE / TYPE_ROUND
@@ -37,42 +28,11 @@ public class RectRoundImageView extends ImageView {
public static final int TYPE_CIRCLE = 0;
public static final int TYPE_ROUND = 1;
/**
* 图片
*/
private Bitmap mSrc;
/**
* 圆角的大小
*/
private int mRadius = 8;
/**
* 控件的宽度
*/
private int mWidth;
/**
* 控件的高度
*/
private int mHeight;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getmRadius() {
return mRadius;
}
public void setmRadius(int mRadius) {
this.mRadius = mRadius;
}
public RectRoundImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@@ -98,17 +58,6 @@ public class RectRoundImageView extends ImageView {
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.RectRoundImageView_src:
// mSrc = BitmapFactory.decodeResource(getResources(),
// a.getResourceId(attr, 0));
InputStream is = getResources().openRawResource(a.getResourceId(attr, 0));
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inTempStorage = new byte[100 * 1024];
opts.inPreferredConfig = Config.RGB_565;
opts.inPurgeable = true;
opts.inSampleSize = 4;
mSrc = BitmapFactory.decodeStream(is, null, opts);
break;
case R.styleable.RectRoundImageView_type:
type = a.getInt(attr, 0);// 默认为Circle
break;
@@ -121,197 +70,25 @@ public class RectRoundImageView extends ImageView {
}
setScaleType(ScaleType.CENTER_CROP);
a.recycle();
setup(type, mRadius);
}
/**
* 计算控件的高度和宽度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Drawable drawable = getDrawable();
if (null != drawable) {
mSrc = drawableToBitmap(getDrawable());
}
/**
* 设置宽度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mWidth = specSize;
} else {
// 由图片决定的宽
int desireByImg = getPaddingLeft() + getPaddingRight()
+ mSrc.getWidth();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mWidth = Math.min(desireByImg, specSize);
} else
mWidth = desireByImg;
}
/***
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mHeight = specSize;
} else {
int desire = getPaddingTop() + getPaddingBottom()
+ mSrc.getHeight();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mHeight = Math.min(desire, specSize);
} else
mHeight = desire;
}
setMeasuredDimension(mWidth, mHeight);
}
/**
* 绘制
*/
@Override
protected void onDraw(Canvas canvas) {
switch (type) {
// 如果是TYPE_CIRCLE绘制圆形
case TYPE_CIRCLE:
int min = Math.min(mWidth, mHeight);
/**
* 长度如果不一致,按小的值进行压缩
*/
if (null != mSrc) {
mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);
canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);
private void setup(int type, int cornerSize) {
if (type == TYPE_CIRCLE) {
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
int min = Math.min(view.getWidth(), view.getHeight());
int left = (view.getWidth() - min) / 2;
int top = (view.getHeight() - min) / 2;
outline.setOval(left, top, min, min);
}
break;
case TYPE_ROUND:
canvas.drawBitmap(createFramedPhoto(mWidth, mHeight, mSrc, mRadius), 0, 0, null);
break;
});
setClipToOutline(true);
} else if (type == TYPE_ROUND) {
setShapeAppearanceModel(ShapeAppearanceModel.builder()
.setAllCorners(CornerFamily.ROUNDED, cornerSize)
.build());
}
}
/**
* Drawable → Bitmap
*
* @param drawable
* @return
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Config.ARGB_8888
: Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//canvas.setBitmap(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
/**
* 根据原图和变长绘制圆形图片
*
* @param source
* @param min
* @return
*/
private Bitmap createCircleImage(Bitmap source, int min) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Config.RGB_565);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN参考上面的说明
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
/**
* 根据原图添加圆角
*
* @param source
* @return
*/
private Bitmap createRoundConerImage(Bitmap source) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rect, mRadius, mRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
/**
* @param x 图像的宽度
* @param y 图像的高度
* @param image 源图片
* @param outerRadiusRat 圆角的大小
* @return 圆角图片
*/
Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
//根据源文件新建一个darwable对象
Drawable imageDrawable = new BitmapDrawable(image);
// 新建一个新的输出图片
Bitmap output = Bitmap.createBitmap(x, y, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
// 新建一个矩形
RectF outerRect = new RectF(0, 0, x, y);
// 产生一个红色的圆角矩形
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.RED);
canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);
// 将源图片绘制到这个圆角矩形上
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
imageDrawable.setBounds(0, 0, x, y);
canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
imageDrawable.draw(canvas);
canvas.restore();
return output;
}
}

View File

@@ -2,7 +2,6 @@ package com.nnbc123.app.decoration.adapter;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.nnbc123.app.R;
@@ -39,62 +38,22 @@ public class MyCarAdapter extends BaseAdapter<CarInfo> {
helper.addOnClickListener(R.id.tv_used);
// 倒计时
int remainingDay = item.getRemainingDay();
int status = item.getStatus();
boolean canUse;
if (remainingDay >= 0 && status == CarInfo.STATUS_USER_CAN_USE) {
canUse = true;
} else {
canUse = false;
}
// 时间
if (remainingDay >= 0 && status == CarInfo.STATUS_USER_CAN_USE) {
String days;
if (item.getRemainingDay() > 99){
days = "99+";
}else {
days = item.getRemainingDay()+"";
if (item.getStatus() == CarInfo.STATUS_USER_CAN_USE) {
binding.tvUsed.setVisibility(View.VISIBLE);
binding.tvUsed.setEnabled(true);
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + item.getExpireText());
if (item.isUsing()) {
binding.tvUsed.setText("取消使用");
binding.tvUsed.setBackgroundResource(R.drawable.bg_common_cancel);
} else {
binding.tvUsed.setText("使用");
binding.tvUsed.setBackgroundResource(R.drawable.bg_common_confirm);
}
binding.tvCounters.setText(String.format(binding.tvCounters.getResources().getString(R.string.decoration_status_wrapper),
binding.tvCounters.getResources().getString(R.string.decoration_remainder) + days + ""));
} else {
if (status == CarInfo.STATUS_OFF_SHELF || status == CarInfo.STATUS_OUT_OF_DATE) {
binding.tvCounters.setText(String.format(binding.tvCounters.getResources().getString(R.string.decoration_status_wrapper),
binding.tvCounters.getResources().getString(R.string.past_due)));
}
binding.tvUsed.setVisibility(View.GONE);
binding.tvCounters.setText(binding.tvCounters.getResources().getString(R.string.past_due));
}
setUseButton(binding.tvUsed, canUse, item.isUsing());
updateTag(item, binding.ivTag);
}
private void setUseButton(TextView tvUsed, boolean canUse, boolean isUsing) {
if (!canUse) {
tvUsed.setVisibility(View.GONE);
tvUsed.setText("使用");
tvUsed.setBackgroundResource(R.drawable.bg_common_disable);
tvUsed.setEnabled(false);
tvUsed.setTextColor(mContext.getResources().getColor(R.color.text_secondary_878b9c));
} else if (isUsing) {
tvUsed.setVisibility(View.VISIBLE);
tvUsed.setText("取消使用");
tvUsed.setBackgroundResource(R.drawable.bg_common_cancel);
tvUsed.setEnabled(true);
tvUsed.setTextColor(mContext.getResources().getColor(R.color.text_normal_282828));
} else {
tvUsed.setVisibility(View.VISIBLE);
tvUsed.setText("使用");
tvUsed.setBackgroundResource(R.drawable.bg_common_confirm);
tvUsed.setTextColor(mContext.getResources().getColor(R.color.text_title_282828));
tvUsed.setEnabled(true);
}
}
private void updateTag(CarInfo carInfo, ImageView ivTag) {

View File

@@ -55,25 +55,12 @@ public class MyChatBubbleAdapter extends BaseAdapter<ChatBubbleInfo> {
binding.tvUsed.setVisibility(View.GONE);
binding.tvUsed.setEnabled(false);
binding.tvUsed.setText("使用");
binding.tvCounters.setText(mContext.getString(R.string.past_due));
} else {
binding.tvUsed.setVisibility(View.VISIBLE);
binding.tvUsed.setEnabled(true);
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + item.getExpireText());
}
// 日期展示
if (item.isHasExpired()) { // 过期
binding.tvCounters.setText(mContext.getString(R.string.past_due));
} else {
String days;
if (item.getExpireDays() > 99) {
days = "99+";
} else {
days = item.getExpireDays() + "";
}
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + days + mContext.getString(R.string.day));
}
}
}

View File

@@ -46,30 +46,14 @@ public class MyHeadWearAdapter extends BaseAdapter<HeadWearInfo> {
binding.ivTag.setImageResource(R.drawable.ic_mark_exclusive);
}
// 过期状态不可使用
if (item.getStatus() == 2) {
binding.tvUsed.setVisibility(View.GONE);
binding.tvUsed.setEnabled(false);
binding.tvUsed.setText("使用");
} else {
if (item.getStatus() == 1) {
binding.tvUsed.setVisibility(View.VISIBLE);
binding.tvUsed.setEnabled(true);
}
// 日期展示
if (item.getStatus() == 2) { // 过期
binding.tvCounters.setText(mContext.getString(R.string.past_due));
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + item.getExpireText());
} else {
String days;
if (item.getExpireDays() > 99){
days = "99+";
}else {
days = item.getExpireDays()+"";
}
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + days + mContext.getString(R.string.day));
binding.tvUsed.setVisibility(View.GONE);
binding.tvCounters.setText(mContext.getString(R.string.past_due));
}
}
}

View File

@@ -32,31 +32,16 @@ public class MyNamePlateAdapter extends BaseQuickAdapter<NamePlateInfo.Nameplate
.load(item.getNameplateImage())
.into(ivCover);
//使用按钮
TextView tvUsed = helper.getView(R.id.tv_used);
tvUsed.setBackgroundResource(item.isUsing() ? R.drawable.bg_common_cancel : R.drawable.bg_common_confirm);
tvUsed.setTextColor(item.isUsing() ? mContext.getResources().getColor(R.color.color_4C5AF1) :
mContext.getResources().getColor(R.color.white));
tvUsed.setText(item.isUsing() ? R.string.label_used : R.string.label_can_use);
if (item.isIsExpired()) { // 过期
// 日期展示
if (!item.isExpired()) {
helper.setText(R.id.tv_counters, mContext.getString(R.string.decoration_remainder) + item.getExpireText());
tvUsed.setVisibility(View.VISIBLE);
tvUsed.setText(item.isUsing() ? R.string.label_used : R.string.label_can_use);
tvUsed.setEnabled(true);
tvUsed.setBackgroundResource(item.isUsing() ? R.drawable.bg_common_cancel : R.drawable.bg_common_confirm);
} else {
helper.setText(R.id.tv_counters, mContext.getString(R.string.past_due));
tvUsed.setVisibility(View.GONE);
tvUsed.setEnabled(false);
tvUsed.setBackgroundResource(R.drawable.bg_common_disable);
tvUsed.setText("使用");
tvUsed.setTextColor(mContext.getResources().getColor(R.color.text_secondary_878b9c));
} else {
String days;
if (item.getExpireDays() > 99) {
days = "99+";
} else {
days = item.getExpireDays() + "";
}
helper.setText(R.id.tv_counters, mContext.getString(R.string.decoration_remainder) + days + mContext.getString(R.string.day));
tvUsed.setVisibility(View.VISIBLE);
tvUsed.setEnabled(true);
}
}
}

View File

@@ -54,25 +54,12 @@ public class MyUserCardWearAdapter extends BaseAdapter<UserCardWearInfo> {
binding.tvUsed.setVisibility(View.GONE);
binding.tvUsed.setEnabled(false);
binding.tvUsed.setText("使用");
binding.tvCounters.setText(mContext.getString(R.string.past_due));
} else {
binding.tvUsed.setVisibility(View.VISIBLE);
binding.tvUsed.setEnabled(true);
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + item.getExpireText());
}
// 日期展示
if (item.isHasExpired()) { // 过期
binding.tvCounters.setText(mContext.getString(R.string.past_due));
} else {
String days;
if (item.getExpireDays() > 99) {
days = "99+";
} else {
days = item.getExpireDays() + "";
}
binding.tvCounters.setText(mContext.getString(R.string.decoration_remainder) + days + mContext.getString(R.string.day));
}
}
}

View File

@@ -1,13 +1,18 @@
package com.nnbc123.app.decoration.view.widgets;
import android.content.Context;
import android.graphics.Color;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.core.content.ContextCompat;
import com.nnbc123.app.R;
import com.nnbc123.app.ui.widget.magicindicator.buildins.UIUtil;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import com.nnbc123.core.home.bean.TabInfo;
import java.util.List;
@@ -38,9 +43,9 @@ public class MyDecorationMagicIndicator extends CommonNavigatorAdapter {
public IPagerTitleView getTitleView(Context context, final int i) {
BadgeScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new BadgeScaleTransitionPagerTitleView(context);
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(mContext, R.color.text_secondary_878b9c));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(mContext, R.color.text_title_282828));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(mContext, R.color.color_2B2D33));
scaleTransitionPagerTitleView.setMinScale(0.9f);
scaleTransitionPagerTitleView.setTextSize(15);
scaleTransitionPagerTitleView.setTextSize(14);
scaleTransitionPagerTitleView.setText(mTitleList.get(i).getName());
if (mTitleList.get(i).getName().equals("座驾")) {
scaleTransitionPagerTitleView.findViewById(R.id.car_badge).setId(R.id.car_badge_garage);
@@ -62,7 +67,16 @@ public class MyDecorationMagicIndicator extends CommonNavigatorAdapter {
@Override
public IPagerIndicator getIndicator(Context context) {
return null;
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
indicator.setLineHeight(UIUtil.dip2px(context, 4));
indicator.setRoundRadius(UIUtil.dip2px(context, 2));
indicator.setLineWidth(UIUtil.dip2px(context, 8));
indicator.setColors(Color.parseColor("#FFDA24"));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
//lp.bottomMargin = 0;
indicator.setLayoutParams(lp);
return indicator;
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {

View File

@@ -0,0 +1,134 @@
package com.nnbc123.app.game_room
import android.content.Context
import android.content.Intent
import androidx.core.view.isVisible
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import com.gyf.immersionbar.ImmersionBar
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingActivity
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.common.widget.dialog.DialogManager.AbsOkDialogListener
import com.nnbc123.app.databinding.ActivityMoreRoomBinding
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.core.UriProvider
import com.nnbc123.core.bean.response.observeResult
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.pay.PayModel.NOT_REAL_NAME_BEFORE_CHARGING
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.net.ServerException
import com.nnbc123.library.annatation.ActLayoutRes
/**
* 更多游戏-房间列表
*/
@ActLayoutRes(R.layout.activity_more_room)
class GameRoomActivity : BaseBindingActivity<ActivityMoreRoomBinding>() {
private val gameTabAdapter = GameTabAdapter()
private val roomAdapter = GameRoomAdapter()
private lateinit var viewModel: GameRoomViewModel
private var rvDelegate: RVDelegate<HomeRoomInfo>? = null
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, GameRoomActivity::class.java)
context.startActivity(starter)
}
}
override fun init() {
ImmersionBar.with(this).titleBarMarginTop(mBinding.ivBack).init()
viewModel = ViewModelProvider(this)[GameRoomViewModel::class.java]
initView()
initEvent()
initObserve()
viewModel.getData()
}
private fun initView() {
mBinding.ivBack.setOnClickListener {
finish()
}
mBinding.rvTop.adapter = gameTabAdapter
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(roomAdapter)
.setRecyclerView(mBinding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.setLayoutManager(GridLayoutManager(this, 2))
.build()
}
private fun initObserve() {
viewModel.jumpLiveData.observeResult(this, success = {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}, failed = {
dialogManager.dismissDialog()
if ((it as? ServerException)?.code == NOT_REAL_NAME_BEFORE_CHARGING) {
dialogManager.showTipsDialog(getString(R.string.tips_need_to_certification),
getString(R.string.go_to_certification),
object : AbsOkDialogListener() {
override fun onOk() {
// 跳去实名认证页面
CommonWebViewActivity.start(
this@GameRoomActivity.context,
UriProvider.getTutuRealNamePage()
)
}
})
} else {
toast(it.message)
}
})
viewModel.gameTabLiveData.observe(this) {
gameTabAdapter.setNewData(it)
mBinding.rvTop.isVisible = !it.isNullOrEmpty()
}
viewModel.roomListLiveData.observe(this) {
rvDelegate?.loadData(it)
}
}
private fun initEvent() {
gameTabAdapter.setOnItemClickListener { adapter, view, position ->
gameTabAdapter.getItem(position)?.let {
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_MORE_GAME_TAB_CLICK,
it.name
)
dialogManager.showProgressDialog(this)
val type = if (it.isFriendsType == true) {
2
} else {
1
}
viewModel.getJumpInfo(it.mgId ?: 0, type)
}
}
roomAdapter.setOnItemClickListener { adapter, view, position ->
roomAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.uid)
}
}
}
override fun onDestroy() {
super.onDestroy()
dialogManager?.dismissDialog()
}
}

View File

@@ -0,0 +1,49 @@
package com.nnbc123.app.game_room
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
/**
* Created by Max on 2023/12/26 11:31
* Desc:
**/
class GameRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.game_room_item_room) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.getView<ImageView>(R.id.iv_bg)
.load(item.backgroundPic, defaultRes = R.drawable.game_room_bg_item_default)
helper.getView<ImageView>(R.id.iv_room_cover).load(item.avatar)
helper.setText(R.id.tv_room_name, item.title)
helper.setText(R.id.tv_online_number, "${item.onlineNum}")
//gameState=0 (idle 状态游戏未开始空闲状态gameState=1 loading 状态所有玩家都准备好队长点击了开始游戏按钮等待加载游戏场景开始游戏gameState=2playing状态游戏进行中状态
if (item.mgId > 0) {
when (item.state) {
0 -> {
helper.setText(R.id.tv_message, "游戏未开始,等待加入")
}
else -> {
helper.setText(R.id.tv_message, "游戏进行中,立即围观")
}
}
} else {
helper.setText(R.id.tv_message, "扩列交友")
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].load(avatarUrl, defaultRes = R.drawable.game_room_ic_mic)
}
}
}

View File

@@ -0,0 +1,50 @@
package com.nnbc123.app.game_room
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.BeanResult
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeGameBean
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.utils.toast
class GameRoomViewModel : BaseViewModel() {
val gameTabLiveData = MutableLiveData<List<HomeGameBean>>()
val roomListLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val jumpLiveData = MutableLiveData<BeanResult<HomeRoomInfo>?>()
fun getData() {
safeLaunch(
onError = {
roomListLiveData.value = ListResult.failed(1)
gameTabLiveData.value = ArrayList<HomeGameBean>().apply {
add(HomeGameBean(isFriendsType = true))
}
},
block = {
val result = HomeModel.getHomeGame()
val gameList = ArrayList<HomeGameBean>()
result?.miniGames?.let {
gameList.addAll(it)
}
gameList.add(HomeGameBean(isFriendsType = true))
gameTabLiveData.value = gameList
roomListLiveData.value = ListResult.success(result?.playRooms, 1)
}
)
}
fun getJumpInfo(id: Long, type: Int) {
safeLaunch(
onError = {
jumpLiveData.value = BeanResult.failed(it)
},
block = {
jumpLiveData.value = BeanResult.success(HomeModel.getResourceJumpInfo(id, type))
}
)
}
}

View File

@@ -0,0 +1,24 @@
package com.nnbc123.app.game_room
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeGameBean
/**
* Created by Max on 2023/12/26 11:31
* Desc:
**/
class GameTabAdapter :
BaseQuickAdapter<HomeGameBean, BaseViewHolder>(R.layout.game_room_item_tab) {
override fun convert(helper: BaseViewHolder, item: HomeGameBean) {
if (item.isFriendsType == true) {
helper.getView<ImageView>(R.id.iv_cover)
.setImageResource(R.drawable.game_room_bg_friends)
} else {
helper.getView<ImageView>(R.id.iv_cover).load(item.pic)
}
}
}

View File

@@ -0,0 +1,90 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.BeanResult
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeGameTab
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.toast
/**
* Created by Max on 2023/12/27 10:18
* Desc:
**/
class FriendsViewModel: BaseViewModel() {
private val _resourceJumpLiveData = MutableLiveData<BeanResult<HomeRoomInfo>?>()
val resourceJumpLiveData: LiveData<BeanResult<HomeRoomInfo>?> = _resourceJumpLiveData
private val _homeChatPickLiveData = MutableLiveData<String?>()
val homeChatPickLiveData: LiveData<String?> = _homeChatPickLiveData
private val _newFriendLiveData = MutableLiveData<ListResult<UserInfo>>()
val newFriendLiveData: LiveData<ListResult<UserInfo>> = _newFriendLiveData
val friendRecommendModeLiveData = MutableLiveData<ListResult<UserInfo>>()
val gameTabLiveData = MutableLiveData<MutableList<HomeGameTab>>()
fun getResourceJumpInfo(id: Long) {
safeLaunch(
onError = {
_resourceJumpLiveData.value = BeanResult.failed(it)
},
block = {
_resourceJumpLiveData.value = BeanResult.success(HomeModel.getResourceJumpInfo(id, 0))
}
)
}
fun getHomeChatPick() {
safeLaunch(
onError = {
_homeChatPickLiveData.value = null
it.message.toast()
},
block = {
_homeChatPickLiveData.value = HomeModel.getHomeChatPick()
}
)
}
fun getNewFriendList(gender: Int? = null, gameId: Long? = null) {
safeLaunch(
onError = {
_newFriendLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getNewFriendList(gender, gameId)
_newFriendLiveData.value = ListResult.success(result, 1)
}
)
}
fun getFriendRecommendMore() {
safeLaunch(
onError = {
friendRecommendModeLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getFriendRecommendMore()
friendRecommendModeLiveData.value = ListResult.success(result, 1)
}
)
}
fun getHomeGameTab() {
safeLaunch {
if (gameTabLiveData.value == null) {
HomeModel.getHomeGameTabListByLocal()?.let {
gameTabLiveData.value = it
}
}
gameTabLiveData.value = HomeModel.getHomeGameTabList()
}
}
}

View File

@@ -2,136 +2,42 @@ package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.community.CommunityConstant
import com.nnbc123.core.home.bean.*
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.room.bean.AnchorInfo
import com.nnbc123.core.room.bean.HomeLiveTopInfo
import com.nnbc123.core.room.bean.SingleRoomSortInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.toast
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.user.bean.UserInfo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
class HomeViewModel : BaseViewModel() {
private val _bannerLiveData = MutableLiveData<List<BannerInfo>>()
val bannerLiveData: LiveData<List<BannerInfo>> = _bannerLiveData
private val _partyBannerLiveData = MutableLiveData<List<BannerInfo>?>()
val partyBannerLiveData: LiveData<List<BannerInfo>?> = _partyBannerLiveData
private val _hotRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val hotRoomLiveData: LiveData<ListResult<HomeRoomInfo>> = _hotRoomLiveData
private val _gameRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val gameRoomLiveData: LiveData<ListResult<HomeRoomInfo>> = _gameRoomLiveData
private val _pickRoomLiveData = MutableLiveData<HomeRoomInfo?>()
val pickRoomLiveData: LiveData<HomeRoomInfo?> = _pickRoomLiveData
private val _openGameRoomLiveData = MutableLiveData<Long?>()
val openGameRoomLiveData: LiveData<Long?> = _openGameRoomLiveData
private val _concernsLiveData = MutableLiveData<List<HomeRoomInfo>>()
val concernsLiveData: LiveData<List<HomeRoomInfo>> = _concernsLiveData
private val _collectLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val collectLiveData: LiveData<ListResult<HomeRoomInfo>> = _collectLiveData
private val _tagLiveData = MutableLiveData<MutableList<HomeTagInfo>>()
val tagLiveData: LiveData<MutableList<HomeTagInfo>> = _tagLiveData
private val _emptyLiveData = MutableLiveData<Boolean>()
val emptyLiveData: LiveData<Boolean> = _emptyLiveData
private val _resourceLiveData = MutableLiveData<MutableList<ResourceInfo>>()
val resourceLiveData: LiveData<MutableList<ResourceInfo>> = _resourceLiveData
private val _resourceJumpLiveData = MutableLiveData<HomeRoomInfo?>()
val resourceJumpLiveData: LiveData<HomeRoomInfo?> = _resourceJumpLiveData
private val _homeChatPickLiveData = MutableLiveData<String?>()
val homeChatPickLiveData: LiveData<String?> = _homeChatPickLiveData
private val _singleAnchorHomeLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val singleAnchorHomeLiveData: LiveData<ListResult<HomeRoomInfo>> = _singleAnchorHomeLiveData
private val _singleRoomSortInfoLiveData = MutableLiveData<ListResult<SingleRoomSortInfo>>()
val singleRoomSortInfoLiveData: LiveData<ListResult<SingleRoomSortInfo>> =
_singleRoomSortInfoLiveData
private val _homeLiveTopInfoLiveData = MutableLiveData<HomeLiveTopInfo?>()
val homeLiveTopInfoLiveData: LiveData<HomeLiveTopInfo?> = _homeLiveTopInfoLiveData
private val _anchorInfoLiveData = MutableLiveData<AnchorInfo?>()
val anchorInfoLiveData: LiveData<AnchorInfo?> = _anchorInfoLiveData
private val _partyRecommendRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val partyRecommendRoomLiveData: LiveData<ListResult<HomeRoomInfo>> =
_partyRecommendRoomLiveData
private val _partyRecommendRoomMoreLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val partyRecommendRoomMoreLiveData: LiveData<ListResult<HomeRoomInfo>> =
_partyRecommendRoomMoreLiveData
private val _giftServiceLiveData = MutableLiveData<ListResult<GiftServiceMsgVo>>()
val giftServiceLiveData: LiveData<ListResult<GiftServiceMsgVo>> = _giftServiceLiveData
private val _newFriendLiveData = MutableLiveData<ListResult<UserInfo>>()
val newFriendLiveData: LiveData<ListResult<UserInfo>> = _newFriendLiveData
fun getBannerInfo() {
safeLaunch {
_bannerLiveData.value = HomeModel.getHomeBanner("9")
}
}
fun getTagInfo() {
safeLaunch {
_tagLiveData.value = HomeModel.getHomeTag()
}
}
fun getHomeResource() {
safeLaunch(
block = {
if (_resourceLiveData.value == null) {
HomeModel.getHomeResourceByLocal()?.let {
_resourceLiveData.value = it
}
}
_resourceLiveData.value = HomeModel.getHomeResource()
},
onError = {
}
)
}
fun getResourceJumpInfo(id: Int) {
safeLaunch(
onError = {
_resourceJumpLiveData.value = null
it.message.toast()
},
block = {
_resourceJumpLiveData.value = HomeModel.getResourceJumpInfo(id)
}
)
}
fun getHomeChatPick() {
safeLaunch(
onError = {
_homeChatPickLiveData.value = null
it.message.toast()
},
block = {
_homeChatPickLiveData.value = HomeModel.getHomeChatPick()
}
)
}
fun getHotRoom(pageNum: Int, pageSize: Int) {
@@ -146,145 +52,6 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getPartyBanner() {
safeLaunch(
onError = {
_partyBannerLiveData.value = null
},
block = {
val result = HomeModel.getHotRoom()
var bannerInfoList: List<BannerInfo>?
bannerInfoList = result?.find { it.isBanner }?.bannerVoList
if (bannerInfoList == null) {
bannerInfoList = HomeModel.getPlayRoom()?.find { it.isBanner }?.bannerVoList
}
_partyBannerLiveData.value = bannerInfoList
}
)
}
fun getGameRoom(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
_gameRoomLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getGameRoom(pageNum, pageSize)
_gameRoomLiveData.value = ListResult.success(result, pageNum)
}
)
}
fun fastPickGameRoom(mgId: Long? = null) {
safeLaunch(
onError = {
it.message.toast()
StatisticManager.Instance()
.onEvent(
StatisticsProtocol.EVENT_USERCENTER_QUICK_ENTRYSUCCESS_CLICK,
"个人中心快捷进房点击未匹配成功"
)
},
block = {
val homeRoomInfo = HomeModel.fastPickGameRoom(mgId)
if (homeRoomInfo?.isPick == true) {
_pickRoomLiveData.value = homeRoomInfo
} else if (homeRoomInfo?.isNeedOpenSelfRoom == true) {
_openGameRoomLiveData.value = mgId
}
}
)
}
fun getCollectRoom(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
_collectLiveData.value = ListResult.failed(pageNum)
_emptyLiveData.value = true
},
block = {
if (pageNum == 1) {
val concernsRooms = async(Dispatchers.IO) {
try {
HomeModel.getConcernsRoom()
} catch (e: Throwable) {
null
}
}
val collectRooms = async(Dispatchers.IO) {
try {
HomeModel.getCollectRoom(pageNum, pageSize)
} catch (e: Throwable) {
null
}
}
_concernsLiveData.value = concernsRooms.await()
val collectList = collectRooms.await()
if (collectList == null) {
_collectLiveData.value = ListResult.failed(pageNum)
} else {
_collectLiveData.value =
ListResult.success(collectList.fansRoomList, pageNum)
}
_emptyLiveData.value = _concernsLiveData.value.isNullOrEmpty() &&
_collectLiveData.value?.data.isNullOrEmpty()
} else {
val result = HomeModel.getCollectRoom(pageNum, pageSize)
_collectLiveData.value = ListResult.success(result?.fansRoomList, pageNum)
}
}
)
}
fun requestSingleRoomSortList() {
safeLaunch(
onError = {
//保证最少有一个推荐tab,防止出现空白页
_singleRoomSortInfoLiveData.value =
ListResult.success(listOf(SingleRoomSortInfo(null, "推荐")), 1)
},
block = {
val result = HomeModel.requestSingleRoomSortList()
val fullResult = ArrayList<SingleRoomSortInfo>()
fullResult.add(SingleRoomSortInfo(null, "推荐"))
result?.let { fullResult.addAll(it) }
_singleRoomSortInfoLiveData.value = ListResult.success(fullResult, 1)
}
)
}
fun getHomeSingleAnchorList() {
safeLaunch(
onError = {
_singleAnchorHomeLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getHomeSingleAnchorList()
_singleAnchorHomeLiveData.value = ListResult.success(
if ((result?.size ?: 0) > 4) {
result?.subList(0, 4)
} else {
result
}, 1
)
}
)
}
fun requestHomeLiveTopInfo() {
safeLaunch(
onError = {
_homeLiveTopInfoLiveData.value = null
},
block = {
_homeLiveTopInfoLiveData.value = HomeModel.requestHomeLiveTopInfo()
}
)
}
fun requestAnchorInfo() {
safeLaunch(
onError = {
@@ -296,54 +63,4 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getPartyRecommendRoomList() {
safeLaunch(
onError = {
_partyRecommendRoomLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getPartyRecommendRoomList(
AuthModel.get().currentUid.toString(),
CommunityConstant.VERSION_VALID_TYPE
)
_partyRecommendRoomLiveData.value = ListResult.success(result, 1)
}
)
}
fun getPartyRecommendRoomMoreList() {
safeLaunch(
onError = {
_partyRecommendRoomMoreLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getPartyRecommendRoomMoreList()
_partyRecommendRoomMoreLiveData.value = ListResult.success(result, 1)
}
)
}
fun getServiceGiftRecord() {
safeLaunch(
onError = {
_giftServiceLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getServiceGiftRecord()
_giftServiceLiveData.value = ListResult.success(result, 1)
}
)
}
fun getNewFriendList(gender: Int? = null) {
safeLaunch(
onError = {
_newFriendLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getNewFriendList(gender)
_newFriendLiveData.value = ListResult.success(result, 1)
}
)
}
}

View File

@@ -0,0 +1,56 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.BeanResult
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.BannerInfo
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
import com.nnbc123.core.utils.toast
/**
* Created by Max on 2023/12/27 10:18
* Desc:
**/
class PartyViewModel : BaseViewModel() {
private val _giftServiceLiveData = MutableLiveData<ListResult<GiftServiceMsgVo>>()
val giftServiceLiveData: LiveData<ListResult<GiftServiceMsgVo>> = _giftServiceLiveData
private val _bannerLiveData = MutableLiveData<List<BannerInfo>>()
val bannerLiveData: LiveData<List<BannerInfo>> = _bannerLiveData
private val _resourceJumpLiveData = MutableLiveData<BeanResult<HomeRoomInfo>?>()
val resourceJumpLiveData: LiveData<BeanResult<HomeRoomInfo>?> = _resourceJumpLiveData
fun getResourceJumpInfo(id: Long) {
safeLaunch(
onError = {
_resourceJumpLiveData.value = BeanResult.failed(it)
},
block = {
_resourceJumpLiveData.value = BeanResult.success(HomeModel.getResourceJumpInfo(id, 0))
}
)
}
fun getBannerInfo() {
safeLaunch {
_bannerLiveData.value = HomeModel.getHomeBanner("1")
}
}
fun getServiceGiftRecord() {
safeLaunch(
onError = {
_giftServiceLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getServiceGiftRecord()
_giftServiceLiveData.value = ListResult.success(result, 1)
}
)
}
}

View File

@@ -1,27 +0,0 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
class RoomCommonViewModel : BaseViewModel() {
private val _commonRoomLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val commonRoomLiveData: LiveData<ListResult<HomeRoomInfo>> = _commonRoomLiveData
fun getCommonRoom(tabId: Int, pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {
_commonRoomLiveData.value = ListResult.failed(pageNum)
},
block = {
val result = HomeModel.getCommonRoom(tabId, pageNum, pageSize)
_commonRoomLiveData.value = ListResult.success(result, pageNum)
}
)
}
}

View File

@@ -1,27 +0,0 @@
package com.nnbc123.app.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.nnbc123.app.base.BaseViewModel
import com.nnbc123.core.bean.response.ListResult
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.model.HomeModel
class RoomSingleViewModel : BaseViewModel() {
private val _singleAnchorMoreLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val singleAnchorMoreLiveData: LiveData<ListResult<HomeRoomInfo>> = _singleAnchorMoreLiveData
fun getMoreSingleAnchorList(id: Long?) {
safeLaunch(
onError = {
_singleAnchorMoreLiveData.value = ListResult.failed(1)
},
block = {
val result = HomeModel.getMoreSingleAnchorList(id)
_singleAnchorMoreLiveData.value = ListResult.success(result, 1)
}
)
}
}

View File

@@ -1,38 +0,0 @@
package com.nnbc123.app.home.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.home.fragment.PartyFragment
import com.netease.nim.uikit.StatusBarUtil
class MoreRoomActivity : BaseActivity() {
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, MoreRoomActivity::class.java)
context.startActivity(starter)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_more_room)
initTitleBar("更多房间")
supportFragmentManager
.beginTransaction()
.replace(R.id.fcv, PartyFragment.newInstance())
.commitAllowingStateLoss()
}
override fun needSteepStateBar() = true
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -1,58 +0,0 @@
package com.nnbc123.app.home.adapter;
import android.graphics.drawable.AnimationDrawable;
import androidx.annotation.NonNull;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.nnbc123.app.R;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
import com.nnbc123.app.common.widget.CircleImageView;
import com.nnbc123.app.ui.user.UserInfoActivity;
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2;
import com.nnbc123.core.home.bean.HomeRoomInfo;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import com.nnbc123.core.utils.StringExtensionKt;
public class HomeConcernsAdapter extends BaseQuickAdapter<HomeRoomInfo, BaseViewHolder> {
public HomeConcernsAdapter() {
super(R.layout.item_home_concerns, null);
}
@Override
protected void convert(@NonNull BaseViewHolder helper, HomeRoomInfo item) {
if (item == null) {
return;
}
CircleImageView circleImageView = helper.getView(R.id.civ_room_avatar);
ImageLoadUtilsV2.loadImage(circleImageView, item.getAvatar());
helper.setText(R.id.tv_room_name, StringExtensionKt.subAndReplaceDot(item.getNick(), 4));
if (item.getRoomUid() > 0) {
helper.setVisible(R.id.view_avatar_bg, true);
helper.setVisible(R.id.view_living, true);
helper.setVisible(R.id.tv_live, true);
if (helper.getView(R.id.view_living).getBackground() instanceof AnimationDrawable) {
((AnimationDrawable) helper.getView(R.id.view_living).getBackground()).start();
}
helper.itemView.setOnClickListener(v -> {
AVRoomActivity.startForFromType(mContext,
item.getRoomUid(),
AVRoomActivity.FROM_TYPE_USER,
item.getNick(),
String.valueOf(item.getUid()));
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_GZR_ROOM_SUCCESS, "喜欢tab点击关注的人进入房间");
});
} else {
helper.setVisible(R.id.view_avatar_bg, false);
helper.setVisible(R.id.tv_live, false);
helper.setVisible(R.id.view_living, false);
helper.itemView.setOnClickListener(v -> UserInfoActivity.Companion.start(mContext, item.getUid()));
}
}
}

View File

@@ -0,0 +1,64 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeGameTab
/**
* Created by Max on 2023/12/25 10:30
* Desc:
**/
class HomeFriendsGameTabAdapter :
BaseQuickAdapter<HomeGameTab, BaseViewHolder>(R.layout.home_friends_item_game) {
var selectGameId: Long? = null
private var selectPosition: Int? = null
override fun convertPayloads(
helper: BaseViewHolder,
item: HomeGameTab,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
convertState(helper, item)
}
override fun convert(helper: BaseViewHolder, item: HomeGameTab) {
convertState(helper, item)
}
private fun convertState(helper: BaseViewHolder, item: HomeGameTab) {
if (helper.absoluteAdapterPosition == selectPosition) {
helper.getView<ImageView>(R.id.iv_cover).load(item.onClick, defaultRes = null)
} else {
helper.getView<ImageView>(R.id.iv_cover).load(item.onUnclick, defaultRes = null)
}
}
fun selectItem(position: Int?) {
val item = getItem(position ?: -1)
if (item == null || position == null) {
val oldPosition = selectPosition
this.selectGameId = null
this.selectPosition = null
if (oldPosition != null) {
notifyItemChanged(oldPosition, true)
}
} else if (position == selectPosition) {
this.selectGameId = null
this.selectPosition = null
notifyItemChanged(position, true)
} else {
val oldPosition = this.selectPosition
this.selectGameId = item.gameId
this.selectPosition = position
if (oldPosition != null) {
notifyItemChanged(oldPosition, true)
}
notifyItemChanged(position, true)
}
}
}

View File

@@ -0,0 +1,251 @@
package com.nnbc123.app.home.adapter
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.isVisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.audio.helper.AudioPlayerHelper
import com.nnbc123.app.audio.helper.OnPlayListener
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadFromAssets
import com.nnbc123.app.vip.VipHelper
import com.nnbc123.core.Constants
import com.nnbc123.core.manager.AudioEngineManager
import com.nnbc123.core.manager.AvRoomDataManager
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.StarUtils
import com.nnbc123.library.utils.SingleToastUtil
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
import com.opensource.svgaplayer.SVGAParser
import com.opensource.svgaplayer.SVGAVideoEntity
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.Date
import java.util.concurrent.TimeUnit
/**
* Created by Max on 2023/12/18 18:33
* Desc:
**/
class HomeFriendsUserAdapter :
BaseQuickAdapter<UserInfo, BaseViewHolder>(R.layout.home_friends_list_item) {
private var disposable: Disposable? = null
private var isMute = false
private var isRemoteMute = false
override fun convert(helper: BaseViewHolder, item: UserInfo) {
// 昵称
val nameView = helper.getView<TextView>(R.id.tv_name)
nameView.text = item.nick
VipHelper.loadVipNickColor(nameView, item.userVipInfoVO, "#2B2D33")
// 头像
helper.getView<ImageView>(R.id.iv_avatar).load(item.avatar)
// 星座
var star: String? = null
if (item.birth > 0) {
star = StarUtils.getConstellation(Date(item.birth))
}
helper.setGone(R.id.tv_constellation, !star.isNullOrEmpty())
.setText(R.id.tv_constellation, star)
// 状态
if (item.isInOnline) {
val svgaLiving = helper.getView<SVGAImageView>(R.id.svga_state_live)
if (item.inRoomUid > 0L) {
svgaLiving.loadFromAssets("svga/home_living_white.svga")
svgaLiving.startAnimation()
svgaLiving.isVisible = true
helper.getView<View>(R.id.iv_state_leisure).isVisible = false
helper.setText(R.id.tv_state, "直播中")
} else {
svgaLiving.stopAnimation()
svgaLiving.isVisible = false
helper.getView<View>(R.id.iv_state_leisure).isVisible = true
helper.setText(R.id.tv_state, "空闲中")
}
helper.setGone(R.id.layout_state, true)
} else {
helper.setGone(R.id.layout_state, false)
}
// 房间
val roomInfoView = helper.getView<View>(R.id.layout_room_info)
if (item.roomTitle.isNullOrEmpty()) {
roomInfoView.isVisible = false
} else {
roomInfoView.isVisible = true
roomInfoView.isSelected = true
helper.setText(R.id.tv_room_title, item.roomTitle)
roomInfoView.singleClick {
if (!item.isLock && item.inRoomUid > 0) {
AVRoomActivity.start(it.context, item.inRoomUid)
}
}
}
// 声音
val audioUrl = item.voiceCard?.getAudioUrl()
val svagAudio = helper.getView<SVGAImageView>(R.id.svga_audio)
if (audioUrl.isNullOrEmpty()) {
svagAudio.stopAnimation()
helper.setGone(R.id.layout_audio, false)
} else {
helper.getView<TextView>(R.id.tv_audio_duration).text =
"${item.voiceCard?.getAudioDuration() ?: 0}"
helper.getView<View>(R.id.layout_audio)
.setOnClickListener { toggleAudio(helper, item) }
svagAudio.setImageResource(R.drawable.home_ic_audio_playing)
helper.setGone(R.id.layout_audio, true)
}
// 游戏
val groupGame = helper.getView<View>(R.id.group_game)
item.userGamePartnerVo?.let {
val name =
if (!it.firstGameName.isNullOrEmpty() && !it.secondGameName.isNullOrEmpty()) {
"${it.firstGameName}|${it.secondGameName}"
} else if (!it.firstGameName.isNullOrEmpty()) {
it.firstGameName
} else if (!it.secondGameName.isNullOrEmpty()) {
it.secondGameName
} else {
null
}
helper.setText(R.id.tv_game_name, name)
helper.getView<ImageView>(R.id.iv_game_icon).load(it.firstLogo)
groupGame.isVisible = true
} ?: kotlin.run {
groupGame.isVisible = false
}
}
private fun toggleAudio(holder: BaseViewHolder, item: UserInfo) {
if (item.isVoicePlaying) {
stopAudio()
} else {
playAudio(holder, item)
}
}
private fun stopAudio() {
AudioPlayerHelper.get().endPlay()
}
private fun resetAudioUI(holder: BaseViewHolder, item: UserInfo) {
item.isVoicePlaying = false
disposable?.dispose()
holder.setImageResource(R.id.iv_audio_btn, R.drawable.home_ic_audio_play)
holder.setText(
R.id.tv_audio_duration,
"${item.voiceCard?.getAudioDuration() ?: 0}"
)
val svgaImageView = holder.getView<SVGAImageView>(R.id.svga_audio)
svgaImageView.stopAnimation()
svgaImageView.setImageResource(R.drawable.home_ic_audio_playing)
AvRoomDataManager.get().mCurrentRoomInfo?.run {
AudioEngineManager.get().isRemoteMute = isRemoteMute //非靜音
AudioEngineManager.get().isMute = isMute //能説話
AudioEngineManager.get().setRole(
if (isRemoteMute) Constants.CLIENT_ROLE_AUDIENCE else Constants.CLIENT_ROLE_BROADCASTER
)
}
}
private fun playAudio(holder: BaseViewHolder, item: UserInfo) {
AudioPlayerHelper.get().endPlay()
item.isVoicePlaying = true
holder.setImageResource(R.id.iv_audio_btn, R.drawable.home_ic_audio_pause)
val svgaImageView = holder.getView<SVGAImageView>(R.id.svga_audio)
SVGAParser.shareParser()
.decodeFromAssets("svga/home_voice_playing.svga", object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
if (item.isVoicePlaying) {
val drawable = SVGADrawable(videoItem)
svgaImageView.setImageDrawable(drawable)
svgaImageView.startAnimation()
}
}
override fun onError() {
}
})
val duration = item.voiceCard?.getAudioDuration() ?: 0
disposable = Observable.interval(1L, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.map { it + 1 }
.takeUntil { it == duration }
.subscribe {
holder.setText(
R.id.tv_audio_duration,
"${(duration - it)}"
)
}
AvRoomDataManager.get().mCurrentRoomInfo?.run {
isRemoteMute = AudioEngineManager.get().isRemoteMute
isMute = AudioEngineManager.get().isMute
AudioEngineManager.get().isRemoteMute = true //設置靜音
AudioEngineManager.get().isMute = true //不能説話
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE)
}
AudioPlayerHelper.get()
.playInThread(item.voiceCard?.getAudioUrl(), object : OnPlayListener {
override fun onError(error: String) {
SingleToastUtil.showToast("播放出错,请重试")
resetAudioUI(holder, item)
}
override fun onPrepared() {}
override fun onPlaying(currDuration: Long) {}
override fun onCompletion() {
resetAudioUI(holder, item)
}
})
}
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
super.onViewAttachedToWindow(holder)
if (holder.itemViewType == 0) {
val svgaLiving = holder.getView<SVGAImageView>(R.id.svga_state_live)
if (svgaLiving.isVisible) {
svgaLiving?.loadFromAssets("svga/home_living_white.svga")
}
}
}
override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
super.onViewDetachedFromWindow(holder)
if (holder.itemViewType == 0) {
val position = holder.absoluteAdapterPosition
if (position < 0 || position >= data.size) {
return
}
val item = data[position]
if (item.isVoicePlaying) {
stopAudio()
}
}
}
override fun setNewData(data: MutableList<UserInfo>?) {
stopAudio()
super.setNewData(data)
}
}

View File

@@ -1,41 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.room.bean.HomeLiveTopInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
class HomeLiveTopAdapter :
BaseQuickAdapter<HomeLiveTopInfo.SingleRoom, BaseViewHolder>(R.layout.item_home_live_top) {
private var onceLookStatus: Boolean = false
fun setOnceLookStatus(onceLookStatus: Boolean) {
this.onceLookStatus = onceLookStatus
}
override fun convert(helper: BaseViewHolder, item: HomeLiveTopInfo.SingleRoom) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_room_title, item.title)
setGone(R.id.iv_room_tag, item.isRecommend && onceLookStatus)
}
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.uid)
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_RECENT_CARD_CLICK,
"最近在看卡片点击",
mapOf("room_id" to item.erbanNo)
)
}
}
}

View File

@@ -0,0 +1,128 @@
package com.nnbc123.app.home.adapter;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.nnbc123.app.R;
import com.nnbc123.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
import com.nnbc123.app.ui.widget.magicindicator.buildins.UIUtil;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.DrawableIndicator;
import java.util.List;
public class HomeMagicIndicatorAdapter extends CommonNavigatorAdapter {
private final List<? extends CharSequence> mTitleList;
private int textSize = 20;
private float minScale = 0.7f;
protected int mNormalColor = Color.BLACK;
protected int mSelectedColor = Color.BLACK;
private boolean showIndicator = true;
private int resId = R.drawable.home_bg_indicator;
public HomeMagicIndicatorAdapter(Context context, List<? extends CharSequence> charSequences ) {
this.mTitleList = charSequences;
}
@Override
public int getCount() {
return mTitleList == null ? 0 : mTitleList.size();
}
@Override
public IPagerTitleView getTitleView(Context context, final int i) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
scaleTransitionPagerTitleView.setNormalColor(mNormalColor);
scaleTransitionPagerTitleView.setSelectedColor(mSelectedColor);
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
scaleTransitionPagerTitleView.setAutoResetPivot(true);
int padding = UIUtil.dip2px(context, 6);
scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
scaleTransitionPagerTitleView.setText(mTitleList.get(i));
scaleTransitionPagerTitleView.setOnClickListener(view -> {
if (mOnItemSelectListener != null) {
mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView);
}
});
return scaleTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
if (!showIndicator) return null;
DrawableIndicator indicator = new DrawableIndicator(context);
indicator.setMode(DrawableIndicator.MODE_MATCH_EDGE);
indicator.setIndicatorDrawable(context.getResources().getDrawable(resId));
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, UIUtil.dip2px(context, 28));
lp.gravity = Gravity.CENTER_VERTICAL;
indicator.setLayoutParams(lp);
return indicator;
}
public void setResId(int resId) {
this.resId = resId;
}
public int getTextSize() {
return textSize;
}
public void setTextSize(int textSize) {
this.textSize = textSize;
}
public float getMinScale() {
return minScale;
}
public void setMinScale(float minScale) {
this.minScale = minScale;
}
public int getSelectedColor() {
return mSelectedColor;
}
public void setSelectedColor(int selectedColor) {
mSelectedColor = selectedColor;
}
public int getNormalColor() {
return mNormalColor;
}
public void setNormalColor(int normalColor) {
mNormalColor = normalColor;
}
public boolean isShowIndicator() {
return showIndicator;
}
public void setShowIndicator(boolean showIndicator) {
this.showIndicator = showIndicator;
}
private OnItemSelectListener mOnItemSelectListener;
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position, TextView view);
}
}

View File

@@ -0,0 +1,48 @@
package com.nnbc123.app.home.adapter
import android.view.View
import android.widget.ImageView
import androidx.core.view.isVisible
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadAvatar
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.utils.subAndReplaceDot2
import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.bannerview.BaseViewHolder
/**
* Created by Max on 2023/12/18 19:02
* Desc:
**/
class HomePartyMessageAdapter : BaseBannerAdapter<GiftServiceMsgVo>() {
var clickListener: ((GiftServiceMsgVo) -> Unit)? = null
override fun bindData(
holder: BaseViewHolder<GiftServiceMsgVo>,
item: GiftServiceMsgVo,
position: Int,
pageSize: Int
) {
holder.setText(R.id.tv_nick_send, item.senderNick.subAndReplaceDot2(4))
holder.setText(R.id.tv_nick_receiver, item.receiverNick.subAndReplaceDot2(4))
holder.setText(R.id.tv_gift_name, item.giftName.subAndReplaceDot2(4))
holder.setText(R.id.tv_gift_num, "x${item.giftNum}")
holder.findViewById<ImageView>(R.id.iv_avatar_send).loadAvatar(item.senderAvatar)
holder.findViewById<ImageView>(R.id.iv_avatar_receiver).loadAvatar(item.receiverAvatar)
holder.findViewById<ImageView>(R.id.iv_gift).load(item.giftPicUrl)
val arrowView = holder.findViewById<View>(R.id.iv_arrow)
arrowView.isVisible = !item.isLock
arrowView.setOnClickListener {
clickListener?.invoke(item)
}
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.home_party_item_message
}
fun getItem(position: Int): GiftServiceMsgVo? {
return mList.getOrNull(position)
}
}

View File

@@ -1,7 +1,5 @@
package com.nnbc123.app.home.adapter
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
@@ -10,34 +8,38 @@ import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
class PartyHotAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_party_hot) {
/**
* Created by Max on 2023/12/18 18:33
* Desc:
**/
class HomePartyRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_party_room_item) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
getView<ImageView>(R.id.iv_cover).load(item.avatar)
setText(R.id.tv_online_number, "${item.onlineNum}")
setText(R.id.tv_room_title, item.title)
setText(R.id.tv_name, item.title)
setGone(R.id.iv_tag, !item.tagPict.isNullOrEmpty())
getView<ImageView>(R.id.iv_tag).load(item.tagPict)
setGone(R.id.iv_pk, item.isCrossPking)
val borderView = getView<ImageView>(R.id.iv_cover_border)
if (item.backgroundPic.isNullOrEmpty()) {
borderView.setImageDrawable(null)
} else {
borderView.load(item.backgroundPic, defaultRes = null)
}
}
helper.setGone(R.id.tv_in_pk, item.isCrossPking)
helper.setGone(R.id.tv_tag_content, !TextUtils.isEmpty(item.iconContent))
.setText(R.id.tv_tag_content, item.iconContent)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4),
helper.getView(R.id.iv_avatar_5)
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
}

View File

@@ -1,88 +0,0 @@
package com.nnbc123.app.home.adapter
import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Shader
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.makeramen.roundedimageview.RoundedImageView
import com.nnbc123.app.R
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.utils.TextUtils
import com.nnbc123.core.utils.ifNullOrEmpty
/**
* create by lvzebiao @2019/11/13
*/
class HomePlayAdapter : BaseMultiItemQuickAdapter<HomeRoomInfo, BaseViewHolder>(null) {
init {
addItemType(HomeRoomInfo.TYPE_ROOM, R.layout.item_home_play)
addItemType(HomeRoomInfo.TYPE_BANNER, R.layout.item_room_banner)
addItemType(HomeRoomInfo.TYPE_BROADCAST, R.layout.item_home_play_broadcast)
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
if (item.itemType == HomeRoomInfo.TYPE_ROOM ||
item.itemType == HomeRoomInfo.TYPE_BROADCAST
) {
helper.setText(R.id.tv_room_title, item.title)
helper.setGone(R.id.iv_room_tag, !TextUtils.isEmptyText(item.tagPict))
ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_room_tag), item.tagPict)
helper.setText(R.id.tv_online_number, "${item.onlineNum}")
val tvMgName = helper.getView<TextView>(R.id.tv_mg_name)
tvMgName.text = item.mgName.ifNullOrEmpty { "扩列交友" }
if (item.mgName.isNullOrEmpty()) {
setGradient(tvMgName, "#FF8C5FFF", "#FFFF969B")
} else {
setGradient(tvMgName, "#FF61C4FE", "#FFA979FF")
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
val ivRoomImage = helper.getView<RoundedImageView>(R.id.iv_room_image)
ImageLoadUtilsV2.loadAvatar(ivRoomImage, item.avatar)
ivRoomImage.borderColor =
Color.parseColor(if (item.gender == 1) "#CCD7FF" else "#FFD0D0")
if (item.itemType == HomeRoomInfo.TYPE_BROADCAST) {
helper.setText(R.id.tv_broad_msg, item.broadMsg)
} else {
helper.setBackgroundRes(
R.id.view_bg,
if (item.gender == 1) R.drawable.bg_home_play_item_man else R.drawable.bg_home_play_item_woman
)
}
} else {
BannerHelper.setBanner(helper.getView(R.id.roll_view), item.bannerVoList)
}
}
private fun setGradient(textView: TextView, startColor: String, endColor: String) {
val endX = textView.paint.textSize * textView.text.length
val linearGradient = LinearGradient(
0f, 0f, endX, 0f,
Color.parseColor(startColor),
Color.parseColor(endColor),
Shader.TileMode.CLAMP
)
textView.paint.shader = linearGradient
textView.invalidate()
}
}

View File

@@ -1,91 +0,0 @@
package com.nnbc123.app.home.adapter;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.nnbc123.app.R;
import com.nnbc123.app.avroom.activity.AVRoomActivity;
import com.nnbc123.app.ui.utils.ImageLoadUtils;
import com.nnbc123.core.home.bean.HomeTabMapInfo;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
/**
* <p> 首页热门adapter </p>
*
* @author Administrator
* @date 2017/11/16
*/
public class HomeRoomFragmentAdapter extends BaseMultiItemQuickAdapter<HomeTabMapInfo, BaseViewHolder> {
private Context mContext;
/**
* 校验跳转房间的频率
*/
public HomeRoomFragmentAdapter(Context context) {
super(null);
addItemType(HomeTabMapInfo.TYPE_NORMAL, R.layout.item_home_tab_map);
addItemType(HomeTabMapInfo.TYPE_EMPTY, R.layout.item_erban_grid_empty);
this.mContext = context;
}
protected void convert(@NonNull BaseViewHolder helper, HomeTabMapInfo item) {
if (item == null) {
return;
}
switch (helper.getItemViewType()) {
case HomeTabMapInfo.TYPE_NORMAL:
helper.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_TJ_ROOM_SUCCESS, "首页_进入推荐房间");
AVRoomActivity.startForFromType(mContext, item.getRoomUid(), AVRoomActivity.FROM_TYPE_RECOMMEND);
}
});
helper.setText(R.id.tv_online_number, item.getOnlineNum() + "")
.setText(R.id.tv_title, item.getTitle());
//注意这里有三个标签,展示优先级 PK中>自定义>房间标签
helper.setGone(R.id.tv_tag_in_pk, item.isCrossPking());
helper.setGone(R.id.tv_tag_content, !TextUtils.isEmpty(item.getIconContent()) && !item.isCrossPking())
.setText(R.id.tv_tag_content, item.getIconContent());
ImageView mIvTabLabel = helper.getView(R.id.iv_tab_label);
if (!TextUtils.isEmpty(item.getTagPict()) && !item.isCrossPking() && TextUtils.isEmpty(item.getIconContent())) {
mIvTabLabel.setVisibility(View.VISIBLE);
ImageLoadUtils.loadAvatarBig(item.getTagPict(), mIvTabLabel);
} else {
mIvTabLabel.setVisibility(View.GONE);
}
ImageView ivCover = helper.getView(R.id.iv_cover);
if (!TextUtils.isEmpty(item.getAvatar())) {
ImageLoadUtils.loadAvatarBig(item.getAvatar(), ivCover, R.drawable.default_cover);
} else {
GlideApp.with(mContext)
.load(R.drawable.default_cover)
.placeholder(R.drawable.default_cover)
.into(ivCover);
}
break;
case HomeTabMapInfo.TYPE_EMPTY:
break;
}
}
}

View File

@@ -1,51 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isVisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.opensource.svgaplayer.SVGAImageView
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadFromAssets
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.TextUtils
/**
* create by lvzebiao @2019/11/13
* 人气主播更多
*/
class MoreSingleAnchorAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_home_single_anchor_more) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
val ivPking = helper.getView<SVGAImageView>(R.id.iv_pking)
val ivTag = helper.getView<ImageView>(R.id.iv_tag)
ivPking.isVisible = item.isCrossPking
ivTag.isVisible = !TextUtils.isEmptyText(item.tagPict) && !item.isCrossPking
if (item.isCrossPking) {
ivPking.loadFromAssets("svga/single_room_pking.svga")
} else {
ivTag.load(item.tagPict)
}
helper.setText(R.id.tv_online_num, item.onlineNum.toString())
.setText(R.id.tv_nickname, item.nick)
.setText(R.id.tv_room_name, item.title)
.setImageResource(
R.id.iv_gender,
if (item.gender == 1) R.drawable.ic_gender_male else R.drawable.ic_gender_female
)
helper.getView<ImageView>(R.id.iv_room_avatar)
.load(item.avatar, 12f, R.drawable.default_cover)
helper.itemView.setOnClickListener {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_ZB_TAB_ROOM_SUCCESS, "直播tab进入房间成功")
AVRoomActivity.start(mContext, item.uid)
}
}
}

View File

@@ -1,55 +0,0 @@
package com.nnbc123.app.home.adapter
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
class RoomCommonAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_room_common) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_online_number, "${item.onlineNum}")
setText(R.id.tv_room_title, item.title)
}
helper.setGone(R.id.tv_in_pk, item.isCrossPking)
helper.setGone(R.id.iv_room_tag, !TextUtils.isEmpty(item.tagPict))
ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_room_tag), item.tagPict)
helper.setGone(R.id.tv_tag_content, !TextUtils.isEmpty(item.iconContent))
.setText(R.id.tv_tag_content, item.iconContent)
helper.getView<View>(R.id.view_bg).setBackgroundResource(
when (helper.layoutPosition % 3) {
0 -> R.drawable.bg_home_common_item0
1 -> R.drawable.bg_home_common_item1
else -> R.drawable.bg_home_common_item2
}
)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4),
helper.getView(R.id.iv_avatar_5)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
}

View File

@@ -1,64 +0,0 @@
package com.nnbc123.app.home.adapter
import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Shader
import android.widget.ImageView
import android.widget.TextView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
class RoomGameAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_room_game) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_room_title, item.title)
itemView.setOnClickListener {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_MINI_GAME_ROOM_SUCCESS, "小游戏tab进入房间成功")
AVRoomActivity.start(mContext, item.uid)
}
val tvRoomGame = helper.getView<TextView>(R.id.tv_room_game)
tvRoomGame.text = item.mgName
helper.setText(R.id.tv_game_status, if (item.state == 1) "游戏中" else "等人中")
setGradient(tvRoomGame)
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
private fun setGradient(textView: TextView) {
val endX = textView.paint.textSize * textView.text.length
val linearGradient = LinearGradient(
0f, 0f, endX, 0f,
Color.parseColor("#FF61C4FE"),
Color.parseColor("#FFA979FF"),
Shader.TileMode.CLAMP
)
textView.paint.shader = linearGradient
textView.invalidate()
}
}

View File

@@ -1,62 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.TextUtils
class RoomHotAdapter : BaseMultiItemQuickAdapter<HomeRoomInfo, BaseViewHolder>(null) {
init {
addItemType(HomeRoomInfo.TYPE_ROOM, R.layout.item_room_hot)
addItemType(HomeRoomInfo.TYPE_BROADCAST, R.layout.item_room_hot)
addItemType(HomeRoomInfo.TYPE_BANNER, R.layout.item_room_banner)
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
if (item.itemType != HomeRoomInfo.TYPE_BANNER) {
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_RM_ROOM_SUCCESS, "热门进入房间")
}
helper.getView<ImageView>(R.id.iv_room_image).load(item.avatar,round = 8f)
helper.setText(R.id.tv_online_number, "${item.onlineNum}")
helper.setText(R.id.tv_room_title, item.title)
helper.setText(R.id.tv_id, "ID:${item.erbanNo}")
helper.setVisible(R.id.tv_in_pk, item.isCrossPking)
helper.setVisible(R.id.iv_room_tag, !TextUtils.isEmptyText(item.tagPict))
helper.getView<ImageView>(R.id.iv_room_tag).load(item.tagPict)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
} else {
BannerHelper.setBanner(helper.getView(R.id.roll_view), item.bannerVoList)
}
}
}

View File

@@ -1,59 +0,0 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.TextUtils
class RoomLikeAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.item_room_like) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.roomAvatar)
setText(R.id.tv_online_number, "${item.roomOnlineNum}")
setText(R.id.tv_room_title, item.roomName)
setText(R.id.tv_id, "ID:${item.erbanNo}")
}
helper.setVisible(R.id.tv_in_pk, item.isCrossPking)
helper.setVisible(R.id.iv_room_tag, !TextUtils.isEmptyText(item.tagPict))
ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_room_tag), item.tagPict)
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.roomUid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_SCFJ_ROOM_SUCCESS, "成功进入收藏的房间")
}
if (item.isValid) {
helper.setGone(R.id.tv_online_number, true)
helper.setBackgroundRes(R.id.view_bg, R.drawable.bg_home_like_item)
helper.setBackgroundRes(R.id.view_room_cover, R.drawable.bg_home_common_avatar)
} else {
helper.setGone(R.id.tv_online_number, false)
helper.setBackgroundRes(R.id.view_bg, R.drawable.bg_home_like_item_disable)
helper.setBackgroundRes(R.id.view_room_cover, R.drawable.bg_home_common_avatar_disable)
}
}
}

View File

@@ -1,111 +0,0 @@
package com.nnbc123.app.home.adapter
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.view.isVisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.user.UserInfoActivity
import com.nnbc123.app.ui.utils.ImageLoadUtilsV2
import com.nnbc123.app.ui.utils.loadAvatar
import com.nnbc123.app.ui.utils.loadFromAssets
import com.nnbc123.app.vip.VipHelper
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.CurrentTimeUtils
import com.nnbc123.core.utils.StarUtils
import com.nnbc123.core.utils.TextUtils
import com.nnbc123.core.utils.ifNullOrEmpty
import com.opensource.svgaplayer.SVGAImageView
import java.util.*
class RoomNewFriendsAdapter :
BaseQuickAdapter<UserInfo, BaseViewHolder>(R.layout.item_room_new_friends) {
override fun convert(helper: BaseViewHolder, item: UserInfo) {
val userGamePartnerInfo = item.userGamePartnerVo
if (userGamePartnerInfo != null) {
helper.getView<AppCompatImageView>(R.id.iv_game).visibility = View.VISIBLE
helper.getView<LinearLayout>(R.id.ll_game_type).visibility = View.VISIBLE
if (TextUtils.isEmptyText(userGamePartnerInfo.secondGameName)) {
helper.setText(R.id.tv_game_type, userGamePartnerInfo.firstGameName)
} else {
helper.setText(
R.id.tv_game_type,
"${userGamePartnerInfo.firstGameName}|${userGamePartnerInfo.secondGameName}"
)
}
ImageLoadUtilsV2.loadImage(
helper.getView(R.id.iv_game_icon),
userGamePartnerInfo.firstLogo
)
} else {
helper.getView<AppCompatImageView>(R.id.iv_game).visibility = View.GONE
helper.getView<LinearLayout>(R.id.ll_game_type).visibility = View.GONE
}
helper.getView<ImageView>(R.id.iv_avatar).loadAvatar(item.avatar)
helper.setText(R.id.tv_desc, item.userDesc.ifNullOrEmpty { "我是个默认签名" })
.setText(
R.id.tv_age,
((CurrentTimeUtils.getCurrentTime() - item.birth) / 1000 / 60 / 60 / 24 / 365).toString()
)
//设置星座
val star = StarUtils.getConstellation(Date(item.birth))
helper.setGone(R.id.tv_constellation, star != null)
.setText(R.id.tv_constellation, star)
helper.setBackgroundRes(
R.id.ll_gender_age,
if (item.gender == 1) R.drawable.shape_65d3f7_corner else R.drawable.shape_ff9cce_corner
)
helper.setImageResource(
R.id.iv_gender,
if (item.gender == 1) R.drawable.ic_home_man else R.drawable.ic_home_woman
)
val tvOnlineText = helper.getView<TextView>(R.id.tv_online_text)
val ivTalk = helper.getView<AppCompatImageView>(R.id.iv_talk)
val svgaLiving = helper.getView<SVGAImageView>(R.id.svga_living)
val llOnline = helper.getView<View>(R.id.ll_online)
val viewOnline = helper.getView<View>(R.id.view_online)
if (item.inRoomUid != 0L) {
ivTalk.isVisible = false
svgaLiving.isVisible = true
viewOnline.isVisible = true
svgaLiving.loadFromAssets("svga/home_living.svga")
tvOnlineText.text = "直播中"
llOnline.setOnClickListener {
AVRoomActivity.start(mContext, item.inRoomUid)
}
} else {
ivTalk.isVisible = true
svgaLiving.isVisible = false
viewOnline.isVisible = false
tvOnlineText.text = "和TA聊"
llOnline.setOnClickListener {
NimP2PMessageActivity.start(mContext, item.uid.toString())
}
}
helper.getView<View>(R.id.iv_avatar).setOnClickListener {
UserInfoActivity.Companion.start(mContext, item.uid)
}
val tvNickname = helper.getView<TextView>(R.id.tv_nickname)
tvNickname.text = item.nick
VipHelper.loadVipNickColor(tvNickname, item.userVipInfoVO, "#282828")
VipHelper.loadVipIcon(helper.getView(R.id.iv_vip_icon), item.userVipInfoVO)
}
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
super.onViewAttachedToWindow(holder)
val svgaLiving = holder.getView<SVGAImageView>(R.id.svga_living)
svgaLiving?.loadFromAssets("svga/home_living.svga")
}
}

View File

@@ -1,65 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.view.View
import androidx.databinding.DataBindingUtil
import com.nnbc123.core.DemoCache
import com.nnbc123.core.UriProvider
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseFragment
import com.nnbc123.app.databinding.FragmentHomeBinding
import com.nnbc123.app.home.helper.OpenRoomHelper
import com.nnbc123.app.ui.search.SearchActivity
import com.nnbc123.app.ui.webview.CommonWebViewActivity
/**
* 音萌首页
*/
class HomeFragment : BaseFragment(), View.OnClickListener {
private lateinit var mBinding: FragmentHomeBinding
override fun onClick(v: View) {
when (v.id) {
R.id.tv_search -> {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_SEARCH, "进入搜索页")
SearchActivity.start(activity)
//为啥触发条件这么恶心 我也不知道啊
if (DemoCache.readAnchorCardView() == 0) {
DemoCache.saveAnchorCardView(1)
}
}
R.id.iv_ranking -> {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_RANK_CLICK, "首页_榜单")
CommonWebViewActivity.start(mContext, UriProvider.getRanking())
}
R.id.iv_my_room -> {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_MY_ROOM_CLICK, "首页_我的房间")
OpenRoomHelper.openRoom(baseActivity)
}
}
}
override fun getRootLayoutId(): Int {
return R.layout.fragment_home
}
override fun onFindViews() {
mBinding = DataBindingUtil.bind(mView)!!
}
override fun onSetListener() {
mBinding.click = this
}
@SuppressLint("CheckResult")
override fun initiate() {
requireActivity().supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, RecommendFragment.newInstance())
.commitAllowingStateLoss()
}
}

View File

@@ -1,104 +0,0 @@
package com.nnbc123.app.home.fragment
import com.nnbc123.app.base.BaseFragment
import androidx.recyclerview.widget.RecyclerView
import com.nnbc123.app.home.adapter.HomePlayAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import org.greenrobot.eventbus.EventBus
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.app.avroom.activity.AVRoomActivity
import android.annotation.SuppressLint
import com.nnbc123.core.home.model.GameHomeModel
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import com.nnbc123.core.user.event.LoadLoginUserInfoEvent
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.app.home.fragment.HomePlayFragment
import android.os.Bundle
import android.view.View
import com.chad.library.adapter.base.BaseQuickAdapter
import com.nnbc123.app.R
/**
* create by lvzebiao @2020/1/7
*/
class HomePlayFragment : BaseFragment() {
private var recyclerView: RecyclerView? = null
private lateinit var playAdapter: HomePlayAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
override fun getRootLayoutId(): Int {
return R.layout.fragment_home_play
}
override fun initiate() {
recyclerView = mView.findViewById(R.id.recycler_view)
EventBus.getDefault().register(this)
playAdapter = HomePlayAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(playAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setRecyclerView(recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.build()
playAdapter.onItemClickListener =
BaseQuickAdapter.OnItemClickListener { _: BaseQuickAdapter<*, *>, _: View, position: Int ->
val homePlayInfo = playAdapter.getItem(position)
if (homePlayInfo != null) {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_KH_ROOM_SUCCESS, "点击组队开黑进入房间")
AVRoomActivity.startForFromType(
mContext,
homePlayInfo.uid,
AVRoomActivity.FROM_TYPE_RECOMMEND
)
}
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
@SuppressLint("CheckResult")
private fun loadData(refresh: Boolean) {
GameHomeModel.get().homePlayV2
.compose(bindToLifecycle())
.subscribe { homePlayInfoList: List<HomeRoomInfo>?, throwable: Throwable? ->
if (throwable != null) {
rvDelegate.loadErr(refresh)
} else {
rvDelegate.loadData(homePlayInfoList?.filter { !it.isBanner }, refresh)
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onLoadLoginUserInfoEvent(event: LoadLoginUserInfoEvent?) {
if (isResumed) loadData(true)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
override fun onDestroyView() {
EventBus.getDefault().unregister(this)
super.onDestroyView()
}
companion object {
fun newInstance(): HomePlayFragment {
val fragment = HomePlayFragment()
val bundle = Bundle()
fragment.arguments = bundle
return fragment
}
}
}

View File

@@ -1,192 +0,0 @@
package com.nnbc123.app.home.fragment;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.nnbc123.core.home.bean.HomeTabMapInfo;
import com.nnbc123.core.home.event.RefreshHomeDataEvent;
import com.nnbc123.core.home.model.GameHomeModel;
import com.nnbc123.core.utils.net.RxHelper;
import com.nnbc123.app.R;
import com.nnbc123.app.base.BaseFragment;
import com.nnbc123.app.home.adapter.HomeRoomFragmentAdapter;
import com.nnbc123.library.utils.ListUtils;
import com.trello.rxlifecycle3.android.FragmentEvent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
/**
*
*/
public class HomeTabHomeFragment extends BaseFragment {
public static final int ROWS = 3;
private static final Comparator<HomeTabMapInfo> comp = (o1, o2) -> {
int seq = o1.getSeq() - o2.getSeq();
return Integer.compare(seq, 0);
};
private RecyclerView recyclerView;
private HomeRoomFragmentAdapter mHomeRoomAdapter;
@NonNull
public static HomeTabHomeFragment newInstance() {
HomeTabHomeFragment fragment = new HomeTabHomeFragment();
return fragment;
}
@Override
public int getRootLayoutId() {
return R.layout.fragment_home_room_tab;
}
@Override
public void onFindViews() {
super.onFindViews();
recyclerView = mView.findViewById(R.id.recycler_view);
initRecyclerView();
}
/**
* 请求数据
*/
@SuppressLint("CheckResult")
private void getData() {
GameHomeModel.get()
.getHomeTabHome()
.compose(RxHelper.handleSchedulers())
.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.subscribe((serviceResult, throwable) -> {
if (throwable == null) {
if (ListUtils.isListEmpty(serviceResult)) {
return;
}
List<HomeTabMapInfo> roomsList = new ArrayList<>(serviceResult);//未处理的数
List<HomeTabMapInfo> randomList = new ArrayList<>();//不是置顶的
List<HomeTabMapInfo> finalList = new ArrayList<>();//最终的6条数据
for (int i = 0; i < roomsList.size(); i++) {
roomsList.get(i).setItemType(HomeTabMapInfo.TYPE_NORMAL);//对原始数据设置type
}
for (int i = 0; i < roomsList.size(); i++) {
if (roomsList.get(i).isIsTop()) {
finalList.add(roomsList.get(i));
} else {
randomList.add(roomsList.get(i));
}
}
sortSeqRoom(finalList);
refreshRoomData(finalList, randomList);
}
});
}
/**
* 刷新数据
*/
private void refreshRoomData(List<HomeTabMapInfo> finalList, List<HomeTabMapInfo> randomList) {
List<HomeTabMapInfo> finalList1 = new ArrayList<>(finalList);//最终的6条数据
List<HomeTabMapInfo> randomList1 = new ArrayList<>(randomList);//不是置顶的
mHomeRoomAdapter.setNewData(getConvertData(finalList1, randomList1));
}
private void initRecyclerView() {
recyclerView.setLayoutManager(new LinearLayoutManager(getContext(),LinearLayoutManager.HORIZONTAL,false));
recyclerView.setItemAnimator(null);
mHomeRoomAdapter = new HomeRoomFragmentAdapter(getContext());
mHomeRoomAdapter.setEnableLoadMore(false);
mHomeRoomAdapter.setEnableLoadMore(false);
recyclerView.setAdapter(mHomeRoomAdapter);
View emptyView = getLayoutInflater().inflate(R.layout.layout_home_room_empty, null);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
emptyView.setLayoutParams(lp);
mHomeRoomAdapter.setEmptyView(emptyView);
}
/**
* 转化房间数组不足6的加上虚位以待
*
* @param
* @return
*/
private List<HomeTabMapInfo> getConvertData(List<HomeTabMapInfo> finalList, List<HomeTabMapInfo> randomList) {
List<HomeTabMapInfo> finalList1 = new ArrayList<>(finalList);//最终的6条数据
List<HomeTabMapInfo> randomList1 = new ArrayList<>(randomList);//不是置顶的
int ROOM_COUNT = 6;//首页显示6条数据
randomList1 = randomList(randomList1);
finalList1.addAll(randomList1);
if (finalList1.size() >= ROOM_COUNT) {
finalList1 = finalList1.subList(0, ROOM_COUNT);
} else {
while (finalList1.size() < ROOM_COUNT) {
HomeTabMapInfo info = new HomeTabMapInfo();
info.setItemType(HomeTabMapInfo.TYPE_EMPTY);
finalList1.add(info);
}
}
return finalList1;
}
/**
* **************************** 排序 ***********************************
*/
private void sortSeqRoom(List<HomeTabMapInfo> list) {
if (list.size() == 0) {
return;
}
Collections.sort(list, comp);
}
private List<HomeTabMapInfo> randomList(List<HomeTabMapInfo> sourceList) {
if (sourceList == null || sourceList.size() == 0) {
return sourceList;
}
ArrayList randomList = new ArrayList(sourceList.size());
do {
int randomIndex = Math.abs(new Random().nextInt(sourceList.size()));
randomList.add(sourceList.remove(randomIndex));
} while (sourceList.size() > 0);
return randomList;
}
@Override
public void initiate() {
getData();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onRefreshHomeDataEvent(RefreshHomeDataEvent event) {
if (isResumed()) getData();
}
}

View File

@@ -1,185 +0,0 @@
package com.nnbc123.app.home.fragment
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.scwang.smartrefresh.layout.internal.ProgressDrawable
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.databinding.FragmentLiveBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomeLiveTopAdapter
import com.nnbc123.app.home.adapter.PartyMagicIndicatorAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.room.bean.HomeLiveTopInfo
import com.nnbc123.core.room.bean.SingleRoomSortInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.CurrentTimeUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* 音萌首页
*/
class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
PartyMagicIndicatorAdapter.OnItemSelectListener {
private val mFragments: ArrayList<Fragment> = ArrayList()
private val mTabInfoList: ArrayList<String> = ArrayList()
private var currentIndex = 0
private var lastLoadDataTime = 0L
private lateinit var mAdapter: HomeLiveTopAdapter
private lateinit var rvDelegate: RVDelegate<HomeLiveTopInfo.SingleRoom>
private val homeViewModel: HomeViewModel by activityViewModels()
companion object {
fun newInstance(): LiveFragment {
val args = Bundle()
val fragment = LiveFragment()
fragment.arguments = args
return fragment
}
}
override fun init() {
mAdapter = HomeLiveTopAdapter()
rvDelegate = RVDelegate.Builder<HomeLiveTopInfo.SingleRoom>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false))
.setRecyclerView(binding.recyclerView)
.build()
initRefreshView()
homeViewModel.singleRoomSortInfoLiveData.observe(
viewLifecycleOwner
) {
if (it.isSuccess) {
it.data?.let { date -> onGetSingleRoomSortInfoSuccess(date) }
}
}
homeViewModel.homeLiveTopInfoLiveData.observe(viewLifecycleOwner) {
it?.let {
mAdapter.setOnceLookStatus(it.onceLookStatus)
rvDelegate.loadData(it.singleRoomList, true)
binding.tvTitle.text = if (it.onceLookStatus) "曾经看过的人" else "Top热播"
}
}
binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_GEBO_TAB_CLICK,
"个播页二级tab分类点击",
mapOf("tab_name" to mTabInfoList.getOrElse(position) { "未知tab" })
)
}
})
}
override fun onResume() {
super.onResume()
loadData()
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_RECENT_CARD_SHOW, "最近在看卡片曝光"
)
}
private fun onGetSingleRoomSortInfoSuccess(info: List<SingleRoomSortInfo>) {
var changed = false
val oldTabInfoList: List<CharSequence> = ArrayList<CharSequence>(mTabInfoList)
for (tagInfo in info) {
if (!oldTabInfoList.contains(tagInfo.sortName)) {
changed = true
break
}
}
//只有HomeTagInfo发生改变才刷新数据
if (changed) {
mTabInfoList.clear()
mFragments.clear()
for (tagInfo in info) {
mTabInfoList.add(tagInfo.sortName)
val fragment = RoomSingleFragment.newInstance(tagInfo.id)
mFragments.add(fragment)
}
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
commonNavigator.titleMargin = ScreenUtil.dip2px(2.0F)
commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL)
val magicIndicatorAdapter = PartyMagicIndicatorAdapter(mTabInfoList)
magicIndicatorAdapter.textSize = 14
magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.navigator = commonNavigator
binding.viewPager.offscreenPageLimit = 2
binding.viewPager.adapter = RoomVPAdapter(
childFragmentManager,
mFragments
)
ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager)
onItemSelect(currentIndex, null)
}
}
private fun initRefreshView() {
binding.refreshLayout.setOnRefreshListener {
binding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
binding.refreshLayout.isEnableLoadmore = false
binding.refreshLayout.isEnableOverScrollBounce = false
val themeColor = requireContext().resources.getColor(R.color.color_666666)
binding.refreshHeader.lastUpdateText.setTextColor(themeColor)
binding.refreshHeader.titleText.setTextColor(themeColor)
binding.refreshHeader.setBackgroundColor(Color.TRANSPARENT)
val progressDrawable = ProgressDrawable()
progressDrawable.setColor(themeColor)
binding.refreshHeader.progressView.setImageDrawable(progressDrawable)
}
override fun onItemSelect(position: Int, view: TextView?) {
currentIndex = position
binding.viewPager.currentItem = currentIndex
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
private fun loadData() {
if (CurrentTimeUtils.getCurrentTime() - lastLoadDataTime < 15 * 1000) return
lastLoadDataTime = CurrentTimeUtils.getCurrentTime()
homeViewModel.requestSingleRoomSortList()
homeViewModel.requestHomeLiveTopInfo()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -2,7 +2,6 @@ package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.content.Intent
import android.text.TextUtils
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
@@ -31,15 +30,14 @@ import com.nnbc123.app.home.activity.VisitorListActivity
import com.nnbc123.app.home.adapter.MeCenterAdapter
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.home.helper.OpenRoomHelper
import com.nnbc123.app.qiyukefu.CustomerServerHelper
import com.nnbc123.app.skill.activity.SkillHomeActivity
import com.nnbc123.app.skill.activity.SkillHomeActivity.Companion.start
import com.nnbc123.app.support.LevelIconHelper
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.patriarch.PatriarchModeActivity
import com.nnbc123.app.ui.pay.ChargeActivity
import com.nnbc123.app.ui.relation.AttentionListActivity
import com.nnbc123.app.ui.relation.FansListActivity
import com.nnbc123.app.ui.utils.ImageLoadUtils
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.OnPageSelectedListener
import com.nnbc123.app.utils.UserUtils
@@ -57,12 +55,10 @@ import com.nnbc123.core.room.bean.RoomInfo
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.user.UserModel
import com.nnbc123.core.user.bean.UserExpInfo
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.user.event.LoginUserInfoUpdateEvent
import com.nnbc123.core.utils.CurrentTimeUtils
import com.nnbc123.core.utils.StarUtils
import com.nnbc123.core.utils.net.BeanObserver
import com.nnbc123.core.utils.toast
import com.trello.rxlifecycle3.android.FragmentEvent
import io.reactivex.Observable
@@ -241,12 +237,15 @@ class MeFragment : BaseFragment(), View.OnClickListener {
override fun onResume() {
super.onResume()
if (!isHidden) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_SHOW, "我的")
}
if (mUserInfo?.isReview == true) {
requestUpdateUserInfo()
}
initUserDate()
}
@SuppressLint("CheckResult")
private fun initUserDate() {
UserModel.get().currentUserInfo
@@ -274,7 +273,11 @@ class MeFragment : BaseFragment(), View.OnClickListener {
if (it.isParentMode) {
mBinding.meItemSkill.isVisible = false
}
it.userHeadwear?.effect?.let { effect ->
var avatarBorder = it.userHeadwear?.effect
if (avatarBorder.isNullOrEmpty()) {
avatarBorder = it.userHeadwear?.pic
}
avatarBorder?.let { effect ->
if (mBinding.ivHeadWear.tag != effect) {
NobleUtil.loadHeadWear(effect, mBinding.ivHeadWear)
mBinding.ivHeadWear.tag = effect
@@ -436,7 +439,8 @@ class MeFragment : BaseFragment(), View.OnClickListener {
UriProvider.getTutuRealNamePage()
)
R.id.tv_me_service -> {
CustomerServerHelper.contactCustomerServer(mContext)
NimP2PMessageActivity.start(requireContext(), "200014")
// CustomerServerHelper.contactCustomerServer(mContext)
}
R.id.tv_user_id -> {
mUserInfo?.let {

View File

@@ -17,6 +17,8 @@ import com.nnbc123.app.ui.im.friend.FriendListFragment
import com.nnbc123.app.ui.im.recent.RecentListFragment
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import org.greenrobot.eventbus.EventBus
/**
@@ -42,6 +44,13 @@ class MsgFragment : BaseViewBindingFragment<FragmentMsgBinding>(),
binding.viewPager.currentItem = currentIndex
}
override fun onResume() {
super.onResume()
if (!isHidden) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_SHOW, "消息")
}
}
override fun init() {
val tagList = arrayListOf("消息", "好友")
mFragments.clear()

View File

@@ -1,156 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import android.widget.TextView
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.coorchice.library.utils.LogUtils
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseFragment
import com.nnbc123.app.databinding.FragmentPartyBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.home.bean.HomeTagInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* 音萌首页
*/
class PartyFragment : BaseFragment(), MainMagicIndicatorAdapter.OnItemSelectListener {
private lateinit var mBinding: FragmentPartyBinding
private val mFragments: ArrayList<Fragment> = ArrayList()
private val mTabInfoList: ArrayList<CharSequence> = ArrayList()
private val homeViewModel: HomeViewModel by activityViewModels()
private var currentIndex = 0
companion object {
fun newInstance(): PartyFragment {
val args = Bundle()
val fragment = PartyFragment()
fragment.arguments = args
return fragment
}
}
override fun getRootLayoutId(): Int {
return R.layout.fragment_party
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
override fun onFindViews() {
mBinding = DataBindingUtil.bind(mView)!!
}
override fun initiate() {
homeViewModel.tagLiveData.observe(this) {
it?.let {
onGetHomeTagSuccess(it)
}
}
homeViewModel.partyBannerLiveData.observe(this) {
BannerHelper.setBanner(mBinding.rollView, it) { _, _ ->
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_BANNER_CLICK, "首页_banner")
}
}
}
override fun onResume() {
super.onResume()
homeViewModel.getTagInfo()
homeViewModel.getPartyBanner()
}
private fun onGetHomeTagSuccess(tagInfoList: MutableList<HomeTagInfo>) {
tagInfoList.add(0,HomeTagInfo("热门"))
var changed = false
val oldTabInfoList: List<CharSequence> = ArrayList<CharSequence>(mTabInfoList)
for (tagInfo in tagInfoList) {
if (!oldTabInfoList.contains(tagInfo.name)) {
changed = true
break
}
}
//只有HomeTagInfo发生改变才刷新数据
if (changed) {
LogUtils.e("$changed:oldTabInfoList")
mTabInfoList.clear()
mFragments.clear()
for (i in tagInfoList.indices) {
//过滤对象是空和没有标签名同时也没有子标签的情况
var title: CharSequence?
var fragment: Fragment?
var name = tagInfoList[i].name
if (name != null) {
name = name.trim { it <= ' ' }
}
title = name
mTabInfoList.add(title)
val tabId: Int = tagInfoList[i].id
fragment = when (title) {
"热门" -> {
PartyRecommendFragment.newInstance()
}
"喜欢" -> {
RoomLikeFragment.newInstance()
}
"小游戏" -> {
RoomGameFragment.newInstance()
}
else -> {
RoomCommonFragment.newInstance(tabId)
}
}
mFragments.add(fragment)
}
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true)
commonNavigator.titleMargin = ScreenUtil.dip2px(6.0F)
val magicIndicatorAdapter = MainMagicIndicatorAdapter(context, mTabInfoList)
magicIndicatorAdapter.textSize = 16
magicIndicatorAdapter.minScale = 0.85f
magicIndicatorAdapter.setResId(R.drawable.ic_home_indicator_center)
magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter
mBinding.magicIndicator.navigator = commonNavigator
mBinding.viewPager.offscreenPageLimit = 2
mBinding.viewPager.adapter = RoomVPAdapter(
childFragmentManager,
mFragments
)
ViewPagerHelper.bind(mBinding.magicIndicator, mBinding.viewPager)
onItemSelect(currentIndex, null)
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) homeViewModel.getTagInfo()
}
override fun onItemSelect(position: Int, view: TextView?) {
currentIndex = position
mBinding.viewPager.currentItem = currentIndex
}
}

View File

@@ -1,113 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentPartyHotBinding
import com.nnbc123.app.databinding.FragmentRoomCommonBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.PartyHotAdapter
import com.nnbc123.app.home.adapter.RoomCommonAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class PartyRecommendFragment : BaseViewBindingFragment<FragmentPartyHotBinding>() {
companion object {
fun newInstance(): PartyRecommendFragment {
val args = Bundle()
val fragment = PartyRecommendFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var mAdapter: PartyHotAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private lateinit var mMoreAdapter: RoomCommonAdapter
private lateinit var rvMoreDelegate: RVDelegate<HomeRoomInfo>
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
mAdapter = PartyHotAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mAdapter)
.setLayoutManager(GridLayoutManager(mContext, 2, GridLayoutManager.VERTICAL, false))
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无房间"))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerView)
.build()
mAdapter.setOnItemClickListener { _, _, position ->
mAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.roomUid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "通用tab进入房间成功")
}
}
mMoreAdapter = RoomCommonAdapter()
rvMoreDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mMoreAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无房间"))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerMoreView)
.build()
mMoreAdapter.setOnItemClickListener { _, _, position ->
mMoreAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "通用tab进入房间成功")
}
}
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
homeViewModel.partyRecommendRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
homeViewModel.partyRecommendRoomMoreLiveData.observe(this) {
rvMoreDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
binding.refreshLayout.isRefreshing = isRefresh
homeViewModel.getPartyRecommendRoomList()
homeViewModel.getPartyRecommendRoomMoreList()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,345 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager.widget.ViewPager
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRecommendBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.GiftServiceAdapter
import com.nnbc123.app.home.adapter.HomeSingleAnchorAdapter
import com.nnbc123.app.home.adapter.MainMagicIndicatorAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.NewFriendsFilterWindow
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.scwang.smartrefresh.layout.internal.ProgressDrawable
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.util.concurrent.TimeUnit
/**
* 音萌首页
*/
class RecommendFragment : BaseFragment(),
MainMagicIndicatorAdapter.OnItemSelectListener {
private lateinit var mBinding: FragmentRecommendBinding
private var mFragmentsBottom: MutableList<Fragment> = ArrayList()
private lateinit var singleAnchorAdapter: HomeSingleAnchorAdapter
private lateinit var giftServiceAdapter: GiftServiceAdapter
private lateinit var rvDelegate: RVDelegate<GiftServiceMsgVo>
private var disposable: Disposable? = null
private val homeViewModel: HomeViewModel by activityViewModels()
private var currGender: Int? = null
//仅埋点使用,不影响业务逻辑
private val abcArray = arrayOf("A", "B", "C", "D")
private var currMatchClick = abcArray[0]
companion object {
fun newInstance(): RecommendFragment {
val args = Bundle()
val fragment = RecommendFragment()
fragment.arguments = args
return fragment
}
}
override fun getRootLayoutId(): Int {
return R.layout.fragment_recommend
}
override fun onFindViews() {
mBinding = DataBindingUtil.bind(mView)!!
}
override fun onResume() {
super.onResume()
loadData()
homeViewModel.getServiceGiftRecord()
}
@SuppressLint("SetTextI18n")
override fun initiate() {
initRefreshView()
initTitleTab()
//initSingleAnchor()
giftServiceAdapter = GiftServiceAdapter()
giftServiceAdapter.setOnItemClickListener { _, _, position ->
giftServiceAdapter.getItem(position)?.let {
AVRoomActivity.start(mContext, it.roomUid)
}
}
rvDelegate = RVDelegate.Builder<GiftServiceMsgVo>()
.setAdapter(giftServiceAdapter)
.setRecyclerView(mBinding.rvGiftService)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(LinearLayoutManager(mContext))
.build()
homeViewModel.bannerLiveData.observe(this) {
BannerHelper.setBanner(mBinding.rollView, it) { _, _ ->
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_BANNER_CLICK, "首页_banner")
}
}
homeViewModel.resourceLiveData.observe(this) {
if (it.isNullOrEmpty() || it.size != 4) {
mBinding.llResource.isGone = true
return@observe
}
mBinding.llResource.isGone = false
val resourceViews = arrayOf(
mBinding.ivResource0,
mBinding.ivResource1,
mBinding.ivResource2,
mBinding.ivResource3
)
for (i in resourceViews.indices) {
resourceViews[i].load(it[i].icon)
if (it[i].resourceType == 8) {
mBinding.tvOnlineNum.text = "${it[i].resourceContent}人组队中"
}
resourceViews[i].setOnClickListener { _ ->
currMatchClick = abcArray[i]
StatisticManager.Instance().onEvent(
"${currMatchClick}_match_click",
"资源位点击",
mapOf("user_id" to AuthModel.get().currentUid.toString())
)
when {
it[i].resourceType == 5 -> {
CommonWebViewActivity.start(context, it[i].resourceContent)
}
i == 3 -> {
dialogManager.showProgressDialog(mContext)
homeViewModel.getHomeChatPick()
}
else -> {
dialogManager.showProgressDialog(mContext)
homeViewModel.getResourceJumpInfo(it[i].id)
}
}
}
}
}
homeViewModel.resourceJumpLiveData.observe(this) {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
StatisticManager.Instance().onEvent(
"${currMatchClick}_match_success",
"资源位匹配成功",
mapOf("user_id" to AuthModel.get().currentUid.toString())
)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}
homeViewModel.homeChatPickLiveData.observe(viewLifecycleOwner) {
dialogManager.dismissDialog()
it?.let {
if (it.isNotEmpty()) {
NimP2PMessageActivity.start(context, it)
}
}
}
homeViewModel.giftServiceLiveData.observe(viewLifecycleOwner) {
rvDelegate.loadData(it)
}
mBinding.rvGiftService.setOnTouchListener { _, _ -> true }
disposable = Observable.intervalRange(0, Int.MAX_VALUE.toLong(), 0, 5, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.filter { rvDelegate.adapter.itemCount > 0 && isResumed }
.subscribe {
val index = (it % rvDelegate.adapter.itemCount).toInt()
if (index == 0) {
mBinding.rvGiftService.scrollToPosition(index)
} else {
mBinding.rvGiftService.smoothScrollToPosition(index)
}
}
mBinding.tvNewRefresh.setOnClickListener {
homeViewModel.getNewFriendList(currGender)
}
mBinding.tvNewFilter.setOnClickListener {
val popup = NewFriendsFilterWindow(
mContext,
mBinding.tvNewFilter.text.toString()
)
popup.setOnClickListener {
popup.dismiss()
when (it.id) {
R.id.tv_all -> {
homeViewModel.getNewFriendList()
mBinding.tvNewFilter.text = "全部"
currGender = null
}
R.id.tv_man -> {
homeViewModel.getNewFriendList(1)
mBinding.tvNewFilter.text = "男生"
currGender = 1
}
R.id.tv_woman -> {
homeViewModel.getNewFriendList(2)
mBinding.tvNewFilter.text = "女生"
currGender = 2
}
}
}
popup.show(mBinding.tvNewFilter, Gravity.BOTTOM)
}
}
private fun initRefreshView() {
mBinding.refreshLayout.setOnRefreshListener {
mBinding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
val themeColor = requireContext().resources.getColor(R.color.color_666666)
mBinding.refreshHeader.lastUpdateText.setTextColor(themeColor)
mBinding.refreshHeader.titleText.setTextColor(themeColor)
mBinding.refreshHeader.setBackgroundColor(Color.TRANSPARENT)
val progressDrawable = ProgressDrawable()
progressDrawable.setColor(themeColor)
mBinding.refreshHeader.progressView.setImageDrawable(progressDrawable)
}
private fun initTitleTab() {
val tagList = arrayListOf("发现新朋友", "组队开黑")
mFragmentsBottom.add(RoomNewFriendsFragment.newInstance())
mFragmentsBottom.add(HomePlayFragment.newInstance())
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true)
val magicIndicatorAdapter = MainMagicIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setResId(R.drawable.ic_home_indicator_center)
magicIndicatorAdapter.textSize = 16
magicIndicatorAdapter.minScale = 0.85f
magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter
mBinding.magicIndicator.navigator = commonNavigator
commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
mBinding.viewPager.offscreenPageLimit = 5
mBinding.viewPager.adapter =
RoomVPAdapter(childFragmentManager, mFragmentsBottom)
ViewPagerHelper.bind(mBinding.magicIndicator, mBinding.viewPager)
mBinding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
mBinding.tvNewRefresh.isVisible = position == 0
mBinding.tvNewFilter.isVisible = position == 0
}
override fun onPageScrollStateChanged(state: Int) {
}
})
}
private fun initSingleAnchor() {
singleAnchorAdapter = HomeSingleAnchorAdapter()
mBinding.rvSingleAnchor.adapter = singleAnchorAdapter
val layoutManager =
GridLayoutManager(requireContext(), 4, LinearLayoutManager.VERTICAL, false)
mBinding.rvSingleAnchor.layoutManager = layoutManager
homeViewModel.singleAnchorHomeLiveData.observe(this) {
if (it.data.isNullOrEmpty()) {
mBinding.llSingleAnchor.visibility = View.GONE
mBinding.rvSingleAnchor.visibility = View.GONE
} else {
mBinding.llSingleAnchor.visibility = View.VISIBLE
mBinding.rvSingleAnchor.visibility = View.VISIBLE
}
singleAnchorAdapter.setNewData(it.data)
}
}
override fun onItemSelect(position: Int, view: TextView?) {
if (mFragmentsBottom.isEmpty()) {
return
}
mBinding.tvNewRefresh.isVisible = position == 0
mBinding.tvNewFilter.isVisible = position == 0
mBinding.viewPager.currentItem = position
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_TJ_TABEXCHANGE, "用户切换tab次数,热门房间or组队开黑")
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
private fun loadData() {
homeViewModel.getHomeResource()
homeViewModel.getBannerInfo()
//homeViewModel.getHomeSingleAnchorList()
}
override fun onDestroyView() {
super.onDestroyView()
disposable?.dispose()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -1,100 +0,0 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomCommonBinding
import com.nnbc123.app.home.RoomCommonViewModel
import com.nnbc123.app.home.adapter.RoomCommonAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomCommonFragment : BaseViewBindingFragment<FragmentRoomCommonBinding>() {
companion object {
fun newInstance(tabID: Int): RoomCommonFragment {
val args = Bundle()
args.putInt("tab_id", tabID)
val fragment = RoomCommonFragment()
fragment.arguments = args
return fragment
}
}
private val tabID: Int by lazy { arguments?.getInt("tab_id") ?: -1 }
private var pageNum: Int = 1
private val pageSize = 20
private lateinit var mAdapter: RoomCommonAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private val roomCommonViewModel: RoomCommonViewModel by viewModels()
override fun init() {
mAdapter = RoomCommonAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(20)
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无房间"))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerView)
.build()
mAdapter.setOnItemClickListener { _, _, position ->
mAdapter.getItem(position)?.let {
AVRoomActivity.start(context, it.roomUid)
StatisticManager.Instance()
.onEvent("tab${tabID}_success_room", "通过派对tab下面的房间成功进房的统计")
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "通用tab进入房间成功")
}
}
mAdapter.setOnLoadMoreListener({
loadData(false)
}, binding.recyclerView)
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
roomCommonViewModel.commonRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
binding.refreshLayout.isRefreshing = isRefresh
pageNum = if (isRefresh) 1 else (pageNum + 1)
roomCommonViewModel.getCommonRoom(tabID, pageNum, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,98 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomGameBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.RoomGameAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomGameFragment : BaseViewBindingFragment<FragmentRoomGameBinding>() {
companion object {
fun newInstance(): RoomGameFragment {
val args = Bundle()
val fragment = RoomGameFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var roomHotAdapter: RoomGameAdapter
private var page = 1
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private val pageSize = 20
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
roomHotAdapter = RoomGameAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(LinearLayoutManager(mContext))
.setRefreshLayout(binding.refreshLayout)
.setPageSize(pageSize)
.build()
roomHotAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
homeViewModel.gameRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
binding.tvMatch.setOnClickListener {
homeViewModel.fastPickGameRoom()
}
homeViewModel.pickRoomLiveData.observe(this) {
it?.let {
AVRoomActivity.start(mContext, it.uid)
}
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
binding.refreshLayout.isRefreshing = isRefresh
if (isRefresh) {
page = 1
} else {
page++
}
homeViewModel.getGameRoom(page, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,75 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomHotBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.RoomHotAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomHotFragment : BaseViewBindingFragment<FragmentRoomHotBinding>() {
companion object {
fun newInstance(): RoomHotFragment {
val args = Bundle()
val fragment = RoomHotFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var roomHotAdapter : RoomHotAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private var page = 1
private val pageSize = Int.MAX_VALUE
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
roomHotAdapter = RoomHotAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(pageSize)
.build()
homeViewModel.hotRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
homeViewModel.getHotRoom(page, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,135 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.appbar.AppBarLayout
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomLikeBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomeConcernsAdapter
import com.nnbc123.app.home.adapter.RoomLikeAdapter
import com.nnbc123.app.ui.relation.AttentionListActivity
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomLikeFragment : BaseViewBindingFragment<FragmentRoomLikeBinding>() {
companion object {
fun newInstance(): RoomLikeFragment {
val args = Bundle()
val fragment = RoomLikeFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var concernsAdapter : HomeConcernsAdapter
private lateinit var likeRvDelegate: RVDelegate<HomeRoomInfo>
private lateinit var mAdapter : RoomLikeAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private var pageNum = 1
private val pageSize = 20
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
binding.appBarLayout.addOnOffsetChangedListener(
AppBarLayout.OnOffsetChangedListener { _, verticalOffset ->
binding.refreshLayout.isEnabled = verticalOffset == 0
})
concernsAdapter = HomeConcernsAdapter()
likeRvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(concernsAdapter)
.setRecyclerView(binding.rvLike)
.setLayoutManager(GridLayoutManager(mContext,5, GridLayoutManager.VERTICAL, false))
.build()
homeViewModel.concernsLiveData.observe(this) {
likeRvDelegate.setNewData(it)
val isGone = concernsAdapter.data.isNullOrEmpty()
binding.tvMore.isGone = isGone
binding.tvLike.isGone = isGone
binding.rvLike.isGone = isGone
}
mAdapter = RoomLikeAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(pageSize)
.setRefreshLayout(binding.refreshLayout)
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暂无收藏"))
.setRecyclerView(binding.rvCollect)
.build()
homeViewModel.collectLiveData.observe(this) {
rvDelegate.loadData(it)
}
mAdapter.setOnLoadMoreListener({
loadData(false)
}, binding.rvCollect)
binding.refreshLayout.setOnRefreshListener {
loadData(true)
}
homeViewModel.emptyLiveData.observe(this) {
it?.let {
binding.refreshLayout.isRefreshing = false
binding.clEmpty.isVisible = it
binding.coordinatorLayout.isVisible = !it
}
}
binding.tvGoPlay.setOnClickListener {
(parentFragment as PartyFragment).onItemSelect(1, null)
}
binding.tvMore.setOnClickListener {
AttentionListActivity.start(context)
}
}
override fun onResume() {
super.onResume()
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
if (isRefresh) {
pageNum = 1
binding.refreshLayout.isRefreshing = true
} else {
pageNum++
}
homeViewModel.getCollectRoom(pageNum, pageSize)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,45 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomHotBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.RoomNewFriendsAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.user.bean.UserInfo
class RoomNewFriendsFragment : BaseViewBindingFragment<FragmentRoomHotBinding>() {
companion object {
fun newInstance(): RoomNewFriendsFragment {
val args = Bundle()
val fragment = RoomNewFriendsFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var roomHotAdapter: RoomNewFriendsAdapter
private lateinit var rvDelegate: RVDelegate<UserInfo>
private val homeViewModel: HomeViewModel by activityViewModels()
override fun init() {
roomHotAdapter = RoomNewFriendsAdapter()
rvDelegate = RVDelegate.Builder<UserInfo>()
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无新朋友"))
.setLayoutManager(LinearLayoutManager(mContext))
.build()
homeViewModel.getNewFriendList()
homeViewModel.newFriendLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
}

View File

@@ -1,86 +0,0 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.nnbc123.app.base.BaseViewBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.FragmentRoomSingleBinding
import com.nnbc123.app.home.RoomSingleViewModel
import com.nnbc123.app.home.adapter.MoreSingleAnchorAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.utils.CurrentTimeUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class RoomSingleFragment : BaseViewBindingFragment<FragmentRoomSingleBinding>() {
companion object {
fun newInstance(id: Long?): RoomSingleFragment {
val args = Bundle()
if (id != null) {
args.putLong("id", id)
}
val fragment = RoomSingleFragment()
fragment.arguments = args
return fragment
}
}
private lateinit var adapter: MoreSingleAnchorAdapter
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
private val pageSize = Int.MAX_VALUE
private val roomSingleViewModel: RoomSingleViewModel by viewModels()
private var lastLoadDataTime = 0L
private val id: Long? by lazy { requireArguments().getLong("id") }
override fun init() {
adapter = MoreSingleAnchorAdapter()
rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(adapter)
.setRecyclerView(binding.recyclerView)
.setRefreshLayout(binding.refreshLayout)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无房间"))
.setLayoutManager(GridLayoutManager(mContext, 2))
.setPageSize(pageSize)
.build()
binding.refreshLayout.setOnRefreshListener { loadData(true) }
roomSingleViewModel.singleAnchorMoreLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
override fun onResume() {
super.onResume()
loadData(false)
}
private fun loadData(isForce: Boolean) {
if (!isForce && CurrentTimeUtils.getCurrentTime() - lastLoadDataTime < 15 * 1000) return
lastLoadDataTime = CurrentTimeUtils.getCurrentTime()
binding.refreshLayout.isRefreshing = true
roomSingleViewModel.getMoreSingleAnchorList(id)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(false)
}
}

View File

@@ -0,0 +1,114 @@
package com.nnbc123.app.home.fragment.home
import android.graphics.Color
import android.view.Gravity
import android.widget.LinearLayout
import androidx.viewpager.widget.ViewPager
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.chuhai.utils.ktx.singleClick
import com.gyf.immersionbar.ImmersionBar
import com.nnbc123.app.R
import com.nnbc123.app.avroom.adapter.RoomVPAdapter
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.databinding.HomeFragmentBinding
import com.nnbc123.app.home.adapter.HomeMagicIndicatorAdapter
import com.nnbc123.app.home.fragment.home.friends.FriendsFragment
import com.nnbc123.app.home.fragment.home.party.PartyFragment
import com.nnbc123.app.home.helper.OpenRoomHelper
import com.nnbc123.app.ui.search.SearchActivity
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.DemoCache
import com.nnbc123.core.UriProvider
import com.nnbc123.core.initial.InitialModel
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
/**
* Created by Max on 2023/12/18 17:51
* Desc:首页
**/
@ActLayoutRes(R.layout.home_fragment)
class HomeFragment : BaseBindingFragment<HomeFragmentBinding>() {
override fun initiate() {
ImmersionBar.with(this).titleBarMarginTop(mBinding.vTitleBarTop).init()
initTab()
initEvent()
}
override fun onResume() {
super.onResume()
if (!isHidden) {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_SHOW, "首页")
}
}
private fun initEvent() {
mBinding.ivMyRoom.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_MY_ROOM_CLICK)
OpenRoomHelper.openRoom(baseActivity)
}
mBinding.ivRanking.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_RANK_CLICK)
CommonWebViewActivity.start(mContext, UriProvider.getRanking())
}
mBinding.tvSearch.singleClick {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_SEARCH_CLICK)
SearchActivity.start(activity)
//为啥触发条件这么恶心 我也不知道啊
if (DemoCache.readAnchorCardView() == 0) {
DemoCache.saveAnchorCardView(1)
}
}
}
private fun initTab() {
val tagList = arrayListOf("派对", "交友")
val fragmentList = listOf(PartyFragment(), FriendsFragment())
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true)
commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL)
val magicIndicatorAdapter = HomeMagicIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setOnItemSelectListener { position, view ->
mBinding.viewPager.currentItem = position
}
magicIndicatorAdapter.normalColor = Color.parseColor("#696D7A")
magicIndicatorAdapter.selectedColor = Color.parseColor("#2B2D33")
commonNavigator.adapter = magicIndicatorAdapter
mBinding.magicIndicator.navigator = commonNavigator
commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
mBinding.viewPager.offscreenPageLimit = 5
mBinding.viewPager.adapter =
RoomVPAdapter(childFragmentManager, fragmentList)
ViewPagerHelper.bind(mBinding.magicIndicator, mBinding.viewPager)
mBinding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_TBA_CLICK, "${position + 1}")
}
override fun onPageScrollStateChanged(state: Int) {
}
})
InitialModel.get().cacheInitInfo?.defaultTab?.let {
val tab = it - 1
if (tab >= 0 && tab < tagList.size) {
mBinding.viewPager.currentItem = tab
}
}
}
}

View File

@@ -0,0 +1,236 @@
package com.nnbc123.app.home.fragment.home.friends
import android.view.Gravity
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.widget.dialog.DialogManager
import com.nnbc123.app.databinding.HomeFriendsFragmentBinding
import com.nnbc123.app.home.FriendsViewModel
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomeFriendsGameTabAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.NewFriendsFilterWindow
import com.nnbc123.core.UriProvider
import com.nnbc123.core.bean.response.observeResult
import com.nnbc123.core.pay.PayModel
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.net.ServerException
import com.nnbc123.library.annatation.ActLayoutRes
import com.scwang.smartrefresh.layout.listener.OnRefreshListener
/**
* Created by Max on 2023/12/18 17:59
* Desc:交友
**/
@ActLayoutRes(R.layout.home_friends_fragment)
class FriendsFragment : BaseBindingFragment<HomeFriendsFragmentBinding>() {
private val homeViewModel: HomeViewModel by activityViewModels()
private val viewModel: FriendsViewModel by activityViewModels()
private val tabAdapter = HomeFriendsGameTabAdapter()
// 过滤条件:性别
private var filterGender: Int? = null
// 过滤条件游戏ID
private val filterGameId: Long? get() = tabAdapter.selectGameId
private var genderPopup: NewFriendsFilterWindow? = null
override fun initiate() {
initResource()
initFilterTab()
mBinding.tvGender.singleClick {
showFilterGender()
}
mBinding.tvRefresh.singleClick {
viewModel.getNewFriendList(filterGender, filterGameId)
}
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
mBinding.refreshLayout.setOnRefreshListener { view ->
mBinding.refreshLayout.finishRefresh()
loadData(true)
childFragmentManager.fragments.forEach {
if (it is OnRefreshListener) {
it.onRefresh(view)
}
}
}
childFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, FriendsListFragment())
.commitAllowingStateLoss()
}
private fun initFilterTab() {
mBinding.rvTab.adapter = tabAdapter
tabAdapter.setOnItemClickListener { adapter, view, position ->
tabAdapter.selectItem(position)
refreshListData()
}
viewModel.gameTabLiveData.observe(viewLifecycleOwner)
{
if (!it.isNullOrEmpty()) {
tabAdapter.setNewData(it)
}
}
}
private fun initResource() {
mBinding.ivResourceMatch.singleClick {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_MATCH_CLICK)
dialogManager.showProgressDialog(mContext)
viewModel.getHomeChatPick()
}
viewModel.resourceJumpLiveData.observeResult(this, success = {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}, failed = {
dialogManager.dismissDialog()
if ((it as? ServerException)?.code == PayModel.NOT_REAL_NAME_BEFORE_CHARGING) {
dialogManager.showTipsDialog(getString(R.string.tips_need_to_certification),
getString(R.string.go_to_certification),
object : DialogManager.AbsOkDialogListener() {
override fun onOk() {
// 跳去实名认证页面
CommonWebViewActivity.start(
this@FriendsFragment.context,
UriProvider.getTutuRealNamePage()
)
}
})
} else {
toast(it.message)
}
})
viewModel.homeChatPickLiveData.observe(viewLifecycleOwner) {
dialogManager.dismissDialog()
it?.let {
if (it.isNotEmpty()) {
NimP2PMessageActivity.start(context, it)
}
}
}
homeViewModel.resourceLiveData.observe(this) {
// 资源位5
it.getOrNull(4)?.let { item ->
mBinding.groupResource.isVisible = true
mBinding.ivResource0.load(item.icon)
mBinding.ivResource0.singleClick {
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_TOP_RESOURCE_CLICK,
"E"
)
when (item.resourceType) {
5 -> {
CommonWebViewActivity.start(context, item.resourceContent)
}
else -> {
dialogManager.showProgressDialog(mContext)
viewModel.getResourceJumpInfo(item.id)
}
}
}
}
}
}
private fun showFilterGender() {
genderPopup = NewFriendsFilterWindow(
mContext,
mBinding.tvGender.text.toString()
).apply {
setOnClickListener {
dismiss()
when (it.id) {
R.id.tv_all -> {
updateGender(null)
refreshListData()
}
R.id.tv_man -> {
updateGender(1)
refreshListData()
}
R.id.tv_woman -> {
updateGender(2)
refreshListData()
}
}
}
}
genderPopup?.show(mBinding.tvGender, Gravity.BOTTOM)
}
private fun updateGender(gender: Int?) {
filterGender = gender
when (gender) {
1 -> {
mBinding.tvGender.text = "男生"
}
2 -> {
mBinding.tvGender.text = "女生"
}
else -> {
mBinding.tvGender.text = "全部"
}
}
}
override fun onResume() {
super.onResume()
loadData(false)
}
override fun onDestroy() {
super.onDestroy()
if (genderPopup?.isShowing == true) {
genderPopup?.dismiss()
genderPopup = null
}
}
private fun loadData(resetFilter: Boolean) {
if (resetFilter) {
// 重置条件
updateGender(null)
tabAdapter.selectItem(null)
}
if (viewModel.gameTabLiveData.value.isNullOrEmpty()) {
viewModel.getHomeGameTab()
}
if (homeViewModel.resourceLiveData.value.isNullOrEmpty()) {
// 和派对页共用数据了,派对页会刷新,这里不需要再刷新了
homeViewModel.getHomeResource()
}
refreshListData()
}
private fun refreshListData() {
viewModel.getNewFriendList(filterGender, filterGameId)
}
}

View File

@@ -0,0 +1,134 @@
package com.nnbc123.app.home.fragment.home.friends
import android.graphics.Rect
import android.view.LayoutInflater
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chuhai.utils.UiUtils
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.databinding.HomeFriendsListFragmentBinding
import com.nnbc123.app.home.FriendsViewModel
import com.nnbc123.app.home.adapter.HomeFriendsUserAdapter
import com.nnbc123.app.ui.user.UserInfoActivity
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.library.annatation.ActLayoutRes
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.scwang.smartrefresh.layout.listener.OnRefreshListener
/**
* Created by Max on 2023/12/18 19:35
* Desc:
**/
@ActLayoutRes(R.layout.home_friends_list_fragment)
class FriendsListFragment : BaseBindingFragment<HomeFriendsListFragmentBinding>(),
OnRefreshListener {
private val adapter = HomeFriendsUserAdapter()
private val viewModel: FriendsViewModel by activityViewModels()
private var rvDelegate: RVDelegate<UserInfo>? = null
private var headerEmptyView: View? = null
private val recommendTitleView get() = headerEmptyView?.findViewById<View>(R.id.layout_title)
override fun initiate() {
initView()
initEvent()
initObserve()
}
private fun initView() {
val spanCount = 2
val listLeftRightPadding = UiUtils.dip2px(15f)
val itemLeftRightMargin = UiUtils.dip2px(4.5f)
mBinding.recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val pos = parent.getChildAdapterPosition(view) - adapter.headerLayoutCount
val remainder = pos % spanCount
if (pos < 0) {
outRect.set(0, 0, 0, 0)
} else if (remainder == 0) {
// 第一列
outRect.set(listLeftRightPadding, 0, itemLeftRightMargin, 0)
} else if (remainder == (spanCount - 1)) {
// 最后一列
outRect.set(itemLeftRightMargin, 0, listLeftRightPadding, 0)
} else {
// 中间
outRect.set(itemLeftRightMargin, 0, itemLeftRightMargin, 0)
}
}
})
rvDelegate = RVDelegate.Builder<UserInfo>()
.setAdapter(adapter)
.setRecyclerView(mBinding.recyclerView)
.setLayoutManager(GridLayoutManager(mContext, spanCount))
.build()
initEmptyView()
}
private fun initEmptyView() {
headerEmptyView = LayoutInflater.from(requireContext())
.inflate(R.layout.home_friends_list_item_empty, null)
}
private fun initEvent() {
adapter.setOnItemClickListener { adapter, view, position ->
(adapter.getItem(position) as? UserInfo)?.let { item ->
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_MORE_GAME_USER_CLICK,
item.uid.toString()
)
UserInfoActivity.Companion.start(mContext, item.uid)
}
}
}
private fun initObserve() {
viewModel.newFriendLiveData.observe(this) {
if (it.data.isNullOrEmpty()) {
if (adapter.headerLayoutCount == 0) {
adapter.addHeaderView(headerEmptyView)
adapter.headerLayout.clipChildren = false
}
val list = viewModel.friendRecommendModeLiveData.value?.data?.toMutableList()
recommendTitleView?.isVisible = !list.isNullOrEmpty()
adapter.setNewData(list)
} else {
adapter.removeAllHeaderView()
rvDelegate?.loadData(it)
}
}
viewModel.friendRecommendModeLiveData.observe(this) {
if (adapter.headerLayoutCount != 0) {
recommendTitleView?.isVisible = !it.data.isNullOrEmpty()
adapter.setNewData(it.data?.toMutableList())
}
}
}
override fun onResume() {
super.onResume()
if (viewModel.friendRecommendModeLiveData.value?.data.isNullOrEmpty()) {
viewModel.getFriendRecommendMore()
}
}
override fun onRefresh(refreshlayout: RefreshLayout?) {
if (isVisible && lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
// 刷新下更多推荐
viewModel.getFriendRecommendMore()
}
}
}

View File

@@ -0,0 +1,207 @@
package com.nnbc123.app.home.fragment.home.party
import android.os.Bundle
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.viewpager2.widget.ViewPager2
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.widget.dialog.DialogManager
import com.nnbc123.app.databinding.HomePartyFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.game_room.GameRoomActivity
import com.nnbc123.app.home.PartyViewModel
import com.nnbc123.app.home.adapter.HomePartyMessageAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.core.UriProvider
import com.nnbc123.core.bean.response.observeResult
import com.nnbc123.core.home.bean.BannerInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.im.custom.bean.RouterType
import com.nnbc123.core.pay.PayModel
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.core.utils.net.ServerException
import com.nnbc123.library.annatation.ActLayoutRes
import com.nnbc123.library.utils.JavaUtil
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/12/18 17:58
* Desc:派对
**/
@ActLayoutRes(R.layout.home_party_fragment)
class PartyFragment : BaseBindingFragment<HomePartyFragmentBinding>() {
private val homeViewModel: HomeViewModel by activityViewModels()
private val viewModel: PartyViewModel by activityViewModels()
//仅埋点使用,不影响业务逻辑
private val abcArray = arrayOf("A", "B", "C", "D")
private var currMatchClick = abcArray[0]
override fun initiate() {
initResource()
initHotMessage()
initBanner()
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
mBinding.refreshLayout.setOnRefreshListener {
mBinding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
childFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, PartyHotRoomFragment())
.commitAllowingStateLoss()
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
override fun onResume() {
super.onResume()
loadData()
}
private fun loadData() {
homeViewModel.getHomeResource()
viewModel.getBannerInfo()
viewModel.getServiceGiftRecord()
}
private fun initHotMessage() {
val adapter = HomePartyMessageAdapter()
adapter.clickListener = {
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_INFORM_CLICK,
it.roomUid.toString()
)
AVRoomActivity.start(mContext, it.roomUid)
}
mBinding.hotMessage.apply {
setOrientation(ViewPager2.ORIENTATION_VERTICAL)
setAdapter(adapter)
registerLifecycleObserver(lifecycle)
setUserInputEnabled(false)
}.create()
viewModel.giftServiceLiveData.observe(viewLifecycleOwner) {
if (it.isSuccess && !it.data.isNullOrEmpty()) {
mBinding.hotMessage.isVisible = true
mBinding.hotMessage.refreshData(it.data)
}
}
}
private fun initResource() {
mBinding.ivResourceMore.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_TOP_MORE_ROOM_CLICK)
GameRoomActivity.start(requireContext())
}
homeViewModel.resourceLiveData.observe(this) {
if (it.isNullOrEmpty()) {
mBinding.groupResource.isVisible = false
return@observe
}
mBinding.groupResource.isVisible = true
val resourceViews = arrayOf(
mBinding.ivResource0,
mBinding.ivResource1,
mBinding.ivResource2,
mBinding.ivResource3
)
for (i in resourceViews.indices) {
resourceViews[i].load(it[i].icon)
resourceViews[i].singleClick { _ ->
currMatchClick = abcArray[i]
StatisticManager.Instance().onEvent(
StatisticsProtocol.EVENT_HOMEPAGE_TOP_RESOURCE_CLICK,
currMatchClick
)
when (it[i].resourceType) {
5 -> {
CommonWebViewActivity.start(context, it[i].resourceContent)
}
else -> {
dialogManager.showProgressDialog(mContext)
viewModel.getResourceJumpInfo(it[i].id)
}
}
}
}
}
viewModel.resourceJumpLiveData.observeResult(this, success = {
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
AVRoomActivity.start(context, it.uid)
} else {
RecommendRoomDialog.newInstance(it).show(context)
}
}
}, failed = {
dialogManager.dismissDialog()
if ((it as? ServerException)?.code == PayModel.NOT_REAL_NAME_BEFORE_CHARGING) {
dialogManager.showTipsDialog(getString(R.string.tips_need_to_certification),
getString(R.string.go_to_certification),
object : DialogManager.AbsOkDialogListener() {
override fun onOk() {
// 跳去实名认证页面
CommonWebViewActivity.start(
this@PartyFragment.context,
UriProvider.getTutuRealNamePage()
)
}
})
} else {
toast(it.message)
}
})
}
private fun initBanner() {
viewModel.bannerLiveData.observe(this) {
BannerHelper.setBanner(mBinding.rollView, it) { _, data ->
var roomId: Long? = null
if (data.skipType == BannerInfo.SKIP_TYPE_ROUTER) {
if (JavaUtil.str2int(data.routerType) == RouterType.ROOM) {
roomId = JavaUtil.str2long(data.routerValue)
}
} else if (data.skipType == BannerInfo.SKIP_TYP_CHAT_ROOM) {
roomId = JavaUtil.str2long(data.skipUri)
}
if (roomId != null) {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_BANNER_CLICK, roomId.toString())
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -0,0 +1,75 @@
package com.nnbc123.app.home.fragment.home.party
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.HomePartyRoomFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.HomePartyRoomAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/12/18 19:35
* Desc:
**/
@ActLayoutRes(R.layout.home_party_room_fragment)
class PartyHotRoomFragment : BaseBindingFragment<HomePartyRoomFragmentBinding>() {
private val adapter = HomePartyRoomAdapter()
private val homeViewModel: HomeViewModel by activityViewModels()
override fun initiate() {
val rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(adapter)
.setRecyclerView(mBinding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.setLayoutManager(GridLayoutManager(context, 2))
.build()
adapter.setOnItemClickListener { _, _, position ->
adapter.getItem(position)?.let {
AVRoomActivity.start(context, it.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOMEPAGE_ROOM_CLICK, it.uid.toString())
}
}
homeViewModel.hotRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
homeViewModel.getHotRoom(1, Int.MAX_VALUE)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onResume() {
super.onResume()
loadData(true)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -89,10 +89,20 @@ public class OpenRoomHelper {
@NonNull
private static SpannableStringBuilder getCertificationTips(BaseActivity activity) {
String tips = activity.getString(R.string.tips_need_to_certification);
return getCertificationTips(activity, activity.getString(R.string.tips_need_to_certification_create_room));
}
@NonNull
private static SpannableStringBuilder getCertificationTips(BaseActivity activity, String actionName) {
String authentication = activity.getString(R.string.real_name_authentication);
String tips = activity.getString(R.string.tips_need_to_certification_format, actionName, authentication);
int actionStart = tips.indexOf(actionName);
int authenticationStart = tips.indexOf(authentication);
SpannableStringBuilder builder = new SpannableStringBuilder(tips);
builder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(activity, R.color.appColor)),
tips.length() - 4, tips.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
actionStart, actionStart + actionName.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
builder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(activity, R.color.appColor)),
authenticationStart, authenticationStart + authentication.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return builder;
}

View File

@@ -0,0 +1,107 @@
package com.nnbc123.app.home.refresh
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
import com.chuhai.utils.UiUtils
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.loadFromAssets
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
import com.scwang.smartrefresh.layout.api.RefreshHeader
import com.scwang.smartrefresh.layout.api.RefreshKernel
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.scwang.smartrefresh.layout.constant.RefreshState
import com.scwang.smartrefresh.layout.constant.SpinnerStyle
/**
* Created by Max on 2023/12/26 19:35
* Desc:
**/
class HomeRefreshHeader : FrameLayout, RefreshHeader {
private var svgaView: SVGAImageView? = null
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
constructor(
context: Context,
attrs: AttributeSet?,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attrs, defStyleAttr, defStyleRes)
init {
svgaView = SVGAImageView(context)
svgaView?.setImageResource(R.drawable.base_ic_refresh_header)
val size = UiUtils.dip2px(34f)
val layoutParams = LayoutParams(size, size)
layoutParams.gravity = Gravity.CENTER
addView(svgaView, layoutParams)
}
override fun onStateChanged(
refreshLayout: RefreshLayout?,
oldState: RefreshState?,
newState: RefreshState?
) {
}
override fun getView(): View {
return this
}
override fun getSpinnerStyle(): SpinnerStyle {
return SpinnerStyle.Translate
}
override fun setPrimaryColors(vararg colors: Int) {
}
override fun onInitialized(kernel: RefreshKernel?, height: Int, extendHeight: Int) {
}
override fun onHorizontalDrag(percentX: Float, offsetX: Int, offsetMax: Int) {
}
override fun onStartAnimator(layout: RefreshLayout?, height: Int, extendHeight: Int) {
if (svgaView?.drawable is SVGADrawable) {
svgaView?.startAnimation()
} else {
svgaView?.loadFromAssets("svga/refresh_header.svga")
}
}
override fun onFinish(layout: RefreshLayout?, success: Boolean): Int {
svgaView?.stopAnimation()
return 500
}
override fun isSupportHorizontalDrag(): Boolean {
return false
}
override fun onPullingDown(
percent: Float,
offset: Int,
headerHeight: Int,
extendHeight: Int
) {
}
override fun onReleasing(
percent: Float,
offset: Int,
headerHeight: Int,
extendHeight: Int
) {
}
}

View File

@@ -193,7 +193,8 @@ class AnchorCardView @JvmOverloads constructor(
}
}
private fun toggleAudio(list: List<String?>) {
private fun toggleAudio(list: List<String?>?) {
if (list == null) return
if (ListUtils.isListEmpty(list)) return
var url: String? = ""
for (s in list) {

View File

@@ -0,0 +1,24 @@
package com.nnbc123.app.home.widget
import android.content.Context
import android.util.AttributeSet
import com.zhpan.bannerview.BannerViewPager
/**
* Created by Max on 2023/12/21 17:52
* Desc:修复BannerViewPager高度模式为MeasureSpec.UNSPECIFIED导致的未复用问题
**/
class HomeBannerViewPager<T> : BannerViewPager<T> {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val hSize = MeasureSpec.getSize(heightMeasureSpec)
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(hSize, MeasureSpec.EXACTLY))
}
}

View File

@@ -21,6 +21,11 @@ import com.qiyukf.unicorn.api.YSFOptions;
import com.qiyukf.unicorn.api.YSFUserInfo;
import com.qiyukf.unicorn.api.customization.input.ActionPanelOptions;
import com.qiyukf.unicorn.api.customization.input.InputPanelOptions;
import com.qiyukf.unicorn.api.event.EventCallback;
import com.qiyukf.unicorn.api.event.EventProcessFactory;
import com.qiyukf.unicorn.api.event.SDKEvents;
import com.qiyukf.unicorn.api.event.UnicornEventBase;
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry;
import com.soundcloud.android.crop.UriUtil;
import java.util.ArrayList;
@@ -109,7 +114,17 @@ public class CustomerServerHelper {
options.uiCustomization.leftAvatar = uri.toString();
options.uiCustomization.titleCenter = true;
options.sdkEvents = new SDKEvents();
options.sdkEvents.eventProcessFactory = new EventProcessFactory() {
@Override
public UnicornEventBase eventOf(int i) {
if (i == 5) {
return new RequestPermissionEvent();
} else {
return null;
}
}
};
// appKey 可以在七鱼管理系统->设置->App 接入 页面找到
Unicorn.init(context, XChatConstants.QI_YU_KF_KEY, options, new GlideImageLoader(context));
Unicorn.initSdk();
@@ -133,5 +148,4 @@ public class CustomerServerHelper {
Unicorn.logout();
isInit = false;
}
}

View File

@@ -0,0 +1,133 @@
package com.nnbc123.app.qiyukefu
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import androidx.fragment.app.FragmentActivity
import com.chuhai.utils.ktx.asActivity
import com.nnbc123.app.R
import com.nnbc123.app.common.permission.PermissionHelper
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
import com.nnbc123.library.utils.ResUtil
import com.qiyukf.unicorn.api.event.EventCallback
import com.qiyukf.unicorn.api.event.UnicornEventBase
import com.qiyukf.unicorn.api.event.entry.RequestPermissionEventEntry
import com.tbruyelle.rxpermissions2.RxPermissions
/**
* Created by Max on 2024/1/4 11:10
* Desc:
**/
class RequestPermissionEvent : UnicornEventBase<RequestPermissionEventEntry> {
override fun onEvent(
p0: RequestPermissionEventEntry?,
p1: Context?,
p2: EventCallback<RequestPermissionEventEntry>?
) {
val tips = getPermissionTips(p0?.scenesType)
val activity = (p1?.asActivity() as? FragmentActivity)
val perms = p0?.permissionList?.toTypedArray()
if (RequestPermissionPromptDialog.isNeedPrompt()
&& tips != null
&& activity != null
&& perms != null
) {
val rxPermissions = RxPermissions(activity)
if (PermissionHelper.isAllGranted(rxPermissions, * perms)) {
p2?.onNotPorcessEvent()
} else {
RequestPermissionPromptDialog(p1, tips).show()
val d = rxPermissions.request(*perms).subscribe({ aBoolean: Boolean? ->
RequestPermissionPromptDialog.dismissCurrentDialog()
if (aBoolean == true) {
p2?.onProcessEventSuccess(p0)
} else {
showDeniedTips(p1, tips)
p2?.onInterceptEvent()
}
}) { obj: Throwable ->
RequestPermissionPromptDialog.dismissCurrentDialog()
obj.printStackTrace()
p2?.onNotPorcessEvent()
}
}
} else {
p2?.onNotPorcessEvent()
}
}
override fun onDenyEvent(p0: Context?, p1: RequestPermissionEventEntry?): Boolean {
if (p0 == null) {
return super.onDenyEvent(p0, p1)
}
val tips = getPermissionTips(p1?.scenesType)
return if (tips != null) {
showDeniedTips(p0, tips)
true
} else {
super.onDenyEvent(p0, p1)
}
}
/**
* 获取场景对应的权限提示信息不需要提示的权限返回null
*/
private fun getPermissionTips(scenesType: Int?): String? {
when (scenesType) {
RequestPermissionEventEntry.SCENES_TAKE_AUDIO -> {
return ResUtil.getString(R.string.permission_denied_tips_mic)
}
RequestPermissionEventEntry.SCENES_TAKE_VIDEO -> {
return StringBuffer().append("1.")
.append(ResUtil.getString(R.string.permission_denied_tips_camera))
.append("\n2.").append(ResUtil.getString(R.string.permission_denied_tips_mic))
.toString()
}
RequestPermissionEventEntry.SCENES_TAKE_PHOTO -> {
return ResUtil.getString(R.string.permission_denied_tips_camera)
}
RequestPermissionEventEntry.SCENES_SELECT_MEDIA,
RequestPermissionEventEntry.SCENES_SAVE_IMAGE,
RequestPermissionEventEntry.SCENES_SAVE_VIDEO,
RequestPermissionEventEntry.SCENES_SELECT_VIDEO,
RequestPermissionEventEntry.SCENES_SELECT_FILE,
RequestPermissionEventEntry.SCENES_SELECT_IMAGE,
RequestPermissionEventEntry.SCENES_VIDEO_CHAT -> {
return ResUtil.getString(R.string.permission_denied_tips_image)
}
else -> {
return null
}
}
}
private fun showDeniedTips(context: Context, message: String) {
CommonTipDialog(context).apply {
setTipMsg(message)
setOkText("去设置")
setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
val packageUri =
Uri.parse("package:${context.packageName}")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
)
(context as? Activity)?.startActivityForResult(
intent, 0
)
}
}
)
}.show()
}
}

View File

@@ -1,11 +1,22 @@
package com.nnbc123.app.skill
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import androidx.core.util.Consumer
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.common.permission.PermissionHelper.isAllGranted
import com.nnbc123.app.skill.dialog.SkillSelectionDialog
import com.nnbc123.app.skill.repository.SkillDataManager
import com.nnbc123.app.skill.repository.SkillModel
import com.nnbc123.app.skill.widget.*
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog.Companion.dismissCurrentDialog
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog.Companion.isNeedPrompt
import com.nnbc123.core.file.FileModel
import com.nnbc123.core.skill.entity.PropRefEntity
import com.nnbc123.core.skill.entity.PropsEntity
@@ -13,6 +24,7 @@ import com.nnbc123.core.skill.entity.SkillPostServerEntity
import com.nnbc123.core.skill.entity.SkillPropertyEntity
import com.nnbc123.core.skill.event.SkillEvent
import com.nnbc123.core.utils.toast
import com.nnbc123.library.utils.ResUtil
import org.greenrobot.eventbus.EventBus
import java.io.File
@@ -198,4 +210,53 @@ class SkillDataDelegate(private val skillView: SkillCardView, private val activi
activity.toast(th.message)
})
}
override fun requestMicPermissions(consumer: Consumer<Boolean>) {
super.requestMicPermissions(consumer)
val permissions = arrayOf(
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
val sb = StringBuffer()
sb.append("1.").append(ResUtil.getString(R.string.permission_denied_tips_mic))
.append("\n2.").append(ResUtil.getString(R.string.permission_denied_tips_image))
val tips = sb.toString()
if (isNeedPrompt()
&& !isAllGranted(activity.rxPermissions, *permissions)
) {
RequestPermissionPromptDialog(activity, tips).show()
}
activity.checkPermission(Consumer<Boolean> { isGranted: Boolean ->
dismissCurrentDialog()
if (isGranted) {
consumer.accept(true)
} else {
consumer.accept(false)
showPermissionDeniedTipsDialog(tips)
}
}, *permissions)
}
private fun showPermissionDeniedTipsDialog(message: String) {
val mPrivacyDialog = CommonTipDialog(activity)
mPrivacyDialog.setTipMsg(message)
mPrivacyDialog.setOkText("去设置")
mPrivacyDialog.setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
val packageUri = Uri.parse("package:" + activity.packageName)
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
)
activity.startActivityForResult(
intent, 0
)
}
}
)
mPrivacyDialog.show()
}
}

View File

@@ -8,12 +8,15 @@ import android.view.View
import com.netease.nim.uikit.StatusBarUtil
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseBindingActivity
import com.nnbc123.app.common.permission.PermissionHelper
import com.nnbc123.app.databinding.ActivitySkillEditBinding
import com.nnbc123.core.skill.entity.SkillPropertyEntity
import com.nnbc123.app.skill.repository.SkillDataManager
import com.nnbc123.app.skill.repository.SkillModel
import com.nnbc123.app.skill.widget.CARD_TYPE_AUDIO
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
import com.nnbc123.core.skill.entity.SkillPropertyEntity
import com.nnbc123.library.annatation.ActLayoutRes
import com.nnbc123.library.utils.ResUtil
@ActLayoutRes(R.layout.activity_skill_edit)
class AddSkillActivity : BaseBindingActivity<ActivitySkillEditBinding>() {
@@ -79,11 +82,24 @@ class AddSkillActivity : BaseBindingActivity<ActivitySkillEditBinding>() {
@SuppressLint("CheckResult")
private fun checkPermissionAndDeal(it: SkillPropertyEntity) {
checkPermission(
val tips = StringBuffer().append("1.")
.append(ResUtil.getString(R.string.permission_denied_tips_mic))
.append("\n2.").append(ResUtil.getString(R.string.permission_denied_tips_image))
.toString()
val params = arrayOf(
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
if (RequestPermissionPromptDialog.isNeedPrompt() && !PermissionHelper.isAllGranted(
rxPermissions,
*params
)
) {
RequestPermissionPromptDialog(this, tips).show()
}
checkPermission(*params)
.subscribe { aBoolean: Boolean ->
RequestPermissionPromptDialog.dismissCurrentDialog()
if (aBoolean) {
setSkillViewData(it)
} else {

View File

@@ -1,5 +1,6 @@
package com.nnbc123.app.skill.widget
import androidx.core.util.Consumer
import com.nnbc123.core.skill.entity.PropRefEntity
import java.io.File
@@ -31,6 +32,7 @@ interface ItemEventListener {
fun onItemClick(item: SkillItem) {}
fun onRecordSuccess(audioFile: File?, duration: Int) {}
fun onDeleteRecordClick() {}
fun requestMicPermissions(consumer: Consumer<Boolean>) {}
}

View File

@@ -3,6 +3,7 @@ package com.nnbc123.app.skill.widget
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import androidx.core.util.Consumer
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import com.netease.nimlib.sdk.media.record.RecordType
import com.nnbc123.app.R
@@ -12,6 +13,7 @@ import com.nnbc123.app.databinding.LayoutSkillAudioBinding
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.nnbc123.core.utils.TextUtils
import com.nnbc123.core.utils.toast
import com.tbruyelle.rxpermissions2.RxPermissions
import java.io.File
class RecordIResourceItem(private val itemAttribute: ItemAttribute) : SkillItem,
@@ -119,6 +121,13 @@ class RecordIResourceItem(private val itemAttribute: ItemAttribute) : SkillItem,
setItemByState(RECORD_STATE_READY)
}
override fun onClickRecord() {
itemAttribute.itemEventListener?.requestMicPermissions {
if (it) {
binding.recordView.startRecord()
}
}
}
/**
* 根据状态设置View

View File

@@ -50,7 +50,7 @@ class TimerRecorderView(context: Context, @Nullable attrs: AttributeSet?, defSty
setOnClickListener {
when (state) {
STATE_PAUSED -> {
startRecord()
recordListener?.onClickRecord()
}
STATE_PLAYED -> {
endAudioRecord(false)
@@ -82,7 +82,7 @@ class TimerRecorderView(context: Context, @Nullable attrs: AttributeSet?, defSty
//开始录制
private fun startRecord() {
fun startRecord() {
if (audioMessageHelper == null) {
val options = NimUIKitImpl.getOptions()
options.audioRecordMaxTime = recordDuration
@@ -175,5 +175,6 @@ class TimerRecorderView(context: Context, @Nullable attrs: AttributeSet?, defSty
fun onRecordCancel()
fun onRecordSuccess(file: File?)
fun onRecordFail()
fun onClickRecord()
}
}

View File

@@ -10,6 +10,7 @@ import android.graphics.drawable.Drawable;
import com.nnbc123.app.R;
import com.nnbc123.app.vip.VipHelper;
import com.nnbc123.core.gift.bean.GiftInfo;
import com.nnbc123.core.gift.bean.GiftType;
import com.nnbc123.core.gift.bean.SimpleVipInfo;
import com.nnbc123.library.bindinglist.BaseItem;
@@ -28,6 +29,8 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
public final ObservableField<String> countText = new ObservableField<>();
public final ObservableBoolean isLocked = new ObservableBoolean();
public Drawable nobleDrawable;
public Drawable radishDrawable;
@@ -54,8 +57,6 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
*/
public boolean isExclusive;
public boolean isLocked;
public String vipIcon;
public boolean isPrivateChat;
@@ -64,13 +65,13 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
super(context, data);
this.isSelect.set(select);
if (data.getConsumeType() == GiftInfo.CONSUME_TYPE_GOLD) {
radishDrawable = null;
radishDrawableSelected = null;
radishDrawable = context.getResources().getDrawable(R.drawable.gift_dialog_ic_diamond);
radishDrawableSelected = context.getResources().getDrawable(R.drawable.gift_dialog_ic_diamond);
} else {
radishDrawable = context.getResources().getDrawable(R.drawable.icon_radish_transparent);
radishDrawableSelected = context.getResources().getDrawable(R.drawable.icon_radish_transparent_selected);
}
goldText.set(data.getGoldPrice() + "钻石");
goldText.set(String.valueOf(data.getGoldPrice()));
this.isKnap.set(isKnap);
updateCount();
int nobleId = data.getLevel();
@@ -88,8 +89,8 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
isShowEffect = data.isHasEffect();
isExclusive = data.isRoomExclude();
SimpleVipInfo vipInfo = data.getGiftVipInfo();
isLocked = vipInfo != null && VipHelper.getMyVipLevel() < vipInfo.getVipLevel();
vipIcon = vipInfo == null ? "" : vipInfo.getVipIcon();
isLocked.set(getIsLocked());
}
@Override
@@ -106,4 +107,23 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
this.countText.set("x" + data.getCount());
}
public void refreshUnlockState() {
isLocked.set(getIsLocked());
}
private boolean getIsLocked() {
if (isKnap.get()) {
return false;
}
SimpleVipInfo vipInfo = data.getGiftVipInfo();
boolean isLocked = vipInfo != null && VipHelper.getMyVipLevel() < vipInfo.getVipLevel();
if (!isLocked) {
if (data.getGiftType() == GiftType.GIFT_TYPE_UNLOCK) {
if (!data.isUnlocked()) {
isLocked = true;
}
}
}
return isLocked;
}
}

View File

@@ -2,11 +2,13 @@ package com.nnbc123.app.ui.im.fragment;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@@ -19,6 +21,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.util.Consumer;
import androidx.lifecycle.Lifecycle;
import com.netease.nim.uikit.api.UIKitOptions;
@@ -52,12 +55,15 @@ import com.netease.nimlib.sdk.robot.model.NimRobotInfo;
import com.netease.nimlib.sdk.robot.model.RobotAttachment;
import com.netease.nimlib.sdk.robot.model.RobotMsgType;
import com.nnbc123.app.R;
import com.nnbc123.app.common.permission.PermissionHelper;
import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan;
import com.nnbc123.app.ui.im.GreetPresenter;
import com.nnbc123.app.ui.im.MessageListPanelEx;
import com.nnbc123.app.ui.im.chat.MVHChatterBoxStart;
import com.nnbc123.app.ui.im.model.IMCustomModel;
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog;
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog;
import com.nnbc123.app.utils.PushMessageHandler;
import com.nnbc123.core.UriProvider;
import com.nnbc123.core.auth.AuthModel;
@@ -69,6 +75,7 @@ import com.nnbc123.core.im.custom.bean.ImTipAttachment;
import com.nnbc123.core.room.event.MessageSizeEvent;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import com.nnbc123.library.utils.ResUtil;
import com.nnbc123.library.utils.SingleToastUtil;
import com.nnbc123.library.utils.config.BasicConfig;
import com.tbruyelle.rxpermissions2.RxPermissions;
@@ -86,7 +93,6 @@ import java.util.Map;
import io.reactivex.Observable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
/**
@@ -227,7 +233,7 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
IMMessage anchor = (IMMessage) getArguments().getSerializable(Extras.EXTRA_ANCHOR);
customization = (SessionCustomization) getArguments().getSerializable(Extras.EXTRA_CUSTOMIZATION);
Container container = new Container(getActivity(), sessionId, sessionType, this);
Container container = new Container(getActivity(), sessionId, sessionType, this, this::requestPermission);
if (messageListPanel == null) {
messageListPanel = new MessageListPanelEx(container, rootView, anchor, false, false);
@@ -274,13 +280,10 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
GreetPresenter greetPresenter = new GreetPresenter(sessionId);
if (greetPresenter.isCanSendGreet()) {
greetDisposable = greetPresenter.greetMsgGetOne(AuthModel.get().getCurrentUid(), toUid)
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
if (!TextUtils.isEmpty(s)) {
sendMessage(MessageBuilder.createTextMessage(container.account,
container.sessionType, s));
}
.subscribe(s -> {
if (!TextUtils.isEmpty(s)) {
sendMessage(MessageBuilder.createTextMessage(container.account,
container.sessionType, s));
}
});
}
@@ -321,6 +324,24 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
}
private void requestPermission(Consumer<Boolean> consumer, String tips, String... perms) {
Context context = getContext();
if (context != null && RequestPermissionPromptDialog.Companion.isNeedPrompt()
&& !PermissionHelper.INSTANCE.isAllGranted(rxPermissions, perms)) {
new RequestPermissionPromptDialog(context, tips).show();
}
Disposable disposable = rxPermissions.request(perms).subscribe(aBoolean -> {
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
if (!aBoolean) {
showPermissionDeniedTipsDialog(tips);
}
if (consumer != null) {
consumer.accept(aBoolean);
}
}, Throwable::printStackTrace);
compositeDisposable.add(disposable);
}
/**
* ********************** implements ModuleProxy *********************
*/
@@ -604,18 +625,52 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
@Subscribe(threadMode = ThreadMode.MAIN)
@SuppressLint("CheckResult")
public void onNimAudioChatEvent(NimAudioChatEvent event) {
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO)
String[] perms = new String[]{
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE};
StringBuffer sb = new StringBuffer();
sb.append("1.").append(ResUtil.getString(R.string.permission_denied_tips_mic))
.append("\n2.").append(ResUtil.getString(R.string.permission_denied_tips_image));
String tips = sb.toString();
if (RequestPermissionPromptDialog.Companion.isNeedPrompt()
&& !PermissionHelper.INSTANCE.isAllGranted(rxPermissions, perms)) {
new RequestPermissionPromptDialog(requireContext(), tips).show();
}
checkPermission(perms)
.subscribe(result -> {
RequestPermissionPromptDialog.Companion.dismissCurrentDialog();
if (result) {
event.getSuccess().accept(result);
} else {
SingleToastUtil.showToast(getString(R.string.ask_again));
showPermissionDeniedTipsDialog(tips);
}
});
}
private void showPermissionDeniedTipsDialog(String message) {
CommonTipDialog mPrivacyDialog = new CommonTipDialog(getContext());
mPrivacyDialog.setTipMsg(message);
mPrivacyDialog.setOkText("去设置");
mPrivacyDialog.setOnActionListener(
new CommonTipDialog.OnActionListener() {
@Override
public void onOk() {
//同意跳到应用详情页面
Uri packageUri = Uri.parse("package:" + getContext().getPackageName());
Intent intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
);
startActivityForResult(
intent, 0
);
}
}
);
mPrivacyDialog.show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
@SuppressLint("CheckResult")
public void onNimImageActionEvent(NimImageActionEvent event) {
@@ -670,6 +725,9 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
if (limitInfo == null) {
return;
}
if (inputPanel == null) {
return;
}
int model = limitInfo.getModel();
if (model == 2) {
isChat = limitInfo.isChat();

View File

@@ -1,5 +1,6 @@
package com.nnbc123.app.ui.login;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
@@ -20,9 +21,11 @@ import com.netease.nim.uikit.StatusBarUtil;
import com.nnbc123.app.R;
import com.nnbc123.app.base.BaseActivity;
import com.nnbc123.app.base.TitleBar;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.user.UserModel;
import com.nnbc123.core.user.bean.UserInfo;
/**
* Created by zhouxiangfeng on 2017/5/13.
*/
@@ -41,8 +44,7 @@ public class ModifyInfoActivity extends BaseActivity implements View.OnClickList
private TextView tvCountDown;
public static final String CONTENT = "content";
public static final String CONTENT_NICK = "contentNick";
public static final String USER_INFO = "user_info";
private CoordinatorLayout layout_coordinator;
TextWatcher textWatcher = new TextWatcher() {
@@ -117,19 +119,17 @@ public class ModifyInfoActivity extends BaseActivity implements View.OnClickList
// 个人简介允许为空nick不能为空
if (modifyType == CONTENT_MODIFY) {
String content = etEditText.getText().toString();
Intent intent = new Intent();
intent.putExtra(CONTENT, content);
setResult(RESULT_OK, intent);
finish();
UserInfo info = new UserInfo();
info.setUid(AuthModel.get().getCurrentUid());
info.setUserDesc(content);
updateUserInfo(info);
} else if (modifyType == NICK_MODIFY) {
String contentNick = etEditTextNick.getText().toString();
if (!contentNick.trim().isEmpty()) {
Intent intent = new Intent();
intent.putExtra(CONTENT_NICK, contentNick);
setResult(RESULT_OK, intent);
finish();
UserInfo info = new UserInfo();
info.setUid(AuthModel.get().getCurrentUid());
info.setNick(contentNick);
updateUserInfo(info);
} else {
Snackbar.make(layout_coordinator, "所填内容为空!", Snackbar.LENGTH_SHORT).show();
}
@@ -189,4 +189,20 @@ public class ModifyInfoActivity extends BaseActivity implements View.OnClickList
StatusBarUtil.StatusBarLightMode(this);
}
@SuppressLint("CheckResult")
private void updateUserInfo(UserInfo userInfo){
getDialogManager().showProgressDialog(this, "请稍后");
UserModel.get().requestUpdateUserInfo(userInfo)
.compose(bindToLifecycle())
.subscribe(userInfo1 -> {
getDialogManager().dismissDialog();
Intent intent = new Intent();
intent.putExtra(USER_INFO, userInfo1);
setResult(RESULT_OK, intent);
finish();
}, throwable -> {
getDialogManager().dismissDialog();
toast(throwable.getMessage());
});
}
}

View File

@@ -52,7 +52,7 @@ public class AddUserInfoFragment extends BaseFragment
private int gender = -1;
private XRadioGroup rgGender;
private RadioButton rbMale;
private String avatarUrl = "https://image.nnbc123.cn/default_avatar.png";
private String avatarUrl = "https://yinmeng-1318633625.cos.ap-guangzhou.myqcloud.com/default_avatar.png";
public static String INVITE_USER_CODE = "";

View File

@@ -9,8 +9,11 @@ import android.text.SpannableString;
import android.text.TextUtils;
import android.view.View;
import androidx.core.util.Consumer;
import androidx.databinding.DataBindingUtil;
import com.nnbc123.app.ui.setting.invite.InviteInputConfirmDialog;
import com.nnbc123.app.ui.setting.invite.InviteInputDialog;
import com.nnbc123.core.UriProvider;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.auth.event.LogoutEvent;
@@ -55,6 +58,8 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
private ActivitySettingBinding settingBinding;
private WithdrawInfo withdrawInfos;
private InviteInputDialog inviteInputDialog;
private InviteInputConfirmDialog inviteInputConfirmDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -76,6 +81,7 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
dismissInviteDialog();
}
@SuppressLint("CheckResult")
@@ -232,6 +238,9 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
case R.id.rly_permission:
PermissionGuideActivity.Companion.start(context);
break;
case R.id.layout_invite_code:
showInviteInputDialog();
break;
}
}
@@ -285,7 +294,11 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
} else {
settingBinding.tvPayModify.setText("修改");
}
if (cacheLoginUserInfo.isCanRefillInviteCode()) {
settingBinding.layoutInviteCode.setVisibility(View.VISIBLE);
} else {
settingBinding.layoutInviteCode.setVisibility(View.GONE);
}
}
public static class MissingPermissionException extends RuntimeException {
@@ -311,5 +324,60 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
finish();
}
public void showInviteInputDialog(){
inviteInputDialog = new InviteInputDialog(this);
inviteInputDialog.setOnNext(new Consumer<String>() {
@Override
public void accept(String s) {
showInviteInputConfirmDialog(s);
}
});
inviteInputDialog.show();
}
public void showInviteInputConfirmDialog(String code) {
inviteInputConfirmDialog = new InviteInputConfirmDialog(this, code);
inviteInputConfirmDialog.setOnNext(new Consumer<String>() {
@Override
public void accept(String s) {
inviteInputConfirmDialog.dismiss();
submitInviteCode(s);
}
});
inviteInputConfirmDialog.show();
}
private void dismissInviteDialog() {
if (inviteInputDialog != null && inviteInputDialog.isShowing()) {
inviteInputDialog.dismiss();
}
if (inviteInputConfirmDialog != null && inviteInputConfirmDialog.isShowing()) {
inviteInputConfirmDialog.dismiss();
}
}
private void submitInviteCode(String code) {
getDialogManager().showProgressDialog(this);
Disposable d = UserModel.get().refillInviteCode(code)
.compose(bindToLifecycle())
.subscribe(info -> {
getDialogManager().dismissDialog();
if (info.isSuccess()) {
dismissInviteDialog();
toast(R.string.invite_input_fill_in_success);
settingBinding.layoutInviteCode.setVisibility(View.GONE);
} else {
String message = info.getMessage();
if (message != null) {
toast(message);
}
// INVITE_CODE_DEVICE_DUPLICATED(211185,"该设备已填写过邀请码"),
// TIME_OUT_TO_REFILL_INVITE_CODE(211186,"超出补充填时间,无法补填邀请码"),
if (info.getCode() == 211185 || info.getCode() == 211186) {
settingBinding.layoutInviteCode.setVisibility(View.GONE);
dismissInviteDialog();
}
}
});
}
}

View File

@@ -0,0 +1,57 @@
package com.nnbc123.app.ui.setting.invite
import android.content.Context
import android.graphics.Typeface
import android.os.Bundle
import android.view.Gravity
import android.view.WindowManager
import android.widget.TextView
import androidx.core.util.Consumer
import com.chuhai.utils.ktx.getColorById
import com.chuhai.utils.spannable.SpannableTextBuilder
import com.nnbc123.app.R
import com.nnbc123.app.databinding.InviteInputConfirmDialogBinding
import com.nnbc123.app.ui.widget.dialog.BaseDialog
import com.nnbc123.app.utils.SpannableBuilder
import java.time.format.TextStyle
/**
* Created by Max on 2024/3/25 20:05
* Desc:
**/
class InviteInputConfirmDialog(context: Context, val code: String) :
BaseDialog(context, R.style.dialog) {
var onNext: Consumer<String>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setCancelable(false)
val binding = InviteInputConfirmDialogBinding.inflate(layoutInflater)
setContentView(binding.root)
window?.attributes?.let {
it.width = WindowManager.LayoutParams.MATCH_PARENT
it.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = it
}
SpannableTextBuilder(binding.tvTitle).appendText(context.getString(R.string.invite_input_confirm_title))
.appendText(
text = context.getString(R.string.invite_input_confirm_format).format(code),
textColor = context.getColorById(R.color.color_2B2D33)
)
.appendText("?").apply()
SpannableTextBuilder(binding.tvTips).appendText(context.getString(R.string.invite_input_tips3))
.appendText(
text = "1次",
textSize = 16,
textStyle = Typeface.BOLD,
textColor = context.getColorById(R.color.color_theme)
).apply()
binding.tvCancel.setOnClickListener {
dismiss()
}
binding.tvSave.setOnClickListener {
onNext?.accept(code)
}
}
}

View File

@@ -0,0 +1,49 @@
package com.nnbc123.app.ui.setting.invite
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.core.util.Consumer
import com.chuhai.utils.ktx.setOnInputChangedListener
import com.nnbc123.app.R
import com.nnbc123.app.databinding.InviteInputDialogBinding
import com.nnbc123.app.ui.widget.dialog.BaseDialog
/**
* Created by Max on 2024/3/25 20:05
* Desc:
**/
class InviteInputDialog(context: Context) : BaseDialog(context, R.style.dialog) {
var onNext: Consumer<String>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = InviteInputDialogBinding.inflate(layoutInflater)
setContentView(binding.root)
window?.attributes?.let {
it.width = WindowManager.LayoutParams.MATCH_PARENT
it.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = it
}
binding.etCode.setOnInputChangedListener {
resetSaveBtn(binding)
true
}
binding.tvSave.setOnClickListener {
onNext?.accept(binding.etCode.text.toString().trim())
}
resetSaveBtn(binding)
}
private fun resetSaveBtn(binding: InviteInputDialogBinding) {
if (binding.etCode.length() > 0) {
binding.tvSave.isEnabled = true
binding.tvSave.setBackgroundResource(R.drawable.shape_theme_26)
} else {
binding.tvSave.isEnabled = false
binding.tvSave.setBackgroundResource(R.drawable.shape_33ffda24_26)
}
}
}

View File

@@ -30,8 +30,8 @@ public class UserGiftActivity extends BaseActivity {
MagicIndicator magicIndicator = findViewById(R.id.magic_indicator);
List<Fragment> fragmentList = new ArrayList<>(2);
//礼物类型 1:普通礼物;2:辛运礼物
fragmentList.add(UserInfoGiftFragment.newInstance(1,true));
fragmentList.add(UserInfoGiftFragment.newInstance(2,true));
fragmentList.add(UserInfoGiftFragment.newInstance(1));
fragmentList.add(UserInfoGiftFragment.newInstance(2));
UserInfoPagerAdapter pagerAdapter = new UserInfoPagerAdapter(getSupportFragmentManager(), fragmentList);
final List<String> tagList = new ArrayList<>(2);
tagList.add("普通礼物");

View File

@@ -9,6 +9,7 @@ import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -57,6 +58,7 @@ import com.nnbc123.app.ui.utils.ImageLoadUtils;
import com.nnbc123.app.ui.widget.ButtonItem;
import com.nnbc123.app.ui.widget.ObservableScrollView;
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper;
import com.nnbc123.app.ui.widget.magicindicator.buildins.UIUtil;
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator;
import com.nnbc123.app.ui.widget.rollviewpager.HintView;
import com.nnbc123.app.ui.widget.rollviewpager.RollPagerView;
@@ -66,6 +68,7 @@ import com.nnbc123.app.vip.VipHelper;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.im.friend.IMFriendModel;
import com.nnbc123.core.level.UserLevelVo;
import com.nnbc123.core.noble.NobleUtil;
import com.nnbc123.core.praise.PraiseModel;
import com.nnbc123.core.praise.event.IsLikedEvent;
import com.nnbc123.core.praise.event.PraiseEvent;
@@ -86,6 +89,7 @@ import com.nnbc123.library.annatation.ActLayoutRes;
import com.nnbc123.library.utils.ListUtils;
import com.nnbc123.library.utils.SingleToastUtil;
import com.nnbc123.library.utils.SizeUtils;
import com.nnbc123.library.utils.StringUtils;
import com.nnbc123.xchat_android_constants.XChatConstants;
import org.greenrobot.eventbus.EventBus;
@@ -144,23 +148,18 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
getUserInfo();
initAttentionView();
initNestScrollView();
setEditButton(identityState, true);
setEditButton(identityState, false);
setTitleVisible(false);
// initViewPager(true);
if (userId != AuthModel.get().getCurrentUid() && !VipHelper.isHideLookUser()) {
UserModel.get().visitUserDetail(userId).subscribe();
}
viewModel.getHallData().observe(this, clanAndHallInfo -> {
if (clanAndHallInfo != null && clanAndHallInfo.getClan() != null && clanAndHallInfo.getClan().getId() != 0) {
mBinding.tvHallDesc.setVisibility(View.VISIBLE);
mBinding.tvHallDesc.setOnClickListener(v -> {
ModuleClanActivity.start(context, userId);
});
} else {
mBinding.tvHallDesc.setVisibility(View.GONE);
}
});
if (userId != AuthModel.get().getCurrentUid()) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) mBinding.viewPager.getLayoutParams();
layoutParams.bottomMargin = UIUtil.dip2px(context, 60);
mBinding.viewPager.setLayoutParams(layoutParams);
}
}
@@ -168,7 +167,6 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
protected void onResume() {
super.onResume();
viewModel.getUserInfoDetail();
viewModel.getUserHallAndClan();
viewModel.getUserSkillData(viewModel.getUserId());
}
@@ -207,19 +205,40 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.ivEdit.setOnClickListener(this);
mBinding.flAvatar.setOnClickListener(this);
mBinding.tvErbanId.setOnClickListener(this);
mBinding.layoutRoom.setOnClickListener(this);
}
/**
* 找到TA, 主态不展示
*/
private void setWhereVisible() {
if (viewModel.getMRoomUid() != 0) {
mBinding.flLiving.setVisibility(View.VISIBLE);
ImageLoadKt.loadFromAssets(mBinding.svgaLiving, "svga/living_black.svga");
mBinding.ivAvatar.setBorderColor(Color.parseColor("#FFE710"));
private void loadRoomInfo(UserDetailInfo.DataBean info){
if (info != null && info.getRoomUid() > 0) {
mBinding.layoutRoom.setVisibility(View.VISIBLE);
ImageLoadKt.loadFromAssets(mBinding.svgaRoom, "svga/user_in_live.svga");
mBinding.tvRoomName.setText(info.getRoomTitle());
} else {
mBinding.flLiving.setVisibility(View.GONE);
mBinding.svgaRoom.stopAnimation();
mBinding.layoutRoom.setVisibility(View.GONE);
}
}
private void loadUserAvatar(UserDetailInfo.DataBean info) {
if (info == null) {
return;
}
String avatar = info.getAvatar();
String avatarBorder = null;
if (info.getUserHeadwear() != null) {
avatarBorder = info.getUserHeadwear().getEffect();
if (StringUtils.isEmpty(avatarBorder)) {
avatarBorder = info.getUserHeadwear().getPic();
}
}
ImageLoadKt.loadAvatar(mBinding.ivAvatar, avatar);
if (StringUtils.isEmpty(avatarBorder)) {
mBinding.ivAvatar.setBorderColor(Color.WHITE);
mBinding.ivAvatarBorder.setVisibility(View.GONE);
} else {
mBinding.ivAvatar.setBorderColor(Color.TRANSPARENT);
NobleUtil.loadHeadWear(avatarBorder, mBinding.ivAvatarBorder);
mBinding.ivAvatarBorder.setVisibility(View.VISIBLE);
}
}
@@ -308,7 +327,13 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
isShowPage = true;
}
initPhoto(dataBean.getPrivatePhoto());
setWhereVisible();
loadRoomInfo(dataBean);
loadUserAvatar(dataBean);
if (dataBean.isInOnline()) {
mBinding.layoutOnline.setVisibility(View.VISIBLE);
} else {
mBinding.layoutOnline.setVisibility(View.GONE);
}
});
}
@@ -386,7 +411,6 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
VipHelper.loadVipIcon(mBinding.ivVipIcon, userInfo.getUserVipInfoVO());
ImageLoadKt.loadAvatar(mBinding.ivAvatar, userInfo.getAvatar());
}
}
@@ -536,6 +560,17 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.layout_room:
if (userInfo == null) {
toast("用户信息为空。");
return;
}
if (viewModel.getMRoomUid() != 0) {
AVRoomActivity.startForFromType(this, viewModel.getMRoomUid(),
AVRoomActivity.FROM_TYPE_USER, userInfo.getNick(), String.valueOf(userInfo.getUid()));
}
break;
case R.id.iv_user_back:
finish();
break;
@@ -602,14 +637,6 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
break;
case R.id.fl_avatar:
if (userInfo == null) {
toast("用户信息为空。");
return;
}
if (viewModel.getMRoomUid() != 0) {
AVRoomActivity.startForFromType(this, viewModel.getMRoomUid(),
AVRoomActivity.FROM_TYPE_USER, userInfo.getNick(), String.valueOf(userInfo.getUid()));
}
break;
case R.id.tv_erban_id:
if (userInfo == null) {

View File

@@ -47,13 +47,11 @@ public class UserInfoGiftFragment extends BaseBindingFragment<FragmentUserInfoGi
private UserGiftAdapter userGiftAdapter;
private Observer mObserver;
private Observer mUidObserver;
private boolean isDetails = false;
public static UserInfoGiftFragment newInstance(int giftType, boolean isDetails) {
public static UserInfoGiftFragment newInstance(int giftType) {
UserInfoGiftFragment userInfoGiftFragment = new UserInfoGiftFragment();
Bundle args = new Bundle();
args.putInt("giftType", giftType);
args.putBoolean("isDetails", isDetails);
userInfoGiftFragment.setArguments(args);
return userInfoGiftFragment;
}
@@ -89,9 +87,8 @@ public class UserInfoGiftFragment extends BaseBindingFragment<FragmentUserInfoGi
@Override
public void initiate() {
isDetails = requireArguments().getBoolean("isDetails", false);
mBinding.rvGift.setLayoutManager(new GridLayoutManager(mContext, 4));
userGiftAdapter = new UserGiftAdapter(mContext, userInfoItems, isDetails);
userGiftAdapter = new UserGiftAdapter(mContext, userInfoItems);
userGiftAdapter.bindToRecyclerView(mBinding.rvGift);
userGiftAdapter.setSpanSizeLookup(new BaseQuickAdapter.SpanSizeLookup() {
@Override
@@ -155,10 +152,6 @@ public class UserInfoGiftFragment extends BaseBindingFragment<FragmentUserInfoGi
for (int i = 0; i < giftWallInfoList.size(); i++) {
userInfoItem = new UserInfoItem<>(UserInfoItem.TYPE_GIFT_ITEM, giftWallInfoList.get(i));
userInfoItems.add(userInfoItem);
//非礼物详情页主需要12个就够了
if (!isDetails && i == 11){
break;
}
}
}

View File

@@ -28,6 +28,7 @@ import com.nnbc123.app.ui.login.ModifyInfoActivity
import com.nnbc123.app.ui.user.UserPhotoAdapter.ImageClickListener
import com.nnbc123.app.ui.utils.ImageLoadUtils
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
import com.nnbc123.app.utils.RegexUtil
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.file.FileModel
@@ -40,6 +41,7 @@ import com.nnbc123.library.common.photo.PhotoProviderNew
import com.nnbc123.library.common.util.PhotoCompressCallback
import com.nnbc123.library.common.util.PhotoCompressUtil
import com.nnbc123.library.easypermisssion.EasyPermissions
import com.nnbc123.library.utils.ResUtil
import com.nnbc123.library.utils.TimeUtils
import com.sleepbot.datetimepicker.time.RadialPickerLayout
import com.sleepbot.datetimepicker.time.TimePickerDialog
@@ -137,10 +139,9 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
private fun findViews() {
binding.layoutAvatar.setOnClickListener(this)
binding.tvBirth.setOnClickListener(this)
binding.tvNick.setOnClickListener(this)
binding.layoutBirth.setOnClickListener(this)
binding.layoutNick.setOnClickListener(this)
binding.layoutDesc.setOnClickListener(this)
binding.ivDescMore.setOnClickListener(this)
binding.layoutPhotos.setOnClickListener(this)
binding.rlAudioRecord.setOnClickListener(this)
val mLayoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)
@@ -213,7 +214,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
checkStoragePermission()
isAvatar = true
}
R.id.tv_birth -> {
R.id.layout_birth -> {
if (mUserInfo != null) {
val year = TimeUtils.getYear(
mUserInfo?.birth ?: 0L
@@ -234,12 +235,12 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
show(supportFragmentManager, "DATEPICKER_TAG_1")
}
}
R.id.tv_nick -> UIHelper.showModifyInfoAct(
R.id.layout_nick -> UIHelper.showModifyInfoAct(
this@UserInfoModifyActivity,
Method.NICK,
ModifyInfoActivity.NICK_MODIFY
)
R.id.iv_desc_more, R.id.layout_desc -> UIHelper.showModifyInfoAct(
R.id.layout_desc -> UIHelper.showModifyInfoAct(
this@UserInfoModifyActivity,
Method.DESC,
ModifyInfoActivity.CONTENT_MODIFY
@@ -276,6 +277,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
RequestPermissionPromptDialog.dismissCurrentDialog()
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
val mPrivacyDialog = CommonTipDialog(context)
mPrivacyDialog.setTipMsg(requestTip)
@@ -307,12 +309,19 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
private fun checkStoragePermission() {
RequestPermissionPromptDialog.dismissCurrentDialog()
if (!EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
if (RequestPermissionPromptDialog.isNeedPrompt()) {
RequestPermissionPromptDialog(
this,
ResUtil.getString(R.string.permission_denied_tips_image)
).show()
}
EasyPermissions.requestPermissions(
this,
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",
@@ -341,34 +350,13 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
checkStoragePermission()
} else if (resultCode == RESULT_OK) {
when (requestCode) {
Method.NICK -> {
Method.NICK, Method.DESC -> {
data?.let {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
"请稍后"
)
val stringExtra = it.getStringExtra(ModifyInfoActivity.CONTENT_NICK)
binding.tvNick.text = stringExtra
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.nick = stringExtra
UserModel.get().requestUpdateUserInfo(user)
.subscribe(userInfoUpdateObserver)
}
}
Method.DESC -> {
data?.let {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
"请稍后"
)
val stringExtra = it.getStringExtra(ModifyInfoActivity.CONTENT)
setTvDesc(stringExtra)
val user = UserInfo()
user.uid = AuthModel.get().currentUid
user.userDesc = stringExtra
UserModel.get().requestUpdateUserInfo(user)
.subscribe(userInfoUpdateObserver)
val newUserInfo =
it.getSerializableExtra(ModifyInfoActivity.USER_INFO) as? UserInfo
if (newUserInfo != null) {
loadUserInfo(newUserInfo)
}
}
}
Method.AUDIO -> {
@@ -517,10 +505,7 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
override fun onSuccess(info: UserInfo) {
if (info.uid == userId) {
mUserInfo = info
initData(mUserInfo)
}
loadUserInfo(info)
dialogManager.dismissDialog()
if (showAvatarAuditing) {
showAvatarAuditing = false
@@ -534,6 +519,13 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
}
private fun loadUserInfo(userInfo: UserInfo) {
if (userInfo.uid == userId) {
mUserInfo = userInfo
initData(mUserInfo)
}
}
private fun showAvatarAuditingDialog() {
toast(R.string.avatar_auditing)
//延迟3秒重新获取用户信息更新状态

View File

@@ -28,6 +28,7 @@ import com.nnbc123.app.takephoto.compress.CompressConfig
import com.nnbc123.app.ui.user.UserModifyPhotosAdapter.PhotoItemClickListener
import com.nnbc123.app.ui.utils.ImageLoadUtils
import com.nnbc123.app.ui.widget.dialog.CommonTipDialog
import com.nnbc123.app.ui.widget.dialog.RequestPermissionPromptDialog
import com.nnbc123.app.utils.RegexUtil
import com.nnbc123.core.file.FileModel
import com.nnbc123.core.user.UserModel
@@ -39,6 +40,7 @@ import com.nnbc123.library.common.photo.PhotoProviderNew
import com.nnbc123.library.common.util.PhotoCompressCallback
import com.nnbc123.library.common.util.PhotoCompressUtil
import com.nnbc123.library.easypermisssion.EasyPermissions
import com.nnbc123.library.utils.ResUtil
import com.nnbc123.library.utils.file.JXFileUtils
import com.orhanobut.logger.Logger
import com.trello.rxlifecycle3.android.ActivityEvent
@@ -225,6 +227,7 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE) {
RequestPermissionPromptDialog.dismissCurrentDialog()
val requestTip = "为了能正常加载您本地的文件内容,请前往应用权限设置界面打开存储空间权限。"
val mPrivacyDialog = CommonTipDialog(context)
mPrivacyDialog.setTipMsg(requestTip)
@@ -256,12 +259,19 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
}
private fun checkStoragePermission() {
RequestPermissionPromptDialog.dismissCurrentDialog()
if (!EasyPermissions.hasPermissions(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
if (RequestPermissionPromptDialog.isNeedPrompt()) {
RequestPermissionPromptDialog(
this,
ResUtil.getString(R.string.permission_denied_tips_image)
).show()
}
EasyPermissions.requestPermissions(
this,
"请您再次考虑授予存储空间权限,否则将无法正常加载您本地的文件内容。",

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