Compare commits

...

25 Commits

Author SHA1 Message Date
eggmanQQQ
e0f55ef03c update version 2024-10-15 20:04:40 +08:00
eggmanQQQ
a5725b32fd fix : boom 飘屏 房间标题修改 2024-10-15 20:00:30 +08:00
eggmanQQQ
c73c7425a7 feat : 麦位最小化时 回来异常 fix 2024-10-15 19:19:38 +08:00
eggmanQQQ
2d33a96376 fix : 清理公屏时没有清理另外两个tab的数据 2024-10-15 18:25:59 +08:00
eggmanQQQ
84ff7be54e feat : 游戏飘屏 修改 实现方案 2024-10-15 16:30:23 +08:00
eggmanQQQ
367a55654b feat : 火箭横幅位置下调 2024-10-15 15:10:20 +08:00
eggmanQQQ
7e48f77f1c fix: 修复bug 2024-10-15 14:23:33 +08:00
eggmanQQQ
11e5271193 feat: 游戏中奖飘屏,通用img飘屏,通用vga飘屏 添加dp68的 顶部间距 2024-10-15 11:01:09 +08:00
eggmanQQQ
20457a9bdf feat ; 接入 游戏飘屏, 修复bug 2024-10-15 10:29:03 +08:00
eggmanQQQ
47d1985d66 feat : 新增BOOM 公屏消息, 封禁弹窗功能修改 , 修复部分发现的bug 2024-10-11 18:01:23 +08:00
eggmanQQQ
4dc4dfc93b feat : 麦 人声音乐 开关功能, 初次提交 2024-10-10 19:42:26 +08:00
eggmanQQQ
04b71fa067 feat ; 房间消息公屏 分类 初次提交 2024-10-10 18:10:09 +08:00
eggmanQQQ
583173308e feat ; boom 功能 初步提测 2024-10-10 16:07:38 +08:00
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
285 changed files with 10089 additions and 1706 deletions

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" />
@@ -78,7 +78,7 @@
<uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<!-- AppsFlyer需要参考https://dev.appsflyer.com/hc/docs/install-android-sdk#setting-required-permissions -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- 对于 Android 12.0 及以上设备,还需要添加如下权限: -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
@@ -316,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"

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

@@ -35,6 +35,7 @@ import com.chwl.app.star.StarFragment;
import com.chwl.app.support.PreloadResourceViewModel;
import com.chwl.app.ui.login.LoginPasswordActivity;
import com.chwl.core.home.bean.MainTabInfo;
import com.chwl.core.manager.AudioEngineManager;
import com.chwl.core.settings.SettingsModel;
import com.chwl.library.utils.JavaUtil;
import com.netease.nim.uikit.StatusBarUtil;
@@ -666,6 +667,7 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
@Override
public void exitRoom(RoomInfo roomInfo) {
AudioEngineManager.get().setNotRecord(false);
closeOpenRoomAnimation();
DaemonService.stop(MainActivity.this);
}

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;

View File

@@ -9,7 +9,7 @@ public abstract class BottomViewListenerWrapper {
}
public void onOpenMicBtnClick() {
public void onOpenMicBtnClick(int type) {
}

View File

@@ -42,6 +42,7 @@ import com.alibaba.fastjson.JSONObject;
import com.chwl.app.notify.RoomNotifyManager;
import com.chwl.app.ui.webview.baishun.BaiShunGameWebFragment;
import com.chwl.app.ui.webview.baishun.IBaiShunGameListener;
import com.chwl.core.manager.AudioEngineManager;
import com.chwl.library.widget.SVGAView;
import com.chwl.core.monsterhunting.bean.MonsterDataBean;
import com.chwl.core.room.game.bean.BaiShunGameConfig;
@@ -857,6 +858,7 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
if (!justClosePage) {
getMvpPresenter().exitRoom();
}
AudioEngineManager.get().setNotRecord(false);
finish();
}

View File

