diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationBean.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationBean.kt new file mode 100644 index 00000000..26c361f7 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationBean.kt @@ -0,0 +1,73 @@ +package com.xscm.moduleutil.bean + +import com.chad.library.adapter.base.entity.MultiItemEntity +import lombok.Data +import java.util.ArrayList + +/** + * 项目名称:羽声语音 + * 时间:2025/11/20 15:13 + * 用途:心动空间中的关系实体 + */ +@Data +class RelationBean : MultiItemEntity { + + var cp: UserInfo.CpInfo = UserInfo.CpInfo() + var no_cp: List = ArrayList() + override fun getItemType(): Int { + + // 情况3:no_cp集合,relation_name不等于"",并且relation_list的大小是1 + if (no_cp.isNotEmpty() && no_cp[0].relation_name.isNotEmpty() && no_cp[0].relation_list.size == 1) { + return 3 + } + + // 情况4:no_cp集合,relation_list的大小是1 + if (no_cp.isNotEmpty() && no_cp[0].relation_list.size == 1) { + return 4 + } + + if (no_cp.isNotEmpty() && no_cp[0].relation_name.isNotEmpty() && no_cp[0].relation_list.size > 1){ + return 5 + } + + // 其他情况返回5 + return 6 + } + + class NoCpBean : MultiItemEntity{ + var relation_name: String = "" + var relation_list: List = ArrayList() + override fun getItemType(): Int { + return 0 + } + +} + + + /*"cp": [ + { + "relation_name": "string", + "relation_list": [ + { + "nickname1": "string", + "avatar1": "string", + "user_id1": "string" + } + ] + } + ], + "no_cp": [ + { + "relation_name": "string", + "relation_list": [ + { + "user_info1": {}, + "user_info2": "string", + "level": "string", + "exp": "string" + } + ] + } + ] +}*/ +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationshipBean.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationshipBean.java index 47d1c410..574708d4 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationshipBean.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RelationshipBean.java @@ -1,5 +1,7 @@ package com.xscm.moduleutil.bean; +import com.chad.library.adapter.base.entity.MultiItemEntity; + import java.io.Serializable; import lombok.Data; @@ -10,7 +12,7 @@ import lombok.Data; * @description: 关系信息 */ @Data -public class RelationshipBean implements Serializable { +public class RelationshipBean implements Serializable, MultiItemEntity { private int relation_id;//关系id 3, @@ -31,4 +33,11 @@ public class RelationshipBean implements Serializable { private int heart_value;// 0, private int is_top;// 0 private int type;// 1,亲密;2:真爱 + private int sex1;//1:女 2:男 + private int sex2;// + + @Override + public int getItemType() { + return 0; + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserInfo.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserInfo.java index 4d117868..85e8925c 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserInfo.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserInfo.java @@ -1,5 +1,6 @@ package com.xscm.moduleutil.bean; +import com.chad.library.adapter.base.entity.MultiItemEntity; import com.google.gson.annotations.SerializedName; import com.xscm.moduleutil.BaseEvent; import com.xscm.moduleutil.bean.room.FriendInfo; @@ -11,9 +12,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** - *@author qx - *@data 2025/6/3 - *@description: 个人信息,点击我的获取 + * @author qx + * @data 2025/6/3 + * @description: 个人信息,点击我的获取 */ @EqualsAndHashCode(callSuper = true) @Data @@ -38,7 +39,7 @@ public class UserInfo extends BaseEvent implements Serializable { private int is_in_pit;//是否在麦上,1在0不在 private int is_open_live_remind;//是否设置开播提醒 private String birthday;//生日 - private String profile;//简介 + private String profile = "";//简介 private String home_bgimages;//背景图片 private int is_follow;//是否关注 private List tag_list; @@ -76,46 +77,64 @@ public class UserInfo extends BaseEvent implements Serializable { private String nickname_color = "";//昵称颜色 private String mic_cycle;//麦圈 private String is_hide;//0不能设置,1:可以设置 - private String hide_status;//0-取消隐身,1-设置隐身 + private String hide_status;//0-取消隐身,1-设置隐身 private String enter_image;//爵位飘屏的背景 private String enter_text;//爵位飘屏的文字 private int singer_status;//歌手认证状态0-待审核,1-通过,2-拒绝 -1:未认证 private int singer_level;//歌手等级 - private CpInfo cp_info ; + private CpInfo cp_info; - /*"cp_info": { - "name": "string", - "user_id1": "string", - "user_id2": "string", - "level": "string", - "exp": "string", - "pendant": "string", - "direction": "string", + /*"cp_info": { + "name": "string", + "user_id1": "string", + "user_id2": "string", + "level": "string", + "exp": "string", + "pendant": "string", + "direction": "string", - }*/ - public static class CpInfo implements Serializable{ - public String name; - public String level; - public String exp; - public String pendant; - public String direction; - public UserInfo1 user_info1; - public UserInfo2 user_info2; + }*/ - public static class UserInfo1 implements Serializable{ + @Data + public static class CpInfo implements Serializable, MultiItemEntity { + private int id; + private int user_id1; + private int user_id2; + private int status; + + private long createtime; + + public String name; + public String level; + public String exp; + public String pendant; + public String direction; + public UserInfo1 user_info1; + public UserInfo2 user_info2; + + @Override + public int getItemType() { + if(!name.isEmpty()) { + return 1; + } + return 2; + } + + @Data + public static class UserInfo1 implements Serializable { public String user_id; public String nickname; public String avatar; public String dress; } - - public static class UserInfo2 implements Serializable{ - public String user_id; - public String nickname; - public String avatar; - public String dress; + @Data + public static class UserInfo2 implements Serializable { + public String user_id; + public String nickname; + public String avatar; + public String dress; } /*"user_info1": { "user_id": "string", @@ -138,13 +157,14 @@ public class UserInfo extends BaseEvent implements Serializable { // private String tag_name; // } @Data - public static class GiftWall implements Serializable{ + public static class GiftWall implements Serializable { private String gift_name; private String total; private List send_user_info; + @Data - public static class SendUserInfo implements Serializable{ + public static class SendUserInfo implements Serializable { private String nickname; private String avatar; } 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 9103d2c4..030a920b 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -385,6 +385,10 @@ public interface ApiServer { Call> commentZone(@Field("id") String id, @Field("content") String content, @Field("pid") String pid, @Field("reply_to") String reply_to); + @FormUrlEncoded + @POST(Constants.POST_FRIEND_LIST) + Call> getFriendList(@Field("user_id") String user_id, @Field("page") String page, @Field("page_limit") String page_limit); + @GET(Constants.GET_MY_CP_ROOM_LIST) Call>> myCpRoom(); @@ -754,6 +758,10 @@ public interface ApiServer { @POST(Constants.POST_QUIT_ROOM) Call quitRoom(@Field("room_id") String room_id, @Field("user_id") String user_id); + @FormUrlEncoded + @POST(Constants.POST_FRIEND_LIST_MORE) + Call>> getFriendListMore(@Field("user_id") String user_id, @Field("relation_id") String relation_id); + @FormUrlEncoded @POST(Constants.POST_RELATION_CARD) Call> relationCard(@Field("user_id") String user_id); 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 b457a74c..9a477f1e 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -3595,6 +3595,35 @@ public class RetrofitClient { }); } + public void getFriendListMore(String user_id,String relation_id,BaseObserver> observer){ + sApiServer.getFriendListMore(user_id,relation_id).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){ + try { + ToastUtils.showShort(baseModel.getMsg()); + CommonAppContext.getInstance().clearLoginInfo(); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + }else { + ToastUtils.showShort(baseModel.getMsg()); + } + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + LogUtils.e("getFriendListMore",t.toString()); + } + }); + } + public void checkTxt(String room_name, String room_cover, String room_intro, BaseObserver observer) { sApiServer.checkTxt(room_name, room_cover, room_intro).enqueue(new Callback() { @@ -3712,8 +3741,7 @@ public class RetrofitClient { }); } - public void commentZone(String id, String content, String pid, String - reply_to, BaseObserver observer) { + public void commentZone(String id, String content, String pid, String reply_to, BaseObserver observer) { sApiServer.commentZone(id, content, pid, reply_to).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { @@ -3727,6 +3755,34 @@ public class RetrofitClient { }); } + public void getFriendList(String userId,String page,String page_limit,BaseObserver observer) { + sApiServer.getFriendList(userId, page, page_limit).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()==301){ + try { + ToastUtils.showShort(body.getMsg()); + CommonAppContext.getInstance().clearLoginInfo(); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + }else { + ToastUtils.showShort(body.getMsg()); + } + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("getFriendList",t.fillInStackTrace()); + } + }); + } + public void clearLoginInfo(BaseObserver observer) { sApiServer.clearLoginInfo(SpUtil.getToken()).enqueue(new Callback>() { diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/MeHeadView.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/MeHeadView.java index 9b80bbcb..258bff87 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/MeHeadView.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/MeHeadView.java @@ -72,4 +72,12 @@ public class MeHeadView extends ConstraintLayout { mIvOnline.setVisibility(VISIBLE); mIvOnline.setImageResource(isOnline ? R.mipmap.me_online_icon : R.mipmap.me_icon_unchecked); } + + public void setSex(int sex,String headPicture) { + if (!TextUtils.isEmpty(headPicture)) { + ImageUtils.loadHead(headPicture, mRiv); + } + mIvSex.setVisibility(VISIBLE); + mIvSex.setImageResource(sex == 1 ? R.mipmap.nan : R.mipmap.nv); + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/TimeUtils.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/TimeUtils.java index 38ce26c6..7db0690a 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/TimeUtils.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/TimeUtils.java @@ -237,4 +237,25 @@ public class TimeUtils { return sb.toString().trim(); } + + /** + * 格式化时长(毫秒),只返回天数部分。 + * 例如:输入 90000000 (90,000秒,即1天多),返回 "1天" + * + * @param durationMs 时长,单位为毫秒 + * @return 格式化后的天数字符串,如 "1天",如果不足一天则返回空字符串 "" + */ + public static String formatDurationDaysOnly(long durationMs) { + long totalSeconds = durationMs / 1000; + long days = totalSeconds / 86400; + + // 如果天数大于0,则构建返回字符串 + if (days > 0) { + return days + "天"; + } + + // 如果天数不足1天,根据需求可以返回空字符串,也可以返回 "0天" 或其他 + return ""; // 或者 return "0天"; + } + } 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 53368400..98e5fa99 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -422,6 +422,8 @@ public class Constants { public static final String POST_SINGER_ADD_SONG = "/api/SingerSong/singerAddSong";//歌手添加歌曲 public static final String POST_SINGER_DELETE_SONG = "/api/SingerSong/singerDelSong";//歌手删除 歌曲 public static final String POST_SINGER_UPDATE_SONG = "/api/SingerSong/singerEditSong";//歌手修改歌曲 + public static final String POST_FRIEND_LIST = "/api/User/get_friend_list";//挚友列表 + public static final String POST_FRIEND_LIST_MORE = "/api/User/get_friend_list_more";//挚友列表查看更多 public static final String POST_SEND_LOG = "api/Report/android_log_report";//上传log信息 diff --git a/BaseModule/src/main/res/drawable/bg_r48_ff8acc.xml b/BaseModule/src/main/res/drawable/bg_r48_ff8acc.xml new file mode 100644 index 00000000..5631624c --- /dev/null +++ b/BaseModule/src/main/res/drawable/bg_r48_ff8acc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/BaseModule/src/main/res/layout/me_view_decoration_head.xml b/BaseModule/src/main/res/layout/me_view_decoration_head.xml index 6fb3583e..20563f59 100644 --- a/BaseModule/src/main/res/layout/me_view_decoration_head.xml +++ b/BaseModule/src/main/res/layout/me_view_decoration_head.xml @@ -43,7 +43,8 @@ app:layout_constraintWidth_percent="1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + android:visibility="gone"/> + tools:src="@mipmap/me_sj" + android:visibility="gone"/> + + @@ -195,16 +201,6 @@ android:name=".service.CancelNoticeService" android:enabled="true" android:exported="true" /> - - - - - - - - - - \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/adapter/RequestedSongsAdapter.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/adapter/RequestedSongsAdapter.java index 8e0107e1..8f71ee25 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/adapter/RequestedSongsAdapter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/adapter/RequestedSongsAdapter.java @@ -8,6 +8,9 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.xscm.modulemain.R; import com.xscm.modulemain.databinding.ItemRequestedSongBinding; import com.xscm.moduleutil.bean.SongPlaylist; import com.xscm.moduleutil.utils.ImageUtils; @@ -18,22 +21,15 @@ import java.util.List; /** * 已点歌曲列表适配器 */ -public class RequestedSongsAdapter extends RecyclerView.Adapter { +public class RequestedSongsAdapter extends BaseQuickAdapter { - // 歌曲状态常量 - public static final int STATUS_PLAYING = 1; // 正在播放 - public static final int STATUS_PENDING = 2; // 等待播放 - public static final int STATUS_TOP = 3; // 置顶 - - // 列表项类型 - private static final int TYPE_NORMAL = 0; // 普通列表项 - private static final int TYPE_FOOTER = 1; // 底部加载更多项 - - private List songList = new ArrayList<>(); - private boolean isShowFooter = false; // 是否显示底部加载更多 private OnItemClickListener onItemClickListener; + public RequestedSongsAdapter() { + super(R.layout.item_requested_song); + } + public interface OnItemClickListener { void onPlayClick(SongPlaylist.SongPlaylistBean song, int position); @@ -44,166 +40,32 @@ public class RequestedSongsAdapter extends RecyclerView.Adapter= songList.size()) { - return; - } - - SongPlaylist.SongPlaylistBean song = songList.get(position); - - // 设置歌曲信息 - songHolder.binding.tvSongName.setText(song.getSong_name()); - ImageUtils.loadHead(song.getBase_image(), songHolder.binding.ivSongCover); - songHolder.binding.tvSinger.setText("演唱者:" + song.getSinger_nickname()); - songHolder.binding.tvRequestBos.setText("老板:" + song.getBoss_nickname()); - - // 根据位置显示不同的UI - if (position == 0) { - // 第一个是正在播放 - songHolder.binding.tvRequestStatus.setText("正在播放"); - songHolder.binding.tvRequestStatus.setTextColor(0xFF3ABC6D); - songHolder.binding.tvRequestStatus.setBackgroundColor(android.graphics.Color.TRANSPARENT); - } else { - // 第三个以后都是置顶,文字是白色的 - songHolder.binding.tvRequestStatus.setText("置顶"); - songHolder.binding.tvRequestStatus.setTextColor(0xFFFFFFFF); - songHolder.binding.tvRequestStatus.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r34_3abc6d); - } - - - // 设置tvRequestStatus的点击事件,只有置顶状态才能点击 - songHolder.binding.tvRequestStatus.setOnClickListener(v -> { - // 只有第三个及以后的项目(position > 1)才能点击tvRequestStatus - if (position > 1 && onItemClickListener != null) { - onItemClickListener.onTopClick(song, position); - } - }); - } - } - - @Override - public int getItemViewType(int position) { - // 如果是最后一项且需要显示底部加载更多,则返回底部类型 - if (position == songList.size() && isShowFooter) { - return TYPE_FOOTER; - } - return TYPE_NORMAL; - } - - @Override - public int getItemCount() { - // 如果需要显示底部加载更多,则数量加1 - return songList.size() + (isShowFooter ? 1 : 0); - } - - /** - * 根据歌曲对象获取状态 - */ - private int getStatusFromSong(SongPlaylist.SongPlaylistBean song) { - // 根据业务逻辑判断状态,这里仅作为示例 - if ("1".equals(song.getStatus())) { - return STATUS_PLAYING; - } else if ("0".equals(song.getStatus())) { - return STATUS_TOP; + protected void convert(@NonNull BaseViewHolder helper, SongPlaylist.SongPlaylistBean item) { + helper.setText(R.id.tv_song_name, item.getSong_name()); + helper.setText(R.id.tv_singer, "演唱者:" + item.getSinger_nickname()); + helper.setText(R.id.tv_request_bos, "老板:" + item.getBoss_nickname()); + ImageUtils.loadHead(item.getBase_image(), helper.getView(R.id.iv_song_cover)); + // 根据位置显示不同的UI + if (helper.getLayoutPosition() == 0) { + // 第一个是正在播放 + helper.setText(R.id.tv_request_status, "正在播放"); + helper.setTextColor(R.id.tv_request_status, 0xFF3ABC6D); + helper.setBackgroundRes(R.id.tv_request_status, android.graphics.Color.TRANSPARENT); } else { - return STATUS_PENDING; + // 第三个以后都是置顶,文字是白色的 + helper.setText(R.id.tv_request_status, "置顶"); + helper.setTextColor(R.id.tv_request_status, 0xFFFFFFFF); + helper.setBackgroundRes(R.id.tv_request_status, com.xscm.moduleutil.R.drawable.bg_r34_3abc6d); } - } - /** - * 设置歌曲列表 - */ - public void setSongList(List list) { - if (list != null) { - this.songList.clear(); - this.songList.addAll(list); - notifyDataSetChanged(); - } - } - - /** - * 添加歌曲列表(用于加载更多) - */ - public void addSongList(List list) { - if (list != null) { - int startPos = this.songList.size(); - this.songList.addAll(list); - notifyItemRangeInserted(startPos, list.size()); - } - } - - /** - * 显示或隐藏底部加载更多 - */ - public void setShowFooter(boolean showFooter) { - boolean wasShowing = this.isShowFooter; - this.isShowFooter = showFooter; - - if (wasShowing != showFooter) { - if (showFooter) { - notifyItemInserted(songList.size()); - } else { - notifyItemRemoved(songList.size()); + // 设置tvRequestStatus的点击事件,只有置顶状态才能点击 + helper.getView(R.id.tv_request_status).setOnClickListener(v -> { + // 只有第三个及以后的项目(position > 1)才能点击tvRequestStatus + if (helper.getLayoutPosition() > 1 && onItemClickListener != null) { + onItemClickListener.onTopClick(item, helper.getLayoutPosition()); } - } - } - - /** - * 清空列表 - */ - public void clear() { - this.songList.clear(); - notifyDataSetChanged(); - } - - /** - * 获取指定位置的歌曲 - */ - public SongPlaylist.SongPlaylistBean getItem(int position) { - if (position >= 0 && position < songList.size()) { - return songList.get(position); - } - return null; - } - - /** - * 普通列表项ViewHolder - */ - static class SongViewHolder extends RecyclerView.ViewHolder { - ItemRequestedSongBinding binding; - - public SongViewHolder(@NonNull ItemRequestedSongBinding binding) { - super(binding.getRoot()); - this.binding = binding; - } - } - - /** - * 底部加载更多ViewHolder - */ - static class FooterViewHolder extends RecyclerView.ViewHolder { - public FooterViewHolder(@NonNull View itemView) { - super(itemView); - } + }); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RelationshipFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RelationshipFragment.java index bc62a078..37b42613 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RelationshipFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RelationshipFragment.java @@ -72,9 +72,9 @@ public class RelationshipFragment extends BaseMvpDialogFragment { - if (view.getId() == R.id.im_zhid) { + if (view.getId() == R.id.icon_cp_zd) { queren(1, data.getId(), ""); - } else if (view.getId() == R.id.im_shanchu) { + } else if (view.getId() == R.id.icon_cp_dele) { queren(2, data.getId(), data.getDelete_me_coin()); } }); diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RequestedSongsFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RequestedSongsFragment.java index 042c1485..86aab5a7 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RequestedSongsFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RequestedSongsFragment.java @@ -24,7 +24,9 @@ import com.xscm.moduleutil.bean.SingerSongCount; import com.xscm.moduleutil.bean.SongPlaylist; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 已点歌曲页面Fragment @@ -130,34 +132,57 @@ public class RequestedSongsFragment extends BaseMvpFragment 0 ) { + if (s != null && s.getLists() != null && s.getLists().size() > 0) { // 判断当前是刷新还是加载更多 RefreshState state = mBinding.smartRefreshLayout.getState(); + if (state == RefreshState.Refreshing) { // 刷新,清空列表并添加新数据 songList.clear(); songList.addAll(s.getLists()); - adapter.setSongList(songList); + adapter.setNewData(songList); mBinding.smartRefreshLayout.finishRefresh(true); } else if (state == RefreshState.Loading) { - // 加载更多,添加数据到列表 + // 加载更多,过滤重复数据后添加到列表 if (s.getLists().size() > 0) { - songList.addAll(s.getLists()); - adapter.addSongList(songList); - adapter.setShowFooter(true); - mBinding.smartRefreshLayout.finishLoadMore(true); + // 创建一个集合存储现有歌曲的ID,用于快速查找 + Set existingSongIds = new HashSet<>(); + for (SongPlaylist.SongPlaylistBean song : songList) { + if (song.getId() != 0) { + existingSongIds.add(song.getId()); + } + } + + // 过滤掉已存在的歌曲 + List newSongs = new ArrayList<>(); + for (SongPlaylist.SongPlaylistBean song : s.getLists()) { + if (song.getId() != 0 && !existingSongIds.contains(song.getId())) { + newSongs.add(song); + existingSongIds.add(song.getId()); // 添加到已存在集合中,防止本次加载的数据内部重复 + } + } + + // 只有当有新数据时才更新 + if (!newSongs.isEmpty()) { + songList.addAll(newSongs); + adapter.addData(songList); + mBinding.smartRefreshLayout.finishLoadMore(true); + } else { + // 没有新数据,但不算加载失败 + mBinding.smartRefreshLayout.finishLoadMore(true); + } } else { // 没有更多数据 - adapter.setShowFooter(false); +// adapter.setShowFooter(false); mBinding.smartRefreshLayout.finishLoadMoreWithNoMoreData(); } } else { // 首次加载 songList.clear(); songList.addAll(s.getLists()); - adapter.setSongList(songList); + adapter.setNewData(songList); mBinding.smartRefreshLayout.finishRefresh(); } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SongHistoryFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SongHistoryFragment.java index d0316fa3..f4f55db8 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SongHistoryFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SongHistoryFragment.java @@ -39,7 +39,7 @@ public class SongHistoryFragment extends BaseMvpFragment 0) { + // 只添加新加载的数据,而不是整个列表 songList.addAll(s.getLists()); - adapter.addData(songList); + adapter.addData(s.getLists()); mBinding.smartRefreshLayout.finishLoadMore(true); } else { // 没有更多数据 diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BosomFriendActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BosomFriendActivity.kt new file mode 100644 index 00000000..ca8241f2 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BosomFriendActivity.kt @@ -0,0 +1,61 @@ +package com.xscm.modulemain.activity.user.activity + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.view.View +import com.luck.picture.lib.utils.SpUtils +import com.xscm.modulemain.BaseMvpActivity +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.user.activity.ui.main.BosomFriendFragment +import com.xscm.modulemain.activity.user.conacts.UserHomepageConacts +import com.xscm.modulemain.activity.user.presenter.UserHomepagePresenter +import com.xscm.modulemain.databinding.ActivityBosomFriendBinding +import com.xscm.moduleutil.activity.BaseAppCompatActivity +import com.xscm.moduleutil.bean.CircleListBean +import com.xscm.moduleutil.bean.RelationBean +import com.xscm.moduleutil.bean.UserInfo +import com.xscm.moduleutil.utils.SpUtil + +/** + * 挚友活动类 + * 继承自AppCompatActivity,用于展示知心好友相关界面 + */ +class BosomFriendActivity : BaseAppCompatActivity() { + + var fragment: BosomFriendFragment?=null + + /** + * 活动创建时的回调方法 + * @param savedInstanceState 保存的活动状态数据 + */ +// override fun onCreate(savedInstanceState: Bundle?) { +// super.onCreate(savedInstanceState) // 调用父类的onCreate方法 +// setContentView(R.layout.activity_bosom_friend) // 设置活动布局文件 +// // 检查是否有保存的实例状态,如果没有则添加BosomFriendFragment +// if (savedInstanceState == null) { +// supportFragmentManager.beginTransaction() +// .replace(R.id.fl_container, BosomFriendFragment.newInstance()) // 替换容器中的Fragment +// .commitNow() // 立即提交事务 +// } +// } + + + override fun initData() { + if (fragment == null) { + fragment = BosomFriendFragment.newInstance(userId = SpUtil.getUserId().toString(),0) + supportFragmentManager.beginTransaction() + .replace(R.id.fl_container, fragment!!) + .commitNow() + } + } + + override fun initView() { + mBinding.topBar.tvTitle.visibility= View.GONE + mBinding.topBar.ivBack.setImageResource(R.mipmap.im_friend_back) + } + + override fun getLayoutId(): Int { + return R.layout.activity_bosom_friend + } + +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BriefIntroductionActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BriefIntroductionActivity.java index 0aa3afad..05ea740a 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BriefIntroductionActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/BriefIntroductionActivity.java @@ -54,9 +54,13 @@ public class BriefIntroductionActivity extends BaseMvpActivity { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/EditUserInfoActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/EditUserInfoActivity.java index f6c117b0..6e949adc 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/EditUserInfoActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/EditUserInfoActivity.java @@ -318,6 +318,7 @@ public class EditUserInfoActivity extends BaseMvpActivity images = userInfo.getHome_bgimages() != null && !userInfo.getHome_bgimages().isEmpty() ? Arrays.asList(userInfo.getHome_bgimages().split(",")) : new ArrayList<>(); for (int i = 0; i < images.size(); i++) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftWallActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftWallActivity.java index 521092b0..8da6b764 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftWallActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftWallActivity.java @@ -23,12 +23,15 @@ import com.xscm.moduleutil.utils.SpUtil; */ public class GiftWallActivity extends BaseMvpActivity implements GiftWallConacts.View { SectionsGifPagerAdapter sectionsPagerAdapter; + private int userId; @Override protected void initData() { mBinding.topBar.setTitle("礼物墙"); mBinding.topBar.setColor(getResources().getColor(R.color.white)); - MvpPre.giftWall(SpUtil.getUserId()+""); + userId=getIntent().getIntExtra("userId",0); + + MvpPre.giftWall(userId+""); } // 在获取到数据后调用此方法初始化 ViewPager diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RelationshipActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RelationshipActivity.kt new file mode 100644 index 00000000..319ce6d3 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/RelationshipActivity.kt @@ -0,0 +1,140 @@ +package com.xscm.modulemain.activity.user.activity + +import android.view.View +import android.widget.Toast +import com.blankj.utilcode.util.SnackbarUtils.dismiss +import com.xscm.modulemain.BaseMvpActivity +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.user.conacts.UserHomepageConacts +import com.xscm.modulemain.activity.user.presenter.UserHomepagePresenter +import com.xscm.modulemain.adapter.RelationshipAdapter +import com.xscm.modulemain.databinding.ActivityRelationshipBinding +import com.xscm.moduleutil.bean.CircleListBean +import com.xscm.moduleutil.bean.RelationBean +import com.xscm.moduleutil.bean.RelationshipBean +import com.xscm.moduleutil.bean.UserInfo +import com.xscm.moduleutil.dialog.ConfirmDialog + +/** + * @Author qx + * @Time 2025/11/21 14:02 + * @Description 关系页面详情 + */ +class RelationshipActivity : BaseMvpActivity(), + UserHomepageConacts.View { + var adapter :RelationshipAdapter? = null + var relationId: Int = 0 + var userId: Int = 0 + + override fun bindPresenter(): UserHomepagePresenter? { + return UserHomepagePresenter(this, this) + } + + + + override fun initView() { + super.initView() + mBinding.topBar.tvTitle.visibility= View.GONE + mBinding.topBar.ivBack.setImageResource(R.mipmap.im_friend_back) + mBinding.recycleView.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this) + adapter = RelationshipAdapter() + mBinding.recycleView.setAdapter(adapter) + adapter?.setOnItemClickListener(RelationshipAdapter.OnItemClickListener { view: View?, data: RelationshipBean?, position: Int -> + if (view!!.getId() == R.id.icon_cp_zd) { + queren(1, data!!.getId(), "") + } else if (view.getId() == R.id.icon_cp_dele) { + queren(2, data!!.getId(), data.getDelete_me_coin()) + } + }) + } + private fun queren(type: Int, id: Int, num: String?) { + if (type == 1) { + // 创建并显示确认对话框 + ConfirmDialog( + this, + "提示", + "您确定要置顶本关系吗?", + "确认", + "取消", + View.OnClickListener { v: View? -> + // 点击“确认”按钮时执行删除操作 + MvpPre!!.topRelationCard(id.toString() + "") + dismiss() + }, + View.OnClickListener { v: View? -> }, false, 0 + ).show() + } else if (type == 2) { + // 创建并显示确认对话框 + ConfirmDialog( + this, + "提示", + "您确定要删除本关系吗?解除关系需要" + num + "金币", + "确认", + "取消", + View.OnClickListener { v: View? -> + // 点击“确认”按钮时执行删除操作 + MvpPre!!.deleteRelationCard(id.toString() + "") + dismiss() + }, + View.OnClickListener { v: View? -> }, false, 0 + ).show() + } + } + + override fun initData() { + + // 获取传递过来的参数 + relationId = intent.getIntExtra("relationId", -1) + userId = intent.getStringExtra("userId")?.toInt() ?: -1 + + // 验证参数有效性 + if (relationId != -1 && userId != -1) { + // 请求数据 + MvpPre?.getFriendListMore( userId.toString(),relationId.toString()) + } else { + // 处理错误情况 + Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT).show() + finish() + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_relationship + } + + override fun setUserDetails(data: UserInfo?) { + TODO("Not yet implemented") + } + + override fun setCircleList(list: List?) { + TODO("Not yet implemented") + } + + override fun userGuanzSuccess(s: String?) { + TODO("Not yet implemented") + } + + override fun setLikeZone() { + TODO("Not yet implemented") + } + + override fun setFriendList(data: RelationBean?) { + TODO("Not yet implemented") + } + + override fun topRelationCard(s: String?) { + MvpPre?.getFriendListMore( userId.toString(),relationId.toString()) + } + + override fun deleteRelationCard(s: String?) { + MvpPre?.getFriendListMore( userId.toString(),relationId.toString()) + } + + override fun setFriendListMore(data: List?) { + if (data != null && data.isNotEmpty()) { + mBinding.tvHeartbeat.text = data[0]?.relation_name + + adapter?.setNewData(data) + } + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java index 4f8feaad..927268e6 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/SingerVerificationActivity.java @@ -6,6 +6,10 @@ import static android.view.View.VISIBLE; import android.Manifest; import android.content.pm.PackageManager; +import android.media.MediaCodec; +import android.media.MediaExtractor; +import android.media.MediaFormat; +import android.media.MediaMuxer; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Environment; @@ -28,13 +32,25 @@ import com.xscm.modulemain.databinding.ActivitySingerVerificationBinding; import com.xscm.moduleutil.bean.SongPlaylist; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.file.Files; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.Timer; import java.util.TimerTask; +import android.media.AudioFormat; +import android.media.AudioRecord; +import android.media.AudioTrack; + + /** * 歌手认证 * 该Activity用于处理用户进行歌手认证的相关功能,包括录音、试听、重新录制和提交认证等操作。 @@ -56,6 +72,11 @@ public class SingerVerificationActivity extends BaseMvpActivity recordingSegments = new java.util.ArrayList<>(); // 录音片段列表 private int isSinger;//传递过来的参数, /** @@ -98,8 +119,16 @@ public class SingerVerificationActivity extends BaseMvpActivity= 5 * 60 * 1000) { + if (recordingDuration >= 5 * 60 * 1000) { // 修正为5分钟 runOnUiThread(new Runnable() { @Override public void run() { @@ -244,7 +296,7 @@ public class SingerVerificationActivity extends BaseMvpActivity 1) { + // 如果有多个录音片段,合并它们 + mergeAudioFiles(); + } else if (recordingSegments.size() == 1) { + // 只有一个录音片段,直接使用 + recordingFile = recordingSegments.get(0); } + + // 更新状态 + hasRecordedBefore = true; updateUI(); } } catch (Exception e) { Log.e("SingerVerification", "停止录音失败: " + e.getMessage()); - Toast.makeText(this, "停止录音失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "停止录音失败: ", Toast.LENGTH_SHORT).show(); // 发生异常时重置状态,允许重新录制 isRecording = false; @@ -310,19 +361,41 @@ public class SingerVerificationActivity extends BaseMvpActivity 1) { + mergeAudioFiles(); + } else if (recordingSegments.size() == 1) { + recordingFile = recordingSegments.get(0); + } + if (recordingFile == null || !recordingFile.exists()) { Toast.makeText(this, "没有录制的文件", Toast.LENGTH_SHORT).show(); return; } + // 检查录音时长是否达到最小要求(60秒) + if (recordingDuration < 5 * 1000) { + Toast.makeText(this, "录音时间太短,请至少录制60秒", Toast.LENGTH_SHORT).show(); + return; + } + try { stopRecording(); + stopPlaying(); // 确保停止之前的播放 + // 创建新的MediaPlayer实例 mediaPlayer = new MediaPlayer(); - mediaPlayer.setDataSource(recordingFile.getAbsolutePath()); - mediaPlayer.prepare(); - mediaPlayer.start(); + // 设置音频流类型 + mediaPlayer.setAudioStreamType(android.media.AudioManager.STREAM_MUSIC); + + // 设置数据源 + mediaPlayer.setDataSource(recordingFile.getAbsolutePath()); + + // 同步准备(使用同步方式更稳定) + mediaPlayer.prepare(); + + // 设置监听器,在播放完成时重置UI mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { @@ -336,32 +409,53 @@ public class SingerVerificationActivity extends BaseMvpActivity 1) { + mergeAudioFiles(); + } else if (recordingSegments.size() == 1) { + recordingFile = recordingSegments.get(0); + } + if (recordingFile == null || !recordingFile.exists()) { Toast.makeText(this, "请先录制音频", Toast.LENGTH_SHORT).show(); return; } + // 检查录音时长是否达到最小要求(60秒) + if (recordingDuration < 5 * 1000) { + Toast.makeText(this, "录音时间太短,请至少录制60秒", Toast.LENGTH_SHORT).show(); + return; + } + MvpPre.uploadFile(recordingFile, 3); } @@ -400,6 +534,19 @@ public class SingerVerificationActivity extends BaseMvpActivity processedSegments = new ArrayList<>(recordingSegments); + + try { + mergedRecordingFile = createM4AFile(); + muxer = new MediaMuxer(mergedRecordingFile.getAbsolutePath(), + MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); + + // 获取音频格式并添加轨道 + MediaFormat audioFormat = getAudioFormat(processedSegments.get(0)); + int audioTrackIndex = muxer.addTrack(audioFormat); + + muxer.start(); + buffer = ByteBuffer.allocateDirect(BUFFER_SIZE); + MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); + + // 修复:使用正确的累计时间戳 + long currentPresentationTimeUs = 0; // 当前写入的时间戳位置 + int segmentCount = 0; + + for (File segment : processedSegments) { + Log.d("SingerVerification", "开始处理第 " + (segmentCount + 1) + " 个片段: " + segment.getAbsolutePath()); + + long segmentDuration = processAudioSegment(muxer, segment, audioTrackIndex, + buffer, bufferInfo, currentPresentationTimeUs); + + if (segmentDuration > 0) { + // 修复:累计当前时间戳,而不是替换 + currentPresentationTimeUs += segmentDuration; + Log.d("SingerVerification", "片段 " + (segmentCount + 1) + " 处理完成,片段时长: " + segmentDuration + " us, 累计时间: " + currentPresentationTimeUs + " us"); + } else { + Log.w("SingerVerification", "片段 " + (segmentCount + 1) + " 处理失败或为空"); + } + + segmentCount++; + } + + Log.d("SingerVerification", "所有片段处理完成,总时长: " + currentPresentationTimeUs + " us,共处理 " + segmentCount + " 个片段"); + + // 更新最终录音文件 + updateRecordingFile(); + + } catch (Exception e) { + handleMergeError(e); + } finally { + cleanupResources(muxer, buffer); + cleanupSegments(processedSegments); + } + } + + private MediaFormat getAudioFormat(File audioFile) throws IOException { + MediaExtractor extractor = new MediaExtractor(); + try { + extractor.setDataSource(audioFile.getAbsolutePath()); + for (int i = 0; i < extractor.getTrackCount(); i++) { + MediaFormat format = extractor.getTrackFormat(i); + String mime = format.getString(MediaFormat.KEY_MIME); + if (mime != null && mime.startsWith(AUDIO_MIME_PREFIX)) { + return format; + } + } + throw new IOException("没有找到音频轨道"); + } finally { + extractor.release(); + } + } + + private long processAudioSegment(MediaMuxer muxer, File segment, int trackIndex, + ByteBuffer buffer, MediaCodec.BufferInfo bufferInfo, long baseTimeUs) throws IOException { + MediaExtractor extractor = new MediaExtractor(); + long actualDuration = 0; + + try { + extractor.setDataSource(segment.getAbsolutePath()); + int audioTrackIndex = findAudioTrack(extractor); + if (audioTrackIndex < 0) { + Log.w("SingerVerification", "未找到音频轨道: " + segment.getAbsolutePath()); + return 0; + } + + extractor.selectTrack(audioTrackIndex); + MediaFormat format = extractor.getTrackFormat(audioTrackIndex); + long estimatedDuration = format.getLong(MediaFormat.KEY_DURATION); + Log.d("SingerVerification", "处理片段: " + segment.getAbsolutePath() + + ", 估计时长: " + estimatedDuration + "us, 基准时间: " + baseTimeUs + "us"); + + long maxSampleTime = 0; + int sampleCount = 0; + + while (true) { + int sampleSize = extractor.readSampleData(buffer, 0); + if (sampleSize < 0) { + break; // 没有更多样本 + } + + long sampleTime = extractor.getSampleTime(); + if (sampleTime == -1) { + // 如果没有时间戳,使用估计值(不推荐) + sampleTime = sampleCount * 1000000 / 44100; // 假设44.1kHz + } + + // 记录最大样本时间作为实际持续时间 + if (sampleTime > maxSampleTime) { + maxSampleTime = sampleTime; + } + + bufferInfo.offset = 0; + bufferInfo.size = sampleSize; + bufferInfo.presentationTimeUs = baseTimeUs + sampleTime; + bufferInfo.flags = extractor.getSampleFlags(); + + // 确保时间戳是递增的 + if (bufferInfo.presentationTimeUs < baseTimeUs) { + bufferInfo.presentationTimeUs = baseTimeUs + sampleCount * 1000; // 安全回退 + } + + muxer.writeSampleData(trackIndex, buffer, bufferInfo); + extractor.advance(); + sampleCount++; + } + + // 修复:使用实际的最大样本时间 + 最后一个样本的持续时间估计 + if (maxSampleTime > 0) { + // 添加最后一个样本的估计持续时间(假设20ms) + actualDuration = maxSampleTime + 20000; + } else { + // 如果没有样本,使用格式的估计值 + actualDuration = estimatedDuration; + } + + Log.d("SingerVerification", "片段处理完成,实际时长: " + actualDuration + "us, 样本数: " + sampleCount); + return actualDuration; + + } finally { + extractor.release(); + } + } + + private int findAudioTrack(MediaExtractor extractor) { + for (int i = 0; i < extractor.getTrackCount(); i++) { + MediaFormat format = extractor.getTrackFormat(i); + String mime = format.getString(MediaFormat.KEY_MIME); + if (mime != null && mime.startsWith(AUDIO_MIME_PREFIX)) { + return i; + } + } + return -1; + } + + private void updateRecordingFile() { + // 确保合并文件存在且不为空 + if (mergedRecordingFile != null && mergedRecordingFile.exists() && mergedRecordingFile.length() > 0) { + recordingFile = mergedRecordingFile; + Log.d("SingerVerification", "音频文件合并完成,文件大小: " + mergedRecordingFile.length() + " bytes"); + } else { + Log.e("SingerVerification", "合并文件不存在或为空,使用第一个录音片段"); + if (!recordingSegments.isEmpty()) { + recordingFile = recordingSegments.get(0); + } + } + + // 清理录音片段列表 + recordingSegments.clear(); + } + + private void handleMergeError(Exception e) { + Log.e("SingerVerification", "处理音频文件失败: " + e.getMessage(), e); + Toast.makeText(this, "处理音频文件失败,使用第一段录音", Toast.LENGTH_SHORT).show(); + if (!recordingSegments.isEmpty()) { + recordingFile = recordingSegments.get(0); + } + } + + private void cleanupResources(MediaMuxer muxer, ByteBuffer buffer) { + try { + if (muxer != null) { + muxer.stop(); + muxer.release(); + } + } catch (Exception e) { + Log.e("SingerVerification", "释放MediaMuxer失败", e); + } + } + + private void cleanupSegments(List segments) { + // 延迟删除片段,确保合并文件已经完全写入 + new Handler().postDelayed(() -> { + for (File segment : segments) { + try { + if (segment.exists()) { + boolean deleted = segment.delete(); + if (!deleted) { + Log.w("SingerVerification", "删除音频片段失败: " + segment.getAbsolutePath()); + } else { + Log.d("SingerVerification", "成功删除音频片段: " + segment.getAbsolutePath()); + } + } + } catch (Exception e) { + Log.e("SingerVerification", "删除音频片段失败: " + segment.getAbsolutePath(), e); + } + } + }, 2000); // 延迟2秒删除,确保合并文件已经完全写入 + } + + + // 这些WAV处理方法已不再需要,因为我们现在使用MediaMuxer处理M4A文件 + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UserHomepageActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UserHomepageActivity.java index 7c817a75..710f7035 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UserHomepageActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UserHomepageActivity.java @@ -20,6 +20,8 @@ import com.xscm.modulemain.activity.user.presenter.UserHomepagePresenter; import com.xscm.modulemain.BaseMvpActivity; import com.xscm.moduleutil.adapter.MyFragmentPagerAdapter; import com.xscm.moduleutil.bean.CircleListBean; +import com.xscm.moduleutil.bean.RelationBean; +import com.xscm.moduleutil.bean.RelationshipBean; import com.xscm.moduleutil.bean.UserInfo; import com.xscm.moduleutil.bean.XBannerData; import com.xscm.moduleutil.utils.ARouteConstants; @@ -149,6 +151,26 @@ public class UserHomepageActivity extends BaseMvpActivity data) { + + } + @Override protected void onDestroy() { // 清理 ViewPager diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/BosomFriendFragment.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/BosomFriendFragment.kt new file mode 100644 index 00000000..410d23b9 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/BosomFriendFragment.kt @@ -0,0 +1,337 @@ +package com.xscm.modulemain.activity.user.activity.ui.main + +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.blankj.utilcode.util.SnackbarUtils.dismiss +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.xscm.modulemain.R +import com.xscm.modulemain.activity.user.activity.RelationshipActivity +import com.xscm.modulemain.activity.user.activity.UserHomepageActivity +import com.xscm.modulemain.activity.user.conacts.UserHomepageConacts +import com.xscm.modulemain.activity.user.presenter.UserHomepagePresenter +import com.xscm.modulemain.adapter.BosomFriendAdapter +import com.xscm.modulemain.databinding.FragmentBosomFriendBinding +import com.xscm.moduleutil.base.BaseMvpFragment +import com.xscm.moduleutil.bean.CircleListBean +import com.xscm.moduleutil.bean.RelationBean +import com.xscm.moduleutil.bean.RelationshipBean +import com.xscm.moduleutil.bean.UserInfo +import com.xscm.moduleutil.dialog.ConfirmDialog +import com.xscm.moduleutil.utils.ImageUtils +import com.xscm.moduleutil.utils.SpUtil + +/** + * @Author qx + * @Time 2025/11/20 11:43 + * @Description 这是挚友的 + */ +class BosomFriendFragment : BaseMvpFragment(), + UserHomepageConacts.View { + @JvmField + var userId: String = "" + var page: Int = 1 + var isLoading: Boolean = false + var adapter: BosomFriendAdapter? = null + + var type: Int = 0//这是判断是从哪里进入的,在用户主页进入,要添加背景,等于1的时候,是从用户主页进入的, + + companion object { + @JvmStatic + fun newInstance() = BosomFriendFragment() + + /** + * 创建实例并设置userId + */ + @JvmStatic + fun newInstance(userId: String, type: Int): BosomFriendFragment { + val fragment = BosomFriendFragment() + val bundle = Bundle() + bundle.putString("userId", userId) + bundle.putInt("type", type) + fragment.arguments = bundle + return fragment + } + } + + /** + * 设置用户ID + */ + fun setUserId(userId: String) { + this.userId = userId + page = 1 // 重置页码 + // 如果已经初始化完成,立即获取数据 + if (isAdded) { + MvpPre?.getFriendList(userId, page.toString(), "10") // 获取第一页数据 + } + } + + private val viewModel: BosomFriendViewModel by viewModels() + + + override fun initData() { + // 根据userId获取挚友列表数据 + if (userId.isNotEmpty()) { + MvpPre?.getFriendList(userId, page.toString(), "10") // 初始加载第一页数据 + } + + // 观察ViewModel中的数据变化 + viewModel.bosomFriendList.observe(viewLifecycleOwner) { relationBean -> + relationBean?.let { data -> + // 更新适配器数据 + updateAdapter(data, false) // false表示不是加载更多 + } + } + + // 观察加载状态 + viewModel.isLoading.observe(viewLifecycleOwner) { isLoading -> + // 显示或隐藏加载进度条 + + // 更新刷新状态 + mBinding.smartRefreshLayout.finishRefresh() + mBinding.smartRefreshLayout.finishLoadMore() + } + + // 观察错误信息 + viewModel.errorMessage.observe(viewLifecycleOwner) { errorMsg -> + if (errorMsg.isNotEmpty()) { + // 显示错误信息 + Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show() + } + } + } + + override fun initView() { + if (type == 1) { + mBinding.root.setBackgroundResource(R.mipmap.bj_intimate) + } + + mBinding.rvMyRelationship.layoutManager = + androidx.recyclerview.widget.LinearLayoutManager(context) + + // 初始化适配器 + val adapter = BosomFriendAdapter(mutableListOf()) + mBinding.rvMyRelationship.adapter = adapter + + // 设置点击事件监听器 + adapter.onItemClickListener = object : BosomFriendAdapter.OnItemClickListener { + override fun onUserClick(userId: String) { + // 处理用户点击事件,例如跳转到用户详情页 + // 这里可以根据需求实现具体的跳转逻辑 + + //用户主页 + val intent = Intent(activity, UserHomepageActivity::class.java) + intent.putExtra("userId", userId) + startActivity(intent) + } + + override fun onDeleteClick(relation: RelationshipBean) { + // 处理删除关系点击事件 + // 这里可以调用删除关系的接口 + queren(2, relation.getId(), relation.getDelete_me_coin()) + } + + override fun onTopClick(relation: RelationshipBean) { + // 处理置顶关系点击事件 + // 这里可以调用置顶关系的接口 + queren(1, relation.getId(), "") + } + + override fun onDetailsClick(relationId: Int) {//点击更多按钮 + val intent = Intent(activity, RelationshipActivity::class.java).apply { + putExtra("relationId", relationId) + putExtra("userId", userId) // 假设 currentUserId 是你当前页面的用户ID + } + activity?.startActivity(intent) + } + } + + // 设置下拉刷新 + mBinding.smartRefreshLayout.setOnRefreshListener { + page = 1 // 重置页码 + MvpPre?.getFriendList(userId, page.toString(), "10") + } + + mBinding.smartRefreshLayout.setOnRefreshLoadMoreListener(object : + OnRefreshLoadMoreListener { + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + MvpPre?.getFriendList(userId, page.toString(), "10") + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 // 重置页码 + MvpPre?.getFriendList(userId, page.toString(), "10") + } + }) + + mBinding.llLeft.setOnClickListener { //跳转到个人主页 + val intent = Intent(activity, UserHomepageActivity::class.java) + intent.putExtra("userId", cpBean.user_info1?.user_id) + startActivity(intent) + } + mBinding.llRight.setOnClickListener {//跳转到个人主页 + val intent = Intent(activity, UserHomepageActivity::class.java) + intent.putExtra("userId", cpBean.user_info2?.user_id) + startActivity(intent) + } + mBinding.llMiddle.setOnClickListener { //跳转到心动空间 + + } + + } + + private fun queren(type: Int, id: Int, num: String?) { + if (type == 1) { + // 创建并显示确认对话框 + ConfirmDialog( + getActivity(), + "提示", + "您确定要置顶本关系吗?", + "确认", + "取消", + View.OnClickListener { v: View? -> + // 点击“确认”按钮时执行删除操作 + MvpPre?.topRelationCard(id.toString() + "") + dismiss() + }, + View.OnClickListener { v: View? -> }, false, 0 + ).show() + } else if (type == 2) { + // 创建并显示确认对话框 + ConfirmDialog( + getActivity(), + "提示", + "您确定要删除本关系吗?解除关系需要" + num + "金币", + "确认", + "取消", + View.OnClickListener { v: View? -> + // 点击“确认”按钮时执行删除操作 + MvpPre?.deleteRelationCard(id.toString() + "") + dismiss() + }, + View.OnClickListener { v: View? -> }, false, 0 + ).show() + } + } + + override fun getLayoutId(): Int { + return R.layout.fragment_bosom_friend + } + + override fun bindPresenter(): UserHomepagePresenter? { + return UserHomepagePresenter(this, activity) + } + + override fun setUserDetails(data: UserInfo?) { + } + + override fun setCircleList(list: List?) { + } + + override fun userGuanzSuccess(s: String?) { + } + + override fun setLikeZone() { + } + + override fun setFriendList(data: RelationBean?) { + // 停止刷新动画 + mBinding.smartRefreshLayout.finishRefresh() + mBinding.smartRefreshLayout.finishLoadMore() + // 重置加载状态 + isLoading = false + + data?.let { + // 判断是否是第一页数据 + val isLoadMore = page > 1 + updateAdapter(it, isLoadMore) + } + } + + override fun topRelationCard(s: String?) { + page = 1 // 重置页码 + MvpPre?.getFriendList(userId, page.toString(), "10") + } + + override fun deleteRelationCard(s: String?) { + page = 1 // 重置页码 + MvpPre?.getFriendList(userId, page.toString(), "10") + } + + override fun setFriendListMore(data: List?) { + TODO("Not yet implemented") + } + + var cpBean: UserInfo.CpInfo = UserInfo.CpInfo() + + /** + * 更新适配器数据 + * @param data 关系数据 + * @param isLoadMore 是否是加载更多 + */ + private fun updateAdapter(data: RelationBean, isLoadMore: Boolean) { + // 创建数据列表 + val dataList = mutableListOf() + + // 只有在第一页或刷新时才更新cp数据 + if (!isLoadMore) { + if (data.cp != null) { + mBinding.tvHeartbeat.text = + if (data.cp?.name.isNullOrEmpty()) "心动" else data.cp.name + cpBean = data.cp + if (data.cp.user_info1 != null && data.cp.user_info2 != null) { + mBinding.llCp.visibility = View.VISIBLE + mBinding.tvHeartbeatTs.visibility = View.GONE + + ImageUtils.loadHead(data.cp.user_info1?.avatar, mBinding.userNav1) + mBinding.tvNickname1.text = data.cp.user_info1?.nickname + mBinding.tvNickname2.text = data.cp.user_info2?.nickname + mBinding.tvCpLv.text = "LV" + data.cp.level + " " + data.cp.name + ImageUtils.loadHead(data.cp.user_info2?.avatar, mBinding.userNav2) + val xd = data.cp.exp.toLong() // 更安全的类型转换 + val formattedNum = if (xd >= 10000) { + String.format("%.2fw", xd / 10000.0) + } else { + xd.toString() + } + mBinding.tvCpNum.text = formattedNum + } + } else { + mBinding.tvHeartbeat.text = "心动" + mBinding.llCp.visibility = View.GONE + mBinding.tvHeartbeatTs.visibility = View.VISIBLE + } + } + + + // 添加no_cp数据 + dataList.addAll(data.no_cp) + + // 更新适配器 + adapter = mBinding.rvMyRelationship.adapter as BosomFriendAdapter + if (isLoadMore) { + // 加载更多时追加数据 + adapter?.addData(dataList) + } else { + // 刷新或首次加载时替换数据 + adapter?.setNewData(dataList) + } + + } + + // 从onCreate中获取userId参数 + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + userId = it.getString("userId", "") + type = it.getInt("type", 0) + } + } + +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/BosomFriendViewModel.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/BosomFriendViewModel.kt new file mode 100644 index 00000000..051f1f59 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/ui/main/BosomFriendViewModel.kt @@ -0,0 +1,104 @@ +package com.xscm.modulemain.activity.user.activity.ui.main + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.xscm.moduleutil.bean.RelationBean +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class BosomFriendViewModel : ViewModel() { + // 好友列表数据 + private val _bosomFriendList = MutableLiveData() + val bosomFriendList: LiveData = _bosomFriendList + + // 加载状态 + private val _isLoading = MutableLiveData() + val isLoading: LiveData = _isLoading + + // 错误信息 + private val _errorMessage = MutableLiveData() + val errorMessage: LiveData = _errorMessage + + // 当前页码 + private var currentPage = 1 + + // 是否还有更多数据 + private var hasMoreData = true + + /** + * 获取挚友列表 + * @param userId 用户ID + * @param isRefresh 是否是刷新 + */ + fun getFriendList(userId: String, isRefresh: Boolean = false) { + if (isRefresh) { + currentPage = 1 + hasMoreData = true + } + + if (!hasMoreData) { + return + } + + _isLoading.value = true + + // 使用协程进行网络请求 + CoroutineScope(Dispatchers.IO).launch { + try { + // 模拟网络请求,实际项目中替换为真实的API调用 + val result = fetchFriendListFromApi(userId, currentPage) + + withContext(Dispatchers.Main) { + _isLoading.value = false + + if (result != null) { + _bosomFriendList.value = result + + // 判断是否还有更多数据 + hasMoreData = result.no_cp.size >= 10 // 假设每页10条数据 + currentPage++ + } else { + _errorMessage.value = "获取好友列表失败" + } + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + _isLoading.value = false + _errorMessage.value = "网络请求错误: ${e.message}" + } + } + } + } + + /** + * 模拟API请求获取好友列表 + * 实际项目中替换为真实的API调用 + */ + private suspend fun fetchFriendListFromApi(userId: String, page: Int): RelationBean? { + // 这里应该是实际的API调用 + // return apiService.getFriendList(userId, page) + + // 模拟延迟 + kotlinx.coroutines.delay(1000) + + // 返回模拟数据 + return RelationBean() + } + + /** + * 加载更多数据 + */ + fun loadMore(userId: String) { + getFriendList(userId, false) + } + + /** + * 刷新数据 + */ + fun refresh(userId: String) { + getFriendList(userId, true) + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/UserHomepageConacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/UserHomepageConacts.java index 59551795..37f048e7 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/UserHomepageConacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/conacts/UserHomepageConacts.java @@ -5,6 +5,8 @@ import android.app.Activity; import com.xscm.moduleutil.activity.IPresenter; import com.xscm.moduleutil.activity.IView; import com.xscm.moduleutil.bean.CircleListBean; +import com.xscm.moduleutil.bean.RelationBean; +import com.xscm.moduleutil.bean.RelationshipBean; import com.xscm.moduleutil.bean.UserInfo; import java.util.List; @@ -17,6 +19,13 @@ public class UserHomepageConacts { void userGuanzSuccess(String s); void setLikeZone(); + + void setFriendList(RelationBean data); + + void topRelationCard(String s); + void deleteRelationCard(String s); + + void setFriendListMore(List data); } public interface IMePre extends IPresenter { @@ -27,5 +36,12 @@ public class UserHomepageConacts { void userGuanz(String userId,String type); void deleteZone(int idx,String zone_id); + + void getFriendList(String user_id,String page,String page_limit); + + void topRelationCard(String id); + void deleteRelationCard(String id); + + void getFriendListMore(String user_id,String relation_id); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/CirleListFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/CirleListFragment.java index 44e54baa..39edd803 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/CirleListFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/CirleListFragment.java @@ -16,6 +16,8 @@ import com.xscm.modulemain.manager.RoomManager; import com.xscm.moduleutil.adapter.CirleListAdapter; import com.xscm.moduleutil.base.BaseMvpFragment; import com.xscm.moduleutil.bean.CircleListBean; +import com.xscm.moduleutil.bean.RelationBean; +import com.xscm.moduleutil.bean.RelationshipBean; import com.xscm.moduleutil.bean.UserInfo; import com.xscm.moduleutil.utils.ARouteConstants; import com.xscm.moduleutil.widget.dialog.RewardGiftDialogFragment; @@ -160,4 +162,24 @@ public class CirleListFragment extends BaseMvpFragment data) { + + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/UserHomepageFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/UserHomepageFragment.java index 4eda8c9a..b39ca72e 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/UserHomepageFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/fragment/UserHomepageFragment.java @@ -21,11 +21,14 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.recyclerview.widget.GridLayoutManager; +import com.alibaba.android.arouter.launcher.ARouter; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.google.android.flexbox.FlexboxLayout; import com.xscm.modulemain.Application; import com.xscm.modulemain.R; +import com.xscm.modulemain.activity.user.activity.GiftWallActivity; +import com.xscm.modulemain.activity.user.activity.ui.main.BosomFriendFragment; import com.xscm.modulemain.databinding.FragmentUserHompageBinding; import com.tencent.imsdk.v2.V2TIMConversation; import com.tencent.qcloud.tuicore.TUIConstants; @@ -36,9 +39,12 @@ import com.xscm.modulemain.manager.RoomManager; import com.xscm.moduleutil.base.BaseMvpFragment; import com.xscm.moduleutil.bean.CircleListBean; import com.xscm.moduleutil.bean.MyBagBean; +import com.xscm.moduleutil.bean.RelationBean; +import com.xscm.moduleutil.bean.RelationshipBean; import com.xscm.moduleutil.bean.UserInfo; import com.xscm.moduleutil.bean.UserTagBean; import com.xscm.moduleutil.color.ThemeableDrawableUtils; +import com.xscm.moduleutil.utils.ARouteConstants; import com.xscm.moduleutil.utils.ColorManager; import com.xscm.moduleutil.utils.ImageUtils; import com.xscm.moduleutil.utils.SpUtil; @@ -84,6 +90,26 @@ public class UserHomepageFragment extends BaseMvpFragment data) { + + } + public static UserHomepageFragment newInstance(UserInfo userInfo, int type) { UserHomepageFragment fragment = new UserHomepageFragment(); Bundle args = new Bundle(); @@ -112,7 +138,7 @@ public class UserHomepageFragment extends BaseMvpFragment(); list.add(new MyBagBean("动态", "1")); - list.add(new MyBagBean("礼物墙", "2")); + list.add(new MyBagBean("挚友", "2")); list.add(new MyBagBean("我的相册", "3")); mBinding.viewPager.setAdapter(new MyFragmentPagerAdapter(getChildFragmentManager(), list, userInfo.getUser_id() + "")); mBinding.slidingTabLayout.setViewPager(mBinding.viewPager); @@ -203,6 +229,8 @@ public class UserHomepageFragment extends BaseMvpFragment() { + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(RelationBean relationBean) { + if (MvpRef == null) + MvpRef = new WeakReference<>(mView); + MvpRef.get().setFriendList(relationBean); + } + }); + } + + @Override + public void topRelationCard(String id) { + if (api==null){ + api= RetrofitClient.getInstance(); + } + api.topRelationCard(id, 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().topRelationCard(s); + } + }); + } + + @Override + public void deleteRelationCard(String id) { + if (api==null){ + api= RetrofitClient.getInstance(); + } + api.deleteRelationCard(id, 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().deleteRelationCard(s); + } + }); + } + + @Override + public void getFriendListMore(String user_id, String relation_id) { + api.getFriendListMore(user_id, relation_id, new BaseObserver>() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(List relationshipBeans) { + if (MvpRef == null) { + MvpRef = new WeakReference<>(mView); + } + MvpRef.get().setFriendListMore(relationshipBeans); + } + }); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt new file mode 100644 index 00000000..1788522f --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt @@ -0,0 +1,338 @@ +package com.xscm.modulemain.adapter + +import android.view.View +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.xscm.modulemain.R +import com.xscm.moduleutil.bean.RelationBean +import com.xscm.moduleutil.bean.RelationshipBean +import com.xscm.moduleutil.utils.ImageUtils +import com.xscm.moduleutil.utils.MeHeadView +import com.xscm.moduleutil.utils.SpUtil +import com.xscm.moduleutil.utils.TimeUtils + +/** + * 挚友列表适配器 + */ +class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuickAdapter(data) { + + // 点击事件监听器 + var onItemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onUserClick(userId: String) + fun onDeleteClick(relation: RelationshipBean) + fun onTopClick(relation: RelationshipBean) + + fun onDetailsClick(relationId: Int) + } + + companion object { + // 类型常量 + const val TYPE_NOCP_WITH_NAME = 3 // no_cp集合,relation_name不等于"",并且relation_list的大小是1 + const val TYPE_NOCP_WITH_NAME_AND_LIST = 5 // no_cp集合,relation_name不等于"",并且relation_list的大小大于1 + } + + init { + // 添加item类型 +// addItemType(TYPE_CP_WITH_NAME, R.layout.item_relationship_list) +// addItemType(TYPE_CP_WITH_LIST, R.layout.item_bosom_cp) + addItemType(TYPE_NOCP_WITH_NAME, R.layout.item_relationship_list) // 修改为使用item_bosom_friend布局 +// addItemType(TYPE_NOCP_WITH_LIST, R.layout.item_bosom_cp_friend) + addItemType(TYPE_NOCP_WITH_NAME_AND_LIST, R.layout.item_bosom_friend_details) +// addItemType(TYPE_NOCP_WITH_LIST_MORE, R.layout.item_bosom_friend_details) + } + + override fun getItemViewType(position: Int): Int { + val data = getItem(position) // 假设你使用的是ListAdapter + + when (data) { + + is RelationBean.NoCpBean -> { + // 情况3:no_cp集合,relation_name不等于"",并且relation_list的大小是1 + if (data.relation_name.isNotEmpty() && data.relation_list.size == 1) { + return TYPE_NOCP_WITH_NAME + } + + // 情况5:no_cp集合,relation_name不等于"",并且relation_list的大小大于1 + if (data.relation_name.isNotEmpty() && data.relation_list.size > 1) { + return TYPE_NOCP_WITH_NAME_AND_LIST + } + } + } + + // 其他情况返回默认值 + return TYPE_NOCP_WITH_NAME + } + + /** + * 转换NoCp类型数据 + */ + private fun convertNoCp(holder: BaseViewHolder, noCpBean: RelationBean.NoCpBean, viewType: Int) { + // 根据viewType设置不同的UI + when (viewType) { + TYPE_NOCP_WITH_NAME -> { + // 显示关系名称 + holder.setText(R.id.tv_heartbeat, noCpBean.relation_name) + + // 显示关系名称 + holder.setText(R.id.tv_cp_lv, noCpBean.relation_name) + var meHeadView: MeHeadView + var meHeadView2: MeHeadView + meHeadView = holder.getView(R.id.user_nav1) + meHeadView2 = holder.getView(R.id.user_nav2) + meHeadView.setSex(noCpBean.relation_list[0].sex1,noCpBean.relation_list[0].avatar1) + meHeadView2.setSex(noCpBean.relation_list[0].sex2,noCpBean.relation_list[0].avatar2) + + // 显示relation_list内容 +// ImageUtils.loadHead(noCpBean.relation_list[0].avatar1, holder.getView(R.id.user_nav1)) + holder.setText(R.id.tv_nickname1, noCpBean.relation_list[0].nickname1) +// ImageUtils.loadHead(noCpBean.relation_list[0].avatar2, holder.getView(R.id.user_nav2)) + holder.setText(R.id.tv_nickname2, noCpBean.relation_list[0].nickname2) + if (noCpBean.relation_list[0].user_id1 == SpUtil.getUserId() || noCpBean.relation_list[0].user_id2 == SpUtil.getUserId()) { + holder.setVisible(R.id.icon_cp_zd, true) + holder.setVisible(R.id.icon_cp_dele, true) + } else { + holder.setVisible(R.id.icon_cp_zd, false) + holder.setVisible(R.id.icon_cp_dele, false) + } + // 设置点击事件 + holder.getView(R.id.user_nav1).setOnClickListener { + // 点击第一个用户头像 + onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id1.toString()) + } + + holder.getView(R.id.user_nav2).setOnClickListener { + // 点击第二个用户头像 + onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id2.toString()) + } + + // 设置删除按钮点击事件 + holder.getView(R.id.icon_cp_dele).setOnClickListener { + onItemClickListener?.onDeleteClick(noCpBean.relation_list[0]) + } + + // 设置置顶按钮点击事件 + holder.getView(R.id.icon_cp_zd).setOnClickListener { + onItemClickListener?.onTopClick(noCpBean.relation_list[0]) + } + + // 计算并显示剩余时间 + val endTimeStr = noCpBean.relation_list[0].end_time + if (!endTimeStr.isNullOrEmpty()) { + try { + val endTime = endTimeStr.toLong() + val currentTime = System.currentTimeMillis() / 1000 // 当前时间戳(秒) + val remainingSeconds = endTime - currentTime + + if (remainingSeconds > 0) { + val days = remainingSeconds / (24 * 60 * 60) + val hours = (remainingSeconds % (24 * 60 * 60)) / (60 * 60) + val timeText = if (days > 0) { + "${days}天${hours}小时" + } else { + "${hours}小时" + } + holder.setText(R.id.tv_cp_num, timeText) + } + } catch (e: NumberFormatException) { + // 时间戳格式错误 + holder.setVisible(R.id.tv_cp_num, false) + } + } else { + // end_time为空 + holder.setVisible(R.id.tv_cp_num, false) + } + } + + TYPE_NOCP_WITH_NAME_AND_LIST -> { + + // 显示关系名称 + holder.setText(R.id.tvRelationName, noCpBean.relation_name) + holder.setVisible(R.id.im_gd, true) + // 设置置顶按钮点击事件 + holder.getView(R.id.im_gd).setOnClickListener { + onItemClickListener?.onDetailsClick(noCpBean.relation_list[0].relation_id) + } + // 显示relation_list内容,只显示前三个关系 + if (noCpBean.relation_list.isNotEmpty()) { + // 获取前三个关系,如果不足三个则显示全部 + val displayCount = minOf(3, noCpBean.relation_list.size) + + // 根据显示数量设置不同的布局 + when (displayCount) { + + 2 -> { + + holder.setVisible(R.id.rlRelation1,true) + holder.setVisible(R.id.rlRelation2,true) + holder.setVisible(R.id.rlRelation3,false) + + // 显示两个关系 + val relation1 = noCpBean.relation_list[0] + val relation2 = noCpBean.relation_list[1] + var meHeadView : MeHeadView + var meHeadView2 : MeHeadView + meHeadView=holder.getView(R.id.user_nav1) + meHeadView2=holder.getView(R.id.user_nav2) + + if (relation1.user_id1== SpUtil.getUserId()){ + meHeadView.setSex(relation1.sex2,relation1.avatar2) + holder.setText(R.id.tv_nickname1, relation1.nickname2) + + }else{ + meHeadView.setSex(relation1.sex1,relation1.avatar1) + holder.setText(R.id.tv_nickname1, relation1.nickname1) + } + + if (relation2.user_id1== SpUtil.getUserId()){ + meHeadView2.setSex(relation2.sex2,relation2.avatar2) + holder.setText(R.id.tv_nickname2, relation2.nickname2) + }else{ + meHeadView2.setSex(relation2.sex1,relation2.avatar1) + holder.setText(R.id.tv_nickname2, relation2.nickname1) + } + + +// ImageUtils.loadHead(relation1.avatar1, holder.getView(R.id.user_nav1)) +// holder.setText(R.id.tv_nickname1, relation1.nickname1) + +// ImageUtils.loadHead(relation2.avatar1, holder.getView(R.id.user_nav2)) +// holder.setText(R.id.tv_nickname2, relation2.nickname1) + holder.setText(R.id.tv_gx_time, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[0].end_time.toLong())) + holder.setText(R.id.tv_gx_time2, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[1].end_time.toLong())) + + holder.getView(R.id.user_nav1).setOnClickListener { + if (relation1.user_id1== SpUtil.getUserId()){ + // 点击第一个用户头像 + onItemClickListener?.onUserClick(relation1.user_id2.toString()) + }else { + // 点击第一个用户头像 + onItemClickListener?.onUserClick(relation1.user_id1.toString()) + } + } + + holder.getView(R.id.user_nav2).setOnClickListener { + if (relation2.user_id1== SpUtil.getUserId()) { + // 点击第二个用户头像 + onItemClickListener?.onUserClick(relation2.user_id2.toString()) + }else{ + onItemClickListener?.onUserClick(relation2.user_id1.toString()) + } + } + + + } + 3 -> { + holder.setVisible(R.id.rlRelation1,true) + holder.setVisible(R.id.rlRelation2,true) + holder.setVisible(R.id.rlRelation3,true) + // 显示三个关系 + val relation1 = noCpBean.relation_list[0] + val relation2 = noCpBean.relation_list[1] + val relation3 = noCpBean.relation_list[2] + + var meHeadView : MeHeadView + var meHeadView2 : MeHeadView + var meHeadView3 : MeHeadView + meHeadView=holder.getView(R.id.user_nav1) + meHeadView2=holder.getView(R.id.user_nav2) + meHeadView3=holder.getView(R.id.user_nav3) + + if (relation1.user_id1== SpUtil.getUserId()){ + meHeadView.setSex(relation1.sex2,relation1.avatar2) + holder.setText(R.id.tv_nickname1, relation1.nickname2) + }else{ + meHeadView.setSex(relation1.sex1,relation1.avatar1) + holder.setText(R.id.tv_nickname1, relation1.nickname1) + } + + if (relation2.user_id1== SpUtil.getUserId()){ + meHeadView2.setSex(relation2.sex2,relation2.avatar2) + holder.setText(R.id.tv_nickname2, relation2.nickname2) + }else{ + meHeadView2.setSex(relation2.sex1,relation2.avatar1) + holder.setText(R.id.tv_nickname2, relation2.nickname1) + } + + if (relation3.user_id1== SpUtil.getUserId()){ + meHeadView3.setSex(relation3.sex2,relation3.avatar2) + holder.setText(R.id.tv_nickname3, relation3.nickname2) + }else{ + meHeadView3.setSex(relation3.sex1,relation3.avatar1) + holder.setText(R.id.tv_nickname3, relation3.nickname1) + } + + + + +// ImageUtils.loadHead(relation1.avatar1, holder.getView(R.id.user_nav1)) +// holder.setText(R.id.tv_nickname1, relation1.nickname1) +// +// ImageUtils.loadHead(relation2.avatar1, holder.getView(R.id.user_nav2)) +// holder.setText(R.id.tv_nickname2, relation2.nickname1) +// +// ImageUtils.loadHead(relation3.avatar1, holder.getView(R.id.user_nav3)) +// holder.setText(R.id.tv_nickname3, relation3.nickname1) + + holder.setText(R.id.tv_gx_time, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[0].end_time.toLong())) + holder.setText(R.id.tv_gx_time2, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[1].end_time.toLong())) + holder.setText(R.id.tv_gx_time3, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[2].end_time.toLong())) + + holder.getView(R.id.user_nav1).setOnClickListener { + if (relation1.user_id1== SpUtil.getUserId()){ + // 点击第一个用户头像 + onItemClickListener?.onUserClick(relation1.user_id2.toString()) + }else { + // 点击第一个用户头像 + onItemClickListener?.onUserClick(relation1.user_id1.toString()) + } + } + + holder.getView(R.id.user_nav2).setOnClickListener { + if (relation2.user_id1== SpUtil.getUserId()) { + // 点击第二个用户头像 + onItemClickListener?.onUserClick(relation2.user_id2.toString()) + }else{ + onItemClickListener?.onUserClick(relation2.user_id1.toString()) + } + } + holder.getView(R.id.user_nav3).setOnClickListener { + if (relation3.user_id1== SpUtil.getUserId()) { + // 点击第三个用户头像 + onItemClickListener?.onUserClick(relation3.user_id2.toString()) + }else{ + onItemClickListener?.onUserClick(relation3.user_id1.toString()) + } + } + + } + } + } + } + } + } + + + + override fun convert( + holder: BaseViewHolder, + item: MultiItemEntity? + ) { + val viewType = getItemViewType(holder.layoutPosition - headerLayoutCount) + + when (viewType) { + + TYPE_NOCP_WITH_NAME, + TYPE_NOCP_WITH_NAME_AND_LIST-> { + val noCpItem = item as RelationBean.NoCpBean + convertNoCp(holder, noCpItem, viewType) + } + + else -> { + + } + } + } +} diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/RelationshipAdapter.java b/MainModule/src/main/java/com/xscm/modulemain/adapter/RelationshipAdapter.java index 1c0c794c..b92e3570 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/RelationshipAdapter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/RelationshipAdapter.java @@ -7,6 +7,7 @@ import com.chad.library.adapter.base.BaseQuickAdapter; import com.xscm.modulemain.R; import com.xscm.moduleutil.bean.RelationshipBean; import com.xscm.moduleutil.utils.ImageUtils; +import com.xscm.moduleutil.utils.MeHeadView; import com.xscm.moduleutil.utils.SpUtil; import com.xscm.moduleutil.utils.TimeUtils; @@ -26,26 +27,23 @@ public class RelationshipAdapter extends BaseQuickAdapter + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/activity_brief_introduction.xml b/MainModule/src/main/res/layout/activity_brief_introduction.xml index cbec4b07..1072fc5c 100644 --- a/MainModule/src/main/res/layout/activity_brief_introduction.xml +++ b/MainModule/src/main/res/layout/activity_brief_introduction.xml @@ -11,7 +11,8 @@ + android:layout_height="match_parent" + android:background="#F8F8F8"> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/fragment_bosom_friend.xml b/MainModule/src/main/res/layout/fragment_bosom_friend.xml new file mode 100644 index 00000000..6ef46f53 --- /dev/null +++ b/MainModule/src/main/res/layout/fragment_bosom_friend.xml @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/fragment_cirle_list.xml b/MainModule/src/main/res/layout/fragment_cirle_list.xml index aab00ded..e926affd 100644 --- a/MainModule/src/main/res/layout/fragment_cirle_list.xml +++ b/MainModule/src/main/res/layout/fragment_cirle_list.xml @@ -8,7 +8,8 @@ + android:layout_height="wrap_content" + android:paddingHorizontal="@dimen/dp_15"> - + - + + android:paddingHorizontal="@dimen/dp_15" /> \ No newline at end of file diff --git a/MainModule/src/main/res/layout/fragment_song_history.xml b/MainModule/src/main/res/layout/fragment_song_history.xml index 56e16661..086dc1cf 100644 --- a/MainModule/src/main/res/layout/fragment_song_history.xml +++ b/MainModule/src/main/res/layout/fragment_song_history.xml @@ -84,7 +84,7 @@ android:paddingTop="6dp" android:paddingEnd="12dp" android:paddingBottom="6dp" - android:text="上周" + android:text="本月" android:textColor="@color/white" android:textSize="12sp" /> diff --git a/MainModule/src/main/res/layout/fragment_user_hompage.xml b/MainModule/src/main/res/layout/fragment_user_hompage.xml index 010c11ba..371e2251 100644 --- a/MainModule/src/main/res/layout/fragment_user_hompage.xml +++ b/MainModule/src/main/res/layout/fragment_user_hompage.xml @@ -61,8 +61,6 @@ android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginStart="@dimen/dp_15" - android:layout_marginEnd="@dimen/dp_15" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_bosom_cp.xml b/MainModule/src/main/res/layout/item_bosom_cp.xml new file mode 100644 index 00000000..4d8be972 --- /dev/null +++ b/MainModule/src/main/res/layout/item_bosom_cp.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_bosom_cp_friend.xml b/MainModule/src/main/res/layout/item_bosom_cp_friend.xml new file mode 100644 index 00000000..eeed7b70 --- /dev/null +++ b/MainModule/src/main/res/layout/item_bosom_cp_friend.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_bosom_friend.xml b/MainModule/src/main/res/layout/item_bosom_friend.xml new file mode 100644 index 00000000..768cd96b --- /dev/null +++ b/MainModule/src/main/res/layout/item_bosom_friend.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_bosom_friend_details.xml b/MainModule/src/main/res/layout/item_bosom_friend_details.xml new file mode 100644 index 00000000..8f7e4b53 --- /dev/null +++ b/MainModule/src/main/res/layout/item_bosom_friend_details.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_relationship.xml b/MainModule/src/main/res/layout/item_relationship.xml index 03f40810..3082bd7e 100644 --- a/MainModule/src/main/res/layout/item_relationship.xml +++ b/MainModule/src/main/res/layout/item_relationship.xml @@ -3,118 +3,253 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_16" xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="@dimen/dp_92" + android:layout_marginTop="@dimen/dp_15" + android:background="@mipmap/icon_u_cp_bg" + app:layout_constraintTop_toBottomOf="@+id/tv_heartbeat"> - - + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + android:layout_alignParentEnd="true" + android:layout_marginEnd="12dp" + android:gravity="center" + android:paddingVertical="@dimen/dp_12"> - + android:layout_alignParentTop="true" + android:scaleType="fitCenter" + android:src="@mipmap/icon_cp_dele" /> + - - - - - - - - - - \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_relationship_list.xml b/MainModule/src/main/res/layout/item_relationship_list.xml new file mode 100644 index 00000000..11246b0b --- /dev/null +++ b/MainModule/src/main/res/layout/item_relationship_list.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainModule/src/main/res/layout/item_requested_song.xml b/MainModule/src/main/res/layout/item_requested_song.xml index f4211b48..b0b3da07 100644 --- a/MainModule/src/main/res/layout/item_requested_song.xml +++ b/MainModule/src/main/res/layout/item_requested_song.xml @@ -5,7 +5,8 @@ xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_margin="@dimen/dp_12" - android:background="@drawable/bg_r8_262431"> + android:background="@drawable/bg_r8_c51a0c" + android:backgroundTint="#12bbb9c6"> + + + + + + + + diff --git a/MainModule/src/main/res/layout/user_top.xml b/MainModule/src/main/res/layout/user_top.xml index 66baa687..f0557652 100644 --- a/MainModule/src/main/res/layout/user_top.xml +++ b/MainModule/src/main/res/layout/user_top.xml @@ -309,7 +309,8 @@ android:background="@mipmap/icon_dialog_u_cp_bg" app:layout_constraintBottom_toTopOf="@+id/view" app:layout_constraintStart_toStartOf="@+id/tv_name" - app:layout_constraintTop_toBottomOf="@+id/custom_tab_layout"> + app:layout_constraintTop_toBottomOf="@+id/custom_tab_layout" + tools:visibility="visible"> + + \ No newline at end of file diff --git a/MainModule/src/main/res/mipmap-hdpi/bj_heartbeat_ts.webp b/MainModule/src/main/res/mipmap-hdpi/bj_heartbeat_ts.webp new file mode 100644 index 00000000..c5252e4e Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/bj_heartbeat_ts.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/bj_intimate.webp b/MainModule/src/main/res/mipmap-hdpi/bj_intimate.webp new file mode 100644 index 00000000..3c121659 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/bj_intimate.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_cl.png b/MainModule/src/main/res/mipmap-hdpi/but_cl.png deleted file mode 100644 index 26c9181c..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_cl.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_cl.webp b/MainModule/src/main/res/mipmap-hdpi/but_cl.webp new file mode 100644 index 00000000..c6ffbac2 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_cl.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_corner.png b/MainModule/src/main/res/mipmap-hdpi/but_corner.png deleted file mode 100644 index 0b8f5d89..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_corner.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_corner.webp b/MainModule/src/main/res/mipmap-hdpi/but_corner.webp new file mode 100644 index 00000000..cc31d4fb Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_corner.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_ly.png b/MainModule/src/main/res/mipmap-hdpi/but_ly.png deleted file mode 100644 index 550a17d8..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_ly.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_ly.webp b/MainModule/src/main/res/mipmap-hdpi/but_ly.webp new file mode 100644 index 00000000..4eef57e4 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_ly.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_me_playlist.png b/MainModule/src/main/res/mipmap-hdpi/but_me_playlist.png deleted file mode 100644 index 78dba2d9..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_me_playlist.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_me_playlist.webp b/MainModule/src/main/res/mipmap-hdpi/but_me_playlist.webp new file mode 100644 index 00000000..b13661d4 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_me_playlist.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_singer.png b/MainModule/src/main/res/mipmap-hdpi/but_singer.png deleted file mode 100644 index 751e54e9..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_singer.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_singer.webp b/MainModule/src/main/res/mipmap-hdpi/but_singer.webp new file mode 100644 index 00000000..bbeaec27 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_singer.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_st.png b/MainModule/src/main/res/mipmap-hdpi/but_st.png deleted file mode 100644 index 03e65f09..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_st.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_st.webp b/MainModule/src/main/res/mipmap-hdpi/but_st.webp new file mode 100644 index 00000000..64bc4b23 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_st.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_tz.png b/MainModule/src/main/res/mipmap-hdpi/but_tz.png deleted file mode 100644 index e313c6d5..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/but_tz.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/but_tz.webp b/MainModule/src/main/res/mipmap-hdpi/but_tz.webp new file mode 100644 index 00000000..5ce7dc90 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/but_tz.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/card_corner_background.png b/MainModule/src/main/res/mipmap-hdpi/card_corner_background.png deleted file mode 100644 index b72c2af6..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/card_corner_background.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/card_corner_background.webp b/MainModule/src/main/res/mipmap-hdpi/card_corner_background.webp new file mode 100644 index 00000000..e953e59a Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/card_corner_background.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_corner_status.png b/MainModule/src/main/res/mipmap-hdpi/icon_corner_status.png deleted file mode 100644 index fd5bfcc4..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/icon_corner_status.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_corner_status.webp b/MainModule/src/main/res/mipmap-hdpi/icon_corner_status.webp new file mode 100644 index 00000000..fba2a0b5 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_corner_status.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_cp_dele.webp b/MainModule/src/main/res/mipmap-hdpi/icon_cp_dele.webp new file mode 100644 index 00000000..897d9678 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_cp_dele.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_cp_zd.webp b/MainModule/src/main/res/mipmap-hdpi/icon_cp_zd.webp new file mode 100644 index 00000000..5c5531a6 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_cp_zd.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_gd.webp b/MainModule/src/main/res/mipmap-hdpi/icon_gd.webp new file mode 100644 index 00000000..343d33f2 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_gd.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_gx_bj.webp b/MainModule/src/main/res/mipmap-hdpi/icon_gx_bj.webp new file mode 100644 index 00000000..04881977 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_gx_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_heartbeat.webp b/MainModule/src/main/res/mipmap-hdpi/icon_heartbeat.webp new file mode 100644 index 00000000..d7ba3217 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_heartbeat.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_initimate_ts.webp b/MainModule/src/main/res/mipmap-hdpi/icon_initimate_ts.webp new file mode 100644 index 00000000..6a2bd364 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_initimate_ts.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/icon_u_cp_bg.webp b/MainModule/src/main/res/mipmap-hdpi/icon_u_cp_bg.webp new file mode 100644 index 00000000..51b3b2f7 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/icon_u_cp_bg.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/im_friend_back.webp b/MainModule/src/main/res/mipmap-hdpi/im_friend_back.webp new file mode 100644 index 00000000..fcfe943b Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/im_friend_back.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/image_gift_w.webp b/MainModule/src/main/res/mipmap-hdpi/image_gift_w.webp new file mode 100644 index 00000000..3c8b2a52 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/image_gift_w.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/jukebox_room_mask.png b/MainModule/src/main/res/mipmap-hdpi/jukebox_room_mask.png deleted file mode 100644 index 556a433f..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/jukebox_room_mask.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/jukebox_room_mask.webp b/MainModule/src/main/res/mipmap-hdpi/jukebox_room_mask.webp new file mode 100644 index 00000000..72a08ca9 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/jukebox_room_mask.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/me_corner.png b/MainModule/src/main/res/mipmap-hdpi/me_corner.png deleted file mode 100644 index ee18e7c7..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/me_corner.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/me_corner.webp b/MainModule/src/main/res/mipmap-hdpi/me_corner.webp new file mode 100644 index 00000000..1cb52e47 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/me_corner.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/me_corner_bj.png b/MainModule/src/main/res/mipmap-hdpi/me_corner_bj.png deleted file mode 100644 index a7b38fe7..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/me_corner_bj.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/me_corner_bj.webp b/MainModule/src/main/res/mipmap-hdpi/me_corner_bj.webp new file mode 100644 index 00000000..abc3ff06 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/me_corner_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-hdpi/singer_bj.png b/MainModule/src/main/res/mipmap-hdpi/singer_bj.png deleted file mode 100644 index 0a441da0..00000000 Binary files a/MainModule/src/main/res/mipmap-hdpi/singer_bj.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-hdpi/singer_bj.webp b/MainModule/src/main/res/mipmap-hdpi/singer_bj.webp new file mode 100644 index 00000000..f6546b66 Binary files /dev/null and b/MainModule/src/main/res/mipmap-hdpi/singer_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/bj_heartbeat_ts.webp b/MainModule/src/main/res/mipmap-xhdpi/bj_heartbeat_ts.webp new file mode 100644 index 00000000..d9bc51aa Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/bj_heartbeat_ts.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/bj_intimate.webp b/MainModule/src/main/res/mipmap-xhdpi/bj_intimate.webp new file mode 100644 index 00000000..3caf188f Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/bj_intimate.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_cl.png b/MainModule/src/main/res/mipmap-xhdpi/but_cl.png deleted file mode 100644 index 09a7bb50..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_cl.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_cl.webp b/MainModule/src/main/res/mipmap-xhdpi/but_cl.webp new file mode 100644 index 00000000..e721c895 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_cl.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_corner.png b/MainModule/src/main/res/mipmap-xhdpi/but_corner.png deleted file mode 100644 index c528c06d..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_corner.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_corner.webp b/MainModule/src/main/res/mipmap-xhdpi/but_corner.webp new file mode 100644 index 00000000..df3debd6 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_corner.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_ly.png b/MainModule/src/main/res/mipmap-xhdpi/but_ly.png deleted file mode 100644 index d254fa64..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_ly.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_ly.webp b/MainModule/src/main/res/mipmap-xhdpi/but_ly.webp new file mode 100644 index 00000000..5978e1b0 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_ly.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_me_playlist.png b/MainModule/src/main/res/mipmap-xhdpi/but_me_playlist.png deleted file mode 100644 index 38d17d28..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_me_playlist.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_me_playlist.webp b/MainModule/src/main/res/mipmap-xhdpi/but_me_playlist.webp new file mode 100644 index 00000000..4f5e81b8 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_me_playlist.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_singer.png b/MainModule/src/main/res/mipmap-xhdpi/but_singer.png deleted file mode 100644 index 8221958d..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_singer.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_singer.webp b/MainModule/src/main/res/mipmap-xhdpi/but_singer.webp new file mode 100644 index 00000000..e16e8107 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_singer.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_st.png b/MainModule/src/main/res/mipmap-xhdpi/but_st.png deleted file mode 100644 index affa9bf8..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_st.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_st.webp b/MainModule/src/main/res/mipmap-xhdpi/but_st.webp new file mode 100644 index 00000000..fecc5812 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_st.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_tz.png b/MainModule/src/main/res/mipmap-xhdpi/but_tz.png deleted file mode 100644 index 7240b305..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/but_tz.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/but_tz.webp b/MainModule/src/main/res/mipmap-xhdpi/but_tz.webp new file mode 100644 index 00000000..25317cc4 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/but_tz.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/card_corner_background.png b/MainModule/src/main/res/mipmap-xhdpi/card_corner_background.png deleted file mode 100644 index 2d960d06..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/card_corner_background.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/card_corner_background.webp b/MainModule/src/main/res/mipmap-xhdpi/card_corner_background.webp new file mode 100644 index 00000000..ba2acba5 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/card_corner_background.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_corner_status.png b/MainModule/src/main/res/mipmap-xhdpi/icon_corner_status.png deleted file mode 100644 index d3916e4d..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/icon_corner_status.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_corner_status.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_corner_status.webp new file mode 100644 index 00000000..dbf7f37a Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_corner_status.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_cp_dele.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_cp_dele.webp new file mode 100644 index 00000000..32be7acb Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_cp_dele.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_cp_zd.png b/MainModule/src/main/res/mipmap-xhdpi/icon_cp_zd.png new file mode 100644 index 00000000..66063e89 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_cp_zd.png differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_gd.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_gd.webp new file mode 100644 index 00000000..712837be Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_gd.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_gx_bj.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_gx_bj.webp new file mode 100644 index 00000000..25b6f88a Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_gx_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_heartbeat.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_heartbeat.webp new file mode 100644 index 00000000..b64462fd Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_heartbeat.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_initimate_ts.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_initimate_ts.webp new file mode 100644 index 00000000..584db001 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_initimate_ts.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/icon_u_cp_bg.webp b/MainModule/src/main/res/mipmap-xhdpi/icon_u_cp_bg.webp new file mode 100644 index 00000000..62dde2cf Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/icon_u_cp_bg.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/im_friend_back.webp b/MainModule/src/main/res/mipmap-xhdpi/im_friend_back.webp new file mode 100644 index 00000000..b15854b4 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/im_friend_back.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/image_gift_w.webp b/MainModule/src/main/res/mipmap-xhdpi/image_gift_w.webp new file mode 100644 index 00000000..5ac53931 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/image_gift_w.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/jukebox_room_mask.png b/MainModule/src/main/res/mipmap-xhdpi/jukebox_room_mask.png deleted file mode 100644 index 34ac1fae..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/jukebox_room_mask.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/jukebox_room_mask.webp b/MainModule/src/main/res/mipmap-xhdpi/jukebox_room_mask.webp new file mode 100644 index 00000000..05381e8c Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/jukebox_room_mask.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/me_corner.png b/MainModule/src/main/res/mipmap-xhdpi/me_corner.png deleted file mode 100644 index cc2b5b02..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/me_corner.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/me_corner.webp b/MainModule/src/main/res/mipmap-xhdpi/me_corner.webp new file mode 100644 index 00000000..e9d36a1a Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/me_corner.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/me_corner_bj.png b/MainModule/src/main/res/mipmap-xhdpi/me_corner_bj.png deleted file mode 100644 index 01f10322..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/me_corner_bj.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/me_corner_bj.webp b/MainModule/src/main/res/mipmap-xhdpi/me_corner_bj.webp new file mode 100644 index 00000000..e7ad41a7 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/me_corner_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/singer_bj.png b/MainModule/src/main/res/mipmap-xhdpi/singer_bj.png deleted file mode 100644 index a832b0df..00000000 Binary files a/MainModule/src/main/res/mipmap-xhdpi/singer_bj.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xhdpi/singer_bj.webp b/MainModule/src/main/res/mipmap-xhdpi/singer_bj.webp new file mode 100644 index 00000000..d8366ba0 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xhdpi/singer_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/bj_heartbeat_ts.webp b/MainModule/src/main/res/mipmap-xxhdpi/bj_heartbeat_ts.webp new file mode 100644 index 00000000..ef3bf28c Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/bj_heartbeat_ts.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/bj_intimate.webp b/MainModule/src/main/res/mipmap-xxhdpi/bj_intimate.webp new file mode 100644 index 00000000..ad750479 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/bj_intimate.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_cl.png b/MainModule/src/main/res/mipmap-xxhdpi/but_cl.png deleted file mode 100644 index 6cac2f9f..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_cl.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_cl.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_cl.webp new file mode 100644 index 00000000..9debe8ad Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_cl.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_corner.png b/MainModule/src/main/res/mipmap-xxhdpi/but_corner.png deleted file mode 100644 index 6272adde..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_corner.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_corner.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_corner.webp new file mode 100644 index 00000000..557ab1b7 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_corner.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_ly.png b/MainModule/src/main/res/mipmap-xxhdpi/but_ly.png deleted file mode 100644 index d05fc09f..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_ly.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_ly.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_ly.webp new file mode 100644 index 00000000..8a7c71b7 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_ly.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_me_playlist.png b/MainModule/src/main/res/mipmap-xxhdpi/but_me_playlist.png deleted file mode 100644 index 00dac8f9..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_me_playlist.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_me_playlist.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_me_playlist.webp new file mode 100644 index 00000000..27177f4f Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_me_playlist.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_singer.png b/MainModule/src/main/res/mipmap-xxhdpi/but_singer.png deleted file mode 100644 index 8850698e..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_singer.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_singer.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_singer.webp new file mode 100644 index 00000000..cabb9cdd Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_singer.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_st.png b/MainModule/src/main/res/mipmap-xxhdpi/but_st.png deleted file mode 100644 index 35480528..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_st.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_st.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_st.webp new file mode 100644 index 00000000..de90301e Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_st.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_tz.png b/MainModule/src/main/res/mipmap-xxhdpi/but_tz.png deleted file mode 100644 index f9cb1b89..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/but_tz.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/but_tz.webp b/MainModule/src/main/res/mipmap-xxhdpi/but_tz.webp new file mode 100644 index 00000000..b9bae85d Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/but_tz.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/card_corner_background.png b/MainModule/src/main/res/mipmap-xxhdpi/card_corner_background.png deleted file mode 100644 index e76e25d7..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/card_corner_background.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/card_corner_background.webp b/MainModule/src/main/res/mipmap-xxhdpi/card_corner_background.webp new file mode 100644 index 00000000..db536a18 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/card_corner_background.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_corner_status.png b/MainModule/src/main/res/mipmap-xxhdpi/icon_corner_status.png deleted file mode 100644 index e65a713a..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/icon_corner_status.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_corner_status.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_corner_status.webp new file mode 100644 index 00000000..50ccae13 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_corner_status.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_cp_dele.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_cp_dele.webp new file mode 100644 index 00000000..18200bc6 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_cp_dele.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_cp_zd.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_cp_zd.webp new file mode 100644 index 00000000..202ffcec Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_cp_zd.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_gd.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_gd.webp new file mode 100644 index 00000000..f960818c Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_gd.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_gx_bj.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_gx_bj.webp new file mode 100644 index 00000000..c0458d1d Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_gx_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_heartbeat.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_heartbeat.webp new file mode 100644 index 00000000..60eeed3c Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_heartbeat.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_initimate_ts.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_initimate_ts.webp new file mode 100644 index 00000000..ec6fe5ed Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_initimate_ts.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/icon_u_cp_bg.webp b/MainModule/src/main/res/mipmap-xxhdpi/icon_u_cp_bg.webp new file mode 100644 index 00000000..bf611e75 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/icon_u_cp_bg.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/im_friend_back.webp b/MainModule/src/main/res/mipmap-xxhdpi/im_friend_back.webp new file mode 100644 index 00000000..6d41fae4 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/im_friend_back.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/image_gift_w.webp b/MainModule/src/main/res/mipmap-xxhdpi/image_gift_w.webp new file mode 100644 index 00000000..bc42cb8c Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/image_gift_w.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/jukebox_room_mask.png b/MainModule/src/main/res/mipmap-xxhdpi/jukebox_room_mask.png deleted file mode 100644 index 96fb4d95..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/jukebox_room_mask.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/jukebox_room_mask.webp b/MainModule/src/main/res/mipmap-xxhdpi/jukebox_room_mask.webp new file mode 100644 index 00000000..0820c129 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/jukebox_room_mask.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/me_corner.png b/MainModule/src/main/res/mipmap-xxhdpi/me_corner.png deleted file mode 100644 index 622cf6d0..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/me_corner.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/me_corner.webp b/MainModule/src/main/res/mipmap-xxhdpi/me_corner.webp new file mode 100644 index 00000000..9ff5e6ff Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/me_corner.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/me_corner_bj.png b/MainModule/src/main/res/mipmap-xxhdpi/me_corner_bj.png deleted file mode 100644 index bb0c3778..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/me_corner_bj.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/me_corner_bj.webp b/MainModule/src/main/res/mipmap-xxhdpi/me_corner_bj.webp new file mode 100644 index 00000000..f1ff1a10 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/me_corner_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/singer_bj.png b/MainModule/src/main/res/mipmap-xxhdpi/singer_bj.png deleted file mode 100644 index 5a040002..00000000 Binary files a/MainModule/src/main/res/mipmap-xxhdpi/singer_bj.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxhdpi/singer_bj.webp b/MainModule/src/main/res/mipmap-xxhdpi/singer_bj.webp new file mode 100644 index 00000000..697ac1b1 Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxhdpi/singer_bj.webp differ diff --git a/MainModule/src/main/res/mipmap-xxxhdpi/me_head_bg.png b/MainModule/src/main/res/mipmap-xxxhdpi/me_head_bg.png deleted file mode 100644 index 317e668a..00000000 Binary files a/MainModule/src/main/res/mipmap-xxxhdpi/me_head_bg.png and /dev/null differ diff --git a/MainModule/src/main/res/mipmap-xxxhdpi/me_head_bg.webp b/MainModule/src/main/res/mipmap-xxxhdpi/me_head_bg.webp new file mode 100644 index 00000000..93aea53a Binary files /dev/null and b/MainModule/src/main/res/mipmap-xxxhdpi/me_head_bg.webp differ