Compare commits

...

102 Commits

Author SHA1 Message Date
Max
3da5533ddc fix:修改正式环境域名为api.hfighting.com 2023-12-21 19:16:31 +08:00
Max
df96cfe5d4 fix:调整加入粉丝团入口UI 2023-12-11 17:00:54 +08:00
Max
213efcba31 fix:修复添加管理员后管理员列表中无法正常展示昵称头像问题 2023-12-11 16:14:04 +08:00
Max
9e36225b77 fix:修复个播小时榜飘窗无法展示问题 2023-12-11 15:22:39 +08:00
Max
da3d72ebff fix:修复升级弹窗偶发异常 2023-12-11 11:47:10 +08:00
Max
fd3dc7cb3c fix:个播在麦时禁止滑动 2023-12-11 11:07:25 +08:00
Max
eebe231a45 Merge branch 'peko_feature/search' into peko_test/2.4.0 2023-12-08 16:01:34 +08:00
Max
276f2002f9 Merge branch 'peko_feature/region' into peko_test/2.4.0 2023-12-08 16:01:30 +08:00
Max
2942e2f0bb feat;完成地区选择器优化(调整地区数据、支持字母索引、有效展示当前地区) 2023-12-08 15:59:59 +08:00
Max
406077b43b fix:修复房间用户详情弹窗边框展示问题 2023-12-07 18:07:45 +08:00
Max
55a8d037e0 feat:完成搜索结果条目信息展示调整(去掉性别,新增等级信息) 2023-12-07 17:10:58 +08:00
Max
ba58b0bd40 feat:刚刚少提交依赖 2023-12-07 16:02:43 +08:00
Max
151b1c37d0 feat:修复RectRoundImageView导致的图片加载问题 2023-12-07 16:01:55 +08:00
Max
4a7af141aa feat:声网RTC配置debug环境KEY 2023-12-07 15:11:28 +08:00
Max
cec6e00e09 feat:同步音萌完成个播PK屏蔽麦功能 2023-12-07 14:50:01 +08:00
Max
bf6ef26eca fix:修复个播粉丝团入口展示问题(进入有密码房间时因请求时机导致未正确加载状态) 2023-12-06 17:45:39 +08:00
Max
07845b5e60 fix:修复断网时被踢,重连后未退房问题 2023-12-06 17:03:55 +08:00
Max
097ead1327 fix:修复公会高管设置入口展示问题 2023-12-06 14:25:52 +08:00
Max
2b45d35d40 feat:升级vasdolly版本 2023-12-06 11:58:31 +08:00
Max
e6f4b40e66 fix:修复粉丝团入口逻辑 2023-12-06 11:10:33 +08:00
Max
c46f19f03f fix:修复pk-某liveData空类型导致异常 2023-12-05 18:59:35 +08:00
Max
37196025cc fix:修复个播房闪退:pk的一个liveData空类型问题 2023-12-05 18:01:44 +08:00
Max
9096a9b57f fix:修复输入密码进入游戏房的房间状态不一致问题 2023-12-04 18:54:11 +08:00
Max
c46c49715c feat:补充日志信息 2023-12-04 17:42:29 +08:00
Max
31b785c511 fix:调整礼物飘窗样式问题 2023-12-04 17:42:14 +08:00
Max
6f01c5ddad fix:修复进入有密码的房间,游戏未加载问题 2023-12-04 17:34:47 +08:00
Max
306f15f7f9 feat:通过时间,简单过滤多次重复401异常处理 2023-12-04 16:58:11 +08:00
Max
0babbedeb9 feat:同步habu完成房间banner资源位展示优化 2023-12-01 16:54:21 +08:00
Max
d09e60d206 feat:同步hubu完成【升级飘窗、加入公会】功能优化 2023-12-01 16:31:06 +08:00
Max
e37796286b feat:同步Habu完成地区隔离功能 2023-12-01 16:10:22 +08:00
Max
bdcfb21e6e Merge branch 'v2.1.1/fix' into v2.2.0/test_old_fix 2023-11-01 18:34:23 +08:00
Max
5c7d2e9645 fix:调整幸运礼物动画播放条件(去掉价值520的条件,恢复luckyGiftSvgaUrl逻辑) 2023-11-01 18:34:15 +08:00
Max
d2f24c4457 Merge branch 'v2.2.0/test' into v2.2.0/test_old_fix 2023-11-01 16:29:11 +08:00
Max
7ec11e0aba Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-11-01 16:28:58 +08:00
Max
f4a9690c1b fix:修复红包组件内的compositeDisposable导致再次激活无法执行任务 2023-11-01 16:20:43 +08:00
Max
0742894540 Merge branch 'v2.2.0/test' into v2.2.0/test_old_fix 2023-11-01 14:59:16 +08:00
Max
d0fe8e892e Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-11-01 14:59:05 +08:00
Max
b9120dca54 feat:调整红包打开按钮动画时长
feat:调整红包入口图标
2023-11-01 14:58:47 +08:00
Max
8ebaddad07 Merge branch 'v2.1.1/fix' into v2.2.0/test_old_fix 2023-11-01 11:34:52 +08:00
Max
b63b4ba07a fix:修复幸运礼物重复动效(去掉本地自己播的一个svga) 2023-11-01 11:34:43 +08:00
Max
a211267517 fix:修复麦位魅力值展示问题(主麦) 2023-11-01 11:22:04 +08:00
Max
d0e88440e3 Merge branch 'v2.1.1/fix' into v2.2.0/test_old_fix 2023-10-31 19:19:32 +08:00
Max
260ed56c99 Merge branch 'v2.2.0/test' into v2.2.0/test_old_fix 2023-10-31 19:19:22 +08:00
Max
505917b70f Merge branch 'v2.2.0/float_gift' into v2.2.0/test 2023-10-31 19:19:05 +08:00
Max
03d013fcba fix:修复合并导致的礼物飘窗未展示房间名称问题 2023-10-31 19:18:57 +08:00
Max
19301bbd84 fix:修复公屏相册条目的等级icon加载模糊问题 2023-10-31 19:07:08 +08:00
Max
694a73931b Merge branch 'v2.1.1/fix' into v2.2.0/test_old_fix 2023-10-31 18:06:49 +08:00
Max
d34929d7c7 fix:修复礼物信令解析时未判空导致的解析中断 2023-10-31 18:06:40 +08:00
Max
73eccecfc9 Merge branch 'v2.2.0/test' into v2.2.0/test_old_fix 2023-10-31 17:26:18 +08:00
Max
eb1546570a Merge branch 'v2.2.0/float_gift' into v2.2.0/test
# Conflicts:
#	app/src/main/res/layout/dialog_gift_all_service_level2.xml
2023-10-31 17:26:06 +08:00
Max
7ba43a51d4 fix:调整礼物飘窗弹窗-去围观位置 2023-10-31 17:25:22 +08:00
Max
bae4660840 Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-10-31 17:19:15 +08:00
Max
b9fd24e0ff fix:红包过期时间动态展示(发布、小秘书)
fix:调整全服红包文案字数限制
2023-10-31 17:19:06 +08:00
Max
4bef25e1e3 Merge branch 'v2.2.0/test' into v2.2.0/test_old_fix 2023-10-31 15:54:47 +08:00
Max
72480daa98 Merge branch 'v2.2.0/float_gift' into v2.2.0/test 2023-10-31 15:54:35 +08:00
Max
1defcb0d28 fix:修复礼物飘窗与其他特效飘窗重叠问题(加顶部间距:之前版本是这么解决的,应该是之前版本没做完善这块需求) 2023-10-31 15:54:26 +08:00
Max
4885a0bdbd Merge branch 'v2.1.1/fix' into v2.2.0/test_old_fix 2023-10-31 15:14:14 +08:00
Max
5900702ca6 fix:修复公屏历史消息未查询相册类型消息问题 2023-10-31 15:14:04 +08:00
Max
9e6928580f Merge branch 'v2.1.1/fix' into v2.2.0/test_old_fix 2023-10-31 11:25:46 +08:00
Max
e644ced1ed fix:去除聊天页-语音&图片时的WRITE_EXTERNAL_STORAGE权限 2023-10-31 11:25:16 +08:00
Max
1667dd3863 Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-10-31 11:11:59 +08:00
Max
c04d3e283b fix:点击红包图标 已领取且领取完时 增加提示并更新入口 2023-10-31 11:10:51 +08:00
Max
2b6d66c31e Merge branch 'v2.2.0/float_gift' into v2.2.0/test 2023-10-31 10:19:48 +08:00
Max
e56bbb5f8f fix:修复非房间礼物 飘窗弹窗 点击跳转未屏蔽问题 2023-10-31 10:17:09 +08:00
Max
7bf7e232d0 Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-10-30 20:11:15 +08:00
Max
d63a441296 feat:去掉房间设置中的-全服红包开关(暂时操作隐藏入口) 2023-10-30 20:08:08 +08:00
Max
e81ec19168 Merge branch 'v2.2.0/float_gift' into v2.2.0/test
# Conflicts:
#	gradle.properties
2023-10-30 20:02:52 +08:00
Max
588b96ec7b fix:跳转提示去房间的忽略提示规则 2023-10-30 20:02:04 +08:00
Max
514abbc314 Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-10-30 19:49:16 +08:00
Max
94d9183952 fix:修复全服红包未展示自定义文案问题 2023-10-30 19:49:09 +08:00
Max
6eedd5cc46 fix:修复切换同类型房间导致的Widget未更新Context问题 2023-10-30 19:30:26 +08:00
Max
087091275f fix:增加领取成功后主动刷新入口图标数据 2023-10-30 17:10:20 +08:00
Max
f54a8ec175 feat:完善发送红包的权限细分
feat:删除红包无用旧代码
2023-10-30 16:49:00 +08:00
Max
fee8f2ceb9 Merge branch 'v2.2.0/red_package' into v2.2.0/test
# Conflicts:
#	app/src/main/res/values/strings.xml
2023-10-30 15:37:59 +08:00
Max
a18a66b496 fix;修复红包失效时的入口更新问题 2023-10-30 15:36:00 +08:00
Max
80e21bee74 fix:修复房间内点击红包跳转到其他房间后没弹出红包问题 2023-10-30 15:16:06 +08:00
Max
e031dd9d02 fix:修复红包内若干bug 2023-10-30 14:45:19 +08:00
Max
19a3b64a32 Merge branch 'v2.2.0/float_gift' into v2.2.0/test
# Conflicts:
#	app/src/main/java/com/yizhuan/erban/ui/widget/dialog/AllServiceGiftLevelDialog.kt
#	app/src/main/res/values/strings.xml
2023-10-30 12:45:11 +08:00
Max
34a5571338 feat:完成礼物飘窗跳转提示 2023-10-30 12:35:56 +08:00
Max
5b4eeb80e8 Merge branch 'v2.2.0/red_package' into v2.2.0/test 2023-10-29 23:14:28 +08:00
Max
f7889ace18 feat:完善游戏房、个播房红包展示
feat:完善红包冲突场景
2023-10-29 23:14:20 +08:00
Max
cfc909df42 Merge branch 'v2.2.0/float_gift' into v2.2.0/test
# Conflicts:
#	app/src/main/java/com/yizhuan/erban/ui/widget/dialog/AllServiceGiftLevelDialog.kt
#	app/src/main/res/layout/dialog_gift_all_service_level.xml
#	app/src/main/res/values/colors.xml
#	app/src/main/res/values/strings.xml
2023-10-28 12:56:42 +08:00
Max
ebc989cccf feat:使用动态比例实现飘窗礼物布局(待验证) 2023-10-28 12:25:24 +08:00
Max
5ad1c017c3 feat:完善礼物飘窗文本样式 2023-10-28 11:43:19 +08:00
Max
15a80f5537 feat:初步完成全服飘窗礼物UI优化 2023-10-27 20:06:11 +08:00
Max
38fde6109b Merge branch 'v2.2.0/red_package' into v2.2.0/dev
# Conflicts:
#	gradle.properties
2023-10-27 17:09:46 +08:00
Max
3199114ff6 fix:修复开红包结果页的view隐藏展示问题
fix:修复发红包背景展示问题
2023-10-27 17:06:40 +08:00
Max
57139f1f97 feat:完善全服红包跳转逻辑 2023-10-27 16:32:54 +08:00
Max
c7d7d98873 feat:完善抢红包条件的完成路径跳转
feat:完善抢红包细节
2023-10-27 13:01:05 +08:00
Max
d7da6d4be4 feat:完善抢红包文案和交互 2023-10-27 11:21:13 +08:00
Max
b9a2f03184 feat:完善红包入口逻辑
feat:初步可以领取红包
2023-10-27 02:10:55 +08:00
Max
5ef9be75d2 feat:初步搭建新房间框架
feat:初步搭建红包处理器与组件等(未完成)
2023-10-26 20:17:11 +08:00
Max
cf3ab9ce84 feat:调整发红包部分字段 2023-10-25 18:25:31 +08:00
Max
3ba31c46d8 feat:补充支付订单为空的判断 2023-10-25 17:14:31 +08:00
Max
e8f7eca1af fix:修复google支付回调时导致的空指针异常
fix:完善房间上麦时权限申请的前置状态判断
2023-10-25 16:56:05 +08:00
Max
d93b6fbf60 feat:新增core模块(核心组件模块,慢慢整理重构) 2023-10-25 16:48:32 +08:00
Max
6ec57834fd feat:初步完成发红包接口对接
feat:增加服务器时间字段
2023-10-25 15:17:08 +08:00
Max
c3dab80e71 feat:初步完成房间红包入口组件UI
feat:完善网络调试工具Stetho的配置
2023-10-24 19:06:04 +08:00
Max
60e56beb43 feat:完成打开红包弹窗UI 2023-10-24 15:40:07 +08:00
Max
a0667bdd8d feat:初步完成领红包弹窗UI框架 2023-10-24 14:12:42 +08:00
Max
ba65ad680f feat:完成发红包UI国际化 2023-10-24 10:29:47 +08:00
Max
5163c2dc9d feat:初步完成发红包弹窗UI 2023-10-23 20:15:02 +08:00
251 changed files with 8906 additions and 3587 deletions

View File

