Compare commits

..

12 Commits

Author SHA1 Message Date
eggmanQQQ
ce50e32a73 feat ; 去掉 carshCat 2024-09-26 16:11:20 +08:00
eggmanQQQ
7223db9e9c fix: 修复bug , 增加全局报错日志抓取 2024-09-26 15:28:07 +08:00
eggmanQQQ
4a2a9d4400 feat : 明文流量修改回退 2024-09-25 19:39:57 +08:00
eggmanQQQ
8049bdf6ea fix : bug 修复 2024-09-25 19:37:21 +08:00
eggmanQQQ
c90a961e2f feat : 修改权限 , 新增 定制礼物, 去掉友盟取设备号的sdk , 明文请求修改 2024-09-25 19:06:52 +08:00
eggmanQQQ
892f7c3e70 fix: vip 时间 2024-09-24 18:36:54 +08:00
eggmanQQQ
4c8182ee2f update version to 1.0.16 2024-09-24 18:26:33 +08:00
eggmanQQQ
343e73c6e3 feat: 修改 cp 相关bug 2024-09-24 18:18:53 +08:00
eggmanQQQ
eabe2ae7f8 feat : 修复bug 2024-09-24 11:31:29 +08:00
eggmanQQQ
36c011d18e feat : cp 功能 , 个人主页UI修改 , cp列表 , 房间cp飘屏,cp相关动画 , vip中心banner 显示剩余时间 2024-09-23 16:10:39 +08:00
eggmanQQQ
f929d78540 feat : 房間按鈕調整 (欠缺几个图片。app icon 和空状态图 未更改 2024-09-14 15:30:09 +08:00
eggmanQQQ
8184cdd6e1 feat: 房间 排行按钮, 音乐按钮 2024-09-13 13:53:13 +08:00
208 changed files with 6031 additions and 1574 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" />
@@ -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.

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

@@ -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() {
@@ -110,17 +112,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

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

View File

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

@@ -18,7 +18,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)
@@ -61,15 +61,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

@@ -79,6 +79,7 @@ import com.chwl.core.auth.AuthModel
import com.chwl.core.bean.RoomMicInfo
import com.chwl.core.gift.GiftModel
import com.chwl.core.gift.bean.GiftInfo
import com.chwl.core.gift.bean.GiftType
import com.chwl.core.gift.event.GiftComboEvent
import com.chwl.core.gift.event.RoomFreeGiftEvent
import com.chwl.core.helper.AtProxy
@@ -113,6 +114,7 @@ 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.net.rxnet.utils.RxNetWorkUtils
@@ -122,6 +124,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
@@ -645,14 +648,14 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
@CallSuper
open fun updateMicBtn() {
//todo do 关麦开麦
val currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo
if (currentRoomInfo != null) {
if (AudioEngineManager.get().isAudienceRole) {
bottomView.setMicBtnEnable(false)
bottomView.setMicBtnOpen(false)
} else {
val roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByAccount(myUid.toString())
val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(myUid.toString())
if (roomQueueInfo?.mChatRoomMember != null
&& myUid.toString() == roomQueueInfo.mChatRoomMember.account
&& roomQueueInfo.mRoomMicInfo?.isMicMute == true
@@ -753,14 +756,13 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
}
R.id.iv_game -> {
val dialog = RoomGameplayDialog()
dialog.isOnlyPK = false
val dialog = RoomGameListDialog();
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 +899,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()
}
}
@@ -1334,8 +1338,8 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
open inner class BaseRoomBottomViewWrapper : BottomViewListenerWrapper() {
@SuppressLint("CheckResult")
override fun onOpenMicBtnClick() {
val roomQueueInfo = AvRoomDataManager.get()
.getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString())
//todo do 关麦开麦
val roomQueueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByAccount(AuthModel.get().currentUid.toString())
if (roomQueueInfo?.mRoomMicInfo == null) return
//先判斷麥上是否是開麥的
if (!roomQueueInfo.mRoomMicInfo.isMicMute && !AudioEngineManager.get().isAudienceRole) {
@@ -1489,7 +1493,7 @@ open class BaseRoomFragment<V : IBaseRoomView?, P1 : BaseRoomPresenter<V>?> :
}
protected open fun onInitMusicPlayerView(view: MusicPlayerView) {
//todo-- 音乐按钮
}

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.avroom.dialog.RoomNotifyLuckGiftDialog;
import com.chwl.app.databinding.LayoutRoomNotifyLuckyGiftTipBinding;
import com.chwl.app.utils.GiftAnimUtil;
import com.chwl.app.utils.NumberUtils;
import com.chwl.app.utils.RoomNotifyManager;
import com.chwl.app.utils.WeakPool;
import com.chwl.core.auth.AuthModel;
import com.chwl.core.gift.bean.CpMsgBean;
import com.chwl.core.gift.bean.LuckyGiftMsgAllBean;
import com.chwl.core.gift.bean.LuckyGiftMsgSelfBean;
import com.chwl.core.gift.bean.MsgSuperLuckyGift;
import com.chwl.core.gift.bean.RoomNotifyDialogBean;
import com.chwl.core.utils.ComboUtil;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.BonsellaJoinAttackButtonView;
@@ -119,8 +122,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();
@@ -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,7 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
luckyGiftTipPool.clear();
handler.removeCallbacksAndMessages(null);
mLuckyGiftList.clear();
RoomNotifyManager.INSTANCE.clear();
if (giftView != null) {
giftView.release();
@@ -694,6 +698,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe
}
/**
* 幸运礼物 飘屏 跟 圆球提示
*/
private void onLuckyGiftMsg(RoomEvent roomEvent) {
MsgSuperLuckyGift msgSuperLuckyGift = roomEvent.getMsgSuperLuckyGift();
if (msgSuperLuckyGift != null) {
@@ -708,7 +715,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 +763,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 校验数据是否异常
RoomNotifyManager.INSTANCE.addDialog(new RoomNotifyDialogBean(
CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_TEMPLATE,
CustomAttachment.CUSTOM_MSG_SUPER_LUCKY_GIFT_ROOM,
data
));
}
/**
* cp 礼物
*/
private void onCpAboutMsg(RoomEvent roomEvent) {
//todo do 校验数据是否异常
CpMsgBean cpMsgBean = roomEvent.getCpMsgBean();
if (cpMsgBean != null) {
RoomNotifyManager.INSTANCE.addDialog(new RoomNotifyDialogBean(
CustomAttachment.CP_FIRST,
cpMsgBean.getSecond(),
cpMsgBean
));
}
}
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

@@ -22,6 +22,8 @@ import com.chwl.core.room.bean.RoomIcon;
import com.chwl.core.room.core.RoomDataService;
import com.chwl.core.room.pk.event.PKDataUpdateEvent;
import com.chwl.core.support.room.AudioRoomContext;
import com.chwl.core.support.room.RoomAbility;
import com.chwl.core.support.room.RoomContext;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.trello.rxlifecycle3.android.FragmentEvent;
import com.chwl.app.R;
@@ -162,24 +164,30 @@ public class HomePartyRoomFragment extends BaseRoomFragment<IHomePartyView, Home
}
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();
RoomContext roomContext = AudioRoomContext.Companion.get();
if (roomContext != null) {
RoomDataService dataService = roomContext.findAbility(RoomDataService.class.getSimpleName());
if (dataService != null) {
String cacheKey = "gameplay_list#" + hashCode();
Disposable disposable = AvRoomModel.get().getRoomGamePlayList().doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
hasBaishunGames = false;
updateConfigButtonArea();
}
}).subscribe(new Consumer<List<RoomIcon>>() {
@Override
public void accept(List<RoomIcon> roomIcons) throws Exception {
if (dataService != null) {
dataService.putData(cacheKey, roomIcons);
}
hasBaishunGames = roomIcons.size() > 0;
updateConfigButtonArea();
}
});
}
}).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

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

