Compare commits

...

87 Commits

Author SHA1 Message Date
eggmanQQQ
ce50e32a73 feat ; 去掉 carshCat 2024-09-26 16:11:20 +08:00
eggmanQQQ
7223db9e9c fix: 修复bug , 增加全局报错日志抓取 2024-09-26 15:28:07 +08:00
eggmanQQQ
4a2a9d4400 feat : 明文流量修改回退 2024-09-25 19:39:57 +08:00
eggmanQQQ
8049bdf6ea fix : bug 修复 2024-09-25 19:37:21 +08:00
eggmanQQQ
c90a961e2f feat : 修改权限 , 新增 定制礼物, 去掉友盟取设备号的sdk , 明文请求修改 2024-09-25 19:06:52 +08:00
eggmanQQQ
892f7c3e70 fix: vip 时间 2024-09-24 18:36:54 +08:00
eggmanQQQ
4c8182ee2f update version to 1.0.16 2024-09-24 18:26:33 +08:00
eggmanQQQ
343e73c6e3 feat: 修改 cp 相关bug 2024-09-24 18:18:53 +08:00
eggmanQQQ
eabe2ae7f8 feat : 修复bug 2024-09-24 11:31:29 +08:00
eggmanQQQ
36c011d18e feat : cp 功能 , 个人主页UI修改 , cp列表 , 房间cp飘屏,cp相关动画 , vip中心banner 显示剩余时间 2024-09-23 16:10:39 +08:00
eggmanQQQ
f929d78540 feat : 房間按鈕調整 (欠缺几个图片。app icon 和空状态图 未更改 2024-09-14 15:30:09 +08:00
eggmanQQQ
8184cdd6e1 feat: 房间 排行按钮, 音乐按钮 2024-09-13 13:53:13 +08:00
max
e4d44155dc feat: 更改类名 ,处理代码区分 2024-09-12 19:20:13 +08:00
max
06c974a6ed feat: 图片资源 格式转换 2024-09-12 19:03:23 +08:00
max
4bfbd19b53 fix: 修复bug, 调整升级弹窗不再弹出, 兼容旧版本连击横幅,礼物动画加快, 2024-09-12 18:55:55 +08:00
max
61a26f0c4f fix: 调整ui, 修复bug 2024-09-12 10:15:17 +08:00
max
e8cfc8a13b fix:异常注释 2024-09-11 16:23:24 +08:00
max
295de38074 feat: 幸运礼物 弹窗跟飘屏 , 替换 金币图标 2024-09-11 16:21:58 +08:00
max
e3c5f10d02 feat: 联机送礼功能 2024-09-09 18:39:22 +08:00
max
d949cfa7ff temp save 2024-09-05 19:24:44 +08:00
max
e30f4fd15f feat: 更正 tabbar size 2024-08-30 20:57:09 +08:00
max
90ece5366b feat: 更新数据明文处理 2024-08-30 20:54:13 +08:00
max
555b81589c feat: 修正 en 语言的部分 UI 2024-08-30 16:15:31 +08:00
max
e4cdc39ad8 feat: 修正反饋問題 2024-08-30 15:54:20 +08:00
max
09411df1ff feat:UI 調整 2024-08-29 19:21:07 +08:00
max
9cbc6cf39f fix: 修正 VIP 購買選項 model 2024-08-29 18:19:44 +08:00
max
444d043aa8 feat: 修改聯繫人列表 UI 2024-08-29 17:06:40 +08:00
max
f99d193598 feat: 修改信息列表 UI 2024-08-29 16:42:24 +08:00
max
4a57bd50c5 feat:UI 調整 2024-08-29 12:00:28 +08:00
eggmanQQQ
8a59f8a769 feat: 调整 RTL 布局 UI 2024-08-29 11:59:28 +08:00
max
2c1ecbb263 feat:UI 調整 2024-08-28 21:41:19 +08:00
max
aa2987cb0d feat:修正問題 2024-08-28 21:40:15 +08:00
eggmanQQQ
5e6864d87f feat: 更新 UI 2024-08-28 21:39:59 +08:00
eggmanQQQ
6aabeb3eb3 feat: 更新 UI 2024-08-28 17:36:16 +08:00
eggmanQQQ
9ff48bc500 feat: 移除资源,补充多语言 2024-08-28 13:55:59 +08:00
max
e9ba0b1929 feat:調整 VIP 顯示邏輯,移除公聊廳 2024-08-28 13:55:12 +08:00
max
adf2adc173 feat:調整 VIP 顯示邏輯,移除公聊廳 2024-08-27 16:51:46 +08:00
max
74b2d71821 調試 UI 2024-08-27 16:51:46 +08:00
eggmanQQQ
81a5c6ba65 feat: 補充卡片背景,補充 VIP 資源播放 MP4 的功能 2024-08-27 16:31:44 +08:00
eggmanQQQ
5f8a8113c6 feat:个人资料卡支持 MP4 资源 2024-08-27 11:53:49 +08:00
eggmanQQQ
b0bf9ce98d feat: 调整文案 2024-08-27 11:24:32 +08:00
eggmanQQQ
c3fcbc3942 feat: 更新资源,调整布局 2024-08-27 10:33:34 +08:00
max
6e08f397ee fix:Vip 頁面支持 MP4 播放,修正佈局問題 2024-08-26 16:58:19 +08:00
eggmanQQQ
3d29568b3c feat: 更新 VIP 页面 UI & 功能 2024-08-26 09:13:28 +08:00
eggmanQQQ
cb4dac8e81 feat: 更新 VIP 页面 UI & 功能 2024-08-23 19:29:38 +08:00
eggmanQQQ
f58701a2d6 version update 2024-08-20 10:53:52 +08:00
max
654bc45c8c fix:修正信息 tag 列表項阿語環境在 Android 低版本時佈局異常問題 2024-08-13 18:35:23 +08:00
max
87a36d796c Version Update 2024-08-13 18:19:19 +08:00
eggmanQQQ
0bc1023c99 fix: 修正用户访问失败时的返回处理 2024-08-06 19:27:00 +08:00
max
154e688673 version code update 2024-08-06 11:20:31 +08:00
max
a91dee592d fix:補充查找禮物的類型 2024-08-05 21:42:47 +08:00
eggmanQQQ
7ef78bc3e1 fix: 調整多語言時,點擊 tab 的移動判斷 2024-08-05 19:22:44 +08:00
eggmanQQQ
b5bcd9cb5f fix: 調整多語言時,禮物面板 tab 的默認方向 2024-08-05 19:06:08 +08:00
max
de7eb25045 feat:隱藏超級幸運禮物標記 2024-08-05 18:57:18 +08:00
eggmanQQQ
029b7fcf96 feat: 完成礼物面板调整 2024-08-05 16:39:41 +08:00
eggmanQQQ
23a3858a2c feat: "我的" 列表支持跳转至“我的装扮” 2024-08-02 10:32:49 +08:00
eggmanQQQ
67044ded6b fix:修正个播房玩法入口布局 2024-08-01 17:57:01 +08:00
eggmanQQQ
3e6d34a986 fix:修正个播房玩法入口布局 2024-07-31 18:48:14 +08:00
max
e7ca237a3e fix:修正個播房遊戲玩法入口的顯示問題 2024-07-31 17:51:20 +08:00
max
e26d548515 version_code update 2024-07-29 10:24:14 +08:00
eggmanQQQ
539be23e47 feat:调整配置入口按钮间距 2024-07-26 16:56:52 +08:00
eggmanQQQ
dcafb35e24 feat:调整配置入口按钮显示逻辑 2024-07-26 15:35:02 +08:00
eggmanQQQ
8fa429aca6 feat:更新数据的获取逻辑,接入配置按钮的跳转行为 2024-07-26 11:31:15 +08:00
max
f08b6d4577 新增 model 2024-07-25 22:28:54 +08:00
max
3ea7aecd5c feat:處理底部按鈕顯示邏輯 2024-07-25 18:31:50 +08:00
eggmanQQQ
178f4e24ef 更换资源 2024-07-25 16:12:07 +08:00
max
e2861459fb feat:玩法列表支持最多 3 行並滾動 2024-07-25 15:14:08 +08:00
eggmanQQQ
d704a44106 feat:更新玩法按鈕以及顯示內容 2024-07-24 20:08:03 +08:00
max
da81a4e905 feat:更新房間底部 layout 2024-07-24 14:54:41 +08:00
max
6c081d9a38 fix:修正英語翻譯 2024-07-24 12:13:56 +08:00
max
37d897035f feat:固化混淆配置 2024-07-12 19:07:32 +08:00
max
cea25c7497 feat:调整重名类命名 2024-07-12 14:25:32 +08:00
max
47d2bfd145 feat:替换登录页-logo图片 2024-07-12 11:21:44 +08:00
max
047e1454bd feat:适配Android14 2024-07-12 09:55:16 +08:00
max
714d5baec6 fix:修复个播粉丝团RTL适配问题 2024-07-11 18:56:09 +08:00
max
b20ee8064c fix:修复房间音乐音量无法调节bug 2024-07-11 18:24:50 +08:00
max
711135ae90 feat:移除不必要的debug-toast 2024-07-11 17:21:32 +08:00
max
ecf42e368e feat:完成游戏开黑翻译
fix:UI问题修复
2024-07-11 16:06:05 +08:00
max
205e1180e7 feat:首页-房间列表 麦位头像改为动态数据 2024-07-11 15:41:02 +08:00
max
bc48cc86a9 fix:礼物名称 动态适配多语言 2024-07-11 11:24:18 +08:00
max
e7b73a2961 feat:完成游戏开黑功能 2024-07-10 19:57:20 +08:00
max
5070e21d16 feat:【开黑】完成部分UI 2024-07-10 19:57:19 +08:00
max
049006aa8b feat:补充异常信息展示 2024-07-10 19:56:04 +08:00
max
86b498c00e feat:删除测试代码,删除不必要的log
fix:完善销毁逻辑
2024-07-09 15:57:11 +08:00
max
6df95cf11f feat:适配BillingService2,完善支付回调 2024-07-09 15:57:10 +08:00
max
3b407c0bd6 feat:初步实现H5唤起支付逻辑(不完善,用于打内测包验证) 2024-07-09 15:57:10 +08:00
max
83af08076a fix:头条UI微调 2024-07-09 15:56:20 +08:00
547 changed files with 13815 additions and 4059 deletions

View File

@@ -205,6 +205,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
api 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
@@ -270,6 +271,8 @@ dependencies {
//wheelView
implementation 'com.contrarywind:wheelview:4.1.0'
// 轮播组件
implementation 'io.github.youth5201314:banner:2.2.3'
implementation project(':modules:module_base')
if (!isolationMode && file("../modules/module_google/build.gradle").exists()) {

View File

@@ -51,9 +51,9 @@
tools:node="remove" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission tools:node="remove" android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission tools:node="remove" android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
@@ -82,7 +82,8 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- 对于 Android 12.0 及以上设备,还需要添加如下权限: -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />
<application
android:name=".application.App"
android:allowBackup="false"
@@ -315,6 +316,9 @@
android:name=".ui.user.activity.UserInfoActivity"
android:label="@string/main_androidmanifest_016"
android:screenOrientation="portrait" />
<activity
android:name=".ui.user.activity.UserCpListActivity"
android:screenOrientation="portrait" />
<activity
android:name=".audio.AudioRecordActivity"
android:label="@string/main_androidmanifest_017"
@@ -732,8 +736,8 @@
android:name=".ui.setting.PermissionGuideActivity"
android:screenOrientation="portrait" />
<activity
android:name=".vip.VipMainActivity"
android:screenOrientation="portrait" /> <!-- 隐私设置 -->
android:name=".vip.VipCenterActivity"
android:screenOrientation="portrait" />
<activity
android:name=".vip.VipSettingActivity"
android:screenOrientation="portrait" /> <!-- 通知提醒设置 -->
@@ -876,17 +880,22 @@
<service
android:name="com.netease.nimlib.service.NimService"
android:foregroundServiceType="remoteMessaging"
android:process=":core" />
<service
android:name="com.netease.nimlib.service.NimService$Aux"
android:foregroundServiceType="remoteMessaging"
android:process=":core" />
<service
android:name="com.netease.nimlib.job.NIMJobService"
android:foregroundServiceType="remoteMessaging"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":core" />
<service android:name="com.netease.nimlib.service.ResponseService" />
<service android:name="com.netease.nimlib.service.ResponseService"
android:foregroundServiceType="remoteMessaging"/>
<service
android:name=".service.DaemonService"
android:foregroundServiceType="mediaPlayback"
android:enabled="true" />
<activity android:name=".avroom.room_album.RoomAlbumActivity" />
@@ -949,6 +958,8 @@
android:screenOrientation="portrait" />
<activity android:name=".ui.debug.DebugActivity"
android:screenOrientation="portrait"/>
<activity android:name=".ui.game_team.record.GameTeamRecordActivity"
android:screenOrientation="portrait"/>
</application>
</manifest>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -9,6 +9,7 @@ import android.content.res.Configuration;
import android.graphics.Color;
import android.net.http.HttpResponseCache;
import android.os.Build;
import android.os.Environment;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -84,7 +85,6 @@ import com.chwl.library.common.file.FileHelper;
import com.chwl.library.net.rxnet.RxNet;
import com.chwl.library.net.rxnet.converter.GsonConverterPlugins;
import com.chwl.library.utils.AppMetaDataUtil;
import com.chwl.library.utils.AppUtils;
import com.chwl.library.utils.DeviceUuidFactory;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
@@ -417,7 +417,7 @@ public class App extends BaseApp {
httpParams.put("netType", String.valueOf(SystemUtils.getNetworkType(context)));
httpParams.put("model", SystemUtils.getPhoneModel());
httpParams.put("appVersion", VersionUtil.getLocalName(context));
httpParams.put("appVersionCode", String.valueOf(AppUtils.getVersionCode(context)));
httpParams.put("appVersionCode", String.valueOf(VersionUtil.getVersionCode(context)));
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());

View File

@@ -97,7 +97,7 @@ public class GlobalHandleManager {
Activity activity = getActivity();
if (activity == null) return;
if (AvRoomDataManager.get().isSelfGamePlaying()) return;
LevelUpDialog.start(activity, event.getLevelName(), true);
// LevelUpDialog.start(activity, event.getLevelName(), true);
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -105,7 +105,7 @@ public class GlobalHandleManager {
Activity activity = getActivity();
if (activity == null) return;
if (AvRoomDataManager.get().isSelfGamePlaying()) return;
LevelUpDialog.start(activity, event.getLevelName(), false);
// LevelUpDialog.start(activity, event.getLevelName(), false);
}
private static final class Helper {

View File

@@ -47,8 +47,7 @@ public abstract class BottomViewListenerWrapper {
}
public void onRoomGameplayClick(){
public void onRoomGameplayClick(boolean isOnlyPK){
}
}

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkFinishBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.utils.extension.subAndReplaceDot
class RoomPkFinishDialog : BaseDialog<DialogRoomPkFinishBinding>() {
class RoomPkFinishDialog : BaseDialogFragment<DialogRoomPkFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkForceFinishBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.utils.extension.subAndReplaceDot
class RoomPkForceFinishDialog : BaseDialog<DialogRoomPkForceFinishBinding>() {
class RoomPkForceFinishDialog : BaseDialogFragment<DialogRoomPkForceFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,7 +4,7 @@ import android.annotation.SuppressLint
import android.os.Bundle
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkReceivedBinding
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.manager.AvRoomDataManager
@@ -16,7 +16,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class RoomPkReceivedDialog : BaseDialog<DialogRoomPkReceivedBinding>() {
class RoomPkReceivedDialog : BaseDialogFragment<DialogRoomPkReceivedBinding>() {
companion object {

View File

@@ -1,9 +1,9 @@
package com.chwl.app.avroom.anotherroompk
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomPkRuleBinding
class RoomPkRuleDialog : BaseDialog<DialogRoomPkRuleBinding>() {
class RoomPkRuleDialog : BaseDialogFragment<DialogRoomPkRuleBinding>() {
companion object {

View File

@@ -0,0 +1,149 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
import androidx.annotation.StyleRes
import androidx.viewbinding.ViewBinding
import com.chwl.app.R
import com.chwl.app.avroom.widget.VDHLayout
import com.chwl.app.ui.widget.dialog.BaseDialog
abstract class BaseRoomNotifyDialog<VB : ViewBinding>(context: Context, theme: Int = 0) : BaseDialog(context, theme) {
protected val handle = Handler(Looper.getMainLooper())
protected lateinit var mBinding: VB
abstract fun createBinding(inflater: LayoutInflater): VB
abstract fun init()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = createBinding(LayoutInflater.from(context))
setContentView(mBinding.root)
setCancelable(true)
setCanceledOnTouchOutside(false)
window?.let {
initWindow(it)
}
init()
if (useAutoDismiss()) {
handle.postDelayed({
dismissDialog()
}, (getStaySecond()*1000).toLong())
}
}
override fun onDetachedFromWindow() {
handle.removeCallbacksAndMessages(null)
super.onDetachedFromWindow()
}
protected open fun initWindow(window: Window) {
window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val windowParams = window.attributes
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 = getTopOffset()
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)
window.attributes = windowParams
window.setWindowAnimations(getAnimations())
}
protected open fun getStaySecond():Float{
return 5f
}
protected open fun getTopOffset():Int{
return 0
}
@StyleRes
protected open fun getAnimations():Int{
return R.style.anim_left
}
override fun setContentView(view: View) {
if (useSlipSlip()) {
val vdhLayout = VDHLayout(context, null)
vdhLayout.addView(view)
vdhLayout.setListener { dismissDialog() }
super.setContentView(vdhLayout)
return
}
super.setContentView(view)
}
override fun setContentView(layoutResID: Int) {
if (useSlipSlip()) {
val vdhLayout = VDHLayout(context, null)
LayoutInflater.from(context).inflate(layoutResID, vdhLayout)
vdhLayout.setListener { dismissDialog() }
super.setContentView(vdhLayout)
return
}
super.setContentView(layoutResID)
}
override fun setContentView(view: View, params: ViewGroup.LayoutParams?) {
if (useSlipSlip()) {
val vdhLayout = VDHLayout(context, null)
vdhLayout.addView(view)
vdhLayout.setListener { dismissDialog() }
super.setContentView(vdhLayout, params)
return
}
super.setContentView(view, params)
}
/**
* 是否启动侧滑,左滑:删除,右滑:回到原位置
*/
protected open fun useSlipSlip(): Boolean {
return true
}
protected open fun useAutoDismiss(): Boolean {
return true
}
var mCallBack : CallBack? = null
interface CallBack{
fun onHide();
}
open fun dismissDialog() {
try {
dismiss()
} catch (e: Exception) {
}
mCallBack?.onHide()
}
open fun clearDialog() {
try {
dismiss()
} catch (e: Exception) {
}
}
open fun showDialog(){
show()
}
}

View File

@@ -6,7 +6,7 @@ import android.view.WindowManager
import androidx.recyclerview.widget.GridLayoutManager
import com.chwl.app.avroom.adapter.CreateRoomGameGuideAdapter
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogCreateGameRoomBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.app.ui.utils.RVDelegate
@@ -14,7 +14,7 @@ import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.room.game.bean.GameInfo
import com.chwl.core.room.game.GameModel
class CreateGameRoomDialog : BaseDialog<DialogCreateGameRoomBinding>() {
class CreateGameRoomDialog : BaseDialogFragment<DialogCreateGameRoomBinding>() {
private lateinit var rvDelegate: RVDelegate<GameInfo>
private val gameAdapter = CreateRoomGameGuideAdapter()

View File

@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.R
import com.chwl.app.avroom.adapter.CreateRoomGameAdapter
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogCreateRoomBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.app.ui.utils.RVDelegate
@@ -19,7 +19,7 @@ import com.chwl.core.room.game.GameModel
import com.chwl.core.utils.extension.toast
import com.chwl.library.utils.ResUtil
class CreateRoomDialog : BaseDialog<DialogCreateRoomBinding>() {
class CreateRoomDialog : BaseDialogFragment<DialogCreateRoomBinding>() {
private lateinit var rvDelegate: RVDelegate<GameInfo>
private val gameAdapter = CreateRoomGameAdapter()

View File

@@ -1,12 +1,12 @@
package com.chwl.app.avroom.dialog
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogNewUserGiftBinding
import com.chwl.app.ui.utils.load
import com.chwl.core.gift.bean.GiftInfo
class NewUserGiftDialog(val giftInfo: GiftInfo) :
BaseDialog<DialogNewUserGiftBinding>() {
BaseDialogFragment<DialogNewUserGiftBinding>() {
override fun init() {
binding?.ivClose?.setOnClickListener {

View File

@@ -11,6 +11,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.RecyclerView
import com.chwl.app.R
import com.chwl.app.avroom.adapter.RoomGameListAdapter
import com.chwl.app.base.BaseActivity
@@ -18,27 +19,37 @@ import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.databinding.RoomGameplayDialogBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.core.room.bean.RoomIcon
import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.room.bean.RoomModeType
import com.chwl.core.room.core.RoomDataService
import com.chwl.core.room.game.GameModel
import com.chwl.core.room.game.GameModel.getGameList
import com.chwl.core.room.game.bean.BaiShunGameConfig
import com.chwl.core.room.game.bean.GameInfo
import com.chwl.core.room.model.AvRoomModel
import com.chwl.core.support.room.AudioRoomContext
import com.chwl.core.utils.LogUtils
import com.chwl.library.utils.JavaUtil
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.example.lib_utils.ktx.asLifecycle
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.gson.Gson
import com.unity3d.splash.services.core.lifecycle.LifecycleEvent
import io.reactivex.Single
import io.reactivex.disposables.CompositeDisposable
class RoomGameListDialog :
BottomSheetDialogFragment(), LifecycleObserver {
private var binding: RoomGameplayDialogBinding? = null
private var compositeDisposable: CompositeDisposable? = null
private val adapter = RoomGameListAdapter()
private var dialogManager: DialogManager? = null
private lateinit var recycleView: RecyclerView
val cacheKey = "game_list#${parentFragment.hashCode()}"
private var mStatus = -1
private var mGameData = arrayListOf<GameInfo>()
var listener: RoomGameplayDialog.GameplayDialogListener? = null
override fun getTheme(): Int {
return R.style.ErbanBottomSheetDialogDimFalse
}
@@ -61,6 +72,8 @@ class RoomGameListDialog :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
recycleView = recyclerView
switchStatus(0)
requestData()
}
@@ -89,26 +102,59 @@ class RoomGameListDialog :
binding?.recyclerView?.adapter = adapter
}
private fun updateDialogHeight(count: Int) {
if (count > 10) {
val layoutParams = recycleView.layoutParams
layoutParams.height = 600
recycleView.layoutParams = layoutParams
}
}
private fun requestData() {
val dataService =
AudioRoomContext.get()
?.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
val cacheKey = "game_list#${parentFragment.hashCode()}"
val dataService = AudioRoomContext.get()?.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
// val cacheKey = "game_list#${parentFragment.hashCode()}"
val list = dataService?.getData(cacheKey) as? List<GameInfo>
if (!list.isNullOrEmpty()) {
updateDialogHeight(list.size)
loadData(list)
return
}
val disposable = getGameList(AvRoomDataManager.get().roomUid)
val getGameList = getGameList(AvRoomDataManager.get().roomUid)
.doOnError {
SingleToastUtil.showToast(it.message)
switchStatus(-2)
if (mStatus != 1)switchStatus(-2)
}
.subscribe { it: List<GameInfo> ->
LogUtils.d(" gamegame getGameList GameInfo = $it")
mGameData.addAll(0,it)
dataService?.putData(cacheKey, it)
loadData(it)
updateDialogHeight(mGameData.size)
loadData(mGameData)
}
getCompositeDisposable().add(disposable)
val roomGamePlayList = AvRoomModel.get().roomGamePlayList
.doOnError {
SingleToastUtil.showToast(it.message)
if (mStatus != 1)switchStatus(-2)
}
.subscribe { it: List<RoomIcon> ->
LogUtils.d(" gamegame roomGamePlayList RoomIcon = $it")
it.forEachIndexed { index, roomIcon ->
if (roomIcon.isBaiShunGame()) {
mGameData.add(GameInfo(name = roomIcon.name?:"", pic = roomIcon.icon?:"" , pic2 = roomIcon.icon?:"", skipContent = roomIcon.skipContent?:"", ruleValue = roomIcon.ruleValue?:""))
}
}
dataService?.putData(cacheKey, mGameData)
updateDialogHeight(mGameData.size)
loadData(mGameData)
}
getCompositeDisposable().add(getGameList)
getCompositeDisposable().add(roomGamePlayList)
}
private fun loadData(list: List<GameInfo>?) {
@@ -121,6 +167,7 @@ class RoomGameListDialog :
}
private fun switchStatus(status: Int) {
mStatus = status
when (status) {
// loading
0 -> {
@@ -172,27 +219,55 @@ class RoomGameListDialog :
dialogManager?.showOkCancelDialog(
getString(R.string.room_switch_game_tips)
) {
if (gameInfo.isStandardRoom()) {
OpenRoomHelper.updateRoomInfo(
activity as BaseActivity,
AvRoomDataManager.get().mCurrentRoomInfo,
RoomInfo.ROOMTYPE_HOME_PARTY,
0,
false
)
} else {
OpenRoomHelper.updateRoomInfo(
activity as BaseActivity,
AvRoomDataManager.get().mCurrentRoomInfo,
RoomInfo.ROOMTYPE_GAME,
JavaUtil.str2long(gameInfo.mgId),
false
)
if (gameInfo.mgId.isNotEmpty()) {
if (gameInfo.isStandardRoom()) {
OpenRoomHelper.updateRoomInfo(
activity as BaseActivity,
AvRoomDataManager.get().mCurrentRoomInfo,
RoomInfo.ROOMTYPE_HOME_PARTY,
0,
false
)
} else {
OpenRoomHelper.updateRoomInfo(
activity as BaseActivity,
AvRoomDataManager.get().mCurrentRoomInfo,
RoomInfo.ROOMTYPE_GAME,
JavaUtil.str2long(gameInfo.mgId),
false
)
}
}else if(!gameInfo.skipContent.isNullOrEmpty() || !gameInfo.ruleValue.isNullOrEmpty()){
jumpBaiShunGame(gameInfo)
}
dismissAllowingStateLoss()
}
}
private fun jumpBaiShunGame(data: GameInfo) {
try {
val url = data.skipContent
val ruleValue = Gson().fromJson<RoomIcon.RuleValueBean>(
data.ruleValue,
RoomIcon.RuleValueBean::class.java
)
val config = Gson().fromJson<BaiShunGameConfig>(
ruleValue.RESERVE,
BaiShunGameConfig::class.java
)
if (config != null && url != null) {
config.reloadDynamicParams()
listener?.onShowBaiShunGame(url, config)
} else {
SingleToastUtil.showToast(R.string.manager_trtc_trtcengineadapter_042)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onDestroy() {
super.onDestroy()
onUnbindContext()
@@ -220,4 +295,8 @@ class RoomGameListDialog :
return currentRoomInfo != null && currentRoomInfo.type != RoomInfo.ROOM_TYPE_SINGLE &&
(currentRoomInfo.roomModeType == RoomModeType.NORMAL_MODE || currentRoomInfo.roomModeType == 2 || currentRoomInfo.roomModeType == 4)
}
interface GameplayDialogListener {
fun onShowBaiShunGame(url: String, config: BaiShunGameConfig)
}
}

View File

@@ -10,6 +10,8 @@ import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chwl.app.R
import com.chwl.app.avroom.activity.CreatePKActivity
import com.chwl.app.avroom.adapter.RoomGameplayAdapter
@@ -39,8 +41,11 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.gson.Gson
import io.reactivex.disposables.CompositeDisposable
class RoomGameplayDialog :
BottomSheetDialogFragment() {
class RoomGameplayDialog : BottomSheetDialogFragment() {
var isOnlyPK = false
private lateinit var recycleView: RecyclerView
private var binding: RoomGameplayDialogBinding? = null
private var compositeDisposable: CompositeDisposable? = null
private val adapter = RoomGameplayAdapter()
@@ -69,6 +74,10 @@ class RoomGameplayDialog :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
recycleView = recyclerView
switchStatus(0)
requestData()
}
@@ -97,28 +106,46 @@ class RoomGameplayDialog :
}
private fun requestData() {
val dataService =
AudioRoomContext.get()
?.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
val cacheKey = "gameplay_list#${parentFragment.hashCode()}"
val list = dataService?.getData(cacheKey) as? List<RoomIcon>
if (!list.isNullOrEmpty()) {
loadSuccess(list)
return
if (isOnlyPK) {
loadSuccess(arrayListOf())
} else {
val dataService =
AudioRoomContext.get()
?.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
val cacheKey = "gameplay_list#${parentFragment.hashCode()}"
val list = dataService?.getData(cacheKey) as? List<RoomIcon>
if (!list.isNullOrEmpty()) {
updateDialogHeight(list.size)
loadSuccess(list)
return
}
val disposable = AvRoomModel.get().roomGamePlayList
.doOnError {
loadFail(it)
}
.subscribe { it: List<RoomIcon> ->
dataService?.putData(cacheKey, it)
updateDialogHeight(it.size)
loadSuccess(it)
}
getCompositeDisposable().add(disposable)
}
}
private fun updateDialogHeight(count: Int) {
if (count > 10) {
val layoutParams = recycleView.layoutParams
layoutParams.height = 600
recycleView.layoutParams = layoutParams
}
val disposable = AvRoomModel.get().roomGamePlayList
.doOnError {
loadFail(it)
}
.subscribe { it: List<RoomIcon> ->
dataService?.putData(cacheKey, it)
loadSuccess(it)
}
getCompositeDisposable().add(disposable)
}
private fun loadSuccess(list: List<RoomIcon>?) {
val finalList = getLocalList()
var finalList = mutableListOf<RoomGameplayItem>()
if (isOnlyPK) {
finalList = getLocalList()
}
list?.let {
finalList.addAll(list.map {
RoomGameplayItem.RoomIconItem(it) { dialog, item ->

View File

@@ -0,0 +1,87 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.graphics.Bitmap
import android.view.LayoutInflater
import com.chwl.app.databinding.RoomNotifyCpBindBinding
import com.chwl.app.ui.utils.CpUtils
import com.chwl.core.gift.bean.CpMsgBean
import com.chwl.core.utils.LogUtils
import com.tencent.qgame.animplayer.inter.IFetchResource
import com.tencent.qgame.animplayer.mix.Resource
import com.tencent.qgame.animplayer.util.ScaleType
class RoomNotifyCpBindDialog (private val context: Context) : BaseRoomNotifyDialog<RoomNotifyCpBindBinding>(context) {
override fun createBinding(inflater: LayoutInflater): RoomNotifyCpBindBinding {
return RoomNotifyCpBindBinding.inflate(inflater)
}
var cpMsgBean : CpMsgBean? = null
var senderAvatar : Bitmap? = null
var receiverAvatar : Bitmap? = null
var index = 0
override fun init() {
cpMsgBean?.let { data->
mBinding.anim.setScaleType(ScaleType.CENTER_CROP)
mBinding.anim.setFetchResource(object : IFetchResource {
override fun fetchImage(resource: Resource, result: (Bitmap?) -> Unit) {
result(if (resource.tag == "avatar1") senderAvatar else receiverAvatar)
}
override fun fetchText(resource: Resource, result: (String?) -> Unit) {
var name = ""
try {
name = if (resource.tag == "name1") data.senderNick else data.receiverNick
} catch (e: Exception) {
}
result(name)
}
override fun releaseResource(resources: List<Resource>) {
resources?.forEach {
it?.bitmap?.recycle()
}
}
})
mBinding.anim.startPlay(context.assets,"mp4/cp_bind.mp4")
}
}
override fun useSlipSlip() = false
override fun useAutoDismiss() = true
override fun showDialog() {
index = 0
cpMsgBean?.let {
CpUtils.downLoadAvatar(it.senderAvatar) { resource ->
index += 1
senderAvatar = resource
checkImg()
}
CpUtils.downLoadAvatar(it.receiverAvatar) { resource ->
index += 1
receiverAvatar = resource
checkImg()
}
}
}
fun checkImg() {
if (index == 2){
show()
}
}
}

View File

@@ -0,0 +1,31 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.view.LayoutInflater
import com.chwl.app.databinding.RoomNotifyCpGiftBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.gift.bean.CpMsgBean
import kotlin.math.truncate
/**
* cp 飘屏
*/
class RoomNotifyCpGiftDialog (private val context: Context) : BaseRoomNotifyDialog<RoomNotifyCpGiftBinding>(context) {
override fun createBinding(inflater: LayoutInflater): RoomNotifyCpGiftBinding {
return RoomNotifyCpGiftBinding.inflate(inflater)
}
var cpMsgBean : CpMsgBean? = null
override fun init() {
cpMsgBean?.let {
ImageLoadUtils.loadImage(mBinding.sendAvatar,it.senderAvatar)
ImageLoadUtils.loadImage(mBinding.receiverAvatar,it.receiverAvatar)
ImageLoadUtils.loadImage(mBinding.gift,it.giftUrl)
}
}
override fun useSlipSlip() = true
}

View File

@@ -0,0 +1,101 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.graphics.Color
import android.text.Layout
import android.text.StaticLayout
import android.text.TextPaint
import android.view.LayoutInflater
import com.chwl.app.R
import com.chwl.app.avroom.helper.AnimHelper
import com.chwl.app.databinding.RoomNotifyCpLevelUpBinding
import com.chwl.app.ui.utils.CpUtils
import com.chwl.app.ui.utils.loadFromAssets
import com.chwl.app.utils.SpannableBuilder
import com.chwl.core.gift.bean.CpMsgBean
import com.chwl.core.utils.SpanUtils
import com.example.lib_utils.ktx.getColor
import com.example.lib_utils.ktx.getString
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGADynamicEntity
import com.opensource.svgaplayer.SVGAParser
import com.opensource.svgaplayer.SVGAParser.Companion.shareParser
import com.opensource.svgaplayer.SVGAVideoEntity
class RoomNotifyLevelUpDialog (private val context: Context) : BaseRoomNotifyDialog<RoomNotifyCpLevelUpBinding>(context) {
override fun createBinding(inflater: LayoutInflater): RoomNotifyCpLevelUpBinding {
return RoomNotifyCpLevelUpBinding.inflate(inflater)
}
var cpMsgBean : CpMsgBean ? = null
override fun init() {
cpMsgBean?.let {
SpanUtils.with(mBinding.text)
.append(" ${it.senderNick} ").setForegroundColor(R.color.white.getColor())
.append(" ${R.string.avroom_widget_roomeffectview_02.getString()} ").setForegroundColor(R.color.color_fff664.getColor())
.append(" ${it.receiverNick} ").setForegroundColor(R.color.white.getColor())
.append(" ${R.string.Become.getString()} ").setForegroundColor(R.color.color_fff664.getColor())
.append(" ${CpUtils.getCpLevelUpStr(it.cpLevel)} ").setForegroundColor(R.color.white.getColor())
.create()
mBinding.text.setBackgroundResource(CpUtils.getCpLevelUpTextBg(it.cpLevel))
if (it.cpLevel < 1) return
val svga = "svga/cp_level_up_${it.cpLevel}.svga"
try {
shareParser().decodeFromAssets(svga, object : SVGAParser.ParseCompletion {
override fun onComplete(svgaVideoEntity: SVGAVideoEntity) {
val dynamicEntity = SVGADynamicEntity()
// val textPaint = TextPaint()
// textPaint.color = Color.WHITE //字体颜色
// textPaint.textSize = 24f //字体大小
// dynamicEntity.setDynamicText(
// StaticLayout(
// text.build(),
// 0,
// text.build().length,
// textPaint,
// 0,
// Layout.Alignment.ALIGN_CENTER,
// 1.0f,
// 0.0f,
// false
// ), "bg"
// )
AnimHelper.addDynamicImage(
mBinding.svga,
dynamicEntity,
it.senderAvatar,
"user_img1"
)
AnimHelper.addDynamicImage(
mBinding.svga,
dynamicEntity,
it.receiverAvatar,
"user_img2"
)
val drawable = SVGADrawable(svgaVideoEntity, dynamicEntity)
mBinding.svga.setImageDrawable(drawable)
mBinding.svga.stepToFrame(0, true)
// mBinding.svga.startAnimation()
}
override fun onError() {
}
}, null)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
override fun useSlipSlip() = false
}

View File

@@ -0,0 +1,64 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.view.LayoutInflater
import com.chwl.app.R
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener
import com.chwl.app.databinding.RoomNotifyLuckGiftDlgBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.utils.NumberUtils
import com.chwl.core.gift.bean.LuckyGiftMsgAllBean
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.UiUtils
/**
* @Author Vance
* 幸运礼物的飘屏,全服但是展示的时候限制只有房间才展示
*/
class RoomNotifyLuckGiftDialog(private val context: Context) : BaseRoomNotifyDialog<RoomNotifyLuckGiftDlgBinding>(context) {
override fun createBinding(inflater: LayoutInflater): RoomNotifyLuckGiftDlgBinding {
return RoomNotifyLuckGiftDlgBinding.inflate(inflater)
}
private var mDialogManager: DialogManager? = null
var luckyGiftMsgBean: LuckyGiftMsgAllBean ? = null
override fun init() {
if (UiUtils.isRtl(context)) {
mBinding.bg.scaleX = -1f
}
ImageLoadUtils.loadImage(mBinding.avatar,luckyGiftMsgBean?.sender?.avatar?:"")
mBinding.giftName.text = luckyGiftMsgBean?.giftNameMap?.getFirstText()
mBinding.winNum.text = luckyGiftMsgBean?.times.toString()
val coinNum = NumberUtils.format(luckyGiftMsgBean?.coins?:0)
mBinding.coinNum.text = coinNum
mBinding.clickArea.setOnClickListener {
mDialogManager = DialogManager(context)
mDialogManager?.showOkCancelDialog(ResUtil.getString(R.string.changeRoomTips), true, object : OkCancelDialogListener {
override fun onCancel() {
mDialogManager?.dismissDialog()
}
override fun onOk() {
mDialogManager?.dismissDialog()
luckyGiftMsgBean?.roomUid?.let {
if (AvRoomDataManager.get().roomUid != it) {
AVRoomActivity.start(context, it)
}
}
}
})
}
}
}

View File

@@ -77,6 +77,14 @@ public class RoomOperationDialog extends BottomSheetDialog {
private Context context;
private OptAdapter optAdapter;
private OnActionListener onActionListener;
private CallBack callBack;
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
public interface CallBack{
void onCLick(int Type);
}
public RoomOperationDialog(@NonNull Context context) {
super(context, R.style.ErbanBottomSheetDialogDimFalse);
@@ -114,30 +122,30 @@ public class RoomOperationDialog extends BottomSheetDialog {
true));
rvOPtList.setLayoutManager(new FullyGridLayoutManager(getContext(), 5));
optAdapter = new OptAdapter(context, null);
addRoomAlbum(optAdapter);
addDatingAction(optAdapter);
// addPKAction(optAdapter);
// addRoomPKAction(optAdapter);
addSingleRoomPKAction(optAdapter);
addSendBroadcastAction(optAdapter);
// addInviteFansOptAdapter();
addVipSendBroadcastAction(optAdapter);
// addRedPacketAction(optAdapter);
addRoomSettingAction(optAdapter);
addGiftEffectAction(optAdapter);
// addOpenOrClosePublicScreenAction(optAdapter);
// addRedPackageSwitch();
addCleanScreenAction(optAdapter);
// addRoomLimit(optAdapter);
// addGiftValueAction(optAdapter);
addSuperAdminAction(optAdapter);
addShieldReportAction(optAdapter);
addRoomTypeSwitchAction(optAdapter);
addRoomAlbum(optAdapter); //房间相册
addDatingAction(optAdapter); // 相亲 模式
addPKAction(optAdapter); //pk PK 模式-同房间
addRoomPKAction(optAdapter); //跨房PK
addSingleRoomPKAction(optAdapter); //个播PK
// addSendBroadcastAction(optAdapter); //发布广播
// addInviteFansOptAdapter(); //邀请粉丝
addVipSendBroadcastAction(optAdapter); //小喇叭
// addRedPacketAction(optAdapter); //红包
addRoomSettingAction(optAdapter); //房间设置
addGiftEffectAction(optAdapter); //礼物特效
// addOpenOrClosePublicScreenAction(optAdapter); //公屏开关
// addRedPackageSwitch(); // 开关红包
addCleanScreenAction(optAdapter); //清空公屏
// addRoomLimit(optAdapter); //添加房间限制
// addGiftValueAction(optAdapter); //礼物值
addSuperAdminAction(optAdapter); //超管管理
addShieldReportAction(optAdapter); //举报屏蔽
addRoomTypeSwitchAction(optAdapter); //房间类型切换
rvOPtList.setAdapter(optAdapter);
}
/**
* PK 模式
* PK 模式-同房间
*
* @param optAdapter
*/
@@ -162,6 +170,9 @@ public class RoomOperationDialog extends BottomSheetDialog {
int icon = AvRoomDataManager.get().isOpenPKMode() ?
R.drawable.ic_room_opt_op_pk :
R.drawable.ic_room_opt_in_pk;
optAdapter.addData(new OptAction(icon, str, () -> {
if (AvRoomDataManager.get().isDatingMode()) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_01));
@@ -178,7 +189,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 跨房PK
* 跨房PK
*
* @param optAdapter
*/
@@ -202,6 +213,9 @@ public class RoomOperationDialog extends BottomSheetDialog {
int icon = AvRoomDataManager.get().isOpenAnotherPKMode() ?
R.drawable.ic_room_opt_another_pk_in :
R.drawable.ic_room_opt_another_pk_open;
optAdapter.addData(new OptAction(icon, str, () -> {
if (AvRoomDataManager.get().isDatingMode()) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_05));
@@ -222,7 +236,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 跨房PK
* 个播PK
*
* @param optAdapter
*/
@@ -252,6 +266,9 @@ public class RoomOperationDialog extends BottomSheetDialog {
R.drawable.ic_room_opt_single_pk_open :
R.drawable.ic_room_opt_single_pk_in;
String finalStr = str;
optAdapter.addData(new OptAction(icon, str, () -> {
if (pkBean != null && ResUtil.getString(R.string.avroom_dialog_roomoperationdialog_011).equals(finalStr)) {
SingleRoomPKModel.INSTANCE
@@ -271,6 +288,8 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
}
//房间相册
private void addRoomAlbum(OptAdapter optAdapter) {
if (AvRoomDataManager.get().isHasRoomAlbum()) {
optAdapter.addData(new OptAction(R.drawable.ic_room_operation_album, ResUtil.getString(R.string.room_album), () -> {
@@ -335,7 +354,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 相亲 模式
* 红包
*
* @param optAdapter
*/
@@ -584,7 +603,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 超管管理
* 发布广播
*/
private void addSendBroadcastAction(OptAdapter optAdapter) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
@@ -609,7 +628,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 超管管理
* 小喇叭
*/
private void addVipSendBroadcastAction(OptAdapter optAdapter) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;

View File

@@ -5,7 +5,7 @@ import android.view.WindowManager
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.RoomTeamPkDialogBinding
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.app.ui.widget.dialog.CommonTipDialog
@@ -28,7 +28,7 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.util.Locale
class RoomTeamPkDialog : BaseDialog<RoomTeamPkDialogBinding>() {
class RoomTeamPkDialog : BaseDialogFragment<RoomTeamPkDialogBinding>() {
private var compositeDisposable: CompositeDisposable? = null

View File

@@ -9,7 +9,7 @@ import android.view.WindowManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.avroom.adapter.SendBroadcastAdapter
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSendBroadcastBinding
import com.chwl.app.ui.utils.RVDelegate
import com.chwl.app.utils.SpannableBuilder
@@ -24,7 +24,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class SendBroadcastDialog : BaseDialog<DialogSendBroadcastBinding>() {
class SendBroadcastDialog : BaseDialogFragment<DialogSendBroadcastBinding>() {
private lateinit var rvDelegate: RVDelegate<String>
private lateinit var adapter: SendBroadcastAdapter

View File

@@ -2,11 +2,11 @@ package com.chwl.app.avroom.dialog
import android.annotation.SuppressLint
import android.view.WindowManager
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomTipBinding
class SingleRoomTipDialog :
BaseDialog<DialogSingleRoomTipBinding>() {
BaseDialogFragment<DialogSingleRoomTipBinding>() {
@SuppressLint("ClickableViewAccessibility")
override fun init() {
binding?.root?.setOnClickListener {

View File

@@ -22,9 +22,7 @@ import android.widget.RelativeLayout
import android.widget.TextView
import androidx.annotation.CallSuper
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.lifecycleScope
@@ -48,7 +46,6 @@ import com.chwl.app.avroom.dialog.RoomGameListDialog
import com.chwl.app.avroom.dialog.RoomGameplayDialog
import com.chwl.app.avroom.dialog.RoomOperationDialog
import com.chwl.app.avroom.presenter.BaseRoomPresenter
import com.chwl.app.avroom.public_chat.PublicChatRoomMessageWidget
import com.chwl.app.avroom.room_album.RoomAlbumModel
import com.chwl.app.avroom.view.IBaseRoomView
import com.chwl.app.avroom.widget.BottomView
@@ -60,16 +57,14 @@ import com.chwl.app.event.OpenRoomIntroEvent
import com.chwl.app.friend.view.SelectFriendActivity
import com.chwl.app.home.adapter.RoomActAdapter
import com.chwl.app.music.widget.MusicPlayerView
import com.chwl.app.public_chat.ui.message.HeadlineViewModel
import com.chwl.app.room_chat.activity.RoomMsgActivity
import com.chwl.app.ui.pay.ChargeActivity
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.ui.webview.DialogWebViewActivity
import com.chwl.app.ui.widget.ButtonItem
import com.chwl.app.ui.widget.GiftDialog
import com.chwl.app.ui.widget.GiftDialog.OnGiftDialogBtnClickListener
import com.chwl.app.ui.widget.GiftDialog.SenGiftCallback
import com.chwl.app.ui.widget.UserInfoDialog
import com.chwl.app.ui.widget.dialog.CommonTipDialog
import com.chwl.app.ui.widget.dynamicface.DynamicFaceDialog
import com.chwl.app.ui.widget.magicindicator.MagicIndicator
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil
@@ -78,13 +73,14 @@ import com.chwl.app.ui.widget.rollviewpager.RollPagerView
import com.chwl.app.ui.widget.rollviewpager.Util
import com.chwl.app.ui.widget.rollviewpager.hintview.ColorPointHintView
import com.chwl.app.utils.KeyBoardUtils
import com.chwl.app.vip.dialog.SelectPayTypeDialog
import com.chwl.core.Constants
import com.chwl.core.UriProvider
import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.RoomMicInfo
import com.chwl.core.gift.GiftModel
import com.chwl.core.gift.bean.GiftInfo
import com.chwl.core.gift.bean.GiftType
import com.chwl.core.gift.event.GiftComboEvent
import com.chwl.core.gift.event.RoomFreeGiftEvent
import com.chwl.core.helper.AtProxy
import com.chwl.core.home.bean.BannerInfo
@@ -98,6 +94,8 @@ import com.chwl.core.manager.RoomEvent
import com.chwl.core.mentoring_relationship.event.MentoringStopCountingEvent
import com.chwl.core.room.anotherroompk.ShowGiftDialogEvent
import com.chwl.core.room.anotherroompk.ShowUserInfoDialogEvent
import com.chwl.core.room.bean.RightBottomIconConfig
import com.chwl.core.room.bean.RoomIcon
import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.room.event.RoomAtEvent
import com.chwl.core.room.event.RoomClearScreenEvent
@@ -116,12 +114,18 @@ import com.chwl.core.support.room.RoomWidget
import com.chwl.core.user.UserModel
import com.chwl.core.user.bean.BaseInfo
import com.chwl.core.user.bean.UserInfo
import com.chwl.core.utils.net.BalanceNotEnoughExeption
import com.chwl.core.utils.LogUtils
import com.chwl.core.utils.net.VipLevelNotEnoughException
import com.chwl.library.common.util.LimitClickUtils
import com.chwl.library.net.rxnet.utils.RxNetWorkUtils
import com.chwl.library.rxbus.RxBus
import com.chwl.library.utils.*
import com.chwl.library.utils.JavaUtil
import com.chwl.library.utils.ListUtils
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.chwl.library.utils.UIUtils
import com.example.lib_utils.ktx.getString
import com.google.gson.Gson
import com.netease.nim.uikit.common.antispam.AntiSpamEvent
import com.netease.nimlib.sdk.StatusCode
import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder
@@ -132,7 +136,6 @@ import com.tbruyelle.rxpermissions2.RxPermissions
import com.trello.rxlifecycle3.android.FragmentEvent
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
@@ -153,12 +156,10 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
private var myUid: Long = 0
protected lateinit var messagePager: ViewPager2
protected lateinit var messageView: MessageView
protected var publicChatMessageWidget: PublicChatRoomMessageWidget? = null
protected lateinit var bottomView: BottomView
protected lateinit var inputLayout: RelativeLayout
protected lateinit var inputEdit: EditText
protected lateinit var inputSend: ImageView
protected lateinit var inputHeadlineSend: ImageView
protected lateinit var microView: MicroView
private var musicPlayerView: MusicPlayerView? = null
private var mVsMusicPlayer: ViewStub? = null
@@ -200,8 +201,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
// 房间小组件
private var widgets: HashMap<String, RoomWidget> = HashMap()
private val headlineViewModel by activityViewModels<HeadlineViewModel>()
@CallSuper
override fun onFindViews() {
initMessageView()
@@ -217,7 +216,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
false
}
inputSend = mView.findViewById(R.id.input_send)
inputHeadlineSend = mView.findViewById(R.id.input_headline_send)
microView = mView.findViewById(R.id.micro_view)
mVsMusicPlayer = mView.findViewById(R.id.vs_music_player)
messageView.setClickConsumer {
@@ -240,10 +238,9 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
protected open fun initMessageView() {
messagePager = mView.findViewById<ViewPager2>(R.id.message_pager)
messageView = MessageView(context)
publicChatMessageWidget = PublicChatRoomMessageWidget(requireContext())
val tabList: MutableList<String> = java.util.ArrayList(2)
tabList.add(getString(R.string.room))
tabList.add(getString(R.string.public_chat))
// tabList.add(getString(R.string.public_chat))
val messageIndicator = mView.findViewById<MagicIndicator>(R.id.message_indicator)
messagePager.offscreenPageLimit = tabList.size
messagePager.adapter = object : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
@@ -251,12 +248,8 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
parent: ViewGroup,
viewType: Int
): RecyclerView.ViewHolder {
val view = if (viewType == 0) {
messageView
} else {
publicChatMessageWidget
}
view?.layoutParams = ViewGroup.LayoutParams(
val view = messageView
view.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
@@ -310,7 +303,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
override fun onSetListener() {
bottomView.setMagicBtnEnable(true)
inputSend.setOnClickListener(this)
inputHeadlineSend.setOnClickListener(this)
inputLayout.setOnTouchListener { _: View?, _: MotionEvent? ->
inputEdit.clearFocus()
inputLayout.visibility = View.GONE
@@ -318,7 +310,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
false
}
messageView.setOnLongClickListener { _, account, name ->
showInputLayout()
if (atProxy == null) atProxy = AtProxy(inputEdit)
@@ -374,44 +365,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
//获取免费礼物详情
mvpPresenter?.queryFreeFlower()
initRoomAlbum()
initHeadline()
}
private fun initHeadline() {
headlineViewModel.loadingLiveData.observe(this) {
if (it) dialogManager?.showProgressDialog(context)
else dialogManager?.dismissDialog()
}
lifecycleScope.launch(Dispatchers.Main) {
headlineViewModel.sendHeadlineFlow.collect {
if (it.isSuccess) {
SingleToastUtil.showToast(R.string.sent_success)
inputEdit.setText("")
KeyBoardUtils.hideKeyBoard(activity, inputEdit)
} else {
if (it.code == BalanceNotEnoughExeption.code) {
showBalanceNotEnoughDialog()
} else {
SingleToastUtil.showToast(it.message)
}
}
}
}
headlineViewModel.getHeadlinePayMoneyIsNull()
}
private fun showBalanceNotEnoughDialog() {
val tipDialog = CommonTipDialog(context)
tipDialog.setTipMsg(ResUtil.getString(R.string.insufficient_balance_recharge_tips))
tipDialog.setOkText(getString(R.string.charge))
tipDialog.setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
ChargeActivity.start(context)
}
}
)
tipDialog.show()
}
@SuppressLint("CheckResult")
@@ -665,6 +618,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
bottomView.showHomePartyDownMicBottom()
}
bottomView.showInputOrIcon(isOnMic)
bottomView.updateGameEntrance()
// 更新聽筒消息
bottomView.setRemoteMuteOpen(!AudioEngineManager.get().isRemoteMute)
if (isOnMic) {
@@ -694,14 +648,14 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
@CallSuper
open fun updateMicBtn() {
//todo do 关麦开麦
val currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo
if (currentRoomInfo != null) {
if (AudioEngineManager.get().isAudienceRole) {
bottomView.setMicBtnEnable(false)
bottomView.setMicBtnOpen(false)
} else {
val roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByAccount(myUid.toString())
val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(myUid.toString())
if (roomQueueInfo?.mChatRoomMember != null
&& myUid.toString() == roomQueueInfo.mChatRoomMember.account
&& roomQueueInfo.mRoomMicInfo?.isMicMute == true
@@ -792,21 +746,65 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
override fun onClick(v: View) {
if (mClickLimit.checkForTime(500)) return
when (v.id) {
R.id.iv_config_entrance -> {
val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo ?: return
val configInfo = AvRoomDataManager.get().rightBottomIconConfig ?: return
if (configInfo.skipType == 1) {
playConfigWeb(configInfo.skipUrl)
} else if (configInfo.skipType == 2) {
playConfigBaishunGame(configInfo)
}
}
R.id.iv_game -> {
RoomGameListDialog().show(childFragmentManager, "GAME_LIST")
val dialog = RoomGameListDialog();
dialog.listener = object : RoomGameplayDialog.GameplayDialogListener {
override fun onShowBaiShunGame(url: String, config: BaiShunGameConfig) {
(activity as? AVRoomActivity)?.showBaiShunGame(url, config)
}
}
dialog.show(childFragmentManager, "GAME_LIST")
}
R.id.input_send -> {
sendMsg()
}
R.id.input_headline_send -> {
sendHeadline()
}
R.id.layout_room_rank -> {
DialogWebViewActivity.start(mContext, UriProvider.getRoomRanking())
}
}
}
private fun playConfigWeb(url: String) {
CommonWebViewActivity.start(mContext, url)
}
private fun playConfigBaishunGame(configInfo: RightBottomIconConfig) {
val roomIcon: RoomIcon = RoomIcon(
skipContent = configInfo.skipUrl,
skipType = 3,
showType = 1,
code = "BAISHUN",
ruleValue = configInfo.reserve)
try {
val url = roomIcon.skipContent
val ruleValue = Gson().fromJson<RoomIcon.RuleValueBean>(
roomIcon.ruleValue,
RoomIcon.RuleValueBean::class.java
)
val config = Gson().fromJson<BaiShunGameConfig>(
ruleValue.RESERVE,
BaiShunGameConfig::class.java
)
if (config != null && url != null) {
config.reloadDynamicParams()
(activity as? AVRoomActivity)?.showBaiShunGame(url, config)
} else {
SingleToastUtil.showToast(R.string.manager_trtc_trtcengineadapter_042)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun sendMsg() {
val message = inputEdit.text.toString().trim()
if (isPublicMessageTab()) {
@@ -816,41 +814,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
}
private fun sendHeadline() {
val message = inputEdit.text.toString().trim()
if (TextUtils.isEmpty(message)) {
SingleToastUtil.showToast(ResUtil.getString(R.string.avroom_fragment_baseroomfragment_08))
return
}
if (message.length > 100) {
toast(R.string.headline_input_length_limit_tips)
return
}
val money = headlineViewModel.headlinePayMoneyLiveData.value
if (money != null) {
showHeadlinePayDialog(money, message)
} else {
SingleToastUtil.showToast(R.string.ui_setting_modifypwdactivity_01)
headlineViewModel.getHeadlinePayMoney()
}
}
private fun showHeadlinePayDialog(money: Long, message: String) {
KeyBoardUtils.hideKeyBoard(activity, inputEdit)
SelectPayTypeDialog.newInstance(
money.toString(),
money,
false
).apply {
setOnDiamondChargeClick {
headlineViewModel.sendHeadline(message)
}
setOnChargeClick {
ChargeActivity.start(context)
}
}.show(context)
}
@SuppressLint("CheckResult")
fun sendMsg(msg: String) {
if (!AuthModel.get().isImLogin) {
@@ -881,7 +844,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
return
}
mvpPresenter?.sendPublicChatTextMessage(message)
publicChatMessageWidget?.getMessageView()?.setNeedAutoScroll(true) // 發送後自動滾動公屏列表
inputEdit.setText("")
}
@@ -907,6 +869,9 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
for (i in micMemberInfos.indices) {
targetUids.add(micMemberInfos[i].account.toLong())
}
EventBus.getDefault().post(GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_BEGIN))
GiftModel.get()
.sendRoomGift(
giftInfo.giftId,
@@ -928,11 +893,18 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
dialogManager.showOkDialog(message)
}
}
.subscribe { _, throwable ->
.subscribe { gift, throwable ->
if (throwable != null) {
toast(throwable.message)
callback.onFail()
EventBus.getDefault().post(GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_CANCEL))
} else {
if (giftInfo.giftType == GiftType.GIFT_TYPE_NORMAL || giftInfo.giftType == GiftType.GIFT_TYPE_SUPER_LUCKY || giftInfo.giftType == GiftType.GIFT_TYPE_LUCKY_24) {
giftDialog?.hide()
val giftComboEvent = GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_END)
giftComboEvent.giftNumber = gift.data.giftNum
EventBus.getDefault().post(giftComboEvent)
}
callback.onSuccess()
}
}
@@ -1197,7 +1169,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
override fun onSendPublicChatMsgSuccess(msg: ChatRoomMessage) {
publicChatMessageWidget?.getMessageView()?.addMessages(msg)
inputEdit.setText("")
KeyBoardUtils.hideKeyBoard(activity, inputEdit)
}
@@ -1318,6 +1289,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
giftDialog?.setOnDismissListener { giftDialog = null }
}
if (giftDialog?.isShowing != true && !requireActivity().isFinishing) {
EventBus.getDefault().post(GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_POINT))
giftDialog?.show()
}
}
@@ -1366,8 +1338,8 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
open inner class BaseRoomBottomViewWrapper : BottomViewListenerWrapper() {
@SuppressLint("CheckResult")
override fun onOpenMicBtnClick() {
val roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString())
//todo do 关麦开麦
val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString())
if (roomQueueInfo?.mRoomMicInfo == null) return
//先判斷麥上是否是開麥的
if (!roomQueueInfo.mRoomMicInfo.isMicMute && !AudioEngineManager.get().isAudienceRole) {
@@ -1434,14 +1406,19 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
RoomMsgActivity.start(mContext)
}
override fun onRoomGameplayClick() {
val dialog = RoomGameplayDialog()
dialog.listener = object : RoomGameplayDialog.GameplayDialogListener {
override fun onShowBaiShunGame(url: String, config: BaiShunGameConfig) {
(activity as? AVRoomActivity)?.showBaiShunGame(url, config)
override fun onRoomGameplayClick(isOnlyPK: Boolean) {
if (isOnlyPK) {
val dialog = RoomGameplayDialog()
dialog.isOnlyPK = isOnlyPK
dialog.listener = object : RoomGameplayDialog.GameplayDialogListener {
override fun onShowBaiShunGame(url: String, config: BaiShunGameConfig) {
(activity as? AVRoomActivity)?.showBaiShunGame(url, config)
}
}
dialog.show(childFragmentManager, "ROOM_GAME_PLAY")
} else {
RoomGameListDialog().show(childFragmentManager, "GAME_LIST")
}
dialog.show(childFragmentManager, "ROOM_GAME_PLAY")
}
}
@@ -1484,9 +1461,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
open fun initWidget() {
publicChatMessageWidget?.let {
registerWidget(PublicChatRoomMessageWidget::class.java.simpleName, it)
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -1504,7 +1478,6 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
* 打开公屏输入
*/
fun openMessageInput(text: String?) {
inputHeadlineSend.isVisible = isPublicMessageTab()
inputLayout.visibility = View.VISIBLE
if (text != null) {
inputEdit.setText(text)
@@ -1522,4 +1495,24 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
protected open fun onInitMusicPlayerView(view: MusicPlayerView) {
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onGiftComboEvent(event: GiftComboEvent) {
when (event.action) {
GiftComboEvent.Action.ACT_GIFT_START-> {
giftDialog?.sendGift()
}
GiftComboEvent.Action.ACT_GIFT_SHOW-> {
giftDialog?.show()
}
else -> {}
}
}
}

View File

@@ -100,9 +100,6 @@ class GameRoomFragment : BaseRoomFragment<IGameRoomView?, GameRoomPresenter?>(),
messageView.messageListView?.let {
setMessagePagerAutoHeight(it)
}
publicChatMessageWidget?.getMessageView()?.messageListView?.let {
setMessagePagerAutoHeight(it)
}
}
override fun onClick(v: View) {

View File

@@ -6,7 +6,10 @@ import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewStub;
@@ -19,9 +22,26 @@ import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import com.chwl.app.avroom.activity.RoomTitleEditActivity;
import com.chwl.app.avroom.dialog.RoomNotifyLuckGiftDialog;
import com.chwl.app.databinding.LayoutRoomNotifyLuckyGiftTipBinding;
import com.chwl.app.utils.GiftAnimUtil;
import com.chwl.app.utils.NumberUtils;
import com.chwl.app.utils.RoomNotifyManager;
import com.chwl.app.utils.WeakPool;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.gift.bean.CpMsgBean;
import com.chwl.core.gift.bean.LuckyGiftMsgAllBean;
import com.chwl.core.gift.bean.LuckyGiftMsgSelfBean;
import com.chwl.core.gift.bean.MsgSuperLuckyGift;
import com.chwl.core.gift.bean.RoomNotifyDialogBean;
import com.chwl.core.utils.ComboUtil;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.BonsellaJoinAttackButtonView;
import com.chwl.app.ui.widget.GiftDialog;
import com.chwl.app.ui.widget.UserInfoDialog;
import com.chwl.core.gift.event.GiftComboEvent;
import com.chwl.core.gift.toolbox.GiftToolbox;
import com.chwl.core.utils.LogUtils;
import com.chwl.library.utils.JavaUtil;
import com.example.lib_utils.UiUtils;
import com.netease.nim.uikit.common.util.string.StringUtil;
@@ -66,6 +86,7 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.reflect.Field;
import java.util.ArrayList;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
@@ -101,6 +122,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
//收藏房间
private String FOLLOW_ROOM_TYPE = "";
public static HomePartyFragment newInstance() {
HomePartyFragment homePartyFragment = new HomePartyFragment();
Bundle bundle = new Bundle();
@@ -243,7 +265,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
case RoomEvent.ROOM_INFO_UPDATE:
updateView(AvRoomDataManager.get().mCurrentRoomInfo);
break;
case RoomEvent.RECEIVE_NORMALE_GIFT:
case RoomEvent.RECEIVE_NORMALE_GIFT://普通
onReceiveGiftMsg(roomEvent.getGiftReceiveInfo());
break;
case RoomEvent.RECEIVE_MUTLT_NORMALEI_GIFT://普通多人
@@ -267,12 +289,20 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
case RoomEvent.FANS_TEAM_JOIN:
onReceiveFansTeamJoinMsg(roomEvent.getChatRoomMessage());
break;
case RoomEvent.MSG_SUPER_LUCKY_GIFT:
onLuckyGiftMsg(roomEvent);
break;
case RoomEvent.MSG_CP_ABOUT:
onCpAboutMsg(roomEvent);
break;
default:
break;
}
});
}
/**
* 获取礼物飘屏是否展示
*
@@ -491,10 +521,16 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
@Override
public void onDestroy() {
luckyGiftTipPool.clear();
handler.removeCallbacksAndMessages(null);
RoomNotifyManager.INSTANCE.clear();
if (giftView != null) {
giftView.release();
}
EventBus.getDefault().unregister(this);
gameMainBinding.giftComboBtn.cancel();
super.onDestroy();
}
@@ -508,10 +544,10 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
updateOnlineNumberView(onlineNumber);
}
/**
* 普通多人
*
* @param giftMultiReceiverInfo
*/
private void onReceiveMultiGiftMsg(GiftMultiReceiverInfo giftMultiReceiverInfo) {
if (giftMultiReceiverInfo == null || !isResumed()) return;
@@ -519,12 +555,12 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
giftView = (GiftV2View) mVsGift2View.inflate();
}
giftView.onReceiveGiftToMultiMsg(giftMultiReceiverInfo);
giftMultiReceiverInfo.isMulti = true;
gameMainBinding.giftComboLayout.onRoomCustomMsg(giftMultiReceiverInfo);
}
/**
* 普通全麦
*
* @param multiGiftReceiveInfo
*/
private void onReceiveAllMicGiftMsg(MultiGiftReceiveInfo multiGiftReceiveInfo) {
if (multiGiftReceiveInfo == null || !isResumed()) return;
@@ -532,14 +568,20 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
giftView = (GiftV2View) mVsGift2View.inflate();
}
giftView.onReceiveMultiGiftMsg(multiGiftReceiveInfo);
gameMainBinding.giftComboLayout.onRoomCustomMsg(GiftToolbox.transformToGiftMultiReceiverInfo(multiGiftReceiveInfo));
}
/**
* 普通
*/
private void onReceiveGiftMsg(GiftReceiveInfo giftReceiveInfo) {
if (giftReceiveInfo == null || !isResumed()) return;
if (giftView == null) {
giftView = (GiftV2View) mVsGift2View.inflate();
}
giftView.onReceiveGiftMsg(giftReceiveInfo);
gameMainBinding.giftComboLayout.onRoomCustomMsg(GiftToolbox.transformToGiftMultiReceiverInfo(giftReceiveInfo));
}
private void onReceiveMagicMsg(MagicReceivedInfo magicReceivedInfo) {
@@ -611,4 +653,143 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
dialogFragment.show(requireActivity().getSupportFragmentManager(), "roomTitle");
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGiftComboEvent(GiftComboEvent event) {
if (event.getAction() == GiftComboEvent.Action.ACT_GIFT_BEGIN) {
if (gameMainBinding.giftComboBtn.isInCombo()){
gameMainBinding.giftComboBtn.waitStart();
}
} else if (event.getAction() == GiftComboEvent.Action.ACT_GIFT_END) {
showComboBtn(event.getGiftNumber());
}else if (event.getAction() == GiftComboEvent.Action.ACT_GIFT_CANCEL) {
if (gameMainBinding.giftComboBtn.isInCombo()) {
gameMainBinding.giftComboBtn.cancel();
}
}else if (event.getAction() == GiftComboEvent.Action.ACT_GIFT_POINT) {
ComboUtil.INSTANCE.setPoint(gameMainBinding.giftComboBtn);
}
}
private void showComboBtn(int number) {
if (gameMainBinding.giftComboBtn.getOnGiftComboEndListener() == null) {
gameMainBinding.giftComboBtn.setOnClickListener(v -> {
ComboUtil.INSTANCE.setPoint(gameMainBinding.giftComboBtn);
EventBus.getDefault().post(new GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_START));
gameMainBinding.giftComboBtn.onBtnDown();
});
gameMainBinding.giftComboBtn.setOnGiftComboEndListener(new BonsellaJoinAttackButtonView.OnGiftComboEndListener() {
@Override
public void onGiftComboEnd() {
gameMainBinding.giftComboBtn.showView(false);
EventBus.getDefault().post(new GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_SHOW));
}
});
}
gameMainBinding.giftComboBtn.showView(true);
gameMainBinding.giftComboBtn.start();
gameMainBinding.giftComboBtn.updateNumber(number);
}
/**
* 幸运礼物 飘屏 跟 圆球提示
*/
private void onLuckyGiftMsg(RoomEvent roomEvent) {
MsgSuperLuckyGift msgSuperLuckyGift = roomEvent.getMsgSuperLuckyGift();
if (msgSuperLuckyGift != null) {
if (msgSuperLuckyGift.luckyGiftMsgAllBean != null) {
showLuckyGiftDlg(msgSuperLuckyGift.luckyGiftMsgAllBean);
}
if (msgSuperLuckyGift.luckyGiftMsgSelfBean != null) {
showLuckyGiftDlgNotify(msgSuperLuckyGift.luckyGiftMsgSelfBean);
}
}
}
private Handler handler = new Handler(Looper.getMainLooper());
private WeakPool<View> luckyGiftTipPool = new WeakPool<>(3);
private void showLuckyGiftDlgNotify(LuckyGiftMsgSelfBean luckyGiftMsgBean) {
if (luckyGiftMsgBean == null) return;
if (luckyGiftMsgBean.getUid() != AuthModel.get().getCurrentUid()) return;
if (luckyGiftMsgBean.getRoomId() != AvRoomDataManager.get().getRoomId()) return;
if (luckyGiftMsgBean.getRoomUid() != AvRoomDataManager.get().getRoomUid()) return;
LogUtils.i(" showLuckyGiftDlgNotify = start");
View root = luckyGiftTipPool.acquire(() -> {
return LayoutInflater.from(gameMainBinding.flLuckyGiftNotifyLayout.getContext()).inflate(R.layout.layout_room_notify_lucky_gift_tip, gameMainBinding.flLuckyGiftNotifyLayout, false);
});
LayoutRoomNotifyLuckyGiftTipBinding binding = LayoutRoomNotifyLuckyGiftTipBinding.bind(root);
binding.coinNum.setText(NumberUtils.format(luckyGiftMsgBean.getCoins()));
binding.winNum.setText(java.lang.String.valueOf(luckyGiftMsgBean.getTimes()));
if (luckyGiftMsgBean.getLevel() > 1) {
binding.rootView.setBackgroundResource(R.drawable.bg_lucky_gift_tip_2);
}
root.setAlpha(0f);
root.setScaleX(0f);
root.setScaleY(0f);
gameMainBinding.flLuckyGiftNotifyLayout.addView(root);
GiftAnimUtil.showAnimation(root);
// GiftAnimUtil.expandAnimation(root);
handler.postDelayed(() -> {
try {
root.animate()
.alpha(0f)
.setDuration(500)
.withEndAction(() -> {
gameMainBinding.flLuckyGiftNotifyLayout.post(new Runnable() {
@Override
public void run() {
root.clearAnimation();
gameMainBinding.flLuckyGiftNotifyLayout.removeView(root);
luckyGiftTipPool.release(root);
}
});
})
.start();
} catch (Exception e) {
}
}, 2300);
}
private void showLuckyGiftDlg(LuckyGiftMsgAllBean data) {
//todo do 校验数据是否异常
RoomNotifyManager.INSTANCE.addDialog(new RoomNotifyDialogBean(
CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE,
CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM,
data
));
}
/**
* cp 礼物
*/
private void onCpAboutMsg(RoomEvent roomEvent) {
//todo do 校验数据是否异常
CpMsgBean cpMsgBean = roomEvent.getCpMsgBean();
if (cpMsgBean != null) {
RoomNotifyManager.INSTANCE.addDialog(new RoomNotifyDialogBean(
CustomAttachment.CP_FIRST,
cpMsgBean.getSecond(),
cpMsgBean
));
}
}
}

View File

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
@@ -14,8 +15,15 @@ import com.chwl.app.avroom.headline.RoomHeadlineWidget;
import com.chwl.app.avroom.online.RoomOnlineWidget;
import com.chwl.app.avroom.rank.RoomRankNumberWidget;
import com.chwl.app.music.widget.MusicPlayerView;
import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.app.ui.webview.DialogWebViewActivity;
import com.chwl.core.room.bean.RightBottomIconConfig;
import com.chwl.core.room.bean.RoomIcon;
import com.chwl.core.room.core.RoomDataService;
import com.chwl.core.room.pk.event.PKDataUpdateEvent;
import com.chwl.core.support.room.AudioRoomContext;
import com.chwl.core.support.room.RoomAbility;
import com.chwl.core.support.room.RoomContext;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.trello.rxlifecycle3.android.FragmentEvent;
import com.chwl.app.R;
@@ -79,6 +87,7 @@ import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
/**
* 轰趴房间
@@ -101,6 +110,8 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
private PKMicQueueDialog pkMicQueueDialog;
private Disposable roomPkOrderDisposable;
private boolean hasBaishunGames;
public static HomePartyRoomFragment newInstance() {
HomePartyRoomFragment roomFragment = new HomePartyRoomFragment();
Bundle bundle = new Bundle();
@@ -149,6 +160,34 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
updateQueuingMicBtn();
updatePkScoreBoard();
initRoomPkOrder(AvRoomDataManager.get().showPkBeginTime, AvRoomDataManager.get().pkBeginTime);
requestData();
}
private void requestData() {
RoomContext roomContext = AudioRoomContext.Companion.get();
if (roomContext != null) {
RoomDataService dataService = roomContext.findAbility(RoomDataService.class.getSimpleName());
if (dataService != null) {
String cacheKey = "gameplay_list#" + hashCode();
Disposable disposable = AvRoomModel.get().getRoomGamePlayList().doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
hasBaishunGames = false;
updateConfigButtonArea();
}
}).subscribe(new Consumer<List<RoomIcon>>() {
@Override
public void accept(List<RoomIcon> roomIcons) throws Exception {
if (dataService != null) {
dataService.putData(cacheKey, roomIcons);
}
hasBaishunGames = roomIcons.size() > 0;
updateConfigButtonArea();
}
});
}
}
}
@Override
@@ -197,6 +236,7 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
gameBinding.setRoomInfo(AvRoomDataManager.get().mCurrentRoomInfo);
updateQueuingMicBtn();
updatePkScoreBoard();
updateConfigButtonArea();
getMvpPresenter().updateLeaveMode();
break;
case RoomEvent.ENTER_ROOM:
@@ -470,11 +510,7 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
updateMicroView();
changeModelShowView();
refreshDatingNextStatus();
if (AvRoomDataManager.get().isDatingMode()) {
gameBinding.ivGame.setVisibility(View.GONE);
} else {
gameBinding.ivGame.setVisibility(View.VISIBLE);
}
// updateConfigButtonArea();
}
protected void updateMicroView(){
@@ -502,6 +538,30 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
refreshDatingNextStatus();
}
public void updateConfigButtonArea() {
RightBottomIconConfig configModel = AvRoomDataManager.get().rightBottomIconConfig;
if (configModel == null) {
gameBinding.ivConfigEntrance.setVisibility(View.GONE);
} else {
if (configModel.getIcon1Url() == null) {
gameBinding.ivConfigEntrance.setVisibility(View.GONE);
} else {
ImageLoadUtils.loadAvatar(configModel.getIcon1Url(), gameBinding.ivConfigEntrance);
gameBinding.ivConfigEntrance.setVisibility(View.VISIBLE);
}
if (configModel.getIcon2Url() != null) {
ImageLoadUtils.loadAvatar(configModel.getIcon2Url(), gameBinding.ivGame);
}
}
if (hasBaishunGames) {
gameBinding.ivGame.setVisibility(View.VISIBLE);
}else {
gameBinding.ivGame.setVisibility(View.GONE);
}
}
private void updateQueuingMicBtn() {
if (AvRoomDataManager.get().mCurrentRoomInfo != null) {
bottomView.updateQueuingMicButton();
@@ -564,7 +624,6 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
super.onDestroy();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDatingSelectUserEvent(DatingSelectUserEvent event) {
if (getMvpPresenter() != null) {

View File

@@ -26,6 +26,7 @@ import com.chwl.app.fansteam.FansTeamJoinActivity
import com.chwl.app.fansteam.FansTeamJoinedActivity
import com.chwl.app.fansteam.FansTeamViewModel
import com.chwl.app.music.widget.MusicPlayerView
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.ui.webview.DialogWebViewActivity
import com.chwl.core.UriProvider
@@ -36,6 +37,10 @@ import com.chwl.core.im.custom.bean.RequestUpmicAttachment
import com.chwl.core.im.custom.bean.RoomPKAttachment
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.core.manager.RoomEvent
import com.chwl.core.room.core.RoomDataService
import com.chwl.core.room.model.AvRoomModel
import com.chwl.core.support.room.AudioRoomContext.Companion.get
import com.chwl.core.support.room.RoomAbility
import com.chwl.core.user.bean.UserInfo
import com.chwl.library.base.factory.CreatePresenter
import com.netease.nim.uikit.common.util.sys.ScreenUtil
@@ -63,6 +68,8 @@ class SingleRoomFragment : BaseRoomFragment<ISingleRoomView?, SingleRoomPresente
private lateinit var gameBinding: FragmentSingleRoomBinding
private lateinit var upMicDialog: RequestUpMicDialog
private var hasBaishunGames = false
private val fansTeamViewModel: FansTeamViewModel by viewModels()
override fun getRootLayoutId(): Int {
return R.layout.fragment_single_room

View File

@@ -93,8 +93,8 @@ class RoomHeadlineWidget : FrameLayoutRoomWidget {
private fun requestCurrentHeadline() {
safeLaunch {
val data = PublicChatModel.getCurrentHeadline()
updateHeadline(data)
// val data = PublicChatModel.getCurrentHeadline()
// updateHeadline(data)
}
}

View File

@@ -1,884 +0,0 @@
package com.chwl.app.avroom.public_chat;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import com.chwl.app.R;
import com.chwl.app.UIHelper;
import com.chwl.app.avroom.activity.AVRoomActivity;
import com.chwl.app.avroom.dialog.RoomTeamPKResultDialog;
import com.chwl.app.avroom.widget.OnMsgLongClickListener;
import com.chwl.app.avroom.widget.TemplateMessageAdapter;
import com.chwl.app.common.widget.CustomImageSpan;
import com.chwl.app.common.widget.OriginalDrawStatusClickSpan;
import com.chwl.app.photo.BigPhotoActivity;
import com.chwl.app.photo.PagerOption;
import com.chwl.app.public_chat.core.viewholder.ChatRoomMessageViewHolderThumbBase;
import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.DividerItemDecoration;
import com.chwl.app.ui.widget.MyItemAnimator;
import com.chwl.app.ui.widget.RecyclerViewNoViewpagerScroll;
import com.chwl.app.ui.widget.TextSpannableBuilder;
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil;
import com.chwl.app.utils.ObjectTypeHelper;
import com.chwl.app.utils.RegexUtil;
import com.chwl.core.DemoCache;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.bean.attachmsg.RoomQueueMsgAttachment;
import com.chwl.core.decoration.car.bean.CarInfo;
import com.chwl.core.home.event.FollowRoomEvent;
import com.chwl.core.home.model.CollectionRoomModel;
import com.chwl.core.im.custom.bean.CustomAttachment;
import com.chwl.core.im.custom.bean.HeadlineChangedAttachment;
import com.chwl.core.im.custom.bean.MonsterHuntingResultAttachment;
import com.chwl.core.im.custom.bean.MonsterStatusAttachment;
import com.chwl.core.im.custom.bean.RoomBoxPrizeAttachment;
import com.chwl.core.im.custom.bean.RoomFollowOwnerAttachment2;
import com.chwl.core.im.custom.bean.RoomTipAttachment;
import com.chwl.core.im.custom.bean.TarotAttachment;
import com.chwl.core.level.UserLevelResourceType;
import com.chwl.core.manager.AvRoomDataManager;
import com.chwl.core.monsterhunting.bean.MonsterDataBean;
import com.chwl.core.monsterhunting.bean.MonsterHuntingResult;
import com.chwl.core.noble.NobleUtil;
import com.chwl.core.praise.PraiseModel;
import com.chwl.core.public_chat_hall.bean.HeadlineBean;
import com.chwl.core.room.bean.RoomInfo;
import com.chwl.core.room.pk.attachment.RoomPkAttachment;
import com.chwl.core.user.bean.UserInfo;
import com.chwl.core.utils.ExtensionUtil;
import com.chwl.library.common.util.Utils;
import com.chwl.library.utils.JavaUtil;
import com.chwl.library.utils.ListUtils;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
import com.chwl.library.utils.SizeUtils;
import com.example.lib_utils.UiUtils;
import com.example.lib_utils.spannable.SpannableTextBuilder;
import com.netease.nim.uikit.business.session.emoji.MoonUtil;
import com.netease.nim.uikit.common.util.media.ImageUtil;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessageExtension;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomNotificationAttachment;
import com.netease.nimlib.sdk.msg.attachment.ImageAttachment;
import com.netease.nimlib.sdk.msg.attachment.MsgAttachment;
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum;
import com.netease.nimlib.sdk.msg.constant.NotificationType;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.reactivex.Single;
import io.reactivex.functions.Consumer;
import kotlin.jvm.functions.Function1;
/**
* 直播間消息界面
*
* @author xiaoyu
*/
public class PublicChatMessageView extends FrameLayout {
private static final String TAG = "PublicChatMessageView";
private final static int MAX_MESSAGE_SIZE = 100;//公屏最多展示條數
private final static int BLOCK_MAX_MESSAGE_SIZE = MAX_MESSAGE_SIZE * 3 / 2;//在查看消息停住的時候 最多消息條數.
private final List<ChatRoomMessage> atMessages = new ArrayList<>();
private final List<ChatRoomMessage> chatRoomMessages = new LinkedList<>();
private RecyclerView messageListView;
private TextView tvBottomTip;
private TextView tvAtTip;
private MessageAdapter mMessageAdapter;
private LinearLayoutManager layoutManger;
private int paddingWidth;
private int paddingHeight;
private int whiteColor;
private int greyColor;
private int roomTipColor;
private int badgeWidth;
private int badgeHeight;
private int expLevelHeight;
private int defTextSize = 12;
private volatile boolean needAutoScroll = true;//是否自動滾動到底部
private Consumer<String> clickConsumer;
private OnClick onClick;
private OnMsgLongClickListener onLongClickListener;
private TemplateMessageAdapter templateMessageAdapter;
public PublicChatMessageView(Context context) {
this(context, null);
}
public PublicChatMessageView(Context context, AttributeSet attr) {
this(context, attr, 0);
}
public PublicChatMessageView(Context context, AttributeSet attr, int i) {
super(context, attr, i);
init(context);
}
public void setOnLongClickListener(OnMsgLongClickListener onLongClickListener) {
this.onLongClickListener = onLongClickListener;
}
public void setClickConsumer(Consumer<String> clickConsumer) {
this.clickConsumer = clickConsumer;
}
public void setOnClick(OnClick onClick) {
this.onClick = onClick;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
}
@SuppressLint("ClickableViewAccessibility")
private void init(Context context) {
whiteColor = ContextCompat.getColor(context, R.color.white);
greyColor = ContextCompat.getColor(context, R.color.white_transparent_50);
roomTipColor = ContextCompat.getColor(context, R.color.color_FEE057);
paddingWidth = Utils.dip2px(context, 11);
paddingHeight = Utils.dip2px(context, 6);
badgeWidth = Utils.dip2px(context, 15);
badgeHeight = Utils.dip2px(context, 15);
//經驗等級圖片後臺已經更換尺寸了公屏同步下尺寸是36:18
expLevelHeight = Utils.dip2px(context, 18);
// 內容區域
layoutManger = new LinearLayoutManager(context, RecyclerView.VERTICAL, false);
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
messageListView = new RecyclerViewNoViewpagerScroll(context);
messageListView.setLayoutParams(params);
messageListView.setFadingEdgeLength(60);
messageListView.setVerticalFadingEdgeEnabled(true);
messageListView.setOverScrollMode(OVER_SCROLL_NEVER);
messageListView.setHorizontalScrollBarEnabled(false);
addView(messageListView);
messageListView.setLayoutManager(layoutManger);
messageListView.addItemDecoration(new DividerItemDecoration(context, layoutManger.getOrientation(), 16, R.color.transparent));
mMessageAdapter = new MessageAdapter(getContext());
mMessageAdapter.setData(chatRoomMessages);
messageListView.setAdapter(mMessageAdapter);
messageListView.setItemAnimator(new MyItemAnimator());
messageListView.getItemAnimator().setAddDuration(0);
messageListView.getItemAnimator().setChangeDuration(0);
messageListView.getItemAnimator().setMoveDuration(0);
messageListView.getItemAnimator().setRemoveDuration(0);
((SimpleItemAnimator) messageListView.getItemAnimator()).setSupportsChangeAnimations(false);
// 底部有新消息
tvBottomTip = new TextView(context);
LayoutParams params1 = new LayoutParams(
Utils.dip2px(context, 115F), Utils.dip2px(context, 27));
params1.gravity = Gravity.BOTTOM;
params1.leftMargin = UIUtil.getScreenWidth(context) / 2 - UIUtil.dip2px(context, 115 / 2);
tvBottomTip.setBackgroundResource(R.drawable.bg_messge_view_bottom_tip);
tvBottomTip.setGravity(Gravity.CENTER);
tvBottomTip.setText(context.getString(R.string.message_view_bottom_tip));
tvBottomTip.setTextColor(context.getResources().getColor(R.color.appColor));
tvBottomTip.setLayoutParams(params1);
tvBottomTip.setVisibility(GONE);
tvBottomTip.setOnClickListener(v -> {
tvBottomTip.setVisibility(GONE);
needAutoScroll = true;
if (mMessageAdapter.getItemCount() > 0) {
messageListView.smoothScrollToPosition(mMessageAdapter.getItemCount() - 1);
}
});
addView(tvBottomTip);
//有人@我
tvAtTip = new TextView(context);
LayoutParams params2 = new LayoutParams(
Utils.dip2px(context, 115F), Utils.dip2px(context, 27));
params2.gravity = Gravity.BOTTOM;
params2.leftMargin = UIUtil.getScreenWidth(context) / 2 - UIUtil.dip2px(context, 115 / 2);
tvAtTip.setBackgroundResource(R.drawable.bg_messge_view_bottom_tip);
tvAtTip.setGravity(Gravity.CENTER);
tvAtTip.setText(context.getString(R.string.message_view_bottom_tip));
tvAtTip.setTextColor(context.getResources().getColor(R.color.color_FD85C9));
tvAtTip.setLayoutParams(params2);
tvAtTip.setVisibility(GONE);
tvAtTip.setOnClickListener(v -> {
if (!atMessages.isEmpty()) {
int scrollIndex = chatRoomMessages.indexOf(atMessages.remove(0));
if (scrollIndex != -1 && scrollIndex < mMessageAdapter.getItemCount()) {
messageListView.smoothScrollToPosition(scrollIndex);
}
}
needAutoScroll = false;
checkShowAtTip();
});
addView(tvAtTip);
messageListView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
}
@Override
public void onScrollStateChanged(final RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
// Logger.e(TAG, "onScrollStateChanged: SCROLL_STATE_DRAGGING");
needAutoScroll = false;
}
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// Logger.e(TAG, "onScrollStateChanged: SCROLL_STATE_IDLE");
int lastVisibleItemPosition = layoutManger.findLastVisibleItemPosition();
if (lastVisibleItemPosition == RecyclerView.NO_POSITION) {
// Logger.e(TAG, "lastCompletelyVisibleItemPosition : RecyclerView.NO_POSITION");
needAutoScroll = true;
} else if (!atMessages.isEmpty() && atMessages.remove(chatRoomMessages.get(lastVisibleItemPosition))) {
checkShowAtTip();
}
// Log.e(TAG, "lastVisibleItemPosition:" + lastVisibleItemPosition
// + " mMessageAdapter.getItemCount()-1:" + (recyclerView.getAdapter().getItemCount()-1)
// + " dis:"+ (lastVisibleItemPosition-(recyclerView.getAdapter().getItemCount()-1)));
if (lastVisibleItemPosition >= recyclerView.getAdapter().getItemCount() - 3) {
//最後一個顯示出來了
// Logger.e(TAG, ResUtil.getString(R.string.avroom_widget_messageview_01));
needAutoScroll = true;
tvBottomTip.setVisibility(GONE);
keepSizeUnderLimit();
} else {
// Logger.e(TAG, ResUtil.getString(R.string.avroom_widget_messageview_02));
// needAutoScroll = false;
}
}
}
});
}
private TemplateMessageAdapter getTemplateMessageAdapter() {
if (templateMessageAdapter == null) {
templateMessageAdapter = new TemplateMessageAdapter(uid -> {
if (clickConsumer != null) {
Single.just(String.valueOf(uid)).subscribe(clickConsumer);
}
});
}
return templateMessageAdapter;
}
/**
* 添加公屏消息請使用 {@link AvRoomDataManager#addChatRoomMessage(ChatRoomMessage)}
*/
public void addMessages(ChatRoomMessage msg) {
if (msg == null) return;
chatRoomMessages.add(msg);
//通知adapter 刷新
mMessageAdapter.notifyItemInserted(mMessageAdapter.getItemCount() - 1);
showTipsOrScrollToBottom();
checkAtMe(msg, false);
}
public void addMessages(List<ChatRoomMessage> messages) {
if (messages == null) return;
chatRoomMessages.addAll(messages);
//通知adapter 刷新
mMessageAdapter.notifyDataSetChanged();
showTipsOrScrollToBottom();
for (ChatRoomMessage message : messages) {
checkAtMe(message, true);
}
}
public void addHistoryMessages(List<ChatRoomMessage> messages) {
chatRoomMessages.addAll(0, messages);
mMessageAdapter.notifyDataSetChanged();
messageListView.scrollToPosition(mMessageAdapter.getItemCount() - 1);
for (ChatRoomMessage message : messages) {
checkAtMe(message, true);
}
}
private void keepSizeUnderLimit() {
while (chatRoomMessages.size() > MAX_MESSAGE_SIZE) {
Log.i("keepSizeUnderLimit", "size" + chatRoomMessages.size());
ChatRoomMessage message = chatRoomMessages.remove(0);
if (atMessages.remove(message)) {
checkShowAtTip();
}
mMessageAdapter.notifyItemRemoved(0);
}
}
private void checkShowAtTip() {
tvAtTip.setText(getContext().getString(R.string.message_at_tip, atMessages.size()));
tvAtTip.setVisibility(atMessages.size() == 0 ? GONE : VISIBLE);
}
private void checkAtMe(ChatRoomMessage msg, boolean history) {
if (msg.getMsgType() != MsgTypeEnum.text) return;
List<String> atUids = ExtensionUtil.getListExtension(msg, UserInfo.AT_UIDS);
List<String> atNames = ExtensionUtil.getListExtension(msg, UserInfo.AT_NAMES);
if (!ListUtils.isListEmpty(atUids) && !ListUtils.isListEmpty(atNames)) {
for (int i = 0; i < atUids.size(); i++) {
String uid = atUids.get(i);
// 只有當被 @ 人的數組中包含自己的時候才會去變色
if (Objects.equals(uid, String.valueOf(AuthModel.get().getCurrentUid()))) {
Map<String, Long> atMap = DemoCache.readAtMsgUuid();
if (atMap == null || !atMap.containsKey(msg.getUuid())) {
if (!atMessages.contains(msg) && (!needAutoScroll || history)) {
atMessages.add(msg);
checkShowAtTip();
}
DemoCache.saveAtMsgUuid(msg.getUuid());
}
}
}
}
}
public void showTipsOrScrollToBottom() {
if (!needAutoScroll) {
tvBottomTip.setVisibility(VISIBLE);
//超過某值後自動滾動下去
if (mMessageAdapter.getItemCount() > BLOCK_MAX_MESSAGE_SIZE) {
if (mMessageAdapter.getItemCount() > 0) {
messageListView.smoothScrollToPosition(mMessageAdapter.getItemCount() - 1);
}
}
return;
}
}
public void release() {
}
public void clear() {
if (mMessageAdapter != null) {
chatRoomMessages.clear();
mMessageAdapter.notifyDataSetChanged();
}
if (tvBottomTip != null) {
needAutoScroll = true;
tvBottomTip.setVisibility(GONE);
}
}
public void setNeedAutoScroll(boolean needAutoScroll) {
this.needAutoScroll = needAutoScroll;
}
public RecyclerView getMessageListView(){
return messageListView;
}
public interface OnClick {
/**
* 公屏查看公告
*/
void onShowRoomIntroduction();
}
private class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder> implements OnClickListener,Function1<Drawable, ImageSpan> {
private Context mContext;
private List<ChatRoomMessage> data;
private int ITEM_TYPE_IMAGE = 1;
public MessageAdapter(Context mContext) {
this.mContext = mContext;
}
public void setData(List<ChatRoomMessage> data) {
this.data = data;
}
@Override
public int getItemViewType(int position) {
ChatRoomMessage chatRoomMessage = data.get(position);
if (chatRoomMessage.getMsgType() == MsgTypeEnum.image) {
return ITEM_TYPE_IMAGE;
}
return super.getItemViewType(position);
}
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_IMAGE) {
return new MessageAdapter.MessageViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_chatroom_msg_image, parent, false));
}
return new MessageViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_chatrrom_msg, parent, false));
}
@Override
public void onBindViewHolder(MessageViewHolder holder, int position) {
if (getItemViewType(position) == ITEM_TYPE_IMAGE) {
convertImage(holder, data.get(position));
} else {
convert(holder, data.get(position));
}
}
@Override
public int getItemCount() {
return data.size();
}
protected void convertImage(MessageViewHolder baseViewHolder, ChatRoomMessage chatRoomMessage) {
TextView tvContent = baseViewHolder.tvContent;
tvContent.setLineSpacing(0, 1);
tvContent.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
tvContent.setOnClickListener(this);
tvContent.setTag(chatRoomMessage);
if (UiUtils.INSTANCE.isRtl(tvContent.getContext())) {
tvContent.setTextDirection(View.TEXT_DIRECTION_RTL);
}
try {
setVIPMessageBackground(chatRoomMessage, baseViewHolder.itemView);
ChatRoomMessageExtension extension = chatRoomMessage.getChatRoomMessageExtension();
TextSpannableBuilder text = new TextSpannableBuilder(tvContent);
addCommonTag(chatRoomMessage, text, tvContent);
String nickName = extension == null ? ResUtil.getString(R.string.avroom_widget_messageview_0116) : RegexUtil.getPrintableString(extension.getSenderNick());
text.append(nickName, new ForegroundColorSpan(greyColor));
tvContent.setText(text.build());
ImageView imageView = baseViewHolder.itemView.findViewById(R.id.iv_image);
ImageAttachment msgAttachment = (ImageAttachment) chatRoomMessage.getAttachment();
String path = msgAttachment.getThumbPath();
if (TextUtils.isEmpty(path)) {
path = msgAttachment.getPath();
}
if (TextUtils.isEmpty(path)) {
path = "";
}
ImageLoadUtilsV2.loadImage(imageView, path);
int[] bounds = new int[]{msgAttachment.getWidth(), msgAttachment.getHeight()};
ImageUtil.ImageSize imageSize = ImageUtil.getThumbnailDisplaySize(bounds[0], bounds[1], ChatRoomMessageViewHolderThumbBase.getImageMaxEdge(), ChatRoomMessageViewHolderThumbBase.getImageMinEdge());
ViewGroup.LayoutParams maskParams = imageView.getLayoutParams();
maskParams.width = imageSize.width;
maskParams.height = imageSize.height;
imageView.setLayoutParams(maskParams);
String finalPath = path;
imageView.setOnClickListener(v -> {
BigPhotoActivity.start((Activity) mContext, ObjectTypeHelper.pathToCustomItems(finalPath),
0, new PagerOption());
});
} catch (Exception e) {
e.printStackTrace();
}
}
protected void convert(MessageViewHolder baseViewHolder, ChatRoomMessage chatRoomMessage) {
if (chatRoomMessage == null) return;
TextView tvContent = baseViewHolder.tvContent;
tvContent.setLineSpacing(0, 1);
tvContent.setTextColor(Color.WHITE);
tvContent.setTextSize(defTextSize);
tvContent.setOnClickListener(this);
tvContent.setOnLongClickListener(null);
tvContent.setTag(chatRoomMessage);
tvContent.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
if (UiUtils.INSTANCE.isRtl(tvContent.getContext())) {
tvContent.setTextDirection(View.TEXT_DIRECTION_RTL);
}
clearBackground(tvContent);
try {
if (chatRoomMessage.getMsgType() == MsgTypeEnum.tip) {
// 房間通告
tvContent.setTextColor(ContextCompat.getColor(mContext, R.color.color_white));
tvContent.setText(chatRoomMessage.getContent());
tvContent.setBackgroundResource(R.drawable.shape_room_message_tip_bg);
} else if (chatRoomMessage.getMsgType() == MsgTypeEnum.text) {
setMsgText(chatRoomMessage, tvContent);
setVIPMessageBackground(chatRoomMessage, tvContent);
} else if (chatRoomMessage.getMsgType() == MsgTypeEnum.notification) {
// 加上勛章
setMsgNotification(chatRoomMessage, tvContent, baseViewHolder.getAdapterPosition());
setVIPMessageBackground(chatRoomMessage, tvContent);
} else if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) {
if (chatRoomMessage.getAttachment() != null && chatRoomMessage.getAttachment() instanceof CustomAttachment) {
CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment();
int first = attachment.getFirst();
int second = attachment.getSecond();
if (first == CustomAttachment.CUSTOM_MSG_HEADLINE_CHANGED) {
if (second == CustomAttachment.CUSTOM_MSG_HEADLINE_CHANGED_SUB) {
setHeadlineMsg(chatRoomMessage, tvContent, attachment);
}
} else {
tvContent.setTextColor(Color.WHITE);
tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip));
}
} else {
tvContent.setText("");
}
}
} catch (UnsupportedOperationException e) {
e.printStackTrace();
clearBackground(tvContent);
tvContent.setTextColor(Color.WHITE);
tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip));
} catch (Exception e) {
clearBackground(tvContent);
tvContent.setText("");
}
}
private void clearBackground(TextView textView) {
// 清除文字
textView.setText("");
// 清除聊天氣泡
textView.setBackgroundResource(R.drawable.shape_room_message_bg);
textView.setPadding(paddingWidth, paddingHeight, paddingWidth, paddingHeight);
}
private void setNullBackground(TextView textView) {
// 清除聊天氣泡
textView.setBackground(null);
textView.setPadding(0, 0, 0, 0);
}
public void setVIPMessageBackground(ChatRoomMessage chatRoomMessage, View view) {
String androidBubbleUrl = NobleUtil.getResource(UserInfo.BUBBLE_URL_ANDROID, chatRoomMessage);
if (TextUtils.isEmpty(androidBubbleUrl)) return;
view.setPadding(paddingWidth, ScreenUtil.dip2px(10), paddingWidth, ScreenUtil.dip2px(10));
ImageLoadUtils.loadNinePatchBg(view, androidBubbleUrl);
}
/**
* {badge}{level}xxx: 文字內容
*
* @param chatRoomMessage -
* @param tvContent -
*/
private void setMsgText(ChatRoomMessage chatRoomMessage, TextView tvContent) {
TextSpannableBuilder text = new TextSpannableBuilder(tvContent);
addCommonTag(chatRoomMessage, text, tvContent);
String nickName;
if (chatRoomMessage.getFromAccount() != null && chatRoomMessage.getFromAccount().equals(AuthModel.get().getCurrentUid() + "")) {
nickName = ResUtil.getString(R.string.avroom_widget_messageview_0116);
} else {
nickName = NobleUtil.getNamePlate(UserInfo.NICK, chatRoomMessage);
}
text.append(nickName, new ForegroundColorSpan(greyColor));
text.append(": " + chatRoomMessage.getContent(), new ForegroundColorSpan(getResources().getColor(R.color.white)));
List<String> atUids = ExtensionUtil.getListExtension(chatRoomMessage, UserInfo.AT_UIDS);
List<String> atNames = ExtensionUtil.getListExtension(chatRoomMessage, UserInfo.AT_NAMES);
if (!ListUtils.isListEmpty(atUids) && !ListUtils.isListEmpty(atNames)) {
for (int i = 0; i < atUids.size(); i++) {
String name = atNames.get(i);
String uid = atUids.get(i);
// 只有當被 @ 人的數組中包含自己的時候才會去變色
if (Objects.equals(uid, String.valueOf(AuthModel.get().getCurrentUid()))) {
Pattern pattern = Pattern.compile(Pattern.quote(name));
Matcher matcher = pattern.matcher(text.build().toString());
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
text.build().setSpan(new ForegroundColorSpan(getContext().getResources().getColor(R.color.color_FD85C9)),
start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
}
}
}
if (Objects.equals(chatRoomMessage.getFromAccount(), String.valueOf(AuthModel.get().getCurrentUid()))) {
tvContent.setOnLongClickListener(null);
} else {
tvContent.setOnLongClickListener(v -> {
if (onLongClickListener != null) {
onLongClickListener.onLongClick(v, chatRoomMessage.getFromAccount(), nickName);
}
return true;
});
}
MoonUtil.replaceEmoticons(getContext(), text.builder.toString(), text.builder, this);
tvContent.setText(text.build());
}
private void addCommonTag(ChatRoomMessage chatRoomMessage, @NonNull TextSpannableBuilder builder, TextView tvContent) {
ChatRoomMessageExtension extension = chatRoomMessage.getChatRoomMessageExtension();
String userLevel = NobleUtil.getLevel(UserLevelResourceType.EXPER_URL, chatRoomMessage);
boolean isOfficial = NobleUtil.getIsOfficial(UserInfo.IS_OFFICIAL, chatRoomMessage);
String vipIcon = NobleUtil.getResource(UserInfo.VIP_ICON, chatRoomMessage);
builder.append(vipIcon, expLevelHeight)
.append(isOfficial ? ResourcesCompat.getDrawable(getResources(),
R.mipmap.ic_user_official_13dp, null) : null,
badgeWidth, badgeHeight)
.append(getNewUserDrawable(chatRoomMessage), badgeWidth, badgeHeight)
.append(AvRoomDataManager.get().isSuperAdmin(chatRoomMessage.getFromAccount()) ? ResourcesCompat.getDrawable(getResources(),
R.drawable.ic_room_super_admin, null) : null,
SizeUtils.dp2px(tvContent.getContext(), 23), expLevelHeight);
// 官方主播認證
String tvOfficialMask = NobleUtil.getLevel(UserInfo.OAC_NAME, chatRoomMessage).trim();
String ivOfficialMask = NobleUtil.getLevel(UserInfo.OAC_ICON, chatRoomMessage);
if (!TextUtils.isEmpty(tvOfficialMask) && !TextUtils.isEmpty(ivOfficialMask) && extension != null) { // extension != null 表示自己
builder.appendBgAndContent(ivOfficialMask, tvOfficialMask);
} else if (!TextUtils.isEmpty(ivOfficialMask)) {
builder.append(ivOfficialMask, SizeUtils.dp2px(tvContent.getContext(), 62), expLevelHeight);
}
//等級
builder.append(userLevel, expLevelHeight);
//銘牌
String tvNamePlate = NobleUtil.getNamePlate(UserInfo.NAMEPLATE_WORD, chatRoomMessage).trim();
String ivNamePlate = NobleUtil.getNamePlate(UserInfo.NAMEPLATE_PIC, chatRoomMessage);
if (!TextUtils.isEmpty(tvNamePlate) && !TextUtils.isEmpty(ivNamePlate)) { // extension != null 表示自己
builder.appendBgAndContent(ivNamePlate, tvNamePlate);
} else if (!TextUtils.isEmpty(ivNamePlate)) {
builder.append(ivNamePlate, expLevelHeight);
}
}
private void setHeadlineMsg(ChatRoomMessage chatRoomMessage, TextView tvContent, CustomAttachment attachment) {
HeadlineChangedAttachment headlineAttachment = (HeadlineChangedAttachment) attachment;
SpannableTextBuilder builder = new SpannableTextBuilder(tvContent);
if (attachment.getSecond() == CustomAttachment.CUSTOM_MSG_HEADLINE_CHANGED_SUB) {
HeadlineBean data = headlineAttachment.getHeadlineData();
String nick = null;
if (data != null) {
nick = data.getNick();
}
if (nick == null) {
nick = "";
}
builder.appendText(String.format(ResUtil.getString(R.string.headline_message_format), nick), null, null, null, null, null, null);
builder.setTextStyle(nick, ContextCompat.getColor(getContext(), R.color.color_DE3446), null, null, null, null, null);
}
tvContent.setText(builder.build());
tvContent.setTextSize(11);
setNullBackground(tvContent);
}
/**
* {badge}xxx來了
*
* @param chatRoomMessage -
* @param tvContent -
*/
private void setMsgNotification(ChatRoomMessage chatRoomMessage, TextView tvContent, int position) {
int fromType = 0;
String fromNick = "";
String fromUid = "";
Map<String, Object> remoteExtension = chatRoomMessage.getRemoteExtension();
if (remoteExtension != null) {
fromType = (int) remoteExtension.get("fromType");
fromNick = (String) remoteExtension.get("fromNick");
fromUid = (String) remoteExtension.get("fromUid");
}
ChatRoomNotificationAttachment attachment = (ChatRoomNotificationAttachment) chatRoomMessage.getAttachment();
String senderNick = "";
List<String> nicks = attachment.getTargetNicks();
if (nicks != null && nicks.size() > 0)
senderNick = RegexUtil.getPrintableString(attachment.getTargetNicks().get(0));
if (attachment.getType() != NotificationType.ChatRoomMemberIn) return;
// 座駕
String carName = NobleUtil.getCarName(CarInfo.CAR_NAME, chatRoomMessage);
carName = TextUtils.isEmpty(carName) ? "" : "\"" + carName + "\"";
TextSpannableBuilder text = new TextSpannableBuilder(tvContent);
addCommonTag(chatRoomMessage, text, tvContent);
text.append(senderNick, new ForegroundColorSpan(roomTipColor),
new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View view) {
if (clickConsumer != null) {
Single.just(chatRoomMessage.getFromAccount())
.doOnSuccess(clickConsumer).subscribe();
}
}
});
text.append(TextUtils.isEmpty(carName) ? "" : ResUtil.getString(R.string.avroom_widget_messageview_0150), new ForegroundColorSpan(greyColor))
.append(carName, new ForegroundColorSpan(roomTipColor));
String enterText = ResUtil.getString(R.string.avroom_widget_messageview_0151);
if (fromType == AVRoomActivity.FROM_TYPE_RECOMMEND) {
enterText = ResUtil.getString(R.string.avroom_widget_messageview_0152);
}
if (fromType == AVRoomActivity.FROM_TYPE_USER || fromType == AVRoomActivity.FROM_TYPE_HELLO) {
String finalFromUid = fromUid;
text.append(ResUtil.getString(R.string.avroom_widget_messageview_0153), new ForegroundColorSpan(whiteColor))
.append(fromNick, new ForegroundColorSpan(roomTipColor),
new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View view) {
if (clickConsumer != null) {
Single.just(finalFromUid).doOnSuccess(clickConsumer).subscribe();
}
}
});
enterText = ResUtil.getString(R.string.avroom_widget_messageview_0154);
}
if (fromType == AVRoomActivity.FROM_TYPE_GAME_RECOMMEND) {
String finalFromUid = fromUid;
text.append(ResUtil.getString(R.string.avroom_widget_messageview_0155), new ForegroundColorSpan(whiteColor))
.append(fromNick, new ForegroundColorSpan(roomTipColor),
new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View view) {
if (clickConsumer != null) {
Single.just(finalFromUid).doOnSuccess(clickConsumer).subscribe();
}
}
});
enterText = ResUtil.getString(R.string.avroom_widget_messageview_0156);
}
text.append(enterText, new ForegroundColorSpan(whiteColor));
tvContent.setText(text.build());
tvContent.setOnClickListener(null);
tvContent.setMovementMethod(new LinkMovementMethod());
}
@Nullable
private Drawable getNewUserDrawable(ChatRoomMessage chatRoomMessage) {
boolean newUser = NobleUtil.getIsNewUser(UserInfo.IS_NEW_USER, chatRoomMessage);
boolean isHelloUser = NobleUtil.getIsNewUser(UserInfo.IS_FROM_SAY_HELLO_CHANNEL, chatRoomMessage);
if (newUser) {
return ResourcesCompat.getDrawable(getResources(),
isHelloUser ? R.drawable.ic_new_user_hello : R.drawable.ic_new_user,
null);
}
return null;
}
@SuppressLint("CheckResult")
@Override
public void onClick(View v) {
String account = "";
ChatRoomMessage chatRoomMessage = (ChatRoomMessage) v.getTag();
if (chatRoomMessage.getMsgType() != MsgTypeEnum.tip) {
if (chatRoomMessage.getMsgType() == MsgTypeEnum.text) {
account = chatRoomMessage.getFromAccount();
} else if (chatRoomMessage.getMsgType() == MsgTypeEnum.notification) {
account = chatRoomMessage.getFromAccount();
} else if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) {
CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment();
if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP) {
account = ((RoomTipAttachment) attachment).getUid() + "";
} else if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_BOX) {
account = String.valueOf(((RoomBoxPrizeAttachment) attachment).getUid());
} else if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE) {
long handleUid = ((RoomQueueMsgAttachment) attachment).handleUid;
if (handleUid > 0) {
account = ((RoomQueueMsgAttachment) attachment).handleUid + "";
} else {
//ios沒用handleUid導致iOS發的自定義消息拿不到uid
account = chatRoomMessage.getFromAccount();
}
} else if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_HEADER_TYPE_MONSTER_HUNTING) {
switch (attachment.getSecond()) {
case CustomAttachment.CUSTOM_MSG_SUB_TYPE_MONSTER_HUNTING:
MonsterDataBean dataBean = ((MonsterStatusAttachment) attachment).getDataBean();
RoomInfo mCurrentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (!Objects.equals(mCurrentRoomInfo.getUid(), dataBean.getAppearRoomUid())) {
AVRoomActivity.start(getContext(), dataBean.getAppearRoomUid());
} else {
SingleToastUtil.showToast("你已經在怪獸房間內");
}
break;
case CustomAttachment.CUSTOM_NOTI_SUB_GAME_RESULT:
MonsterHuntingResult result = ((MonsterHuntingResultAttachment) attachment).getResult();
UIHelper.showMonsterResult(getContext(), String.valueOf(result.getMonster().getMonsterId()));
break;
}
} else if (attachment.getFirst() == CustomAttachment.CUSTOM_MESS_HEAD_ROOM_PK) {
if (attachment.getSecond() == CustomAttachment.CUSTOM_MESS_SUB_ROOM_PK_RESULT) {
RoomTeamPKResultDialog pkResultDialog = new RoomTeamPKResultDialog(getContext(), ((RoomPkAttachment) attachment).getRoomPkData());
pkResultDialog.show();
}
} else if (attachment instanceof RoomFollowOwnerAttachment2 && !AvRoomDataManager.get().isRoomFans) {
CollectionRoomModel.get().followRoom("1", ((RoomFollowOwnerAttachment2) attachment).getOwnerUid())
.subscribe(s -> {
AvRoomDataManager.get().isRoomFans = true;
SingleToastUtil.showToast("收藏成功!");
EventBus.getDefault().post(new FollowRoomEvent());
PraiseModel.get().setFollowRoomSuccessRoomTip(JavaUtil.str2long(chatRoomMessage.getFromAccount()));
});
} else if (attachment.getFirst() == CustomAttachment.CUSTOM_MESS_TAROT) {
if (attachment instanceof TarotAttachment) {
account = ((TarotAttachment) attachment).getTarotMsgBean().getUid() + "";
}
}
}
if (TextUtils.isEmpty(account)) return;
if (clickConsumer != null) {
Single.just(account).subscribe(clickConsumer);
}
} else {
String content = chatRoomMessage.getContent();
if (!TextUtils.isEmpty(content) && content.equals(ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_08)))
if (onClick != null) {
onClick.onShowRoomIntroduction();
}
}
}
@Override
public ImageSpan invoke(Drawable drawable) {
return new CustomImageSpan(drawable);
}
class MessageViewHolder extends RecyclerView.ViewHolder {
TextView tvContent;
public MessageViewHolder(View itemView) {
super(itemView);
tvContent = itemView.findViewById(R.id.tv_content);
}
}
}
}

View File

@@ -1,111 +0,0 @@
package com.chwl.app.avroom.public_chat
import android.content.Context
import android.util.AttributeSet
import com.chwl.app.R
import com.chwl.app.public_chat.core.ChatRoomClient
import com.chwl.app.public_chat.core.ChatRoomClientManager
import com.chwl.core.im.custom.bean.HeadlineChangedAttachment
import com.chwl.core.support.room.FrameLayoutRoomWidget
import com.chwl.core.support.room.RoomView
import com.chwl.library.utils.SingleToastUtil
import com.netease.nim.uikit.api.model.NimException
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum
import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum
class PublicChatRoomMessageWidget : FrameLayoutRoomWidget {
private val messageView: PublicChatMessageView = PublicChatMessageView(context)
private var chatRoomClient: ChatRoomClient? = 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 {
addView(messageView, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
}
override fun onStart(roomView: RoomView) {
super.onStart(roomView)
chatRoomClient = ChatRoomClientManager.getPublicChatClient()
if (chatRoomClient == null) {
SingleToastUtil.showToast(R.string.public_chat_not_found)
}
chatRoomClient?.let {
initChatRoom(it)
}
}
private fun onReceiveMessage(message: ChatRoomMessage) {
if (!filterMessageForMessageList(message)) {
messageView.addMessages(message)
}
}
private fun initChatRoom(chatRoomClient: ChatRoomClient) {
getCompositeDisposable().add(
chatRoomClient.enterChatRoom()
.subscribe({ requestHistory(chatRoomClient) },
{
if (it is NimException) {
SingleToastUtil.showToast(context.getString(R.string.avroom_fragment_homepartyroomfragment_011) + "(${it.code})")
} else {
SingleToastUtil.showToast(R.string.avroom_fragment_homepartyroomfragment_011)
}
})
)
getCompositeDisposable().add(chatRoomClient.messageObservable.subscribe {
it.forEach { message ->
onReceiveMessage(message)
}
})
}
private fun requestHistory(chatRoomClient: ChatRoomClient) {
val typeEnums = arrayOf(MsgTypeEnum.text, MsgTypeEnum.image)
getCompositeDisposable().add(
chatRoomClient.requestRemoteMessageType(
0,
50,
QueryDirectionEnum.QUERY_OLD,
typeEnums
).subscribe({
messageView.addHistoryMessages(it.reversed())
}, {
it.printStackTrace()
})
)
}
private fun filterMessageForMessageList(message: ChatRoomMessage): Boolean {
if (message.msgType == MsgTypeEnum.custom && message.attachment is HeadlineChangedAttachment) {
val data = (message.attachment as HeadlineChangedAttachment).headlineData
if (data == null || !data.isValid()) {
return true
}
}
return false
}
fun getMessageView() = messageView
override fun onStop() {
super.onStop()
chatRoomClient = null
}
}

View File

@@ -3,13 +3,13 @@ package com.chwl.app.avroom.room_album
import android.annotation.SuppressLint
import android.os.Bundle
import com.hjq.toast.ToastUtils
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogLockRoomAlbumPhotoBinding
import com.chwl.app.ui.utils.ImageLoadUtilsV2
import com.chwl.core.gift.bean.GiftReceiveInfo
import com.chwl.core.manager.AvRoomDataManager
class UnlockRoomAlbumPhotoDialog : BaseDialog<DialogLockRoomAlbumPhotoBinding>(){
class UnlockRoomAlbumPhotoDialog : BaseDialogFragment<DialogLockRoomAlbumPhotoBinding>(){
var onUnlockRoomPhotoListener: OnUnlockRoomPhotoListener? = null

View File

@@ -3,6 +3,7 @@ package com.chwl.app.avroom.room_album
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Intent
import android.os.Build
@@ -11,6 +12,9 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
@@ -25,12 +29,17 @@ import com.chwl.app.ui.utils.ImageLoadUtilsV2
import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
import com.chwl.core.Constants
import com.chwl.core.gift.bean.GiftInfo
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.MyUriUtils
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.photo.PhotoProvider.photoProvider
import com.chwl.library.common.util.PhotoCompressUtil.compress
import com.chwl.library.common.util.PhotoCompressUtil.getCompressCachePath
import com.chwl.library.common.util.PhotosCompressCallback
import com.chwl.library.common.util.SPUtils
import com.chwl.library.constants.ConstantsLib
import com.chwl.library.easypermisssion.EasyPermissions
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import kotlinx.coroutines.Job
class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
@@ -45,7 +54,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
private var unlockedGift: GiftInfo? = null
private var compressJob: Job? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
val dialogManager by lazy {
DialogManager(context)
}
@@ -55,6 +64,17 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.ErbanBottomSheetDialog)
if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(requireContext())) {
pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
uri?.let {
val file = MyUriUtils.copyFile(requireContext(),uri)
if (file != null) {
compressPhotos(mutableListOf(file.path))
}
}
}
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@@ -194,7 +214,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
return@setOnClickListener
}
dialogManager.showProgressDialog(context)
// dialogManager.showProgressDialog(context)
viewModel.upload(
list,
type,
@@ -204,7 +224,7 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
viewModel.uploadLiveData.observe(this) {
it?.getContentIfNotHandled()?.let { success ->
dialogManager.hideProgressDialog()
// dialogManager.hideProgressDialog()
if (success) {
dismiss()
@@ -219,28 +239,37 @@ class UploadRoomAlbumDialogFragment : BottomSheetDialogFragment() {
}
private fun checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
requireContext(),
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES
else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
100,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES
else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
photoProvider(
this,
7 - photoAdapter.data.size,
true,
200,
true
)
if (Build.VERSION.SDK_INT >= 33){
DialogUtil.getDialog(requireActivity(),object : EasyAlertDialogHelper.OnDialogActionListener {
override fun doCancelAction() {
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
})
}else{
if (!EasyPermissions.hasPermissions(requireContext(),Manifest.permission.READ_EXTERNAL_STORAGE)) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
100,
Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
photoProvider(
this,
7 - photoAdapter.data.size,
true,
200,
true
)
}
}
}
@Deprecated("Deprecated in Java")

View File

@@ -5,7 +5,7 @@ import android.os.Bundle
import android.view.WindowManager
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkFinishBinding
import com.chwl.app.ui.utils.load
import com.chwl.core.im.custom.bean.RoomPkBean
@@ -14,7 +14,7 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import java.util.concurrent.TimeUnit
class SingleRoomPkFinishDialog : BaseDialog<DialogSingleRoomPkFinishBinding>() {
class SingleRoomPkFinishDialog : BaseDialogFragment<DialogSingleRoomPkFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkForceFinishBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.utils.extension.subAndReplaceDot
class SingleRoomPkForceFinishDialog : BaseDialog<DialogSingleRoomPkForceFinishBinding>() {
class SingleRoomPkForceFinishDialog : BaseDialogFragment<DialogSingleRoomPkForceFinishBinding>() {
companion object {
@JvmStatic

View File

@@ -4,7 +4,7 @@ import android.annotation.SuppressLint
import android.os.Bundle
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkReceivedBinding
import com.chwl.core.im.custom.bean.RoomPkBean
import com.chwl.core.manager.AvRoomDataManager
@@ -17,7 +17,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class SingleRoomPkReceivedDialog : BaseDialog<DialogSingleRoomPkReceivedBinding>() {
class SingleRoomPkReceivedDialog : BaseDialogFragment<DialogSingleRoomPkReceivedBinding>() {
companion object {

View File

@@ -1,12 +1,12 @@
package com.chwl.app.avroom.singleroompk
import android.text.method.ScrollingMovementMethod
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogSingleRoomPkRuleBinding
import com.chwl.core.room.anotherroompk.SingleRoomPKModel
import com.chwl.core.utils.extension.toast
class SingleRoomPkRuleDialog : BaseDialog<DialogSingleRoomPkRuleBinding>() {
class SingleRoomPkRuleDialog : BaseDialogFragment<DialogSingleRoomPkRuleBinding>() {
companion object {

View File

@@ -16,13 +16,13 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.chwl.core.manager.AvRoomDataManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.chwl.app.avroom.activity.RoomTypeSwitchActivity;
import com.chwl.app.avroom.dialog.RoomGameplayDialog;
import com.chwl.core.utils.extension.StringExtensionKt;
import com.chwl.library.utils.SizeUtils;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.msg.model.RecentContact;
@@ -30,7 +30,6 @@ import com.netease.nimlib.sdk.uinfo.model.UserInfo;
import com.chwl.app.R;
import com.chwl.app.avroom.BottomViewListenerWrapper;
import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.app.vip.VipMainActivity;
import com.chwl.app.room_chat.activity.RoomMsgActivity;
import com.chwl.core.helper.ImHelperUtils;
import com.chwl.core.manager.AvRoomDataManager;
@@ -75,8 +74,10 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
private ImageView iconMicQueue;
private ImageView iconRoomMsg;
@Nullable
private PopupWindow msgTipPopupWindow;
private PopupWindow micSetPopupWindow;
@NonNull
private final Runnable msgRunnable = this::dismissMsgPopupWindow;
@@ -110,7 +111,6 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
iconMicQueue = (ImageView) findViewById(R.id.icon_mic_queue);
iconRoomMsg = findViewById(R.id.iv_room_message);
ImageView gameView = findViewById(R.id.icon_room_game);
openMic.setOnClickListener(this);
sendMsgInput.setOnClickListener(this);
sendFace.setOnClickListener(this);
@@ -119,7 +119,6 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
sendMagic.setOnClickListener(this);
iconMicQueue.setOnClickListener(this);
iconRoomMsg.setOnClickListener(this);
gameView.setOnClickListener(this);
setMicBtnEnable(false);
setMicBtnOpen(false);
@@ -243,6 +242,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
}
public void notifyStateChanged() {
setMagicBtnEnable(true);
}
@@ -252,6 +252,23 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
micLayout.setVisibility(VISIBLE);
}
public void updateGameEntrance() {
// game btn pk按钮游戏按钮 显示控制
// if (AvRoomDataManager.get().isManager() || SuperAdminUtil.isSuperAdmin()) {
// if (!AvRoomDataManager.get().isCpRoom()) {
// pkGameView.setVisibility(VISIBLE);
// iconRoomBaiShunGame.setVisibility(VISIBLE);
// }
// } else {
// pkGameView.setVisibility(GONE);
// iconRoomBaiShunGame.setVisibility(GONE);
// }
// if (AvRoomDataManager.get().isSingleRoom() || AvRoomDataManager.get().isDatingMode()) {
// pkGameView.setVisibility(GONE);
// }
}
public void showHomePartyDownMicBottom() {
faceLayout.setVisibility(GONE);
micLayout.setVisibility(GONE);
@@ -303,6 +320,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
if (wrapper != null) {
wrapper.onOpenMicBtnClick();
}
// showMicSetDialog(openMic);
break;
case R.id.tv_room_send_msg_input:
@@ -351,11 +369,16 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
wrapper.onRoomMessageClick();
}
break;
case R.id.icon_room_game:
if (wrapper != null) {
wrapper.onRoomGameplayClick();
}
break;
// case R.id.icon_room_PK_game:
// if (wrapper != null) {
// wrapper.onRoomGameplayClick(true);
// }
// break;
// case R.id.icon_room_baishun_game:
// if (wrapper != null) {
// wrapper.onRoomGameplayClick(false);
// }
// break;
default:
break;
}
@@ -437,4 +460,40 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
parent.postDelayed(msgRunnable, 3000);
}
private void showMicSetDialog(View parent){
//todo do 关麦开麦
View contentView;
if (micSetPopupWindow == null) {
contentView = LayoutInflater.from(getContext()).inflate(R.layout.popup_mic_set, null);
micSetPopupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
micSetPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// micSetPopupWindow.setAnimationStyle(R.style.style_anim_mic_set);
} else {
contentView = micSetPopupWindow.getContentView();
}
ImageView micOff = contentView.findViewById(R.id.micOff);
ImageView micMusic = contentView.findViewById(R.id.micMusic);
ImageView micOn = contentView.findViewById(R.id.micOn);
micOff.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
});
micMusic.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
});
micOn.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
});
int[] vLoc = new int[2];
parent.getLocationInWindow(vLoc);
try {
micSetPopupWindow.showAsDropDown(parent,0, -ScreenUtil.dip2px(180),Gravity.CENTER_HORIZONTAL);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -23,6 +23,8 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.chwl.core.utils.ComboUtil;
import com.chwl.core.auth.AuthModel;
import com.example.lib_utils.UiUtils;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
@@ -89,6 +91,7 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
private int mScreenWidth;
private int mScreenHeight;
private Keyframe[] keyScale;
private Keyframe[] keyScaleCombo;
private Keyframe[] keyTrans;
private SvgaObjectPool mMagicViewPool;
@@ -126,6 +129,13 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
keyScale[4] = (Keyframe.ofFloat(0.5f, 2f));
keyScale[5] = (Keyframe.ofFloat(0.8f, 2f));
keyScale[6] = (Keyframe.ofFloat(1f, 1f));
keyScaleCombo = new Keyframe[4];
keyScaleCombo[0] = (Keyframe.ofFloat(0f, 0.25f));
keyScaleCombo[1] = (Keyframe.ofFloat(0.25f, 0.5f));
keyScaleCombo[2] = (Keyframe.ofFloat(0.5f, 0.75f));
keyScaleCombo[3] = (Keyframe.ofFloat(1f, 1f));
keyTrans = new Keyframe[3];
keyTrans[0] = (Keyframe.ofFloat(0f, 0));
keyTrans[1] = (Keyframe.ofFloat(0.2f, 0));
@@ -255,6 +265,14 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
}
Point senderPoint = micViewPoint.get(senderPosition);
Point receivePoint = micViewPoint.get(receivePosition);
// 连击 特殊动画
if (giftReceiveInfo.getUid() == AuthModel.get().getCurrentUid()){
if (ComboUtil.INSTANCE.isChangePoint()) {
senderPoint = ComboUtil.INSTANCE.getPoint();
}
}
//设置动画结束的位置
if (receivePoint == null || isGameRoomMoreThan6People()) { //这种情况就是接收者已经不在麦上
//礼物送到中间的位置
@@ -627,6 +645,7 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
return;
}
GiftInfo giftInfo = giftReceiveInfo.getGift();
giftInfo.uid = giftReceiveInfo.getUid();
if (giftInfo == null) {
return;
}
@@ -668,8 +687,24 @@ public class GiftV2View extends FrameLayout implements GiftEffectView.GiftEffect
PropertyValuesHolder p1 = PropertyValuesHolder.ofKeyframe("translationY", keyTrans[0], keyTrans[1], keyTrans[2], keyTransY3, keyTransY4, keyTransY5);
PropertyValuesHolder p2 = PropertyValuesHolder.ofKeyframe("scaleX", keyScale);
PropertyValuesHolder p3 = PropertyValuesHolder.ofKeyframe("scaleY", keyScale);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView, p2, p3, p1, p0);
objectAnimator.setDuration(4000);
PropertyValuesHolder p0c = PropertyValuesHolder.ofKeyframe("translationX", keyTrans[0], keyTransX5);
PropertyValuesHolder p1c = PropertyValuesHolder.ofKeyframe("translationY", keyTrans[0], keyTransY5);
PropertyValuesHolder p2c = PropertyValuesHolder.ofKeyframe("scaleX", keyScaleCombo);
PropertyValuesHolder p3c = PropertyValuesHolder.ofKeyframe("scaleY", keyScaleCombo);
long time;
ObjectAnimator objectAnimator;
// 连击 特殊动画
if (ComboUtil.INSTANCE.isChangePoint() && giftInfo.uid == AuthModel.get().getCurrentUid()){
objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView, p2c, p3c, p1c, p0c);
time = 600;
}else {
objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView, p2, p3, p1, p0);
time = 2000;
}
objectAnimator.setDuration(time);
objectAnimator.start();
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override

View File

@@ -2286,7 +2286,7 @@ public class MessageView extends FrameLayout {
})
.append(ResUtil.getString(R.string.gift_message_01), new ForegroundColorSpan(getResources().getColor(R.color.white)));
text.append(luckyGiftInfo.getGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
text.append(luckyGiftInfo.getFirstGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
.append(luckyGiftInfo.getUser().getNick(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {
@@ -2341,7 +2341,7 @@ public class MessageView extends FrameLayout {
})
.append(ResUtil.getString(R.string.gift_message_01), new ForegroundColorSpan(getResources().getColor(R.color.white)));
text.append(luckyGiftInfo.getGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
text.append(luckyGiftInfo.getFirstGiftName() + ResUtil.getString(R.string.gift_message_02), new ForegroundColorSpan(getResources().getColor(R.color.white)))
.append(luckyGiftInfo.getUser().getNick(), new ForegroundColorSpan(roomTipNickColor), new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {

View File

@@ -1442,6 +1442,7 @@ class RoomEffectView @JvmOverloads constructor(
enterRoomEffects = remoteExtension[UserInfo.ENTER_ROOM_EFFECTS] as String?
}
val wrapNick = "" + targetNicks[0].subAndReplaceDot(7) + "" + enterText
if (!TextUtils.isEmpty(enterRoomEffects)) {
playMemberInAnimByUrl(wrapNick, enterRoomEffects)
} else {
@@ -1495,7 +1496,11 @@ class RoomEffectView @JvmOverloads constructor(
private fun playMemberInAnim(text: String, svgaVideoEntity: SVGAVideoEntity) {
binding.roomMenberInSvga.visibility = VISIBLE
binding.roomMenberInSvga.loops = 1
if (svgaVideoEntity.frames == 1) {
binding.roomMenberInSvga.loops = 50
} else {
binding.roomMenberInSvga.loops = 1
}
binding.roomMenberInSvga.clearsAfterStop = true
val dynamicEntity = SVGADynamicEntity()
val textPaint = TextPaint()

View File

@@ -0,0 +1,118 @@
package com.chwl.app.avroom.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.customview.widget.ViewDragHelper;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
/**
* 侧滑FrameLayout
* 子View左滑删除右滑弹起后复位
*/
public class VDHLayout extends FrameLayout {
private final ViewDragHelper mDragHelper;
private final Point mAutoBackOriginPos = new Point();
private OnViewGoneListener listener;
public VDHLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(@NonNull View child, int pointerId) {
mAutoBackOriginPos.x = child.getLeft();
mAutoBackOriginPos.y = child.getTop();
return true;
}
/**
* view的left
*/
@Override
public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
return left;
}
/**
* view的top
*/
@Override
public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
return child.getTop();
}
//手指释放的时候回调
@Override
public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {
//mAutoBackView手指释放时可以自动回去
if (releasedChild.getLeft() < 0 && ((Math.abs(releasedChild.getLeft()) >= releasedChild.getMeasuredWidth() * 0.2))) {
releasedChild.setEnabled(false);
releasedChild.animate()
.setDuration(100L)
.translationX(-ScreenUtil.getDisplayWidth())
.alpha(0F)
.withEndAction(() -> {
releasedChild.setVisibility(GONE);
if(listener != null){
listener.onViewGone();
}
}).start();
} else {
mDragHelper.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y);
ViewCompat.postInvalidateOnAnimation(VDHLayout.this);
}
}
//在边界拖动时回调
@Override
public void onEdgeDragStarted(int edgeFlags, int pointerId) {
}
@Override
public int getViewHorizontalDragRange(@NonNull View child) {
return child.getMeasuredWidth();
}
});
mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return mDragHelper.shouldInterceptTouchEvent(event);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
mDragHelper.processTouchEvent(event);
return true;
}
@Override
public void computeScroll() {
if (mDragHelper.continueSettling(true)) {
invalidate();
}
}
public void setListener(OnViewGoneListener listener) {
this.listener = listener;
}
public interface OnViewGoneListener{
void onViewGone();
}
}

View File

@@ -28,6 +28,7 @@ import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -46,6 +47,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chwl.app.notify.GlobalNotifyManager;
import com.chwl.library.language.LanguageHelper;
import com.example.lib_utils.UiUtils;
import com.google.gson.Gson;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nimlib.sdk.NIMSDK;
@@ -236,6 +238,21 @@ public abstract class BaseActivity extends RxAppCompatActivity
}
}
public void initVipCenterBar(String title) {
mTitleBar = findViewById(R.id.title_bar);
if (mTitleBar != null) {
mTitleBar.setTitle(title);
mTitleBar.setImmersive(false);
mTitleBar.setTitleColor(getResources().getColor(R.color.color_FFE3AF));
mTitleBar.setLeftImageResource(R.drawable.vip_center_back_button);
mTitleBar.setBackgroundResource(R.color.transparent);
mTitleBar.setLeftClickListener(v -> onLeftClickListener());
if(UiUtils.INSTANCE.isRtl(context)){
mTitleBar.leftTextViewUpdateScaleXForRTL();
}
}
}
public void initWhiteTitleBar(String title) {
mTitleBar = findViewById(R.id.title_bar);
if (mTitleBar != null) {
@@ -248,6 +265,18 @@ public abstract class BaseActivity extends RxAppCompatActivity
}
}
public void initBlackTitleBar(String title) {
mTitleBar = findViewById(R.id.title_bar);
if (mTitleBar != null) {
mTitleBar.setTitle(title);
mTitleBar.setImmersive(false);
mTitleBar.setTitleColor(getResources().getColor(R.color.white));
mTitleBar.setLeftImageResource(R.drawable.icon_user_back);
mTitleBar.setBackgroundResource(R.color.transparent);
mTitleBar.setLeftClickListener(v -> onLeftClickListener());
}
}
public void initTitleBar(String title, TitleBar.Action action) {
mTitleBar = findViewById(R.id.title_bar);
if (mTitleBar != null) {

View File

@@ -17,7 +17,7 @@ import com.trello.rxlifecycle3.components.support.RxDialogFragment
import kotlinx.coroutines.launch
import java.lang.reflect.ParameterizedType
abstract class BaseDialog<T : ViewBinding> : RxDialogFragment() {
abstract class BaseDialogFragment<T : ViewBinding> : RxDialogFragment() {
val isViewLoaded: Boolean get() = _binding != null
protected var _binding: T? = null

View File

@@ -4,6 +4,8 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -18,6 +20,7 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.chwl.app.application.App;
import com.tbruyelle.rxpermissions2.RxPermissions;
import com.trello.rxlifecycle3.components.support.RxFragment;
import com.chwl.app.R;
@@ -585,17 +588,33 @@ public abstract class BaseFragment extends RxFragment implements KeyEvent.Callba
}
protected DialogManager getDialogManager() {
FragmentActivity activity = getActivity();
if (activity instanceof BaseMvpActivity) {
return ((BaseMvpActivity) activity).getDialogManager();
} else if (activity instanceof BaseActivity) {
return ((BaseActivity) activity).getDialogManager();
} else {
if (dialogManager == null) {
dialogManager = new DialogManager(activity);
try {
if (activity instanceof BaseMvpActivity) {
return ((BaseMvpActivity) activity).getDialogManager();
} else if (activity instanceof BaseActivity) {
return ((BaseActivity) activity).getDialogManager();
}
return dialogManager;
} catch (Exception e) {
e.printStackTrace();
}
Activity topActivity = App.gStack.getTopActivity();
if (dialogManager == null && topActivity != null) {
dialogManager = new DialogManager(topActivity);
}
FragmentActivity fragmentActivity = requireActivity();
if (dialogManager == null && fragmentActivity != null) {
dialogManager = new DialogManager(fragmentActivity);
}
if (dialogManager == null) {
dialogManager = new DialogManager(activity);
}
return dialogManager;
}
public BaseActivity getBaseActivity() {

View File

@@ -63,6 +63,10 @@ public class TitleBar extends ViewGroup implements View.OnClickListener {
private LayoutInflater mInflater;
public void leftTextViewUpdateScaleXForRTL() {
mLeftText.setScaleX(-1);
}
public TitleBar(Context context) {
super(context);
init(context);

View File

@@ -1,279 +0,0 @@
package com.chwl.app.common.dialog
import android.Manifest
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils
import android.view.Gravity
import android.view.Window
import android.view.WindowManager
import com.hjq.toast.ToastUtils
import com.chwl.app.R
import com.chwl.app.application.App
import com.chwl.app.databinding.PhotoDialogBinding
import com.chwl.app.ui.widget.dialog.CommonTipDialog
import com.chwl.library.common.base.BaseDialogFragment
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.util.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.common.util.PhotosCompressCallback
import com.chwl.library.easypermisssion.EasyPermissions
import kotlinx.coroutines.Job
/**
* 该对话框的功能提供拍摄和选择图片
*/
class PhotoDialog : BaseDialogFragment<PhotoDialogBinding>(), EasyPermissions.PermissionCallbacks {
private var mOnResultCallBack: OnResultCallBack? = null
private var mJob: Job? = null
companion object {
private const val PERMISSION_CODE_CAMERA = 100
private const val REQUEST_CODE_CAMERA = 101
private const val PERMISSION_CODE_STORAGE_1 = 200
private const val REQUEST_CODE_STORAGE_1 = 201
private const val PERMISSION_CODE_STORAGE_2 = 202
private const val REQUEST_CODE_STORAGE_2 = 203
private const val REQUEST_CODE_OPEN_PHOTO_PROVIDER = 103
private const val REQUEST_CODE_OPEN_CAMERA_PROVIDER = 104
}
override fun initBefore(savedInstanceState: Bundle?) {
super.initBefore(savedInstanceState)
dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE)
}
override fun setListener() {
binding?.tvTakePhoto?.setOnClickListener {
checkCameraPermission()
}
binding?.tvChoicePicture?.setOnClickListener {
checkStoragePermission1()
}
}
private fun initDialog() {
dialog?.window?.also {
it.decorView.setPadding(0, 0, 0, 0)
it.attributes = it.attributes.apply {
gravity = Gravity.BOTTOM
width = WindowManager.LayoutParams.MATCH_PARENT
}
it.setBackgroundDrawableResource(R.drawable.photo_dialog_bg)
}
}
override fun onStart() {
super.onStart()
initDialog()
}
private fun checkStoragePermission1() {
if (!EasyPermissions.hasPermissions(
App.gContext, if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE_1,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
}
}
private fun checkCameraPermission() {
if (!EasyPermissions.hasPermissions(
App.gContext,
Manifest.permission.CAMERA
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_camera_rationale),
PERMISSION_CODE_CAMERA,
Manifest.permission.CAMERA
)
} else {
checkStoragePermission2()
}
}
private fun checkStoragePermission2() {
if (!EasyPermissions.hasPermissions(
App.gContext, if (Build.VERSION.SDK_INT >= 33)
Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE_2,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
PhotoProvider.photoCamera(this, REQUEST_CODE_OPEN_CAMERA_PROVIDER)
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
}
override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_CAMERA) {
checkCameraPermission()
} else if (requestCode == PERMISSION_CODE_STORAGE_1) {
checkStoragePermission1()
} else if (requestCode == PERMISSION_CODE_STORAGE_2) {
checkStoragePermission2()
}
}
override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
if (requestCode == PERMISSION_CODE_STORAGE_1 || requestCode == PERMISSION_CODE_STORAGE_2 || requestCode == PERMISSION_CODE_CAMERA) {
val requestTip: String =
if (requestCode == PERMISSION_CODE_STORAGE_1 || requestCode == PERMISSION_CODE_STORAGE_2) {
getString(R.string.permission_storage_denied)
} else {
getString(R.string.permission_camera_denied)
}
val mPrivacyDialog = CommonTipDialog(context)
mPrivacyDialog.setTipMsg(requestTip)
mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update))
mPrivacyDialog.setOnActionListener(
object : CommonTipDialog.OnActionListener {
override fun onOk() {
//同意跳到应用详情页面
val packageUri =
Uri.parse("package:${activity?.packageName}")
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
packageUri
)
if (requestCode == PERMISSION_CODE_STORAGE_1) {
startActivityForResult(
intent, REQUEST_CODE_STORAGE_1
)
} else if (requestCode == PERMISSION_CODE_STORAGE_2) {
startActivityForResult(
intent,
REQUEST_CODE_STORAGE_2
)
} else {
startActivityForResult(
intent, REQUEST_CODE_CAMERA
)
}
}
override fun onCancel() {
super.onCancel()
//取消跳到应用详情页面
if (requestCode == PERMISSION_CODE_STORAGE_1 || requestCode == PERMISSION_CODE_STORAGE_2) {
ToastUtils.show(getString(R.string.permission_storage_refused))
} else {
ToastUtils.show(getString(R.string.permission_camera_refused))
}
}
}
)
mPrivacyDialog.show()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_STORAGE_1) {
checkStoragePermission1()
} else if (requestCode == REQUEST_CODE_STORAGE_2) {
checkStoragePermission2()
} else if (requestCode == REQUEST_CODE_CAMERA) {
checkCameraPermission()
} else
if (resultCode == RESULT_OK) {
when (requestCode) {
REQUEST_CODE_OPEN_CAMERA_PROVIDER -> {
if (mOnResultCallBack == null || data == null) return
PhotoProvider.getResultPathListAsync(data) { paths ->
val list = paths?.mapNotNull { it.path }?.toMutableList() ?: ArrayList()
val path = list[0]
if (!TextUtils.isEmpty(path)) {
mJob?.cancel()
mJob = PhotoCompressUtil.compress(
App.gContext,
path,
PhotoCompressUtil.getCompressCachePath(),
object : PhotoCompressCallback {
override fun onSuccess(compressedImg: String) {
mOnResultCallBack?.takePhotoCallBack(compressedImg)
}
override fun onFail(e: Throwable) {
mOnResultCallBack?.takePhotoCallBack(path)
}
})
} else {
mOnResultCallBack?.takePhotoCallBack(path)
}
}
}
REQUEST_CODE_OPEN_PHOTO_PROVIDER -> {
if (mOnResultCallBack == null || data == null) return
PhotoProvider.getResultPathListAsync(data) { list ->
val paths = list?.mapNotNull { it.path }?.toMutableList() ?: ArrayList()
if (paths.isEmpty()) {
mOnResultCallBack?.choicePhotoCallBack(paths)
} else {
mJob?.cancel()
mJob = PhotoCompressUtil.compress(
App.gContext,
paths,
PhotoCompressUtil.getCompressCachePath(),
object : PhotosCompressCallback {
override fun onSuccess(compressedImgList: ArrayList<String>) {
mOnResultCallBack?.choicePhotoCallBack(compressedImgList)
}
override fun onFail(e: Throwable) {
mOnResultCallBack?.choicePhotoCallBack(paths)
}
})
}
}
}
}
dismissAllowingStateLoss()
}
}
fun setOnResultCallBack(onResultCallBack: OnResultCallBack) {
mOnResultCallBack = onResultCallBack
}
override fun onWillDestroy() {
mJob?.cancel()
super.onWillDestroy()
}
interface OnResultCallBack {
fun takePhotoCallBack(path: String?)
fun choicePhotoCallBack(paths: List<String>?)
}
}

View File

@@ -6,10 +6,13 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.chwl.app.BuildConfig;
import com.chwl.app.application.App;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.utils.LogUtils;
import com.chwl.library.common.util.CoreUtils;
import com.netease.nim.uikit.common.util.log.LogUtil;
/**
* Activity生命周期工具类
@@ -27,6 +30,9 @@ public class AppLifeCycleHelper implements Application.ActivityLifecycleCallback
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (BuildConfig.DEBUG) {
LogUtils.d("当前Activity : "+ activity.getClass().getSimpleName());
}
if (++AppLifeCycleHelper.sActivityReferences == 1 && !AppLifeCycleHelper.sIsActivityChangingConfigurations) {
AppLifeCycleHelper.onForeground();

View File

@@ -0,0 +1,10 @@
package com.chwl.app.constants;
public @interface UserInfoConstants {
public @interface CpSet{
//1-cp头像是否展示2-cp动画
int cpAvatar = 1;
int cpAnim = 2;
}
}

View File

@@ -11,7 +11,15 @@ import com.chwl.app.databinding.ItemMyUserCardWearBinding;
import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
import com.chwl.core.decoration.headwear.bean.UserCardWearInfo;
import com.chwl.library.download.DownloadException;
import com.chwl.library.download.DownloadManager;
import com.chwl.library.download.DownloadRequest;
import com.chwl.library.download.DownloadTask;
import com.chwl.library.download.FileDownloadListener;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.PathHelper;
import java.io.File;
/**
* Created by huangmeng1 on 2018/5/11.
@@ -27,7 +35,24 @@ public class MyUserCardWearAdapter extends BaseAdapter<UserCardWearInfo> {
protected void convert(@NonNull BindingViewHolder helper, UserCardWearInfo item) {
super.convert(helper, item);
ItemMyUserCardWearBinding binding = (ItemMyUserCardWearBinding) helper.getBinding();
ImageLoadUtils.loadImage(mContext, item.getPic(), binding.ivUserCardWear);
binding.ivUserCardWearMp4.setLoop(Integer.MAX_VALUE);
String filePath = PathHelper.INSTANCE.generateResourcesFilePath(item.getPic());
DownloadRequest request = DownloadRequest.Companion.build(item.getPic(), filePath, "gift_effect_download", null, 60000L);
DownloadManager.INSTANCE.download(request, new FileDownloadListener() {
@Override
public void onDownloadCompleted(@NonNull DownloadTask task) {
String path = task.getRequest().getPath();
binding.ivUserCardWearMp4.startPlay(new File(path));
}
@Override
public void onDownloadError(@NonNull DownloadException exception) {
ImageLoadUtils.loadImage(mContext, item.getPic(), binding.ivUserCardWear);
}
});
helper.addOnClickListener(R.id.tv_used);
if (item.getLabelType() == HeadWearInfo.LABEL_TYPE_NORMAL) {

View File

@@ -93,18 +93,18 @@ public class MyUserCardWearFragment extends BaseBindingFragment<FrgMyDecorationC
String cardId = headWearInfo.isUsed() ? null : headWearInfo.getCardId();
wearVm.userHeadWear(cardId)
.compose(bindUntilEvent(FragmentEvent.DESTROY))
.doOnError(throwable -> {
toast(throwable.getMessage());
})
.subscribe(s -> {
for (int i = 0; i < shopAdapter.getData().size(); i++) {
shopAdapter.getData().get(i).setUsed(Objects.equals(cardId,shopAdapter.getData().get(i).getCardId()));
}
shopAdapter.notifyDataSetChanged();
//更新用户信息
UserModel.get().updateCurrentUserInfo().subscribe();
});
.compose(bindUntilEvent(FragmentEvent.DESTROY))
.doOnError(throwable -> {
toast(throwable.getMessage());
})
.subscribe(s -> {
for (int i = 0; i < shopAdapter.getData().size(); i++) {
shopAdapter.getData().get(i).setUsed(Objects.equals(cardId,shopAdapter.getData().get(i).getCardId()));
}
shopAdapter.notifyDataSetChanged();
//更新用户信息
UserModel.get().updateCurrentUserInfo().subscribe();
});
}
}

View File

@@ -129,9 +129,9 @@ class ConvertDiamondActivity : BaseViewBindingActivity<ActivityConvertDiamondBin
}
binding.tvConvert.setOnClickListener { view ->
if (binding.edDiamond.text.toString().toLong() < it.minDiamonds) {
if (binding.edGold.text.toString().toLong() < it.minDiamonds) {
toast(getString(R.string.convert_diamonds_01).format(it.minDiamonds))
} else if (binding.edDiamond.text.toString().toLong() > it.maxDiamonds) {
} else if (binding.edGold.text.toString().toLong() > it.maxDiamonds) {
toast(getString(R.string.convert_diamonds_02).format(it.minDiamonds))
} else {
//去掉小数凑整:不管小数是多少,都进一

View File

@@ -13,8 +13,8 @@ class HomeMessageViewModel : BaseViewModel() {
safeLaunch(needLoading = false, onError = {
topPublicChatMessageLiveData.postValue(BeanResult.failed(it))
}) {
val value = PublicChatModel.getTopMessage()
topPublicChatMessageLiveData.postValue(BeanResult.success(value ?: emptyList()))
// val value = PublicChatModel.getTopMessage()
// topPublicChatMessageLiveData.postValue(BeanResult.success(value ?: emptyList()))
}
}

View File

@@ -21,8 +21,8 @@ public class HomeIndicatorAdapter extends CommonNavigatorAdapter {
private final Context mContext;
private final List<? extends CharSequence> mTitleList;
private int textSize = 21;
private float minScale = 0.857f;
private int textSize = 20;
private float minScale = 0.8f;
private boolean showIndicator = true;
private OnItemSelectListener mOnItemSelectListener;
@@ -39,8 +39,8 @@ public class HomeIndicatorAdapter extends CommonNavigatorAdapter {
@Override
public IPagerTitleView getTitleView(Context context, final int i) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.color_990C1D18));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_0C1D18));
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.color_313131));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_313131));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = UIUtil.dip2px(context, 13);
@@ -62,7 +62,7 @@ public class HomeIndicatorAdapter extends CommonNavigatorAdapter {
indicator.setLineHeight(context.getResources().getDimensionPixelOffset(R.dimen.dp_4));
indicator.setRoundRadius(context.getResources().getDimensionPixelOffset(R.dimen.dp_2));
indicator.setLineWidth(context.getResources().getDimensionPixelOffset(R.dimen.dp_13));
indicator.setColors(context.getResources().getColor(R.color.color_002512));
indicator.setColors(context.getResources().getColor(R.color.color_e29030));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// lp.bottomMargin = mBottomMargin;
indicator.setLayoutParams(lp);

View File

@@ -1,9 +1,13 @@
package com.chwl.app.home.adapter
import android.graphics.Rect
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
@@ -11,14 +15,54 @@ import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadFromAssets
import com.chwl.core.home.bean.HomeRoomInfo
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
/**
* create by lvzebiao @2019/11/13
*/
class HomeRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_item_room) {
class HomeRoomAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_item_room) {
private var micUserItemViewPool = RecycledViewPool().apply {
setMaxRecycledViews(0, 50)
}
private val isRTL = UiUtils.isRtl(AppUtils.getApp())
override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return super.onCreateDefViewHolder(parent, viewType).apply {
val micUserRecyclerView = this.getView<RecyclerView>(R.id.recycler_view_users)
micUserRecyclerView.setOnTouchListener { v, event -> true }
micUserRecyclerView.setRecycledViewPool(micUserItemViewPool)
micUserRecyclerView.setHasFixedSize(true)
micUserRecyclerView.layoutManager =
LinearLayoutManager(parent.context, RecyclerView.HORIZONTAL, false).apply {
this.recycleChildrenOnDetach = true
this.isSmoothScrollbarEnabled
}
micUserRecyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
val offset = AppUtils.getApp().resources.getDimensionPixelOffset(R.dimen.dp_4) * -1
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val position = parent.getChildAdapterPosition(view)
if (position != 0) {
if (isRTL) {
outRect.right = offset
} else {
outRect.left = offset
}
}
}
})
micUserRecyclerView.adapter = HomeRoomUserAdapter()
}
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
@@ -28,18 +72,10 @@ class HomeRoomAdapter :
setText(R.id.tv_desc, item.roomDesc)
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isInvisible = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
val micUserRecyclerView = helper.getView<RecyclerView>(R.id.recycler_view_users)
val userAdapter = micUserRecyclerView.adapter as HomeRoomUserAdapter
userAdapter.setNewData(item.micUsers)
val topView = helper.getView<ImageView>(R.id.iv_top)
if (item.isHourTop1 == 1) {
topView.setImageResource(R.drawable.home_room_bg_hour_top)

View File

@@ -0,0 +1,16 @@
package com.chwl.app.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.core.home.bean.MicUsersBean
class HomeRoomUserAdapter :
BaseQuickAdapter<MicUsersBean, BaseViewHolder>(R.layout.home_item_room_user) {
override fun convert(helper: BaseViewHolder, item: MicUsersBean?) {
val avatarView = helper.getView<ImageView>(R.id.iv_avatar)
avatarView.loadAvatar(item?.avatar)
}
}

View File

@@ -1,58 +0,0 @@
package com.chwl.app.home.adapter
import android.text.style.ImageSpan
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.core.public_chat_hall.bean.PublicChatMessageBean
import com.netease.nim.uikit.api.NimUIKit
import com.netease.nim.uikit.business.session.emoji.MoonUtil
class PublicChatLaneAdapter(private val data: MutableList<PublicChatMessageBean>) :
RecyclerView.Adapter<BaseViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return BaseViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.public_chat_lane_item, null)
)
}
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
val item = getItem(position)
val textView = holder.getView<TextView>(R.id.tv_message)
MoonUtil.identifyFaceExpressionSmall(
NimUIKit.getContext(),
textView,
item?.content ?: "",
ImageSpan.ALIGN_CENTER
)
val avatarView = holder.getView<ImageView>(R.id.iv_avatar)
avatarView.loadAvatar(item?.fromAvatar ?: "")
}
override fun getItemCount(): Int {
return Int.MAX_VALUE
}
fun getRealItemCount(): Int {
return data.size
}
fun setNewData(list: List<PublicChatMessageBean>) {
data.clear()
data.addAll(list)
notifyDataSetChanged()
}
private fun getItem(position: Int): PublicChatMessageBean? {
if (data.isEmpty()) {
return null
}
return data[position % data.size]
}
}

View File

@@ -7,14 +7,14 @@ import android.view.WindowManager
import android.widget.ImageView
import androidx.core.view.isGone
import com.chwl.app.R
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogHelloMessageBinding
import com.chwl.app.ui.utils.load
import com.chwl.app.room_chat.activity.RoomMsgActivity
import com.chwl.core.channel_page.bean.HelloMessageInfo
import com.chwl.library.utils.ResUtil
class HelloMessageDialog : BaseDialog<DialogHelloMessageBinding>() {
class HelloMessageDialog : BaseDialogFragment<DialogHelloMessageBinding>() {
companion object {

View File

@@ -4,13 +4,13 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.WindowManager
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogNewUserHelloBinding
import com.chwl.app.ui.utils.load
import com.chwl.core.channel_page.bean.NewUserHelloInfo
import com.chwl.core.utils.extension.subAndReplaceDot
class NewUserHelloDialog : BaseDialog<DialogNewUserHelloBinding>() {
class NewUserHelloDialog : BaseDialogFragment<DialogNewUserHelloBinding>() {
companion object {

View File

@@ -3,12 +3,12 @@ package com.chwl.app.home.dialog
import android.annotation.SuppressLint
import android.os.Bundle
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.base.BaseDialog
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRecommendRoomBinding
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.core.home.bean.HomeRoomInfo
class RecommendRoomDialog : BaseDialog<DialogRecommendRoomBinding>() {
class RecommendRoomDialog : BaseDialogFragment<DialogRecommendRoomBinding>() {
companion object {

View File

@@ -19,7 +19,6 @@ import com.chwl.app.avroom.adapter.CommonVPAdapter
import com.chwl.app.base.BaseViewBindingFragment
import com.chwl.app.databinding.FragmentContactListBinding
import com.chwl.app.home.HomeMessageViewModel
import com.chwl.app.home.adapter.PublicChatLaneAdapter
import com.chwl.app.home.helper.AutoScrollTask
import com.chwl.app.public_chat.ui.message.PublicChatRoomMessageActivity
import com.chwl.app.support.FragmentVisibleStateHelper
@@ -42,7 +41,6 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
MainTabContentView {
private val viewModel: HomeMessageViewModel by activityViewModels()
private val publicChatAdapter = PublicChatLaneAdapter(ArrayList())
private val stateHelper = FragmentVisibleStateHelper(this).start {
onVisibleChanged(it)
@@ -64,7 +62,6 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
} else {
2
}
binding.recyclerViewPublicChat.scrollBy(x, 0)
}
override fun init() {
@@ -86,6 +83,8 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
tagList.add(getString(R.string.layout_fragment_contact_list_04))
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
commonNavigator.rightPadding = 20
commonNavigator.leftPadding = 20
val magicIndicatorAdapter = ContactsIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
binding.viewPager.currentItem = position
@@ -139,7 +138,7 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
}
override fun onScroll(
e1: MotionEvent,
e1: MotionEvent?,
e2: MotionEvent,
distanceX: Float,
distanceY: Float
@@ -151,7 +150,7 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
}
override fun onFling(
e1: MotionEvent,
e1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float
@@ -159,37 +158,20 @@ class ContactsListFragment : BaseViewBindingFragment<FragmentContactListBinding>
return true
}
})
binding.layoutPublicChat.singleClick {
PublicChatRoomMessageActivity.start(requireContext())
}
binding.recyclerViewPublicChat.setOnTouchListener { v, event ->
gestureDetectorCompat.onTouchEvent(event)
}
binding.recyclerViewPublicChat.layoutManager =
StaggeredGridLayoutManager(2, RecyclerView.HORIZONTAL)
binding.recyclerViewPublicChat.adapter = publicChatAdapter
viewModel.topPublicChatMessageLiveData.observe(this) {
val newList = it.data
if (it.isSuccess && !newList.isNullOrEmpty()) {
publicChatAdapter.setNewData(newList)
switchPublicChatMessageScrollState(stateHelper.isVisible)
}
binding.recyclerViewPublicChat.isVisible = (publicChatAdapter.getRealItemCount() > 0)
}
}
private fun switchPublicChatMessageScrollState(isVisible: Boolean) {
if (isVisible && publicChatAdapter.getRealItemCount() > 0) {
autoScrollTask.start()
} else {
autoScrollTask.stop()
}
// if (isVisible && publicChatAdapter.getRealItemCount() > 0) {
// autoScrollTask.start()
// } else {
// autoScrollTask.stop()
// }
}
private fun onVisibleChanged(isVisible: Boolean) {
switchPublicChatMessageScrollState(isVisible)
if (isVisible) {
viewModel.getTopPublicChatMessageIfNull()
}
// switchPublicChatMessageScrollState(isVisible)
// if (isVisible) {
// viewModel.getTopPublicChatMessageIfNull()
// }
}
}

View File

@@ -56,7 +56,7 @@ class HomeFragment : BaseViewBindingFragment<FragmentHomeBinding>(), View.OnClic
titleList.add(getString(R.string.main_tab_recommend))
titleList.add(getString(R.string.main_me))
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
commonNavigator.setTitleWrapContent(true)
val magicIndicatorAdapter = HomeIndicatorAdapter(context, titleList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
binding.viewPager.currentItem = position

View File

@@ -198,7 +198,7 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
override fun createFragment(position: Int): Fragment {
val itemId = getItemId(position)
return HomeTabRoomFragment.newInstance(itemId.toInt()).apply {
autoRefreshOnVisible = true
this.autoRefreshOnVisible = true
}
}

View File

@@ -1,7 +1,6 @@
package com.chwl.app.home.fragment
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager

View File

@@ -16,6 +16,8 @@ import com.chwl.app.UIHelper
import com.chwl.app.application.IReportConstants
import com.chwl.app.application.ReportManager
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.avroom.dialog.RoomNotifyCpBindDialog
import com.chwl.app.avroom.dialog.RoomNotifyLevelUpDialog
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseFragment
import com.chwl.app.databinding.FragmentMeBinding
@@ -35,9 +37,10 @@ import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.wallet.WalletActivity
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.view.GenderAgeTextView
import com.chwl.app.vip.VipMainActivity
import com.chwl.app.vip.VipCenterActivity
import com.chwl.app.vip.VipViewModel
import com.chwl.core.auth.AuthModel
import com.chwl.core.gift.bean.CpMsgBean
import com.chwl.core.initial.InitialModel
import com.chwl.core.level.UserLevelVo
import com.chwl.core.manager.IMNetEaseManager
@@ -318,11 +321,12 @@ class MeFragment : BaseFragment(), View.OnClickListener {
override fun onClick(v: View) {
when (v.id) {
R.id.iv_user_head, R.id.rl_user_info ->
R.id.iv_user_head, R.id.rl_user_info ->{
mUserInfo?.let { UIHelper.showUserInfoAct(mContext, it.uid) }
R.id.iv_edit ->
mUserInfo?.let { UIHelper.showUserInfoModifyAct(mContext, it.uid) }
}
//
// R.id.iv_edit ->
// mUserInfo?.let { UIHelper.showUserInfoModifyAct(mContext, it.uid) }
R.id.ll_user_attentions -> startActivity(
Intent(
@@ -353,7 +357,7 @@ class MeFragment : BaseFragment(), View.OnClickListener {
}
R.id.iv_vip -> {
VipMainActivity.start(mContext)
VipCenterActivity.start(mContext)
//进入贵族中心埋点
val goldWalletInfo = PayModel.get().currentWalletInfo
val map = HashMap<String, Any>(5)

View File

@@ -15,7 +15,7 @@ import com.chwl.core.room.bean.RoomInfo;
public class NotificationClickReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//todo 跳转之前要处理的逻辑
//TODO 跳转之前要处理的逻辑
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo != null) {
AVRoomActivity.start(context, roomInfo.getUid());

View File

@@ -4,7 +4,11 @@ import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.widget.ImageView.ScaleType
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
@@ -16,10 +20,14 @@ import com.chwl.app.ui.utils.load
import com.chwl.app.ui.widget.dialog.CommonTipDialog
import com.chwl.core.file.FileModel
import com.chwl.core.home.bean.FeedbackTypeBean
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.MyUriUtils
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.photo.PhotoProvider.photoProvider
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.common.util.PhotosCompressCallback
import com.chwl.library.common.util.SPUtils
import com.chwl.library.constants.ConstantsLib
import com.chwl.library.easypermisssion.EasyPermissions
import com.chwl.library.easyphoto.utils.settings.SettingsUtils
import com.chwl.library.utils.ResUtil
@@ -35,6 +43,7 @@ import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent
import com.hjq.toast.ToastUtils
import com.netease.nim.uikit.StatusBarUtil
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@@ -52,6 +61,21 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
private var imagePath: String? = null
private var imageUrl: String? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) {
pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
uri?.let {
val file = MyUriUtils.copyFile(this,uri)
if (file != null) {
compressPhotos(mutableListOf(file.path))
}
}
}
}
}
override fun init() {
initWhiteTitleBar(ResUtil.getString(R.string.feedback_title))
initView()
@@ -262,26 +286,37 @@ class FeedbackActivity : BaseViewBindingActivity<FeedbackActivityBinding>(),
}
private fun checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
photoProvider(
this,
1,
true,
REQUEST_CODE_OPEN_PHOTO_PROVIDER,
true,
true
)
if (Build.VERSION.SDK_INT >= 33){
DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener {
override fun doCancelAction() {
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
})
}else{
if (!EasyPermissions.hasPermissions(
this,Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
photoProvider(
this,
1,
true,
REQUEST_CODE_OPEN_PHOTO_PROVIDER,
true,
true
)
}
}
}

View File

@@ -0,0 +1,202 @@
package com.chwl.app.ui.game_team.invite
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.Gravity
import android.view.WindowManager
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.chwl.app.R
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.databinding.GameTeamInviteDialogBinding
import com.chwl.app.ui.pay.ChargeActivity
import com.chwl.app.ui.utils.load
import com.chwl.core.game_team.UserGameTeamInfo
import com.chwl.core.pay.PayModel
import com.chwl.core.pay.bean.WalletInfo
import com.chwl.core.utils.net.BalanceNotEnoughExeption
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.SingleToastUtil
import com.example.lib_utils.ktx.singleClick
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.math.BigDecimal
import java.math.RoundingMode
class GameTeamInviteDialog : BaseDialogFragment<GameTeamInviteDialogBinding>() {
private val viewModel: GameTeamInviteViewModel by viewModels()
override var width = WindowManager.LayoutParams.MATCH_PARENT
override var gravity = Gravity.CENTER
private var gameId: Long = 0
private var gameUid: Long = 0
private var gameBackground: String? = null
private var gamePrice: Long = 0
private var gameInning: Long = 1
private var dialogManager: DialogManager? = null
var successListener: (() -> Unit)? = null
companion object {
fun newInstance(info: UserGameTeamInfo): GameTeamInviteDialog {
return newInstance(info.uid ?: 0, info.gameId ?: 0, info.pic, info.price ?: 0, 1)
}
fun newInstance(
targetUid: Long,
gameId: Long,
gameBackground: String?,
gamePrice: Long,
gameInning: Long,
): GameTeamInviteDialog {
return GameTeamInviteDialog().apply {
arguments = Bundle().apply {
putLong("targetUid", targetUid)
putLong("gameId", gameId)
putSerializable("gameBackground", gameBackground)
putLong("gamePrice", gamePrice)
putLong("gameInning", gameInning)
}
}
}
}
override fun init() {
gameUid = arguments?.getLong("targetUid") ?: 0
gameId = arguments?.getLong("gameId") ?: 0
gameBackground = arguments?.getString("gameBackground")
gamePrice = arguments?.getLong("gamePrice") ?: 0
gameInning = arguments?.getLong("gameInning") ?: 1
dialogManager = DialogManager(requireContext())
initView()
initEvent()
initObserve()
}
override fun onResume() {
super.onResume()
updateBalance()
}
private fun initView() {
binding.ivGameImage.load(gameBackground)
updateInning(0)
requestBalance()
}
private fun initEvent() {
binding.ivClose.setOnClickListener {
safeDismiss()
}
binding.tvPay.singleClick {
pay()
}
binding.layoutRecharge.setOnClickListener {
ChargeActivity.start(context)
}
binding.ivCountAdd.setOnClickListener {
updateInning(1)
}
binding.ivCountSubtract.setOnClickListener {
updateInning(-1)
}
}
private fun initObserve() {
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.payResultFlow.collectLatest {
dialogManager?.dismissDialog()
if (it.isSuccess) {
successListener?.invoke()
SingleToastUtil.showToast(R.string.game_team_19)
safeDismiss()
} else if (it.code == BalanceNotEnoughExeption.code) {
showBalanceNotEnoughDialog()
} else {
it.message?.let { msg ->
SingleToastUtil.showToast(msg)
}
}
}
}
}
}
private fun showBalanceNotEnoughDialog() {
dialogManager?.showOkCancelDialog(
ResUtil.getString(R.string.widget_dialog_dialoguihelper_04),
ResUtil.getString(R.string.treasure_to_charge)
) {
ChargeActivity.start(context)
}
}
private fun pay() {
dialogManager?.showProgressDialog(requireContext())
viewModel.pay(gameId, gameUid, gameInning)
}
private fun updateInning(add: Int) {
var newInning = gameInning + add
if (newInning <= 0) {
newInning = 1
}
gameInning = newInning
if (gameInning <= 1L) {
binding.ivCountSubtract.setImageResource(R.drawable.game_team_invite_ic_subtract_disabled)
binding.ivCountSubtract.isEnabled = false
} else {
binding.ivCountSubtract.setImageResource(R.drawable.game_team_invite_ic_subtract)
binding.ivCountSubtract.isEnabled = true
}
binding.tvCount.text = gameInning.toString()
updateMoney()
}
private fun updateMoney() {
val total = gamePrice * gameInning
binding.tvMoney.text = total.toString()
}
@SuppressLint("SetTextI18n")
private fun updateBalance() {
if (_binding == null) {
return
}
val balanceTitle = getString(R.string.gift_wallet_overage)
val balanceValue = PayModel.get().currentWalletInfo?.diamondNum ?: 0.0
var balanceBigDecimal = BigDecimal.valueOf(balanceValue)
balanceBigDecimal = balanceBigDecimal.setScale(0, RoundingMode.DOWN)
binding.tvBalance.text = "$balanceTitle${balanceBigDecimal.toPlainString()}"
}
@SuppressLint("CheckResult")
private fun requestBalance() {
PayModel.get().myRemoteWalletInfo.compose<WalletInfo>(bindToLifecycle())
.subscribe { info: WalletInfo ->
updateBalance()
}
}
override fun onDestroyView() {
super.onDestroyView()
dialogManager?.dismissDialog()
dialogManager = null
}
override fun onDestroy() {
super.onDestroy()
successListener = null
}
}

View File

@@ -0,0 +1,22 @@
package com.chwl.app.ui.game_team.invite
import com.chwl.app.base.BaseViewModel
import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.response.BeanResult
import com.chwl.core.room.game.GameModel
import kotlinx.coroutines.flow.MutableSharedFlow
class GameTeamInviteViewModel : BaseViewModel() {
var payResultFlow = MutableSharedFlow<BeanResult<Any>>()
fun pay(gameId: Long, gameUid: Long, inning: Long) {
safeLaunch(onError = {
payResultFlow.emit(BeanResult.failed(it))
}) {
val result =
GameModel.startGameTeam(gameId, gameUid, inning, AuthModel.get().currentUid)
payResultFlow.emit(BeanResult.success(result))
}
}
}

View File

@@ -0,0 +1,63 @@
package com.chwl.app.ui.game_team.record
import android.content.Context
import android.content.Intent
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.chwl.app.R
import com.chwl.app.avroom.adapter.CommonVPAdapter
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.databinding.GameTeamRecordActivityBinding
import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.chwl.library.utils.ResUtil
import com.netease.nim.uikit.StatusBarUtil
class GameTeamRecordActivity : BaseViewBindingActivity<GameTeamRecordActivityBinding>() {
companion object {
fun start(context: Context) {
context.startActivity(Intent(context, GameTeamRecordActivity::class.java))
}
}
override fun init() {
initWhiteTitleBar(ResUtil.getString(R.string.game_team_09))
initTab()
}
private fun initTab() {
val fragmentList = ArrayList<Fragment>()
fragmentList.add(GameTeamRecordFragment.newInstance(GameTeamRecordFragment.TYPE_INITIATOR))
fragmentList.add(GameTeamRecordFragment.newInstance(GameTeamRecordFragment.TYPE_RECEIVER))
val titleList = ArrayList<String>()
titleList.add(getString(R.string.game_team_10))
titleList.add(getString(R.string.game_team_11))
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
val magicIndicatorAdapter = GameTeamRecordIndicatorAdapter(context, titleList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
binding.viewPager.currentItem = position
}
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.navigator = commonNavigator
binding.viewPager.offscreenPageLimit = 2
binding.viewPager.adapter = CommonVPAdapter(
supportFragmentManager,
lifecycle,
fragmentList
)
binding.viewPager.isUserInputEnabled = false
ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager)
}
override fun needSteepStateBar(): Boolean {
return true
}
override fun setStatusBar() {
super.setStatusBar()
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
}
}

View File

@@ -0,0 +1,38 @@
package com.chwl.app.ui.game_team.record
import android.view.View
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.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadAvatar
import com.chwl.core.game_team.GameTeamRecordBean
class GameTeamRecordAdapter :
BaseQuickAdapter<GameTeamRecordBean, BaseViewHolder>(R.layout.game_team_record_item) {
var isInitiator = false
override fun convert(helper: BaseViewHolder, item: GameTeamRecordBean?) {
helper.addOnClickListener(R.id.tv_repurchase, R.id.tv_chat, R.id.iv_order_id_copy)
val userAvatarView = helper.getView<ImageView>(R.id.iv_user_avatar)
val repurchaseView = helper.getView<View>(R.id.tv_repurchase)
if (isInitiator) {
repurchaseView.isVisible = true
helper.setText(R.id.tv_user_name, item?.toNick ?: "")
helper.setText(R.id.tv_user_id, item?.toErBanNo?.toString() ?: "")
userAvatarView.load(item?.toAvatar)
} else {
repurchaseView.isVisible = false
helper.setText(R.id.tv_user_name, item?.fromNick ?: "")
helper.setText(R.id.tv_user_id, item?.fromErBanNo?.toString() ?: "")
userAvatarView.load(item?.fromAvatar)
}
helper.setText(R.id.tv_game_name, item?.gameName ?: "")
helper.setText(R.id.tv_order_money, item?.amount?.toString())
helper.setText(R.id.tv_order_time, item?.orderTime)
helper.setText(R.id.tv_order_id, item?.orderNo)
}
}

View File

@@ -0,0 +1,154 @@
package com.chwl.app.ui.game_team.record
import android.os.Bundle
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingFragment
import com.chwl.app.common.EmptyViewHelper
import com.chwl.app.databinding.GameTemaRecordFragmentBinding
import com.chwl.app.ui.game_team.invite.GameTeamInviteDialog
import com.chwl.app.ui.im.avtivity.NimP2PMessageActivity
import com.chwl.app.ui.utils.RVDelegate
import com.chwl.app.utils.ClipboardUtils
import com.chwl.core.game_team.GameTeamRecordBean
import com.chwl.library.utils.SingleToastUtil
class GameTeamRecordFragment : BaseViewBindingFragment<GameTemaRecordFragmentBinding>() {
companion object {
const val TYPE_INITIATOR = 0
const val TYPE_RECEIVER = 1
fun newInstance(type: Int): GameTeamRecordFragment {
return GameTeamRecordFragment().apply {
arguments = Bundle().apply {
putInt("type", type)
}
}
}
}
private val viewModel: GameTeamRecordViewModel by viewModels()
private val adapter = GameTeamRecordAdapter()
private var type: Int = TYPE_INITIATOR
private var rvDelegate: RVDelegate<GameTeamRecordBean>? = null
private var pageNum = 1
private val pageSize = 20
override fun init() {
type = arguments?.getInt("type", TYPE_INITIATOR) ?: TYPE_INITIATOR
initView()
initEvent()
initObserve()
binding.swipeRefresh.isRefreshing = true
loadData(true)
}
private fun initView() {
adapter.isInitiator = type == TYPE_INITIATOR
binding.recyclerView.adapter = adapter
rvDelegate = RVDelegate.Builder<GameTeamRecordBean>()
.setPageSize(pageSize)
.setAdapter(adapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(
EmptyViewHelper.createEmptyTextViewHeight(
context,
getString(R.string.data_empty)
)
)
.setLayoutManager(LinearLayoutManager(mContext))
.build()
}
private fun initEvent() {
adapter.setOnItemChildClickListener { adapter, view, position ->
val item = (adapter.getItem(position) as? GameTeamRecordBean)
?: return@setOnItemChildClickListener
when (view.id) {
R.id.tv_repurchase -> {
jumpRepurchase(item)
}
R.id.tv_chat -> {
jumpChat(item)
}
R.id.iv_order_id_copy -> {
ClipboardUtils.copyText(item.orderNo ?: "")
toast(getString(R.string.have_copy))
}
}
}
binding.swipeRefresh.setOnRefreshListener {
loadData(true)
}
adapter.setOnLoadMoreListener({
loadData(false)
}, binding.recyclerView)
}
private fun initObserve() {
viewModel.listLiveData.observe(this) {
binding.swipeRefresh.isRefreshing = false
rvDelegate?.loadData(it)
if (!it.isSuccess && it.message != null) {
toast(it.message)
}
}
}
private fun jumpRepurchase(item: GameTeamRecordBean) {
val uid = getTargetUidByItem(item)
val gameId = item.gameId
val gameBackground = item.gamePic
val gamePrice = item.price ?: 0
val gameInning = item.inning ?: 1
if (uid == null || gameId == null) {
toast(R.string.data_parsing_exception)
return
}
GameTeamInviteDialog.newInstance(
targetUid = uid,
gameId = gameId,
gameBackground = gameBackground,
gamePrice = gamePrice,
gameInning = gameInning
).apply {
this.successListener = {
loadData(true)
}
}.safeShow(requireActivity().supportFragmentManager, requireActivity())
}
private fun jumpChat(item: GameTeamRecordBean) {
val targetUid = getTargetUidByItem(item)?.toString()
if (targetUid.isNullOrEmpty()) {
return
}
NimP2PMessageActivity.start(requireContext(), targetUid)
}
private fun getTargetUidByItem(item: GameTeamRecordBean): Long? {
val targetUid = if (type == TYPE_INITIATOR) {
item.toUid
} else {
item.fromUid
}
return targetUid
}
private fun loadData(isRefresh: Boolean) {
if (isRefresh) {
pageNum = 1
} else {
pageNum++
}
viewModel.getRecordList(type, pageNum, pageSize)
}
}

View File

@@ -0,0 +1,103 @@
package com.chwl.app.ui.game_team.record;
import android.content.Context;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.chwl.app.R;
import com.chwl.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import java.util.List;
public class GameTeamRecordIndicatorAdapter extends CommonNavigatorAdapter {
private final Context mContext;
private final List<? extends CharSequence> mTitleList;
private int textSize = 14;
private float minScale = 1f;
private boolean showIndicator = true;
private OnItemSelectListener mOnItemSelectListener;
public GameTeamRecordIndicatorAdapter(Context context, List<? extends CharSequence> charSequences) {
this.mContext = context;
this.mTitleList = charSequences;
}
@Override
public int getCount() {
return mTitleList == null ? 0 : mTitleList.size();
}
@Override
public IPagerTitleView getTitleView(Context context, final int i) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.color_66000000));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_000000));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = UIUtil.dip2px(context, 13);
scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
scaleTransitionPagerTitleView.setText(mTitleList.get(i));
scaleTransitionPagerTitleView.setOnClickListener(view -> {
if (mOnItemSelectListener != null) {
mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView);
}
});
return scaleTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
indicator.setLineHeight(context.getResources().getDimensionPixelOffset(R.dimen.dp_3));
indicator.setRoundRadius(context.getResources().getDimensionPixelOffset(R.dimen.dp_2));
indicator.setLineWidth(context.getResources().getDimensionPixelOffset(R.dimen.dp_13));
indicator.setColors(context.getResources().getColor(R.color.color_0FCA81));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// lp.bottomMargin = mBottomMargin;
indicator.setLayoutParams(lp);
return indicator;
}
public int getTextSize() {
return textSize;
}
public void setTextSize(int textSize) {
this.textSize = textSize;
}
public float getMinScale() {
return minScale;
}
public void setMinScale(float minScale) {
this.minScale = minScale;
}
public boolean isShowIndicator() {
return showIndicator;
}
public void setShowIndicator(boolean showIndicator) {
this.showIndicator = showIndicator;
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position, TextView view);
}
}

View File

@@ -0,0 +1,23 @@
package com.chwl.app.ui.game_team.record
import androidx.lifecycle.MutableLiveData
import com.chwl.app.base.BaseViewModel
import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.response.ListResult
import com.chwl.core.game_team.GameTeamRecordBean
import com.chwl.core.room.game.GameModel
class GameTeamRecordViewModel : BaseViewModel() {
val listLiveData = MutableLiveData<ListResult<GameTeamRecordBean>>()
fun getRecordList(type: Int, pageNum: Int, pageSize: Int) {
safeLaunch(onError = {
listLiveData.postValue(ListResult.failed(pageNum, it))
}) {
val list =
GameModel.getGameTeamRecordList(type, pageNum, pageSize, AuthModel.get().currentUid)
listLiveData.postValue(ListResult.success(list, pageNum))
}
}
}

View File

@@ -71,6 +71,11 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
*/
public boolean isSuperLuckyGift;
/**
* 礼物名称
*/
public String giftName;
public GiftInfoVm(Context context, GiftInfo data, boolean select, boolean isKnap) {
super(context, data);
this.isSelect.set(select);
@@ -110,6 +115,7 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
SimpleVipInfo vipInfo = data.getGiftVipInfo();
isLocked = vipInfo != null && VipHelper.getMyVipLevel() < vipInfo.getVipLevel();
vipIcon = vipInfo == null ? "" : vipInfo.getVipIcon();
giftName = data.getFirstGiftName();
}
@Override

View File

@@ -5,8 +5,10 @@ import android.content.Context;
import com.chwl.app.community.holder.DynamicSysHolder;
import com.chwl.app.community.im.WorldDynamicShareViewHolder;
import com.chwl.app.module_hall.im.msgholder.FamilyMsgViewHolder;
import com.chwl.app.ui.im.chat.GameTeamInviteViewHolder;
import com.chwl.core.community.attachment.DynamicSysAttachment;
import com.chwl.core.community.im.WorldDynamicAttachment;
import com.chwl.core.im.custom.bean.GameTeamInviteAttachment;
import com.chwl.core.module_hall.im.FamilyAttachment;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.api.model.contact.ContactEventListener;
@@ -169,6 +171,9 @@ public class ImInitHelper {
// 客服充值
NimUIKit.registerMsgItemViewHolder(P2PContactRechargeAttachment.class, MsgViewHolderP2PContactRecharge.class);
// 游戏组队 - 邀请
NimUIKit.registerMsgItemViewHolder(GameTeamInviteAttachment.class, GameTeamInviteViewHolder.class);
NimUIKit.setSessionListener(listener);
NimUIKit.setContactEventListener(listener1);
}

View File

@@ -8,6 +8,8 @@ import com.chwl.app.decoration.view.DecorationStoreActivity;
import com.chwl.app.earn.activity.EarnRecordActivity;
import com.chwl.app.pay.activity.GiveGoldActivity;
import com.chwl.app.ui.feedback.FeedbackActivity;
import com.chwl.app.ui.game_team.record.GameTeamRecordActivity;
import com.chwl.app.vip.VipCenterActivity;
import com.chwl.core.module_hall.hall.bean.H5FamilyInfo;
import com.chwl.core.module_hall.hall.bean.UserClanInfo;
import com.trello.rxlifecycle3.components.support.RxAppCompatActivity;
@@ -37,7 +39,6 @@ import com.chwl.app.ui.pay.ChargeActivity;
import com.chwl.app.ui.setting.ModifyPwdActivity;
import com.chwl.app.ui.user.activity.UserInfoActivity;
import com.chwl.app.ui.webview.CommonWebViewActivity;
import com.chwl.app.vip.VipMainActivity;
import com.chwl.core.DemoCache;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.community.event.SquareTaskEvent;
@@ -215,7 +216,7 @@ public class RouterHandler {
ModifyPwdActivity.start(context, ModifyPwdActivity.LOGIN_PWD);
break;
case RouterType.VIP_MAIN:
VipMainActivity.start(context);
VipCenterActivity.start(context);
break;
case RouterType.CP_INVITE:
CpInviteRecordActivity.Companion.start(context, false);
@@ -293,6 +294,12 @@ public class RouterHandler {
case RouterType.MY_DONATION:
GiveGoldActivity.Companion.start(context);
break;
case RouterType.GAME_TEAM_RECORD:
GameTeamRecordActivity.Companion.start(context);
break;
case RouterType.MY_DRESS_ITEM:
MyDecorationActivity.start(context, 0);
break;
default:
SingleToastUtil.showToast(ResUtil.getString(R.string.ui_im_routerhandler_07));
return false;

View File

@@ -0,0 +1,118 @@
package com.chwl.app.ui.im.chat
import android.content.Context
import android.graphics.Color
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.Keep
import com.chwl.app.R
import com.chwl.app.ui.utils.load
import com.chwl.core.im.custom.bean.GameTeamInviteAttachment
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.shape.CornerFamily
import com.google.android.material.shape.ShapeAppearanceModel
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter
@Keep
class GameTeamInviteViewHolder(adapter: BaseMultiItemFetchLoadAdapter<*, *>) :
MsgViewHolderBase(adapter) {
private val isRTL = UiUtils.isRtl(AppUtils.getApp())
private val leftShapeAppearance: ShapeAppearanceModel by lazy(LazyThreadSafetyMode.NONE) {
buildBackgroundShapeAppearance(context ?: AppUtils.getApp(), true)
}
private val rightShapeAppearance: ShapeAppearanceModel by lazy(LazyThreadSafetyMode.NONE) {
buildBackgroundShapeAppearance(context ?: AppUtils.getApp(), false)
}
override fun getContentResId(): Int {
return R.layout.layout_msg_view_holder_game_team_invite
}
override fun inflateContentView() {
}
override fun leftBackground(): Int {
return R.color.transparent
}
override fun rightBackground(): Int {
return R.color.transparent
}
override fun bindContentView() {
val attachment = message?.attachment as? GameTeamInviteAttachment
val data = attachment?.msgData
val gameNameView = findViewById<TextView>(R.id.tv_game_name)
val gameInningView = findViewById<TextView>(R.id.tv_game_inning)
val gameIconView = findViewById<ImageView>(R.id.iv_icon)
val gameBackgroundView = findViewById<ShapeableImageView>(R.id.iv_image)
val gameBackgroundMaskView = findViewById<ShapeableImageView>(R.id.iv_image_mask)
val shapeAppearance = getBackgroundShapeAppearance()
gameBackgroundView.shapeAppearanceModel = shapeAppearance
gameBackgroundMaskView.shapeAppearanceModel = shapeAppearance
gameNameView.text = data?.gameName ?: ""
gameInningView.text =
context?.getString(R.string.game_team_18)?.format(data?.inning?.toString() ?: "0") ?: ""
gameIconView.load(data?.gameLogo)
gameBackgroundView.load(data?.gamePic, defaultRes = R.color.color_33000000)
}
private fun getBackgroundShapeAppearance(): ShapeAppearanceModel {
return if (isReceivedMessage) {
if (isRTL) {
rightShapeAppearance
} else {
leftShapeAppearance
}
} else {
if (isRTL) {
leftShapeAppearance
} else {
rightShapeAppearance
}
}
}
private fun buildBackgroundShapeAppearance(
context: Context,
isLeft: Boolean
): ShapeAppearanceModel {
val cornerA = context.resources.getDimension(R.dimen.dp_12)
val cornerB = context.resources.getDimension(R.dimen.dp_2)
val topLeftCorner: Float
val topRightCorner: Float
if (isLeft) {
topLeftCorner = cornerB
topRightCorner = cornerA
} else {
topLeftCorner = cornerA
topRightCorner = cornerB
}
return ShapeAppearanceModel.Builder().apply {
this.setTopLeftCorner(
CornerFamily.ROUNDED,
topLeftCorner
)
this.setTopRightCorner(
CornerFamily.ROUNDED,
topRightCorner
)
this.setBottomLeftCorner(
CornerFamily.ROUNDED,
cornerA
)
this.setBottomRightCorner(
CornerFamily.ROUNDED,
cornerA
)
}.build()
}
}

View File

@@ -79,9 +79,9 @@ public abstract class RecentViewHolder extends RecyclerViewHolder<BaseQuickAdapt
protected void updateBackground(NIMBaseViewHolder holder, RecentContact recent, int position) {
if ((recent.getTag() & RecentContactsFragment.RECENT_TAG_STICKY) == 0) {
holder.getConvertView().setBackgroundResource(R.color.transparent);
// holder.getConvertView().setBackgroundResource(R.drawable.shape_white_10dp_round);
} else {
holder.getConvertView().setBackgroundResource(R.color.transparent);
holder.getConvertView().setBackgroundResource(R.drawable.shape_white_10dp_round);
}
}

View File

@@ -14,6 +14,7 @@ import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener
import com.chwl.app.databinding.ActivitySettingBinding
import com.chwl.app.notify.RoomNotifyManager
import com.chwl.app.ui.debug.DebugActivity
import com.chwl.app.ui.game_team.record.GameTeamRecordActivity
import com.chwl.app.ui.im.avtivity.BlackListManageActivity
import com.chwl.app.ui.language.LanguageActivity
import com.chwl.app.ui.login.BindPhoneActivity
@@ -222,8 +223,8 @@ class SettingActivity : BaseViewBindingActivity<ActivitySettingBinding>(), View.
}
private fun debug() {
startActivity(Intent(this, DebugActivity::class.java))
// CommonWebViewActivity.start(this,"https://api.molistar.xyz/molistar/activity/2024-invitationFission/index.html")
startActivity(Intent(this, GameTeamRecordActivity::class.java))
// CommonWebViewActivity.start(this,"http://beta.api.molistar.xyz/molistar/modules/order/index.html")
// PublicChatRoomMessageActivity.start(this)
// MyDecorationActivity.start(this,0)
}

View File

@@ -37,10 +37,12 @@ enum class PermissionEntity(
STORAGE(
ResUtil.getString(R.string.setting_bean_permissionentity_011), ResUtil.getString(R.string.setting_bean_permissionentity_012), R.drawable.icon_permission_storage,
arrayOf(
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.READ_EXTERNAL_STORAGE
)
);
companion object {
fun fetchPermission(name: String): PermissionEntity? {
if (CoreTextUtils.isEmptyText(name)) return null

View File

@@ -0,0 +1,192 @@
package com.chwl.app.ui.user.activity
import android.content.Context
import android.content.Intent
import android.view.View
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.base.TitleBar
import com.chwl.app.base.TitleBar.ImageAction
import com.chwl.app.common.EmptyViewHelper
import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener
import com.chwl.app.databinding.ActivityUserCpListBinding
import com.chwl.app.ui.user.adapter.UserCpListAdapter
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.core.UriProvider
import com.chwl.core.bean.response.ServiceResult
import com.chwl.core.user.bean.UserCPListBean
import com.chwl.core.utils.LogUtils
import com.chwl.core.utils.net.DontWarnObserver
import com.chwl.core.utils.net.RxHelper
import com.chwl.library.net.rxnet.RxNet
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.ktx.getString
import com.google.gson.JsonElement
import com.hjq.toast.ToastUtils
import com.netease.nim.uikit.StatusBarUtil
import com.trello.rxlifecycle3.android.ActivityEvent
import io.reactivex.Single
import io.reactivex.SingleObserver
import io.reactivex.disposables.Disposable
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
class UserCpListActivity : BaseViewBindingActivity<ActivityUserCpListBinding>() {
lateinit var mAdapter : UserCpListAdapter
var mPageNum = 1;
var mPageSize = 20;
companion object{
fun start(context: Context) {
val intent = Intent(context, UserCpListActivity::class.java)
context.startActivity(intent)
}
}
override fun init() {
StatusBarUtil.transparencyBar(this)
StatusBarUtil.StatusBarLightMode(this)
initTitle()
initRvList()
loadData()
}
private fun initTitle() {
initBlackTitleBar(ResUtil.getString(R.string.My_Cp))
val titleBar = findViewById<View>(R.id.title_bar) as TitleBar
titleBar.addAction(object : ImageAction(R.drawable.ic_cp_list_more) {
override fun performAction(view: View?) {
CommonWebViewActivity.start(this@UserCpListActivity, UriProvider.getCpRule())
}
})
}
private fun initRvList(){
mAdapter = UserCpListAdapter(R.layout.item_user_cp_list,1)
binding.rvList.layoutManager = LinearLayoutManager(context,RecyclerView.VERTICAL,false)
binding.rvList.adapter = mAdapter
mAdapter.setOnItemChildClickListener { adapter, view, position ->
when (view.id) {
R.id.cancel -> {
mAdapter.data.getOrNull(position)?.let {
cancelCp(position, it)
}
}
R.id.userAvatarCp -> {
mAdapter.data.getOrNull(position)?.let {
UserInfoActivity.Companion.start(context, it.cpUid)
}
}
else -> {}
}
}
mAdapter.setOnLoadMoreListener {
loadData(true)
}
mAdapter.setEmptyView(EmptyViewHelper.createEmptyTextView(this@UserCpListActivity,R.string.empty_data.getString()))
}
private fun loadData(isAdd: Boolean = false) {
if (!isAdd) {
mPageNum = 1
}
getCpList()
.compose(bindToLifecycle())
.doOnSuccess {
if (mPageNum == 1) {
mAdapter.setNewData(it)
} else {
mAdapter.addData(it)
}
if (it.size == mPageSize) {
mPageNum += 1
mAdapter.setEnableLoadMore(true)
binding.noMore.isVisible = false
} else {
mAdapter.setEnableLoadMore(false)
if (mAdapter?.data?.isEmpty() == true){
binding.noMore.isVisible = true
}
}
mAdapter.loadMoreComplete()
}
.doOnError {
LogUtils.d(" error = ${it.message}")
mAdapter.loadMoreEnd()
}
.subscribe()
}
private fun cancelCp(position: Int, data: UserCPListBean) {
val mDialogManager = DialogManager(context)
mDialogManager?.showOkCancelDialog(ResUtil.getString(R.string.CP_Cancel,data.cancelGoldNum,data.cpNick), true, object :
OkCancelDialogListener {
override fun onCancel() {
mDialogManager?.dismissDialog()
}
override fun onOk() {
postCpCancel(data.uid,data.cpUid,data.cancelGoldNum)
.compose(bindToLifecycle())
.doOnSuccess {
mAdapter.remove(position)
toast(ResUtil.getString(R.string.CP_Cancel_Success,data.cpNick))
}
.subscribe()
mDialogManager?.dismissDialog()
}
})
}
/**
* 获-cp列表
*/
private fun getCpList(): Single<List<UserCPListBean>> {
return api.getCpList(mPageNum,mPageSize)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers())
}
private fun postCpCancel(uid: Long,loverUid: Long,goldNum: Long): Single<String> {
return api.postCpCancel(uid,loverUid,goldNum)
.compose(RxHelper.handleIgnoreData())
.compose(RxHelper.handleSchedulers())
}
private val api: Api = RxNet.create(Api::class.java);
interface Api {
/**
* 获-cp列表
* page=1
* pageSize=10
*/
@GET("/user/cp/list")
fun getCpList(@Query("page") page: Int,@Query("pageSize") pageSize: Int=20): Single<ServiceResult<List<UserCPListBean>>>
/**
* 取消cp----
* Long uid
* Long loverUid
* Long goldNum //金币列表有返回该字段cancelGoldNum
*/
@POST("/user/cp/cancel")
fun postCpCancel(@Query("uid") uid: Long,@Query("loverUid") loverUid: Long,@Query("goldNum") goldNum: Long): Single<ServiceResult<JsonElement>>
}
}

View File

@@ -7,6 +7,10 @@ import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
@@ -14,6 +18,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.Fragment;
@@ -24,13 +29,17 @@ import com.chwl.app.avroom.adapter.CommonVPAdapter;
import com.chwl.app.ui.user.adapter.UserInfoTopAlbumAdapter;
import com.chwl.app.ui.user.fragment.UserInfoDataFragment;
import com.chwl.app.ui.user.fragment.UserInfoDynamicFragment;
import com.chwl.app.ui.utils.CpUtils;
import com.chwl.app.utils.AppBarStateChangeListener;
import com.chwl.app.utils.AvatarHelper;
import com.chwl.core.utils.LogUtils;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.widget.SVGAView;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
import com.example.lib_utils.UiUtils;
import com.google.android.material.appbar.AppBarLayout;
import com.netease.nim.uikit.StatusBarUtil;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nim.uikit.common.util.sys.TimeUtil;
import com.netease.nim.uikit.impl.cache.NimUserInfoCache;
import com.netease.nimlib.sdk.RequestCallbackWrapper;
@@ -74,6 +83,9 @@ import com.chwl.core.user.bean.UserPhoto;
import com.chwl.core.user.event.LoginUserInfoUpdateEvent;
import com.chwl.core.utils.CoreLogger;
import com.chwl.library.annatation.ActLayoutRes;
import com.tencent.qgame.animplayer.inter.IFetchResource;
import com.tencent.qgame.animplayer.mix.Resource;
import com.tencent.qgame.animplayer.util.ScaleType;
import com.zhpan.bannerview.constants.IndicatorGravity;
import org.greenrobot.eventbus.EventBus;
@@ -81,8 +93,12 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
/**
* create by lvzebiao on 2018/8/31
*/
@@ -98,13 +114,15 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private UserInfo userInfo;
private boolean mIslike = false;
private int flag = 0;
private LinearLayout bottomViewLayout = null;
private TextView sendMsgLayout;
private TextView attentionLayout;
private ImageView ivOfficialMask;
private TextView tvOfficialMask;
private LinearLayout sendMsgLayout;
private LinearLayout attentionLayout;
private TextView attentionText;
private ImageView attentionImg;
private UserInfoViewModel viewModel;
private boolean isFirst = true;
@SuppressLint("CheckResult")
@Override
@@ -131,6 +149,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
viewModel.getUserInfoData().observe(this, infoBean -> {
userInfo = infoBean;
initData(userInfo);
viewModel.getUserInfoDetail();
});
}
@@ -138,7 +157,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
protected void onResume() {
super.onResume();
viewModel.getUserInfo();
viewModel.getUserInfoDetail();
}
private void initAttentionView() {
@@ -157,11 +176,14 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
if (bottomViewLayout == null) {
View view = mBinding.vsBottomLayout.getViewStub().inflate();
bottomViewLayout = view.findViewById(R.id.bottom_view_layout);
sendMsgLayout = view.findViewById(R.id.send_msg_layout);
attentionLayout = view.findViewById(R.id.attention_layout);
sendMsgLayout = view.findViewById(R.id.sendMsgLayout);
attentionLayout = view.findViewById(R.id.attentionLayout);
attentionText = view.findViewById(R.id.attentionText);
attentionImg = view.findViewById(R.id.attentionImg);
sendMsgLayout.setOnClickListener(this);
attentionLayout.setOnClickListener(this);
}
bottomViewLayout.setVisibility(View.VISIBLE);
}
}
@@ -171,6 +193,8 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.ivEdit.setOnClickListener(this);
mBinding.tvEdit.setOnClickListener(this);
mBinding.layoutLive.setOnClickListener(this);
mBinding.cpCardMore.setOnClickListener(this);
mBinding.userInfoAnim.setOnClickListener(this);
// mBinding.ivTagArrow.setOnClickListener(this);
}
@@ -244,6 +268,10 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
viewModel.getUserInfoDetailData().observe(this, dataBean -> {
initPhoto(dataBean.getPrivatePhoto());
setWhereVisible();
setCpInfo(dataBean);
});
viewModel.getUserInfoDetailError().observe(this, String -> {
finish();
});
}
@@ -253,9 +281,11 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private void onFindViews() {
mBinding.tbUserInfo.setTitle("");
ivOfficialMask = mBinding.inOfficialMask.findViewById(R.id.iv_official_mask);
tvOfficialMask = mBinding.inOfficialMask.findViewById(R.id.tv_official_mask);
mBinding.ivHeadWear.bindCache(SVGAView.newCache(1));
if (userId == AuthModel.get().getCurrentUid()) {
mBinding.cpCardMore.setVisibility(View.VISIBLE);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -267,19 +297,10 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
private void initData(UserInfo userInfo) {
LogUtils.d(" userinfo initData ");
if (null != userInfo) {
ImageLoadUtilsV2.loadImage(mBinding.ivUserHead, userInfo.getAvatar());
HeadWearInfo headWearInfo = userInfo.getUserHeadwear();
if (headWearInfo != null && headWearInfo.getFirstUrl() != null) {
AvatarHelper.loadAvatarFrame(mBinding.ivHeadWear, headWearInfo.getFirstUrl(), headWearInfo.getType());
mBinding.ivUserHead.setPadding(0, 0, 0, 0);
mBinding.ivUserHead.setStrokeWidth(0);
} else {
int padding = getResources().getDimensionPixelOffset(R.dimen.dp_0_5);
mBinding.ivUserHead.setPadding(padding, padding, padding, padding);
mBinding.ivUserHead.setStrokeWidth(getResources().getDimensionPixelOffset(R.dimen.dp_1));
mBinding.ivHeadWear.setVisibility(View.GONE);
}
//设置昵称
String nick = RegexUtil.getPrintableString(userInfo.getNick());
mBinding.tvNick.setText(nick);
@@ -294,14 +315,12 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.tvFollowCount.setText(String.valueOf(userInfo.getFollowNum()));
mBinding.tvErbanId.setText(String.valueOf(userInfo.getErbanNo()));
if (userInfo.isHasPrettyErbanNo()) {
mBinding.ivId.setVisibility(View.GONE);
mBinding.tvErbanId.setTextColor(ContextCompat.getColor(context, R.color.color_FEFFBF));
mBinding.tvErbanId.setTextColor(ContextCompat.getColor(context, R.color.white));
mBinding.tvErbanId.setBackgroundResource(R.drawable.user_info_bg_good_id);
setMarginTop(mBinding.layoutRegion, getResources().getDimensionPixelOffset(R.dimen.dp_5));
} else {
mBinding.tvErbanId.setTextColor(ContextCompat.getColor(context, R.color.color_CC191919));
mBinding.tvErbanId.setTextColor(ContextCompat.getColor(context, R.color.white));
mBinding.tvErbanId.setBackgroundDrawable(null);
mBinding.ivId.setVisibility(View.VISIBLE);
setMarginTop(mBinding.layoutRegion, getResources().getDimensionPixelOffset(R.dimen.dp_8));
}
@@ -323,18 +342,98 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
setUserLevel(userInfo.getUserLevelVo());
//铭牌
setOfficialMask(userInfo.getNameplateWord(), userInfo.getNameplatePic());
if (AuthModel.get().getCurrentUid() != userInfo.getUid()) {
PraiseModel.get().isPraised(AuthModel.get().getCurrentUid(), userInfo.getUid()).subscribe();
}
mBinding.ivChargeAgent.setVisibility(userInfo.isRechargeUser() ? View.VISIBLE : View.GONE);
mBinding.llId.setOnClickListener(view -> {
mBinding.idLayout.setOnClickListener(view -> {
copyName();
});
}
}
//cp
private void setCpInfo(UserDetailInfo.DataBean dataBean) {
UserDetailInfo.DataBean.RelationUserVO cpInfo = dataBean.getRelationUserVO();
//头像
if (cpInfo!= null && cpInfo.cpAvatar != null && !cpInfo.cpAvatar.isEmpty() && cpInfo.showCpAvatar){
//cp 头像
mBinding.cpViews.setVisibility(View.VISIBLE);
mBinding.ivHeadWear.loadFile(CpUtils.INSTANCE.getHeadSvga(cpInfo.cpLevel));
mBinding.ivHeadWearCp.loadFile(CpUtils.INSTANCE.getHeadSvga(cpInfo.cpLevel));
mBinding.ivHeadWearCpFlag.setImageResource(CpUtils.INSTANCE.getFlag(cpInfo.cpLevel));
ImageLoadUtils.loadImage(mBinding.ivUserHeadCp, cpInfo.cpAvatar);
mBinding.ivUserHeadCp.setOnClickListener(v -> {
UserInfoActivity.Companion.start(context,cpInfo.cpUid);
});
}else {
mBinding.cpViews.setVisibility(View.INVISIBLE);
//正常头像
HeadWearInfo headWearInfo = userInfo.getUserHeadwear();
if (headWearInfo != null && headWearInfo.getFirstUrl() != null) {
AvatarHelper.loadAvatarFrame(mBinding.ivHeadWear, headWearInfo.getFirstUrl(), headWearInfo.getType());
mBinding.ivUserHead.setPadding(0, 0, 0, 0);
mBinding.ivHeadWear.setVisibility(View.VISIBLE);
} else {
int padding = getResources().getDimensionPixelOffset(R.dimen.dp_0_5);
mBinding.ivUserHead.setPadding(padding, padding, padding, padding);
mBinding.cpViews.setVisibility(View.INVISIBLE);
mBinding.ivHeadWear.setVisibility(View.INVISIBLE);
}
}
//cp 卡片
if (cpInfo!= null && cpInfo.cpAvatar != null && !cpInfo.cpAvatar.isEmpty()) {
mBinding.cpCardDay.setText(cpInfo.cpDay + ""+ ResUtil.getString(R.string.days));
mBinding.cpCardDay.setVisibility(cpInfo.cpDay > 0? View.VISIBLE : View.INVISIBLE);
mBinding.cpCardLevel.setImageResource(CpUtils.INSTANCE.getLevelImg(cpInfo.cpLevel));
mBinding.cpCardLevel.setVisibility(View.VISIBLE);
mBinding.cpCardLevelEmpty.setVisibility(View.INVISIBLE);
ImageLoadUtilsV2.loadImage(mBinding.cpCardUserAvatar, userInfo.getAvatar());
ImageLoadUtilsV2.loadImage(mBinding.cpCardUserAvatarCp, cpInfo.cpAvatar);
mBinding.cpCardUserHeadCp.setVisibility(View.VISIBLE);
mBinding.cpCardUserAvatarCp.setOnClickListener(v -> {
UserInfoActivity.Companion.start(context,cpInfo.cpUid);
});
}else {
mBinding.cpCardDay.setVisibility(View.INVISIBLE);
mBinding.cpCardLevelEmpty.setVisibility(View.VISIBLE);
mBinding.cpCardLevel.setVisibility(View.INVISIBLE);
mBinding.cpCardUserAvatarCp.setImageResource(R.drawable.ic_user_info_cp_def_avatar);
mBinding.cpCardUserAvatarCp.setOnClickListener(null);
mBinding.cpCardUserHeadCp.setVisibility(View.INVISIBLE);
ImageLoadUtilsV2.loadImage(mBinding.cpCardUserAvatar, userInfo.getAvatar());
}
//cp 动画
if (cpInfo != null && cpInfo.showCpAnim && isFirst) {
String animUrl = CpUtils.INSTANCE.getUserInfoAnim(cpInfo.cpLevel);
HashMap<String, String> imgMap = new HashMap<>();
imgMap.put("avatar1", cpInfo.avatar);
imgMap.put("avatar2", cpInfo.cpAvatar);
if (animUrl != null) {
CpUtils.INSTANCE.loadVap(
mBinding.userInfoAnim,
animUrl,
imgMap,null
);
}
}else {
mBinding.userInfoAnim.setVisibility(View.GONE);
}
isFirst = false;
}
private void setMarginTop(View view, int top) {
if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
@@ -398,13 +497,26 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
.setOnPageClickListener((clickedView, position) -> {
showUserPhoto(position);
})
.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
try {
if (mBinding.bannerViewIndex.getTag() != null) {
int itemCount = (int) mBinding.bannerViewIndex.getTag();
mBinding.bannerViewIndex.setText((position+1)+"/"+itemCount);
}
} catch (Exception e) {
}
}
})
.setRTLMode(isRTL)
.setIndicatorHeight(width)
.setIndicatorGravity(isRTL ? IndicatorGravity.START : IndicatorGravity.END)
.setIndicatorSliderWidth(width, width * 2)
.setIndicatorSliderGap(context.getResources().getDimensionPixelOffset(R.dimen.dp_6))
.setIndicatorMargin(isRTL ? marginEnd : 0, 0, isRTL ? 0 : marginEnd, context.getResources().getDimensionPixelOffset(R.dimen.dp_71))
.setAdapter(adapter).create();
.setAdapter(adapter)
.create();
}
/**
@@ -413,8 +525,13 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private void initPhoto(List<UserDetailInfo.DataBean.PrivatePhotoBean> list) {
if (list == null) {
mBinding.bannerView.refreshData(new ArrayList());
mBinding.bannerViewIndex.setTag(0);
mBinding.bannerViewIndex.setVisibility(View.INVISIBLE);
} else {
mBinding.bannerView.refreshData(list);
mBinding.bannerViewIndex.setTag(list.size());
mBinding.bannerViewIndex.setText(1+"/"+list.size());
mBinding.bannerViewIndex.setVisibility(View.VISIBLE);
}
}
@@ -450,10 +567,11 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
@Override
public void onStateChanged(AppBarLayout appBarLayout, State state) {
if (state == State.COLLAPSED) {
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back_black);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.white));
// mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back_black);
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.color_08151a));
setTitleVisible(true);
setEditButton(identityState, true);
setEditButton(identityState, false);
}else{
mBinding.ivUserBack.setImageResource(R.drawable.icon_user_back);
mBinding.tbUserInfo.setBackgroundColor(getResources().getColor(R.color.transparent));
@@ -494,11 +612,15 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
mBinding.tvEdit.setVisibility(View.GONE);
}
if (isExpanded) {
mBinding.ivEdit.setImageResource(R.drawable.user_info_ic_more_black);
mBinding.tvEdit.setImageResource(R.drawable.user_info_ic_edit_black);
mBinding.ivEdit.setImageTintList(ColorStateList.valueOf(Color.BLACK));
mBinding.tvEdit.setImageTintList(ColorStateList.valueOf(Color.BLACK));
// mBinding.ivEdit.setImageResource(R.drawable.user_info_ic_more_black);
// mBinding.tvEdit.setImageResource(R.drawable.user_info_ic_edit_black);
} else {
mBinding.ivEdit.setImageResource(R.drawable.user_info_ic_more);
mBinding.tvEdit.setImageResource(R.drawable.user_info_ic_edit);
// mBinding.ivEdit.setImageResource(R.drawable.user_info_ic_more);
// mBinding.tvEdit.setImageResource(R.drawable.user_info_ic_edit);
mBinding.ivEdit.setImageTintList(ColorStateList.valueOf(Color.WHITE));
mBinding.tvEdit.setImageTintList(ColorStateList.valueOf(Color.WHITE));
}
}
@@ -567,16 +689,18 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
// UserLabelDialog.newInstance(userInfo.getLabels(), userId).show(this);
// break;
case R.id.iv_user_back:
case R.id.ivUserBack:
finish();
break;
case R.id.tv_edit:
case R.id.iv_edit:
case R.id.tvEdit:
case R.id.ivEdit:
editClick(identityState);
break;
case R.id.send_msg_layout:
case R.id.sendMsgLayout:
NimUserInfo nimUserInfo = NimUserInfoCache.getInstance().getUserInfo(String.valueOf(userId));
if (nimUserInfo != null) {
NimP2PMessageActivity.start(this, String.valueOf(userId));
@@ -594,7 +718,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
break;
case R.id.attention_layout:
case R.id.attentionLayout:
if (userInfo == null) {
toast(getString(R.string.me_user_information_is_empty));
return;
@@ -622,7 +746,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
PraiseModel.get().praise(userInfo.getUid(), true).subscribe();
}
break;
case R.id.layout_live:
case R.id.layoutLive:
if (userInfo == null) {
toast(getString(R.string.me_user_information_is_empty));
return;
@@ -632,6 +756,15 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
AVRoomActivity.FROM_TYPE_USER, userInfo.getNick(), String.valueOf(userInfo.getUid()));
}
break;
case R.id.cpCardMore:
UserCpListActivity.Companion.start(this);
break;
case R.id.userInfoAnim:
mBinding.userInfoAnim.stopPlay();
mBinding.userInfoAnim.clearAnimation();
mBinding.userInfoAnim.setVisibility(View.GONE);
break;
}
}
@@ -642,7 +775,9 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
private void setLikedText(boolean isliked) {
mIslike = isliked;
attentionLayout.setText(getString((isliked) ? R.string.already_attention : R.string.follow));
attentionLayout.setBackgroundResource((isliked) ? R.drawable.user_info_follow_ed : R.drawable.user_info_follow_n);
attentionText.setText(getString((isliked) ? R.string.already_attention : R.string.follow));
attentionImg.setBackgroundResource((isliked) ? R.drawable.ic_user_info_followed : R.drawable.ic_user_info_follow);
}
@Subscribe(threadMode = ThreadMode.MAIN)
@@ -661,13 +796,13 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
}
private void setOfficialMask(String name, String icon) {
if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(icon)) {
if( userInfo.isCustomWord() && !TextUtils.isEmpty(icon)){
mBinding.inOfficialMask.setVisibility(View.VISIBLE);
if (tvOfficialMask != null && ivOfficialMask != null) {
tvOfficialMask.setText(name);
ImageLoadUtils.loadImage(this, icon, ivOfficialMask);
}
ImageLoadUtils.loadImage(this, icon, mBinding.ivOfficialMask);
}else if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(icon)) {
mBinding.inOfficialMask.setVisibility(View.VISIBLE);
mBinding.tvOfficialMask.setText(name);
ImageLoadUtils.loadImage(this, icon, mBinding.ivOfficialMask);
} else {
mBinding.inOfficialMask.setVisibility(View.GONE);
}

View File

@@ -10,6 +10,10 @@ import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.fourmob.datetimepicker.date.DatePickerDialog
@@ -25,6 +29,7 @@ import com.chwl.app.UIHelper
import com.chwl.app.application.App
import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.common.util.BitmapUtil
import com.chwl.app.constants.UserInfoConstants
import com.chwl.app.databinding.ActivityUserInfoModifyBinding
import com.chwl.app.ui.login.ModifyInfoActivity
import com.chwl.app.ui.user.adapter.UserPhotoAdapter
@@ -36,16 +41,22 @@ import com.chwl.app.utils.RegexUtil
import com.chwl.core.auth.AuthModel
import com.chwl.core.file.FileModel
import com.chwl.core.user.UserModel
import com.chwl.core.user.bean.UserDetailInfo
import com.chwl.core.user.bean.UserInfo
import com.chwl.core.user.bean.UserPhoto
import com.chwl.core.utils.CoreLogger
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.LogUtils
import com.chwl.library.common.file.FileHelper
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.util.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.common.util.SPUtils
import com.chwl.library.constants.ConstantsLib
import com.chwl.library.easypermisssion.EasyPermissions
import com.chwl.library.utils.ResUtil
import com.chwl.library.utils.TimeUtils
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import io.reactivex.Completable
import io.reactivex.SingleObserver
import io.reactivex.disposables.Disposable
@@ -92,10 +103,18 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
userId = intent.getLongExtra("userId", 0)
}
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
UserModel.get().getUserInfo(userId).subscribe(userInfoUpdateObserver)
PhotoCompressUtil.clearCompressCache()
if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) {
pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
crop(uri, 1, mUri)
}
}
}
override fun click(position: Int, userPhoto: UserPhoto, isOwner: Boolean) {
@@ -133,6 +152,12 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
binding.rvPhotos.visibility = View.GONE
}
binding.tvArea.text = userInfo.region
//cp 设置获取
UserModel.get().getUserInfoDetail(userId).compose(bindToLifecycle()).doOnSuccess {
setSwitchView(binding.swCpShow,it?.data?.relationUserVO?.showCpAvatar?:false)
setSwitchView(binding.swCpAnim,it?.data?.relationUserVO?.showCpAnim?:false)
}.subscribe()
}
}
@@ -143,6 +168,8 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
binding.layoutPhotos.setOnClickListener(this)
binding.llDesc.setOnClickListener(this)
binding.layoutArea.setOnClickListener(this)
binding.swCpAnim.setOnClickListener(this)
binding.swCpShow.setOnClickListener(this)
val mLayoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)
binding.rvPhotos.layoutManager = mLayoutManager
}
@@ -284,11 +311,68 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
toast(e.message)
}
})
} R.id.layout_area -> {
dialogManager.showProgressDialog(
this@UserInfoModifyActivity,
ResUtil.getString(R.string.ui_user_userinfomodifyactivity_02)
)
UserModel.get().areaInfo.subscribe(object : SingleObserver<List<String>> {
override fun onSubscribe(d: Disposable) {
mCompositeDisposable.add(d)
}
override fun onSuccess(areaList: List<String>) {
dialogManager.dismissDialog()
if (areaList.isNotEmpty()) {
UserAreaDialog.newInstance(areaList)
.apply {
setAction {
reportArea(it)
}
}.show(this@UserInfoModifyActivity)
}
}
override fun onError(e: Throwable) {
dialogManager.dismissDialog()
toast(e.message)
}
})
}
R.id.swCpAnim -> {
postUpDateCpSwitch(binding.swCpAnim,UserInfoConstants.CpSet.cpAnim)
}
R.id.swCpShow -> {
postUpDateCpSwitch(binding.swCpShow,UserInfoConstants.CpSet.cpAvatar)
}
else -> {}
}
}
//post update set
private fun postUpDateCpSwitch(view: ImageView,type:Int){
val tag = view.tag
if (tag != null && tag is Boolean){
val tagVal = !tag
UserModel.get().userCpSettingUpdate(type,tagVal)
.compose(bindToLifecycle())
.doOnSuccess {
setSwitchView(view,tagVal,true)
}.subscribe()
}
}
// set view
private fun setSwitchView(view: ImageView, on:Boolean,notify:Boolean=false){
view.setImageResource(if (on) R.drawable.ic_user_edit_sw_on else R.drawable.ic_user_edit_sw_off)
view.tag = on
if (notify) {
//通知 cp设置改变 todo do
}
}
private fun reportArea(area: String) {
binding.tvArea.text = area
dialogManager.showProgressDialog(
@@ -358,24 +442,30 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
private fun checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
if (Build.VERSION.SDK_INT >= 33){
DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener {
override fun doCancelAction() {
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
})
}else{
if (!EasyPermissions.hasPermissions(this,Manifest.permission.READ_EXTERNAL_STORAGE)) {
EasyPermissions.requestPermissions(this, getString(R.string.permission_storage_rationale), PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
}
}
}
private fun getNowTime(): String {
@@ -488,14 +578,16 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
toast(R.string.text_bitmap_too_large)
return
}
if (sourceSize > 0) {
//不能上传图片的最小文件大小
CoreLogger.debug(TAG, "sourceSize: $sourceSize")
if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
toast(R.string.text_bitmap_too_small)
return
}
}
// if (sourceSize > 0) {
// //不能上传图片的最小文件大小
// CoreLogger.debug(TAG, "sourceSize: $sourceSize")
// if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
// toast(R.string.text_bitmap_too_small)
// return
// }
// }
val options = UCrop.Options().apply {
setCompressionQuality(100)
setShowCropGrid(false)

View File

@@ -11,6 +11,9 @@ import android.os.Bundle
import android.provider.Settings
import android.view.View
import android.widget.GridView
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import com.hjq.toast.ToastUtils
import com.jph.takephoto.app.TakePhotoActivity
@@ -30,13 +33,17 @@ import com.chwl.core.user.UserModel
import com.chwl.core.user.bean.UserInfo
import com.chwl.core.user.bean.UserPhoto
import com.chwl.core.utils.CoreLogger
import com.chwl.core.utils.DialogUtil
import com.chwl.core.utils.net.BeanObserver
import com.chwl.library.common.file.FileHelper
import com.chwl.library.common.photo.PhotoProvider
import com.chwl.library.common.util.PhotoCompressCallback
import com.chwl.library.common.util.PhotoCompressUtil
import com.chwl.library.common.util.SPUtils
import com.chwl.library.constants.ConstantsLib
import com.chwl.library.easypermisssion.EasyPermissions
import com.chwl.library.utils.ResUtil
import com.netease.nim.uikit.common.ui.dialog.EasyAlertDialogHelper
import kotlinx.coroutines.Job
import java.io.FileNotFoundException
import java.text.SimpleDateFormat
@@ -57,6 +64,8 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
private var mUri: Uri? = null
private var mJob: Job? = null
var pickMedia : ActivityResultLauncher<PickVisualMediaRequest>?=null
companion object {
const val FLAG_CHANGE = "isChanged"
private const val TAG = "UserModifyPhotosActivit"
@@ -95,6 +104,14 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
if (userInfo != null) {
updateView()
}
if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable(this)) {
pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
uri?.let {
crop(it, 0, mUri)
}
}
}
}
private fun initView() {
@@ -219,24 +236,38 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
}
private fun checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
if (Build.VERSION.SDK_INT >= 33){
DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener {
override fun doCancelAction() {
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
})
}else{
if (!EasyPermissions.hasPermissions(
this, Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
}
}
}
private fun getNowTime(): String {
@@ -309,14 +340,14 @@ class UserModifyPhotosActivity : TakePhotoActivity(), PhotoItemClickListener,
toast(R.string.text_bitmap_too_large)
return
}
if (sourceSize > 0) {
//不能上传图片的最小文件大小
CoreLogger.debug(TAG, "sourceSize: $sourceSize")
if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
toast(R.string.text_bitmap_too_small)
return
}
}
// if (sourceSize > 0) {
// //不能上传图片的最小文件大小
// CoreLogger.debug(TAG, "sourceSize: $sourceSize")
// if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
// toast(R.string.text_bitmap_too_small)
// return
// }
// }
val options = UCrop.Options().apply {
setCompressionQuality(100)
setShowCropGrid(false)

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