@@ -148,7 +148,7 @@ android {
buildTypes {
def server_url_debug = '"http://beta.api.pekolive.com/"'
def server_url_release = '"https://api.pekolive.com/"'
def server_url_release = '"https://api.hfighting.com/"'
debug {
println("minifyEnabled = " + minify_enabled)
@@ -275,7 +275,7 @@ dependencies {
implementation 'com.github.fodroid:XRadioGroup:v1.5'
api 'com.tencent.vasdolly:helper:3.0.3'
api 'com.tencent.vasdolly:helper:3.0.6'
implementation "io.github.tencent:vap:2.0.24"
implementation 'com.github.mmin18:realtimeblurview:1.2.1'
@@ -303,6 +303,7 @@ dependencies {
implementation 'com.contrarywind:wheelview:4.1.0'
implementation 'tech.sud.mgp:SudMGP-static:1.3.3.1158'
implementation 'com.google.android.material:material:1.9.0'
}
channel {

View File

@@ -829,6 +829,10 @@
<activity
android:name=".ui.webview.DatingRuleWebViewActivity"
android:theme="@style/dialog_web_view_activity" />
<activity
android:name=".ui.webview.room_banner.RoomBannerWebDialogActivity"
android:theme="@style/dialog_web_view_activity"
android:windowSoftInputMode="adjustPan" />
<activity
android:name=".ui.webview.TarotPayWebViewActivity"
android:theme="@style/dialog_web_view_activity" />

View File

@@ -0,0 +1 @@
[{"name":"Taiwan","abbr":"TW","mcc":"466","code":"886"},{"name":"Hong Kong","abbr":"HK","mcc":"454","code":"852"},{"name":"Singapore","abbr":"SG","mcc":"525","code":"65"},{"name":"Malaysia","abbr":"MY","mcc":"502","code":"60"},{"name":"China","abbr":"CN","mcc":"460","code":"86"}]

File diff suppressed because one or more lines are too long

View File

@@ -410,6 +410,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
}
onParseIntent();
handleNimIntent();
InitialModel.get().regionCheck();
}
private void onParseIntent() {
@@ -519,6 +520,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLoadLoginUserInfoEvent(LoadLoginUserInfoEvent event) {
firstLoadedUserInfo();
InitialModel.get().regionCheck();
}
public void onLogout() {

View File

@@ -16,7 +16,10 @@ import android.util.Log;
import androidx.multidex.MultiDex;
import com.bumptech.glide.request.target.ViewTarget;
import com.chuhai.utils.LanguageUtils;
import com.chuhai.utils.ServiceTime;
import com.coorchice.library.utils.LogUtils;
import com.facebook.stetho.Stetho;
import com.hjq.toast.ToastUtils;
import com.mob.MobSDK;
import com.mob.moblink.MobLink;
@@ -64,6 +67,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.OpenSignInAttachment;
import com.yizhuan.xchat_android_core.initial.InitialModel;
import com.yizhuan.xchat_android_core.interceptor.NoParamsInterceptor;
import com.yizhuan.xchat_android_core.interceptor.ParamsInterceptor;
import com.yizhuan.xchat_android_core.interceptor.TimeSyncInterceptor;
import com.yizhuan.xchat_android_core.manager.IMMessageManager;
import com.yizhuan.xchat_android_core.manager.IMSystemMsgManager;
import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel;
@@ -112,6 +116,9 @@ import io.realm.RealmConfiguration;
public class XChatApplication extends BaseApp {
public static final String TAG = "XChatApplication";
public static Application gContext;
// 接收到退出登录事件(跳转到登录页了)
private static long logoutEventTime = 0;
private static final MessageNotifierCustomization messageNotifierCustomization = new MessageNotifierCustomization() {
@Override
public String makeNotifyContent(String nick, IMMessage message) {
@@ -200,10 +207,11 @@ public class XChatApplication extends BaseApp {
String channel = "";
channel = ChannelReaderUtil.getChannel(instance);
Log.d(TAG, "localChannel:" + channel);
if (TextUtils.isEmpty(channel)) {
channel = Constants.GOOGLE;
}
Log.d(TAG, "finalChannel:" + channel);
BasicConfig.INSTANCE.setOriginalChannel(channel);
BasicConfig.INSTANCE.setChannel(channel);
@@ -242,6 +250,13 @@ public class XChatApplication extends BaseApp {
SingleToastUtil.showToast(serviceResult.getMessage());
EventBus.getDefault().post(new NeedCompleteInfoEvent());
throw new ServerException(serviceResult.getMessage(), serviceResult.getCode());
} else if (serviceResult.getCode() == 401) {
if ((ServiceTime.INSTANCE.getTime() - logoutEventTime) > 800) {
logoutEventTime = ServiceTime.INSTANCE.getTime();
SingleToastUtil.showToast(serviceResult.getMessage());
AuthModel.get().cleanLogInfo();
}
throw new ServerException(serviceResult.getMessage(), serviceResult.getCode());
}
}
return null;
@@ -252,6 +267,7 @@ public class XChatApplication extends BaseApp {
//fixed: Glide Exception:"You must not call setTag() on a view Glide is targeting"
ViewTarget.setTagId(R.id.tag_glide);
initStetho(context);
init(channel);
//生命周期监听
@@ -400,11 +416,13 @@ public class XChatApplication extends BaseApp {
httpParams.put("deviceId", DeviceUuidFactory.getDeviceId(context));
httpParams.put("androidId", MD5Utils.getMD5String(Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID)));
httpParams.put("channel", AppMetaDataUtil.getChannelID());
httpParams.put("lang", LanguageUtils.INSTANCE.getSystemLanguage().toLanguageTag());
RxNet.init(context)
.debug(BuildConfig.DEBUG)
.setBaseUrl(url)
.addInterceptors(new ParamsInterceptor(httpParams))
.addInterceptors(new NoParamsInterceptor())//注意:拦截器的添加顺序,请求的拦截顺序
.addInterceptors(new TimeSyncInterceptor())
.certificates()
.build();
//单例的model 初始化
@@ -543,4 +561,18 @@ public class XChatApplication extends BaseApp {
unregisterActivityLifecycleCallbacks(lifeCycleHelper);
}
}
/**
* 初始化Stetho网络调试
*/
private static void initStetho(Context context) {
if (Env.isDebug()) {
Stetho.initialize(
Stetho.newInitializerBuilder(context)
.enableDumpapp(Stetho.defaultDumperPluginsProvider(context))
.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(context))
.build()
);
}
}
}

View File

@@ -16,6 +16,7 @@ import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUS
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_ROOM_PK_NOTIFY;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
@@ -38,6 +39,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.LifecycleOwner;
import androidx.viewpager2.widget.ViewPager2;
import com.alibaba.fastjson.JSON;
@@ -65,7 +67,7 @@ import com.yizhuan.erban.avroom.fragment.HomePartyFragment;
import com.yizhuan.erban.avroom.fragment.InputPwdDialogFragment;
import com.yizhuan.erban.avroom.presenter.AvRoomPresenter;
import com.yizhuan.erban.avroom.presenter.HomePartyPresenter;
import com.yizhuan.erban.avroom.redpackage.RedPackageOpenDialog;
import com.yizhuan.erban.avroom.redpackage.RedPackageHandler;
import com.yizhuan.erban.avroom.view.IAvRoomView;
import com.yizhuan.erban.avroom.widget.VerticalViewPagerAdapter;
import com.yizhuan.erban.base.BaseMvpActivity;
@@ -81,10 +83,7 @@ import com.yizhuan.erban.ui.utils.ImageLoadUtils;
import com.yizhuan.erban.ui.webview.CommonWebViewActivity;
import com.yizhuan.erban.ui.webview.DialogWebViewActivity;
import com.yizhuan.erban.ui.widget.NobleOpenNoticeView;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelOneDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelThreeDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelTwoDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelDialog;
import com.yizhuan.erban.ui.widget.dialog.MonsterDialog;
import com.yizhuan.erban.utils.UserUtils;
import com.yizhuan.tutu.room_chat.activity.RoomMsgActivity;
@@ -128,7 +127,6 @@ import com.yizhuan.xchat_android_core.patriarch.event.CloseMinRoomEvent;
import com.yizhuan.xchat_android_core.patriarch.event.ImPushMsgPmLimitTimeEvent;
import com.yizhuan.xchat_android_core.patriarch.event.PmDismissAllLimitDialogEvent;
import com.yizhuan.xchat_android_core.patriarch.exception.PmRoomLimitException;
import com.yizhuan.xchat_android_core.redpackage.RedPackageModel;
import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo;
import com.yizhuan.xchat_android_core.room.anotherroompk.ShowGiftDialogEvent;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
@@ -140,6 +138,8 @@ import com.yizhuan.xchat_android_core.room.event.RoomTaskTipsEvent;
import com.yizhuan.xchat_android_core.room.pk.event.PKStateEvent;
import com.yizhuan.xchat_android_core.super_admin.util.SAdminOptUtil;
import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil;
import com.yizhuan.xchat_android_core.support.room.RoomContext;
import com.yizhuan.xchat_android_core.support.room.RoomView;
import com.yizhuan.xchat_android_core.treasurefairy.FairyMsgInfoBean;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.user.bean.FirstChargeInfo;
@@ -148,7 +148,6 @@ import com.yizhuan.xchat_android_core.utils.LogUtils;
import com.yizhuan.xchat_android_core.utils.StringUtils;
import com.yizhuan.xchat_android_library.base.factory.CreatePresenter;
import com.yizhuan.xchat_android_library.rxbus.RxBus;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.UIUtils;
@@ -160,10 +159,7 @@ import org.greenrobot.eventbus.ThreadMode;
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;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@@ -180,7 +176,7 @@ import io.reactivex.disposables.Disposable;
*/
@CreatePresenter(AvRoomPresenter.class)
public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter>
implements View.OnClickListener, IAvRoomView {
implements View.OnClickListener, IAvRoomView, RoomView {
public static final int FROM_TYPE_NORMAL = 0;
public static final int FROM_TYPE_RECOMMEND = 1;
@@ -218,7 +214,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
private RoomInfo mRoomInfo;
private ImageView ivHeadWear;
private MonsterDialog monsterDialog;
private List<RedPackageOpenDialog> openDialogs;
private ViewPager2 viewpager;
private VerticalViewPagerAdapter mAdapter;
/*********************************显示全服礼物***************************************/
@@ -226,9 +221,13 @@ 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;
// 通过红包进来时,有该参数
private RedPackageNotifyInfo redPackageNotifyInfo;
// 是否禁用VP滑动true不允许滑动false某些条件下可以滑动
private boolean viewPagerInputDisable;
public static void start(Context context, long roomUid) {
startForFromType(context, roomUid, FROM_TYPE_NORMAL, null, null);
@@ -401,7 +400,7 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
public void setCurrentItem(int item) {
dismissLoadingDialog();
if (viewpager != null) {
viewpager.setUserInputEnabled(true);
tryEnabledViewPagerInput();
viewpager.setCurrentItem(item, false);
}
}
@@ -413,6 +412,12 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
fromUid = intent.getStringExtra("fromUid");
giftId = intent.getIntExtra("giftId", 0);
mRoomInfo = intent.getParcelableExtra(Constants.ROOM_INFO);
Object notifyInfo = intent.getSerializableExtra("notifyInfo");
if (notifyInfo instanceof RedPackageNotifyInfo) {
redPackageNotifyInfo = (RedPackageNotifyInfo) notifyInfo;
} else {
redPackageNotifyInfo = null;
}
if (mRoomInfo != null) {
roomUid = mRoomInfo.getRoomUid();
} else {
@@ -444,7 +449,7 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
viewpager.setOffscreenPageLimit(2);
viewpager.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
viewpager.getChildAt(0).setOverScrollMode(View.OVER_SCROLL_NEVER);
viewpager.setUserInputEnabled(false);
disableViewPagerInput();
viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
@@ -471,11 +476,11 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
if (state == 0 && viewpager.getCurrentItem() == 2) {
showLoadingDialog();
((FakeSingleRoomFragment) mAdapter.getItem(2)).tryJumpRoom();
viewpager.setUserInputEnabled(false);
disableViewPagerInput();
} else if (state == 0 && viewpager.getCurrentItem() == 0) {
showLoadingDialog();
((FakeSingleRoomBackFragment) mAdapter.getItem(0)).tryJumpRoom();
viewpager.setUserInputEnabled(false);
disableViewPagerInput();
}
}
});
@@ -511,8 +516,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
if (giftList != null) {
giftList.clear();
}
if (!isResume) showRedPackage(AvRoomDataManager.get().mCurrentRoomInfo);
isResume = true;
}
private void onRoomEventReceive(RoomEvent roomEvent) {
@@ -616,9 +619,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
case RoomEvent.MY_SELF_KICK_OUT_ROOM_BY_S_ADMIN:
toBack(true);
break;
case RoomEvent.RECEIVE_RED_PACKAGE:
showRedPackage(AvRoomDataManager.get().mCurrentRoomInfo);
break;
default:
}
}
@@ -667,7 +667,7 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
*/
private void showRoomFragment(boolean isRoomMin) {
mCurrentFragment = (HomePartyFragment) mAdapter.getItem(1);
viewpager.setUserInputEnabled(AvRoomDataManager.get().isSingleRoom());
tryEnabledViewPagerInput();
viewpager.setCurrentItem(1, false);
if (isRoomMin) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
@@ -680,6 +680,17 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
RxBus.get().post(new ShowGiftDialogEvent().setGiftId(giftId));
giftId = 0;
}
/**
* TODO 临时方案后续逐步完善整个房间的RoomContext替换计划
* PS:目前房间进入的逻辑有些凌乱没有明确的生命周期看代码逻辑无论是第一次还是再次进入都会走这里所以在这里绑定View
*/
getRoomContext().onViewAttach(this);
/**
* 每次View重新创建意味着可能在房间外点了红包就重新尝试加载红包并展示
*/
tryShowSourceRedPackage();
}
private void showLiveFinishView(long uid) {
@@ -716,42 +727,24 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
AvRoomDataManager.get().release();
}
@SuppressLint("CheckResult")
private void showRedPackage(RoomInfo roomInfo) {
if (roomInfo == null) return;
RedPackageNotifyInfo inRoomNotifyInfo = (RedPackageNotifyInfo) getIntent().getSerializableExtra("notifyInfo");
Map<String, Long> redMap = DemoCache.readRedPackage();
RedPackageModel.INSTANCE.getRedPackage(roomInfo.getUid())
.compose(bindToLifecycle())
.doFinally(() -> {
if (inRoomNotifyInfo != null && (redMap == null || !redMap.containsKey(inRoomNotifyInfo.getRedEnvelopeId()))) {
showRedPackageOpenDialog(inRoomNotifyInfo);
}
})
.filter(notifyInfo -> inRoomNotifyInfo == null || !notifyInfo.getRedEnvelopeId().equals(inRoomNotifyInfo.getRedEnvelopeId()))
.subscribe(this::showRedPackageOpenDialog);
}
private void showRedPackageOpenDialog(RedPackageNotifyInfo notifyInfo) {
if (!isResume) return;
if (openDialogs == null) {
openDialogs = new ArrayList<>();
}
RedPackageOpenDialog openDialog = RedPackageOpenDialog.Companion.newInstance(notifyInfo);
openDialog.show(this);
if (openDialog.getDialog() != null) {
openDialog.getDialog().setOnDismissListener(dialog -> openDialogs.remove(openDialog));
}
openDialogs.add(openDialog);
if (openDialogs.size() >= SHOW_RED_DIALOG_MAX) {
openDialogs.get(SHOW_RED_DIALOG_MAX - 1).dismissAllowingStateLoss();
/**
* 尝试展示来源红包(在房间外点击红包入口进入房间时)
*/
private void tryShowSourceRedPackage() {
try {
if (redPackageNotifyInfo != null) {
RedPackageHandler handler = getRoomContext().findAbility(RedPackageHandler.class.getSimpleName());
if (handler != null) {
long id = Long.parseLong(redPackageNotifyInfo.getRedEnvelopeId());
handler.tryShowRedPackage(id);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void dismissRedPackageDialog() {
if (openDialogs != null) {
openDialogs.clear();
}
if (mCurrentFragment != null) {
mCurrentFragment.dismissSendRedPackageDialog();
}
@@ -1076,7 +1069,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
DemoCache.readNewUserChargeGift() == 0) {
DemoCache.saveNewUserChargeGift(1);
}
showRedPackage(AvRoomDataManager.get().mCurrentRoomInfo);
dismissLoadingDialog();
}
@@ -1317,7 +1309,9 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
private void showGiftDialog() {
if (giftList.size() == 0) return;
giftDialog = generateAllServiceGiftDialog(this, giftList.peekFirst());
AllServiceGiftProtocol.DataBean data = giftList.peekFirst();
if (data == null) return;
giftDialog = generateAllServiceGiftDialog(this, data);
giftDialog.setOnDismissListener(dialog -> {
giftList.pollFirst();
AllServiceGiftProtocol.DataBean dataBean = giftList.peekFirst();
@@ -1332,30 +1326,16 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
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);
}
private AllServiceGiftLevelDialog generateAllServiceGiftDialog(@NonNull Context context, @NonNull AllServiceGiftProtocol.DataBean dataBean) {
return new AllServiceGiftLevelDialog(context, dataBean);
}
@Override
protected void onPause() {
super.onPause();
registerGiftBroadcastMessage(false);
isResume = false;
}
private void handlePmExitRoom() {
EventBus.getDefault().post(new PmDismissAllLimitDialogEvent());
getMvpPresenter().exitRoom();
@@ -1401,6 +1381,24 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
getLimitEnterRoomHelper().handleThisContext(this, event.getData(), true, this::handlePmExitRoom);
}
@Nullable
@Override
public Activity getActivity() {
return this;
}
@Nullable
@Override
public RoomContext getRoomContext() {
return RoomContext.Companion.get();
}
@NonNull
@Override
public LifecycleOwner getLifecycleOwner() {
return this;
}
private static class GiftBroadcastObserver implements Observer<BroadcastMessage> {
private WeakReference<AVRoomActivity> mReference;
@@ -1434,4 +1432,40 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
}
}
@Override
protected void onReceiveChatRoomEvent(RoomEvent roomEvent) {
super.onReceiveChatRoomEvent(roomEvent);
switch (roomEvent.getEvent()) {
case RoomEvent.UP_MIC:
case RoomEvent.DOWN_MIC:
resetViewPagerInputEnabled();
break;
}
}
/**
* 禁用VP滑动
*/
private void disableViewPagerInput() {
this.viewPagerInputDisable = true;
resetViewPagerInputEnabled();
}
private void tryEnabledViewPagerInput() {
this.viewPagerInputDisable = false;
resetViewPagerInputEnabled();
}
private void resetViewPagerInputEnabled() {
if (viewPagerInputDisable) {
viewpager.setUserInputEnabled(false);
} else {
if (AvRoomDataManager.get().isSingleRoom() && !AvRoomDataManager.get().isOwnerOnMic()) {
// 个播+没在麦位=可以滑动
viewpager.setUserInputEnabled(true);
} else {
viewpager.setUserInputEnabled(false);
}
}
}
}

View File

@@ -0,0 +1,19 @@
package com.yizhuan.erban.avroom.core
import com.yizhuan.erban.avroom.redpackage.RedPackageHandler
import com.yizhuan.xchat_android_core.support.room.RoomAbility
import com.yizhuan.xchat_android_core.support.room.RoomContext
/**
* Created by Max on 2023/10/26 15:41
* Desc:语音房
* @param roomId roomUid
**/
class AudioRoomContext(roomId: Long) : RoomContext(roomId) {
override fun loadAbility(list: MutableMap<String, RoomAbility>) {
super.loadAbility(list)
// 红包处理器
list[RedPackageHandler::class.java.simpleName] = RedPackageHandler()
}
}

View File

@@ -125,7 +125,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
addRoomSettingAction(optAdapter);
addGiftEffectAction(optAdapter);
addOpenOrClosePublicScreenAction(optAdapter);
addRedPackageSwitch();
// addRedPackageSwitch();
addCleanScreenAction(optAdapter);
addRoomLimit(optAdapter);
addGiftValueAction(optAdapter);
@@ -341,7 +341,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
* @param optAdapter
*/
private void addRedPacketAction(OptAdapter optAdapter) {
if (AvRoomDataManager.get().isRedEnvelopeOpen()) {
if (AvRoomDataManager.get().getRedEnvelopeType() > 0) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null) {
return;
@@ -352,7 +352,6 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
}));
}
}
/**

View File

@@ -21,6 +21,9 @@ import android.widget.RelativeLayout
import android.widget.TextView
import androidx.annotation.CallSuper
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.withResumed
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseQuickAdapter
@@ -46,7 +49,7 @@ import com.yizhuan.erban.avroom.dialog.RoomFreeGiftDialog
import com.yizhuan.erban.avroom.dialog.RoomOperationDialog
import com.yizhuan.erban.avroom.firstcharge.FirstChargeDialog
import com.yizhuan.erban.avroom.presenter.BaseRoomPresenter
import com.yizhuan.erban.avroom.redpackage.RedPackageSendDialog
import com.yizhuan.erban.avroom.redpackage.send.RedPackageSendDialog
import com.yizhuan.erban.avroom.room_album.RoomAlbumModel
import com.yizhuan.erban.avroom.view.IBaseRoomView
import com.yizhuan.erban.avroom.widget.BottomView
@@ -84,6 +87,7 @@ import com.yizhuan.xchat_android_core.gift.bean.GiftInfo
import com.yizhuan.xchat_android_core.gift.event.RoomFreeGiftEvent
import com.yizhuan.xchat_android_core.helper.AtProxy
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
import com.yizhuan.xchat_android_core.home.event.OpenRoomMessageInputEvent
import com.yizhuan.xchat_android_core.im.custom.bean.RoomFollowOwnerAttachment
import com.yizhuan.xchat_android_core.im.custom.bean.RoomFollowOwnerAttachment2
import com.yizhuan.xchat_android_core.manager.AudioEngineManager
@@ -104,6 +108,8 @@ import com.yizhuan.xchat_android_core.share.bean.SessionType
import com.yizhuan.xchat_android_core.super_admin.SaConstant
import com.yizhuan.xchat_android_core.super_admin.model.SuperAdminModel
import com.yizhuan.xchat_android_core.super_admin.util.SuperAdminUtil
import com.yizhuan.xchat_android_core.support.room.RoomView
import com.yizhuan.xchat_android_core.support.room.RoomWidget
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.user.bean.BaseInfo
import com.yizhuan.xchat_android_core.user.bean.UserInfo
@@ -116,6 +122,7 @@ import com.yizhuan.xchat_android_library.rxbus.RxBus
import com.yizhuan.xchat_android_library.utils.*
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@@ -130,7 +137,8 @@ import org.greenrobot.eventbus.ThreadMode
*/
open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
BaseMvpFragment<V?, P?>(),
View.OnClickListener, OnGiftDialogBtnClickListener, IBaseRoomView, OnMicroItemClickListener {
View.OnClickListener, OnGiftDialogBtnClickListener, IBaseRoomView, OnMicroItemClickListener,
RoomView {
private var myUid: Long = 0
protected lateinit var messageView: MessageView
protected lateinit var bottomView: BottomView
@@ -179,6 +187,8 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
private var atProxy: AtProxy? = null
// 房间小组件
private var widgets: HashMap<String, RoomWidget> = HashMap()
@CallSuper
override fun onFindViews() {
@@ -238,6 +248,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
@SuppressLint("CheckResult")
@CallSuper
override fun initiate() {
initWidget()
//如果不需要開麥,並且還沒有權限的情況下,重置狀態為需要去打開麥克風
myUid = AuthModel.get().currentUid
isCloseScreen = AvRoomDataManager.get().isCloseScreen
@@ -344,6 +355,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
updateRemoteMuteBtn()
openOrCloseGiftValue(true)
GiftValueMrg.get().updateRoomGiftValue(false)
onEnterRoom()
}
RoomEvent.ADD_BLACK_LIST -> onChatRoomMemberBlackAdd(roomEvent.account)
@@ -502,9 +514,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
//設置透明度
rollPagerView.setAnimationDurtion(500)
bannerAdapter.notifyDataSetChanged()
bannerAdapter.setRoomActClickListener { url ->
DialogWebViewActivity.start(mContext, url)
}
// 模擬指示器在viewpager底部效果
val viewPager = rollPagerView.viewPager
@@ -637,6 +646,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
override fun onDestroyView() {
super.onDestroyView()
releaseView()
unregisterWidgets()
}
override fun onDestroy() {
@@ -1021,6 +1031,9 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
@SuppressLint("CheckResult")
override fun toUpMicroPhone(micPosition: Int, currentUid: String, b: Boolean) {
if (!lifecycle.currentState.isAtLeast(androidx.lifecycle.Lifecycle.State.CREATED)) {
return
}
if (AvRoomDataManager.get().isSelfGamePlaying) {
SingleToastUtil.showToast("遊戲中不可以換麥!")
return
@@ -1270,10 +1283,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
}
override fun onSendMsgBtnClick() {
inputLayout.visibility = View.VISIBLE
inputEdit.isFocusableInTouchMode = true
inputEdit.requestFocus()
KeyBoardUtils.showKeyBoard(context, inputEdit)
openMessageInput(null)
}
override fun onSendGiftBtnClick() {
@@ -1289,7 +1299,10 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
override fun onMoreBtnClick() {
val dialog = RoomOperationDialog(mContext)
dialog.setOnActionListener {
redPackageSendDialog = RedPackageSendDialog()
redPackageSendDialog = RedPackageSendDialog.newInstance(AvRoomDataManager.get().redEnvelopeType)
redPackageSendDialog?.setOnDismissListener {
redPackageSendDialog = null
}
redPackageSendDialog?.show(activity)
}
dialog.show()
@@ -1299,4 +1312,59 @@ open class BaseRoomFragment<V : IBaseRoomView?, P : BaseRoomPresenter<V>?> :
RoomMsgActivity.start(mContext)
}
}
/**
* 注册组件
*/
protected fun registerWidget(name: String, widget: RoomWidget) {
widgets.put(name, widget)
widget.onStart(this)
}
/**
* 取消注册组件
*/
protected fun unregisterWidgets() {
widgets.values.forEach {
it.onStop()
}
widgets.clear()
}
override fun getLifecycleOwner(): LifecycleOwner {
return this
}
open fun initWidget() {
}
@Subscribe(threadMode = ThreadMode.MAIN)
open fun onOpenRoomMessageInputEvent(event: OpenRoomMessageInputEvent) {
lifecycleScope.launch {
lifecycle.withResumed {
view?.postDelayed({
openMessageInput(event.text)
}, 500)
}
}
}
/**
* 打开公屏输入
*/
fun openMessageInput(text: String?) {
inputLayout.visibility = View.VISIBLE
if (text != null) {
inputEdit.setText(text)
inputEdit.setSelection(inputEdit.length())
}
inputEdit.isFocusableInTouchMode = true
inputEdit.requestFocus()
KeyBoardUtils.showKeyBoard(context, inputEdit)
}
protected open fun onEnterRoom(){
}
}

View File

@@ -14,6 +14,7 @@ import com.yizhuan.erban.avroom.firstcharge.FirstChargePrizeDialog
import com.yizhuan.erban.avroom.game.GameDelegate
import com.yizhuan.erban.avroom.game.OnGameStatusChangeListener
import com.yizhuan.erban.avroom.presenter.GameRoomPresenter
import com.yizhuan.erban.avroom.redpackage.RedPackageWidget
import com.yizhuan.erban.avroom.view.IGameRoomView
import com.yizhuan.erban.databinding.FragmentGameRoomBinding
import com.yizhuan.erban.ui.widget.GiftDialog.OnGiftDialogBtnClickListener
@@ -193,4 +194,8 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
super.onDestroy()
}
override fun initWidget() {
super.initWidget()
registerWidget(RedPackageWidget::class.java.simpleName, gameBinding.redPackageWidget)
}
}

View File

@@ -26,6 +26,7 @@ import com.yizhuan.erban.avroom.dialog.PKScoreBoardDialog;
import com.yizhuan.erban.avroom.firstcharge.FirstChargePrizeDialog;
import com.yizhuan.erban.avroom.giftvalue.GiftValueDialogUiHelper;
import com.yizhuan.erban.avroom.presenter.HomePartyPresenter;
import com.yizhuan.erban.avroom.redpackage.RedPackageWidget;
import com.yizhuan.erban.avroom.view.IHomePartyView;
import com.yizhuan.erban.avroom.widget.PKBoardView;
import com.yizhuan.erban.base.BaseMvpActivity;
@@ -133,6 +134,12 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
bottomView.setBottomViewListener(new PartyRoomBottomViewWrapper());
}
@Override
public void initWidget() {
super.initWidget();
registerWidget(RedPackageWidget.class.getSimpleName(), gameBinding.redPackageWidget);
}
@SuppressLint("CheckResult")
@Override
public void initiate() {
@@ -526,7 +533,6 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
}
}
@Override
public void onDestroy() {
if (mDisposable != null) {
@@ -808,7 +814,6 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
} else {
gameBinding.ivTreasureBoxCp.setVisibility(View.GONE);
gameBinding.ivTreasureBox.setVisibility(View.VISIBLE);
GlideApp.with(BasicConfig.INSTANCE.getAppContext())
.load(GoldBoxHelper.getBoxIcon())
.error(R.drawable.icon_room_treasure_box)

View File

@@ -16,6 +16,7 @@ import com.yizhuan.erban.avroom.adapter.SingleRoomPKMicroViewAdapter
import com.yizhuan.erban.avroom.dialog.RequestUpMicDialog
import com.yizhuan.erban.avroom.firstcharge.FirstChargePrizeDialog
import com.yizhuan.erban.avroom.presenter.SingleRoomPresenter
import com.yizhuan.erban.avroom.redpackage.RedPackageWidget
import com.yizhuan.erban.avroom.singleroompk.SingleRoomPkFinishDialog
import com.yizhuan.erban.avroom.singleroompk.SingleRoomPkForceFinishDialog
import com.yizhuan.erban.avroom.singleroompk.SingleRoomPkReceivedDialog
@@ -119,16 +120,10 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
@SuppressLint("SetTextI18n")
private fun updateFansTeamInfo(initInfo: FansTeamInitInfo) {
var clickListener: View.OnClickListener? = null
if (!AvRoomDataManager.get().isRoomOwner && !initInfo.isAnchorFans && initInfo.hasFansTeamCurrentRoom) {
gameBinding.flFansTeamJoinTip.isVisible = true
gameBinding.tvFansTeamOpt.isVisible = false
} else {
gameBinding.flFansTeamJoinTip.isVisible = false
gameBinding.tvFansTeamOpt.isVisible = true
}
if (initInfo.hasFansTeamCurrentRoom) {
if (AvRoomDataManager.get().isRoomOwner) {
gameBinding.flFansTeamJoinTip.isVisible = false
gameBinding.tvFansTeamOpt.isVisible = true
gameBinding.tvFansTeamOpt.text = "粉絲團(${initInfo.anchorFansNum})"
clickListener = View.OnClickListener {
DialogWebViewActivity.start(
@@ -138,12 +133,16 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
}
} else {
if (initInfo.isAnchorFans) {
gameBinding.flFansTeamJoinTip.isVisible = false
gameBinding.tvFansTeamOpt.isVisible = true
gameBinding.tvFansTeamOpt.text =
"粉絲LV.${if (initInfo.fansLevelSeq == 0) 1 else initInfo.fansLevelSeq}"
clickListener = View.OnClickListener {
FansTeamJoinedActivity.start(requireContext())
}
} else {
gameBinding.flFansTeamJoinTip.isVisible = true
gameBinding.tvFansTeamOpt.isVisible = false
clickListener = View.OnClickListener {
FansTeamJoinActivity.start(requireContext())
}
@@ -151,6 +150,8 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
}
} else {
if (AvRoomDataManager.get().isRoomOwner) {
gameBinding.flFansTeamJoinTip.isVisible = false
gameBinding.tvFansTeamOpt.isVisible = true
gameBinding.tvFansTeamOpt.text = "開通粉絲團"
clickListener = View.OnClickListener {
CommonWebViewActivity.start(
@@ -159,6 +160,8 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
)
}
} else {
gameBinding.flFansTeamJoinTip.isVisible = false
gameBinding.tvFansTeamOpt.isVisible = true
gameBinding.tvFansTeamOpt.text = "該主播暫未開通粉絲團"
}
}
@@ -229,6 +232,11 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
bottomView.setBottomViewListener(BaseRoomBottomViewWrapper())
}
override fun onEnterRoom() {
super.onEnterRoom()
fansTeamViewModel.loadFansTeamInitInfo()
}
override fun updateView() {
super.updateView()
if (AvRoomDataManager.get().isOpenAnotherPKMode && gameBinding.microView.adapter !is SingleRoomPKMicroViewAdapter) {
@@ -262,4 +270,8 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
).openDialog()
}
override fun initWidget() {
super.initWidget()
registerWidget(RedPackageWidget::class.java.simpleName, gameBinding.redPackageWidget)
}
}

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-TW" //語言
//調用遊戲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)

View File

@@ -20,6 +20,8 @@ import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData;
import com.netease.nimlib.sdk.util.Entry;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.avroom.core.AudioRoomContext;
import com.yizhuan.xchat_android_core.support.room.RoomContext;
import com.yizhuan.erban.avroom.view.IAvRoomView;
import com.yizhuan.erban.base.BaseMvpPresenter;
import com.yizhuan.xchat_android_core.Constants;
@@ -118,7 +120,6 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
exitRoom();
}
AvRoomDataManager.get().updateServiceRoomInfo(roomInfo);
initAnotherPKData();
mAvRoomModel.enterRoom(roomInfo.getRoomId(), 3, fromType, fromNick, fromUid)
.flatMap(this::dealServerMicInfo)
.map(this::dealMicMemberFromIMNet)
@@ -128,6 +129,8 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
.subscribe(roomQueueInfoSparseArray -> {
long uid = AuthModel.get().getCurrentUid();
AudioEngineManager.get().startRtcEngine(uid, roomInfo.getAudioSdkType());
// TODO 临时方案后续逐步完善整个房间的RoomContext替换计划
new AudioRoomContext(roomInfo.getUid()).run();
if (getMvpView() != null) {
getMvpView().enterRoomSuccess();
}
@@ -139,6 +142,7 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
.subscribe((stringServiceResult) -> EventBus.getDefault().post(new AudioPartyOpenEvent()));
mAvRoomModel.loadMessageHistory(AvRoomDataManager.get().clearScreenTime);
IMNetEaseManager.get().joinAvRoom();
initAnotherPKData();
}, this::dealEnterRoomError);
}
@@ -147,7 +151,12 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
if (AvRoomDataManager.get().isOpenAnotherPKMode()) {
RoomPKModel.INSTANCE.getRoomPKData(AvRoomDataManager.get().getRoomUid())
.compose(bindToLifecycle())
.subscribe(roomPkBean -> AvRoomDataManager.get().roomPkLiveData.setValue(roomPkBean));
.subscribe(roomPkBean -> {
AvRoomDataManager.get().roomPkLiveData.setValue(roomPkBean);
if (AvRoomDataManager.get().isSingleRoom()){
AudioEngineManager.get().setRemoteMute(roomPkBean.getAUid(), roomPkBean.getAMicStatus() == 0);
}
});
}
}

View File

@@ -70,10 +70,20 @@ public class RoomManagerPresenter extends BaseMvpPresenter<IRoomManagerView> {
Iterator<ChatRoomMember> iterator = paramList.iterator();
while (iterator.hasNext()) {
ChatRoomMember member = iterator.next();
if (member != null
&& !TextUtils.isEmpty(member.getAccount())
&& map.containsKey(member.getAccount())) {
iterator.remove();
if (member != null && !TextUtils.isEmpty(member.getAccount())) {
if (map.containsKey(member.getAccount())) {
iterator.remove();
} else {
if (member.getNick() == null || member.getAvatar() == null) {
for (UserInfo info : userInfos) {
if (String.valueOf(info.getUid()).equals(member.getAccount())) {
member.setNick(info.getNick());
member.setAvatar(info.getAvatar());
break;
}
}
}
}
}
}
return paramList;

View File

@@ -1,20 +0,0 @@
package com.yizhuan.erban.avroom.redpackage
import android.widget.TextView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R
import com.yizhuan.erban.ui.utils.ImageLoadUtils
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeGiftItemVO
class RedPackageGiftAdapter(layoutId: Int = R.layout.item_red_package_gift) :
BaseQuickAdapter<RedEnvelopeGiftItemVO, BaseViewHolder>(layoutId) {
override fun convert(helper: BaseViewHolder, item: RedEnvelopeGiftItemVO) {
ImageLoadUtils.loadAvatar(mContext, item.giftVo?.giftUrl, helper.getView(R.id.iv_gift))
helper.setText(R.id.tv_gift_num, "x${item.giftNum}")
helper.getView<TextView>(R.id.tv_gift_name)?.let {
it.text = item.giftVo?.giftName
}
}
}

View File

@@ -0,0 +1,169 @@
package com.yizhuan.erban.avroom.redpackage
import android.content.Context
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.MutableLiveData
import com.yizhuan.erban.avroom.activity.AVRoomActivity
import com.yizhuan.erban.avroom.redpackage.open.RedPackageOpenDialog
import com.yizhuan.xchat_android_core.im.custom.bean.RedPackageAttachment
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager
import com.yizhuan.xchat_android_core.manager.RoomEvent
import com.yizhuan.xchat_android_core.redpackage.RedPackageModel
import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo
import com.yizhuan.xchat_android_core.support.room.RoomContext
import com.yizhuan.xchat_android_core.support.room.RoomHandler
/**
* Created by Max on 2023/10/26 11:26
* Desc:红包处理器
**/
class RedPackageHandler : RoomHandler() {
// 入口图标-数据
val iconLiveData: MutableLiveData<RedPackageNotifyInfo?> = MutableLiveData()
/**
* 红包相关操作计数;目前的红包操作为:【正在打开当前房间的红包弹窗】。
* 展示时+1销毁时-1以此来判断是否正在进行红包操作
*/
private var operationCount: Int = 0
val inOperation get() = operationCount > 0
override fun onStart(context: RoomContext) {
super.onStart(context)
registerSignaling()
}
override fun onStop(context: RoomContext) {
super.onStop(context)
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
super.onStateChanged(source, event)
if (event == Lifecycle.Event.ON_RESUME) {
requestLatestRoomRedPackage()
}
}
/**
* 尝试展示红包
* PS目前这个方法仅为了解决通过房间外的红包入口进入房间后需要查询该红包展示出来。
*/
fun tryShowRedPackage(redPackageId: Long) {
val disposable = RedPackageModel.getRedPackage(redPackageId)
.compose(bindToLifecycle())
.subscribe({ item ->
if (item.state != 3 && item.state != 6 && item.state != 4) {
roomView?.getActivity().let {
RedPackageOpenDialog.newInstance(item).show(it)
}
}
}, {})
}
/**
* 监听房间信令
*/
private fun registerSignaling() {
// TODO 临时方案不应在这里直接监听IM后续会统一分发出口
// 信令来源:新/旧版的厅内红包,非全服红包
IMNetEaseManager.get().chatRoomEventObservable
.compose<RoomEvent>(bindToLifecycle<RoomEvent>())
.filter {
it?.event == RoomEvent.RECEIVE_RED_PACKAGE && it?.chatRoomMessage?.attachment is RedPackageAttachment
}.map {
(it.chatRoomMessage.attachment as RedPackageAttachment).getRedPackageNotifyInfo()
}
.subscribe { data: RedPackageNotifyInfo ->
handleRoomRedPackage(data, true)
}
}
/**
* 查找最新的厅内红包(新/旧版的厅内红包,非全服红包)
*/
private fun requestLatestRoomRedPackage() {
val roomId = roomContext?.roomId ?: return
RedPackageModel.getLatestRoomRedPackage(roomId)
.compose(bindToLifecycle())
.subscribe({ data ->
handleRoomRedPackage(data, false)
}, {
if (it.message == "No RedPackage") {
updateIcon(null)
} else {
// 网络等原因的失败,不处理就好
}
})
}
/**
* 处理厅内红包,非全服红包
* @param isSignaling 是否来自信令?
*/
private fun handleRoomRedPackage(data: RedPackageNotifyInfo, isSignaling: Boolean) {
tryShowOpenDialog(data, isSignaling)
updateIcon(data)
}
/**
* 更新红包入口图标
*/
private fun updateIcon(data: RedPackageNotifyInfo?) {
iconLiveData.postValue(data)
}
/**
* 尝试展示红包领取弹窗
*/
private fun tryShowOpenDialog(data: RedPackageNotifyInfo, isSignaling: Boolean) {
val activity = roomView?.getActivity() ?: return
if (activity.isFinishing) {
return
}
if (!isSignaling) {
return
}
if (data.kind == 0 || (data.kind == 1 && data.validityType == 0)) {
//【旧版本-厅内红包kind=0】、【新版本-厅内无门槛-立即生效红包kind=1&validityType=0】
RedPackageOpenDialog.newInstance(data).show(activity)
}
}
/**
* 请求刷新Icon数据已过期
*/
fun requestRefreshIcon() {
// updateIcon(null)
requestLatestRoomRedPackage()
}
fun startOperation() {
operationCount++
}
fun stopOperation() {
operationCount--
}
/**
* 全服红包信令之前是在BaseActivity中处理的现在为了红包的一个需求暂且拦截到这里处理
*/
fun onAllServiceSignaling(context: Context, data: RedPackageNotifyInfo) {
if (context is AVRoomActivity) {
if (roomContext?.roomId == data.roomUid) {
RedPackageOpenDialog.newInstance(data).show(context)
} else {
if (!inOperation) {
RedPackageGoRoomDialog.newInstance(data).show(context)
} else {
// 需求:正在房间中领取红包时,不展示其他房间的全服红包
}
}
} else {
RedPackageGoRoomDialog.newInstance(data).show(context)
}
}
}

View File

@@ -1,40 +0,0 @@
package com.yizhuan.erban.avroom.redpackage
import android.graphics.Color
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R
import com.yizhuan.erban.ui.utils.ImageLoadUtils
import com.yizhuan.erban.utils.UserUtils
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeItemVO
import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
import com.yizhuan.xchat_android_library.utils.ResUtil
import java.text.SimpleDateFormat
import java.util.*
class RedPackageOpenAdapter : BaseQuickAdapter<RedEnvelopeItemVO, BaseViewHolder>(R.layout.item_red_package_diamond) {
private val dateFormat = SimpleDateFormat(ResUtil.getString(R.string.avroom_redpackage_redpackageopenadapter_01), Locale.CHINA)
override fun convert(helper: BaseViewHolder, item: RedEnvelopeItemVO) {
ImageLoadUtils.loadAvatar(mContext, item.userVO.avatar, helper.getView(R.id.iv_avatar))
val isSelf = item.userVO.uid == UserUtils.getUserUid()
helper.setText(R.id.tv_nickname, if (isSelf) ResUtil.getString(R.string.avroom_redpackage_redpackageopenadapter_02) else item.userVO.nick.subAndReplaceDot(6))
.setTextColor(R.id.tv_nickname, Color.parseColor(if (isSelf) "#FDCD00" else "#FFFFFF"))
.setText(R.id.tv_time, dateFormat.format(item.createTime))
.setText(R.id.tv_diamond_num, item.amount.substringBefore("."))
item.redEnvelopeGiftItemVOs?.let {
if (it.isNotEmpty()) {
helper.setGone(R.id.tv_diamond_num, false)
val rvGift = helper.getView<RecyclerView>(R.id.rv_gift)
val adapter = RedPackageGiftAdapter()
rvGift.visibility = View.VISIBLE
rvGift.layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false)
rvGift.adapter = adapter
adapter.setNewData(it)
}
}
}
}

View File

@@ -1,188 +0,0 @@
package com.yizhuan.erban.avroom.redpackage
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.text.style.ForegroundColorSpan
import android.view.View
import android.view.WindowManager
import android.view.animation.AccelerateDecelerateInterpolator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.widget.MessageView
import com.yizhuan.erban.base.BaseDialog
import com.yizhuan.erban.databinding.DialogRedPackageOpenBinding
import com.yizhuan.erban.ui.utils.ImageLoadUtils
import com.yizhuan.erban.utils.UserUtils
import com.yizhuan.xchat_android_core.DemoCache
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.home.event.FollowRoomEvent
import com.yizhuan.xchat_android_core.home.model.CollectionRoomModel
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.redpackage.*
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeState.Companion.REMAIN_ZERO
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeState.Companion.SUCCESS
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeState.Companion.TIME_OUT
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeState.Companion.TIME_OUT_BACK
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import org.greenrobot.eventbus.EventBus
class RedPackageOpenDialog : BaseDialog<DialogRedPackageOpenBinding>() {
private var mObjectAnimator: ObjectAnimator? = null
private val redPackageNotifyInfo by lazy { arguments?.getSerializable(KEY_NOTIFY_INFO) as RedPackageNotifyInfo }
private var isOpened = false
private var redPackageInfo: RedPackageInfo? = null
companion object {
private const val KEY_NOTIFY_INFO = "redPackageNotifyInfo"
fun newInstance(redPackageNotifyInfo: RedPackageNotifyInfo): RedPackageOpenDialog {
return RedPackageOpenDialog().apply {
arguments = Bundle().apply {
putSerializable(KEY_NOTIFY_INFO, redPackageNotifyInfo)
}
}
}
}
override fun onStart() {
width = WindowManager.LayoutParams.MATCH_PARENT
height = WindowManager.LayoutParams.WRAP_CONTENT
super.onStart()
}
override fun init() {
dialog?.setCanceledOnTouchOutside(false)
binding?.ivClose?.setOnClickListener { dismissAllowingStateLoss() }
binding?.ivOpen?.setOnClickListener {
startRedPacketAnim(it)
it.isEnabled = false
}
redPackageNotifyInfo.let {
ImageLoadUtils.loadAvatar(context, it.sendUserAvatar, binding?.ivAvatar)
binding?.tvContent?.text = it.redEnvelopeMessage
binding?.tvNickname?.text = it.sendUserNick
}
// StatUtil.onEvent("openhongbao", ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_01))
}
@SuppressLint("CheckResult")
private fun startRedPacketAnim(v: View) {
RedPackageModel.openRedPackage(redPackageNotifyInfo.redEnvelopeId)
.subscribe({
redPackageInfo = it
if (mObjectAnimator?.isRunning == false) {
openRedPackage()
}
}
, {
binding?.ivOpen?.isEnabled = true
mObjectAnimator?.cancel()
SingleToastUtil.showToast(it.message)
})
mObjectAnimator = ObjectAnimator.ofFloat(v, "rotationY", 0f, 360f)
mObjectAnimator?.let {
it.duration = 1500
it.interpolator = AccelerateDecelerateInterpolator()
it.addListener(object : AnimatorListenerAdapter() {
var isCanceled = false
override fun onAnimationCancel(animation: Animator) {
isCanceled = true
}
override fun onAnimationEnd(animation: Animator) {
if (!isCanceled) {
openRedPackage()
}
}
})
it.start()
}
// StatUtil.onEvent("openhongbao_open", ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_02))
}
@SuppressLint("SetTextI18n")
private fun openRedPackage() {
if (isOpened) return
redPackageInfo?.let { packageInfo ->
isOpened = true
binding?.clOpened?.visibility = View.VISIBLE
binding?.clRed?.visibility = View.GONE
binding?.tvNicknameOpened?.text = redPackageNotifyInfo.sendUserNick
ImageLoadUtils.loadAvatar(context, redPackageNotifyInfo.sendUserAvatar, binding?.ivAvatarOpened)
packageInfo.redEnvelopeVO?.apply {
binding?.tvContentOpened?.text = message
when (packageInfo.redEnvelopeState) {
SUCCESS -> {
packageInfo.redEnvelopeItemVOs?.firstOrNull { item -> item.userVO.uid == UserUtils.getUserUid() }?.let {
it.redEnvelopeGiftItemVOs?.apply {
if (!isEmpty()) {
val adapter = RedPackageGiftAdapter(R.layout.item_red_package_gift_top)
binding?.rvGift?.visibility = View.VISIBLE
binding?.tvDiamondNum?.visibility = View.GONE
binding?.rvGift?.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
binding?.rvGift?.adapter = adapter
adapter.setNewData(this)
binding?.tvTips?.setTextColor(Color.WHITE)
binding?.tvTips?.text = MessageView.SpannableBuilder(binding?.tvTips)
.append(ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_03))
.append(it.amount, ForegroundColorSpan(Color.parseColor("#FDCD00")))
.append(ResUtil.getString(R.string.avroom_redpackage_redpackageopendialog_04))
.build()
}
}
binding?.tvDiamondNum?.text = it.amount.substringBefore(".")
}
if (!AvRoomDataManager.get().isRoomFans){
AvRoomDataManager.get().roomUid.let {
CollectionRoomModel.get().followRoom("1", it)
.subscribe { _: String? ->
AvRoomDataManager.get().isRoomFans = true
EventBus.getDefault().post(FollowRoomEvent())
}
}
}
}
TIME_OUT, REMAIN_ZERO, TIME_OUT_BACK -> {
binding?.clOpened?.setBackgroundResource(R.drawable.room_red_package_get_bg)
binding?.tvDiamondNum?.visibility = View.GONE
binding?.tvTips?.visibility = View.GONE
binding?.tvNoGet?.visibility = View.VISIBLE
}
}
binding?.tvRedNum?.text = "已領取${pickNum}/${totalNum}"
if (type == ALL_GIFT || type == ALL_DIAMOND) {
DemoCache.saveRedPackage(id)
}
}
val adapter = RedPackageOpenAdapter()
binding?.rvUsers?.adapter = adapter
binding?.rvUsers?.layoutManager = LinearLayoutManager(context)
adapter.setNewData(packageInfo.redEnvelopeItemVOs)
PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
}
}
override fun onDestroyView() {
super.onDestroyView()
mObjectAnimator?.cancel()
mObjectAnimator = null
}
override fun onPause() {
super.onPause()
dismissAllowingStateLoss()
}
}

View File

@@ -1,274 +0,0 @@
package com.yizhuan.erban.avroom.redpackage
import android.annotation.SuppressLint
import android.graphics.Paint
import android.text.Editable
import android.text.TextWatcher
import android.view.KeyEvent
import android.view.View
import android.view.WindowManager
import com.yizhuan.erban.R
import com.yizhuan.erban.base.BaseDialog
import com.yizhuan.erban.common.widget.dialog.DialogManager
import com.yizhuan.erban.databinding.DialogRedPackageSendBinding
import com.yizhuan.erban.pay.password.GiveGoldPassWordFragment
import com.yizhuan.erban.pay.widget.GridPasswordNoFocusView
import com.yizhuan.erban.ui.pay.ChargeActivity
import com.yizhuan.erban.ui.setting.ModifyPwdActivity
import com.yizhuan.erban.ui.webview.CommonWebViewActivity
import com.yizhuan.erban.ui.webview.DialogWebViewActivity
import com.yizhuan.xchat_android_core.Constants
import com.yizhuan.xchat_android_core.UriProvider
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_core.initial.bean.InitInfo
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.pay.event.UpdateWalletInfoEvent
import com.yizhuan.xchat_android_core.redpackage.*
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.utils.toIntOrDef
import com.yizhuan.xchat_android_library.annatation.ActLayoutRes
import com.yizhuan.xchat_android_library.common.util.DeviceUtil
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil
import com.yizhuan.xchat_android_library.utils.CommonUtils
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import com.yizhuan.xchat_android_library.utils.codec.DESUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@ActLayoutRes(R.layout.dialog_red_package_send)
class RedPackageSendDialog : BaseDialog<DialogRedPackageSendBinding>(), GridPasswordNoFocusView.OnPasswordChangedListener, TextWatcher {
private var passWordFragment: GiveGoldPassWordFragment? = null
private val dialogManager by lazy { DialogManager(context) }
private var isAll = false
private var isGift = false
override fun onStart() {
width = WindowManager.LayoutParams.MATCH_PARENT
height = WindowManager.LayoutParams.WRAP_CONTENT
super.onStart()
}
@SuppressLint("SetTextI18n")
override fun init() {
EventBus.getDefault().register(this)
PayModel.get().currentWalletInfo?.let {
binding?.tvBalanceNum?.text = it.diamondNum.toInt().toString()
}
if (InitialModel.get().cacheInitInfo == null) {
InitialModel.get().init(true)
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_redpackage_redpackagesenddialog_01))
dismissAllowingStateLoss()
return
}
val initInfo = InitialModel.get().cacheInitInfo ?: InitInfo()
/**
* 廳內
*/
fun changeToNotAll() {
isAll = false
binding?.tvAllRed?.alpha = 0.5f
binding?.tvRoomRed?.alpha = 1f
binding?.indicatorAllRed?.visibility = View.GONE
binding?.indicatorRoomRed?.visibility = View.VISIBLE
binding?.tvGoldNumHint?.text = "紅包總金額不低於${initInfo.redEnvelopeConfig.roomRedEnvelopeMinAmount}鉆石且必須為10的倍數"
binding?.editRedNum?.hint = "${initInfo.redEnvelopeConfig.roomRedEnvelopeMinNum}-${initInfo.redEnvelopeConfig.roomRedEnvelopeMaxNum}"
}
/**
* 全服
*/
fun changeToAll() {
isAll = true
binding?.tvAllRed?.alpha = 1f
binding?.tvRoomRed?.alpha = 0.5f
binding?.indicatorAllRed?.visibility = View.VISIBLE
binding?.indicatorRoomRed?.visibility = View.GONE
binding?.tvGoldNumHint?.text = "紅包總金額不低於${initInfo.redEnvelopeConfig.serverRedEnvelopeMinAmount}鉆石且必須為100的倍數"
binding?.editRedNum?.hint = "${initInfo.redEnvelopeConfig.serverRedEnvelopeMinNum}-${initInfo.redEnvelopeConfig.serverRedEnvelopeMaxNum}"
}
when (initInfo.redEnvelopedPosition) {
2 -> changeToAll()
else -> changeToNotAll()
}
binding?.tvCharge?.paint?.flags = Paint.UNDERLINE_TEXT_FLAG
binding?.tvCharge?.paint?.isAntiAlias = true
binding?.tvChangeType?.paint?.flags = Paint.UNDERLINE_TEXT_FLAG
binding?.tvChangeType?.paint?.isAntiAlias = true
binding?.tvChangeType?.setOnClickListener {
if (isGift) {
isGift = false
binding?.tvRedTypeHint?.text = "當前為手氣紅包,"
binding?.tvChangeType?.text = "改為禮物紅包"
} else {
isGift = true
binding?.tvRedTypeHint?.text = "當前為禮物紅包,"
binding?.tvChangeType?.text = "改為手氣紅包"
}
}
//默認就已經是手氣紅包,如果後臺配置為了禮物紅包就在這裏改下
if (initInfo.redEnvelopeType == 2 && !isGift) {
binding?.tvChangeType?.callOnClick()
}
binding?.tvCharge?.setOnClickListener {
if (!CommonUtils.isFastDoubleClick(800)) {
if (AppMetaDataUtil.getChannelID() == Constants.GOOGLE) {
ChargeActivity.start(context)
} else {
CommonWebViewActivity.start(
context, UriProvider.getOfficialPay(
4,
DeviceUtil.getDeviceId(context)
)
)
}
}
}
binding?.ivClose?.setOnClickListener { dismissAllowingStateLoss() }
binding?.ivHelp?.setOnClickListener { DialogWebViewActivity.start(context, UriProvider.getRedPacketRule()) }
binding?.ivSend?.setOnClickListener {
UserModel.get().cacheLoginUserInfo?.let {
if (!it.isBindPaymentPwd) {
ModifyPwdActivity.start(context, ModifyPwdActivity.PAY_PWD)
return@setOnClickListener
}
}
val minNum = if (isAll) initInfo.redEnvelopeConfig.serverRedEnvelopeMinNum else initInfo.redEnvelopeConfig.roomRedEnvelopeMinNum
val maxNum = if (isAll) initInfo.redEnvelopeConfig.serverRedEnvelopeMaxNum else initInfo.redEnvelopeConfig.roomRedEnvelopeMaxNum
val minGold = if (isAll) initInfo.redEnvelopeConfig.serverRedEnvelopeMinAmount else initInfo.redEnvelopeConfig.roomRedEnvelopeMinAmount
val maxGold = if (isAll) initInfo.redEnvelopeConfig.serverRedEnvelopeMaxAmount else initInfo.redEnvelopeConfig.roomRedEnvelopeMaxAmount
val rate = if (initInfo.redEnvelopeConfig.exchangeDiamondsRate == 0.0) 0.68 else initInfo.redEnvelopeConfig.exchangeDiamondsRate
val redNum = binding?.editRedNum?.text.toString().toIntOrDef()
if (redNum < minNum || redNum > maxNum) {
SingleToastUtil.showToast("紅包數量不能小於${minNum}或大於${maxNum}!")
return@setOnClickListener
}
val goldNum = binding?.editGoldNum?.text.toString().toIntOrDef()
if (isAll) {
if (goldNum % 100 != 0) {
SingleToastUtil.showToast("鉆石數必須為100的倍數!")
return@setOnClickListener
}
} else {
if (goldNum % 10 != 0) {
SingleToastUtil.showToast("鉆石數必須為10的倍數!")
return@setOnClickListener
}
}
if (goldNum < minGold || goldNum > maxGold) {
SingleToastUtil.showToast("鉆石數量不能小於${minGold}或大於${maxGold}!")
return@setOnClickListener
}
if (isGift && goldNum.toFloat() / redNum < 1) {//單個禮物紅包價值不低於1鉆石
SingleToastUtil.showToast("單個紅包金額過低")
return@setOnClickListener
}
if (!isGift && goldNum.toFloat() / redNum * rate < 0.1) {//單個手氣紅包價值不低於0.1水晶
SingleToastUtil.showToast("單個紅包金額過低")
return@setOnClickListener
}
GiveGoldPassWordFragment.newInstance(childFragmentManager, binding?.editGoldNum?.text.toString()).apply {
setListener(this@RedPackageSendDialog)
passWordFragment = this
}
};
binding?.tvAllRed?.setOnClickListener {
if (isAll) return@setOnClickListener
changeToAll()
}
binding?.tvRoomRed?.setOnClickListener {
if (!isAll) return@setOnClickListener
changeToNotAll()
}
binding?.editRedText?.addTextChangedListener(this)
binding?.editRedText?.setOnEditorActionListener { _, _, event ->
event.keyCode == KeyEvent.KEYCODE_ENTER
}
// StatUtil.onEvent("room_sendhongbao", "進入發紅包頁面")
}
private fun getRedType(): Int {
return if (isAll) {
if (isGift) ALL_GIFT else ALL_DIAMOND
} else {
if (isGift) ROOM_GIFT else ROOM_DIAMOND
}
}
override fun onDestroyView() {
binding?.editRedText?.removeTextChangedListener(this)
super.onDestroyView()
}
@SuppressLint("CheckResult")
override fun onTextChanged(psw: String) {
val password = passWordFragment?.password?.password ?: ""
if (password.length == 6) {
dialogManager.showProgressDialog(context)
RedPackageModel.sendRedPackage(binding?.editGoldNum?.text.toString(),
binding?.editRedText?.text.toString().ifEmpty { "恭喜發財,大吉大利!" },
binding?.editRedNum?.text.toString(),
AvRoomDataManager.get().mCurrentRoomInfo?.uid.toString(), getRedType(), DESUtils.DESAndBase64(password))
.doOnError {
dialogManager.dismissDialog()
SingleToastUtil.showToast(it.message)
passWordFragment?.password?.clearPassword()
}
.subscribe { _ ->
PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
dialogManager.dismissDialog()
SingleToastUtil.showToast("發送成功")
passWordFragment?.dismissAllowingStateLoss()
dismissAllowingStateLoss()
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onWalletInfoUpdate(event: UpdateWalletInfoEvent?) {
binding?.tvBalanceNum?.text = PayModel.get().currentWalletInfo?.diamondNum?.toString()
?: "0"
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
override fun onInputFinish(psw: String) {
}
@SuppressLint("SetTextI18n")
override fun afterTextChanged(s: Editable) {
binding?.tvRedTextLimit?.text = "${s.length}/20"
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun handleRedPackageDialog(event: RedPackageEvent?) {
dismissAllowingStateLoss()
}
}

View File

@@ -0,0 +1,253 @@
package com.yizhuan.erban.avroom.redpackage
import android.content.Context
import android.util.AttributeSet
import android.util.TypedValue
import android.view.LayoutInflater
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.chuhai.utils.ServiceTime
import com.chuhai.utils.ktx.singleClick
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.redpackage.open.RedPackageOpenDialog
import com.yizhuan.erban.common.widget.dialog.DialogManager
import com.yizhuan.erban.databinding.RedPackageWidgetBinding
import com.yizhuan.xchat_android_core.redpackage.RedPackageModel
import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo
import com.yizhuan.xchat_android_core.support.room.FrameLayoutRoomWidget
import com.yizhuan.xchat_android_core.support.room.RoomContext
import com.yizhuan.xchat_android_core.support.room.RoomView
import com.yizhuan.xchat_android_core.support.room.RoomWidget
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
import okhttp3.internal.toLongOrDefault
import java.text.SimpleDateFormat
import java.util.TimeZone
import java.util.concurrent.TimeUnit
/**
* Created by Max on 2023/10/24 16:37
* Desc:房间内的红包入口
**/
class RedPackageWidget : FrameLayoutRoomWidget, RoomWidget {
private var countDownDisposable: Disposable? = null
private var data: RedPackageNotifyInfo? = null
private val redPackageHandler: RedPackageHandler?
get() = RoomContext.get()
?.findAbility<RedPackageHandler>(RedPackageHandler::class.java.simpleName)
// 临时这样实现,后续优化进度弹窗
private var dialogManager: DialogManager? = null
// 倒计时格式(分:秒)
private val mmssFormat by lazy(LazyThreadSafetyMode.NONE) {
SimpleDateFormat("mm:ss").apply {
timeZone = TimeZone.getTimeZone("GMT+00:00")
}
}
private val binding: RedPackageWidgetBinding =
DataBindingUtil.inflate(
LayoutInflater.from(
context
), R.layout.red_package_widget, this, true
)
private var compositeDisposable: CompositeDisposable? = null
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
constructor(
context: Context,
attrs: AttributeSet?,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attrs, defStyleAttr, defStyleRes)
init {
// 默认不可见
this.isVisible = false
this.setBackgroundResource(R.drawable.red_package_widget_bg)
singleClick {
data?.let {
tryShowRedPackage(it)
}
}
}
/**
* 开始倒计时
* @param time 开抢时间
*/
private fun startCountDown(time: Long) {
val count = time - ServiceTime.time
if (count <= 0) {
switchUI(false)
return
}
countDownDisposable =
Observable.intervalRange(0, count / 1000, 0, 1000L, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
val gap = time - ServiceTime.time
if (gap >= 0) {
binding.tvText.text = mmssFormat.format(gap)
}
}
.doOnComplete {
switchUI(false)
}
.subscribe()
}
/**
* 切换UI
* @param isCountDown 是否倒计时模式?否则为可抢红包模式
*/
private fun switchUI(isCountDown: Boolean) {
if (isCountDown) {
binding.tvText.setBackgroundResource(R.drawable.shape_99292929_8)
binding.tvText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10f)
} else {
binding.tvText.setBackgroundResource(R.drawable.red_package_widget_bg_text)
binding.tvText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 9f)
binding.tvText.setText(R.string.red_package_widget_get)
}
}
override fun onStart(roomView: RoomView) {
super.onStart(roomView)
roomView.getActivity()?.let {
this.dialogManager = DialogManager(it)
this.dialogManager?.setCanceledOnClickOutside(false)
}
}
override fun onInitialize(roomView: RoomView, roomContext: RoomContext) {
super.onInitialize(roomView, roomContext)
val lifecycleOwner = roomView.getLifecycleOwner()
redPackageHandler?.iconLiveData?.observe(lifecycleOwner) {
loadData(it)
}
}
/**
* 更新数据
*/
private fun loadData(data: RedPackageNotifyInfo?) {
this.data = data
stopCountDown()
if (data != null) {
val num = data.redEnvelopeNum
if (num > 0) {
if (num > 99) {
binding.tvNum.text = "99+"
} else {
binding.tvNum.text = num.toString()
}
binding.tvNum.isVisible = true
} else {
binding.tvNum.isVisible = false
}
if (data.validityType == 1) {
// 限时生效
switchUI(true)
startCountDown(data.beginTime)
} else {
// 立即生效
switchUI(false)
}
this.isVisible = true
} else {
this.isVisible = false
}
}
/**
* 尝试展示红包
*/
private fun tryShowRedPackage(data: RedPackageNotifyInfo) {
dialogManager?.context?.let {
dialogManager?.showProgressDialog(it, false)
}
val disposable = RedPackageModel.getRedPackage(data.redEnvelopeId.toLongOrDefault(0))
.subscribe({ item ->
dialogManager?.dismissDialog()
when (item.state) {
3 -> {
redPackageHandler?.requestRefreshIcon()
SingleToastUtil.showToast(R.string.red_package_result_empty_tips)
}
4 -> {
val newData = item.result?.redEnvelopeVO
if (newData != null && newData.pickNum == newData.totalNum) {
redPackageHandler?.requestRefreshIcon()
SingleToastUtil.showToast(R.string.red_package_result_empty_tips)
} else {
roomView?.getActivity().let {
RedPackageOpenDialog.newInstance(item).show(it)
}
}
}
2, 6 -> {
redPackageHandler?.requestRefreshIcon()
SingleToastUtil.showToast(R.string.red_package_disabled_tips)
}
else -> {
roomView?.getActivity().let {
RedPackageOpenDialog.newInstance(item).show(it)
}
}
}
}, {
SingleToastUtil.showToast(it.message)
dialogManager?.dismissDialog()
})
getCompositeDisposable().add(disposable)
}
private fun getCompositeDisposable(): CompositeDisposable {
var disposable = compositeDisposable
if (disposable == null) {
disposable = CompositeDisposable()
compositeDisposable = disposable
}
return disposable
}
override fun onStop() {
super.onStop()
this.dialogManager?.dismissDialog()
this.dialogManager = null
this.roomView = null
}
override fun onUnbindContext() {
super.onUnbindContext()
compositeDisposable?.dispose()
compositeDisposable = null
loadData(null)
}
override fun onBindContext(roomContext: RoomContext) {
super.onBindContext(roomContext)
}
private fun stopCountDown() {
if (countDownDisposable?.isDisposed == false) {
countDownDisposable?.dispose()
}
}
}

View File

@@ -0,0 +1,557 @@
package com.yizhuan.erban.avroom.redpackage.open
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import android.view.animation.LinearInterpolator
import androidx.core.view.isVisible
import com.chuhai.utils.ServiceTime
import com.chuhai.utils.ktx.getColorById
import com.chuhai.utils.ktx.singleClick
import com.chuhai.utils.ktx.toStringRes
import com.chuhai.utils.log.ILog
import com.chuhai.utils.spannable.spannableBuilder
import com.trello.rxlifecycle3.android.FragmentEvent
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.redpackage.RedPackageHandler
import com.yizhuan.erban.base.BaseDialog
import com.yizhuan.erban.databinding.RedPackageOpenDialogBinding
import com.yizhuan.erban.ui.utils.loadAvatar
import com.yizhuan.erban.ui.widget.UserInfoDialog
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.home.event.FollowRoomEvent
import com.yizhuan.xchat_android_core.home.event.OpenRoomMessageInputEvent
import com.yizhuan.xchat_android_core.home.event.ShareRoomEvent
import com.yizhuan.xchat_android_core.home.model.CollectionRoomModel
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.redpackage.*
import com.yizhuan.xchat_android_core.support.config.Constants
import com.yizhuan.xchat_android_core.support.room.RoomContext
import com.yizhuan.xchat_android_library.annatation.ActLayoutRes
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import java.text.SimpleDateFormat
import java.util.TimeZone
import java.util.concurrent.TimeUnit
/**
* Created by Max on 2023/10/24 10:14
* Desc:领取红包
**/
@ActLayoutRes(R.layout.red_package_open_dialog)
class RedPackageOpenDialog : BaseDialog<RedPackageOpenDialogBinding>(), ILog {
private var btnAnimator: ObjectAnimator? = null
private var countDownDisposable: Disposable? = null
// 倒计时格式(分:秒)
private val mmssFormat by lazy(LazyThreadSafetyMode.NONE) {
SimpleDateFormat("mm:ss").apply {
timeZone = TimeZone.getTimeZone("GMT+00:00")
}
}
private val data by lazy(LazyThreadSafetyMode.NONE) {
arguments?.getSerializable(Constants.KEY_INTENT) as? RedPackageData
}
// 打开红包的结果
private var openResultRunnable: (() -> Unit)? = null
// 按钮动画是否有效(至少转过了一周期)
private var isValidOfBtnAnimator: Boolean = false
// 按钮执行函数
private var btnRunnable: (() -> Unit)? = null
// 打开红包接口请求中
private var opening = false
companion object {
/**
* 此入口来源仅限:【全服红包信令】、【厅内无门槛-立即生效红包信令】
*/
fun newInstance(data: RedPackageNotifyInfo): RedPackageOpenDialog {
/**
* 收到这两种信令直接展示即可,无需再次请求接口查询状态,
* 但由于信令和接口查询的数据格式不一致,所以这里做下转换,达到逻辑共用
*/
val item = RedPackageData(
amount = null,
avatar = data.sendUserAvatar,
beginTime = data.beginTime,
commissionAmount = null,
createTime = null,
duration = null,
endTime = null,
finish = true,
id = data.redEnvelopeId.toLongOrNull(),
kind = data.kind,
message = data.redEnvelopeMessage,
nick = data.sendUserNick,
num = null,
originalAmount = null,
position = null,
roomTitle = null,
roomUid = data.roomUid,
//红包状态 1 开抢中 2 过时 3 抢光了 4 抢到了 5 将要开始 6 超时已退还
state = null,
type = null,
updateTime = null,
userId = null,
validityType = data.validityType,
result = null
)
return newInstance(item)
}
fun newInstance(data: RedPackageData): RedPackageOpenDialog {
return RedPackageOpenDialog().apply {
arguments = Bundle().apply {
putSerializable(Constants.KEY_INTENT, data)
}
}
}
}
override fun onStart() {
width = WindowManager.LayoutParams.MATCH_PARENT
height = WindowManager.LayoutParams.WRAP_CONTENT
super.onStart()
}
override fun init() {
val data = this.data
if (data == null) {
dismissAllowingStateLoss()
return
}
dialog?.setCanceledOnTouchOutside(false)
binding.ivClose.singleClick {
dismissAllowingStateLoss()
}
binding.layoutBtn.singleClick {
btnRunnable?.invoke()
}
loadData(data)
}
/**
* 加载红包数据
*/
private fun loadData(data: RedPackageData) {
//红包状态 1 开抢中 2 过时 3 抢光了 4 抢到了 5 将要开始 6 超时已退还
if (data.state == 4) {
loadResult(data.result)
} else {
// else简单理解为可领取状态正常情况下在RedPackageWidget点击时有异常状态过滤
loadOpen(data)
}
}
/**
* 加载可领取数据
*/
private fun loadOpen(data: RedPackageData) {
switchResultViewVisible(false)
switchOpenViewVisible(true)
binding.ivSendAvatar.loadAvatar(data.avatar)
binding.tvSendName.text = data.nick
loadTips(data)
loadBtnState(data)
}
/**
* 加载红包提示
*/
private fun loadTips(data: RedPackageData) {
binding.tvOpenTips.isVisible = false
when (data.kind) {
0 -> {
loadTips(data.message)
}
1 -> {
binding.tvOpenTips.setText(R.string.red_package_quick_tips)
binding.tvOpenTips.isVisible = true
}
2 -> {
if (data.finish == true) {
binding.tvOpenTips.setText(R.string.red_package_complete_tips)
} else {
binding.tvOpenTips.spannableBuilder()
.appendText(
text = R.string.red_package_open_tips_follow.toStringRes(),
textColor = getColorById(R.color.color_FFF87A)
)
.appendText(text = R.string.red_package_open_tips_msg_end.toStringRes())
.apply()
}
binding.tvOpenTips.isVisible = true
}
3 -> {
if (data.finish == true) {
binding.tvOpenTips.setText(R.string.red_package_complete_tips)
} else {
binding.tvOpenTips.spannableBuilder()
.appendText(
text = R.string.red_package_open_tips_share.toStringRes(),
textColor = getColorById(R.color.color_FFF87A)
)
.appendText(text = R.string.red_package_open_tips_msg_end.toStringRes())
.apply()
}
binding.tvOpenTips.isVisible = true
}
4 -> {
if (data.finish == true) {
binding.tvOpenTips.setText(R.string.red_package_complete_tips)
} else {
binding.tvOpenTips.spannableBuilder()
.appendText(text = R.string.red_package_open_tips_msg1.toStringRes())
.appendText(
text = data.message ?: "",
textColor = getColorById(R.color.color_FFF87A)
)
.appendText(text = R.string.red_package_open_tips_msg_end.toStringRes())
.apply()
}
binding.tvOpenTips.isVisible = true
}
else -> {
loadTips(data.message)
}
}
}
/**
* 加载按钮状态
*/
private fun loadBtnState(data: RedPackageData) {
binding.groupBtnTime.isVisible = false
binding.ivBtnGet.isVisible = false
binding.tvBtnMsg.isVisible = false
btnRunnable = null
val gap = (data.beginTime ?: 0) - ServiceTime.time
// 开始了?
val started = gap < 0
if (data.kind == 0) {
// 旧厅内红包or全服红包
switchToOpenState()
return
}
if (data.kind == 1 || data.finish == true) {
if (started) {
switchToOpenState()
} else {
startCountDown(data.beginTime ?: 0)
}
} else {
binding.tvBtnMsg.isVisible = true
if (started) {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_no)
btnRunnable = {
SingleToastUtil.showToast(R.string.red_package_open_no_tips)
}
} else {
when (data.kind) {
2 -> {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_follow)
btnRunnable = {
dismissAllowingStateLoss()
showUserDialog(data.userId)
}
}
3 -> {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_share)
btnRunnable = {
dismissAllowingStateLoss()
EventBus.getDefault().post(ShareRoomEvent())
}
}
4 -> {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_msg)
btnRunnable = {
dismissAllowingStateLoss()
EventBus.getDefault().post(OpenRoomMessageInputEvent(data.message))
}
}
else -> {
binding.tvBtnMsg.text = ""
}
}
startTimerForUncompletedState(gap)
}
}
}
/**
* 开启定时器未完成状态更新倒计时结束时更新对应View状态
*/
private fun startTimerForUncompletedState(time: Long) {
val d = Observable.timer(time, TimeUnit.MILLISECONDS)
.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW))
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
binding.tvBtnMsg.setText(R.string.red_package_open_btn_no)
btnRunnable = {
SingleToastUtil.showToast(R.string.red_package_open_no_tips)
}
}
}
/**
* 开始倒计时
* @param time 开抢时间
*/
private fun startCountDown(time: Long) {
stopCountDown()
val count = time - ServiceTime.time
if (count <= 0) {
switchToOpenState()
return
}
binding.groupBtnTime.isVisible = true
countDownDisposable =
Observable.intervalRange(0, count / 1000, 0, 1000L, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
val gap = time - ServiceTime.time
if (gap >= 0) {
binding.tvBtnTime.text = mmssFormat.format(gap)
}
}
.doOnComplete {
switchToOpenState()
}
.subscribe()
}
private fun stopCountDown() {
if (countDownDisposable?.isDisposed == false) {
countDownDisposable?.dispose()
}
}
/**
* 切换为可抢状态
*/
private fun switchToOpenState() {
binding.tvBtnMsg.isVisible = false
binding.groupBtnTime.isVisible = false
binding.ivBtnGet.isVisible = true
btnRunnable = {
if (!opening) {
this.data?.let {
openRedPackage(it)
}
}
}
}
private fun loadTips(msg: String?) {
if (msg.isNullOrEmpty()) {
binding.tvOpenTips.isVisible = false
} else {
binding.tvOpenTips.text = msg
binding.tvOpenTips.isVisible = true
}
}
/**
* 打开红包
*/
private fun openRedPackage(data: RedPackageData) {
opening = true
openResultRunnable = null
startRedPacketAnim(binding.layoutBtn)
val d = RedPackageModel.openRedPackage(data.id ?: 0)
.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)).subscribe({
if (isValidOfBtnAnimator) {
btnAnimator?.cancel()
onOpenSuccess(it)
} else {
openResultRunnable = {
onOpenSuccess(it)
}
}
}, {
if (isValidOfBtnAnimator) {
btnAnimator?.cancel()
onOpenFail(it)
} else {
openResultRunnable = {
onOpenFail(it)
}
}
})
}
/**
* 加载结果
*/
private fun loadResult(data: RedPackageInfo?) {
binding.layoutContent.setBackgroundResource(R.drawable.red_package_result_bg)
switchOpenViewVisible(false)
switchResultViewVisible(true)
binding.groupResultMoney.isVisible = false
binding.tvResultEmptyTips.isVisible = false
binding.ivResultSendAvatar.loadAvatar(data?.redEnvelopeVO?.userVO?.avatar)
binding.tvResultSendName.text = data?.redEnvelopeVO?.userVO?.nick ?: ""
val name = data?.redEnvelopeVO?.userVO?.nick ?: ""
if (name.length > 8) {
binding.tvResultSendName.text = name?.take(8) + "..的紅包"
} else {
binding.tvResultSendName.text = name + "的紅包"
}
binding.tvMessage.text = data?.redEnvelopeVO?.message
binding.tvCount.text = R.string.red_package_result_count_format.toStringRes()
.format(data?.redEnvelopeVO?.pickNum ?: 0, data?.redEnvelopeVO?.totalNum ?: 0)
val adapter = RedPackageResultAdapter()
binding.recyclerView.adapter = adapter
adapter.setNewData(data?.redEnvelopeItemVOs)
when (data?.redEnvelopeState) {
RedEnvelopeState.SUCCESS -> {
binding.tvMoney.text = data.currentUserAmount.toString().substringBefore(".")
binding.groupResultMoney.isVisible = true
}
RedEnvelopeState.TIME_OUT, RedEnvelopeState.REMAIN_ZERO, RedEnvelopeState.TIME_OUT_BACK -> {
binding.tvResultEmptyTips.isVisible = true
}
}
}
/**
* 打开红包响应成功
* @param data 结果
*/
private fun onOpenSuccess(data: RedPackageInfo) {
loadResult(data)
RoomContext.get()
?.findAbility<RedPackageHandler>(RedPackageHandler::class.simpleName)
?.requestRefreshIcon()
when (data.redEnvelopeState) {
RedEnvelopeState.SUCCESS -> {
// 下面这段是延续老代码保留的
if (!AvRoomDataManager.get().isRoomFans) {
AvRoomDataManager.get().roomUid.let {
CollectionRoomModel.get().followRoom("1", it)
.subscribe { _: String? ->
AvRoomDataManager.get().isRoomFans = true
EventBus.getDefault().post(FollowRoomEvent())
}
}
}
}
}
PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
opening = false
}
/**
* 打开红包响应失败
*/
private fun onOpenFail(throwable: Throwable) {
switchToOpenState()
btnAnimator?.cancel()
SingleToastUtil.showToast(throwable.message)
opening = false
}
@SuppressLint("CheckResult")
private fun startRedPacketAnim(v: View) {
if (btnAnimator?.isRunning == true) {
btnAnimator?.cancel()
}
isValidOfBtnAnimator = false
btnAnimator = ObjectAnimator.ofFloat(v, "rotationY", 0f, 360f)
btnAnimator?.let {
it.duration = 600
it.repeatCount = ValueAnimator.INFINITE
it.repeatMode = ValueAnimator.RESTART
it.interpolator = LinearInterpolator()
it.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationRepeat(animation: Animator) {
super.onAnimationRepeat(animation)
isValidOfBtnAnimator = true
if (openResultRunnable != null) {
animation.cancel()
openResultRunnable?.invoke()
}
}
})
it.start()
}
}
private fun switchResultViewVisible(isVisible: Boolean) {
binding.groupResult.isVisible = isVisible
binding.groupResultMoney.isVisible = isVisible
binding.tvResultEmptyTips.isVisible = isVisible
}
private fun switchOpenViewVisible(isVisible: Boolean) {
binding.groupOpen.isVisible = isVisible
binding.tvOpenTips.isVisible = isVisible
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
RoomContext.get()
?.findAbility<RedPackageHandler>(RedPackageHandler::class.simpleName)
?.startOperation()
super.onViewCreated(view, savedInstanceState)
}
override fun onDestroyView() {
super.onDestroyView()
btnAnimator?.cancel()
btnAnimator = null
stopCountDown()
RoomContext.get()
?.findAbility<RedPackageHandler>(RedPackageHandler::class.simpleName)
?.stopOperation()
}
override fun onPause() {
super.onPause()
dismissAllowingStateLoss()
}
private fun showUserDialog(uid: Long?) {
if (uid == null) {
return
}
activity?.let {
UserInfoDialog.showNewUserInfoDialog(
activity,
uid
)
}
}
}