@@ -18,7 +18,7 @@ import com.chwl.app.R
import com.chwl.app.avroom.widget.VDHLayout
import com.chwl.app.ui.widget.dialog.BaseDialog
abstract class BaseRoomNotifyeBaseDialog<VB : ViewBinding>(context: Context, theme: Int = 0) : BaseDialog(context, theme) {
abstract class BaseRoomNotifyDialog<VB : ViewBinding>(context: Context, theme: Int = 0) : BaseDialog(context, theme) {
protected val handle = Handler(Looper.getMainLooper())
protected lateinit var mBinding: VB
@@ -39,9 +39,11 @@ abstract class BaseRoomNotifyeBaseDialog<VB : ViewBinding>(context: Context, the
init()
handle.postDelayed({
dismissDialog()
}, (getStaySecond()*1000).toLong())
if (useAutoDismiss()) {
handle.postDelayed({
dismissDialog()
}, (getStaySecond()*1000).toLong())
}
}
override fun onDetachedFromWindow() {
@@ -55,7 +57,7 @@ abstract class BaseRoomNotifyeBaseDialog<VB : ViewBinding>(context: Context, the
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT
windowParams.dimAmount = 0.0f
windowParams.gravity = Gravity.TOP
windowParams.gravity = getGravity()
windowParams.x = 0
windowParams.y = getTopOffset()
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
@@ -64,6 +66,11 @@ abstract class BaseRoomNotifyeBaseDialog<VB : ViewBinding>(context: Context, the
window.setWindowAnimations(getAnimations())
}
protected open fun getGravity():Int{
return Gravity.TOP
}
protected open fun getStaySecond():Float{
return 5f
}
@@ -110,17 +117,38 @@ abstract class BaseRoomNotifyeBaseDialog<VB : ViewBinding>(context: Context, the
super.setContentView(view, params)
}
open fun dismissDialog(){
try {
dismiss()
} catch (e: Exception) {
}
}
/**
* 是否启动侧滑左滑删除右滑回到原位置
*/
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

@@ -0,0 +1,192 @@
package com.chwl.app.avroom.dialog
import android.graphics.Color
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.widget.ImageView
import com.chwl.app.R
import com.chwl.app.application.GlobalHandleManager
import com.chwl.app.avroom.widget.GalleryLayoutManager.LayoutParams
import com.chwl.app.base.BaseDialogFragment
import com.chwl.app.databinding.DialogRoomBoomInfoBinding
import com.chwl.app.databinding.ItemRoomBoomInfoLevelBinding
import com.chwl.app.ui.utils.loadAnim2
import com.chwl.app.ui.utils.loadImage
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.ui.webview.DialogWebViewActivity
import com.chwl.core.UriProvider
import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.response.ServiceResult
import com.chwl.core.gift.bean.BoomInfo
import com.chwl.core.user.UserModel
import com.chwl.core.utils.net.RxHelper
import com.chwl.library.common.util.isVerify
import com.chwl.library.common.util.setRL
import com.chwl.library.common.util.setViewWH
import com.chwl.library.common.util.setVis
import com.chwl.library.net.rxnet.RxNet
import com.example.lib_utils.ktx.dp
import com.example.lib_utils.ktx.getString
import com.tencent.qgame.animplayer.AnimView
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.Query
class RoomBoomInfoDialog : BaseDialogFragment<DialogRoomBoomInfoBinding>() {
override var width = WindowManager.LayoutParams.MATCH_PARENT
override var height = 658.dp
override var dimAmount = 0f
override var gravity = Gravity.BOTTOM
public var roomUid = -1L
public var mCallBack :CallBack? = null
private var indexLevel = 0;
override fun init() {
if (roomUid > 0) {
getBoomInfo(roomUid)
.compose(bindToLifecycle())
.doOnSuccess {
setView(it)
}
.doOnError {
}
.subscribe()
}
binding.btn2.setOnClickListener {
mCallBack?.onClick(0,0)
}
binding.more2.setOnClickListener {
val activity = GlobalHandleManager.get().activity ?: return@setOnClickListener
DialogWebViewActivity.start(activity, UriProvider.getBoomRule(UserModel.get().partitionId), true)
}
binding.more3.setOnClickListener {
val activity = GlobalHandleManager.get().activity ?: return@setOnClickListener
DialogWebViewActivity.start(activity, UriProvider.getBoomRule(UserModel.get().partitionId), true)
}
binding.levelLayoutBg.setRL()
}
private fun setView(boomInfos: List<BoomInfo>) {
val sortedByDescending = boomInfos.sortedByDescending { it.level }
sortedByDescending.forEachIndexed{ index, boomInfo ->
val levelView = ItemRoomBoomInfoLevelBinding.inflate(layoutInflater, binding.levelLayout, true)
levelView.root.setBackgroundResource(R.color.transparent)
levelView.levelText.text="LV.${boomInfo.level}"
levelView.levelIcon.loadImage(boomInfo.pic)
levelView.root.tag = boomInfo
levelView.root.setOnClickListener {
val tag = it.tag
if (tag != null && tag is BoomInfo){
if (indexLevel != tag.level) {
indexLevel = tag.level
setInfo(tag)
for (i in 0 until binding.levelLayout.childCount) {
val view = binding.levelLayout.getChildAt(i)
view.setBackgroundResource(R.color.transparent)
}
it.setBackgroundColor(Color.parseColor("#9739ff"))
}
}
}
if (boomInfo.currLevel) {
levelView.root.setBackgroundColor(Color.parseColor("#9739ff"))
indexLevel = boomInfo.level
setInfo(boomInfo)
mCallBack?.onCurrBoomInfo(boomInfo)
}
}
}
private fun setInfo(indexData: BoomInfo?) {
indexData?.let {
if (it.rank && it.roomBoomRankVos.isVerify()) {
binding.avatarLayout.setVis(true)
binding.rewardLayout.visibility = View.INVISIBLE
it.roomBoomRankVos.forEach { rank->
if (rank.position == 1) {
binding.avatar1.loadImage(rank.avatar)
binding.nick1.text = rank.nick
}else if (rank.position == 2) {
binding.avatar2.loadImage(rank.avatar)
binding.nick2.text = rank.nick
}else if (rank.position == 3) {
binding.avatar3.loadImage(rank.avatar)
binding.nick3.text = rank.nick
}
}
} else if (it.roomBoomLevelAwardVos.isVerify()){
binding.rewardLayout.setVis(true)
binding.avatarLayout.visibility = View.INVISIBLE
it.roomBoomLevelAwardVos.forEachIndexed { index, boomInfoAward ->
val childAt = binding.rewardList.getChildAt(index)
if (childAt != null && childAt is ImageView && boomInfoAward.awardPic.isVerify()) {
childAt.loadImage(boomInfoAward.awardPic)
}
}
}
setPro(indexData.speed,indexData.level)
binding.recordAnimLayout.removeAllViews()
val animView = AnimView(binding.recordAnimLayout.context)
binding.recordAnimLayout.addView(animView)
val layoutParams = animView.layoutParams
layoutParams.width = LayoutParams.MATCH_PARENT
layoutParams.height = LayoutParams.MATCH_PARENT
animView.layoutParams = layoutParams
animView.setLoop(Int.MAX_VALUE)
animView.loadAnim2(it.vapUrl)
if (UserModel.get().partitionId == 2L) {
binding.avatarTime.text = R.string.roomBoomInfoRankHint2.getString()
} else {
binding.avatarTime.text = R.string.roomBoomInfoRankHint.getString()
}
}
}
fun setPro(speed: Int, level: Int) {
if (level != indexLevel) return
binding.proMax.post{
val max = binding.proMax.height
binding.pro.setViewWH(height = (max * (speed.toFloat() / 100)).toInt(), isDP = false)
binding.proVal.text = speed.toString()
}
}
private fun getBoomInfo(roomUid: Long): Single<List<BoomInfo>> {
return api.getBoomInfo(roomUid)
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers())
}
private val api: Api = RxNet.create(Api::class.java);
interface Api {
@GET("/room/boom/level/info")
fun getBoomInfo(@Query("roomUid") roomUid: Long): Single<ServiceResult<List<BoomInfo>>>
}
public interface CallBack{
fun onCurrBoomInfo(boomInfo: BoomInfo)
fun onClick(type: Int,data:Any)
}
}

View File

@@ -0,0 +1,89 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import com.chwl.app.R
import com.chwl.app.bindadapter.BaseAdapter
import com.chwl.app.bindadapter.BindingViewHolder
import com.chwl.app.databinding.RoomBoomRewardBinding
import com.chwl.app.databinding.RoomBoomRewardItemBinding
import com.chwl.app.ui.utils.loadImage
import com.chwl.core.auth.AuthModel
import com.chwl.core.gift.bean.BoomMsgAwardBean
import com.chwl.library.common.util.isVerify
import com.chwl.library.common.util.setViewWH
import com.chwl.library.common.util.setVis
import com.example.lib_utils.ktx.getString
class RoomBoomRewardDialog(private val context: Context) :
BaseRoomNotifyDialog<RoomBoomRewardBinding>(context) {
var list : List<BoomMsgAwardBean>?=null
var mAdapter = object : BaseAdapter<BoomMsgAwardBean>(R.layout.room_boom_reward_item, 1) {
override fun convert(helper: BindingViewHolder, item: BoomMsgAwardBean?) {
val binding = RoomBoomRewardItemBinding.bind(helper.itemView)
binding.boomItem.loadImage(item?.awardPic)
}
}
override fun createBinding(inflater: LayoutInflater): RoomBoomRewardBinding {
return RoomBoomRewardBinding.inflate(inflater)
}
override fun init() {
mBinding.confirm.setOnClickListener {
dismiss()
}
if (list.isVerify()) {
val filterList = list!!.filter { it.uid == AuthModel.get().currentUid }
if (filterList.isVerify()) {
setOnReceive(filterList)
} else {
setUnReceive()
}
} else {
setUnReceive()
}
}
override fun useAutoDismiss() = false
override fun useSlipSlip() = false
override fun getGravity(): Int {
return Gravity.CENTER
}
override fun getAnimations(): Int {
return -1
}
// 没有中奖的UI
private fun setUnReceive() {
mBinding.bg.setViewWH(height = 200)
mBinding.title.visibility = View.INVISIBLE
// mBinding.confirm.text = ""
mBinding.hint.text = R.string.roomBoomAwardHintEmpty.getString()
mBinding.rvList.setVis(false)
}
//中奖UI
private fun setOnReceive(filterList: List<BoomMsgAwardBean>) {
mBinding.bg.setViewWH(height = 395)
mBinding.title.setVis(true)
// mBinding.confirm.text = ""
mBinding.hint.text = R.string.roomBoomAwardHint.getString()
mBinding.rvList.setVis(true)
mBinding.rvList.adapter = mAdapter
mAdapter.setNewData(filterList)
}
}

View File

@@ -18,21 +18,29 @@ import com.chwl.app.base.BaseActivity
import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.databinding.RoomGameplayDialogBinding
import com.chwl.app.home.helper.OpenRoomHelper
import com.chwl.app.treasure_box.widget.GoldBoxHelper
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.common.util.isVerify
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
@@ -40,6 +48,14 @@ class RoomGameListDialog :
private val adapter = RoomGameListAdapter()
private var dialogManager: DialogManager? = null
private lateinit var recycleView: RecyclerView
var game_list = "game_list#"
var gameplay_list = "gameplay_list#"
var code = 0
private var mStatus = -1
private var mGameData = arrayListOf<GameInfo>()
var listener: RoomGameplayDialog.GameplayDialogListener? = null
override fun getTheme(): Int {
return R.style.ErbanBottomSheetDialogDimFalse
}
@@ -101,27 +117,72 @@ class RoomGameListDialog :
}
private fun requestData() {
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)
game_list = "game_list#$code"
gameplay_list = "gameplay_list#$code"
val dataService = AudioRoomContext.get()?.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
val gameList = dataService?.getData(game_list) as? List<GameInfo>
val gameplayList = dataService?.getData(gameplay_list) as? List<RoomIcon>
LogUtils.d("gameListData-- code1=$game_list size=${gameList?.size} code2=$gameplay_list size=${gameplayList?.size}")
if (gameList.isVerify() || gameplayList.isVerify()){
mGameData.clear()
if (gameList.isVerify()) mGameData.addAll(0,gameList!!)
if (gameplayList.isVerify()) mGameData.addAll(roomIconToGameInfo(gameplayList!!))
updateDialogHeight(mGameData.size)
loadData(mGameData)
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> ->
dataService?.putData(cacheKey, it)
updateDialogHeight(it.size)
loadData(it)
LogUtils.d(" gamegame getGameList GameInfo = $it")
mGameData.addAll(0,it)
dataService?.putData(game_list, 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")
val roomIconToGameInfo = roomIconToGameInfo(it)
mGameData.addAll(roomIconToGameInfo)
dataService?.putData(gameplay_list, it)
updateDialogHeight(mGameData.size)
loadData(mGameData)
}
getCompositeDisposable().add(getGameList)
getCompositeDisposable().add(roomGamePlayList)
}
private fun roomIconToGameInfo(list : List<RoomIcon>): ArrayList<GameInfo> {
val newData = arrayListOf<GameInfo>()
list.forEachIndexed { index, roomIcon ->
if (roomIcon.isBaiShunGame()) {
newData.add(GameInfo(name = roomIcon.name?:"", pic = roomIcon.icon?:"" , pic2 = roomIcon.icon?:"", skipContent = roomIcon.skipContent?:"", ruleValue = roomIcon.ruleValue?:""))
}else if(roomIcon.isFindLove()){
newData.add(GameInfo(name = roomIcon.name?:"", pic = roomIcon.icon?:"" , pic2 = roomIcon.icon?:"", skipContent = roomIcon.skipContent?:"", ruleValue = roomIcon.ruleValue?:"", isFindLove = true))
}
}
return newData
}
private fun loadData(list: List<GameInfo>?) {
@@ -134,6 +195,7 @@ class RoomGameListDialog :
}
private fun switchStatus(status: Int) {
mStatus = status
when (status) {
// loading
0 -> {
@@ -185,27 +247,65 @@ 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()){
if (gameInfo.isFindLove) {
jumpFindLove()
} else {
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()
}
}
private fun jumpFindLove() {
GoldBoxHelper.handleBoxClick(requireContext())
}
override fun onDestroy() {
super.onDestroy()
onUnbindContext()
@@ -233,4 +333,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

@@ -0,0 +1,58 @@
package com.chwl.app.avroom.dialog
import android.content.Context
import android.view.LayoutInflater
import com.chwl.app.R
import com.chwl.app.application.GlobalHandleManager
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.RoomNotifyBoomBinding
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadImage
import com.chwl.core.gift.bean.BoomMsgDialogBean
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.ktx.getString
class RoomNotifyBoomDialog(context: Context) :
BaseRoomNotifyDialog<RoomNotifyBoomBinding>(context) {
var data: BoomMsgDialogBean? = null
override fun createBinding(inflater: LayoutInflater): RoomNotifyBoomBinding {
return RoomNotifyBoomBinding.inflate(inflater)
}
override fun init() {
data?.let { data ->
mBinding.boomIcon.loadImage(data.pic)
mBinding.avatar.loadImage(data.avatar)
mBinding.roomName.text = data.roomTitle
mBinding.boomDes.text = R.string.roomBoomNotify.getString()
mBinding.root.setOnClickListener {
val activity = GlobalHandleManager.get().activity ?: return@setOnClickListener
val mDialogManager = DialogManager(activity)
mDialogManager?.showOkCancelDialog(
ResUtil.getString(R.string.changeRoomTips),
true,
object :
OkCancelDialogListener {
override fun onCancel() {
mDialogManager?.dismissDialog()
}
override fun onOk() {
mDialogManager?.dismissDialog()
if (AvRoomDataManager.get().roomUid != data.roomUid) {
AVRoomActivity.start(context, data.roomUid)
}
}
})
}
}
}
}

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

@@ -3,6 +3,7 @@ package com.chwl.app.avroom.dialog
import android.content.Context
import android.view.LayoutInflater
import com.chwl.app.R
import com.chwl.app.application.GlobalHandleManager
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.common.widget.dialog.DialogManager
import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener
@@ -11,6 +12,7 @@ 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.common.util.setRL
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.UiUtils
@@ -18,7 +20,7 @@ import com.example.lib_utils.UiUtils
* @Author Vance
* 幸运礼物的飘屏全服但是展示的时候限制只有房间才展示
*/
class BaseRoomNotifyeLuckGiftDialog(private val context: Context) : BaseRoomNotifyeBaseDialog<RoomNotifyLuckGiftDlgBinding>(context) {
class RoomNotifyLuckGiftDialog(private val context: Context) : BaseRoomNotifyDialog<RoomNotifyLuckGiftDlgBinding>(context) {
override fun createBinding(inflater: LayoutInflater): RoomNotifyLuckGiftDlgBinding {
return RoomNotifyLuckGiftDlgBinding.inflate(inflater)
@@ -29,9 +31,7 @@ class BaseRoomNotifyeLuckGiftDialog(private val context: Context) : BaseRoomNoti
override fun init() {
if (UiUtils.isRtl(context)) {
mBinding.bg.scaleX = -1f
}
mBinding.bg.setRL()
ImageLoadUtils.loadImage(mBinding.avatar,luckyGiftMsgBean?.sender?.avatar?:"")
mBinding.giftName.text = luckyGiftMsgBean?.giftNameMap?.getFirstText()
@@ -41,7 +41,8 @@ class BaseRoomNotifyeLuckGiftDialog(private val context: Context) : BaseRoomNoti
mBinding.coinNum.text = coinNum
mBinding.clickArea.setOnClickListener {
mDialogManager = DialogManager(context)
val activity = GlobalHandleManager.get().activity ?: return@setOnClickListener
mDialogManager = DialogManager(activity)
mDialogManager?.showOkCancelDialog(ResUtil.getString(R.string.changeRoomTips), true, object : OkCancelDialogListener {
override fun onCancel() {
mDialogManager?.dismissDialog()
@@ -61,15 +62,4 @@ class BaseRoomNotifyeLuckGiftDialog(private val context: Context) : BaseRoomNoti
}
var mCallBack : CallBack? = null
interface CallBack{
fun onHide();
}
override fun dismissDialog() {
super.dismissDialog()
mCallBack?.onHide()
}
}

View File

@@ -122,31 +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);
//todo-- add pk btn
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
*/
@@ -171,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));
@@ -187,7 +189,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 跨房PK
* 跨房PK
*
* @param optAdapter
*/
@@ -211,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));
@@ -231,7 +236,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 跨房PK
* 个播PK
*
* @param optAdapter
*/
@@ -261,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
@@ -280,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), () -> {
@@ -344,7 +354,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 相亲 模式
* 红包
*
* @param optAdapter
*/
@@ -593,7 +603,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 超管管理
* 发布广播
*/
private void addSendBroadcastAction(OptAdapter optAdapter) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
@@ -618,7 +628,7 @@ public class RoomOperationDialog extends BottomSheetDialog {
}
/**
* 超管管理
* 小喇叭
*/
private void addVipSendBroadcastAction(OptAdapter optAdapter) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;

View File

@@ -17,6 +17,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.ViewStub
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
@@ -42,6 +43,7 @@ import com.chwl.app.avroom.adapter.OnMicroItemClickListener
import com.chwl.app.avroom.adapter.RoomMessageIndicatorAdapter
import com.chwl.app.avroom.dialog.AttentionHintDialog
import com.chwl.app.avroom.dialog.DatingVipRuleDialog
import com.chwl.app.avroom.dialog.RoomBoomInfoDialog
import com.chwl.app.avroom.dialog.RoomGameListDialog
import com.chwl.app.avroom.dialog.RoomGameplayDialog
import com.chwl.app.avroom.dialog.RoomOperationDialog
@@ -58,6 +60,9 @@ 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.room_chat.activity.RoomMsgActivity
import com.chwl.app.ui.utils.GameUtil
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.utils.loadImage
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.ui.webview.DialogWebViewActivity
import com.chwl.app.ui.widget.ButtonItem
@@ -73,17 +78,27 @@ 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.utils.RoomBoomManager
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.contacts.MyConstant
import com.chwl.core.gift.GiftModel
import com.chwl.core.gift.bean.BoomInfo
import com.chwl.core.gift.bean.BoomMsgAnimBean
import com.chwl.core.gift.bean.BoomMsgAwardList
import com.chwl.core.gift.bean.BoomMsgDialogBean
import com.chwl.core.gift.bean.BoomMsgExpPushBean
import com.chwl.core.gift.bean.GiftInfo
import com.chwl.core.gift.bean.GiftType
import com.chwl.core.gift.event.GiftComboEvent
import com.chwl.core.gift.event.NotifyEvent
import com.chwl.core.gift.event.RoomFreeGiftEvent
import com.chwl.core.helper.AtProxy
import com.chwl.core.home.bean.BannerInfo
import com.chwl.core.home.event.OpenRoomMessageInputEvent
import com.chwl.core.im.custom.bean.CustomAttachment
import com.chwl.core.im.custom.bean.RoomFollowOwnerAttachment
import com.chwl.core.im.custom.bean.RoomFollowOwnerAttachment2
import com.chwl.core.manager.AudioEngineManager
@@ -94,27 +109,37 @@ 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.RoomBoomInfo
import com.chwl.core.room.bean.RoomIcon
import com.chwl.core.room.bean.RoomInfo
import com.chwl.core.room.core.RoomDataService
import com.chwl.core.room.event.RoomAtEvent
import com.chwl.core.room.event.RoomClearScreenEvent
import com.chwl.core.room.game.GameModel.getGameList
import com.chwl.core.room.game.GameStatus
import com.chwl.core.room.game.bean.BaiShunGameConfig
import com.chwl.core.room.game.bean.GameInfo
import com.chwl.core.room.giftvalue.helper.GiftValueMrg
import com.chwl.core.room.model.AvRoomModel
import com.chwl.core.room.queue.bean.MicMemberInfo
import com.chwl.core.share.bean.SessionType
import com.chwl.core.super_admin.SaConstant
import com.chwl.core.super_admin.model.SuperAdminModel
import com.chwl.core.super_admin.util.SuperAdminUtil
import com.chwl.core.support.room.AudioRoomContext
import com.chwl.core.support.room.AudioRoomContext.Companion.get
import com.chwl.core.support.room.RoomContext
import com.chwl.core.support.room.RoomView
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.LogUtils
import com.chwl.core.utils.net.VipLevelNotEnoughException
import com.chwl.library.common.util.LimitClickUtils
import com.chwl.library.common.util.isVerify
import com.chwl.library.common.util.setViewWH
import com.chwl.library.common.util.setVis
import com.chwl.library.net.rxnet.utils.RxNetWorkUtils
import com.chwl.library.rxbus.RxBus
import com.chwl.library.utils.JavaUtil
@@ -122,6 +147,7 @@ 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
@@ -158,6 +184,15 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
protected lateinit var inputEdit: EditText
protected lateinit var inputSend: ImageView
protected lateinit var microView: MicroView
protected lateinit var btnIvConfigEntrance: ImageView
protected lateinit var btnIvgame: ImageView
protected lateinit var boomLayout: FrameLayout
protected lateinit var boomIcon: ImageView
protected lateinit var boomProMax: ImageView
protected lateinit var boomPro: ImageView
private var musicPlayerView: MusicPlayerView? = null
private var mVsMusicPlayer: ViewStub? = null
private var mDisposable: Disposable? = null
@@ -198,6 +233,9 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
// 房间小组件
private var widgets: HashMap<String, RoomWidget> = HashMap()
//boomInfo 弹窗
private var mBoomInfoDialog : RoomBoomInfoDialog ? = null
@CallSuper
override fun onFindViews() {
initMessageView()
@@ -230,14 +268,55 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
showRoomIntroduction(false)
}
})
btnIvConfigEntrance = mView.findViewById(R.id.iv_config_entrance)
btnIvgame = mView.findViewById(R.id.iv_game)
boomLayout = mView.findViewById(R.id.boomLayout)
boomIcon = mView.findViewById(R.id.boomIcon)
boomProMax = mView.findViewById(R.id.boomProMax)
boomPro = mView.findViewById(R.id.boomPro)
boomIcon.post {
boomIcon.rotation = -30f
}
boomLayout.setOnClickListener {
mBoomInfoDialog = RoomBoomInfoDialog().apply {
roomUid = AvRoomDataManager.get().roomUid
}
mBoomInfoDialog?.setOnDismissListener {
mBoomInfoDialog = null
}
mBoomInfoDialog?.mCallBack = object : RoomBoomInfoDialog.CallBack {
override fun onCurrBoomInfo(boomInfo: BoomInfo) {
onExpPush(BoomMsgExpPushBean().apply {
speed = boomInfo.speed
level = boomInfo.level
pic = boomInfo.pic
})
}
override fun onClick(type: Int, data: Any) {
mBoomInfoDialog?.dismiss()
onSendGiftBtnClick()
}
}
mBoomInfoDialog?.show(requireContext())
}
}
protected open fun initMessageView() {
messagePager = mView.findViewById<ViewPager2>(R.id.message_pager)
messageView = MessageView(context)
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.all))
tabList.add(getString(R.string.send_msg))
tabList.add(getString(R.string.send_gift_tab_title))
messageView.setMsgType(getString(R.string.all))
val messageIndicator = mView.findViewById<MagicIndicator>(R.id.message_indicator)
messagePager.offscreenPageLimit = tabList.size
messagePager.adapter = object : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
@@ -254,7 +333,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
override fun getItemCount(): Int {
return tabList.size
return 1
}
override fun getItemViewType(position: Int): Int {
@@ -269,7 +348,12 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
commonNavigator.setTitleWrapContent(false)
val magicIndicatorAdapter = RoomMessageIndicatorAdapter(context, tabList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
messagePager.currentItem = position
// messagePager.currentItem = position
val tab = tabList.getOrNull(position)
tab?.let {
messageIndicator.onPageSelected(position)
messageView.setMsgType(it)
}
}
commonNavigator.adapter = magicIndicatorAdapter
messageIndicator.navigator = commonNavigator
@@ -327,6 +411,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
openOrCloseGiftValue(true)
updateView()
updateMicBtn()
AudioEngineManager.get().isNotRecord = AudioEngineManager.get().isNotRecord
microView.setOnMicroItemClickListener(this)
mDisposable = IMNetEaseManager.get().chatRoomEventObservable
.subscribe { onReceiveRoomEvent(it) }
@@ -362,6 +447,62 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
//获取免费礼物详情
mvpPresenter?.queryFreeFlower()
initRoomAlbum()
initRoomBoom()
requestGamesData()
}
private fun initRoomBoom() {
AvRoomModel.get().getRoomBoomInfo(AvRoomDataManager.get().roomUid)
.doOnSuccess { boomInfo: RoomBoomInfo ->
if (boomInfo.roomBoomSignVoList.isVerify()) {
boomInfo.roomBoomSignVoList.forEachIndexed { index, roomBoomInfoSign ->
RoomBoomManager.addAnim(BoomMsgAnimBean().apply {
countDownUrl = roomBoomInfoSign.countDownVapUrl
endUrl = roomBoomInfoSign.endVapUrl
level = roomBoomInfoSign.level
})
}
}
if (boomInfo.prizes.isVerify()) {
val toMap = boomInfo.prizes.groupBy { it.level }.toMap()
toMap.forEach { t, u ->
RoomBoomManager.addAward(BoomMsgAwardList().apply {
list = u
})
}
}
}
.doOnError {
LogUtils.d("")
}
.compose(bindToLifecycle())
.subscribe()
AvRoomModel.get().getBoomInfo(AvRoomDataManager.get().roomUid)
.doOnSuccess {
it.forEach { info->
if (info.currLevel) {
mBoomExp = BoomMsgExpPushBean().apply {
level = info.level
speed = info.speed
pic = info.pic
}
boomLayout.setVis(true)
boomIcon.loadImage(info.pic)
boomProMax.post {
boomPro.setViewWH(width = (boomProMax.width * (info.speed.toFloat() / 100)).toInt(), isDP = false)
}
}
}
}
.doOnError {
LogUtils.d(""+it?.message)
}
.compose(bindToLifecycle())
.subscribe()
}
@SuppressLint("CheckResult")
@@ -411,6 +552,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
updateRedPackage()
updateView()
updateRemoteMuteBtn()
updateConfigButtonArea()
openOrCloseGiftValue(false)
}
@@ -472,6 +614,8 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
RoomEvent.LEAVE_MODE -> microView.adapter.notifyDataSetChanged()
RoomEvent.ROOM_CLEAN_SCREEN -> messageView.clear()
RoomEvent.MSG_BOOM -> onBoomAboutMsg(roomEvent);
}
}
@@ -645,14 +789,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
@@ -713,6 +857,8 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
super.onDestroyView()
releaseView()
unregisterWidgets()
mBoomInfoDialog?.dismiss()
mBoomInfoDialog = null
}
override fun onDestroy() {
@@ -753,14 +899,14 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
}
R.id.iv_game -> {
val dialog = RoomGameplayDialog()
dialog.isOnlyPK = false
val dialog = RoomGameListDialog();
dialog.code = hashCode()
dialog.listener = object : RoomGameplayDialog.GameplayDialogListener {
override fun onShowBaiShunGame(url: String, config: BaiShunGameConfig) {
(activity as? AVRoomActivity)?.showBaiShunGame(url, config)
}
}
dialog.show(childFragmentManager, "ROOM_GAME_PLAY")
dialog.show(childFragmentManager, "GAME_LIST")
}
R.id.input_send -> {
sendMsg()
@@ -897,10 +1043,12 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
callback.onFail()
EventBus.getDefault().post(GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_CANCEL))
} else {
giftDialog?.hide()
val giftComboEvent = GiftComboEvent(GiftComboEvent.Action.ACT_GIFT_END)
giftComboEvent.giftNumber = gift.data.giftNum
EventBus.getDefault().post(giftComboEvent)
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()
}
}
@@ -1332,37 +1480,69 @@ 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())
override fun onOpenMicBtnClick(type : Int) {
//todo do 关麦开麦
val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString())
if (roomQueueInfo?.mRoomMicInfo == null) return
//先判斷麥上是否是開麥的
if (!roomQueueInfo.mRoomMicInfo.isMicMute && !AudioEngineManager.get().isAudienceRole) {
if (!isHavingMicPermissions) {
val rxPermissions = RxPermissions(this@BaseRoomFragment)
rxPermissions.request(Manifest.permission.RECORD_AUDIO)
.subscribe { aBoolean: Boolean ->
if (aBoolean) {
AudioEngineManager.get().isMute = !AudioEngineManager.get().isMute
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER)
if (type == MyConstant.MicType.open) {
AudioEngineManager.get().isMute = false
AudioEngineManager.get().isNotRecord = false
// AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER)
}else if (type == MyConstant.MicType.music) {
AudioEngineManager.get().isMute = false
// AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER)
AudioEngineManager.get().isNotRecord = true
}else if (type == MyConstant.MicType.close) {
AudioEngineManager.get().isMute = true
// AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE)
AudioEngineManager.get().isNotRecord = false
}
updateMicBtn()
} else {
toast("開啟權限後才能開麥")
toast(R.string.ask_again.getString())
}
}
return
}
AudioEngineManager.get().isMute = !AudioEngineManager.get().isMute
if (type == MyConstant.MicType.open) {
AudioEngineManager.get().isMute = false
AudioEngineManager.get().isNotRecord = false
// AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER)
}else if (type == MyConstant.MicType.music) {
AudioEngineManager.get().isMute = false
// AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER)
AudioEngineManager.get().isNotRecord = true
}else if (type == MyConstant.MicType.close) {
AudioEngineManager.get().isMute = true
// AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE)
AudioEngineManager.get().isNotRecord = false
}
updateMicBtn()
if (AudioEngineManager.get().isMute) {
AudioEngineManager.get().stopLocalAudio()
} else if (AvRoomDataManager.get().isOnMic(myUid)) {
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER)
}
}
}
override fun onSendFaceBtnClick() {
if (AvRoomDataManager.get().isOnMic(myUid) || AvRoomDataManager.get().isRoomOwner) {
if (dynamicFaceDialog == null) {
@@ -1489,12 +1669,12 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
protected open fun onInitMusicPlayerView(view: MusicPlayerView) {
//todo-- 音乐按钮
}
//礼物连击相关 消息
@Subscribe(threadMode = ThreadMode.MAIN)
fun onGiftComboEvent(event: GiftComboEvent) {
when (event.action) {
@@ -1511,4 +1691,163 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
}
//横幅相关消息
@Subscribe(threadMode = ThreadMode.MAIN)
fun onNotifyEvent(event: NotifyEvent) {
when (event.action) {
NotifyEvent.Action.ACT_BAI_SHUN_GAME-> {
val gameId = event.data
if (gameId is String){
val roomContext = get()
if (roomContext != null) {
val dataService = roomContext.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
if (dataService != null) {
val gameplay_list = "gameplay_list#" + hashCode()
val gameplayList = dataService?.getData(gameplay_list) as? List<RoomIcon>
if (gameplayList.isVerify()) {
val game = GameUtil.findGame(gameId.toLong(), gameplayList!!)
if (game != null) {
GameUtil.startGame(game){url, config->
(activity as? AVRoomActivity)?.showBaiShunGame(url, config)
}
}
}
}
}
}
}
else -> {}
}
}
var hasBaishunGames = false
private fun requestGamesData() {
val roomContext = get()
if (roomContext != null) {
val dataService = roomContext.findAbility<RoomDataService>(RoomDataService::class.java.simpleName)
if (dataService != null) {
val game_list = "game_list#" + hashCode()
val gameplay_list = "gameplay_list#" + hashCode()
val getGameList = getGameList(AvRoomDataManager.get().roomUid)
.doOnError {
}
.subscribe { it: List<GameInfo> ->
if (dataService != null) {
LogUtils.d("gameListData-- game_list 2 save code=$game_list size=${it.size}")
dataService.putData(game_list, it)
}
}
val roomGamePlayList = AvRoomModel.get().roomGamePlayList.doOnError {
hasBaishunGames = false
updateConfigButtonArea()
}.subscribe { roomIcons ->
if (dataService != null) {
LogUtils.d("gameListData-- gameplay_list 1 save code=$gameplay_list size=${roomIcons.size}")
dataService.putData(gameplay_list, roomIcons)
}
hasBaishunGames = roomIcons.size > 0
updateConfigButtonArea()
}
}
}
}
private fun updateConfigButtonArea() {
val configModel = AvRoomDataManager.get().rightBottomIconConfig
if (configModel == null) {
btnIvConfigEntrance.setVisibility(View.GONE)
} else {
if (configModel.icon1Url == null) {
btnIvConfigEntrance.setVisibility(View.GONE)
} else {
ImageLoadUtils.loadAvatar(configModel.icon1Url, btnIvConfigEntrance)
btnIvConfigEntrance.setVisibility(View.VISIBLE)
}
if (configModel.icon2Url != null) {
ImageLoadUtils.loadAvatar(configModel.icon2Url, btnIvgame)
}
}
if (hasBaishunGames) {
btnIvgame.setVisibility(View.VISIBLE)
} else {
btnIvgame.setVisibility(View.GONE)
}
}
/**
* boom 玩法消息
*/
private fun onBoomAboutMsg(roomEvent: RoomEvent) {
val data = roomEvent.boomMsg
if (data != null) {
LogUtils.d(" RoomBoomManager BaseRoom onBoomAboutMsg() second=${data.second} ")
if (data.second == CustomAttachment.BOOM_SECOND_EXP_PUSH) {
val expPushBean = data.expPushBean
if (expPushBean != null) {
onExpPush(expPushBean)
}
} else if (data.second == CustomAttachment.BOOM_SECOND_AWARD) {
val awardList = data.awardList
if (awardList != null) {
onAwardDialog(awardList)
}
} else if (data.second == CustomAttachment.BOOM_SECOND_DIALOG) {
// 播放动画
val dialogBean = data.DialogBean
if (dialogBean != null) {
onBoomAnim(dialogBean)
}
}
}
}
var mBoomExp: BoomMsgExpPushBean?=null
//更新boom进度
private fun onExpPush(expPushBean: BoomMsgExpPushBean) {
LogUtils.d(" RoomBoomManager BaseRoom onExpPush() indexLevel=${mBoomExp?.level} expPushLevel=${expPushBean.level} indexSpeed=${mBoomExp?.speed} expPushSpeed=${expPushBean.speed} ")
mBoomInfoDialog?.setPro(expPushBean.speed,expPushBean.level)
if (mBoomExp != null) {
if (mBoomExp!!.level > expPushBean.level) return
if (mBoomExp!!.speed >= expPushBean.speed) return
}
mBoomExp = expPushBean
boomLayout.setVis(true)
boomIcon.loadImage(expPushBean.pic)
boomProMax.post {
val width = (boomProMax.width * (expPushBean.speed.toFloat() / 100)).toInt()
LogUtils.d(" RoomBoomManager BaseRoom onExpPush() width = $width")
boomPro.setViewWH(width = width, isDP = false)
}
}
//boom中奖弹窗
private fun onAwardDialog(awardList: BoomMsgAwardList) {
LogUtils.d(" RoomBoomManager BaseRoom onAwardDialog() ")
RoomBoomManager.addAward(awardList)
}
//boom进度满了 播放动画
private fun onBoomAnim(dialogBean: BoomMsgDialogBean) {
LogUtils.d(" RoomBoomManager BaseRoom onBoomAnim() ")
if (dialogBean.roomUid == AvRoomDataManager.get().roomUid) {
RoomBoomManager.addAnim(BoomMsgAnimBean().apply {
countDownUrl = dialogBean.countDownVapUrl.trim()
endUrl = dialogBean.endVapUrl.trim()
level = dialogBean.level
})
}
}
}

View File

@@ -22,15 +22,18 @@ import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import com.chwl.app.avroom.activity.RoomTitleEditActivity;
import com.chwl.app.avroom.dialog.BaseRoomNotifyeLuckGiftDialog;
import com.chwl.app.databinding.LayoutRoomNotifyLuckyGiftTipBinding;
import com.chwl.app.utils.GiftAnimUtil;
import com.chwl.app.utils.NumberUtils;
import com.chwl.app.utils.RoomBoomManager;
import com.chwl.app.utils.RoomNotifyDialogManager;
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;
@@ -83,7 +86,6 @@ 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;
@@ -119,8 +121,6 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
//收藏房间
private String FOLLOW_ROOM_TYPE = "";
//幸运礼物 飘屏队列
private ArrayList<LuckyGiftMsgAllBean> mLuckyGiftList = new ArrayList<>();
public static HomePartyFragment newInstance() {
HomePartyFragment homePartyFragment = new HomePartyFragment();
@@ -232,6 +232,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
@SuppressLint("CheckResult")
@Override
public void initiate() {
RoomBoomManager.INSTANCE.init(gameMainBinding.roomAnim);
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null) return;
if (!AvRoomDataManager.get().haveSelfChange) {
@@ -291,6 +292,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
case RoomEvent.MSG_SUPER_LUCKY_GIFT:
onLuckyGiftMsg(roomEvent);
break;
case RoomEvent.MSG_CP_ABOUT:
onCpAboutMsg(roomEvent);
break;
default:
break;
}
@@ -520,7 +524,8 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
luckyGiftTipPool.clear();
handler.removeCallbacksAndMessages(null);
mLuckyGiftList.clear();
RoomNotifyDialogManager.INSTANCE. clear();
RoomBoomManager.INSTANCE. clear();
if (giftView != null) {
giftView.release();
@@ -694,6 +699,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
}
/**
* 幸运礼物 飘屏 跟 圆球提示
*/
private void onLuckyGiftMsg(RoomEvent roomEvent) {
MsgSuperLuckyGift msgSuperLuckyGift = roomEvent.getMsgSuperLuckyGift();
if (msgSuperLuckyGift != null) {
@@ -708,7 +716,6 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
}
private Handler handler = new Handler(Looper.getMainLooper());
private WeakPool<View> luckyGiftTipPool = new WeakPool<>(3);
private void showLuckyGiftDlgNotify(LuckyGiftMsgSelfBean luckyGiftMsgBean) {
@@ -757,39 +764,31 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
}, 2300);
}
BaseRoomNotifyeLuckGiftDialog allServiceLuckGiftDialog;
private void showLuckyGiftDlg(LuckyGiftMsgAllBean luckyGiftMsgAllBean){
LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDlg() ");
mLuckyGiftList.add(luckyGiftMsgAllBean);
if (!(allServiceLuckGiftDialog != null && allServiceLuckGiftDialog.isShowing())) {
LuckyGiftMsgAllBean data = mLuckyGiftList.remove(0);
LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDlg() -> showLuckyGiftDialog"+mLuckyGiftList.size());
showLuckyGiftDialog(data);
private void showLuckyGiftDlg(LuckyGiftMsgAllBean data) {
//todo do 校验数据是否异常
RoomNotifyDialogManager.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) {
RoomNotifyDialogManager.INSTANCE.addDialog(new RoomNotifyDialogBean(
CustomAttachment.CP_FIRST,
cpMsgBean.getSecond(),
cpMsgBean
));
}
}
private void showLuckyGiftDialog(LuckyGiftMsgAllBean luckyGiftMsgAllBean){
LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ");
allServiceLuckGiftDialog = new BaseRoomNotifyeLuckGiftDialog(requireContext());
allServiceLuckGiftDialog.setLuckyGiftMsgBean(luckyGiftMsgAllBean);
allServiceLuckGiftDialog.setMCallBack(new BaseRoomNotifyeLuckGiftDialog.CallBack() {
@Override
public void onHide() {
LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ->onHide");
gameMainBinding.getRoot().postDelayed(new Runnable() {
@Override
public void run() {
LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ->onHide->postDelayed");
if (!mLuckyGiftList.isEmpty()){
LuckyGiftMsgAllBean data = mLuckyGiftList.remove(0);
LogUtils.d(" LuckyGiftDlg -- showLuckyGiftDialog() ->onHide->postDelayed-> "+mLuckyGiftList.size());
showLuckyGiftDialog(data);
}
}
},100);
}
});
allServiceLuckGiftDialog.show();
}

View File

@@ -7,6 +7,7 @@ import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import com.chwl.app.avroom.dialog.RoomTeamPKResultDialog;
@@ -17,11 +18,16 @@ 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.app.ui.widget.GiftDialog;
import com.chwl.core.gift.bean.GiftInfo;
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.room.queue.bean.MicMemberInfo;
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;
@@ -77,6 +83,7 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -108,8 +115,6 @@ 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();
@@ -158,29 +163,8 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
updateQueuingMicBtn();
updatePkScoreBoard();
initRoomPkOrder(AvRoomDataManager.get().showPkBeginTime, AvRoomDataManager.get().pkBeginTime);
requestData();
}
private void requestData() {
RoomDataService dataService = (RoomDataService) AudioRoomContext.Companion.get().findAbility(RoomDataService.class.getSimpleName());
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
public void onReceiveRoomEvent(RoomEvent roomEvent) {
@@ -228,7 +212,6 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
gameBinding.setRoomInfo(AvRoomDataManager.get().mCurrentRoomInfo);
updateQueuingMicBtn();
updatePkScoreBoard();
updateConfigButtonArea();
getMvpPresenter().updateLeaveMode();
break;
case RoomEvent.ENTER_ROOM:
@@ -502,7 +485,6 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
updateMicroView();
changeModelShowView();
refreshDatingNextStatus();
// updateConfigButtonArea();
}
protected void updateMicroView(){
@@ -530,29 +512,7 @@ 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) {

View File

@@ -68,7 +68,6 @@ 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 {

View File

@@ -21,7 +21,6 @@ import com.example.lib_utils.ktx.singleClick
/**
* 房间榜单入口
* //todo-- 房间榜单入口
*/
class RoomRankNumberWidget : FrameLayoutRoomWidget, RoomWidget {

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

@@ -12,33 +12,38 @@ import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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.core.utils.extension.StringExtensionKt;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.msg.model.RecentContact;
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.avroom.activity.RoomTypeSwitchActivity;
import com.chwl.app.room_chat.activity.RoomMsgActivity;
import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.core.contacts.MyConstant;
import com.chwl.core.helper.ImHelperUtils;
import com.chwl.core.manager.AudioEngineManager;
import com.chwl.core.manager.AvRoomDataManager;
import com.chwl.core.manager.IMMessageManager;
import com.chwl.core.pay.event.FirstChargeEvent;
import com.chwl.core.room.bean.RoomInfo;
import com.chwl.core.room.bean.RoomModeType;
import com.chwl.core.super_admin.util.SuperAdminUtil;
import com.chwl.core.utils.LogUtils;
import com.chwl.core.utils.SharedPreferenceUtils;
import com.chwl.core.utils.extension.StringExtensionKt;
import com.chwl.library.utils.ListUtils;
import com.hjq.toast.ToastUtils;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.msg.model.RecentContact;
import com.netease.nimlib.sdk.uinfo.model.UserInfo;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -73,12 +78,13 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
private ImageView iconMicQueue;
private ImageView iconRoomMsg;
private ImageView iconRoomBaiShunGame;
private ImageView pkGameView;
@Nullable
private PopupWindow msgTipPopupWindow;
private PopupWindow micSetPopupWindow;
private int bottomHeight;
private int micSetHeight;
@NonNull
private final Runnable msgRunnable = this::dismissMsgPopupWindow;
@@ -108,12 +114,10 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
remoteMute = findViewById(R.id.icon_room_open_remote_mic);
faceLayout = findViewById(R.id.room_face_layout);
micLayout = findViewById(R.id.room_mic_layout);
iconRoomBaiShunGame = findViewById(R.id.icon_room_baishun_game);
iconMicQueue = (ImageView) findViewById(R.id.icon_mic_queue);
iconRoomMsg = findViewById(R.id.iv_room_message);
pkGameView = findViewById(R.id.icon_room_PK_game);
openMic.setOnClickListener(this);
sendMsgInput.setOnClickListener(this);
sendFace.setOnClickListener(this);
@@ -122,8 +126,6 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
sendMagic.setOnClickListener(this);
iconMicQueue.setOnClickListener(this);
iconRoomMsg.setOnClickListener(this);
pkGameView.setOnClickListener(this);
iconRoomBaiShunGame.setOnClickListener(this);
setMicBtnEnable(false);
setMicBtnOpen(false);
@@ -134,6 +136,22 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
sendGift.setVisibility(GONE);
sendMsgInput.setVisibility(GONE);
}
iconRoomMsg.post(() -> {
bottomHeight = iconRoomMsg.getHeight();
View view = LayoutInflater.from(getContext()).inflate(R.layout.popup_mic_set, null);
view.setVisibility(View.INVISIBLE);
ViewGroup parent = (ViewGroup) this.getParent();
parent.addView(view);
view.post(() -> {
micSetHeight = view.getHeight();
try {
parent.removeView(view);
}catch (Exception e){
}
});
});
}
@Override
@@ -232,11 +250,45 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
public void setMicBtnOpen(boolean isOpen) {
if(openMic == null){
return;
}
// if (isOpen) {
// openMic.setImageResource(R.drawable.room_menu_ic_mic_open);
// } else {
// openMic.setImageResource(R.drawable.room_menu_ic_mic_close);
// }
if (isOpen) {
openMic.setImageResource(R.drawable.room_menu_ic_mic_open);
if (AudioEngineManager.get().isNotRecord()) {
openMic.setImageResource(R.drawable.room_menu_ic_mic_music);
} else {
openMic.setImageResource(R.drawable.room_menu_ic_mic_open);
}
} else {
openMic.setImageResource(R.drawable.room_menu_ic_mic_close);
}
//
// RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
// if (currentRoomInfo != null) {
// openMic.setEnabled(true);
// if(!AudioEngineManager.get().isMute()){
// if (AudioEngineManager.get().isNotRecord()) {
// openMic.setImageResource(R.drawable.room_menu_ic_mic_music);
// } else {
// openMic.setImageResource(R.drawable.room_menu_ic_mic_open);
// }
// }else{
// openMic.setImageResource(R.drawable.room_menu_ic_mic_close);
// }
// } else {
// openMic.setEnabled(false);
// openMic.setImageResource(R.drawable.room_menu_ic_mic_close);
// }
}
public void setRemoteMuteOpen(boolean isOpen) {
@@ -247,9 +299,6 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
}
public void setBaiShunBtnOpen(boolean isOpen) {
iconRoomBaiShunGame.setVisibility(isOpen ? VISIBLE : GONE);
}
public void notifyStateChanged() {
setMagicBtnEnable(true);
@@ -261,19 +310,19 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
}
public void updateGameEntrance() {
//todo-- game btn
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);
}
// 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);
// }
}
@@ -325,9 +374,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
public void onClick(View v) {
switch (v.getId()) {
case R.id.icon_room_open_mic:
if (wrapper != null) {
wrapper.onOpenMicBtnClick();
}
showMicSetDialog(openMic);
break;
case R.id.tv_room_send_msg_input:
@@ -376,16 +423,16 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
wrapper.onRoomMessageClick();
}
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;
// 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;
}
@@ -467,4 +514,62 @@ 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.setOutsideTouchable(true);
// micSetPopupWindow.setTouchable(true);
// micSetPopupWindow.setFocusable(false);
// micSetPopupWindow.setAnimationStyle(R.style.style_anim_mic_set);
} else {
if (micSetPopupWindow.isShowing()) return;
contentView = micSetPopupWindow.getContentView();
}
contentView.post(() -> {
LogUtils.d("height = "+contentView.getHeight());
});
ImageView micOff = contentView.findViewById(R.id.micOff);
ImageView micMusic = contentView.findViewById(R.id.micMusic);
ImageView micOn = contentView.findViewById(R.id.micOn);
micOn.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
if (wrapper != null) {
ToastUtils.show(R.string.roomMicSetOpen);
wrapper.onOpenMicBtnClick(MyConstant.MicType.open);
}
});
micMusic.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
if (wrapper != null) {
ToastUtils.show(R.string.roomMicSetMusic);
wrapper.onOpenMicBtnClick(MyConstant.MicType.music);
}
});
micOff.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
if (wrapper != null) {
ToastUtils.show(R.string.roomMicSetClose);
wrapper.onOpenMicBtnClick(MyConstant.MicType.close);
}
});
int[] vLoc = new int[2];
parent.getLocationInWindow(vLoc);
try {
micSetPopupWindow.showAsDropDown(parent,0,-(bottomHeight+micSetHeight),Gravity.BOTTOM);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -1,5 +1,7 @@
package com.chwl.app.avroom.widget;
import static com.chwl.core.im.custom.bean.CustomAttachment.BOOM_FIRST;
import static com.chwl.core.im.custom.bean.CustomAttachment.BOOM_SECOND_DIALOG;
import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_FAIRY;
import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GIFT_COMPOUND;
import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_RED_PACKAGE;
@@ -32,6 +34,7 @@ import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
@@ -58,8 +61,11 @@ import com.chwl.app.photo.BigPhotoActivity;
import com.chwl.app.photo.PagerOption;
import com.chwl.app.ui.widget.TextSpannableBuilder;
import com.chwl.app.utils.ObjectTypeHelper;
import com.chwl.core.gift.bean.BoomMsgDialogBean;
import com.chwl.core.im.custom.bean.BoomMsgAttachment;
import com.chwl.core.im.custom.bean.TemplateMessageAttachment;
import com.chwl.core.monsterhunting.bean.MonsterDataBean;
import com.chwl.core.utils.LogUtils;
import com.chwl.core.utils.extension.StringExtensionKt;
import com.example.lib_utils.UiUtils;
import com.netease.nim.uikit.business.uinfo.UserInfoHelper;
@@ -222,7 +228,9 @@ public class MessageView extends FrameLayout {
private static final int LOAD_MESSAGE_COUNT = 10;
private final int textColor = 0x80ffffff;
private final List<ChatRoomMessage> atMessages = new ArrayList<>();
private final List<ChatRoomMessage> chatRoomMessages = new LinkedList<>();
private final List<ChatRoomMessage> allMessages = new LinkedList<>();
private final List<ChatRoomMessage> giftMessages = new LinkedList<>();
private final List<ChatRoomMessage> chatMessages = new LinkedList<>();
private RecyclerView messageListView;
private TextView tvBottomTip;
private TextView tvAtTip;
@@ -244,6 +252,8 @@ public class MessageView extends FrameLayout {
private int expLevelWidth;
private int expLevelHeight;
private int giftLength;
private int boomWidth;
private int boomHeight;
private volatile boolean needAutoScroll = true;//是否自動滾動到底部
private Consumer<String> clickConsumer;
private OnClick onClick;
@@ -251,6 +261,94 @@ public class MessageView extends FrameLayout {
private OnMsgLongClickListener onLongClickListener;
private TemplateMessageAdapter templateMessageAdapter;
//分类
private String mMsgType;
public void setMsgType(String msgType) {
mMsgType = msgType;
if (isAll()) {
mMessageAdapter.setData(allMessages);
} else if (isGift()) {
mMessageAdapter.setData(giftMessages);
} else if (isChat()) {
mMessageAdapter.setData(chatMessages);
}
checkShowAtTip();
mMessageAdapter.notifyDataSetChanged();
messageListView.post(() -> {
needAutoScroll = true;
if (mMessageAdapter.getItemCount() - 1 >= 0) {
messageListView.scrollToPosition(mMessageAdapter.getItemCount() - 1);
}
});
}
private boolean isAll() {
return mMsgType.equals(ResUtil.getString(R.string.all));
}
private boolean isChat() {
return mMsgType.equals(ResUtil.getString(R.string.send_msg));
}
private boolean isGift() {
return mMsgType.equals(ResUtil.getString(R.string.send_gift_tab_title));
}
//todo do 消息类型分类 需要进一步判断
private boolean isChatMsg(ChatRoomMessage msg) {
return (msg.getMsgType() == MsgTypeEnum.text);
}
//todo do 消息类型分类 需要进一步判断
private boolean isGiftMsg(ChatRoomMessage msg) {
if (msg.getMsgType() == MsgTypeEnum.custom) {
CustomAttachment attachment = (CustomAttachment) msg.getAttachment();
if (attachment == null) {
return false;
} else {
int first = attachment.getFirst();
int second = attachment.getSecond();
return (first != BOOM_FIRST
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_AUCTION
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_ROOM_TIP
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FACE
&& first != CustomAttachment.CUSTOM_MESS_HEAD_NOBLE
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_QUEUE
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_SUPER_ADMIN
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_KICK_MIC
&& first != CustomAttachment.CUSTOM_MSG_UPDATE_ROOM_INFO
&& first != CustomAttachment.CUSTOM_MSG_QUEUING_MIC
&& first != CustomAttachment.CUSTOM_MESS_HEAD_ROOM_PK
&& first != CustomAttachment.CUSTOM_MSG_SIGN_IN
&& first != CustomAttachment.CUSTOM_MSG_MINI_WORLD
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_PUBLIC_SCREEN
&& first != CustomAttachment.CUSTOM_MSG_HEADER_TYPE_FOLLOW_ROOM
&& first != CustomAttachment.CUSTOM_MSG_DATING
&& first != CustomAttachment.CUSTOM_MSG_VIP
&& first != CustomAttachment.CUSTOM_MSG_FANS_TEAM
&& first != CustomAttachment.CUSTOM_MSG_ROOM_ALBUM
&& first != CustomAttachment.CUSTOM_MSG_ROOM_TEMPLATE
);
}
} else {
return false;
}
}
private boolean isCurrType(ChatRoomMessage msg) {
boolean isType = false;
if (isAll()) {
isType = true;
} else if (isChat()) {
isType = isChatMsg(msg);
} else if (isGift()) {
isType = isGiftMsg(msg);
}
return isType;
}
public MessageView(Context context) {
this(context, null);
}
@@ -263,6 +361,7 @@ public class MessageView extends FrameLayout {
super(context, attr, i);
init(context);
}
public void setOnLongClickListener(OnMsgLongClickListener onLongClickListener) {
this.onLongClickListener = onLongClickListener;
}
@@ -280,13 +379,35 @@ public class MessageView extends FrameLayout {
super.onAttachedToWindow();
List<ChatRoomMessage> tmpList = AvRoomDataManager.get().getChatRoomMessages();
if (!ListUtils.isListEmpty(tmpList)) {
this.chatRoomMessages.addAll(tmpList);
this.allMessages.addAll(tmpList);
addMsgByType(tmpList, false);
}
if (mMessageAdapter.getItemCount() - 1 >= 0) {
messageListView.scrollToPosition(mMessageAdapter.getItemCount() - 1);
}
messageListView.scrollToPosition(mMessageAdapter.getItemCount() - 1);
disposable = AvRoomDataManager.get().getChatRoomMsgProcessor()
.subscribe(this::onCurrentRoomReceiveNewMsg);
}
private void addMsgByType(List<ChatRoomMessage> list, boolean isHistory) {
list.forEach(chatRoomMessage -> {
if (!isHistory) {
if (isChatMsg(chatRoomMessage)) {
chatMessages.add(chatRoomMessage);
} else if (isGiftMsg(chatRoomMessage)) {
giftMessages.add(chatRoomMessage);
}
} else {
if (isChatMsg(chatRoomMessage)) {
chatMessages.add(chatMessages.size() > 0 ? 1 : 0, chatRoomMessage);
} else if (isGiftMsg(chatRoomMessage)) {
giftMessages.add(giftMessages.size() > 0 ? 1 : 0, chatRoomMessage);
}
}
});
}
@Override
protected void onDetachedFromWindow() {
if (disposable != null) disposable.dispose();
@@ -311,6 +432,8 @@ public class MessageView extends FrameLayout {
expLevelHeight = Utils.dip2px(context, 18);
expLevelWidth = expLevelHeight * 36 / 18;//expLevelHeight * 114 / 45
giftLength = Utils.dip2px(context, 35);
boomWidth = Utils.dip2px(context, 41);
boomHeight = Utils.dip2px(context, 60);
// 內容區域
layoutManger = new LinearLayoutManager(context, RecyclerView.VERTICAL, false);
FrameLayout.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
@@ -324,7 +447,7 @@ public class MessageView extends FrameLayout {
messageListView.setLayoutManager(layoutManger);
messageListView.addItemDecoration(new DividerItemDecoration(context, layoutManger.getOrientation(), 16, R.color.transparent));
mMessageAdapter = new MessageAdapter(getContext());
mMessageAdapter.setData(chatRoomMessages);
mMessageAdapter.setData(allMessages);
messageListView.setAdapter(mMessageAdapter);
messageListView.setItemAnimator(new MyItemAnimator());
messageListView.getItemAnimator().setAddDuration(0);
@@ -348,7 +471,10 @@ public class MessageView extends FrameLayout {
tvBottomTip.setOnClickListener(v -> {
tvBottomTip.setVisibility(GONE);
needAutoScroll = true;
messageListView.smoothScrollToPosition(mMessageAdapter.getItemCount() - 1);
if (mMessageAdapter.getItemCount() - 1 >= 0) {
messageListView.smoothScrollToPosition(mMessageAdapter.getItemCount() - 1);
}
});
addView(tvBottomTip);
@@ -366,7 +492,14 @@ public class MessageView extends FrameLayout {
tvAtTip.setVisibility(GONE);
tvAtTip.setOnClickListener(v -> {
if (!atMessages.isEmpty()) {
int scrollIndex = chatRoomMessages.indexOf(atMessages.remove(0));
int scrollIndex = -1;
if (isAll()) {
scrollIndex = allMessages.indexOf(atMessages.remove(0));
} else if (isChat()) {
scrollIndex = chatMessages.indexOf(atMessages.remove(0));
}
if (scrollIndex != -1 && scrollIndex < mMessageAdapter.getItemCount()) {
messageListView.smoothScrollToPosition(scrollIndex);
}
@@ -397,7 +530,7 @@ public class MessageView extends FrameLayout {
if (lastVisibleItemPosition == RecyclerView.NO_POSITION) {
// Logger.e(TAG, "lastCompletelyVisibleItemPosition : RecyclerView.NO_POSITION");
needAutoScroll = true;
} else if (!atMessages.isEmpty() && atMessages.remove(chatRoomMessages.get(lastVisibleItemPosition))) {
} else if (!atMessages.isEmpty() && atMessages.remove(allMessages.get(lastVisibleItemPosition))) {
checkShowAtTip();
}
// Log.e(TAG, "lastVisibleItemPosition:" + lastVisibleItemPosition
@@ -444,31 +577,56 @@ public class MessageView extends FrameLayout {
*/
private void addMessages(ChatRoomMessage msg) {
if (msg == null) return;
chatRoomMessages.add(msg);
allMessages.add(msg);
//通知adapter 刷新
mMessageAdapter.notifyItemInserted(mMessageAdapter.getItemCount() - 1);
List<ChatRoomMessage> msgs = new ArrayList<>();
msgs.add(msg);
addMsgByType(msgs, false);
if (mMessageAdapter.getItemCount() - 1 >= 0 && isCurrType(msg)) {
mMessageAdapter.notifyItemInserted(mMessageAdapter.getItemCount() - 1);
}
showTipsOrScrollToBottom();
checkAtMe(msg, false);
keepSizeUnderLimit();
}
private void addHistoryMessages(List<ChatRoomMessage> messages) {
chatRoomMessages.addAll(chatRoomMessages.size() > 0 ? 1 : 0, messages);
allMessages.addAll(allMessages.size() > 0 ? 1 : 0, messages);
addMsgByType(messages, true);
mMessageAdapter.notifyDataSetChanged();
messageListView.scrollToPosition(mMessageAdapter.getItemCount() - 1);
if (mMessageAdapter.getItemCount() - 1 >= 0) {
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();
while (allMessages.size() > MAX_MESSAGE_SIZE) {
Log.i("keepSizeUnderLimit", "size" + allMessages.size());
ChatRoomMessage message = allMessages.remove(0);
if (isAll()) {
if (atMessages.remove(message)) {
checkShowAtTip();
}
}
mMessageAdapter.notifyItemRemoved(0);
}
while (chatMessages.size() > MAX_MESSAGE_SIZE) {
chatMessages.remove(0);
if (isChat()) {
mMessageAdapter.notifyItemRemoved(0);
}
}
while (giftMessages.size() > MAX_MESSAGE_SIZE) {
giftMessages.remove(0);
if (isGift()) {
mMessageAdapter.notifyItemRemoved(0);
}
}
}
private void checkShowAtTip() {
@@ -507,7 +665,10 @@ public class MessageView extends FrameLayout {
}
return;
}
messageListView.smoothScrollToPosition(mMessageAdapter.getItemCount() - 1);
if (mMessageAdapter.getItemCount() - 1 >= 0) {
messageListView.smoothScrollToPosition(mMessageAdapter.getItemCount() - 1);
}
}
public void release() {
@@ -522,7 +683,7 @@ public class MessageView extends FrameLayout {
* @param b
*/
public void changeFollowStatus(int position, boolean b) {
ChatRoomMessage chatRoomMessage = chatRoomMessages.get(position);
ChatRoomMessage chatRoomMessage = allMessages.get(position);
if (!(chatRoomMessage.getAttachment() instanceof RoomFollowOwnerAttachment)) {
return;
}
@@ -539,7 +700,7 @@ public class MessageView extends FrameLayout {
* @param b
*/
public void changeJoinMiniWorldStatus(int position, boolean b) {
ChatRoomMessage chatRoomMessage = chatRoomMessages.get(position);
ChatRoomMessage chatRoomMessage = allMessages.get(position);
if (!(chatRoomMessage.getAttachment() instanceof JoinMiniWorldAttachment)) {
return;
}
@@ -550,7 +711,9 @@ public class MessageView extends FrameLayout {
public void clear() {
if (mMessageAdapter != null) {
chatRoomMessages.clear();
allMessages.clear();
chatMessages.clear();
giftMessages.clear();
mMessageAdapter.notifyDataSetChanged();
}
if (tvBottomTip != null) {
@@ -563,7 +726,7 @@ public class MessageView extends FrameLayout {
this.needAutoScroll = needAutoScroll;
}
public RecyclerView getMessageListView(){
public RecyclerView getMessageListView() {
return messageListView;
}
@@ -583,7 +746,7 @@ public class MessageView extends FrameLayout {
void onShowRoomIntroduction();
}
private class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder> implements OnClickListener {
@@ -898,6 +1061,11 @@ public class MessageView extends FrameLayout {
} else {
getTemplateMessageAdapter().convert(tvContent, null);
}
} else if (first == BOOM_FIRST) {
if (second == BOOM_SECOND_DIALOG) {
BoomMsgAttachment boomMsgAttachment = (BoomMsgAttachment) chatRoomMessage.getAttachment();
setMsgBoom(tvContent, boomMsgAttachment);
}
} else {
tvContent.setTextColor(Color.WHITE);
tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip));
@@ -1004,7 +1172,7 @@ public class MessageView extends FrameLayout {
}
private boolean hadUnlock(int photoId) {
List<Integer> unlockedIds= AvRoomDataManager.get().getUnlockedRoomAlbumPhotos();
List<Integer> unlockedIds = AvRoomDataManager.get().getUnlockedRoomAlbumPhotos();
return unlockedIds.contains(photoId);
}
@@ -2581,6 +2749,39 @@ public class MessageView extends FrameLayout {
tvContent.setMovementMethod(new LinkMovementMethod());
}
/**
* {boom图片} 恭喜! {用户名} 触发了超级大奖BOOM...
*/
private void setMsgBoom(TextView tvContent, BoomMsgAttachment boomMsgAttachment) {
if (boomMsgAttachment == null || boomMsgAttachment.DialogBean == null) return;
BoomMsgDialogBean data = boomMsgAttachment.DialogBean;
String boomUrl = data.getPic();
String nick = RegexUtil.getPrintableString(data.getNick());
String text = ResUtil.getString(R.string.roomBoomMessageView, nick);
// tvContent.setText(text);
SpannableString spStr = new SpannableString(text);
int start = text.indexOf(nick);
int end = start + nick.length();
ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#FF3b3b"));
spStr.setSpan(colorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextSpannableBuilder textSpan = new TextSpannableBuilder(tvContent)
.append(boomUrl, boomWidth, boomHeight)
.append(spStr);
// TextSpannableBuilder textSpan = new TextSpannableBuilder(tvContent)
// .append(boomUrl, boomWidth, boomHeight)
// .append(ResUtil.getString(R.string.avroom_widget_roomeffectview_04), new ForegroundColorSpan(getResources().getColor(R.color.white)))
// .append(" "+nick+" ", new ForegroundColorSpan(Color.parseColor("#FF3b3b")))
// .append(ResUtil.getString(R.string.roomBoomMessageView), new ForegroundColorSpan(getResources().getColor(R.color.white)));
tvContent.setText(textSpan.build());
tvContent.setOnClickListener(null);
tvContent.setMovementMethod(new LinkMovementMethod());
tvContent.setBackgroundResource(R.drawable.shape_room_message_bg);
}
/**
* {badge}xxx來了
*

View File

@@ -138,6 +138,48 @@ class TemplateMessageAdapter(val listener: Listener?) {
textView.movementMethod = LinkMovementMethod()
}
fun convertText(textView: TextView, attachment: TemplateMessage?) {
if (attachment == null) {
textView.text = ""
return
}
val nodeList = attachment.getNodeList()
val textBuilder = TextSpannableBuilder(textView)
nodeList.forEach {
if (it is TemplateNode.NormalNode) {
val textColor = parseColor(it.textColor)
if (textColor != null) {
textBuilder.append(it.text, ForegroundColorSpan(textColor))
} else {
textBuilder.append(it.text)
}
} else if (it is TemplateNode.SpecialNode) {
when (it.content.type) {
Content.TEXT -> {
val text = it.content.text?.getFirstText()
if (!text.isNullOrEmpty()) {
val textColor = parseColor(it.content.textColor)
val clickSpan = createClickSpan(textView.context, it.content, listener)
val list = ArrayList<Any>()
if (textColor != null) {
list.add(ForegroundColorSpan(textColor))
}
if (clickSpan != null) {
list.add(clickSpan)
}
textBuilder.append(text, *list.toArray())
}
}
}
}
}
textView.text = textBuilder.build()
textView.setOnClickListener(null)
textView.movementMethod = LinkMovementMethod()
}
private fun createClickSpan(
context: Context,
content: Content,

View File

@@ -1,6 +1,8 @@
package com.chwl.app.base;
import static com.chwl.core.Constants.DEBUG_MAX_UID;
import static com.chwl.core.im.custom.bean.CustomAttachment.BOOM_FIRST;
import static com.chwl.core.im.custom.bean.CustomAttachment.BOOM_SECOND_DIALOG;
import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_HEAD_NOBLE;
import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_SUB_OPENNOBLE;
import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MESS_SUB_RENEWNOBLE;
@@ -28,7 +30,6 @@ 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,13 +47,23 @@ import androidx.fragment.app.FragmentManager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chwl.app.notify.GlobalNotifyManager;
import com.chwl.app.utils.RoomBoomManager;
import com.chwl.core.gift.bean.BoomMsgAnimBean;
import com.chwl.core.gift.bean.BoomMsgDialogBean;
import com.chwl.core.im.custom.bean.BoomMsgAttachment;
import com.chwl.core.manager.AvRoomDataManager;
import com.chwl.core.utils.LogUtils;
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.chatroom.model.ChatRoomMessageImpl;
import com.netease.nimlib.sdk.NIMSDK;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum;
import com.netease.nimlib.sdk.msg.model.BroadcastMessage;
import com.netease.nimlib.session.IMMessageImpl;
import com.orhanobut.logger.Logger;
import com.readystatesoftware.systembartint.SystemBarTintManager;
import com.tbruyelle.rxpermissions2.RxPermissions;
@@ -265,6 +276,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) {
@@ -1161,8 +1184,29 @@ public abstract class BaseActivity extends RxAppCompatActivity
}
}
break;
case BOOM_FIRST:
if (second == BOOM_SECOND_DIALOG) {
LogUtils.d(" RoomBoomManager BaseAct BOOM_SECOND_DIALOG start");
BoomMsgDialogBean bean = JSON.parseObject(String.valueOf(baseProtocol.getData()), BoomMsgDialogBean.class);
if (bean == null) return;
if (bean.getPartitionId() != UserModel.get().getPartitionId()) return;
//全服飘屏
RoomBoomManager.INSTANCE.addDialog(bean);
//房间内动画跟进度
RoomBoomManager.INSTANCE.notify(bean);
//房间内公屏
BoomMsgAttachment boomMsgAttachment = new BoomMsgAttachment(BOOM_FIRST, BOOM_SECOND_DIALOG);
boomMsgAttachment.DialogBean = bean;
ChatRoomMessage chatRoomMessage = new ChatRoomMessageImpl();
chatRoomMessage.setAttachment(boomMsgAttachment);
((IMMessageImpl)chatRoomMessage).setMsgType(MsgTypeEnum.custom.getValue());
AvRoomDataManager.get().addChatRoomMessage(chatRoomMessage);
}
break;
default:
break;
}
}

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

@@ -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

@@ -13,12 +13,16 @@ import com.chad.library.adapter.base.BaseViewHolder
import com.chwl.app.R
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadAnim
import com.chwl.app.ui.utils.loadFromAssets
import com.chwl.core.home.bean.HomeRoomInfo
import com.chwl.library.common.util.isVerify
import com.chwl.library.common.util.setVis
import com.example.lib_utils.AppUtils
import com.example.lib_utils.UiUtils
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
import com.tencent.qgame.animplayer.AnimView
/**
* create by lvzebiao @2019/11/13
@@ -105,5 +109,21 @@ class HomeRoomAdapter : BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.
pkView.isVisible = false
pkView.stopAnimation()
}
val boomIcon = helper.getView<ImageView>(R.id.boomIcon)
val boomAnim = helper.getView<AnimView>(R.id.boomAnim)
boomIcon.setVis(false)
boomAnim.setVis(false)
if (item.isRoomBoom) {
if (item.roomBoomPic.isVerify()) {
boomIcon.load(item.roomBoomPic)
boomIcon.setVis(true)
}else if (item.roomBoomVapUrl.isVerify()){
boomAnim.loadAnim(item.roomBoomVapUrl)
boomAnim.setVis(true)
}
}
}
}

View File

@@ -82,6 +82,7 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
.setLayoutManager(LinearLayoutManager(mContext))
.build()
adapter.setOnLoadMoreListener({
loadData(false)
}, binding.mRecyclerRoom)

View File

@@ -11,11 +11,13 @@ import android.view.View.OnLongClickListener
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import com.chwl.app.BuildConfig
import com.chwl.app.R
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.RoomBoomRewardDialog
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseFragment
import com.chwl.app.databinding.FragmentMeBinding
@@ -38,6 +40,7 @@ import com.chwl.app.view.GenderAgeTextView
import com.chwl.app.vip.VipCenterActivity
import com.chwl.app.vip.VipViewModel
import com.chwl.core.auth.AuthModel
import com.chwl.core.gift.bean.BoomMsgAwardBean
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(
@@ -365,6 +369,23 @@ class MeFragment : BaseFragment(), View.OnClickListener {
ReportManager.get().reportEvent(IReportConstants.PAYPAGE_SHOW, map)
}
R.id.tv_user_name -> {
//todo do 测试按钮
if (BuildConfig.DEBUG) {
val data1 = arrayListOf<BoomMsgAwardBean>()
for (i in 0 until 10) {
data1.add(BoomMsgAwardBean().apply {
awardPic = "http://beta.img.pekolive.com/FpHRJteaNhJrb-ZBvS3cweeZoPV4?imageslim"
uid = AuthModel.get().currentUid
})
}
RoomBoomRewardDialog(requireContext()).apply {
list = data1
}.show()
}
}
else -> {}
}
}

View File

@@ -154,6 +154,8 @@ object GlobalNotifyManager : Observer<BroadcastMessage>, ILog {
// 通用飘屏
CustomAttachment.CUSTOM_MSG_TEMPLATE_NOTIFY -> {
if (protocol.second == CustomAttachment.CUSTOM_MSG_TEMPLATE_NOTIFY_ALL) {
//todo do 通用飘屏不在房间外显示
if (AvRoomDataManager.get().mCurrentRoomInfo == null) return
val data = Gson().fromJson<RoomTemplateNotifyMsgBean>(
protocol.data.toString(),
RoomTemplateNotifyMsgBean::class.java

View File

@@ -1,6 +1,7 @@
package com.chwl.app.notify
import android.content.Context
import com.chwl.app.notify.views.BaiShunGameNotify
import com.chwl.app.notify.views.FindLoveImageNotify
import com.chwl.app.notify.views.TemplateImageNotify
import com.chwl.app.notify.views.TemplateSvgaNotify
@@ -11,6 +12,7 @@ import com.chwl.app.support.float.FloatView
import com.chwl.app.support.float.FloatViewAdapter
import com.chwl.app.support.float.FloatWindow
import com.chwl.core.gift.bean.LuckyBagNoticeInfo
import com.chwl.core.home.bean.BannerInfo.SKIP_TYPE_ROOM_BAI_SHUN
import com.chwl.core.im.custom.bean.CustomAttachment
import com.chwl.core.im.custom.bean.RoomBoxPrizeAttachment
import com.chwl.core.im.custom.bean.RoomTemplateNotifyMsgBean
@@ -19,12 +21,16 @@ import com.chwl.core.noble.bean.AllServiceGiftProtocol
class NotifyAdapter : FloatViewAdapter {
var onShowUserCard: ((String) -> Unit)? = null
//todo do 通用飘屏
override fun onCreateFloatView(context: Context, item: Any): FloatView? {
when (item) {
// 通用飘屏
is RoomTemplateNotifyMsgBean -> {
if (item.resourceType == RoomTemplateNotifyMsgBean.TYPE_IMAGE) {
if (item.skipType == SKIP_TYPE_ROOM_BAI_SHUN) {
return BaiShunGameNotify(context).apply {
onShowUserCard = this@NotifyAdapter.onShowUserCard
}
}else if (item.resourceType == RoomTemplateNotifyMsgBean.TYPE_IMAGE) {
return TemplateImageNotify(context).apply {
onShowUserCard = this@NotifyAdapter.onShowUserCard
}

View File

@@ -10,9 +10,11 @@ import com.chwl.app.support.float.DoubleQueue
import com.chwl.app.support.float.FloatWindowEngine
import com.chwl.app.support.float.SimpleFloatWindow
import com.chwl.app.support.float.SimpleFloatQueue
import com.chwl.core.home.bean.BannerInfo.SKIP_TYPE_ROOM_BAI_SHUN
import com.chwl.core.im.custom.bean.RoomBoxPrizeAttachment
import com.chwl.core.im.custom.bean.RoomReceivedLuckyGiftAttachment
import com.chwl.core.im.custom.bean.RoomTemplateNotifyAttachment
import com.chwl.core.im.custom.bean.RoomTemplateNotifyMsgBean
import com.chwl.core.manager.AvRoomDataManager
import com.chwl.core.manager.IMNetEaseManager
import com.chwl.core.manager.RoomEvent
@@ -99,11 +101,11 @@ class RoomNotifyManager(activity: FragmentActivity) : LifecycleEventObserver, IL
}
private fun onReceiveChatRoomEvent(roomEvent: RoomEvent) {
//todo do 通用飘屏 房间内
when (roomEvent.event) {
// 通用模版
RoomEvent.TEMPLATE_NOTIFY -> {
val attachment =
roomEvent.chatRoomMessage.attachment as? RoomTemplateNotifyAttachment
val attachment = roomEvent.chatRoomMessage.attachment as? RoomTemplateNotifyAttachment
val data = attachment?.getTemplateMsg() ?: return
queue.addLast(data)
}

View File

@@ -0,0 +1,178 @@
package com.chwl.app.notify.views
import android.content.Context
import android.graphics.Color
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.LayoutInflater
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.Group
import com.chwl.app.R
import com.chwl.app.avroom.widget.TemplateMessageAdapter
import com.chwl.app.common.widget.CircleImageView
import com.chwl.app.support.float.BaseFloatView
import com.chwl.app.ui.utils.loadImage
import com.chwl.core.gift.event.NotifyEvent
import com.chwl.core.im.custom.bean.RoomTemplateNotifyMsgBean
import com.chwl.core.im.custom.bean.TemplateMessage.Content
import com.chwl.library.common.util.isVerify
import com.chwl.library.common.util.setVis
import com.chwl.library.widget.SVGAView
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAParser
import com.opensource.svgaplayer.SVGAVideoEntity
import org.greenrobot.eventbus.EventBus
import java.net.URL
class BaiShunGameNotify(context: Context) : BaseFloatView(context),
TemplateMessageAdapter.Listener {
private val templateMessageAdapter = TemplateMessageAdapter(this)
var onShowUserCard: ((String) -> Unit)? = null
init {
LayoutInflater.from(context).inflate(R.layout.layout_template_notify_baishun, this, true)
}
override fun onBind(item: Any) {
val data = item as? RoomTemplateNotifyMsgBean
if (data == null) {
requestRemoveSelf()
return
}
val svgaView = findViewById<SVGAView>(R.id.iv_bg)
val textView = findViewById<TextView>(R.id.tv_text)
if (data.resourceType == RoomTemplateNotifyMsgBean.TYPE_SVGA && data.resourceContent.isVerify()) {
SVGAParser.shareParser().decodeFromURL(
URL(data.resourceContent),
object : SVGAParser.ParseCompletion {
override fun onComplete(videoItem: SVGAVideoEntity) {
val width = videoItem.videoSize.width
val height = videoItem.videoSize.height
var dimensionRatio = "75:11"
if (width > 0 && height > 0) {
dimensionRatio = "$width:$height"
}
val params = svgaView.layoutParams as ConstraintLayout.LayoutParams
params.dimensionRatio = dimensionRatio
svgaView.layoutParams = params
val drawable = SVGADrawable(videoItem)
svgaView.setImageDrawable(drawable)
svgaView.startAnimation()
setView2(data,textView)
}
override fun onError() {
requestRemoveSelf()
}
},
null
)
} else {
svgaView.loadFile("svga/baishun_notify_bg.svga")
setView2(data,textView)
}
}
// private fun setView(data:RoomTemplateNotifyMsgBean,textView:TextView) {
// val textSize = data.fontSize?.toFloat() ?: 12f
// val textColor = templateMessageAdapter.parseColor(data.textColor) ?: Color.WHITE
// textView.textSize = textSize
// textView.setTextColor(textColor)
// startEnterAnim()
// templateMessageAdapter.convert(textView, data)
// val go = findViewById<ImageView>(R.id.go)
// go.setVis(true)
// go.setOnClickListener {
// val event = NotifyEvent()
// event.action = NotifyEvent.Action.ACT_BAI_SHUN_GAME
// event.data = data.skipContent
// EventBus.getDefault().post(event)
// }
// startDelayRemove()
// }
private fun setView2(data:RoomTemplateNotifyMsgBean,textView:TextView) {
var gameIcon = ""
var avatar = ""
var nick = ""
var diamondNum = ""
val contents = data.contents
val firstText = data.template?.getFirstText()
if (contents.isVerify()) {
contents?.forEachIndexed { index, content ->
if (content.type == Content.TEXT){
if (content.key == "nick"){
nick = content.text?.getFirstText()?:""
}else if (content.key == "diamondNum"){
diamondNum = content.text?.getFirstText()?:""
}
}else if (content.type == Content.IMAGE){
if (content.key == "gameIcon"){
gameIcon = content.image ?:""
}else if (content.key == "avatar"){
avatar = content.image ?:""
}
}
}
}
if (gameIcon.isVerify()) {
val gameIconView = findViewById<ImageView>(R.id.gameIcon)
gameIconView.loadImage(gameIcon)
}
if (avatar.isVerify()) {
val avatarView = findViewById<CircleImageView>(R.id.avatar)
avatarView.loadImage(avatar)
}
// "{gameIcon} {avatar} {nick} Win {diamondNum} Coins"
// if (firstText.isVerify()) {
// val replaceGameIcon = firstText?.replace("{gameIcon}","")
// val replaceAvatar = replaceGameIcon?.replace("{avatar}","")
// val replaceNick = replaceAvatar?.replace("{nick}",nick)
// val replaceDiamondNum = replaceNick?.replace("{diamondNum}",diamondNum)
// var newText = replaceDiamondNum
// if (newText.isVerify()) {
// val spStr = SpannableString(newText)
// val start: Int = newText!!.indexOf(nick)
// val end = start + nick.length
// val colorSpan = ForegroundColorSpan(Color.parseColor("#FF3b3b"))
// spStr.setSpan(colorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// }
// }
val textSize = data.fontSize?.toFloat() ?: 12f
val textColor = templateMessageAdapter.parseColor(data.textColor) ?: Color.WHITE
textView.textSize = textSize
textView.setTextColor(textColor)
templateMessageAdapter.convertText(textView, data)
val go = findViewById<ImageView>(R.id.go)
go.setVis(true)
go.setOnClickListener {
val event = NotifyEvent()
event.action = NotifyEvent.Action.ACT_BAI_SHUN_GAME
event.data = data.skipContent
EventBus.getDefault().post(event)
}
val allView = findViewById<Group>(R.id.allView)
startEnterAnim()
allView.setVis(true)
startDelayRemove()
}
override fun onShowUserCard(uid: String) {
onShowUserCard?.invoke(uid)
}
}

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

@@ -47,7 +47,7 @@ public class LogoutHelper {
activity.toast(ResUtil.getString(R.string.login_helper_logouthelper_013));
} else if (e instanceof BanAccountException) {
BanAccountException exception = (BanAccountException) e;
String text = ResUtil.getString(R.string.login_helper_logouthelper_02) + exception.getMessage() + ResUtil.getString(R.string.login_helper_logouthelper_03);
String text = exception.getMessage() + " " +ResUtil.getString(R.string.login_helper_logouthelper_03);
int start = text.length();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ResUtil.getString(R.string.login_helper_logouthelper_04), Locale.ENGLISH);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+08"));

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,7 @@ public class UserInfoActivity extends BaseBindingActivity<ActivityUserInfoBindin
viewModel.getUserInfoDetailData().observe(this, dataBean -> {
initPhoto(dataBean.getPrivatePhoto());
setWhereVisible();
setCpInfo(dataBean);
});
viewModel.getUserInfoDetailError().observe(this, String -> {
finish();
@@ -256,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)
@@ -270,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);
@@ -297,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));
}
@@ -326,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();
@@ -401,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();
}
/**
@@ -416,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);
}
}
@@ -453,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));
@@ -497,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));
}
}
@@ -570,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));
@@ -597,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;
@@ -625,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;
@@ -635,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;
}
}
@@ -645,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)
@@ -664,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设置改变
}
}
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)

View File

@@ -0,0 +1,51 @@
package com.chwl.app.ui.user.adapter
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.chwl.app.R
import com.chwl.app.bindadapter.BaseAdapter
import com.chwl.app.bindadapter.BindingViewHolder
import com.chwl.app.databinding.ItemUserCpListBinding
import com.chwl.app.ui.utils.CpUtils.getHeadSvga
import com.chwl.app.ui.utils.CpUtils.getLevelImg
import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.utils.NumberUtils
import com.chwl.core.user.bean.UserCPListBean
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.ktx.getString
class UserCpListAdapter : BaseAdapter<UserCPListBean> {
constructor(layoutResId: Int, brid: Int) : super(layoutResId, brid)
override fun convert(helper: BindingViewHolder, data: UserCPListBean?) {
super.convert(helper, data)
if (data == null ) return
val mViewBinding = helper.binding as ItemUserCpListBinding
mViewBinding.cpLevel.setImageResource(getLevelImg(data.cpLevel))
ImageLoadUtils.loadImage(mViewBinding.userAvatar,data.avatar)
ImageLoadUtils.loadImage(mViewBinding.userAvatarCp,data.cpAvatar)
val max = (data.endExp - data.startExp)
val current = (data.currentExp.toFloat() / max.toFloat()) * 100f
mViewBinding.cpPro.max = 100
mViewBinding.cpPro.progress = current.toInt()
mViewBinding.cpProVal.text = "${NumberUtils.format(data.currentExp)} / ${NumberUtils.format(data.endExp)}"
mViewBinding.cpNeedVal.text = ResUtil.getString(R.string.CP_Need_tips,NumberUtils.format((data.endExp - data.currentExp)))
mViewBinding.cpDay.text = "${data.cpDay}${R.string.days.getString()}"
mViewBinding.cpDay.isVisible = data.cpDay > 0
helper.addOnClickListener(mViewBinding.cancel.id)
helper.addOnClickListener(mViewBinding.userAvatarCp.id)
}
}

View File

@@ -12,6 +12,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -65,6 +66,8 @@ public class UserInfoDynamicAdapter extends BaseQuickAdapter<WorldDynamicBean, B
*/
private int divider;
public boolean isUserInfo = false;
public UserInfoDynamicAdapter(Context context) {
super(R.layout.item_userinfo_dynamic);
this.context = context;
@@ -174,6 +177,16 @@ public class UserInfoDynamicAdapter extends BaseQuickAdapter<WorldDynamicBean, B
//跳转去详情
helper.itemView.setOnClickListener(toDetailListener);
helper.setGone(R.id.line_bottom, getItemCount() - 1 != helper.getLayoutPosition());
if (isUserInfo) {
helper.setTextColor(R.id.tv_time, ContextCompat.getColor(context,R.color.white));
helper.setTextColor(R.id.expandable_text, ContextCompat.getColor(context,R.color.white));
helper.setTextColor(R.id.tv_mini_world_name, ContextCompat.getColor(context,R.color.white));
helper.setTextColor(R.id.tv_like, ContextCompat.getColor(context,R.color.white_tran_60));
helper.setTextColor(R.id.tv_comment, ContextCompat.getColor(context,R.color.white_tran_60));
helper.setVisible(R.id.line_bottom, false);
}
}
private void setLikeCount(BaseViewHolder helper, int likeCount, boolean isLike, boolean isAnim) {

View File

@@ -12,16 +12,14 @@ import com.chwl.core.user.bean.GiftWallInfo
class UserInfoGiftAdapter(private val itemBgRes: Int = R.drawable.user_info_bg_gift) :
BaseQuickAdapter<GiftWallInfo, BaseViewHolder>(R.layout.user_info_item_gift) {
override fun onCreateDefViewHolder(parent: ViewGroup?, viewType: Int): BaseViewHolder {
return super.onCreateDefViewHolder(parent, viewType).apply {
getView<ImageView>(R.id.iv_bg).setImageResource(itemBgRes)
}
return super.onCreateDefViewHolder(parent, viewType)
}
override fun convert(helper: BaseViewHolder, item: GiftWallInfo) {
helper.setText(R.id.tv_name, item.giftName)
helper.setText(R.id.tv_count, "x${item.reciveCount}")
val iconView = helper.getView<ImageView>(R.id.iv_icon)
iconView.load(item.picUrl)
iconView.load(item.picUrl,0f,R.drawable.transparent_draw)
val rankView = helper.itemView.findViewById<ImageView>(R.id.iv_rank)
if (helper.bindingAdapterPosition == 0) {
rankView.setImageResource(R.drawable.ic_gift_one)

View File

@@ -1,6 +1,7 @@
package com.chwl.app.ui.user.adapter;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@@ -21,7 +22,7 @@ import java.util.List;
public class UserInfoIndicatorAdapter extends CommonNavigatorAdapter {
private final List<? extends CharSequence> mTitleList;
private int textSize = 20;
private int textSize = 18;
private float minScale = 0.9f;
private boolean showIndicator = true;
private OnItemSelectListener mOnItemSelectListener;
@@ -38,8 +39,8 @@ public class UserInfoIndicatorAdapter 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_7F191919));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_191919));
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.white_tran_60));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.white));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = context.getResources().getDimensionPixelOffset(R.dimen.dp_12);
@@ -60,7 +61,7 @@ public class UserInfoIndicatorAdapter extends CommonNavigatorAdapter {
indicator.setLineHeight(UIUtil.dip2px(context, 3));
indicator.setRoundRadius(UIUtil.dip2px(context, 1.5));
indicator.setLineWidth(UIUtil.dip2px(context, 17));
indicator.setColors(context.getResources().getColor(R.color.color_26CC9C));
indicator.setColors(Color.parseColor("#04d5c6"));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// lp.bottomMargin = mBottomMargin;
indicator.setLayoutParams(lp);

View File

@@ -56,8 +56,9 @@ class UserInfoMedalAdapter :
})
} else {
val imageView = helper.getView<ImageView>(R.id.iv_image)
imageView.load(item.picUrl)
imageView.load(item.picUrl,0f,R.drawable.transparent_draw)
}
}
helper.setText(R.id.medalName,item.medalName)
}
}

View File

@@ -2,9 +2,9 @@ package com.chwl.app.ui.user.fragment
import android.content.Intent
import android.view.View
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chwl.app.R
import com.chwl.app.base.BaseViewBindingFragment
import com.chwl.app.databinding.UserInfoDataFragmentBinding
@@ -16,12 +16,17 @@ import com.chwl.app.ui.user.activity.UserModifyPhotosActivity
import com.chwl.app.ui.user.adapter.UserInfoAlbumAdapter
import com.chwl.app.ui.user.adapter.UserInfoGameTeamAdapter
import com.chwl.app.ui.user.adapter.UserInfoGiftAdapter
import com.chwl.app.ui.user.adapter.UserInfoIndicatorAdapter
import com.chwl.app.ui.user.adapter.UserInfoMedalAdapter
import com.chwl.app.ui.user.viewmodel.UserInfoViewModel
import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.chwl.app.ui.widget.recyclerview.decoration.SpacingDecoration
import com.chwl.core.game_team.UserGameTeamInfo
import com.chwl.core.user.UserModel
import com.chwl.core.user.bean.UserPhoto
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.ktx.getString
class UserInfoDataFragment : BaseViewBindingFragment<UserInfoDataFragmentBinding>() {
@@ -30,9 +35,10 @@ class UserInfoDataFragment : BaseViewBindingFragment<UserInfoDataFragmentBinding
override fun init() {
initGameTeam()
initAlbum()
initOther()
initMedal()
initGift()
initLuckyGift()
setGuild()
FragmentVisibleStateHelper(this).apply {
this.start {
onVisibleChanged(it, isFirstVisible)
@@ -40,6 +46,38 @@ class UserInfoDataFragment : BaseViewBindingFragment<UserInfoDataFragmentBinding
}
}
private fun initOther() {
val tagList =
arrayListOf(ResUtil.getString(R.string.medal), ResUtil.getString(R.string.gift_action))
val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(false)
val magicIndicatorAdapter = UserInfoIndicatorAdapter(context, tagList)
magicIndicatorAdapter.textSize = 16
magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
binding.magicIndicator.onPageSelected(position)
onOtherTabChange(view?.text?.toString() ?: "")
}
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.setNavigator(commonNavigator)
}
private fun onOtherTabChange(str: String) {
when (str) {
ResUtil.getString(R.string.medal) -> {
binding.layoutGift.isVisible = false
binding.layoutMedal.isVisible = true
}
ResUtil.getString(R.string.gift_action) -> {
binding.layoutGift.isVisible = true
binding.layoutMedal.isVisible = false
}
else -> {}
}
}
private fun initGameTeam() {
val adapter = UserInfoGameTeamAdapter(viewModel.isMe)
binding.recyclerViewGameTeam.addItemDecoration(
@@ -96,74 +134,81 @@ class UserInfoDataFragment : BaseViewBindingFragment<UserInfoDataFragmentBinding
binding.recyclerViewMedal.adapter = medalAdapter
viewModel.userInfoDetailData.observe(this) {
val list = it.medals?.userMedals
binding.tvMedalCount.text = "(${list?.size ?: 0})"
if (medalAdapter.itemCount > 0) return@observe
medalAdapter.setNewData(list)
binding.layoutMedal.isVisible = !list.isNullOrEmpty()
binding.tvMedalStatus.isVisible = list.isNullOrEmpty()
}
}
var isMiniMode = true
private fun initGift() {
val giftAdapter = UserInfoGiftAdapter()
var isMiniMode = true
binding.ivGiftMore.setOnClickListener {
isMiniMode = !isMiniMode
val list = viewModel.giftListLiveData.value ?: emptyList()
loadListData(giftAdapter, 4, isMiniMode, list, binding.ivGiftMore)
loadListData(giftAdapter, 4, isMiniMode, binding.ivGiftMore)
binding.ivGiftMore.animate().rotationBy(180f).start()
}
binding.recyclerViewGift.addItemDecoration(
GridSpacingItemNewDecoration(
resources.getDimensionPixelOffset(R.dimen.dp_12),
resources.getDimensionPixelOffset(R.dimen.dp_2),
false
)
)
binding.recyclerViewGift.adapter = giftAdapter
viewModel.giftListLiveData.observe(this) {
loadListData(giftAdapter, 4, isMiniMode, it, binding.ivGiftMore)
binding.tvGiftStatus.isVisible = it.isNullOrEmpty()
loadListData(giftAdapter, 4, isMiniMode, binding.ivGiftMore)
}
viewModel.requestGiftList()
}
private fun initLuckyGift() {
val luckyGiftAdapter = UserInfoGiftAdapter(R.drawable.user_info_bg_lucku_gift)
var isMiniMode = true
binding.ivLuckyGiftMore.setOnClickListener {
isMiniMode = !isMiniMode
val list = viewModel.luckyGiftListLiveData.value ?: emptyList()
loadListData(luckyGiftAdapter, 4, isMiniMode, list, binding.ivLuckyGiftMore)
binding.ivLuckyGiftMore.animate().rotationBy(180f).start()
}
binding.recyclerViewLuckyGift.addItemDecoration(
GridSpacingItemNewDecoration(
resources.getDimensionPixelOffset(R.dimen.dp_12),
resources.getDimensionPixelOffset(R.dimen.dp_2),
false
)
)
binding.recyclerViewLuckyGift.adapter = luckyGiftAdapter
viewModel.luckyGiftListLiveData.observe(this) {
loadListData(luckyGiftAdapter, 4, isMiniMode, it, binding.ivLuckyGiftMore)
binding.tvLuckyGiftStatus.isVisible = it.isNullOrEmpty()
loadListData(giftAdapter, 4, isMiniMode, binding.ivGiftMore)
}
viewModel.requestLuckyGiftList()
viewModel.loadUserInfoGiftWallData()
}
private fun <T> loadListData(
adapter: BaseQuickAdapter<T, *>,
private fun setGuild() {
UserModel.get().getUserInfoDetailCache(viewModel.userId).compose(bindToLifecycle())
.doOnSuccess {
it?.data?.guildInfo?.let {
//guildName
binding.guildName.text = "${R.string.Guild_Nick.getString()}:${it.guildName}"
//guildId
binding.guildId.text = "${R.string.Guild_ID.getString()}:${it.guildId}"
//guildAgentId
binding.guildAgentId.text = "${R.string.Agent_ID.getString()}:${it.erbanNo}"
//guildImg
binding.guildImg.load(it.avatar)
binding.guildLayout.isVisible = true
}
}.subscribe()
}
private fun loadListData(
adapter: UserInfoGiftAdapter,
miniCount: Int,
miniOrFull: Boolean,
list: List<T>,
moreView: View
) {
val finalList = if (miniOrFull) {
list.take(miniCount)
if (viewModel.luckyGiftIsRead && viewModel.giftIsRead) {
if (!viewModel.giftWallIsRead) {
val gift = viewModel.giftListLiveData.value ?: emptyList()
val luckyGift = viewModel.luckyGiftListLiveData.value ?: emptyList()
viewModel.userInfoGiftWallData.addAll(gift)
viewModel.userInfoGiftWallData.addAll(luckyGift)
viewModel.userInfoGiftWallData.sortBy { it.reciveCount }
viewModel.giftWallIsRead = true
}
} else {
list
return
}
val finalList = if (miniOrFull) {
viewModel.userInfoGiftWallData.take(miniCount)
} else {
viewModel.userInfoGiftWallData
}
adapter.setNewData(finalList)
moreView.isVisible = list.size > miniCount
moreView.isVisible = viewModel.userInfoGiftWallData.size > miniCount
binding.tvGiftStatus.isVisible = finalList.isEmpty()
}
private fun showPhotoPreview(list: ArrayList<UserPhoto>, position: Int) {
@@ -175,10 +220,8 @@ class UserInfoDataFragment : BaseViewBindingFragment<UserInfoDataFragmentBinding
private fun onVisibleChanged(isVisible: Boolean, isFirstVisible: Boolean) {
if (isVisible && !isFirstVisible) {
if (viewModel.giftListLiveData.value.isNullOrEmpty()) {
if (viewModel.userInfoGiftWallData.isEmpty()) {
viewModel.requestGiftList()
}
if (viewModel.luckyGiftListLiveData.value.isNullOrEmpty()) {
viewModel.requestLuckyGiftList()
}
}

View File

@@ -36,6 +36,7 @@ class UserInfoDynamicFragment : BaseViewBindingFragment<UserInfoDynamicFragmentB
private fun initView() {
adapter = UserInfoDynamicAdapter(requireContext())
adapter?.isUserInfo = true
adapter?.setEnableLoadMore(false)
adapter?.emptyView = layoutInflater.inflate(R.layout.user_info_tab_empty, null)
binding.recyclerView.adapter = adapter

View File

@@ -34,6 +34,11 @@ class UserInfoViewModel : BaseViewModel() {
val giftListLiveData = MutableLiveData<List<GiftWallInfo>>()
val luckyGiftListLiveData = MutableLiveData<List<GiftWallInfo>>()
val userInfoGiftWallData = mutableListOf<GiftWallInfo>()
var luckyGiftIsRead = false
var giftIsRead = false
var giftWallIsRead = false
fun getUserInfo() {
UserModel.get().getUserInfoFromServer(userId)
@@ -88,14 +93,32 @@ class UserInfoViewModel : BaseViewModel() {
}
fun requestGiftList() {
addDisposable(UserModel.get().requestUserGiftWall(userId, 1, 2).subscribe { it ->
giftListLiveData.postValue(it)
})
addDisposable(UserModel.get().requestUserGiftWall(userId, 1, 2)
.doOnError {
giftIsRead=true
}
.subscribe { it ->
giftIsRead=true
giftListLiveData.postValue(it)
})
}
fun requestLuckyGiftList() {
addDisposable(UserModel.get().requestUserGiftWall(userId, 2, 2).subscribe { it ->
luckyGiftListLiveData.postValue(it)
})
addDisposable(UserModel.get().requestUserGiftWall(userId, 2, 2)
.doOnError {
luckyGiftIsRead=true
}
.subscribe { it ->
luckyGiftListLiveData.postValue(it)
luckyGiftIsRead=true
})
}
fun loadUserInfoGiftWallData(){
giftIsRead = false
luckyGiftIsRead = false
userInfoGiftWallData.clear()
requestGiftList()
requestLuckyGiftList()
}
}

View File

@@ -0,0 +1,168 @@
package com.chwl.app.ui.utils
import android.graphics.Bitmap
import android.view.View
import android.view.View.OnAttachStateChangeListener
import androidx.core.view.isVisible
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestFutureTarget
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.chwl.app.R
import com.chwl.app.application.App
import com.chwl.app.application.GlobalHandleManager
import com.chwl.core.utils.LogUtils
import com.chwl.library.utils.ResUtil
import com.netease.nim.uikit.support.glide.GlideApp
import com.tencent.qgame.animplayer.AnimConfig
import com.tencent.qgame.animplayer.AnimView
import com.tencent.qgame.animplayer.inter.IAnimListener
import com.tencent.qgame.animplayer.inter.IFetchResource
import com.tencent.qgame.animplayer.mix.Resource
import com.tencent.qgame.animplayer.util.ScaleType
object CpUtils {
fun getHeadSvga(level: Int) : String {
return "svga/cp_list_head_$level.svga"
}
fun getUserInfoAnim(level: Int) : String? {
if (level < 3) return null
return "mp4/cp_userinfo_anim_$level.mp4"
}
var flags = arrayListOf(
R.drawable.ic_user_info_cp_avatar_flag_0,
R.drawable.ic_user_info_cp_avatar_flag_1,
R.drawable.ic_user_info_cp_avatar_flag_2,
R.drawable.ic_user_info_cp_avatar_flag_3,
R.drawable.ic_user_info_cp_avatar_flag_4,
R.drawable.ic_user_info_cp_avatar_flag_5,
)
var levels = arrayListOf(
R.drawable.ic_cp_list_level_0,
R.drawable.ic_cp_list_level_1,
R.drawable.ic_cp_list_level_2,
R.drawable.ic_cp_list_level_3,
R.drawable.ic_cp_list_level_4,
R.drawable.ic_cp_list_level_5,
)
var levelBgs = arrayListOf(
R.drawable.transparent_draw,
R.drawable.ic_cp_level_up_bg_1,
R.drawable.ic_cp_level_up_bg_2,
R.drawable.ic_cp_level_up_bg_3,
R.drawable.ic_cp_level_up_bg_4,
R.drawable.ic_cp_level_up_bg_5
)
var cpLevelUpStr = arrayListOf(
R.string.Sweet_Duo,
R.string.Dynamic_Duo,
R.string.Ldeal_Duo,
R.string.Dream_Duo,
R.string.Perfect_Duo,
R.string.Divine_Duo
)
fun getFlag(level: Int) : Int{
return flags.getOrNull(level)?:R.drawable.ic_user_info_cp_avatar_flag_0
}
fun getLevelImg(level: Int) : Int{
return levels.getOrNull(level)?:R.drawable.ic_cp_list_level_0
}
fun getCpLevelUpTextBg(level: Int) : Int{
return levelBgs.getOrNull(level)?:R.drawable.ic_cp_level_up_bg_1
}
fun getCpLevelUpStr(level: Int) : String{
return ResUtil.getString(cpLevelUpStr.getOrNull(level)?:R.string.Sweet_Duo)
}
fun downLoadAvatar(url:String?, onResourceReady:(resource: Bitmap?)->Unit) {
if (url.isNullOrEmpty()) return
try {
val futureTarget = RequestFutureTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
GlideApp.with(App.instance())
.asBitmap()
.circleCrop()
.load(url)
.addListener(object : RequestListener<Bitmap?> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap?>?, isFirstResource: Boolean): Boolean {
onResourceReady(null)
return true
}
override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap?>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
onResourceReady(resource)
return true
}
})
.into(futureTarget)
.get()
} catch (e: Exception) {
}
}
fun loadVap(animView: AnimView, url :String?, imgUrlMap: HashMap<String,String>?=null , textMap: HashMap<String,String>?=null) {
if (url == null) return
animView.visibility = View.VISIBLE
var index = 0
val bitmapMap = hashMapOf<String,Bitmap?>()
if (!imgUrlMap.isNullOrEmpty()){
imgUrlMap.keys.forEach { key ->
downLoadAvatar(imgUrlMap[key]) { resource ->
index++
bitmapMap[key] = resource
if (index == imgUrlMap.keys.size){
animView.setFetchResource(object : IFetchResource {
override fun fetchImage(resource: Resource, result: (Bitmap?) -> Unit) {
if (bitmapMap.isEmpty()) {
result(null)
} else {
var bitmap : Bitmap?=null
bitmapMap.keys.forEach {
if (resource.tag == it){
bitmap = bitmapMap[it]
}
}
result(bitmap)
}
}
override fun fetchText(resource: Resource, result: (String?) -> Unit) {
if (textMap.isNullOrEmpty()) {
result(null)
} else {
var text = ""
textMap.keys.forEach {
if (resource.tag == it){
text = textMap[it].toString()
}
}
result(text)
}
}
override fun releaseResource(resources: List<Resource>) {
resources?.forEach {
it?.bitmap?.recycle()
}
}
})
LogUtils.d(" animViewSetAnimListener startPlay url = $url")
animView.startPlay(animView.context.assets, url)
}
}
}
}
}
}

View File

@@ -0,0 +1,45 @@
package com.chwl.app.ui.utils
import com.chwl.app.BuildConfig
import com.chwl.app.R
import com.chwl.core.room.bean.RoomIcon
import com.chwl.core.room.game.bean.BaiShunGameConfig
import com.chwl.library.utils.SingleToastUtil
import com.google.gson.Gson
object GameUtil {
fun findGame(gameId:Long,games:List<RoomIcon>): RoomIcon? {
var data : RoomIcon? = null
games?.forEachIndexed { index, roomIcon ->
if (gameId == roomIcon.id) {
data = roomIcon
}
}
return data
}
fun startGame(data : RoomIcon, openGame: (url:String,config:BaiShunGameConfig)->Unit) {
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()
openGame(url, config)
} else {
SingleToastUtil.showToast(R.string.manager_trtc_trtcengineadapter_042)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -10,10 +10,14 @@ import androidx.annotation.Dimension
import androidx.annotation.Dimension.Companion.DP
import androidx.annotation.DrawableRes
import androidx.fragment.app.FragmentActivity
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
import com.bumptech.glide.request.transition.Transition
import com.bumptech.glide.util.Util
import com.netease.nim.uikit.common.util.sys.ScreenUtil
@@ -26,6 +30,7 @@ import com.tencent.qgame.animplayer.AnimView
import com.tencent.qgame.animplayer.util.ScaleType
import com.chwl.app.R
import com.chwl.core.utils.LogUtils
import com.chwl.library.common.glide.GlideUtils
import java.io.File
import java.net.MalformedURLException
import java.net.URL
@@ -174,4 +179,31 @@ fun AnimView.loadAnim(url: String) {
this@loadAnim.startPlay(resource)
}
})
}
fun AnimView.loadAnim2(url: String) {
if (context.isDestroyed()) return
GlideUtils.instance().downloadFromUrl(context,url.trim(),object : RequestListener<File?> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<File?>?,
isFirstResource: Boolean
): Boolean {
return true
}
override fun onResourceReady(
resource: File?,
model: Any?,
target: Target<File?>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
if (resource != null) {
this@loadAnim2.startPlay(resource)
}
return true
}
})
}

View File

@@ -0,0 +1,22 @@
package com.chwl.app.ui.utils
import com.chwl.app.R
object VipUtil {
val vipIcons = arrayListOf(
R.drawable.vip_center_identification_vipidentity_lv1,
R.drawable.vip_center_identification_vipidentity_lv2,
R.drawable.vip_center_identification_vipidentity_lv3,
R.drawable.vip_center_identification_vipidentity_lv4,
R.drawable.vip_center_identification_vipidentity_lv5,
R.drawable.vip_center_identification_vipidentity_lv6,
R.drawable.vip_center_identification_vipidentity_lv7,
R.drawable.vip_center_identification_vipidentity_lv8,
R.drawable.vip_center_identification_vipidentity_lv9
)
fun getVipIcon(level: Int) {
vipIcons.getOrNull(level)?:R.drawable.vip_center_identification_vipidentity_lv1
}
}

View File

@@ -23,7 +23,9 @@ import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.utils.SoftPool
import com.chwl.core.gift.bean.BonsellaJoinAttack
import com.chwl.core.gift.bean.GiftMultiReceiverInfo
import com.chwl.core.gift.bean.GiftType
import com.chwl.core.utils.LogUtils
import com.chwl.library.common.util.setRL
import com.chwl.library.utils.ResUtil
import com.example.lib_utils.UiUtils
import java.util.LinkedList
@@ -213,19 +215,21 @@ class BonsellaJoinAttackLayout @JvmOverloads constructor(
LogUtils.d(" GiftComboLayout onRoomCustomMsg " )
if (giftInfo==null) return
if (giftInfo.comboCount == 0) return
val comboInfo = BonsellaJoinAttack().apply {
giftId = giftInfo.giftId
sentUserid = giftInfo.uid
sentUserName = giftInfo.nick
sentAvatar = giftInfo.avatar
receiverUserName = giftInfo.targetUsers?.getOrNull(0)?.nick?:""
receiverNumber = giftInfo.targetUsers?.size?: giftInfo.targetUids?.size?: 1
giftNumber = giftInfo.giftNum
giftImgUrl = giftInfo.gift?.giftUrl?:""
comboCount = giftInfo.comboCount
isMulti = giftInfo.isMulti
if (giftInfo.gift != null && giftInfo.gift.giftType == GiftType.GIFT_TYPE_NORMAL || giftInfo.gift.giftType == GiftType.GIFT_TYPE_SUPER_LUCKY || giftInfo.gift.giftType == GiftType.GIFT_TYPE_LUCKY_24) {
val comboInfo = BonsellaJoinAttack().apply {
giftId = giftInfo.giftId
sentUserid = giftInfo.uid
sentUserName = giftInfo.nick
sentAvatar = giftInfo.avatar
receiverUserName = giftInfo.targetUsers?.getOrNull(0)?.nick?:""
receiverNumber = giftInfo.targetUsers?.size?: giftInfo.targetUids?.size?: 1
giftNumber = giftInfo.giftNum
giftImgUrl = giftInfo.gift?.giftUrl?:""
comboCount = giftInfo.comboCount
isMulti = giftInfo.isMulti
}
add(comboInfo)
}
add(comboInfo)
}
override fun onDetachedFromWindow() {
@@ -256,9 +260,8 @@ class BonsellaJoinAttackLayout @JvmOverloads constructor(
@SuppressLint("SetTextI18n")
fun showUi(bonsellaJoinAttack: BonsellaJoinAttack) {
if (UiUtils.isRtl(context)){
ivLayoutBg.scaleX = -1f
}
ivLayoutBg.setRL()
refreshNum(bonsellaJoinAttack)
tvNick.text = bonsellaJoinAttack.sentUserName

View File

@@ -1,11 +1,14 @@
package com.chwl.app.ui.widget;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_COUNTRY;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_CP;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_CUSTOM;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_LUCKY;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_NOBLE;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_NORMAL;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_SING_ROOM;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_SUPER_LUCKY;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_SUPER_LUCKY_24;
import static com.chwl.app.ui.widget.magicindicator.GiftIndicator.TYPE_WEEK;
import android.annotation.SuppressLint;
@@ -626,6 +629,12 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene
return TYPE_COUNTRY;
case GiftType.GIFT_TYPE_SINGLE_ROOM:
return TYPE_SING_ROOM;
case GiftType.GIFT_TYPE_LUCKY_24:
return TYPE_SUPER_LUCKY_24;
case GiftType.GIFT_TYPE_CP:
return TYPE_CP;
case GiftType.GIFT_TYPE_CUSTOM:
return TYPE_CUSTOM;
}
return TYPE_NORMAL;
}
@@ -721,6 +730,10 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene
currentGiftInfoList = getSuperLuckyGiftInfos();
} else if (position == TYPE_COUNTRY) {
currentGiftInfoList = getCountryGiftInfos();
}else if (position == TYPE_CP) {
currentGiftInfoList = getCpGiftInfos();
}else if (position == TYPE_CUSTOM) {
currentGiftInfoList = getCustomGiftInfos();
}
// 有贵族礼物才显示贵族礼物的tab
if (ListUtils.isListEmpty(nobleGiftInfos)) {
@@ -1226,6 +1239,17 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene
String.valueOf(AvRoomDataManager.get().getRoomUid()),
GiftType.GIFT_TYPE_COUNTRY);
}
private List<GiftInfo> getCpGiftInfos() {
return GiftModel.get().getGiftInfosByType(
String.valueOf(AvRoomDataManager.get().getRoomUid()),
GiftType.GIFT_TYPE_CP);
}
private List<GiftInfo> getCustomGiftInfos() {
return GiftModel.get().getGiftInfosByType(
String.valueOf(AvRoomDataManager.get().getRoomUid()),
GiftType.GIFT_TYPE_CUSTOM);
}
private List<GiftInfo> getNobleGiftInfos() {
return GiftModel.get().getGiftInfoList(GiftType.GIFT_TYPE_VIP);
@@ -1760,14 +1784,14 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene
* @param isWholeMic
* @param callback
*/
void onSendGiftBtnClick(GiftInfo giftInfo,
default void onSendGiftBtnClick(GiftInfo giftInfo,
ArrayList<MicMemberInfo> micMemberInfos,
int number,
String msg,
boolean isKnap,
boolean isWholeMic,
@Nullable List<List<Integer>> drawFixedArray,
SenGiftCallback callback);
SenGiftCallback callback){};
}

View File

@@ -14,7 +14,6 @@ import androidx.core.view.isVisible
import androidx.databinding.DataBindingUtil
import com.example.lib_utils.ktx.getColorById
import com.example.lib_utils.ktx.singleClick
import com.example.lib_utils.ktx.toStringRes
import com.example.lib_utils.spannable.SpannableTextBuilder
import com.chwl.app.R
import com.chwl.app.avroom.activity.AVRoomActivity

View File

@@ -76,6 +76,18 @@ public class GiftIndicator extends LinearLayout {
* 超级幸运礼物
*/
public static final int TYPE_SUPER_LUCKY = 8;
/**
* 超级幸运24礼物
*/
public static final int TYPE_SUPER_LUCKY_24 = 9;
/**
* cp礼物
*/
public static final int TYPE_CP = 10;
/**
* 定制礼物
*/
public static final int TYPE_CUSTOM = 11;
private List<GiftTab> tabList = new ArrayList<>();

View File

@@ -0,0 +1,321 @@
package com.chwl.app.utils
import android.annotation.SuppressLint
import android.widget.FrameLayout
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.chwl.app.application.GlobalHandleManager
import com.chwl.app.avroom.dialog.BaseRoomNotifyDialog
import com.chwl.app.avroom.dialog.RoomNotifyBoomDialog
import com.chwl.app.avroom.dialog.RoomBoomRewardDialog
import com.chwl.app.avroom.widget.GalleryLayoutManager.LayoutParams
import com.chwl.core.gift.bean.BoomInfo
import com.chwl.core.gift.bean.BoomMsgAnimBean
import com.chwl.core.gift.bean.BoomMsgAwardList
import com.chwl.core.gift.bean.BoomMsgDialogBean
import com.chwl.core.gift.bean.BoomMsgExpPushBean
import com.chwl.core.im.custom.bean.BoomMsgAttachment
import com.chwl.core.im.custom.bean.CustomAttachment.BOOM_FIRST
import com.chwl.core.im.custom.bean.CustomAttachment.BOOM_SECOND_DIALOG
import com.chwl.core.im.custom.bean.CustomAttachment.BOOM_SECOND_EXP_PUSH
import com.chwl.core.manager.IMNetEaseManager
import com.chwl.core.manager.RoomEvent
import com.chwl.core.utils.LogUtils
import com.chwl.library.common.glide.GlideUtils
import com.chwl.library.common.util.isVerify
import com.tencent.qgame.animplayer.AnimConfig
import com.tencent.qgame.animplayer.AnimView
import com.tencent.qgame.animplayer.inter.IAnimListener
import java.io.File
import java.util.LinkedList
@SuppressLint("StaticFieldLeak")
object RoomBoomManager {
private var dialog: BaseRoomNotifyDialog<*>? = null
private val queue = LinkedList<BoomMsgDialogBean>()
private val AnimQueue = LinkedList<BoomMsgAnimBean>()
private val awardQueue = LinkedList<BoomMsgAwardList>()
private var mAnimLayout: FrameLayout? = null
var boomInfo : List<BoomInfo>? = null
fun addDialog(data: BoomMsgDialogBean) {
LogUtils.d(" RoomBoomManager addDialog() ")
queue.add(data)
showNextDialog()
}
private fun showNextDialog() {
if (dialog?.isShowing == true) {
return
}
if (queue.isNotEmpty()) {
val data = queue.removeAt(0)
dialog = createDialog(data)
dialog?.mCallBack = object : BaseRoomNotifyDialog.CallBack {
override fun onHide() {
showNextDialog()
}
}
dialog?.showDialog()
}
}
private fun createDialog(bean: BoomMsgDialogBean): BaseRoomNotifyDialog<*>? {
var dialog: BaseRoomNotifyDialog<*>? = null
val activity = GlobalHandleManager.get().activity ?: return null
dialog = RoomNotifyBoomDialog(activity).apply {
data = bean
}
return dialog
}
fun addAnim(data: BoomMsgAnimBean) {
LogUtils.d(" RoomBoomManager addAnim()-- start")
if (mAnimLayout == null) return
AnimQueue.add(data)
LogUtils.d(" RoomBoomManager addAnim()-- end")
showNextAnim()
}
private fun showNextAnim() {
LogUtils.d(" RoomBoomManager showNextAnim()-- start")
if (AnimQueue.isNotEmpty() && mAnimLayout != null && !isAnimStart) {
// val animData = AnimQueue.removeAt(0)
val minBy = AnimQueue.minBy { it.level }
val index = AnimQueue.indexOf(minBy)
val animData = AnimQueue.removeAt(index)
animData?.let { anim ->
val urls = arrayListOf<String>()
if (anim.countDownUrl.isVerify()) urls.add(anim.countDownUrl)
if (anim.endUrl.isVerify()) urls.add(anim.endUrl)
LogUtils.d(" RoomBoomManager showNextAnim()-- end")
startDownAnim(urls, anim)
}
}
}
var isAnimStart = false
private fun startDownAnim(urls: ArrayList<String>, animData: BoomMsgAnimBean) {
LogUtils.d(" RoomBoomManager startDownAnim()")
if (urls.isVerify()) {
isAnimStart = true
urls.forEach { url ->
LogUtils.d(" RoomBoomManager startDownAnim() forEach url=$url")
mAnimLayout?.let { animLayout ->
GlideUtils.instance().downloadFromUrl(
animLayout.context,
url.trim(),
object : RequestListener<File?> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<File?>?,
isFirstResource: Boolean
): Boolean {
LogUtils.d(" RoomBoomManager onLoadFailed()-- end url=$url")
startShowAnim(animLayout, animData, true)
return true
}
override fun onResourceReady(
resource: File?,
model: Any?,
target: Target<File?>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
LogUtils.d(" RoomBoomManager onResourceReady()-- end url=$url")
resource?.let { file ->
if (url == animData.countDownUrl) {
animData.countDownFile = file
} else if (url == animData.endUrl) {
animData.endFile = file
}
}
startShowAnim(animLayout, animData)
return true
}
})
}
}
}
}
private fun startShowAnim(
animLayout: FrameLayout,
animData: BoomMsgAnimBean,
isFailed: Boolean = false
) {
LogUtils.d(" RoomBoomManager startShowAnim()-- animData=$animData isFailed=$isFailed")
if (isFailed) {
startAnimEnd(animData)
} else {
if (animData.countDownFile != null && animData.endFile != null) {
playerAnim(animLayout,animData.countDownFile){
playerAnim(animLayout,animData.endFile){
LogUtils.d(" RoomBoomManager startShowAnim() playerAnim-onVideoComplete() endFile ")
mAnimLayout?.post {
showAwardDialog(animData)
}
}
}
}
}
}
private fun playerAnim(animLayout: FrameLayout,file: File,onComplete : ()->Unit) {
LogUtils.d(" RoomBoomManager playerAnim --start file=${file.name}")
animLayout.post {
animLayout.removeAllViews()
val animView = AnimView(animLayout.context)
animLayout.addView(animView)
val layoutParams = animView.layoutParams
layoutParams.width = LayoutParams.MATCH_PARENT
layoutParams.height = LayoutParams.MATCH_PARENT
animView.layoutParams = layoutParams
// animView.setLoop(1)
animView.setAnimListener(object : IAnimListener {
override fun onFailed(errorType: Int, errorMsg: String?) {
LogUtils.d(" RoomBoomManager playerAnim --playAnim onFailed() file=${file.name} ")
}
override fun onVideoComplete() {
LogUtils.d(" RoomBoomManager playerAnim --playAnim onVideoComplete() file=${file.name} ")
onComplete()
}
override fun onVideoDestroy() {
LogUtils.d(" RoomBoomManager playerAnim --playAnim onVideoDestroy() file=${file.name} ")
}
override fun onVideoRender(frameIndex: Int, config: AnimConfig?) {
}
override fun onVideoStart() {
LogUtils.d(" RoomBoomManager playerAnim --playAnim onVideoStart file=${file.name} ")
}
})
animView.startPlay(file)
}
LogUtils.d(" RoomBoomManager playerAnim --end file=${file.name} ")
}
private fun startAnimEnd(animData: BoomMsgAnimBean, needRemove:Boolean = true) {
LogUtils.d(" RoomBoomManager startAnimEnd ")
isAnimStart = false
if (awardQueue.isVerify()) {
var awardIndex = -1
awardQueue.forEachIndexed { index, boomMsgAwardList ->
if (boomMsgAwardList.list.isVerify()) {
if (animData.level == (boomMsgAwardList.list?.get(0)?.level ?: -1)){
awardIndex = index
}
}
}
LogUtils.d(" RoomBoomManager startAnimEnd find awardIndex =$awardIndex")
if (awardIndex != -1) {
if (needRemove) awardQueue.removeAt(awardIndex)
}
}
showNextAnim()
}
fun addAward(awardList: BoomMsgAwardList) {
LogUtils.d(" RoomBoomManager addAward() -- start")
if (mAnimLayout == null) return
awardQueue.add(awardList)
LogUtils.d(" RoomBoomManager addAward() -- end")
}
private fun showAwardDialog(animData: BoomMsgAnimBean) {
LogUtils.d(" RoomBoomManager showAwardDialog ")
if (awardQueue.isVerify()) {
var awardIndex = -1
awardQueue.forEachIndexed { index, boomMsgAwardList ->
if (boomMsgAwardList.list.isVerify()) {
if (animData.level == (boomMsgAwardList.list?.get(0)?.level ?: -1)) {
awardIndex = index
}
}
}
LogUtils.d(" RoomBoomManager showAwardDialog find awardIndex = $awardIndex")
if (awardIndex != -1) {
val award = awardQueue.removeAt(awardIndex)
if (award.list.isVerify()) {
val activity = GlobalHandleManager.get().activity ?: return
val dialog = RoomBoomRewardDialog(activity)
dialog.list = award.list
dialog.setOnDismissListener {
startAnimEnd(animData,false)
}
dialog.showDialog()
LogUtils.d(" RoomBoomManager showAwardDialog showDialog ")
}
} else {
startAnimEnd(animData)
}
} else {
startAnimEnd(animData)
}
LogUtils.d(" RoomBoomManager showAwardDialog -- end")
}
fun init(view: FrameLayout) {
mAnimLayout = view
}
fun notify(bean: BoomMsgDialogBean) {
LogUtils.d(" RoomBoomManager notify()-- BOOM_SECOND_EXP_PUSH start")
// BOOM_SECOND_DIALOG 是广播消息,在BaseAct 处理
val msg = BoomMsgAttachment(BOOM_FIRST,BOOM_SECOND_EXP_PUSH)
msg.expPushBean = BoomMsgExpPushBean().apply {
pic = bean.pic
level = bean.level
speed = 0
}
IMNetEaseManager.get().chatRoomEventObservable.onNext(
RoomEvent()
.setEvent(RoomEvent.MSG_BOOM)
.setBoomMsg(msg)
)
LogUtils.d(" RoomBoomManager notify()-- BOOM_SECOND_DIALOG start")
val msg2 = BoomMsgAttachment(BOOM_FIRST,BOOM_SECOND_DIALOG)
msg2.DialogBean = bean
IMNetEaseManager.get().chatRoomEventObservable.onNext(
RoomEvent()
.setEvent(RoomEvent.MSG_BOOM)
.setBoomMsg(msg2)
)
LogUtils.d(" RoomBoomManager notify()-- end")
}
fun clear() {
dialog?.clearDialog()
dialog = null
queue.clear()
mAnimLayout = null
AnimQueue.clear()
awardQueue.clear()
boomInfo = null
}
}

View File

@@ -0,0 +1,81 @@
package com.chwl.app.utils
import com.chwl.app.application.GlobalHandleManager
import com.chwl.app.avroom.dialog.BaseRoomNotifyDialog
import com.chwl.app.avroom.dialog.RoomNotifyCpBindDialog
import com.chwl.app.avroom.dialog.RoomNotifyCpGiftDialog
import com.chwl.app.avroom.dialog.RoomNotifyLevelUpDialog
import com.chwl.app.avroom.dialog.RoomNotifyLuckGiftDialog
import com.chwl.core.gift.bean.CpMsgBean
import com.chwl.core.gift.bean.LuckyGiftMsgAllBean
import com.chwl.core.gift.bean.RoomNotifyDialogBean
import com.chwl.core.im.custom.bean.CustomAttachment
import java.util.LinkedList
object RoomNotifyDialogManager {
private val queue = LinkedList<RoomNotifyDialogBean>()
private var dialog : BaseRoomNotifyDialog<*>?=null
fun addDialog(data : RoomNotifyDialogBean) {
queue.add(data)
showNextDialog()
}
private fun showNextDialog() {
if (dialog?.isShowing == true){
return
}
if (queue.isNotEmpty()) {
val data = queue.removeAt(0)
dialog = createDialog(data)
dialog?.mCallBack = object : BaseRoomNotifyDialog.CallBack {
override fun onHide() {
showNextDialog()
}
}
dialog?.showDialog()
}
}
private fun createDialog(bean: RoomNotifyDialogBean): BaseRoomNotifyDialog<*>?{
var dialog : BaseRoomNotifyDialog<*>? = null
val activity = GlobalHandleManager.get().activity ?: return null
if (bean.first == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE) {
if (bean.second == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM || bean.second == CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ALL){
if (bean.data is LuckyGiftMsgAllBean){
dialog = RoomNotifyLuckGiftDialog(activity)
dialog.luckyGiftMsgBean = bean.data as LuckyGiftMsgAllBean
return dialog
}
}
} else if(bean.first == CustomAttachment.CP_FIRST){
if (bean.data is CpMsgBean){
if (bean.second == CustomAttachment.CP_SECOND_GIFT){
dialog = RoomNotifyCpGiftDialog(activity).apply {
cpMsgBean = bean.data as CpMsgBean
}
}else if (bean.second == CustomAttachment.CP_SECOND_UPGRADE){
dialog = RoomNotifyLevelUpDialog(activity).apply {
cpMsgBean = bean.data as CpMsgBean
}
}else if (bean.second == CustomAttachment.CP_SECOND_BIND){
dialog = RoomNotifyCpBindDialog(activity).apply {
cpMsgBean = bean.data as CpMsgBean
}
}
}
}
return dialog
}
fun clear() {
dialog?.clearDialog()
dialog = null
queue.clear()
}
}

View File

@@ -0,0 +1,43 @@
package com.chwl.app.utils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.tencent.qgame.animplayer.AnimConfig;
import com.tencent.qgame.animplayer.inter.IAnimListener;
public class VapAnimListener implements IAnimListener {
@Override
public void onFailed(int i, @Nullable String s) {
//播放发送错误,可能回调多次
}
@Override
public boolean onVideoConfigReady(@NonNull AnimConfig animConfig) {
return false;
}
@Override
public void onVideoStart() {
//开始播放
}
@Override
public void onVideoRender(int i, @Nullable AnimConfig animConfig) {
//每一帧的回调
}
@Override
public void onVideoComplete() {
//播放结束,播放失败也会回调
}
@Override
public void onVideoDestroy() {
//播放器被销毁
}
}

View File

@@ -226,7 +226,11 @@ class VipCenterActivity : BaseViewBindingActivity<ActivityVipCenterBinding>(),
it?.let {
// lifecycleScope.launch {
// delay(500)
banner.setCurrentItem(it.vipLevel-1)
banner?.postDelayed(object : Runnable {
override fun run() {
banner.setCurrentItem(it.vipLevel-1)
}
}, 200)
// }
if (it.ownAuthTypes?.contains(13) == true && mTitleBar.actionCount == 1) {
mTitleBar.addAction(object : TitleBar.ImageAction(R.drawable.ic_vip_setting) {
@@ -403,7 +407,6 @@ class VipCenterActivity : BaseViewBindingActivity<ActivityVipCenterBinding>(),
}
if (it.buyAmount == 0) {
binding.tvNoticeText.visibility = View.VISIBLE
binding.tvAdditionalText.visibility = View.GONE
binding.tvOpenVip.visibility = View.GONE
binding.layoutOpenVip.visibility = View.GONE
binding.tvIcon.visibility = View.GONE
@@ -419,7 +422,6 @@ class VipCenterActivity : BaseViewBindingActivity<ActivityVipCenterBinding>(),
}
binding.tvNoticeText.visibility = View.GONE
binding.tvAdditionalText.visibility = View.VISIBLE
binding.tvOpenVip.visibility = View.VISIBLE
binding.layoutOpenVip.visibility = View.VISIBLE
binding.tvIcon.visibility = View.VISIBLE
@@ -429,12 +431,7 @@ class VipCenterActivity : BaseViewBindingActivity<ActivityVipCenterBinding>(),
)
}".also { binding.tvOpenVip.text = it }
val calendar = Calendar.getInstance()
calendar.add(Calendar.DAY_OF_YEAR, 30)
val dateFormat = SimpleDateFormat("yyyy/MM/dd 00:00", Locale.getDefault())
val formattedDate = dateFormat.format(calendar.time)
val result = "$formattedDate ${getString(R.string.vip_center_6)}"
binding.tvAdditionalText.text = result
}
}
}
@@ -455,12 +452,6 @@ class VipCenterActivity : BaseViewBindingActivity<ActivityVipCenterBinding>(),
}".also { binding.tvOpenVip.text = it }
}
val calendar = Calendar.getInstance()
calendar.add(Calendar.DAY_OF_YEAR, 30)
val dateFormat = SimpleDateFormat("yyyy/MM/dd 00:00", Locale.getDefault())
val formattedDate = dateFormat.format(calendar.time)
val result = "$formattedDate ${getString(R.string.vip_center_6)}"
binding.tvAdditionalText.text = result
} else {
currentChargeInfo = null

View File

@@ -61,28 +61,20 @@ class VipViewModel : BaseViewModel() {
vipPageInfo?.let {
_authInfosLiveData.value = it.vipAuthInfos
_vipInfosLiveData.value = it.vipInfos
if (it.currLevel == 0) {
_myVipInfoLiveData.value = null
onItemSelect(0)
} else {
var position = 0
_myVipInfoLiveData.value =
it.vipInfos?.find { vipInfo -> it.currLevel == vipInfo.vipLevel }
?.copy()
?.apply {
position = it.vipInfos?.indexOf(this) ?: -1
val nextVipInfo =
it.vipInfos?.getOrNull(position + 1)
nextVipName =
if (nextVipInfo?.vipName == vipName) null else nextVipInfo?.vipName
remainSeconds = it.remainSeconds
currLevel = it.currLevel
currScore = it.currScore
isMaxLevel = it.isMaxLevel
}
onItemSelect(if (position < 0) 0 else position)
}
var position = 0
_myVipInfoLiveData.value = it.vipInfos?.findLast { vipInfo ->
vipInfo.remainSeconds > 0
}?.copy()
?.apply {
position = it.vipInfos?.indexOf(this) ?: -1
val nextVipInfo = it.vipInfos?.getOrNull(position + 1)
nextVipName = if (nextVipInfo?.vipName == vipName) null else nextVipInfo?.vipName
// remainSeconds = it.remainSeconds
currLevel = it.currLevel
currScore = it.currScore
isMaxLevel = it.isMaxLevel
}
onItemSelect(if (position < 0) 0 else position)
}
}

View File

@@ -6,9 +6,13 @@ import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.chwl.app.R
import com.chwl.app.ui.utils.loadAnim
import com.chwl.core.vip.bean.VipInfo
import com.chwl.library.common.glide.GlideUtils
import com.chwl.library.download.DownloadException
import com.chwl.library.download.DownloadManager.download
import com.chwl.library.download.DownloadRequest.Companion.build
@@ -22,8 +26,10 @@ import com.tencent.qgame.animplayer.inter.IAnimListener
import com.tencent.qgame.animplayer.util.ScaleType
import com.youth.banner.adapter.BannerAdapter
import java.io.File
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class VipCenterBannerAdapter(
@@ -43,25 +49,35 @@ class VipCenterBannerAdapter(
}
override fun onBindView(holder: BannerViewHolder, data: VipInfo, position: Int, size: Int) {
//todo do 旧bug 买完VIP不刷新item
holder.dueText.visibility = View.GONE
myVipInfo?.let {
if (it.vipLevel == data.vipLevel) {
val calendar = Calendar.getInstance()
calendar.add(Calendar.SECOND, it.remainSeconds)
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
val formattedDate = dateFormat.format(calendar.time)
val result = "${getString(R.string.vip_center_2)}$formattedDate"
holder.dueText.text = result
holder.dueText.visibility = View.VISIBLE
} else if (it.vipLevel < data.vipLevel) {
holder.dueText.text = getString(R.string.vip_center_8)
holder.dueText.visibility = View.VISIBLE
} else {
holder.dueText.visibility = View.GONE
if (myVipInfo != null) {
myVipInfo.let {
if (it.vipLevel >= data.vipLevel) {
var result = getString(R.string.vip_center_8)
if (data.remainSeconds>0){
val calendar = Calendar.getInstance()
calendar.add(Calendar.SECOND, data.remainSeconds)
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH)
val formattedDate = dateFormat.format(calendar.time)
result = "${getString(R.string.vip_center_2)}$formattedDate"
}
holder.dueText.text = result
holder.dueText.visibility = View.VISIBLE
} else if (it.vipLevel < data.vipLevel) {
holder.dueText.text = getString(R.string.vip_center_8)
holder.dueText.visibility = View.VISIBLE
} else {
holder.dueText.visibility = View.GONE
}
}
}else{
holder.dueText.text = getString(R.string.vip_center_8)
holder.dueText.visibility = View.VISIBLE
}
when(position) {
0-> {
holder.dueText.setTextColor(context.resources.getColor(R.color.color_3A4D14))
@@ -126,18 +142,43 @@ class VipCenterBannerAdapter(
})
val filePath = generateResourcesFilePath(data.vipLogo)
val request = build(data.vipLogo, filePath, DOWNLOAD_TAG, null, 60000L)
download(request, object : FileDownloadListener() {
override fun onDownloadCompleted(task: DownloadTask) {
val path = task.getRequest().getPath()
holder.vapAnimView.startPlay(File(path))
//todo do , liulishuo 下载器 换 glide 下载 , 注意 .trim() 去掉前后空格符
GlideUtils.instance().downloadFromUrl(holder.vapAnimView.context,data.vipLogo.trim(),object : RequestListener<File?> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<File?>?,
isFirstResource: Boolean
): Boolean {
return true
}
override fun onDownloadError(exception: DownloadException) {
exception.printStackTrace()
override fun onResourceReady(
resource: File?,
model: Any?,
target: Target<File?>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
if (resource != null) {
holder.vapAnimView.startPlay(resource)
}
return true
}
})
// val filePath = generateResourcesFilePath(data.vipLogo)
// val request = build(data.vipLogo, filePath, DOWNLOAD_TAG, null, 60000L)
// download(request, object : FileDownloadListener() {
// override fun onDownloadCompleted(task: DownloadTask) {
// val path = task.getRequest().getPath()
// holder.vapAnimView.startPlay(File(path))
// }
//
// override fun onDownloadError(exception: DownloadException) {
// exception.printStackTrace()
// }
// })
}
inner class BannerViewHolder(view: View) : RecyclerView.ViewHolder(view) {
@@ -147,5 +188,8 @@ class VipCenterBannerAdapter(
val dueText: TextView = view.findViewById(R.id.due_date_textview)
}
fun millis2String(millis: Long, format: DateFormat): String {
return format.format(Date(millis))
}
}

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="0px"
android:bottomRightRadius="@dimen/dp_11"
android:topLeftRadius="0px"
android:topRightRadius="@dimen/dp_11" />
<gradient
android:endColor="#FFD936"
android:startColor="#F2A20F" />
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

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