@@ -22,6 +22,7 @@ import androidx.annotation.Nullable;
import com.chwl.app.avroom.activity.RoomTypeSwitchActivity;
import com.chwl.core.utils.extension.StringExtensionKt;
import com.chwl.library.utils.SizeUtils;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nimlib.sdk.msg.model.RecentContact;
@@ -73,12 +74,10 @@ 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;
@NonNull
private final Runnable msgRunnable = this::dismissMsgPopupWindow;
@@ -108,12 +107,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 +119,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);
@@ -247,9 +242,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 +253,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);
// }
}
@@ -328,6 +320,7 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
if (wrapper != null) {
wrapper.onOpenMicBtnClick();
}
// showMicSetDialog(openMic);
break;
case R.id.tv_room_send_msg_input:
@@ -376,16 +369,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 +460,40 @@ public class BottomView extends LinearLayout implements View.OnClickListener {
parent.postDelayed(msgRunnable, 3000);
}
private void showMicSetDialog(View parent){
//todo do 关麦开麦
View contentView;
if (micSetPopupWindow == null) {
contentView = LayoutInflater.from(getContext()).inflate(R.layout.popup_mic_set, null);
micSetPopupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
micSetPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// micSetPopupWindow.setAnimationStyle(R.style.style_anim_mic_set);
} else {
contentView = micSetPopupWindow.getContentView();
}
ImageView micOff = contentView.findViewById(R.id.micOff);
ImageView micMusic = contentView.findViewById(R.id.micMusic);
ImageView micOn = contentView.findViewById(R.id.micOn);
micOff.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
});
micMusic.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
});
micOn.setOnClickListener(v -> {
micSetPopupWindow.dismiss();
});
int[] vLoc = new int[2];
parent.getLocationInWindow(vLoc);
try {
micSetPopupWindow.showAsDropDown(parent,0, -ScreenUtil.dip2px(180),Gravity.CENTER_HORIZONTAL);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -265,6 +265,18 @@ public abstract class BaseActivity extends RxAppCompatActivity
}
}
public void initBlackTitleBar(String title) {
mTitleBar = findViewById(R.id.title_bar);
if (mTitleBar != null) {
mTitleBar.setTitle(title);
mTitleBar.setImmersive(false);
mTitleBar.setTitleColor(getResources().getColor(R.color.white));
mTitleBar.setLeftImageResource(R.drawable.icon_user_back);
mTitleBar.setBackgroundResource(R.color.transparent);
mTitleBar.setLeftClickListener(v -> onLeftClickListener());
}
}
public void initTitleBar(String title, TitleBar.Action action) {
mTitleBar = findViewById(R.id.title_bar);
if (mTitleBar != null) {

View File

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

@@ -16,6 +16,8 @@ import com.chwl.app.UIHelper
import com.chwl.app.application.IReportConstants
import com.chwl.app.application.ReportManager
import com.chwl.app.avroom.activity.AVRoomActivity
import com.chwl.app.avroom.dialog.RoomNotifyCpBindDialog
import com.chwl.app.avroom.dialog.RoomNotifyLevelUpDialog
import com.chwl.app.base.BaseActivity
import com.chwl.app.base.BaseFragment
import com.chwl.app.databinding.FragmentMeBinding
@@ -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.CpMsgBean
import com.chwl.core.initial.InitialModel
import com.chwl.core.level.UserLevelVo
import com.chwl.core.manager.IMNetEaseManager
@@ -318,11 +321,12 @@ class MeFragment : BaseFragment(), View.OnClickListener {
override fun onClick(v: View) {
when (v.id) {
R.id.iv_user_head, R.id.rl_user_info ->
R.id.iv_user_head, R.id.rl_user_info ->{
mUserInfo?.let { UIHelper.showUserInfoAct(mContext, it.uid) }
R.id.iv_edit ->
mUserInfo?.let { UIHelper.showUserInfoModifyAct(mContext, it.uid) }
}
//
// R.id.iv_edit ->
// mUserInfo?.let { UIHelper.showUserInfoModifyAct(mContext, it.uid) }
R.id.ll_user_attentions -> startActivity(
Intent(

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

@@ -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设置改变 todo do
}
}
private fun reportArea(area: String) {
binding.tvArea.text = area
dialogManager.showProgressDialog(
@@ -358,24 +442,30 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
}
private fun checkStoragePermission() {
if (!EasyPermissions.hasPermissions(
this,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
) {
EasyPermissions.requestPermissions(
this,
getString(R.string.permission_storage_rationale),
PERMISSION_CODE_STORAGE,
if (Build.VERSION.SDK_INT >= 33) Manifest.permission.READ_MEDIA_IMAGES else Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(
this,
resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER
)
if (Build.VERSION.SDK_INT >= 33){
DialogUtil.getDialog(this,object : EasyAlertDialogHelper.OnDialogActionListener {
override fun doCancelAction() {
}
override fun doOkAction() {
SPUtils.putBoolean(ConstantsLib.Key.Permissions_Img,true)
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
pickMedia?.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
})
}else{
if (!EasyPermissions.hasPermissions(this,Manifest.permission.READ_EXTERNAL_STORAGE)) {
EasyPermissions.requestPermissions(this, getString(R.string.permission_storage_rationale), PERMISSION_CODE_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
)
} else {
mUri = Uri.parse("file://${FileHelper.getRootCacheDir()?.path}/${getNowTime()}.jpg")
PhotoProvider.photoProvider(this, resultCode = REQUEST_CODE_OPEN_PHOTO_PROVIDER)
}
}
}
private fun getNowTime(): String {
@@ -488,14 +578,16 @@ class UserInfoModifyActivity : BaseViewBindingActivity<ActivityUserInfoModifyBin
toast(R.string.text_bitmap_too_large)
return
}
if (sourceSize > 0) {
//不能上传图片的最小文件大小
CoreLogger.debug(TAG, "sourceSize: $sourceSize")
if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
toast(R.string.text_bitmap_too_small)
return
}
}
// if (sourceSize > 0) {
// //不能上传图片的最小文件大小
// CoreLogger.debug(TAG, "sourceSize: $sourceSize")
// if (sourceSize < MIN_HEAD_PHOTO_SIZE) {
// toast(R.string.text_bitmap_too_small)
// return
// }
// }
val options = UCrop.Options().apply {
setCompressionQuality(100)
setShowCropGrid(false)

View File

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

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,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,6 +23,7 @@ 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.utils.ResUtil
import com.example.lib_utils.UiUtils
@@ -213,19 +214,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() {

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);

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,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 RoomNotifyManager {
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

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

@@ -7,7 +7,6 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.chwl.app.R
import com.chwl.app.ui.utils.loadAnim
import com.chwl.core.vip.bean.VipInfo
import com.chwl.library.download.DownloadException
import com.chwl.library.download.DownloadManager.download
@@ -22,8 +21,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 +44,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))
@@ -147,5 +158,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.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

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