View File

@@ -0,0 +1,46 @@
package com.yizhuan.erban.avroom.redpackage.open
import android.view.View
import android.view.ViewGroup
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.yizhuan.erban.R
import com.yizhuan.erban.ui.utils.loadAvatar
import com.yizhuan.erban.utils.UserUtils
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeItemVO
import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
import com.yizhuan.xchat_android_library.utils.ResUtil
import java.text.SimpleDateFormat
import java.util.Locale
/**
* Created by Max on 2023/10/27 20:24
* Desc:红包领取结果
**/
class RedPackageResultAdapter :
BaseQuickAdapter<RedEnvelopeItemVO, BaseViewHolder>(R.layout.red_package_open_item_result) {
private val dateFormat = SimpleDateFormat(
ResUtil.getString(R.string.avroom_redpackage_redpackageopenadapter_01),
Locale.CHINA
)
override fun convert(helper: BaseViewHolder, item: RedEnvelopeItemVO) {
helper.getView<ImageView>(R.id.iv_avatar).loadAvatar(item.userVO.avatar)
val isSelf = item.userVO.uid == UserUtils.getUserUid()
helper.setText(
R.id.tv_name,
if (isSelf) ResUtil.getString(R.string.avroom_redpackage_redpackageopenadapter_02) else item.userVO.nick.subAndReplaceDot(
6
)
)
helper.setText(R.id.tv_money, item.amount.substringBefore("."))
try {
helper.setText(R.id.tv_time, dateFormat.format(item.createTime))
} catch (e: Exception) {
helper.setText(R.id.tv_time, "")
}
helper.getView<View>(R.id.v_line).isVisible = helper.bindingAdapterPosition != itemCount - 1
}
}

