diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java b/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java index b17f0b40..b0d4cf06 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/base/CommonAppContext.java @@ -137,7 +137,7 @@ public class CommonAppContext extends MultiDexApplication implements Application @Getter public UnreadCountEvent unreadCountEvent; - public static int selectRelease = 1; + public static int selectRelease = -1; public int is_open = 0;//主题的开关 diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt new file mode 100644 index 00000000..0c5f71f1 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupBean.kt @@ -0,0 +1,53 @@ +package com.xscm.moduleutil.bean + +/** + * 项目名称:羽声语音 + * 时间:2026/1/3 10:13 + * 用途:群聊实体类 + */ +class GroupBean { + var guild_id: String = "" + var guild_cover: String = "" + var is_deacon: Int = 0 //是否是群主 1:是 ,其他的不是 + var user_list: List = ArrayList() + + var name: String = "" + var notification: String = "" + var mute_all_member : Int = 0 //是否全体禁言 1:是 0:不是 + class GroupUserBean { + var is_online: Int = 0 //是否在线 1:在线 0:不在线 + var market_value: Int = 0 //身价 + var nickname: String = "" + var avatar: String = "" + var user_code: String = "" + var user_id: Int = 0 + var createtime: String = "" + var is_self: Int = 0 //是否是本人 1:是 0:不是 + var role: String = "" + var role_str: String = "" + var in_room_id: Int = 0 //是否在房间内 1:在 0:不在 + var is_mute: Int = 0 //是否被禁言 1:是 0:不是 + } + + + /*"guild_id": "f627", + "guild_cover": "https://yusheng-1369267578.cos.ap-guangzhou.myqcloud.com/images/android_images/325ee1f528343bb09ddc086b2b83b190.jpg", + "is_deacon": 1, + "user_list": [ + { + "is_online": 1, + "market_value": 28, + "nickname": "🥭芒的很", + "avatar": "https://yusheng-1369267578.cos.ap-guangzhou.myqcloud.com/images/ios_images/1764941796523.jpeg", + "user_code": "10001", + "user_id": 21211, + "createtime": "2025-12-31 13:20:28", + "is_self": 0, + "role": "Member", + "role_str": "普通群成员", + "in_room_id": 0 + } + ], + "name": "美丽的眼神的家族", + "notification": ""*/ +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupUserListBean.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupUserListBean.kt new file mode 100644 index 00000000..3945fa73 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GroupUserListBean.kt @@ -0,0 +1,13 @@ +package com.xscm.moduleutil.bean + +/** + * 项目名称:羽声语音 + * 时间:2026/1/3 14:07 + * 用途:群成员列表 + */ +class GroupUserListBean { + var page : String="" + var limit : String="" + var count : String="" + var list : List?= ArrayList() +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/PersonaltyListBean.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/PersonaltyListBean.kt new file mode 100644 index 00000000..53edcfa0 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/PersonaltyListBean.kt @@ -0,0 +1,57 @@ +package com.xscm.moduleutil.bean + +/** + * 项目名称:羽声语音 + * 时间:2026/1/3 18:44 + * 用途:装扮列表 + */ +class PersonaltyListBean { + var did: Int =0 // 装扮id + var title: String = "" // 装扮名称 + var type: Int = 0 // 1头像框 2坐骑 3资料展示特效 4光圈 5气泡 6个人靓号 7房间靓号 8工会靓号 100热门 + var base_image: String = "" // 展示图片 + var play_image: String = "" // 播放图像 + var price: Int = 0 // 实际价格(金币) + var special_num: Int = 0 // 靓号 + var original_price: Int = 0 // 原价 + var discount: Int = 0 // 折扣 + var discount_str: String = "" // 折扣字段 + + + /* title + 装扮名称 + + type + + + 类型:1头像框 2坐骑 3资料展示特效 4光圈 5气泡 6个人靓号 7房间靓号 8工会靓号 100热门 + + base_image + + 展示图片 + + play_image + + 播放图像 + + price + + 实际价格(金币) + + special_num + + 靓号 + + original_price + + 原价 + + discount + + 折扣 + + discount_str + + 折扣字段*/ + +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java index 9d7e9f24..7bba1a05 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -43,6 +43,9 @@ public interface ApiServer { @GET(Constants.GET_FESTIVAL_THEME) Call> getFestivalThemeBean(); + + @GET(Constants.GET_PERSONALTY_LIST_BEAN) + Call>> getPersonaltyListBean(@Query("type") String type); @GET(Constants.GET_EMOTION) Call>> upEmotion(); @@ -132,6 +135,16 @@ public interface ApiServer { @FormUrlEncoded @POST(Constants.POST_INVITE) Call> postInvite(@Field("apply_id") String apply_id, @Field("type") String type); + @GET(Constants.GET_GROUP_INFO) + Call> getGuildInfo(@Query("guild_id")String guild_id); + + @FormUrlEncoded + @POST(Constants.POST_GROUP_INFO) + Call> setGuildInfo(@Field("guild_id") String guild_id, @Field("name") String guild_name, @Field("notice") String guild_notice,@Field("avatar") String guild_avatar); + + @GET(Constants.GET_MEMBER_LIST) + Call> memberList(@Query("page")String page, @Query("page_limit") String page_limit, @Query("guild_id") String guild_id,@Query("search") String search); + @GET(Constants.GET_TEMP_KEY) Call> getTempKey(); diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java index 30e52667..d38cb173 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -251,6 +251,35 @@ public class RetrofitClient { }); } + public void getPersonaltyListBean(String type, BaseObserver> observer) { + sApiServer.getPersonaltyListBean(type).enqueue(new Callback>>() { + + @Override + public void onResponse(Call>> call, Response>> response) { + if (response.code() == 200) { + BaseModel> body = response.body(); + if (body.getCode() == 1) { + observer.onNext(body.getData()); + } else if (body.getCode() == 0) { + ToastUtils.showLong(body.getMsg()); + observer.onNext(new ArrayList<>()); + } else if (body.getCode() == 301) { + setCode301(body.getMsg()); + } + } else { + ToastUtils.showLong("装扮请求错误", response.code()); + LogUtils.e("getPersonaltyList", response.message()); + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + LogUtils.e("getPersonaltyList", t.getMessage()); + } + }); + + } + public void getFestivalTheme(BaseObserver observer) { sApiServer.getFestivalThemeBean().enqueue(new Callback>() { @@ -646,6 +675,77 @@ public class RetrofitClient { }); } + public void getGuildInfo(String guildId, BaseObserver observer) { + sApiServer.getGuildInfo(guildId).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + if (response.code() == 200) { + BaseModel baseModel = response.body(); + if (baseModel.getCode() == 1) + observer.onNext(baseModel.getData()); + else if (baseModel.getCode() == 301) { + setCode301(baseModel.getMsg()); + } else { + ToastUtils.showLong(baseModel.getMsg()); + observer.onNext(new GroupBean()); + } + } else { + observer.onNext(new GroupBean()); + ToastUtils.showLong("群聊设置错误,请重试", response.code()); + LogUtils.e("getGuildInfo", response.message()); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("getGuildInfo", t.fillInStackTrace()); + } + }); + } + + public void setGuildInfo(String guildId, String name, String notice, String avatar, BaseObserver observer) { + sApiServer.setGuildInfo(guildId, name, notice, avatar).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + onNextRetu(response, observer); + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("setGuildInfo", t.fillInStackTrace()); + } + }); + } + + public void memberList(String page, String pageLimit, String guildId, String search, BaseObserver observer) { + sApiServer.memberList(page, pageLimit, guildId, search).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + if (response.code() == 200) { + BaseModel baseModel = response.body(); + if (baseModel.getCode() == 1) + observer.onNext(baseModel.getData()); + else if (baseModel.getCode() == 301) + setCode301(baseModel.getMsg()); + else { + ToastUtils.showLong(baseModel.getMsg()); + } + } else { + ToastUtils.showLong("群成员请求错误", response.code()); + LogUtils.e("memberList", response.message()); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("memberList", t.fillInStackTrace()); + } + }); + } + public void singerAuth(String url, BaseObserver observer) { sApiServer.singerAuth(url).enqueue(new Callback>() { @@ -2034,7 +2134,7 @@ public class RetrofitClient { } } else { observer.onError(new Throwable(response.message())); - ToastUtils.showLong("首页房间列表异常",response.code()); + ToastUtils.showLong("首页房间列表异常", response.code()); LogUtils.e("getTopRooms", response.message()); } } @@ -2382,7 +2482,7 @@ public class RetrofitClient { setCode301(listBaseModel.getMsg()); } } else { - ToastUtils.showLong("进入用户主页错误",response.code()); + ToastUtils.showLong("进入用户主页错误", response.code()); LogUtils.e("getUserHome", response.message()); } } @@ -2445,15 +2545,15 @@ public class RetrofitClient { }); } - public void delSong(String roomId,String did,BaseObserver observer){ - sApiServer.delSong(roomId,did).enqueue(new Callback>() { + public void delSong(String roomId, String did, BaseObserver observer) { + sApiServer.delSong(roomId, did).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { if (response.code() == 200) { onNextRetu(response, observer); - }else { - ToastUtils.showLong("删除歌曲失败",response.code()); + } else { + ToastUtils.showLong("删除歌曲失败", response.code()); LogUtils.e("delSong", response.message()); } } @@ -2480,7 +2580,7 @@ public class RetrofitClient { ToastUtils.showShort(listBaseModel.getMsg()); } } else { - ToastUtils.showLong("获取用户数据错误",response.code()); + ToastUtils.showLong("获取用户数据错误", response.code()); LogUtils.e("getMyInfo", response.message()); } } @@ -2673,8 +2773,8 @@ public class RetrofitClient { } else { MessageListenerSingleton.getInstance().quitGroup(roomId); } - }else { - ToastUtils.showLong("进入房间错误",response.code()); + } else { + ToastUtils.showLong("进入房间错误", response.code()); if (joinRoomLoadListener != null) { joinRoomLoadListener.onJoinRoomLoad("网络异常"); } @@ -3013,7 +3113,7 @@ public class RetrofitClient { } public void getRedpacketConfig(BaseObserver observer) { - sApiServer.getRedpacketConfig().enqueue(new Callback>(){ + sApiServer.getRedpacketConfig().enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java index e2c1baa6..1caf0b77 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -380,6 +380,9 @@ public class Constants { public static final String POST_CLEAR_USER_CHARM = "/api/Room/clear_user_charm";//清除魅力值 public static final String POST_MESSAGE_LIST = "/api/UserMessage/get_user_message_list";//消息列表 public static final String POST_INVITE = "/api/Guild/invite_apply_handle";//【新】受邀申请处理 + public static final String GET_GROUP_INFO = "/api/Guild/get_guild_info";//群聊设置详情 + public static final String POST_GROUP_INFO = "/api/Guild/set_guild_info";//设置群聊信息 + public static final String GET_MEMBER_LIST = "/api/Guild/member_list";//群聊成员 public static final String POST_BIND_DETAIL = "/api/Bind/bind_detail";//绑定详情 public static final String POST_USER_WALL = "/api/User/user_gift_wall";//礼物墙 public static final String POST_USER_OLINE_STATUS = "/api/Room/user_online_status";//用户在线状态 @@ -452,6 +455,7 @@ public class Constants { public static final String MODIFY_MOBILE = "/api/UserData/modify_mobiles";//手机换绑 public static final String BIND_MOBILE = "/api/UserData/bind_mobile";//手机绑定 public static final String GET_FESTIVAL_THEME = "/api/Theme/get_festival_theme";//节日主题接口 + public static final String GET_PERSONALTY_LIST_BEAN = "/api/Decorate/get_decorate_list";//装饰列表 public static final String POST_SIGN_START = "/api/Sign/start_sign";//签约开始 diff --git a/BaseModule/src/main/res/layout/item_gift_room.xml b/BaseModule/src/main/res/layout/item_gift_room.xml index a4cc566b..d04048ab 100644 --- a/BaseModule/src/main/res/layout/item_gift_room.xml +++ b/BaseModule/src/main/res/layout/item_gift_room.xml @@ -77,7 +77,7 @@ android:layout_gravity="center_horizontal" android:background="@mipmap/text_bj" android:gravity="center" - android:text="x30" + tools:text="x30" android:textColor="@color/color_FF333333" android:textSize="@dimen/sp_10" android:visibility="gone" diff --git a/MainModule/src/main/AndroidManifest.xml b/MainModule/src/main/AndroidManifest.xml index 942424f1..d003ca62 100644 --- a/MainModule/src/main/AndroidManifest.xml +++ b/MainModule/src/main/AndroidManifest.xml @@ -7,6 +7,27 @@ + + + + + + + + + + + + + @@ -56,10 +77,10 @@ android:configChanges="orientation|screenSize|keyboardHidden" android:enableOnBackInvokedCallback="false" android:exported="false" + android:persistableMode="persistAcrossReboots" android:screenOrientation="portrait" android:theme="@style/AppTheme" - android:windowSoftInputMode="adjustPan" - android:persistableMode="persistAcrossReboots"/> + android:windowSoftInputMode="adjustPan" /> diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/GroupChatSettingsActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/GroupChatSettingsActivity.kt new file mode 100644 index 00000000..374f1bbe --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/GroupChatSettingsActivity.kt @@ -0,0 +1,146 @@ +package com.xscm.modulemain.activity + +import android.content.Intent +import android.view.View +import android.widget.CompoundButton +import androidx.recyclerview.widget.LinearLayoutManager +import com.blankj.utilcode.util.ToastUtils +import com.tencent.imsdk.v2.V2TIMCallback +import com.tencent.imsdk.v2.V2TIMGroupManager +import com.tencent.imsdk.v2.V2TIMManager +import com.xscm.modulemain.BaseMvpActivity +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.msg.NewsContacts +import com.xscm.modulemain.activity.msg.NewsPresenter +import com.xscm.modulemain.adapter.GroupAdapter +import com.xscm.modulemain.databinding.ActivityGroupChatSettingsBinding +import com.xscm.moduleutil.bean.GroupBean +import com.xscm.moduleutil.bean.GroupUserListBean +import com.xscm.moduleutil.bean.NewsMessageList +import com.xscm.moduleutil.utils.ImageUtils + +/** + * @Author + * @Time 2026/1/2 14:57 + * @Description 群聊设置 + */ +class GroupChatSettingsActivity : + BaseMvpActivity(), + NewsContacts.View { + + var groupAdapter: GroupAdapter? = GroupAdapter() + val v2TIMGroupManager: V2TIMGroupManager?= V2TIMManager.getGroupManager() + var groupId: String = "" + var isOwner : Boolean = false + + var groupBean : GroupBean= GroupBean() + + override fun bindPresenter(): NewsPresenter { + return NewsPresenter(this, this) + } + + + override fun initData() { + mBinding?.topBar?.tvTitle?.text = "群聊设置" + MvpPre?.getGuildInfo(groupId) + // 设置布局管理器 + mBinding?.rvGroupMember?.apply { + layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) + // 可选:设置是否固定大小 + setHasFixedSize(true) + // 设置适配器 + adapter = groupAdapter + } + + mBinding?.tvGroupCount?.setOnClickListener { + val intent = Intent(this, GroupUserListActivity::class.java).apply { + putExtra("groupId", groupId) + putExtra("isOwner", isOwner) + } + startActivity(intent) + } + + mBinding?.tvConfirm?.setOnClickListener { + if(mBinding?.evGroupName?.text.toString().equals(groupBean.name) && mBinding?.etG?.text.toString().equals(groupBean.notification)){ + finish() + }else if (mBinding?.evGroupName?.text.toString().equals(groupBean.name) && !mBinding?.etG?.text.toString().equals(groupBean.notification)){ + MvpPre?.setGuildInfo(groupId, "", mBinding?.etG?.text.toString(), "") + }else if (!mBinding?.evGroupName?.text.toString().equals(groupBean.name) && mBinding?.etG?.text.toString().equals(groupBean.notification)){ + MvpPre?.setGuildInfo(groupId, mBinding?.evGroupName?.text.toString(), "", "") + }else { + MvpPre?.setGuildInfo( + groupId, + mBinding?.evGroupName?.text.toString(), + mBinding?.etG?.text.toString(), + "" + ) + } + } + mBinding?.switJy?.setOnCheckedChangeListener { compoundButton, b -> + v2TIMGroupManager?.muteAllGroupMembers(groupId, b, object : V2TIMCallback { + override fun onSuccess() { + + } + + override fun onError(code: Int, desc: String?) { + mBinding?.switJy?.isChecked = !b + } + }) + } + + } + + override fun getLayoutId(): Int { + return R.layout.activity_group_chat_settings + } + + override fun showNews(newsList: List?) { + } + + override fun finishRefresh() { + } + + override fun postInvite() { + } + + override fun getGuildInfo(groupBean: GroupBean?) { + if (groupBean == null) { + finish() + return + } + this.groupBean=groupBean + mBinding?.groupName?.text = groupBean.name + ImageUtils.loadHead(groupBean.guild_cover, mBinding?.imGroup) + if (groupBean.is_deacon == 1) { + isOwner=true + mBinding?.llGroup?.visibility = View.VISIBLE + mBinding?.switJy?.isChecked = groupBean.mute_all_member == 1 + mBinding?.etG?.isEnabled = true + mBinding?.evGroupName?.isEnabled = true + } else { + isOwner=false + mBinding?.llGroup?.visibility = View.GONE + mBinding?.etG?.isEnabled = false + mBinding?.evGroupName?.isEnabled = false + } + mBinding?.etG?.text?.append(groupBean.notification) + mBinding?.evGroupName?.text?.append(groupBean.name) + + groupAdapter?.setNewData(groupBean.user_list) + + } + + override fun setGuildInfo(s: String?) { + ToastUtils.showLong(s) + finish() + } + + override fun memberList(groupUserListBean: GroupUserListBean?) { + + } + + override fun doDone() { + super.doDone() + groupId = intent.getStringExtra("groupId").toString() + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt new file mode 100644 index 00000000..d29ad461 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/GroupUserListActivity.kt @@ -0,0 +1,261 @@ +package com.xscm.modulemain.activity + +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +import com.blankj.utilcode.util.ToastUtils +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.tencent.imsdk.v2.V2TIMCallback +import com.tencent.imsdk.v2.V2TIMGroupManager +import com.tencent.imsdk.v2.V2TIMManager +import com.xscm.modulemain.BaseMvpActivity +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.msg.NewsContacts +import com.xscm.modulemain.activity.msg.NewsPresenter +import com.xscm.modulemain.adapter.GroupUserListAdapter +import com.xscm.modulemain.databinding.ActivityGroupUserListBinding +import com.xscm.moduleutil.bean.CommentBean.CommentDetailsBean +import com.xscm.moduleutil.bean.CommentBean.CommentDetailsBean.Replies +import com.xscm.moduleutil.bean.GroupBean +import com.xscm.moduleutil.bean.GroupUserListBean +import com.xscm.moduleutil.bean.NewsMessageList +import com.xscm.moduleutil.utils.SpUtil + +/** + * @Author qx + * @Time 2026/1/3 11:44 + * @Description 群成员列表 + */ +class GroupUserListActivity : BaseMvpActivity(), + NewsContacts.View { + + val groupUserListAdapter: GroupUserListAdapter by lazy { GroupUserListAdapter() } + val v2TIMGroupManager: V2TIMGroupManager? = V2TIMManager.getGroupManager() + + var groupId: String? = null + var isOwner: Boolean = false + var page: Int = 1 + var search: String = "" + var groupUserBean: List = ArrayList() + + override fun bindPresenter(): NewsPresenter { + return NewsPresenter(this, this) + } + + + override fun doDone() { + super.doDone() + groupId = intent.getStringExtra("groupId").toString() + isOwner = intent.getBooleanExtra("isOwner", false) + } + + override fun initData() { + mBinding?.topBar?.tvTitle?.text = "群聊成员" + mBinding?.recycleView?.layoutManager = + androidx.recyclerview.widget.LinearLayoutManager(this) + mBinding?.recycleView?.adapter = groupUserListAdapter + + groupUserListAdapter.setOnItemClickListener(object : + GroupUserListAdapter.OnItemClickListener { + override fun onItemClick(ismute: Int, item: GroupBean.GroupUserBean?) { + if (ismute == 1) { + v2TIMGroupManager?.muteGroupMember( + groupId, + "u" + item?.user_id.toString(), + 0, + object : + V2TIMCallback { + override fun onSuccess() { + if (item?.is_mute == 1) { + item.is_mute = 0 + } else { + item?.is_mute = 1 + } + groupUserListAdapter.notifyDataSetChanged() + } + + override fun onError(code: Int, desc: String?) { + ToastUtils.showLong(desc) + } + }) + } else { + onCommentLongClick(item) + } + } + }) + + mBinding.tvCancel.setOnClickListener { view -> + search = mBinding.editQuery.text.toString() + MvpPre?.memberList(page.toString(), "10", groupId, search) + } + + + mBinding.smartRefreshLayout.setOnRefreshLoadMoreListener(object : + OnRefreshLoadMoreListener { + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + MvpPre?.memberList(page.toString(), "10", groupId, "") + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + MvpPre?.memberList(page.toString(), "10", groupId, "") + } + }) + + if (isOwner) { + mBinding.llSearch.visibility = View.VISIBLE + } else { + mBinding.llSearch.visibility = View.GONE + } + + MvpPre?.memberList(page.toString(), "10", groupId, "") + } + + override fun getLayoutId(): Int { + return R.layout.activity_group_user_list + } + + fun onCommentLongClick(item: GroupBean.GroupUserBean?) { + val options: Array? = + arrayOf( + "禁言一天", + "禁言五天", + "禁言十天", + "禁言三十天", + "取消" + ) as Array? + + // 创建底部对话框 + val bottomSheetDialog = BottomSheetDialog(this) + val dialogView = getLayoutInflater().inflate( + com.xscm.moduleutil.R.layout.dialog_bottom_sheet_actions, + null + ) + + // 初始化视图 + val container = + dialogView.findViewById(com.xscm.moduleutil.R.id.ll_options_container) + + // 动态添加选项 + for (i in options!!.indices) { + val textView = TextView(this) + textView.setText(options[i]) + textView.setTextSize(16f) + textView.setPadding( + getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_16), + getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_14), + getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_16), + getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_14) + ) + + // 设置点击效果 + textView.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_bottom_sheet_item) + val optionIndex = i + textView.setOnClickListener(View.OnClickListener { v: View? -> + handleOptionClick(optionIndex, item) + bottomSheetDialog.dismiss() + }) + container.addView(textView) + + // 添加分割线(除了最后一个) + if (i < options.size - 1) { + val divider = View(this) + divider.setBackgroundColor( + ContextCompat.getColor( + this, + com.xscm.moduleutil.R.color.color_FFEEEEEE + ) + ) + val params = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_1) + ) + divider.setLayoutParams(params) + container.addView(divider) + } + } + + bottomSheetDialog.setContentView(dialogView) + bottomSheetDialog.show() + } + + private fun handleOptionClick( + optionIndex: Int, + item: GroupBean.GroupUserBean?, + ) { + var seconds: Int = 0 + when (optionIndex) { + 0 -> + seconds = 86400 + + 1 -> + seconds = 432000 + + 2 -> + seconds = 864000 + + 3 -> + seconds = 2592000 + + 4 -> + seconds = 0 + } + v2TIMGroupManager?.muteGroupMember( + groupId, + "u" + item?.user_id.toString(), + seconds, + object : + V2TIMCallback { + override fun onSuccess() { + if (item?.is_mute == 1) { + item?.is_mute = 0 + } else { + item?.is_mute = 1 + } + groupUserListAdapter.notifyDataSetChanged() + } + + override fun onError(code: Int, desc: String?) { + ToastUtils.showLong(desc) + } + }) + } + + + override fun showNews(newsList: List?) { + } + + override fun finishRefresh() { + } + + override fun postInvite() { + } + + override fun getGuildInfo(groupBean: GroupBean?) { + } + + override fun setGuildInfo(s: String?) { + } + + override fun memberList(groupUserListBean: GroupUserListBean?) { + mBinding.smartRefreshLayout.finishRefresh() + mBinding.smartRefreshLayout.finishLoadMore() + if (groupUserListBean == null) { + return + } + groupUserBean = groupUserListBean.list!! + groupUserListAdapter.updateOwnerStatus(isOwner) + if (page == 1) { + + groupUserListAdapter.setNewData(groupUserBean) + } else { + groupUserListAdapter.addData(groupUserBean) + } + } +} + diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/main/activity/MainActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/main/activity/MainActivity.java index 36324133..3967cc09 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/main/activity/MainActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/main/activity/MainActivity.java @@ -726,12 +726,13 @@ public class MainActivity extends BaseMvpActivity getCurrentVersionCode(this)) { + String apkName="yusheng"+appUpdateModel.getCode()+".apk"; // 1. 禁止屏幕自动息屏(核心逻辑) keepScreenOn(true); // 初始化DownloadManager(注意:需确保DownloadManager类的包名正确) manager = new DownloadManager.Builder(this) .apkUrl(appUpdateModel.getUrl()) - .apkName("yusheng.apk") + .apkName(apkName) .smallIcon(R.mipmap.ic_launcher_foreground) .showNewerToast(false) .apkVersionCode(appUpdateModel.getCode()) diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java index 116c406a..af8d65a7 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsContacts.java @@ -4,6 +4,8 @@ import android.app.Activity; import com.xscm.moduleutil.activity.IPresenter; import com.xscm.moduleutil.activity.IView; +import com.xscm.moduleutil.bean.GroupBean; +import com.xscm.moduleutil.bean.GroupUserListBean; import com.xscm.moduleutil.bean.NewsMessageList; import java.util.List; @@ -14,12 +16,23 @@ public class NewsContacts { void finishRefresh(); void postInvite(); + + void getGuildInfo(GroupBean groupBean); + void setGuildInfo(String s); + + void memberList(GroupUserListBean groupUserListBean); } public interface IHomePre extends IPresenter { void getMessagetitle(String type,String page,String pageLimit); void postInvite(String apply_id, String type); + + void getGuildInfo(String guild_id); + + void setGuildInfo(String groupId,String name,String notice,String avatar); + + void memberList(String page,String pageLimit, String guild_id,String search); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java index 43862a8f..0b906cf7 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/NewsPresenter.java @@ -2,6 +2,8 @@ package com.xscm.modulemain.activity.msg; import android.content.Context; +import com.xscm.moduleutil.bean.GroupBean; +import com.xscm.moduleutil.bean.GroupUserListBean; import com.xscm.moduleutil.bean.NewsMessageList; import com.xscm.moduleutil.http.BaseObserver; import com.xscm.moduleutil.http.RetrofitClient; @@ -58,4 +60,61 @@ public class NewsPresenter extends BasePresenter implements N } }); } + + @Override + public void getGuildInfo(String guild_id) { + api.getGuildInfo(guild_id, new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(GroupBean groupBean) { + if (MvpRef==null){ + MvpRef=new WeakReference<>(mView); + } + MvpRef.get().getGuildInfo(groupBean); + } + }); + } + + @Override + public void setGuildInfo(String groupId, String name, String notice, String avatar) { + api.setGuildInfo(groupId, name, notice, avatar, new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(String s) { + if (MvpRef==null){ + MvpRef=new WeakReference<>(mView); + } + MvpRef.get().setGuildInfo(s); + } + }); + } + + @Override + public void memberList(String page, String pageLimit, String guild_id, String search) { + api.memberList(page, pageLimit, guild_id, search, new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(GroupUserListBean groupUserListBean) { + if (MvpRef==null){ + MvpRef=new WeakReference<>(mView); + } + MvpRef.get().memberList(groupUserListBean); + } + }); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java index 756889e1..09326fee 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/msg/OfficialNoticeActivity.java @@ -19,6 +19,8 @@ import com.xscm.modulemain.R; import com.xscm.modulemain.databinding.ActivityOfficialNoticeBinding; import com.xscm.modulemain.manager.RoomManager; import com.xscm.modulemain.activity.WebViewActivity; +import com.xscm.moduleutil.bean.GroupBean; +import com.xscm.moduleutil.bean.GroupUserListBean; import com.xscm.moduleutil.bean.NewsMessageList; import com.xscm.moduleutil.utils.ImageUtils; import com.xscm.moduleutil.utils.TimeUtils; @@ -66,7 +68,7 @@ public class OfficialNoticeActivity extends BaseMvpActivity bannerModels) { + + } + + @Override + public void getPersonaltyListBean(List personaltyListBeans) { + + } + private void refreshCurrentGiftFragment(String id,int position) { if (getCurrentGiftFragment()!=null){ getCurrentGiftFragment().loadDataIfNeeded(Integer.parseInt(id), position); diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PropMallActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PropMallActivity.kt new file mode 100644 index 00000000..77f64114 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/PropMallActivity.kt @@ -0,0 +1,179 @@ +package com.xscm.modulemain.activity.user.activity + +import android.content.Intent +import android.graphics.Color +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator +import com.stx.xhb.xbanner.XBanner +import com.stx.xhb.xbanner.XBanner.XBannerAdapter +import com.xscm.modulemain.BaseMvpActivity +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.WebViewActivity +import com.xscm.modulemain.activity.user.activity.ui.main.PlaceholderFragment +import com.xscm.modulemain.activity.user.activity.ui.main.SectionsPagerAdapter +import com.xscm.modulemain.activity.user.conacts.PersonalityConacts +import com.xscm.modulemain.activity.user.presenter.PersonalityPresenter +import com.xscm.modulemain.databinding.ActivityPropMallBinding +import com.xscm.moduleutil.bean.BannerModel +import com.xscm.moduleutil.bean.PersonaltyBean +import com.xscm.moduleutil.bean.PersonaltyListBean +import com.xscm.moduleutil.utils.ColorManager +import com.xscm.moduleutil.utils.ImageUtils + +/** +* @Author qx +* @Time 2026/1/3 17:08 +* @Description 道具商城 +*/ +class PropMallActivity : BaseMvpActivity(), PersonalityConacts.View { + + private lateinit var sectionsPagerAdapter: SectionsPagerAdapter + + override fun bindPresenter(): PersonalityPresenter { + return PersonalityPresenter(this,this) + } + + + override fun initData() { + // 加载道具商城数据 + + mBinding.topBar.tvTitle.text="道具商城" + MvpPre.getBanners("7") + MvpPre.getPersonaltyList() + + mBinding.banner.loadImage(object : XBannerAdapter { + override fun loadBanner(banner: XBanner?, model: Any?, view: View?, position: Int) { + val bannerModel = model as BannerModel + ImageUtils.loadCenterCrop( + bannerModel.getXBannerUrl() as String?, + view as ImageView? + ) + } + }) + + mBinding.banner.setOnItemClickListener(object : XBanner.OnItemClickListener { + override fun onItemClick(banner: XBanner?, model: Any?, view: View?, position: Int) { + /** + * type=1时,该值表示房间id;type=2时,表示文章id + */ + val bannerModel = model as BannerModel + val intent = Intent(this@PropMallActivity, WebViewActivity::class.java) + intent.putExtra("url", bannerModel.getUrl()) + intent.putExtra("title", "商城横幅") + startActivity(intent) + } + }) + } + + override fun getLayoutId(): Int { + return R.layout.activity_prop_mall + } + + + override fun getPersonaltyList(personaltyBean: List?) { + + sectionsPagerAdapter = SectionsPagerAdapter( this, + personaltyBean as List + ) + mBinding.viewPager.adapter = sectionsPagerAdapter + // 创建适配器 + mBinding.slidingTabLayout.setSelectedTabIndicatorColor( + ColorManager.getInstance().getPrimaryColorInt() + ) + if (!personaltyBean.isEmpty()) mBinding.viewPager.setOffscreenPageLimit(personaltyBean.size - 1) + + // 设置 TabLayout 与 ViewPager2 的关联 + TabLayoutMediator( + mBinding.slidingTabLayout, mBinding.viewPager, + TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab?, position: Int -> + // 边界检查 + if (position >= 0 && position < personaltyBean.size && personaltyBean.get(position) != null) { + // 创建自定义布局 + val customView = LayoutInflater.from(this) + .inflate(R.layout.custom_tab_layout, null) + val textView = customView.findViewById(R.id.tab_text) + textView.setText(personaltyBean.get(position).name) + + // 设置初始状态 + if (position == 0) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f) + textView.setTextColor(getResources().getColor(android.R.color.black)) + } else { + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f) + textView.setTextColor(Color.parseColor("#999999")) + } + + tab!!.setCustomView(customView) + } + } + ).attach() + + mBinding.slidingTabLayout.addOnTabSelectedListener(object : + TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + val position = tab.getPosition() + // 边界检查 + if (position >= 0 && position < personaltyBean.size) { + val customView = tab.getCustomView() + if (customView != null) { + val textView = customView.findViewById(R.id.tab_text) + if (textView != null) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f) + textView.setTextColor(getResources().getColor(android.R.color.black)) + } + } + + } + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + // 直接通过 TabLayout 设置未选中状态的文字大小 + val customView = tab.getCustomView() + if (customView != null) { + val textView = customView.findViewById(R.id.tab_text) + if (textView != null) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f) + textView.setTextColor(Color.parseColor("#999999")) + } + customView.setBackgroundResource(com.xscm.moduleutil.R.drawable.tab_unselected_background) + } + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + } + }) + + // 初始加载第一个tab的数据 + mBinding.viewPager.post { + val firstFragment = sectionsPagerAdapter.getFragment(0) + if (firstFragment is PlaceholderFragment) { + firstFragment.loadDataIfNeeded() + } + } + + // 添加ViewPager2页面切换监听,实现按需加载数据 + mBinding.viewPager.registerOnPageChangeCallback(object : androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + // 通知当前选中的Fragment加载数据 + val fragment = sectionsPagerAdapter.getFragment(position) + if (fragment is PlaceholderFragment) { + fragment.loadDataIfNeeded() + } + } + }) + } + + override fun setBanners(bannerModels: List?) { + mBinding.banner.setBannerData(R.layout.index_image_banner, bannerModels!!) + } + + override fun getPersonaltyListBean(personaltyListBeans: List?) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/PersonaltyAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/PersonaltyAdapter.kt new file mode 100644 index 00000000..c88d07b5 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/PersonaltyAdapter.kt @@ -0,0 +1,54 @@ +package com.xscm.modulemain.activity.user.activity.ui.main + +import android.graphics.Paint +import android.text.TextUtils +import android.widget.TextView +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.xscm.modulemain.R +import com.xscm.modulemain.adapter.GroupUserListAdapter +import com.xscm.moduleutil.bean.GroupBean +import com.xscm.moduleutil.bean.PersonaltyListBean +import com.xscm.moduleutil.utils.ImageUtils + +/** +* @Author qx +* @Time 2026/1/3 19:17 +* @Description 商城展示适配器 +*/ +class PersonaltyAdapter : + BaseQuickAdapter(R.layout.item_personalty) { + interface OnItemClickListener { + fun onItemClick( item: PersonaltyListBean?) + } + + private var onItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(listener: OnItemClickListener?) { + this.onItemClickListener = listener + } + + override fun convert( + helper: BaseViewHolder, + item: PersonaltyListBean? + ) { + helper.setText(R.id.tv_name_period, item?.title) + helper.setText(R.id.discount,item?.price.toString()) + helper.setText(R.id.original_price, item?.original_price.toString()) + helper.getView(R.id.original_price).paintFlags= Paint.STRIKE_THRU_TEXT_FLAG + ImageUtils.loadHead(item?.base_image,helper.getView(R.id.iv_img)) + if (TextUtils.isEmpty(item?.discount_str)){ + helper.getView(R.id.discount_str).visibility=TextView.GONE + }else{ + helper.getView(R.id.discount_str).visibility=TextView.VISIBLE + } + helper.setText(R.id.discount_str,item?.discount_str) + + helper.itemView.setOnClickListener { + if (onItemClickListener != null) { + onItemClickListener?.onItemClick( item) + } + } + } + +} diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/PlaceholderFragment.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/PlaceholderFragment.kt new file mode 100644 index 00000000..a3842861 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/PlaceholderFragment.kt @@ -0,0 +1,112 @@ +package com.xscm.modulemain.activity.user.activity.ui.main + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import com.stx.xhb.xbanner.XBanner +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.user.conacts.PersonalityConacts +import com.xscm.modulemain.activity.user.presenter.PersonalityPresenter +import com.xscm.modulemain.databinding.FragmentPropMallBinding +import com.xscm.moduleutil.base.BaseMvpFragment +import com.xscm.moduleutil.bean.BannerModel +import com.xscm.moduleutil.bean.PersonaltyBean +import com.xscm.moduleutil.bean.PersonaltyListBean + +/** +* @Author qx +* @Time 2026/1/3 17:57 +* @Description 道具商城的fragemnt +*/ +class PlaceholderFragment : BaseMvpFragment(), + PersonalityConacts.View { + + private lateinit var personaltyAdapter: PersonaltyAdapter + + var type: String ="" + + // 标记数据是否已加载 + private var isDataLoaded = false + + + override fun bindPresenter(): PersonalityPresenter? { + return PersonalityPresenter(this,activity) + } + + companion object { + /** + * The fragment argument representing the section number for this + * fragment. + */ + private const val ARG_SECTION_NUMBER = "0" + + /** + * Returns a new instance of this fragment for the given section + * number. + */ + @JvmStatic + fun newInstance(sectionNumber: Int): PlaceholderFragment { + return PlaceholderFragment().apply { + arguments = Bundle().apply { + putInt(ARG_SECTION_NUMBER, sectionNumber) + } + } + } + } + + override fun onAttach(context: Context) { + super.onAttach(context) + type= arguments?.getInt(ARG_SECTION_NUMBER).toString() + } + + override fun initData() { + // 不再自动加载数据,改为按需加载 + // MvpPre.getPersonaltyListBean(type) + } + + /** + * 按需加载数据 + * 只有在需要时且数据未加载时才加载 + */ + fun loadDataIfNeeded() { + if (!isDataLoaded ) { + MvpPre.getPersonaltyListBean(type) + isDataLoaded = true + } + } + + override fun initView() { + mBinding.recyclerView.layoutManager = GridLayoutManager(context, 3) + personaltyAdapter = PersonaltyAdapter() + mBinding.recyclerView.adapter = personaltyAdapter + + personaltyAdapter.setOnItemClickListener(object : PersonaltyAdapter.OnItemClickListener{ + override fun onItemClick(item: PersonaltyListBean?) { + + } + }); + + } + + override fun getLayoutId(): Int { + return R.layout.fragment_prop_mall + } + + override fun getPersonaltyList(personaltyBean: List?) { + // 隐藏加载进度 + } + + override fun setBanners(bannerModels: List?) { + } + + override fun getPersonaltyListBean(personaltyListBeans: List?) { + personaltyAdapter.setNewData(personaltyListBeans) + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/SectionsPagerAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/SectionsPagerAdapter.kt new file mode 100644 index 00000000..66af4ba2 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/SectionsPagerAdapter.kt @@ -0,0 +1,67 @@ +package com.xscm.modulemain.activity.user.activity.ui.main + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.blankj.utilcode.util.ActivityUtils +import com.xscm.modulemain.activity.user.activity.PropMallActivity +import com.xscm.moduleutil.bean.PersonaltyBean + + +/** + * 道具商城的FragmentStateAdapter + * 用于ViewPager2展示不同类型的道具商城页面 + */ +class SectionsPagerAdapter( + fragmentActivity: FragmentActivity, + private val personalityList: List, +) : FragmentStateAdapter(fragmentActivity) { + + /** + * 获取页面总数 + * @return 页面数量 + */ + override fun getItemCount(): Int = personalityList.size + + /** + * 创建指定位置的Fragment + * @param position Fragment位置 + * @return 对应的Fragment实例 + */ + override fun createFragment(position: Int): Fragment { + val personality = personalityList[position] + return PlaceholderFragment.newInstance( + sectionNumber =personality.id.toInt(), + ) + } + + /** + * 获取指定位置的标题 + * @param position 位置索引 + * @return 标题文本 + */ + fun getPageTitle(position: Int): String? { + return if (position >= 0 && position < personalityList.size) { + personalityList[position].name + } else { + null + } + } + + /** + * 获取指定位置的Fragment + * @param position Fragment位置 + * @return 对应的Fragment实例 + */ + fun getFragment(position: Int): Fragment? { + try { + // 通过反射获取Fragment实例 + val fragmentManager = (ActivityUtils.getTopActivity() as PropMallActivity).supportFragmentManager + val fragment = fragmentManager.findFragmentByTag("f" + getItemId(position)) + return fragment + } catch (e: Exception) { + e.printStackTrace() + } + return null + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/PersonalityConacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/PersonalityConacts.java index 0b0e8fea..079ab62a 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/PersonalityConacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/PersonalityConacts.java @@ -4,16 +4,23 @@ import android.app.Activity; import com.xscm.moduleutil.activity.IPresenter; import com.xscm.moduleutil.activity.IView; +import com.xscm.moduleutil.bean.BannerModel; import com.xscm.moduleutil.bean.PersonaltyBean; +import com.xscm.moduleutil.bean.PersonaltyListBean; import java.util.List; public class PersonalityConacts { public interface View extends IView { void getPersonaltyList(List personaltyBean); + void setBanners(List bannerModels); + + void getPersonaltyListBean(List personaltyListBeans); } public interface IMePre extends IPresenter { void getPersonaltyList(); + + void getPersonaltyListBean(String type); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java index c946e761..37887a99 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/VocalRangeFragment.java @@ -28,6 +28,7 @@ import com.xscm.modulemain.R; import com.xscm.modulemain.activity.user.activity.BosomFriendActivity; import com.xscm.modulemain.activity.user.activity.GiftWallActivity; import com.xscm.modulemain.activity.user.activity.NobleTitleActivity; +import com.xscm.modulemain.activity.user.activity.PropMallActivity; import com.xscm.modulemain.activity.user.activity.RechargeActivity; import com.xscm.modulemain.activity.user.activity.SingerVerificationActivity; import com.xscm.modulemain.activity.user.activity.UserFamilyActivity; @@ -232,11 +233,13 @@ public class VocalRangeFragment extends BaseMvpFragment implements PersonalityConacts.IMePre{ +public class PersonalityPresenter extends BasePresenter implements PersonalityConacts.IMePre { + PersonalityConacts.View mView; + public PersonalityPresenter(PersonalityConacts.View view, Context context) { super(view, context); + mView = view; } @Override @@ -30,4 +38,44 @@ public class PersonalityPresenter extends BasePresenter } }); } + + @Override + public void getPersonaltyListBean(String type) { + api.getPersonaltyListBean(type, new BaseObserver>() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(List personaltyListBeans) { + if (MvpRef == null) { + MvpRef = new WeakReference<>(mView); + } + MvpRef.get().getPersonaltyListBean(personaltyListBeans); + } + }); + } + + public void getBanners(String s) { +// Type listType = new TypeToken>() {}.getType(); +// List restoredRoomModels = GsonUtils.getGSON().fromJson(SpUtils.getHomeBanner(), listType); +// MvpRef.get().setBanners(restoredRoomModels); + RetrofitClient.getInstance().getBanners(s, new BaseObserver>() { + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(List bannerModels) { + if (MvpRef == null) { + MvpRef = new WeakReference<>(mView); + } + MvpRef.get().setBanners(bannerModels); + } + + }); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupAdapter.kt new file mode 100644 index 00000000..3fc15bef --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupAdapter.kt @@ -0,0 +1,23 @@ +package com.xscm.modulemain.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.xscm.modulemain.R +import com.xscm.moduleutil.bean.GroupBean +import com.xscm.moduleutil.utils.ImageUtils + +/** + * 项目名称:羽声语音 + * 时间:2026/1/3 10:58 + * 用途:群聊设置中的用户展示 + */ +class GroupAdapter : BaseQuickAdapter(R.layout.item_group_member) { + + override fun convert( + helper: BaseViewHolder, + item: GroupBean.GroupUserBean? + ) { + helper.setText(R.id.tv_group_name, item?.nickname) + ImageUtils.loadHead(item?.avatar, helper.getView(R.id.im_group)) + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt new file mode 100644 index 00000000..fe0e1402 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/GroupUserListAdapter.kt @@ -0,0 +1,71 @@ +package com.xscm.modulemain.adapter + +import android.graphics.Color +import android.widget.TextView +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.xscm.modulemain.R +import com.xscm.moduleutil.bean.BlackUserBean +import com.xscm.moduleutil.bean.GroupBean +import com.xscm.moduleutil.color.ThemeableDrawableUtils +import com.xscm.moduleutil.utils.MeHeadView + +/** + * 项目名称:羽声语音 + * 时间:2026/1/3 14:17 + * 用途: + */ +class GroupUserListAdapter : BaseQuickAdapter(R.layout.item_group_user) { + interface OnItemClickListener { + fun onItemClick(ismute: Int, item: GroupBean.GroupUserBean?) + } + + + + private var onItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(listener: OnItemClickListener?) { + this.onItemClickListener = listener + } + var isOwner = false + var ismute: Int = 0 + + // 在适配器中添加设置方法 + fun updateOwnerStatus(isOwner: Boolean) { + this.isOwner = isOwner + notifyDataSetChanged() // 如果需要刷新视图 + } + + + override fun convert( + helper: BaseViewHolder, + item: GroupBean.GroupUserBean? + ) { + helper.getView(R.id.im_user).setData(item?.avatar, "","") + helper.setText(R.id.tv_nick_name, item?.nickname) + + if (isOwner){ + helper.setVisible(R.id.im_g, true) + ThemeableDrawableUtils.setThemeableRoundedBackground( + helper.getView(R.id.im_g), + Color.parseColor("#333333"), + 34 + ) + helper.getView(R.id.im_g).setTextColor(Color.WHITE) + if (item?.is_mute==1){ + helper.getView(R.id.im_g).text = "解禁" + ismute=1 + }else{ + helper.getView(R.id.im_g).text = "禁言" + ismute=0 + } + helper.getView(R.id.im_g).setOnClickListener { + if (onItemClickListener != null) { + onItemClickListener?.onItemClick(ismute,item) + } + } + }else{ + helper.setVisible(R.id.im_g, false) + } + } +} \ No newline at end of file diff --git a/MainModule/src/main/res/layout/activity_group_chat_settings.xml b/MainModule/src/main/res/layout/activity_group_chat_settings.xml new file mode 100644 index 00000000..e14671b0 --- /dev/null +++ b/MainModule/src/main/res/layout/activity_group_chat_settings.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/activity_group_user_list.xml b/MainModule/src/main/res/layout/activity_group_user_list.xml new file mode 100644 index 00000000..3e122bd4 --- /dev/null +++ b/MainModule/src/main/res/layout/activity_group_user_list.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/activity_prop_mall.xml b/MainModule/src/main/res/layout/activity_prop_mall.xml new file mode 100644 index 00000000..d8c3806d --- /dev/null +++ b/MainModule/src/main/res/layout/activity_prop_mall.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/fragment_news.xml b/MainModule/src/main/res/layout/fragment_news.xml index e8af00fe..adf49e33 100644 --- a/MainModule/src/main/res/layout/fragment_news.xml +++ b/MainModule/src/main/res/layout/fragment_news.xml @@ -50,7 +50,7 @@ android:layout_marginStart="@dimen/dp_16" android:layout_marginTop="@dimen/dp_12" android:layout_marginEnd="@dimen/dp_16" - android:visibility="gone"> + > + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_group_member.xml b/MainModule/src/main/res/layout/item_group_member.xml new file mode 100644 index 00000000..404a1cb8 --- /dev/null +++ b/MainModule/src/main/res/layout/item_group_member.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_group_user.xml b/MainModule/src/main/res/layout/item_group_user.xml new file mode 100644 index 00000000..84b13d3f --- /dev/null +++ b/MainModule/src/main/res/layout/item_group_user.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_my_bag.xml b/MainModule/src/main/res/layout/item_my_bag.xml index 72702c88..1463b9e7 100644 --- a/MainModule/src/main/res/layout/item_my_bag.xml +++ b/MainModule/src/main/res/layout/item_my_bag.xml @@ -69,7 +69,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" android:gravity="center" - android:text="x30" + tools:text="x30" android:textColor="@color/color_FF333333" android:textSize="@dimen/sp_10" /> diff --git a/MainModule/src/main/res/layout/item_personalty.xml b/MainModule/src/main/res/layout/item_personalty.xml new file mode 100644 index 00000000..1e204461 --- /dev/null +++ b/MainModule/src/main/res/layout/item_personalty.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_zhuangbanschangcheng_list.xml b/MainModule/src/main/res/layout/item_zhuangbanschangcheng_list.xml index 2ec7c019..33601c8e 100644 --- a/MainModule/src/main/res/layout/item_zhuangbanschangcheng_list.xml +++ b/MainModule/src/main/res/layout/item_zhuangbanschangcheng_list.xml @@ -51,7 +51,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" android:gravity="center" - android:text="x30" + tools:text="x30" android:textColor="@color/color_FF333333" android:textSize="@dimen/sp_10" /> diff --git a/MainModule/src/main/res/values/strings.xml b/MainModule/src/main/res/values/strings.xml index 1b4e46c4..eb5720f2 100644 --- a/MainModule/src/main/res/values/strings.xml +++ b/MainModule/src/main/res/values/strings.xml @@ -5,4 +5,7 @@ 我的 Hello blank fragment + PropMallActivity + Tab 1 + Tab 2 \ No newline at end of file diff --git a/MainModule/src/main/res/values/themes.xml b/MainModule/src/main/res/values/themes.xml new file mode 100644 index 00000000..d907dd54 --- /dev/null +++ b/MainModule/src/main/res/values/themes.xml @@ -0,0 +1,11 @@ + + + + +