View File

@@ -0,0 +1,284 @@
package com.yizhuan.erban.avroom.redpackage.send
import android.graphics.Color
import androidx.core.view.isVisible
import com.chuhai.utils.ktx.addDisableFilter
import com.chuhai.utils.ktx.getColorById
import com.chuhai.utils.ktx.singleClick
import com.chuhai.utils.ktx.toStringRes
import com.chuhai.utils.log.ILog
import com.yizhuan.erban.R
import com.yizhuan.erban.base.BaseBindingFragment
import com.yizhuan.erban.databinding.RedPackagePrivateFragmentBinding
import com.yizhuan.erban.pay.password.GiveGoldPassWordFragment
import com.yizhuan.erban.pay.widget.GridPasswordNoFocusView
import com.yizhuan.erban.ui.setting.ModifyPwdActivity
import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil
import com.yizhuan.erban.ui.widget.recyclerview.decoration.ColorDecoration
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.redpackage.RedPackageModel
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.utils.toIntOrDef
import com.yizhuan.xchat_android_library.annatation.ActLayoutRes
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import com.yizhuan.xchat_android_library.utils.codec.DESUtils
import okhttp3.internal.toLongOrDefault
import java.math.RoundingMode
import java.text.NumberFormat
/**
* Created by Max on 2023/10/23 12:14
* Desc: 厅内红包
**/
@ActLayoutRes(R.layout.red_package_private_fragment)
class PrivateRedPackageEditorFragment : BaseBindingFragment<RedPackagePrivateFragmentBinding>(),
ILog {
private var passWordFragment: GiveGoldPassWordFragment? = null
private var typeAdapter: RedPackageTypeItemAdapter? = null
// 生效时间类型 0 立即生效 1 限时生效
private var timeType = 0
override fun initiate() {
mBinding.etText.addDisableFilter(" ", "\n")
initTypeView()
updateTimeView(true)
initTips()
}
override fun onSetListener() {
super.onSetListener()
mBinding.tvNow.singleClick {
updateTimeView(true)
}
mBinding.tvDelay.singleClick {
updateTimeView(false)
}
mBinding.tvSend.singleClick {
checkSend()
}
}
private fun initTips() {
val time = InitialModel.get().cacheInitInfo?.redEnvelopeConfig?.endSecond
if (time != null) {
try {
val hour = NumberFormat.getInstance().apply {
maximumFractionDigits = 2
roundingMode = RoundingMode.FLOOR
}.format(time / 3600.0)
mBinding.tvTips.text = R.string.red_package_tips_format.toStringRes().format(hour)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun initTypeView() {
mBinding.recyclerView.addItemDecoration(
ColorDecoration(
Color.TRANSPARENT, UIUtil.dip2px(context, 6.0), 0, false
)
)
val list = ArrayList<RedPackageTypeItemAdapter.ItemData>()
list.add(
RedPackageTypeItemAdapter.ItemData(
1,
R.string.red_package_type_unlimited_name,
R.string.red_package_type_unlimited_tips
)
)
list.add(
RedPackageTypeItemAdapter.ItemData(
2,
R.string.red_package_type_follow_name,
R.string.red_package_type_follow_tips
)
)
list.add(
RedPackageTypeItemAdapter.ItemData(
3,
R.string.red_package_type_share_name,
R.string.red_package_type_share_tips
)
)
list.add(
RedPackageTypeItemAdapter.ItemData(
4,
R.string.red_package_type_msg_name,
R.string.red_package_type_msg_tips
)
)
val adapter = RedPackageTypeItemAdapter(list)
typeAdapter = adapter
adapter.setOnItemClickListener { _, view, position ->
adapter.select(position)
updateTypeView(adapter.getSelect()?.type)
}
mBinding.recyclerView.adapter = adapter
// 默认选择第一个
adapter.select(0)
updateTypeView(adapter.getSelect()?.type)
}
/**
* 更新红包类型对应的视图
*/
private fun updateTypeView(type: Int?) {
when (type) {
1 -> {
mBinding.tvNow.isVisible = true
mBinding.tvDelay.isVisible = true
mBinding.etText.isVisible = false
}
4 -> {
mBinding.tvNow.isVisible = false
mBinding.tvDelay.isVisible = false
mBinding.etText.isVisible = true
}
else -> {
mBinding.tvNow.isVisible = false
mBinding.tvDelay.isVisible = false
mBinding.etText.isVisible = false
}
}
}
/**
* 更新时间选项
*/
private fun updateTimeView(nowOrDelay: Boolean) {
if (nowOrDelay) {
timeType = 0
mBinding.tvNow.setBackgroundResource(R.drawable.red_package_bg_type_selected)
mBinding.tvDelay.setBackgroundResource(R.drawable.shape_f8f8fa_8)
mBinding.tvNow.setTextColor(mBinding.root.context.getColorById(R.color.color_FF285C))
mBinding.tvDelay.setTextColor(mBinding.root.context.getColorById(R.color.color_767585))
} else {
timeType = 1
mBinding.tvNow.setBackgroundResource(R.drawable.shape_f8f8fa_8)
mBinding.tvDelay.setBackgroundResource(R.drawable.red_package_bg_type_selected)
mBinding.tvNow.setTextColor(mBinding.root.context.getColorById(R.color.color_767585))
mBinding.tvDelay.setTextColor(mBinding.root.context.getColorById(R.color.color_FF285C))
}
}
private fun checkSend() {
val initInfo = InitialModel.get().cacheInitInfo
if (initInfo == null) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_redpackage_redpackagesenddialog_01))
return
}
val typeItem = typeAdapter?.getSelect()
if (typeItem?.type == 4) {
if (mBinding.etText.text.toString().trim().isEmpty()) {
toast(R.string.red_package_msg_empty_tips)
return
}
}
val minNum = initInfo.redEnvelopeConfig.roomRedEnvelopeMinNum
val maxNum = initInfo.redEnvelopeConfig.roomRedEnvelopeMaxNum
val minGold = initInfo.redEnvelopeConfig.roomRedEnvelopeMinAmount
val maxGold = initInfo.redEnvelopeConfig.roomRedEnvelopeMaxAmount
val rate =
if (initInfo.redEnvelopeConfig.exchangeDiamondsRate == 0.0) 0.68 else initInfo.redEnvelopeConfig.exchangeDiamondsRate
val redNum = mBinding?.etNum?.text.toString().toIntOrDef()
if (redNum < minNum || redNum > maxNum) {
SingleToastUtil.showToast("紅包數量不能小於${minNum}或大於${maxNum}!")
return
}
val goldNum = mBinding?.etMoney?.text.toString().toIntOrDef()
if (goldNum % 10 != 0) {
SingleToastUtil.showToast("鉆石數必須為10的倍數!")
return
}
if (goldNum < minGold || goldNum > maxGold) {
SingleToastUtil.showToast("鉆石數量不能小於${minGold}或大於${maxGold}!")
return
}
if (goldNum.toFloat() / redNum * rate < 0.1) {//單個手氣紅包價值不低於0.1水晶
SingleToastUtil.showToast("單個紅包金額過低")
return
}
UserModel.get().cacheLoginUserInfo?.let {
if (!it.isBindPaymentPwd) {
ModifyPwdActivity.start(context, ModifyPwdActivity.PAY_PWD)
return
}
}
GiveGoldPassWordFragment.newInstance(
childFragmentManager,
mBinding?.etMoney?.text.toString()
).apply {
setListener(object : GridPasswordNoFocusView.OnPasswordChangedListener {
override fun onTextChanged(psw: String?) {
val password = passWordFragment?.password?.password ?: ""
if (password.length == 6) {
send(password)
}
}
override fun onInputFinish(psw: String?) {
}
})
passWordFragment = this
}
}
/**
* 密码输入完成
*/
private fun send(password: String) {
dialogManager.showProgressDialog(context)
val kind = typeAdapter?.getSelect()?.type ?: 1
val message = if (kind == 4) {
mBinding.etText.text.trim().toString()
} else {
null
}
val validityType = if (kind == 1) {
timeType
} else {
// 非无门槛红包 默认限时
1
}
RedPackageModel.sendRedPackage(
goldNum = mBinding.etMoney.text.trim().toString().toLongOrDefault(0),
message = message,
num = mBinding.etNum.text.trim().toString().toLongOrDefault(0),
roomUId = AvRoomDataManager.get().mCurrentRoomInfo?.uid.toString(),
type = 1,
kind = kind,
validityType = validityType,
password = DESUtils.DESAndBase64(password)
)
.compose(bindToLifecycle())
.doOnError {
dialogManager.dismissDialog()
SingleToastUtil.showToast(it.message)
passWordFragment?.password?.clearPassword()
}
.subscribe { _ ->
PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
dialogManager.dismissDialog()
SingleToastUtil.showToast("發送成功")
passWordFragment?.dismissAllowingStateLoss()
(parentFragment as? RedPackageSendDialog)?.dismissAllowingStateLoss()
}
}
override fun onDestroy() {
super.onDestroy()
passWordFragment?.dismissAllowingStateLoss()
passWordFragment = null
}
}

View File

@@ -0,0 +1,157 @@
package com.yizhuan.erban.avroom.redpackage.send
import com.chuhai.utils.ktx.addDisableFilter
import com.chuhai.utils.ktx.setOnInputChangedListener
import com.chuhai.utils.ktx.singleClick
import com.chuhai.utils.ktx.toStringRes
import com.yizhuan.erban.R
import com.yizhuan.erban.base.BaseBindingFragment
import com.yizhuan.erban.databinding.RedPackagePublicFragmentBinding
import com.yizhuan.erban.pay.password.GiveGoldPassWordFragment
import com.yizhuan.erban.pay.widget.GridPasswordNoFocusView
import com.yizhuan.erban.ui.setting.ModifyPwdActivity
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_core.initial.bean.InitInfo
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.redpackage.RedPackageModel
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.utils.toIntOrDef
import com.yizhuan.xchat_android_library.annatation.ActLayoutRes
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import com.yizhuan.xchat_android_library.utils.codec.DESUtils
import okhttp3.internal.toLongOrDefault
import java.math.RoundingMode
import java.text.NumberFormat
/**
* Created by Max on 2023/10/23 12:14
* Desc:全服红包
**/
@ActLayoutRes(R.layout.red_package_public_fragment)
class PublicRedPackageEditorFragment : BaseBindingFragment<RedPackagePublicFragmentBinding>() {
private var passWordFragment: GiveGoldPassWordFragment? = null
override fun initiate() {
initTips()
mBinding.etText.addDisableFilter("\n")
mBinding.etText.setOnInputChangedListener {
mBinding.tvTextLength.text =
R.string.red_package_result_count_format.toStringRes().format(this, 10)
true
}
mBinding.tvSend.singleClick {
checkSend()
}
}
private fun initTips() {
val time = InitialModel.get().cacheInitInfo?.redEnvelopeConfig?.endSecond
if (time != null) {
try {
val hour = NumberFormat.getInstance().apply {
maximumFractionDigits = 2
roundingMode = RoundingMode.FLOOR
}.format(time / 3600.0)
mBinding.tvTips.text = R.string.red_package_tips_format.toStringRes().format(hour)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun checkSend() {
val initInfo = InitialModel.get().cacheInitInfo ?: InitInfo()
val minNum = initInfo.redEnvelopeConfig.serverRedEnvelopeMinNum
val maxNum = initInfo.redEnvelopeConfig.serverRedEnvelopeMaxNum
val minGold = initInfo.redEnvelopeConfig.serverRedEnvelopeMinAmount
val maxGold = initInfo.redEnvelopeConfig.serverRedEnvelopeMaxAmount
val rate =
if (initInfo.redEnvelopeConfig.exchangeDiamondsRate == 0.0) 0.68 else initInfo.redEnvelopeConfig.exchangeDiamondsRate
val redNum = mBinding?.etNum?.text.toString().toIntOrDef()
if (redNum < minNum || redNum > maxNum) {
SingleToastUtil.showToast("紅包數量不能小於${minNum}或大於${maxNum}!")
return
}
val goldNum = mBinding?.etMoney?.text.toString().toIntOrDef()
if (goldNum % 100 != 0) {
SingleToastUtil.showToast("鉆石數必須為100的倍數!")
return
}
if (goldNum < minGold || goldNum > maxGold) {
SingleToastUtil.showToast("鉆石數量不能小於${minGold}或大於${maxGold}!")
return
}
if (goldNum.toFloat() / redNum * rate < 0.1) {//單個手氣紅包價值不低於0.1水晶
SingleToastUtil.showToast("單個紅包金額過低")
return
}
UserModel.get().cacheLoginUserInfo?.let {
if (!it.isBindPaymentPwd) {
ModifyPwdActivity.start(context, ModifyPwdActivity.PAY_PWD)
return
}
}
GiveGoldPassWordFragment.newInstance(
childFragmentManager,
mBinding?.etMoney?.text.toString()
).apply {
setListener(object : GridPasswordNoFocusView.OnPasswordChangedListener {
override fun onTextChanged(psw: String?) {
val password = passWordFragment?.password?.password ?: ""
if (password.length == 6) {
send(password)
}
}
override fun onInputFinish(psw: String?) {
}
})
passWordFragment = this
}
}
/**
* 密码输入完成
*/
private fun send(password: String) {
dialogManager.showProgressDialog(context)
var message = mBinding.etText.text.trim().toString()
if (message.isEmpty()) {
message = R.string.red_package_msg_def.toStringRes()
}
RedPackageModel.sendRedPackage(
goldNum = mBinding.etMoney.text.trim().toString().toLongOrDefault(0),
message = message,
num = mBinding.etNum.text.trim().toString().toLongOrDefault(0),
roomUId = AvRoomDataManager.get().mCurrentRoomInfo?.uid.toString(),
type = 2,
kind = 0,
validityType = 0,
password = DESUtils.DESAndBase64(password)
)
.compose(bindToLifecycle())
.doOnError {
dialogManager.dismissDialog()
SingleToastUtil.showToast(it.message)
passWordFragment?.password?.clearPassword()
}
.subscribe { _ ->
PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe()
dialogManager.dismissDialog()
SingleToastUtil.showToast("發送成功")
passWordFragment?.dismissAllowingStateLoss()
(parentFragment as? RedPackageSendDialog)?.dismissAllowingStateLoss()
}
}
override fun onDestroy() {
super.onDestroy()
passWordFragment?.dismissAllowingStateLoss()
passWordFragment = null
}
}

View File

@@ -0,0 +1,172 @@
package com.yizhuan.erban.avroom.redpackage.send
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.Gravity
import android.view.WindowManager
import androidx.fragment.app.Fragment
import com.chuhai.utils.ktx.singleClick
import com.chuhai.utils.ktx.toStringRes
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.redpackage.RedPackageEvent
import com.yizhuan.erban.base.BaseDialog
import com.yizhuan.erban.common.ViewPagerAdapter
import com.yizhuan.erban.databinding.RedPackageSendDialogBinding
import com.yizhuan.erban.ui.pay.ChargeActivity
import com.yizhuan.erban.ui.webview.CommonWebViewActivity
import com.yizhuan.erban.ui.webview.DialogWebViewActivity
import com.yizhuan.erban.ui.widget.magicindicator.ViewPagerHelper
import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.yizhuan.xchat_android_core.Constants
import com.yizhuan.xchat_android_core.UriProvider
import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.pay.event.UpdateWalletInfoEvent
import com.yizhuan.xchat_android_core.redpackage.*
import com.yizhuan.xchat_android_library.annatation.ActLayoutRes
import com.yizhuan.xchat_android_library.common.util.DeviceUtil
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.SingleToastUtil
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/10/23 12:14
* Desc:发红包
**/
@ActLayoutRes(R.layout.red_package_send_dialog)
class RedPackageSendDialog : BaseDialog<RedPackageSendDialogBinding>() {
private val permissionType: Int
get() = arguments?.getInt(com.yizhuan.xchat_android_core.support.config.Constants.KEY_INTENT)
?: 0
/**
* 是否有厅内红包权限
*/
private val haveRoomRedPackagePermission get() = (permissionType and 1) != 0
/**
* 是否有全服红包权限
*/
private val haveAllServicePackagePermission get() = (permissionType and 2) != 0
companion object {
/**
* 红包权限类型
*/
fun newInstance(permissionType: Int): RedPackageSendDialog {
return RedPackageSendDialog().apply {
this.arguments = Bundle().apply {
putInt(
com.yizhuan.xchat_android_core.support.config.Constants.KEY_INTENT,
permissionType
)
}
}
}
}
override fun onStart() {
gravity = Gravity.BOTTOM
width = WindowManager.LayoutParams.MATCH_PARENT
height = WindowManager.LayoutParams.WRAP_CONTENT
super.onStart()
}
@SuppressLint("SetTextI18n")
override fun init() {
EventBus.getDefault().register(this)
if (!haveRoomRedPackagePermission && !haveAllServicePackagePermission) {
SingleToastUtil.showToast(R.string.avroom_presenter_avroompresenter_04)
dismissAllowingStateLoss()
return
}
if (InitialModel.get().cacheInitInfo == null) {
InitialModel.get().init(true)
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_redpackage_redpackagesenddialog_01))
dismissAllowingStateLoss()
return
}
initView()
initEvent()
PayModel.get().currentWalletInfo?.let {
binding.tvBalance.text = it.diamondNum.toLong().toString()
}
}
private fun initView() {
val tabTitles = ArrayList<String>()
val fragments = ArrayList<Fragment>()
if (haveRoomRedPackagePermission) {
tabTitles.add(R.string.red_package_room.toStringRes())
fragments.add(PrivateRedPackageEditorFragment())
}
if (haveAllServicePackagePermission) {
tabTitles.add(R.string.red_package_public.toStringRes())
fragments.add(PublicRedPackageEditorFragment())
}
val topMagicIndicatorAdapter = TabIndicatorAdapter(context, tabTitles)
topMagicIndicatorAdapter.setOnItemSelectListener {
binding.viewPager.currentItem = it
}
val commonNavigator = CommonNavigator(context)
commonNavigator.isAdjustMode = true
commonNavigator.adapter = topMagicIndicatorAdapter
binding.tabLayout.navigator = commonNavigator
binding.viewPager.adapter = ViewPagerAdapter(
childFragmentManager,
fragments.toList(),
null
)
ViewPagerHelper.bind(binding.tabLayout, binding.viewPager)
}
private fun initEvent() {
binding.vTopBlank.singleClick {
dismissAllowingStateLoss()
}
binding.ivHelp.singleClick {
DialogWebViewActivity.start(
context,
UriProvider.getRedPacketRule()
)
}
binding.tvBalance.singleClick {
if (AppMetaDataUtil.getChannelID() == Constants.GOOGLE) {
ChargeActivity.start(context)
} else {
CommonWebViewActivity.start(
context, UriProvider.getOfficialPay(
4,
DeviceUtil.getDeviceId(context)
)
)
}
}
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onWalletInfoUpdate(event: UpdateWalletInfoEvent?) {
if (!isViewLoaded) {
return
}
binding.tvBalance.text = PayModel.get().currentWalletInfo?.diamondNum?.toString()
?: "0"
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun handleRedPackageDialog(event: RedPackageEvent?) {
dismissAllowingStateLoss()
}
}

View File

@@ -0,0 +1,76 @@
package com.yizhuan.erban.avroom.redpackage.send
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chuhai.utils.ktx.getColorById
import com.yizhuan.erban.R
import io.realm.internal.Keep
/**
* Created by Max on 2023/10/23 18:02
* Desc:
**/
class RedPackageTypeItemAdapter(list: List<ItemData>) :
BaseQuickAdapter<RedPackageTypeItemAdapter.ItemData, BaseViewHolder>(
R.layout.red_package_private_item_type,
list
) {
private var selectPosition = -1
@Keep
data class ItemData(
/**
* 红包种类 0 旧版本 1 无门槛红包 2 关注红包 3 分享红包 4 弹幕红包
*/
val type: Int, val name: Int, val tips: Int
)
override fun convert(helper: BaseViewHolder, item: ItemData) {
helper.setText(R.id.tv_name, item.name)
helper.setText(R.id.tv_tips, item.tips)
convertState(helper, item)
}
override fun convertPayloads(
helper: BaseViewHolder,
item: ItemData,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
convertState(helper, item)
}
private fun convertState(helper: BaseViewHolder, item: ItemData) {
if (helper.bindingAdapterPosition == selectPosition) {
helper.setBackgroundRes(R.id.layout_root, R.drawable.red_package_bg_type_selected)
helper.setTextColor(
R.id.tv_name,
helper.itemView.context.getColorById(R.color.color_FF285C)
)
helper.setTextColor(
R.id.tv_tips,
helper.itemView.context.getColorById(R.color.color_FF285C)
)
} else {
helper.setBackgroundRes(R.id.layout_root, R.drawable.shape_f8f8fa_8)
helper.setTextColor(
R.id.tv_name,
helper.itemView.context.getColorById(R.color.color_767585)
)
helper.setTextColor(
R.id.tv_tips,
helper.itemView.context.getColorById(R.color.color_94959C)
)
}
}
fun select(position: Int) {
this.selectPosition = position
notifyItemRangeChanged(0, itemCount, true)
}
fun getSelect(): ItemData? {
return data.getOrNull(selectPosition)
}
}

View File

@@ -0,0 +1,116 @@
package com.yizhuan.erban.avroom.redpackage.send;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.appcompat.widget.AppCompatTextView;
import com.chuhai.utils.UiUtils;
import com.yizhuan.erban.R;
import com.yizhuan.erban.common.util.Utils;
import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil;
import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import java.util.List;
/**
* @author jack
* @Description
* @Date 2018/11/1
*/
public class TabIndicatorAdapter extends CommonNavigatorAdapter {
private List<String> mTitleList;
private Context mContext;
public TabIndicatorAdapter(Context mContext, List<String> mTitleList ) {
this.mTitleList = mTitleList;
this.mContext = mContext;
}
@Override
public int getCount() {
return mTitleList == null ? 0 : mTitleList.size();
}
@Override
public IPagerTitleView getTitleView(Context context, int index) {
ContactsPagerTitleView categoryPagerTitleView = new ContactsPagerTitleView(context, mTitleList.get(index));
categoryPagerTitleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != mOnItemSelectListener) {
mOnItemSelectListener.onItemSelect(index);
}
}
});
return categoryPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
indicator.setLineHeight(UIUtil.dip2px(mContext, 4));
indicator.setRoundRadius(UIUtil.dip2px(mContext, 4));
indicator.setLineWidth(UIUtil.dip2px(mContext, 12));
indicator.setColors(context.getResources().getColor(R.color.color_FF285C));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
lp.topMargin = UIUtil.dip2px(mContext, 2);
indicator.setLayoutParams(lp);
return indicator;
}
private OnItemSelectListener mOnItemSelectListener;
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position);
}
class ContactsPagerTitleView extends AppCompatTextView implements IPagerTitleView {
public ContactsPagerTitleView(Context context, String tabInfo) {
super(context);
setHeight(Utils.dip2px(getContext(), 25));
setTextSize(18);
setText(tabInfo);
setGravity(Gravity.CENTER);
}
@Override
public void onSelected(int index, int totalCount) {
// setBackgroundResource(R.drawable.shape_bg_contact_indicator_item);
setTextColor(getResources().getColor(R.color.color_FF285C));
}
@Override
public void onDeselected(int index, int totalCount) {
// setBackgroundDrawable(null);
setTextColor(getResources().getColor(R.color.color_767585));
}
@Override
public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) {
}
@Override
public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) {
}
}
}

View File

@@ -17,8 +17,10 @@ import com.yizhuan.erban.ui.user.activity.UserInfoActivity
import com.yizhuan.erban.ui.utils.load
import com.yizhuan.xchat_android_core.im.custom.bean.RoomPkBean
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.room.anotherroompk.SingleRoomPKModel
import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils
import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
import com.yizhuan.xchat_android_core.utils.toast
import com.yizhuan.xchat_android_library.utils.ResUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -30,7 +32,7 @@ class SingleRoomPKBoardView @JvmOverloads constructor(
) : FrameLayout(context, attrs, defStyleAttr) {
private val binding = LayoutSingleRoomPkBoardViewBinding.inflate(LayoutInflater.from(context))
private val observer = Observer<RoomPkBean> { updateView(it) }
private val observer = Observer<RoomPkBean?> { updateView(it) }
private var disposable: Disposable? = null
private var roomPkBean: RoomPkBean? = null
@@ -55,6 +57,20 @@ class SingleRoomPKBoardView @JvmOverloads constructor(
SingleRoomPkRuleDialog.newInstance().show(context)
}
binding.ivMuteAnother.setOnClickListener {
if (AvRoomDataManager.get().isRoomOwner) {
roomPkBean?.let {
if (it.roundId == null) {
return@let
}
SingleRoomPKModel
.muteSingleRoomPkOtherMic(it.roundId, it.aMicStatus xor 1)
.subscribe()
}
} else {
"主播已關閉對方房間的聲音".toast()
}
}
}
override fun onDetachedFromWindow() {
@@ -118,7 +134,13 @@ class SingleRoomPKBoardView @JvmOverloads constructor(
binding.ivPkResult.isVisible = true
binding.ivPkResult.setImageResource(R.drawable.single_room_pk_ic_result_win)
}
if (roomPkBean?.aMicStatus == 0) {
binding.ivMuteAnother.isVisible = true
binding.ivMuteAnother.setImageResource(R.drawable.single_room_pk_ic_another_mic_close)
} else {
binding.ivMuteAnother.setImageResource(R.drawable.single_room_pk_ic_another_mic_open)
binding.ivMuteAnother.isVisible = AvRoomDataManager.get().isRoomOwner
}
}
}

View File

@@ -296,17 +296,24 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
if (roomInfo != null) {
List<GiftReceiver> targetUsers = new ArrayList<>();
int totalCoin = 0;
boolean isPlaySvga = false;
if (AvRoomDataManager.get().mIsNeedGiftEffect &&
!AvRoomDataManager.get().isSelfGamePlaying()) {
SVGAImageView imageView = playLuckyBagAnim(svgaUrl);
handler.postDelayed(() -> {
removeView(imageView);
imageView.stopAnimation(true);
}, 1800);
if (svgaUrl != null && !svgaUrl.isEmpty()) {
isPlaySvga = true;
SVGAImageView imageView = playLuckyBagAnim(svgaUrl);
handler.postDelayed(() -> {
removeView(imageView);
imageView.stopAnimation(true);
}, 1800);
}
}
handler.postDelayed(() -> drawLuckyGiftAnimation(roomInfo, giftReceiveInfos, totalCoin, targetUsers, giftReceiveType, isShowAnimation, pos), 1200);
if (isPlaySvga) {
handler.postDelayed(() -> drawLuckyGiftAnimation(roomInfo, giftReceiveInfos, totalCoin, targetUsers, giftReceiveType, isShowAnimation, pos), 1200);
} else {
drawLuckyGiftAnimation(roomInfo, giftReceiveInfos, totalCoin, targetUsers, giftReceiveType, isShowAnimation, pos);
}
}
}
@@ -354,7 +361,7 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
targetUsers.add(giftReceiver);
if (!isShowAnimation) return;
giftInfo = giftReceiveInfo.getDisplayGift().get(pos);
if (totalCoin >= 520 || (giftInfo != null && giftInfo.isHasEffect())) {
if (giftInfo != null && giftInfo.isHasEffect()) {
Message msg = Message.obtain();
msg.what = 0;
GiftEffectInfo giftEffectInfo = new GiftEffectInfo();

View File

@@ -55,6 +55,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import com.bumptech.glide.request.target.Target;
import com.netease.nim.uikit.business.uinfo.UserInfoHelper;
import com.netease.nim.uikit.common.ui.span.RadiusBackgroundSpan;
import com.netease.nim.uikit.common.util.log.LogUtil;
@@ -1066,8 +1067,8 @@ public class MessageView extends FrameLayout {
TextView tvUnlock = baseViewHolder.itemView.findViewById(R.id.tv_unlock);
View vBottomMask = baseViewHolder.itemView.findViewById(R.id.v_bottom_mask);
ImageLoadUtilsV2.loadImage(ivUserLevel, mRoomAlbumMsgInfo.getUserLevel().getExperUrl());
ImageLoadUtilsV2.loadImage(ivUserCharm, mRoomAlbumMsgInfo.getUserLevel().getCharmUrl());
ImageLoadUtilsV2.loadImage2(ivUserLevel, mRoomAlbumMsgInfo.getUserLevel().getExperUrl(), Target.SIZE_ORIGINAL);
ImageLoadUtilsV2.loadImage2(ivUserCharm, mRoomAlbumMsgInfo.getUserLevel().getCharmUrl(), Target.SIZE_ORIGINAL);
tvNick.setText(user.getNick());
tvUnlock.setText("解鎖");
tvUnlock.setBackgroundResource(R.drawable.bg_9168fa_6);

View File

@@ -116,6 +116,9 @@ public class MicroView extends LinearLayout implements View.OnLayoutChangeListen
}
private void subMsg() {
if (isInEditMode()) {
return;
}
subscribe = IMNetEaseManager.get()
.getChatRoomEventObservable().subscribe(
roomEvent -> onReceiveRoomEvent(roomEvent),

View File

@@ -230,7 +230,7 @@ class RoomEffectView @JvmOverloads constructor(
RoomEvent.ROOM_PK_NOTIFY -> addRoomPKNotify(roomEvent.chatRoomMessage)
RoomEvent.SINGLE_ROOM_PK_NOTIFY -> addSingleRoomPKNotify(roomEvent.chatRoomMessage)
RoomEvent.SINGLE_ROOM_RANK_TOP_NOTIFY -> showRoomRankNotify(roomEvent.chatRoomMessage)
RoomEvent.SINGLE_ROOM_RANK_TOP_NOTIFY -> showSingleRoomRankNotify(roomEvent.chatRoomMessage)
RoomEvent.ROOM_RANK_TOP_NOTIFY -> showRoomRankNotify(roomEvent.chatRoomMessage)
RoomEvent.ROOM_CAR_EFFECT_HIDE -> {
isHideCarEffect = true
@@ -1907,6 +1907,27 @@ class RoomEffectView @JvmOverloads constructor(
)
}
private fun showSingleRoomRankNotify(chatRoomMessage: ChatRoomMessage) {
if (binding.clNotify.visibility == GONE) {
binding.clNotify.visibility = VISIBLE
}
val roomPkBean = (chatRoomMessage.attachment as SingleRoomRankAttachment).msgBean
val rootView =
LayoutInflater.from(mContext).inflate(R.layout.layout_single_room_rank_notify, null)
(rootView.findViewById<View>(R.id.tv_nick) as TextView).text =
roomPkBean.nick.subAndReplaceDot(6)
(rootView.findViewById<View>(R.id.tv_desc) as TextView).text = roomPkBean.desc
rootView.findViewById<ImageView>(R.id.iv_avatar).load(roomPkBean.avatar)
rootView.setOnClickListener { AVRoomActivity.start(context, roomPkBean.uid) }
binding.flSingleRoomRankNotify.addView(rootView)
animationLuckyGift = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify)
rootView.startAnimation(animationLuckyGift)
binding.flSingleRoomRankNotify.postDelayed({
binding.flSingleRoomRankNotify.removeView(
rootView
)
}, SHOW_TIME.toLong())
}
private fun showRoomRankNotify(chatRoomMessage: ChatRoomMessage) {
if (binding.clNotify.visibility == GONE) {

View File

@@ -35,7 +35,6 @@ import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -46,6 +45,7 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -69,7 +69,8 @@ import com.yizhuan.erban.application.XChatApplication;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.avroom.firstcharge.FirstChargeDialog;
import com.yizhuan.erban.avroom.redpackage.RedPackageGoRoomDialog;
import com.yizhuan.erban.avroom.redpackage.RedPackageOpenDialog;
import com.yizhuan.erban.avroom.redpackage.RedPackageHandler;
import com.yizhuan.erban.avroom.redpackage.open.RedPackageOpenDialog;
import com.yizhuan.erban.common.LoadingFragment;
import com.yizhuan.erban.common.NetworkErrorFragment;
import com.yizhuan.erban.common.NoDataFragment;
@@ -89,10 +90,7 @@ import com.yizhuan.erban.ui.setting.ResetPasswordActivity;
import com.yizhuan.erban.ui.webview.CommonWebViewActivity;
import com.yizhuan.erban.ui.widget.DefaultToolBar;
import com.yizhuan.erban.ui.widget.dialog.AllPlayEffectDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelOneDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelThreeDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelTwoDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceGiftLevelDialog;
import com.yizhuan.erban.ui.widget.dialog.AllServiceVipLevelUPDialog;
import com.yizhuan.erban.ui.widget.dialog.OpenNobleGlobalNoticeDialog;
import com.yizhuan.erban.utils.UserUtils;
@@ -103,7 +101,6 @@ import com.yizhuan.xchat_android_core.UriProvider;
import com.yizhuan.xchat_android_core.bean.BaseProtocol;
import com.yizhuan.xchat_android_core.gift.bean.LuckyBagNoticeInfo;
import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.NotifyH5Attachment;
import com.yizhuan.xchat_android_core.im.custom.bean.NotifyH5Info;
import com.yizhuan.xchat_android_core.im.custom.bean.PlayEffectInfo;
import com.yizhuan.xchat_android_core.im.custom.bean.RoomBoxPrizeInfo;
@@ -123,6 +120,7 @@ import com.yizhuan.xchat_android_core.pay.bean.WalletInfo;
import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.model.AvRoomModel;
import com.yizhuan.xchat_android_core.support.room.RoomContext;
import com.yizhuan.xchat_android_core.treasurefairy.FairyMsgInfoBean;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
@@ -130,7 +128,6 @@ import com.yizhuan.xchat_android_core.vip.VipMessageInfo;
import com.yizhuan.xchat_android_library.common.util.DeviceUtil;
import com.yizhuan.xchat_android_library.rxbus.RxBus;
import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import com.yizhuan.xchat_android_library.utils.NetworkUtils;
import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
@@ -958,10 +955,19 @@ public abstract class BaseActivity extends RxAppCompatActivity
return;
RedPackageNotifyInfo notifyInfo = new Gson().fromJson(String.valueOf(baseProtocol.getData()), RedPackageNotifyInfo.class);
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo != null && roomInfo.getUid() == notifyInfo.getRoomUid() && context instanceof AVRoomActivity) {
RedPackageOpenDialog.Companion.newInstance(notifyInfo).show(BaseActivity.this);
RoomContext roomContext = RoomContext.Companion.get();
RedPackageHandler redPackageHandler = null;
if (roomContext != null) {
redPackageHandler = roomContext.findAbility(RedPackageHandler.class.getSimpleName());
}
if (redPackageHandler != null) {
redPackageHandler.onAllServiceSignaling(this, notifyInfo);
} else {
RedPackageGoRoomDialog.Companion.newInstance(notifyInfo).show(this);
if (roomInfo != null && roomInfo.getUid() == notifyInfo.getRoomUid() && context instanceof AVRoomActivity) {
RedPackageOpenDialog.Companion.newInstance(notifyInfo).show(BaseActivity.this);
} else {
RedPackageGoRoomDialog.Companion.newInstance(notifyInfo).show(this);
}
}
}
case CUSTOM_MSG_VIP:
@@ -1202,8 +1208,14 @@ public abstract class BaseActivity extends RxAppCompatActivity
private void showGiftDialog() {
if (giftList.size() == 0) return;
if (giftList.peekFirst() != null && !giftList.peekFirst().isHomeShow()) return;
giftDialog = generateAllServiceGiftDialog(this, giftList.peekFirst());
AllServiceGiftProtocol.DataBean data = giftList.peekFirst();
if (data == null) {
return;
}
if (!data.isHomeShow()) {
return;
}
giftDialog = generateAllServiceGiftDialog(this, data);
giftDialog.setOnDismissListener(dialog -> {
giftList.pollFirst();
AllServiceGiftProtocol.DataBean dataBean = giftList.peekFirst();
@@ -1222,19 +1234,8 @@ public abstract class BaseActivity extends RxAppCompatActivity
}
}
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);
}
private AllServiceGiftLevelDialog generateAllServiceGiftDialog(@NonNull Context context, @NonNull AllServiceGiftProtocol.DataBean dataBean) {
return new AllServiceGiftLevelDialog(context, dataBean);
}
public void onGrabApprenticesEvent(GrabApprenticesEvent event) {

View File

@@ -14,7 +14,8 @@ import java.lang.reflect.ParameterizedType
abstract class BaseDialog<T : ViewBinding> : RxDialogFragment() {
private var _binding: T? = null
val isViewLoaded: Boolean get() = _binding != null
protected var _binding: T? = null
private var onDismissListener: (() -> Unit)? = null
val binding get() = _binding!!
open var width = ScreenUtil.getDialogWidth()
@@ -70,6 +71,7 @@ abstract class BaseDialog<T : ViewBinding> : RxDialogFragment() {
override fun onDestroyView() {
super.onDestroyView()
_binding = null
this.onDismissListener = null
}
abstract fun init()

View File

@@ -2,33 +2,24 @@ package com.yizhuan.erban.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.yizhuan.erban.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

@@ -13,8 +13,8 @@ import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.chuhai.core.component.SuperBottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.yizhuan.erban.R;
import com.yizhuan.erban.common.util.Utils;
import com.yizhuan.erban.ui.widget.ButtonItem;
@@ -24,7 +24,7 @@ import java.util.List;
/**
* @author xiaoyu
*/
public class CommonPopupDialog extends BottomSheetDialog implements OnClickListener {
public class CommonPopupDialog extends SuperBottomSheetDialog implements OnClickListener {
private static final int BUTTON_ITEM_ID = 135798642;
private int mId;

View File

@@ -79,7 +79,7 @@ class FansTeamJoinActivity : BaseViewBindingActivity<ActivityFansTeamJoinBinding
?.let { privilegeConfig ->
binding.ivJoinLogo.load(privilegeConfig.icon)
binding.tvJoin.text = privilegeConfig.name
binding.tvJoin.setOnClickListener {
binding.bgJoin.setOnClickListener {
privilegeConfig.giftVo?.let { giftInfo ->
GiftModel.get().sendFansTeamGift(
giftInfo.giftId,

View File

@@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData
import com.yizhuan.erban.base.BaseViewModel
import com.yizhuan.xchat_android_core.bean.response.ListResult
import com.yizhuan.xchat_android_core.fansteam.*
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
import com.yizhuan.xchat_android_core.utils.toast
class FansTeamViewModel : BaseViewModel() {
@@ -37,6 +38,9 @@ class FansTeamViewModel : BaseViewModel() {
}
fun loadFansTeamInitInfo() {
if (AvRoomDataManager.get().roomUid == 0L) {
return
}
safeLaunch {
_fansTeamInitInfoLiveData.value = FansTeamModel.getFansTeamInitInfo()
}

View File

@@ -1,95 +0,0 @@
package com.yizhuan.erban.home.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.firstcharge.FirstChargeDialog;
import com.yizhuan.erban.shipantics.PullRadishActivity;
import com.yizhuan.erban.treasure_box.widget.GoldBoxHelper;
import com.yizhuan.erban.treasurefairy.HomeFairyActivity;
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.utils.CommonJumpHelper;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.room.model.AvRoomModel;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.util.List;
public class RoomActAdapter extends StaticPagerAdapter {
private Context mContext;
private List<BannerInfo> data;
private RoomActClickListener listener;
public RoomActAdapter(Context context, List<BannerInfo> data) {
this.data = data;
this.mContext = context;
}
@Override
public View getView(ViewGroup container, int position) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_room_act, container, false);
ImageView ivCover = view.findViewById(R.id.iv_cover);
BannerInfo bannerInfo = data.get(position);
String actId = String.valueOf(bannerInfo.getBannerId());
ivCover.setScaleType(ImageView.ScaleType.CENTER_CROP);
if (bannerInfo.isFairy()) {
ivCover.setImageResource(R.drawable.ic_fairy_entrance);
} else if (bannerInfo.isFirstCharge()) {
ivCover.setImageResource(R.drawable.ic_first_charge_enter);
} else if (bannerInfo.isBox()) {
GlideApp.with(BasicConfig.INSTANCE.getAppContext())
.load(GoldBoxHelper.getBoxIcon())
.error(R.drawable.icon_room_treasure_box)
.into(ivCover);
} else if (bannerInfo.isRadish()) {
ivCover.setImageResource(R.drawable.ic_radish_entrance);
} else {
ImageLoadUtils.loadImage(mContext, bannerInfo.getBannerPic(), ivCover, R.drawable.default_cover);
}
ivCover.setOnClickListener(v -> {
if (bannerInfo.isFairy()) {
HomeFairyActivity.start(mContext);
} else if (bannerInfo.isFirstCharge()) {
FirstChargeDialog.start(mContext);
} else if (bannerInfo.isBox()) {
GoldBoxHelper.handleBoxClick(mContext);
} else if (bannerInfo.isRadish()) {
PullRadishActivity.start(mContext);
} else {
AvRoomModel.get().activityClickLog("2", actId).subscribe();
if (bannerInfo.getSkipType() == 3 && bannerInfo.getShowType() != 1) {
if (listener != null) {
listener.onWebClick(bannerInfo.getSkipUri());
}
} else {
CommonJumpHelper.bannerJump(mContext, bannerInfo);
}
}
});
return view;
}
@Override
public int getCount() {
if (data != null) {
return data.size();
} else {
return 0;
}
}
public void setRoomActClickListener(RoomActClickListener listener) {
this.listener = listener;
}
public interface RoomActClickListener {
void onWebClick(String url);
}
}

View File

@@ -0,0 +1,80 @@
package com.yizhuan.erban.home.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import com.netease.nim.uikit.support.glide.GlideApp
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.firstcharge.FirstChargeDialog
import com.yizhuan.erban.shipantics.PullRadishActivity
import com.yizhuan.erban.treasure_box.widget.GoldBoxHelper
import com.yizhuan.erban.treasurefairy.HomeFairyActivity
import com.yizhuan.erban.ui.utils.ImageLoadUtils
import com.yizhuan.erban.ui.webview.room_banner.RoomBannerWebDialogActivity
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter
import com.yizhuan.erban.utils.CommonJumpHelper
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
import com.yizhuan.xchat_android_core.room.model.AvRoomModel
import com.yizhuan.xchat_android_library.utils.config.BasicConfig
import okhttp3.internal.filterList
class RoomActAdapter(private val mContext: Context, private val data: List<BannerInfo>) :
StaticPagerAdapter() {
override fun getView(container: ViewGroup, position: Int): View {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_room_act, container, false)
val ivCover = view.findViewById<ImageView>(R.id.iv_cover)
val bannerInfo = data[position]
val actId = bannerInfo.bannerId.toString()
ivCover.scaleType = ImageView.ScaleType.CENTER_CROP
if (bannerInfo.isFairy) {
ivCover.setImageResource(R.drawable.ic_fairy_entrance)
} else if (bannerInfo.isFirstCharge) {
ivCover.setImageResource(R.drawable.ic_first_charge_enter)
} else if (bannerInfo.isBox) {
GlideApp.with(BasicConfig.INSTANCE.appContext)
.load(GoldBoxHelper.getBoxIcon())
.error(R.drawable.icon_room_treasure_box)
.into(ivCover)
} else if (bannerInfo.isRadish) {
ivCover.setImageResource(R.drawable.ic_radish_entrance)
} else {
ImageLoadUtils.loadImage(
mContext,
bannerInfo.bannerPic,
ivCover,
R.drawable.default_cover
)
}
ivCover.setOnClickListener { v: View? ->
if (bannerInfo.isFairy) {
HomeFairyActivity.start(mContext)
} else if (bannerInfo.isFirstCharge) {
FirstChargeDialog.start(mContext)
} else if (bannerInfo.isBox) {
GoldBoxHelper.handleBoxClick(mContext)
} else if (bannerInfo.isRadish) {
PullRadishActivity.start(mContext)
} else {
AvRoomModel.get().activityClickLog("2", actId).subscribe()
if (bannerInfo.skipType == 3) {
val list = data.filterList {
skipType == 3
}
val newPosition = list.indexOfFirst {
it == bannerInfo
}
RoomBannerWebDialogActivity.start(mContext, newPosition, list)
} else {
CommonJumpHelper.bannerJump(mContext, bannerInfo)
}
}
}
return view
}
override fun getCount(): Int {
return data.size
}
}

View File

@@ -120,7 +120,7 @@ public class NimTeamMessageFragment extends MessageFragment {
@Subscribe(threadMode = ThreadMode.MAIN)
@SuppressLint("CheckResult")
public void onNimAudioChatEvent(NimAudioChatEvent event) {
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
checkPermission(Manifest.permission.RECORD_AUDIO)
.subscribe(result -> {
if (result) {
event.getSuccess().accept(result);
@@ -133,7 +133,7 @@ public class NimTeamMessageFragment extends MessageFragment {
@Subscribe(threadMode = ThreadMode.MAIN)
@SuppressLint("CheckResult")
public void onNimImageActionEvent(NimImageActionEvent event) {
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
checkPermission(Manifest.permission.CAMERA)
.subscribe(result -> {
if (result) {
event.getSuccess().accept(result);

View File

@@ -30,6 +30,7 @@ public class MsgViewHolderRedPackage extends MsgViewHolderBase {
private TextView tvNickname;
private TextView tvAll;
private TextView tvTip;
@Deprecated(since = "2.2.0版本红包失效时间是客户端写死的以后用消息体内的endTime")
private int halfHour = 60 * 30 * 1000;
@@ -57,30 +58,40 @@ public class MsgViewHolderRedPackage extends MsgViewHolderBase {
tvAll.setVisibility(View.GONE);
tvTip.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_02));
contentContainer.setAlpha(0.5f);
} else if (CurrentTimeUtils.getCurrentTime() - message.getTime() < halfHour) {
tvNickname.setText(notifyInfo.getSendUserNick());
tvAll.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_03));
tvAll.setVisibility(View.VISIBLE);
tvTip.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_04));
contentContainer.setAlpha(1f);
DialogManager.OkCancelDialogListener listener = () -> AVRoomActivity.start(context, notifyInfo.getRoomUid(),
AVRoomActivity.FROM_TYPE_ALL_RED, notifyInfo.getSendUserNick(), notifyInfo);
contentContainer.setOnClickListener(v -> {
if (AvRoomDataManager.get().isOwnerOnMic() && AvRoomDataManager.get().getRoomId() != notifyInfo.getRoomUid()) {
new DialogManager(context).showOkCancelDialog(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_05), true, listener);
} else {
listener.onOk();
} else{
long endTime;
notifyInfo.getEndTime();
if (notifyInfo.getEndTime() != null) {
// 2.2.0版本后 新增动态失效时间
endTime = notifyInfo.getEndTime();
} else {
// 可能是2.2.0版本前失效时间固定为30分
endTime = message.getTime() + halfHour;
}
if (CurrentTimeUtils.getCurrentTime() < endTime) {
tvNickname.setText(notifyInfo.getSendUserNick());
tvAll.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_03));
tvAll.setVisibility(View.VISIBLE);
tvTip.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_04));
contentContainer.setAlpha(1f);
DialogManager.OkCancelDialogListener listener = () -> AVRoomActivity.start(context, notifyInfo.getRoomUid(),
AVRoomActivity.FROM_TYPE_ALL_RED, notifyInfo.getSendUserNick(), notifyInfo);
contentContainer.setOnClickListener(v -> {
if (AvRoomDataManager.get().isOwnerOnMic() && AvRoomDataManager.get().getRoomId() != notifyInfo.getRoomUid()) {
new DialogManager(context).showOkCancelDialog(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_05), true, listener);
} else {
listener.onOk();
}
}
}
);
} else {//已失效
tvNickname.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_06));
tvAll.setVisibility(View.GONE);
tvTip.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_07));
contentContainer.setAlpha(0.5f);
);
} else {
//已失效
tvNickname.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_06));
tvAll.setVisibility(View.GONE);
tvTip.setText(ResUtil.getString(R.string.im_chat_msgviewholderredpackage_07));
contentContainer.setAlpha(0.5f);
}
}
}

View File

@@ -654,7 +654,7 @@ 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.RECORD_AUDIO)
checkPermission(Manifest.permission.RECORD_AUDIO)
.subscribe(result -> {
if (result) {
event.getSuccess().accept(result);
@@ -667,7 +667,7 @@ public class MessageFragment extends TFragment implements ModuleProxy, MessageLi
@Subscribe(threadMode = ThreadMode.MAIN)
@SuppressLint("CheckResult")
public void onNimImageActionEvent(NimImageActionEvent event) {
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
checkPermission(Manifest.permission.CAMERA)
.subscribe(result -> {
if (result) {
event.getSuccess().accept(result);

View File

@@ -3,17 +3,19 @@ package com.yizhuan.erban.ui.login
import android.app.Activity
import android.content.Intent
import android.view.View
import androidx.lifecycle.lifecycleScope
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chuhai.utils.UiUtils
import com.chuhai.utils.ktx.getColorById
import com.netease.nim.uikit.StatusBarUtil
import com.trello.rxlifecycle3.android.ActivityEvent
import com.yizhuan.erban.R
import com.yizhuan.erban.base.BaseViewBindingActivity
import com.yizhuan.erban.databinding.ActivityAreaCodeBinding
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.auth.bean.AreaInfoBean
import com.yizhuan.xchat_android_core.utils.Logger
import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import com.yizhuan.erban.ui.widget.SideBarView
import com.yizhuan.xchat_android_core.region.RegionHelper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
/**
* 区号
@@ -22,7 +24,9 @@ import com.yizhuan.xchat_android_core.utils.net.BeanObserver
*/
class AreaCodeActivity : BaseViewBindingActivity<ActivityAreaCodeBinding>() {
private val mCountries = ArrayList<AreaInfoBean>()
private val regionRepository = RegionHelper()
private val adapter = RegionListAdapter()
companion object {
const val COUNTRY_NUMBER = "country_number"
@@ -39,55 +43,51 @@ class AreaCodeActivity : BaseViewBindingActivity<ActivityAreaCodeBinding>() {
override fun init() {
initTitleBar(getString(R.string.select_area_code))
initCountryData()
initListView()
initSideBar()
loadData()
}
private fun initCountryData() {
val countryList = resources.getStringArray(R.array.country_code_list_ch)
for (s in countryList) {
val country = s.split("*").toTypedArray()
val countryName = country[0]
val countryNumber = country[1]
val c = AreaInfoBean(
name = countryName,
phoneAreaCode = countryNumber
)
mCountries.add(c)
private fun initSideBar() {
binding.sideBarView.setTextColor(context.getColorById(R.color.color_5caaff))
binding.sideBarView.setTextSize(UiUtils.dip2px(12f).toFloat())
binding.sideBarView.setListener(object : SideBarView.Listener {
override fun onSideBarScroll(word: String) {
val index = adapter.data.indexOfFirst {
it.itemType == RegionListAdapter.ITEM_TYPE_GROUP && it.groupName?.toString() == word
}
if (index >= 0) {
binding.mRecyclerView.scrollToPosition(index)
}
}
override fun onSideBarScrollEnd() {
}
})
}
private fun loadData() {
lifecycleScope.launch {
val list = regionRepository.getRegionSelectorList(RegionListAdapter.ITEM_TYPE_GROUP)
withContext(Dispatchers.Main) {
adapter.setNewData(list)
}
}
}
private fun initListView() {
val mAdapter = object :
BaseQuickAdapter<AreaInfoBean, BaseViewHolder>(R.layout.item_country) {
override fun convert(helper: BaseViewHolder, item: AreaInfoBean) {
helper.setText(R.id.tv_name, item.name)
helper.setText(R.id.tv_country_code, "+${item.phoneAreaCode}")
}
}
binding.mRecyclerView.adapter = mAdapter
mAdapter.setNewData(mCountries)
binding.mRecyclerView.adapter = adapter
//返回国家
mAdapter.setOnItemClickListener { adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int ->
val country = mAdapter.data[position]
adapter.setOnItemClickListener { adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int ->
val region = this.adapter.getItem(position)
if (region?.code.isNullOrEmpty()) {
return@setOnItemClickListener
}
val intent = Intent()
intent.putExtra(COUNTRY_NUMBER, "+${country.phoneAreaCode}")
intent.putExtra(COUNTRY_NUMBER, region?.fullCode)
setResult(RESULT_OK, intent)
finish()
}
AuthModel.get()
.areaCodeList
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(object : BeanObserver<List<AreaInfoBean>>() {
override fun onErrorMsg(error: String) {
Logger.error("areaCode", error)
}
override fun onSuccess(list: List<AreaInfoBean>) {
mAdapter.setNewData(list)
}
})
}
override fun needSteepStateBar() = true
@@ -97,5 +97,4 @@ class AreaCodeActivity : BaseViewBindingActivity<ActivityAreaCodeBinding>() {
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -16,9 +16,9 @@ import com.trello.rxlifecycle3.android.ActivityEvent
import com.yizhuan.erban.R
import com.yizhuan.erban.base.BaseViewBindingActivity
import com.yizhuan.erban.databinding.ActivityBindPhoneBinding
import com.yizhuan.erban.ui.login.BindPhoneActivity
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.code.CodeType
import com.yizhuan.xchat_android_core.region.RegionHelper
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_core.user.bean.UserInfo
import com.yizhuan.xchat_android_library.utils.NetworkUtils
@@ -50,6 +50,7 @@ class BindPhoneActivity : BaseViewBindingActivity<ActivityBindPhoneBinding>(),
override fun init() {
initTitleBar(getString(R.string.text_bind_phone))
initListener()
RegionHelper().loadRecommendRegion(lifecycle, binding.tvAreaCode)
}
private fun initListener() {

View File

@@ -35,7 +35,7 @@ import com.yizhuan.xchat_android_core.code.CodeType;
import com.yizhuan.xchat_android_library.common.SpConstants;
import com.yizhuan.xchat_android_library.common.util.SPUtils;
import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper;
import com.yizhuan.xchat_android_core.region.RegionHelper;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -90,6 +90,7 @@ public class LoginPasswordActivity extends BaseActivity {
setContentView(R.layout.activity_login_password);
EventBus.getDefault().register(this);
initView();
new RegionHelper().loadRecommendRegion(getLifecycle(), tvAreaCode);
}
private void checkInput() {

View File

@@ -16,6 +16,7 @@ import com.yizhuan.erban.databinding.ActivityLoginPhoneBinding
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.auth.event.LoginEvent
import com.yizhuan.xchat_android_core.code.CodeType
import com.yizhuan.xchat_android_core.region.RegionHelper
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -43,6 +44,7 @@ class LoginPhoneActivity : BaseViewBindingActivity<ActivityLoginPhoneBinding>(),
override fun init() {
EventBus.getDefault().register(this)
initListener()
RegionHelper().loadRecommendRegion(lifecycle, binding.tvAreaCode)
}
private fun initListener() {

View File

@@ -0,0 +1,32 @@
package com.yizhuan.erban.ui.login
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R
import com.yizhuan.xchat_android_core.region.bean.RegionBean
/**
* Created by Max on 2023/12/7 19:34
* Desc:
**/
class RegionListAdapter() :
BaseMultiItemQuickAdapter<RegionBean, BaseViewHolder>(ArrayList<RegionBean>()) {
companion object {
const val ITEM_TYPE_GROUP = 1
}
init {
addItemType(0, R.layout.region_item_def)
addItemType(ITEM_TYPE_GROUP, R.layout.region_item_group)
}
override fun convert(helper: BaseViewHolder, item: RegionBean?) {
if (helper.itemViewType == ITEM_TYPE_GROUP) {
helper.setText(R.id.tv_group, item?.groupName?.toString() ?: "")
}
helper.setText(R.id.tv_name, item?.name ?: "")
helper.setText(R.id.tv_country_code, "+${item?.code}")
}
}

View File

@@ -107,11 +107,13 @@ public class BillingManager implements PurchasesUpdatedListener {
/*更新商品*/
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
Log.i(TAG, "billingResult.getResponseCode()==" + billingResult.getResponseCode() + ",purchases.size()==" + purchases.size());
Log.i(TAG, "billingResult.getResponseCode()==" + billingResult.getResponseCode());
purchaseList.clear();
if (billingResult.getResponseCode() == BillingResponseCode.OK) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
if (purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
}
}
mBillingUpdatesListener.onPurchasesUpdated(purchaseList);
} else {

View File

@@ -1,6 +1,7 @@
package com.yizhuan.erban.ui.search;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@@ -15,6 +16,7 @@ import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.friend.action.AbstractSelectFriendAction;
import com.yizhuan.erban.ui.user.activity.UserInfoActivity;
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
import com.yizhuan.erban.ui.widget.NobleAvatarView;
import com.yizhuan.erban.utils.RegexUtil;
import com.yizhuan.xchat_android_core.room.bean.SearchRoomInfo;
@@ -112,16 +114,17 @@ public class SearchAdapter extends BaseQuickAdapter<SearchRoomInfo, SearchAdapte
holder.mNobleAvatarView.setData(item.getAvatar(), item.nobleUsers);
holder.erbanNo.setText(context.getString(R.string.me_user_id, item.getErbanNo()));
if (item.getGender() == 1) {
holder.mIvSex.setVisibility(View.VISIBLE);
holder.mIvSex.setImageResource(R.drawable.ic_gender_male);
} else if (item.getGender() == 2) {
holder.mIvSex.setVisibility(View.VISIBLE);
holder.mIvSex.setImageResource(R.drawable.ic_gender_female);
} else {
holder.mIvSex.setVisibility(View.GONE);
holder.wealthLevelView.setVisibility(View.GONE);
if (item.getUserLevelVo() != null && !TextUtils.isEmpty(item.getUserLevelVo().getExperUrl())) {
holder.wealthLevelView.setVisibility(View.VISIBLE);
ImageLoadUtils.loadImage(mContext, item.getUserLevelVo().getExperUrl(), holder.wealthLevelView);
}
holder.charmLevelView.setVisibility(View.GONE);
if (item.getUserLevelVo() != null && !TextUtils.isEmpty(item.getUserLevelVo().getCharmUrl())) {
holder.charmLevelView.setVisibility(View.VISIBLE);
ImageLoadUtils.loadImage(mContext, item.getUserLevelVo().getCharmUrl(), holder.charmLevelView);
}
}
static class ViewHolder extends BaseViewHolder {
@@ -132,7 +135,8 @@ public class SearchAdapter extends BaseQuickAdapter<SearchRoomInfo, SearchAdapte
private ImageView ivLive;
RelativeLayout container;
private NobleAvatarView mNobleAvatarView;
private ImageView mIvSex;
private ImageView wealthLevelView;
private ImageView charmLevelView;
private SuperTextView stvOp;
public ViewHolder(View itemView) {
@@ -142,7 +146,8 @@ public class SearchAdapter extends BaseQuickAdapter<SearchRoomInfo, SearchAdapte
erbanNo = itemView.findViewById(R.id.erban_no);
container = itemView.findViewById(R.id.container);
mNobleAvatarView = itemView.findViewById(R.id.noble_avatar_view);
mIvSex = itemView.findViewById(R.id.sex);
wealthLevelView = itemView.findViewById(R.id.iv_user_level);
charmLevelView = itemView.findViewById(R.id.iv_user_charm);
ivLive = itemView.findViewById(R.id.iv_living);
tvOnlineNum = itemView.findViewById(R.id.tv_online_num);
stvOp = itemView.findViewById(R.id.stv_op);

View File

@@ -20,6 +20,7 @@ import com.yizhuan.erban.ui.login.BindPhoneActivity
import com.yizhuan.erban.ui.login.helper.LogoutHelper
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.code.CodeType
import com.yizhuan.xchat_android_core.region.RegionHelper
import com.yizhuan.xchat_android_core.user.UserModel
import com.yizhuan.xchat_android_library.utils.ResUtil
import com.yizhuan.xchat_android_library.utils.TextWatcherWrapper
@@ -59,6 +60,7 @@ class ResetPasswordActivity : BaseViewBindingActivity<ActivityResetLoginPwdBindi
// binding.etAccount.isEnabled = false
// }
initListener()
RegionHelper().loadRecommendRegion(lifecycle, binding.tvAreaCode)
}
private fun initListener() {

View File

@@ -6,8 +6,10 @@ import android.os.Build
import android.os.Environment
import android.text.SpannableString
import android.view.View
import com.chuhai.utils.log.ILog
import com.netease.nim.uikit.StatusBarUtil
import com.tongdaxing.erban.upgrade.AppUpgradeHelper
import com.yizhuan.erban.BuildConfig
import com.yizhuan.erban.R
import com.yizhuan.erban.UIHelper
import com.yizhuan.erban.base.BaseViewBindingActivity
@@ -35,12 +37,13 @@ import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.io.File
import kotlin.random.Random
/**
* 设置页
* Created by wushaocheng on 2023/2/1.
*/
class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.OnClickListener {
class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.OnClickListener,ILog {
override fun init() {
EventBus.getDefault().register(this)
initWhiteTitleBar(ResUtil.getString(R.string.ui_setting_settingactivity_01))
@@ -74,6 +77,12 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
binding.tvShieldManager.setOnClickListener(this)
binding.rlyPermission.setOnClickListener(this)
binding.rlyCheck.setOnClickListener(this)
if (BuildConfig.DEBUG) {
binding.titleBar.setOnTitleClickListener {
debug()
}
}
}
@SuppressLint("CheckResult")
@@ -103,6 +112,7 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
BindPhoneActivity.start(this)
}
}
R.id.rly_contact_us -> UIHelper.openContactUs(this)
R.id.rly_help -> UIHelper.showUsinghelp(this)
R.id.rly_update -> startActivity(Intent(applicationContext, AboutActivity::class.java))
@@ -115,9 +125,14 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
}
ModifyPwdActivity.start(this, ModifyPwdActivity.PAY_PWD)
}
R.id.btn_login_out -> {
val cacheLoginUserInfo = UserModel.get().cacheLoginUserInfo ?: return
if (!cacheLoginUserInfo.isBindPasswd && !SPUtils.getBoolean(SpConstants.SET_PASSWORD, false)) {
if (!cacheLoginUserInfo.isBindPasswd && !SPUtils.getBoolean(
SpConstants.SET_PASSWORD,
false
)
) {
dialogManager.showOkCancelWithTitleDialog(ResUtil.getString(R.string.set_login_password),
SpannableString(ResUtil.getString(R.string.set_login_password_tip)),
ResUtil.getString(R.string.login_fragment_adduserinfofragment_04),
@@ -126,7 +141,10 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
override fun onCancel() {}
override fun onOk() {
SPUtils.putBoolean(SpConstants.SET_PASSWORD, true)
ModifyPwdActivity.start(this@SettingActivity, ModifyPwdActivity.LOGIN_PWD)
ModifyPwdActivity.start(
this@SettingActivity,
ModifyPwdActivity.LOGIN_PWD
)
}
})
} else {
@@ -134,10 +152,12 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
LogoutHelper.logout()
}
}
R.id.tv_community_norms -> CommonWebViewActivity.start(
this,
UriProvider.getCommnunityNorms()
)
R.id.rly_clear_cache -> dialogManager.showOkCancelWithTitleDialog(ResUtil.getString(R.string.ui_setting_settingactivity_07),
SpannableString(ResUtil.getString(R.string.ui_setting_settingactivity_08)),
ResUtil.getString(R.string.ui_setting_settingactivity_09),
@@ -148,6 +168,7 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
clearCache()
}
})
R.id.tv_notice_setting -> NoticeSettingActivity.start(context)
R.id.tv_shield_manager -> ShieldManageActivity.start(context)
R.id.rly_permission -> PermissionGuideActivity.start(context)
@@ -194,4 +215,14 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
dialogManager.dismissDialog()
EventBus.getDefault().unregister(this)
}
private fun debug() {
// RedPackageOpenDialog2().show(this)
// val json = "{\"first\":3,\"second\":32,\"data\":{\"recvUserUid\":2735,\"recvUserAvatar\":\"https://img.pekolive.com/default_avatar.png\",\"recvUserNick\":\"66丢丢丢丢丢多多多的hhhh\",\"sendUserNick\":\"11的ass\",\"sendUserAvatar\":\"http://beta.img.pekolive.com/Fk7aur-1RBqKXC-qqBwMTjivZ3lV?imageslim\",\"sendUserUid\":2737,\"giftUrl\":\"http://beta.img.pekolive.com/Fn6h_gPFD5MwA-Ql_kcWqNpKp0JM?imageslim\",\"giftName\":\"幽靈糖果\",\"giftId\":2075,\"giftNum\":${Random.nextInt(1,1000)},\"giftGolds\":33440,\"notifyStaySecond\":5,\"isHomeShow\":true,\"isSkipRoom\":true,\"isFullScreen\":false,\"isSendMsg\":false,\"roomUid\":2737,\"roomErbanNo\":11,\"roomTitle\":\"11的工会\",\"levelNum\":${Random.nextInt(1,4)}}}"
// onReceivedNimBroadcastMessage(json)
// val json = "{\"first\":85,\"second\":855,\"data\":{\"nick\":\"66丢丢丢丢丢多多多的hhhh\",\"preVipName\":\"子爵\",\"floatPic\":\"https://image.hfighting.com/Fq3JtbK2acO3FN-3vWZo8ldtHfse\",\"uid\":2735,\"currVipName\":\"侯爵\",\"erbanNo\":66,\"roomUid\":2734,\"avatar\":\"https://img.pekolive.com/default_avatar.png\",\"currVipLevel\":5}}"
// onReceivedNimBroadcastMessage(json)
// CommonWebViewActivity.start(this,"https://api.anan.chat/anan_vestBag/modules/rank/index.html#/rank")
// CommonWebViewActivity.start(this,"https://api.anan.chat/anan_vestBag/modules/myincome/index.html#/DiamondLog")
}
}

View File

@@ -19,6 +19,7 @@ import com.yizhuan.erban.ui.login.BindPhoneActivity
import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.code.CodeType
import com.yizhuan.xchat_android_core.pay.PayModel
import com.yizhuan.xchat_android_core.region.RegionHelper
import com.yizhuan.xchat_android_core.utils.net.BeanObserver
import com.yizhuan.xchat_android_library.utils.ResUtil
@@ -53,6 +54,7 @@ class VerifyPhoneActivity : BaseViewBindingActivity<ActivityVerifyPhoneBinding>(
resetPwd = intent.getBooleanExtra("resetPwd", false)
initListener()
RegionHelper().loadRecommendRegion(lifecycle, binding.tvAreaCode)
}
private fun initListener() {

View File

@@ -127,6 +127,21 @@ public class ImageLoadUtilsV2 {
}
/**
* 加载图片
* @param view
* @param url
* @param size 大小Glide.override属性
*/
@Deprecated(since = "临时加的,后续会整合优化项目的图片加载器!")
public static void loadImage2(ImageView view, String url, int size) {
if (view == null) {
return;
}
GlideApp.with(view).load(url).placeholder(R.drawable.default_cover)
.error(R.drawable.default_cover).override(size).into(view);
}
/**
*
* @param url -

View File

@@ -9,11 +9,11 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.webkit.SslErrorHandler;
@@ -59,7 +59,6 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
@@ -99,32 +98,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
private static final String POSITION = "position";
private int mPosition;
private int mProgress;
private Handler mHandler = new Handler();
private ProgressRunnable mProgressRunnable = new ProgressRunnable(this);
private static class ProgressRunnable implements Runnable {
private WeakReference<CommonWebViewActivity> mWeakReference;
ProgressRunnable(CommonWebViewActivity activity) {
mWeakReference = new WeakReference<>(activity);
}
@Override
public void run() {
CommonWebViewActivity activity = mWeakReference.get();
if (activity == null) return;
if (activity.mProgress < 96) {
activity.mProgress += 3;
activity.mProgressBar.setProgress(activity.mProgress);
activity.mHandler.postDelayed(activity.mProgressRunnable, 10);
}
}
}
public static void start(Context context, String url) {
Intent intent = new Intent(context, CommonWebViewActivity.class);
intent.putExtra("url", url);
@@ -222,7 +195,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
@SuppressLint("SetJavaScriptEnabled")
private void initData() {
mHandler.post(mProgressRunnable);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
@@ -290,9 +262,20 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
mProgressBar.setVisibility(View.GONE);
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mProgressBar.setVisibility(View.VISIBLE);
}
});
//获取webviewtitle作为titlebar的title
wvcc = new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
mProgressBar.setProgress(newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
@@ -520,11 +503,6 @@ public class CommonWebViewActivity extends BaseActivity implements ShareDialog.O
@Override
protected void onDestroy() {
if (mHandler != null) {
mHandler.removeCallbacks(mProgressRunnable);
mProgressRunnable = null;
mHandler = null;
}
EventBus.getDefault().unregister(this);
if (webViewCallBack != null) {

View File

@@ -3,8 +3,8 @@ package com.yizhuan.erban.ui.webview;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
@@ -28,8 +28,18 @@ public class DialogWebViewActivity extends CommonWebViewActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ScreenUtil.screenHeight / 3 * 2);
getWindow().setGravity(Gravity.BOTTOM);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
View topView = findViewById(R.id.v_top);
topView.setOnClickListener(v -> finish());
ViewGroup.LayoutParams params = topView.getLayoutParams();
params.height = ScreenUtil.screenHeight / 3;
topView.setLayoutParams(params);
showTitleBar = getIntent().getBooleanExtra("showTitleBar", true);
if (!showTitleBar) {
layoutTitleBar.setVisibility(View.GONE);

View File

@@ -0,0 +1,47 @@
package com.yizhuan.erban.ui.webview.room_banner
import android.view.View
import android.widget.ImageView
import androidx.core.view.isInvisible
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R
import com.yizhuan.erban.ui.utils.load
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
/**
* Created by Max on 2023/11/17 12:30
* Desc:
**/
class RoomBannerTabAdapter :
BaseQuickAdapter<BannerInfo, BaseViewHolder>(R.layout.room_banner_item_tab) {
private var selectedPosition = -1
override fun convert(helper: BaseViewHolder, item: BannerInfo?) {
helper.getView<ImageView>(R.id.iv_content).load(item?.bannerUrl)
convertState(helper, item)
}
override fun convertPayloads(
helper: BaseViewHolder,
item: BannerInfo?,
payloads: MutableList<Any>
) {
super.convertPayloads(helper, item, payloads)
convertState(helper, item)
}
private fun convertState(helper: BaseViewHolder, item: BannerInfo?) {
helper.getView<View>(R.id.v_selector).isInvisible =
helper.absoluteAdapterPosition != selectedPosition
}
fun getSelectedPosition(): Int {
return selectedPosition
}
fun select(position: Int) {
this.selectedPosition = position
notifyItemRangeChanged(0, itemCount, true)
}
}

View File

@@ -0,0 +1,91 @@
package com.yizhuan.erban.ui.webview.room_banner
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.recyclerview.widget.RecyclerView
import com.chuhai.utils.UiUtils
import com.yizhuan.erban.R
import com.yizhuan.erban.ui.webview.CommonWebViewActivity
import com.yizhuan.xchat_android_core.home.bean.BannerInfo
/**
* Created by Max on 2023/11/17 11:38
* Desc:房间内-Banner-WEB展示页面
**/
class RoomBannerWebDialogActivity : CommonWebViewActivity() {
private var recyclerView: RecyclerView? = null
private var adapter: RoomBannerTabAdapter? = null
companion object {
@JvmStatic
fun start(context: Context, position: Int, list: List<BannerInfo>) {
val newList = ArrayList<BannerInfo>()
newList.addAll(list)
val intent = Intent(context, RoomBannerWebDialogActivity::class.java)
intent.putExtra("position", position)
intent.putExtra("list", newList)
context.startActivity(intent)
}
}
override fun getLayoutId(): Int {
return R.layout.room_banner_dialog
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
window.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT
)
val topView = findViewById<View>(R.id.v_top)
topView.setOnClickListener { v: View? -> finish() }
val params = topView.layoutParams
params.height = UiUtils.dip2px(168f)
topView.layoutParams = params
webView.setBackgroundColor(Color.parseColor("#C9CBD1"))
recyclerView = findViewById(R.id.recyclerView)
val position = 0.coerceAtLeast(intent.getIntExtra("position", 0))
val list = intent.getSerializableExtra("list") as? ArrayList<BannerInfo>
// if ((list?.size ?: 0) <= 1) {
// recyclerView?.isVisible = false
// }
adapter = RoomBannerTabAdapter().apply {
setOnItemClickListener { adapter, view, position ->
if (this@RoomBannerWebDialogActivity.adapter?.getSelectedPosition() == position) {
return@setOnItemClickListener
}
switchTab(position)
}
}
recyclerView?.adapter = adapter
adapter?.setNewData(list)
switchTab(position)
}
private fun switchTab(position: Int) {
val url = adapter?.getItem(position)?.skipUri
showWebView(url)
adapter?.select(position)
recyclerView?.post {
recyclerView?.scrollToPosition(position)
}
}
override fun showWebView(url: String?) {
if (url.isNullOrEmpty()) {
return
}
super.showWebView(url)
}
}

View File

@@ -0,0 +1,146 @@
package com.yizhuan.erban.ui.widget
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Typeface
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewParent
/**
* Created by Max on 2023/12/8 10:43
* Desc:字母索引
**/
class SideBarView : View {
private var selectIndex = 0
private var textSize = 0f
private var textColor = 0
private var textSizeFocus = 0f
private var textColorFocus = 0
//标记 避免重复调用
private var isDown = false
//这里也可以传入数组方式
private var list = listOf(
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z", "#"
)
private var paint = Paint()
private var listener: Listener? = 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)
fun setTextColor(textColor: Int, focusTextColor: Int = textColor) {
this.textColor = textColor
this.textColorFocus = focusTextColor
}
fun setTextSize(textSize: Float, focusTextSize: Float = textSize) {
this.textSize = textSize
this.textSizeFocus = focusTextSize
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
paintText(canvas)
}
private fun paintText(canvas: Canvas?) {
//计算每一个字母的高度,总告诉除以字母集合的高度就可以
val height: Int = height / list.size
for (i in list.indices) {
if (i == selectIndex) {
paint.color = textColorFocus
paint.textSize = textSizeFocus
} else {
paint.color = textColor
paint.textSize = textSize
}
paint.isAntiAlias = true //设置抗锯齿
paint.typeface = Typeface.DEFAULT_BOLD
//计算每一个字母x轴
val paintX = width / 2f - paint.measureText(list[i]) / 2
//计算每一个字母Y轴
val paintY = height * i + height
//绘画出来这个TextView
canvas?.drawText(list[i], paintX, paintY.toFloat(), paint)
//画完一个以后重置画笔
paint.reset()
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val parent: ViewParent?
when (event.action) {
MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> {
val index = (event.y / height * list.size).toInt()
if (index >= 0 && index < list.size && selectIndex != index) {
listener?.onSideBarScroll(list[index])
selectIndex = index
invalidate()
//改变标记状态
isDown = true
}
parent = getParent()
parent?.requestDisallowInterceptTouchEvent(true)
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
listener?.onSideBarScrollEnd()
//改变标记状态
isDown = false
parent = getParent()
parent?.requestDisallowInterceptTouchEvent(false)
}
}
return true
}
interface Listener {
//滚动位置
fun onSideBarScroll(word: String)
//隐藏提示文本
fun onSideBarScrollEnd()
}
fun setListener(listener: Listener?) {
this.listener = listener
}
/**
* Item滚动 更新侧边栏字母
*
* @param word 字母
*/
fun onUpdateSideBarText(word: String?) {
//手指没触摸才调用
if (!isDown) {
for (i in list.indices) {
if (list[i] == word && selectIndex != i) {
selectIndex = i
invalidate()
}
}
}
}
}

View File

@@ -1,78 +0,0 @@
package com.yizhuan.erban.ui.widget.dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.databinding.DataBindingUtil;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.databinding.DialogGiftAllServiceBinding;
import com.yizhuan.xchat_android_core.noble.AllServiceGiftProtocol;
import com.yizhuan.xchat_android_library.utils.SizeUtils;
/**
* Created by huangmeng1 on 2018/3/29.
*/
public class AllServiceGiftDialog extends BaseDialog {
public static final int ALL_SERVICE_GIFT_LEVEL_1 = 1;
public static final int ALL_SERVICE_GIFT_LEVEL_2 = 2;
public static final int ALL_SERVICE_GIFT_LEVEL_3 = 3;
protected int giftLevel = 1;
protected AllServiceGiftProtocol.DataBean dataBean;
private DialogGiftAllServiceBinding binding;
public AllServiceGiftDialog(Context context, AllServiceGiftProtocol.DataBean dataBean) {
this(context, 0);
this.dataBean = dataBean;
}
public AllServiceGiftDialog(Context context, int theme, AllServiceGiftProtocol.DataBean dataBean) {
super(context, theme);
this.dataBean = dataBean;
}
public AllServiceGiftDialog(Context context, int theme) {
super(context, theme);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.dialog_gift_all_service, null);
setContentView(inflate.getRootView());
setCancelable(true);
setCanceledOnTouchOutside(true);
binding = DataBindingUtil.bind(inflate);
Window window = getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.dimAmount = 0.0f;
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
windowParams.y = SizeUtils.dp2px(getContext(), 62);
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.setAttributes(windowParams);
window.setWindowAnimations(R.style.anim_left);
}
if (dataBean != null) {
binding.tvRoomId.setOnClickListener(v -> AVRoomActivity.start(getContext(), dataBean.getRoomErbanNo()));
binding.setGiftBean(dataBean);
}
}
}

View File

@@ -0,0 +1,105 @@
package com.yizhuan.erban.ui.widget.dialog
import android.content.Context
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.Window
import android.view.WindowManager
import androidx.databinding.DataBindingUtil
import com.chuhai.utils.ktx.singleClick
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.activity.AVRoomActivity
import com.yizhuan.erban.databinding.AllServiceGiftGoRoomTipsDialogBinding
import com.yizhuan.erban.public_chat_hall.activity.PublicChatHallHomeActivity
import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_library.common.util.SPUtils
import com.yizhuan.xchat_android_library.utils.JavaUtil
/**
* Created by Max on 2023/10/30 10:29
* Desc:跳转房间提示
**/
class AllServiceGiftGoRoomTipsDialog(
context: Context,
private val roomName: String,
private val roomId: Long
) :
BaseDialog(context, R.style.dialog) {
private var binding: AllServiceGiftGoRoomTipsDialogBinding? = null
companion object {
/**
* 是否需要提示前往房间
*/
fun isNeedTips(): Boolean {
return !SPUtils.getBoolean("all_service_gift_go_room_no_tips", false)
}
/**
* 忽略提示/不在提示
*/
private fun ignoreTips() {
SPUtils.putBoolean("all_service_gift_go_room_no_tips", true)
}
}
private var isCheck: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setCancelable(false)
requestWindowFeature(Window.FEATURE_NO_TITLE)
val inflate =
LayoutInflater.from(context)
.inflate(R.layout.all_service_gift_go_room_tips_dialog, null)
setContentView(inflate.rootView)
binding = DataBindingUtil.bind(inflate)
binding?.tvRoomName?.text = roomName
binding?.ivCheckbox?.setOnClickListener {
updateCheckbox(!isCheck)
}
binding?.tvTips?.setOnClickListener {
updateCheckbox(!isCheck)
}
binding?.tvGo?.singleClick {
if (isCheck) {
ignoreTips()
}
if (roomId == JavaUtil.str2long(InitialModel.get().publicChatHallUid)) {
PublicChatHallHomeActivity.openPublicChatHallPage(context)
} else {
AVRoomActivity.start(context, roomId)
}
dismiss()
}
binding?.tvCancel?.singleClick {
if (isCheck) {
ignoreTips()
}
dismiss()
}
updateCheckbox(false)
}
override fun onStart() {
super.onStart()
this.window?.attributes?.let {
it.width = WindowManager.LayoutParams.MATCH_PARENT
it.height = WindowManager.LayoutParams.WRAP_CONTENT
it.gravity = Gravity.CENTER
window?.attributes = it
}
}
private fun updateCheckbox(isCheck: Boolean) {
this.isCheck = isCheck
if (isCheck) {
binding?.ivCheckbox?.setImageResource(R.drawable.base_ic_checkbox_selected)
} else {
binding?.ivCheckbox?.setImageResource(R.drawable.base_ic_checkbox_unselected)
}
}
}

View File

@@ -0,0 +1,192 @@
package com.yizhuan.erban.ui.widget.dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.ViewConfiguration
import android.view.Window
import android.view.WindowManager
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.chuhai.utils.ktx.getColorById
import com.chuhai.utils.ktx.singleClick
import com.chuhai.utils.ktx.toStringRes
import com.chuhai.utils.spannable.SpannableTextBuilder
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.activity.AVRoomActivity
import com.yizhuan.erban.databinding.DialogGiftAllServiceLevelBinding
import com.yizhuan.erban.public_chat_hall.activity.PublicChatHallHomeActivity
import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_core.noble.AllServiceGiftProtocol
import com.yizhuan.xchat_android_library.utils.JavaUtil
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
/**
* Created by Max on 2023/10/27 18:42
* Desc:全服礼物弹窗
**/
class AllServiceGiftLevelDialog : BaseDialog {
private var data: AllServiceGiftProtocol.DataBean? = null
private var binding: DialogGiftAllServiceLevelBinding? = null
private var disposable: Disposable? = null
companion object {
private var marqueeError = false
}
constructor(context: Context?, data: AllServiceGiftProtocol.DataBean) : super(
context, R.style.FullScreenDialog
) {
this.data = data
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
val inflate =
LayoutInflater.from(context).inflate(R.layout.dialog_gift_all_service_level, null)
setContentView(inflate.rootView)
setCancelable(true)
setCanceledOnTouchOutside(true)
binding = DataBindingUtil.bind(inflate)
val window = window
if (window != null) {
window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val windowParams = window.attributes
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT
//MATCH_PARENT会挡住键盘
// wrap_parent在小米8又会截掉一点在华为测试关闭按钮点击不到
//暂时找不到原因,
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT
windowParams.dimAmount = 0.0f
windowParams.gravity = Gravity.TOP
windowParams.x = 0
windowParams.y = 0
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)
window.attributes = windowParams
window.setWindowAnimations(R.style.anim_left)
}
val data = this.data
val binding = this.binding
if (data != null && binding != null) {
init(data, binding)
} else {
dismiss()
}
}
private fun init(
data: AllServiceGiftProtocol.DataBean,
binding: DialogGiftAllServiceLevelBinding
) {
binding.ivAvatar.singleClick {
goRoom(data)
}
binding.tvRoomGo.singleClick {
goRoom(data)
}
binding.giftBean = data
if ((data.giftNum) <= 1) {
binding.tvCount.text = ""
} else {
binding.tvCount.text = "X${data.giftNum}"
}
SpannableTextBuilder(binding.tvMessage)
.appendText(
data.sendUserNick,
binding.tvMessage.context.getColorById(R.color.color_FFE468)
)
.appendText(
R.string.avroom_widget_messageview_0137.toStringRes(),
binding.tvMessage.context.getColorById(R.color.white)
)
.appendText(
data.recvUserNick + " ",
binding.tvMessage.context.getColorById(R.color.color_FFE468)
)
.appendText(
data.giftName,
binding.tvMessage.context.getColorById(R.color.white)
).apply()
when (data.levelNum.toIntOrNull()) {
2 -> {
binding.ivAvatarBg.setImageResource(R.drawable.all_service_gift_bg_avatar_2)
binding.layoutRoot.setBackgroundResource(R.drawable.all_service_gift_bg_2)
binding.tvRoomGo.setBackgroundResource(R.drawable.all_service_gift_bg_room_go2)
}
3 -> {
binding.ivAvatarBg.setImageResource(R.drawable.all_service_gift_bg_avatar_3)
binding.layoutRoot.setBackgroundResource(R.drawable.all_service_gift_bg_3)
binding.tvRoomGo.setBackgroundResource(R.drawable.all_service_gift_bg_room_go3)
}
else -> {
binding.ivAvatarBg.setImageDrawable(null)
binding.layoutRoot.setBackgroundResource(R.drawable.all_service_gift_bg_1)
binding.tvRoomGo.setBackgroundResource(R.drawable.all_service_gift_bg_room_go1)
}
}
setupTextMarquee(binding.tvMessage)
disposable = Observable.timer(data.notifyStaySecond.toLong(), TimeUnit.SECONDS)
.subscribe { dismiss() }
binding.groupRoom.isVisible = data.roomUid != 0L
}
/**
* 添加跑马灯
* 以及反射一些参数影响跑马灯
*/
private fun setupTextMarquee(view: TextView) {
view.isSelected = true
if (marqueeError) {
return
}
try {
val configuration = ViewConfiguration.get(
context
)
val claz: Class<*> = configuration.javaClass
val field = claz.getDeclaredField("mFadingMarqueeEnabled")
field.isAccessible = true
field[configuration] = true
} catch (e: Exception) {
e.printStackTrace()
marqueeError = true
}
}
private fun goRoom(
data: AllServiceGiftProtocol.DataBean
) {
if (data.roomUid <= 0L) {
// 非房间场景送的礼物
return
}
if (AllServiceGiftGoRoomTipsDialog.isNeedTips()) {
AllServiceGiftGoRoomTipsDialog(context, data.roomTitle ?: "", data.roomUid).show()
} else {
if (data.roomUid == JavaUtil.str2long(InitialModel.get().publicChatHallUid)) {
PublicChatHallHomeActivity.openPublicChatHallPage(context)
} else {
AVRoomActivity.start(context, data.roomUid)
}
}
}
override fun dismiss() {
super.dismiss()
if (disposable?.isDisposed != true) {
disposable?.dispose()
}
disposable = null
}
}

View File

@@ -1,82 +0,0 @@
package com.yizhuan.erban.ui.widget.dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.databinding.DataBindingUtil;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.databinding.DialogGiftAllServiceLevelOneBinding;
import com.yizhuan.erban.public_chat_hall.activity.PublicChatHallHomeActivity;
import com.yizhuan.xchat_android_core.initial.InitialModel;
import com.yizhuan.xchat_android_core.noble.AllServiceGiftProtocol;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
/**
* Created by MadisonRong on 11/05/2018.
*/
public class AllServiceGiftLevelOneDialog extends AllServiceGiftDialog {
private DialogGiftAllServiceLevelOneBinding binding;
public AllServiceGiftLevelOneDialog(Context context, AllServiceGiftProtocol.DataBean dataBean) {
super(context, R.style.FullScreenDialog, dataBean);
giftLevel = ALL_SERVICE_GIFT_LEVEL_1;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.dialog_gift_all_service_level_one, null);
setContentView(inflate.getRootView());
setCancelable(true);
setCanceledOnTouchOutside(true);
binding = DataBindingUtil.bind(inflate);
Window window = getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT;
//MATCH_PARENT会挡住键盘
// wrap_parent在小米8又会截掉一点在华为测试关闭按钮点击不到
//暂时找不到原因,
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.dimAmount = 0.0f;
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
windowParams.y = 0;
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.setAttributes(windowParams);
window.setWindowAnimations(R.style.anim_left);
}
if (dataBean != null) {
binding.getRoot().setOnClickListener(v -> {
if (dataBean.getRoomUid() == JavaUtil.str2long(InitialModel.get().getPublicChatHallUid())) {
PublicChatHallHomeActivity.openPublicChatHallPage(getContext());
} else {
AVRoomActivity.start(getContext(), dataBean.getRoomUid());
}
});
Observable.timer((long) dataBean.getNotifyStaySecond(), TimeUnit.SECONDS)
.subscribe(aLong -> {
dismiss();
});
binding.setGiftBean(dataBean);
}
binding.ivCloseDialogOne.setOnClickListener(v -> dismiss());
}
}

View File

@@ -1,86 +0,0 @@
package com.yizhuan.erban.ui.widget.dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.databinding.DataBindingUtil;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.databinding.DialogGiftAllServiceLevelThreeBinding;
import com.yizhuan.erban.public_chat_hall.activity.PublicChatHallHomeActivity;
import com.yizhuan.xchat_android_core.initial.InitialModel;
import com.yizhuan.xchat_android_core.noble.AllServiceGiftProtocol;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
/**
* Created by MadisonRong on 11/05/2018.
*/
public class AllServiceGiftLevelThreeDialog extends AllServiceGiftDialog {
private DialogGiftAllServiceLevelThreeBinding binding;
private float screenWidth;
public AllServiceGiftLevelThreeDialog(Context context, AllServiceGiftProtocol.DataBean dataBean) {
super(context, R.style.FullScreenDialog, dataBean);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.dialog_gift_all_service_level_three, null);
setContentView(inflate.getRootView());
setCancelable(true);
setCanceledOnTouchOutside(true);
binding = DataBindingUtil.bind(inflate);
Window window = getWindow();
Point point = new Point();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT;
windowParams.height =WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.dimAmount = 0.0f;
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
windowParams.y = 0;
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.setAttributes(windowParams);
window.setWindowAnimations(R.style.anim_fade);
window.getWindowManager().getDefaultDisplay().getSize(point);
screenWidth = point.x;
}
if (dataBean != null) {
binding.giftClose.setOnClickListener(v -> {
dismiss();
});
binding.getRoot().setOnClickListener(v -> {
if (dataBean.getRoomUid() == JavaUtil.str2long(InitialModel.get().getPublicChatHallUid())) {
PublicChatHallHomeActivity.openPublicChatHallPage(getContext());
} else {
AVRoomActivity.start(getContext(), dataBean.getRoomUid());
}
});
// 设置定时器
Observable.timer((long) dataBean.getNotifyStaySecond(), TimeUnit.SECONDS)
.subscribe(aLong -> {
dismiss();
});
binding.setGiftBean(dataBean);
}
}
}

View File

@@ -1,85 +0,0 @@
package com.yizhuan.erban.ui.widget.dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import androidx.databinding.DataBindingUtil;
import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.activity.AVRoomActivity;
import com.yizhuan.erban.databinding.DialogGiftAllServiceLevelTwoBinding;
import com.yizhuan.erban.public_chat_hall.activity.PublicChatHallHomeActivity;
import com.yizhuan.xchat_android_core.initial.InitialModel;
import com.yizhuan.xchat_android_core.noble.AllServiceGiftProtocol;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
/**
* Created by MadisonRong on 11/05/2018.
*/
public class AllServiceGiftLevelTwoDialog extends AllServiceGiftDialog {
private DialogGiftAllServiceLevelTwoBinding binding;
private float screenWidth;
public AllServiceGiftLevelTwoDialog(Context context, AllServiceGiftProtocol.DataBean dataBean) {
super(context, R.style.FullScreenDialog, dataBean);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.dialog_gift_all_service_level_two, null);
setContentView(inflate.getRootView());
setCancelable(true);
setCanceledOnTouchOutside(true);
binding = DataBindingUtil.bind(inflate);
Window window = getWindow();
Point point = new Point();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams windowParams = window.getAttributes();
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.dimAmount = 0.0f;
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
windowParams.y = 0;
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.setAttributes(windowParams);
window.setWindowAnimations(R.style.anim_left);
window.getWindowManager().getDefaultDisplay().getSize(point);
screenWidth = point.x;
}
if (dataBean != null) {
binding.getRoot().setOnClickListener(v -> {
if (dataBean.getRoomUid() == JavaUtil.str2long(InitialModel.get().getPublicChatHallUid())) {
PublicChatHallHomeActivity.openPublicChatHallPage(getContext());
} else {
AVRoomActivity.start(getContext(), dataBean.getRoomUid());
}
});
// 设置定时器
Observable.timer((long) (dataBean.getNotifyStaySecond()), TimeUnit.SECONDS)
.subscribe(aLong -> dismiss());
binding.setGiftBean(dataBean);
}
binding.ivCloseDialogTwo.setOnClickListener(v -> dismiss());
}
}

View File

@@ -16,6 +16,7 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import com.chuhai.utils.ServiceTime;
import com.opensource.svgaplayer.SVGADrawable;
import com.opensource.svgaplayer.SVGADynamicEntity;
import com.opensource.svgaplayer.SVGAImageView;
@@ -41,6 +42,8 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
private final VipMessageInfo vipMessageInfo;
private DialogVipAllServiceLevelUpBinding binding;
private long startTime = 0;
private int frameCount = 0;
public AllServiceVipLevelUPDialog(Context context, @NonNull VipMessageInfo vipMessageInfo) {
super(context, R.style.FullScreenDialog);
@@ -77,7 +80,7 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
.append(ResUtil.getString(R.string.widget_dialog_allserviceviplevelupdialog_01), new ForegroundColorSpan(Color.WHITE))
.append("-", new CircleImageSpan(new ColorDrawable(Color.TRANSPARENT), vipMessageInfo.getAvatar(), 50, 50))
.append(" " + StringExtensionKt.sub(vipMessageInfo.getNick(), 6) + " ", new ForegroundColorSpan(getContext().getResources().getColor(R.color.notice_nick)))
.append(ResUtil.getString(R.string.widget_dialog_allserviceviplevelupdialog_02) + vipMessageInfo.getCurrVipName(), new ForegroundColorSpan(Color.WHITE)+"!");
.append(ResUtil.getString(R.string.widget_dialog_allserviceviplevelupdialog_02) + vipMessageInfo.getCurrVipName(), new ForegroundColorSpan(Color.WHITE) + "!");
SVGAImageView svgaImageView = new SVGAImageView(getContext());
svgaImageView.setLoops(1);
@@ -87,7 +90,19 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
svgaImageView.setCallback(new SimpleSvgaCallback() {
@Override
public void onFinished() {
closeSelf();
long offset = ServiceTime.INSTANCE.getTime() - startTime;
if (offset < 6000) {
int centerFrame = frameCount / 2;
if (centerFrame > 0) {
// 目前的SVGA资源最后一帧是半透明的这里强制跳到中间帧最大程度避免这种情况
svgaImageView.stepToFrame(centerFrame, false);
}
svgaImageView.postDelayed(() -> {
closeSelf();
}, 6000 - offset);
} else {
closeSelf();
}
}
});
binding.flSvgaVipNotify.addView(svgaImageView);
@@ -95,6 +110,8 @@ public class AllServiceVipLevelUPDialog extends BaseDialog {
SVGAParser.Companion.shareParser().decodeFromURL(new URL(vipMessageInfo.getFloatPic()), new SVGAParser.ParseCompletion() {
@Override
public void onComplete(@NonNull SVGAVideoEntity svgaVideoEntity) {
frameCount = svgaVideoEntity.getFrames();
startTime = ServiceTime.INSTANCE.getTime();
SVGADynamicEntity dynamicEntity = new SVGADynamicEntity();
TextPaint textPaint = new TextPaint();
textPaint.setColor(Color.WHITE);//字体颜色

View File

@@ -0,0 +1,37 @@
package com.yizhuan.erban.view
import android.content.Context
import android.util.AttributeSet
import android.view.View
import androidx.viewpager.widget.ViewPager
/**
* Created by Max on 2022/10/10 15:30
* 高度自适应(采用最大的子页面高度)-ViewPager
*/
class WrapHeightViewPager : ViewPager {
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
var height = 0
for (i in 0 until childCount) {
val child: View = getChildAt(i)
child.measure(
widthMeasureSpec,
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
)
val h = child.measuredHeight
if (h > height) {
height = h
}
}
super.onMeasure(
widthMeasureSpec, MeasureSpec.makeMeasureSpec(
height,
MeasureSpec.EXACTLY
)
)
}
}

View File

@@ -57,8 +57,10 @@ class VipUpgradeDialog : BaseDialog<DialogVipUpgradeBinding>() {
.decodeFromURL(URL(vipInfo.vipLogo), object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
val drawable = SVGADrawable(videoItem)
binding?.ivVipIcon?.setImageDrawable(drawable)
binding?.ivVipIcon?.startAnimation()
if (isViewLoaded) {
_binding?.ivVipIcon?.setImageDrawable(drawable)
_binding?.ivVipIcon?.startAnimation()
}
}
override fun onError() {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

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