diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/adapter/AppUpdateDialog.java b/BaseModule/src/main/java/com/xscm/moduleutil/adapter/AppUpdateDialog.java index c41830a2..8ddd1da5 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/adapter/AppUpdateDialog.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/adapter/AppUpdateDialog.java @@ -74,8 +74,7 @@ public class AppUpdateDialog extends BaseDialog implemen mProgressDialog.setCanceledOnTouchOutside(false); mProgressDialog.setMessage("下载中请稍等!!!"); mProgressDialog.show(); - DownloadUtil downloadUtil = new DownloadUtil(getContext()); - downloadUtil.downloadFile(appUpdateModel.getUrl(), this); + DownloadUtil downloadUtil = new DownloadUtil(getContext(),appUpdateModel.getUrl(),this); } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/adapter/CirleListAdapter.java b/BaseModule/src/main/java/com/xscm/moduleutil/adapter/CirleListAdapter.java index ae5a6a27..b0a01ac7 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/adapter/CirleListAdapter.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/adapter/CirleListAdapter.java @@ -274,9 +274,11 @@ public class CirleListAdapter extends BaseQuickAdapter(adapter); sGiftModel = gift; @@ -129,7 +130,7 @@ public class GiftRoomAdapter extends BaseAdapter { viewHolder.tv_gift_price = (TextView) convertView.findViewById(R.id.tv_gift_price); viewHolder.iv_gift_pic = (ImageView) convertView.findViewById(R.id.iv_gift_pic); viewHolder.ivDownOn = (ImageView) convertView.findViewById(R.id.iv_down_on); - viewHolder.iv_gift_select= (ImageView) convertView.findViewById(R.id.iv_gift_select); + viewHolder.iv_gift_select = (ImageView) convertView.findViewById(R.id.iv_gift_select); // im_heart现在位于顶层布局中 viewHolder.im_heart = (ImageView) convertView.findViewById(R.id.im_heartssss); @@ -140,25 +141,32 @@ public class GiftRoomAdapter extends BaseAdapter { viewHolder.item_layout.setOnClickListener(v -> { // RoonGiftModel clickedModel = (RoonGiftModel) v.getTag(); - if (giftModel.getIs_lock()==0) { + if (giftModel.getIs_lock() == 0) { EventBus.getDefault().post(new RoomGiftClickToEvent(this, giftModel, 1)); - }else if (giftModel.getIs_lock()==1){ + } else if (giftModel.getIs_lock() == 1) { ToastUtils.show("当前属于爵位礼物,请开通爵位"); } }); - if (giftModel.getIs_lock()==0){ + if (giftModel.getIs_lock() == 0) { viewHolder.iv_gift_select.setVisibility(GONE); - }else { + } else { viewHolder.iv_gift_select.setVisibility(VISIBLE); } - if (giftModel.getIs_cp()==0) {//这是cp礼物 - viewHolder.im_heart.setVisibility(GONE); - }else { + if (giftModel.getIs_cp() == 0 && giftModel.getIs_teacher() == 0 ) {//这是cp礼物 + viewHolder.im_heart.setVisibility(GONE); + } else { if (viewHolder.im_heart != null) { viewHolder.im_heart.setVisibility(VISIBLE); + if (giftModel.getIs_cp() == 1) { + viewHolder.im_heart.setImageResource(R.mipmap.icon_heart); + }else if (giftModel.getIs_teacher() == 1) { + viewHolder.im_heart.setImageResource(R.mipmap.icon_teacher); + } } } + + /* * 在给View绑定显示的数据时,计算正确的position = position + curIndex * pageSize, */ diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/adapter/GiftTwoDetailsFragment.java b/BaseModule/src/main/java/com/xscm/moduleutil/adapter/GiftTwoDetailsFragment.java index 8b6e265e..77c6c65b 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/adapter/GiftTwoDetailsFragment.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/adapter/GiftTwoDetailsFragment.java @@ -297,12 +297,18 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment gift_box_list; - private TaskDataBean tasks; + private List tasks; + @Data public static class GiftBean { // private String giftName; //初级礼盒、高级礼盒 @@ -21,10 +23,25 @@ public class GiftBoxBean { // private String giftTypeNumber; //当前的百分比 // private String giftTypeStatus; //是否已经可以 + + /*{ + "id":2, + "name":"高级礼盒", + "title":"最高可获得10000金币", + "icon":"", + "highest_gain":"10000", + "meet":"300", + "unlock_progress":0, + "all_number":"1", + "taday_number":0, + "taday_number_left":1, + "status":0, + "status_str":"未解锁" + }*/ private String id;//礼盒ID private String name;//礼盒名称 private String title; //标题 - private String icon ;//图标 + private String icon;//图标 private String highest_gain;//最高获得金币数 private String meet;//满多少金币可抽 private String unlock_progress;// //解锁进度 @@ -37,25 +54,62 @@ public class GiftBoxBean { @Data public static class TaskDataBean { - private List daily_tasks; - private List daily_tasks_special; - private List usual_tasks; - private List teacher_tasks; + private List task_list; +// private List daily_tasks_special; +// private List usual_tasks; +// private List teacher_tasks; + + private int task_type_id; + private String task_type_name; @Data public static class DailyTasksBean { - private int task_id;////任务Id - private String task_name;//任务名称 - private String icon;//图标 - private int gold_reward; //奖励金币 - private int target_quantity;//目标完成数量 - private int task_type;//任务类型 1每日任务 2每日特殊任务 3平台常规任务 - private int task_status;//任务状态:1完成 2去领取 3已领取 - private String task_type_str; //任务状态 - private int processing_type;//跳转状态: - private String processing_type_str;//跳转状态 - private String from_id; - private int reward_type;//1:金币 2:钻石 + + /* { + "task_id":20, + "icon":null, + "task_name":"每日在房间时长 15 分钟(0/15)", + "target_quantity":900, + "task_type":2, + "jump_type":4, + "tasks_bag_id":0, + "task_status":1, + "task_type_str":"去完成", + "jump_type_str":"跳转房间", + "from_id":6040, + "is_time":1, + "processing_type":2, + "processing_type_str":"去观看", + "reward_str":"25金币,笨笨狗x1, + 仙女之星头像框, + 三八大杠" + }*/ + + private int task_id;////任务Id + private String icon;//图标 + private String task_name;//任务名称 + private int target_quantity;//目标完成数量 + private int task_type;//任务类型 1每日任务 2每日特殊任务 3平台常规任务 + /** + * 0 不跳转 + * 1 跳转实名 + * 2 跳转我的相册 + * 3 跳转绑定管理 + * 4 跳转房间 + * 5 跳转申请加入公会 + * 6 跳转充值 + */ + private int jump_type; //跳转类型 + private int tasks_bag_id; //任务礼盒ID + private int task_status;//任务状态:1完成 2去领取 3已领取 + private String task_type_str; //任务状态 + private String jump_type_str; //跳转类型提示 + private String from_id; + private int is_time; + private int processing_type;//跳转状态: + private String processing_type_str;//跳转状态 + private String reward_str;//1:奖励 + private String student_id;//徒弟ID } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/PlaceholderBean.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/PlaceholderBean.java index 9d152ff6..8bb15839 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/PlaceholderBean.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/PlaceholderBean.java @@ -58,7 +58,7 @@ public class PlaceholderBean { private String nickname1; private String avatar; private String total; - private String rank; + private String rank=""; private List icon; private String room_name; private String room_id; diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java index 8925e090..c7a31fec 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoomMessageEvent.java @@ -111,6 +111,9 @@ public class RoomMessageEvent extends BaseEvent { private String sign_day;//被签约天数 private String current_body_value;//被签约身价 + private String status = ""; + private String from_id = ""; + } @Data diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoonGiftModel.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoonGiftModel.java index 9350c3cb..641e19da 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoonGiftModel.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/RoonGiftModel.java @@ -35,7 +35,8 @@ public class RoonGiftModel { private int gift_bag;//10:天空之境 11:岁月之城 12:时空之巅 private int is_lock;//爵位礼物 0:不锁 1:锁 - private int is_cp;//1:是 0:不是 + private int is_cp;//1:是 0:不是 是不是cp心动礼物 + private int is_teacher;//1:是 0:不是 是不是师徒礼物 public boolean isCan_send_self() { if ( isManghe()) { return true; diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/SignInData.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/SignInData.kt new file mode 100644 index 00000000..5310eb10 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/SignInData.kt @@ -0,0 +1,115 @@ +package com.xscm.moduleutil.bean + +import com.chad.library.adapter.base.entity.MultiItemEntity + +/** + * 项目名称:羽声语音 + * 时间:2025/12/12 10:35 + * 用途:签到实体类 + */ +class SignInData : MultiItemEntity{ + val TYPE_NORMAL: Int = 0 // 普通类型,使用day_sgin布局 + val TYPE_DOUBLE: Int = 1 // 双倍宽度类型,使用day_sgin2布局 + var viewType: Int = TYPE_NORMAL // 默认为普通类型 + + var day: Int = 0 //第几天 + var sign_in_date: String = "" //日期 + var sign_in_status: Int = 0 // 签到状态:1已签到 0未签到 + var sign_in_status_str: String = "" //已签到 + var is_today: Int = 0 //是否是当天 0否 1是 + var gift_name: String = "" //礼物名称 + var num: String = "" //数量 + var gift_price: Int = 0 //价格 + var type: Int = 0 //类型: 1金币 2礼物 3装扮 4钻石 + var base_image: String = "" //礼物图片 + override fun getItemType(): Int { + return viewType + } + + /* "gift_bag": [ + { + "day": 1, //第几天 + "sign_in_date": "2025-12-09", //日期 + "sign_in_status": 1, //签到状态:1已签到 0未签到 + "sign_in_status_str": "已签到", + "is_today": 0, //是否是当天 0否 1是 + "gift_name": "金币", //礼物名称 + "num": 1, //数量 + "gift_price": 1, //价格 + "type": 1, //类型: 1金币 2礼物 3装扮 4钻石 + "base_image": "https://test.vespa.qxyushen.top/static/image/icon/gold.png" //礼物图片 + }, + { + "day": 2, + "sign_in_date": "2025-12-10", + "sign_in_status": 1, + "sign_in_status_str": "已签到", + "is_today": 0, + "gift_name": "打工狗", + "num": "1 个", + "gift_price": "9", + "type": 2, + "base_image": "https://cos.xscmmidi.site/admin/3143tianxuanbanzhuangou_17615346376493.png" + }, + { + "day": 3, + "sign_in_date": "2025-12-11", + "sign_in_status": 1, + "sign_in_status_str": "已签到", + "is_today": 0, + "gift_name": "神皇", + "num": "3 天", + "gift_price": 30, + "type": 3, + "base_image": "https://midi01.oss-cn-beijing.aliyuncs.com/5544shenhuang_17579016149523.png" + }, + { + "day": 4, + "sign_in_date": "2025-12-12", + "sign_in_status": 1, + "sign_in_status_str": "已签到", + "is_today": 1, + "gift_name": "心动喷发", + "num": "2 个", + "gift_price": "100", + "type": 2, + "base_image": "https://cos.xscmmidi.site/admin/3300xindongpenfa_17615347008740.png" + }, + { + "day": 5, + "sign_in_date": "2025-12-13", + "sign_in_status": 0, + "sign_in_status_str": "未签到", + "is_today": 0, + "gift_name": "钻石", + "num": 20, + "gift_price": 1, + "type": 4, + "base_image": "https://test.vespa.qxyushen.top/static/image/icon/gold.png" + }, + { + "day": 6, + "sign_in_date": "2025-12-14", + "sign_in_status": 0, + "sign_in_status_str": "未签到", + "is_today": 0, + "gift_name": "王者之戒", + "num": "1 个", + "gift_price": "19", + "type": 2, + "base_image": "https://cos.xscmmidi.site/admin/5390wangzhezhijie_17615353361010.png" + }, + { + "day": 7, + "sign_in_date": "2025-12-15", + "sign_in_status": 0, + "sign_in_status_str": "未签到", + "is_today": 0, + "gift_name": "财源滚滚", + "num": "30 天", + "gift_price": 288, + "type": 3, + "base_image": "https://midi01.oss-cn-beijing.aliyuncs.com/2160caiyuangunguntouxiangkuang_17579008394073.png" + } + ]*/ +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/TasksSignStatus.kt b/BaseModule/src/main/java/com/xscm/moduleutil/bean/TasksSignStatus.kt new file mode 100644 index 00000000..acbbd77c --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/TasksSignStatus.kt @@ -0,0 +1,11 @@ +package com.xscm.moduleutil.bean + +/** + * 项目名称:羽声语音 + * 时间:2025/12/12 14:54 + * 用途:签到状态 + */ +class TasksSignStatus { + var status : Int=0 + var status_str: String="" +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserResultResp.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserResultResp.java index 8de669c3..44918597 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserResultResp.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/UserResultResp.java @@ -1,5 +1,7 @@ package com.xscm.moduleutil.bean; +import java.util.List; + import lombok.Data; @Data @@ -9,8 +11,9 @@ public class UserResultResp { private String user_id; private String user_code; private String nickname; - private String head_picture; - private String sex; + private String avatar; + private int sex; + private List icon; private String follow; private String fans_count; private String online_text; diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnline.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnline.java index 97e7dffd..92687185 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnline.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnline.java @@ -1,11 +1,12 @@ package com.xscm.moduleutil.bean.room; +import java.io.Serializable; import java.util.List; import lombok.Data; @Data -public class RoomOnline { +public class RoomOnline implements Serializable { private List on_pit;//麦上用户 private List off_pit;//麦下用户 diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnlineBean.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnlineBean.java index cfdaa6df..26920039 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnlineBean.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/room/RoomOnlineBean.java @@ -2,6 +2,7 @@ package com.xscm.moduleutil.bean.room; import com.chad.library.adapter.base.entity.MultiItemEntity; +import java.io.Serializable; import java.util.List; import lombok.Data; @@ -12,7 +13,7 @@ import lombok.Data; * @description: 房间在线列表 */ @Data -public class RoomOnlineBean implements MultiItemEntity { +public class RoomOnlineBean implements MultiItemEntity, Serializable { private int itemViewType; private String typeNames; private int user_id; diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/dialog/ConfirmDialog.java b/BaseModule/src/main/java/com/xscm/moduleutil/dialog/ConfirmDialog.java index f7d522d0..f9cd6c1b 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/dialog/ConfirmDialog.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/dialog/ConfirmDialog.java @@ -1,6 +1,7 @@ package com.xscm.moduleutil.dialog; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.os.Bundle; @@ -36,6 +37,7 @@ public class ConfirmDialog extends Dialog { private int countdownSeconds = 0; // 倒计时秒数 private CountDownTimer countDownTimer; // 倒计时对象 + private Context context; public ConfirmDialog(Context context, String title, String message, String positiveButtonText, String negativeButtonText, @@ -43,6 +45,7 @@ public class ConfirmDialog extends Dialog { View.OnClickListener negativeButtonClickListener, boolean isCountdownEnabled, int countdownSeconds) { super(context); + this.context = context; this.title = title; this.message = message; this.positiveButtonText = positiveButtonText; @@ -60,6 +63,7 @@ public class ConfirmDialog extends Dialog { View.OnClickListener negativeButtonClickListener, boolean isCountdownEnabled, int countdownSeconds) { super(context); + this.context = context; this.title = title; this.spannableMessage = spannableMessage; this.positiveButtonText = positiveButtonText; @@ -178,6 +182,12 @@ public class ConfirmDialog extends Dialog { countDownTimer.cancel(); // 取消倒计时 countDownTimer = null; } + if (context instanceof Activity) { + Activity activity = (Activity) context; + if (activity.isFinishing() || activity.isDestroyed()) { + return; // Don't try to dismiss if activity is gone + } + } super.dismiss(); } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/dialog/RechargeDialogFragment.java b/BaseModule/src/main/java/com/xscm/moduleutil/dialog/RechargeDialogFragment.java index d1704e08..58303c26 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/dialog/RechargeDialogFragment.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/dialog/RechargeDialogFragment.java @@ -25,9 +25,11 @@ import com.xscm.moduleutil.base.CommonAppContext; import com.xscm.moduleutil.bean.AppPay; import com.xscm.moduleutil.bean.BindType; import com.xscm.moduleutil.bean.RechargeBean; +import com.xscm.moduleutil.color.ThemeableDrawableUtils; import com.xscm.moduleutil.databinding.FragmentRechargeDialogBinding; import com.xscm.moduleutil.presenter.RechargeDialogContacts; import com.xscm.moduleutil.presenter.RechargeDialogPresenter; +import com.xscm.moduleutil.utils.ColorManager; import com.xscm.moduleutil.utils.SpUtil; import com.xscm.moduleutil.widget.PaymentUtil; import com.tencent.mm.opensdk.openapi.IWXAPI; @@ -142,6 +144,9 @@ public class RechargeDialogFragment extends BaseMvpDialogFragment dailyTasksReceive(@Field("task_id") String task_id); + Call dailyTasksReceive(@Field("task_id") String task_id,@Field("student_id") String student_id); @FormUrlEncoded @POST(Constants.dailyTasksComplete) @@ -498,6 +498,10 @@ public interface ApiServer { @POST(Constants.JOIN_ROOM) Call> roomGetIn(@Field("room_id") String roomId, @Field("password") String password); + @FormUrlEncoded + @POST(Constants.TASK_JUMP_ROOM) + Call> taskJumpRoomId(@Field("task_id") String taskId); + @FormUrlEncoded @POST(Constants.DELETE_ALBUM_IMAGE) Call> deleteAlbumImage(@Field("id") String id); @@ -915,4 +919,14 @@ public interface ApiServer { @FormUrlEncoded @POST(Constants.POST_SIGN_REFUSE) Call> signRefuse(@Field("room_id") String room_id); + + + @GET(Constants.GET_SIGN_IN_LIST) + Call>> signIn(); + + @GET(Constants.POST_DAILY_TASKS_SIGN) + Call> postDailyTasksSign(); + + @GET(Constants.POST_DAILY_TASKS_SIGN_STATUS) + Call> postDailyTasksSignStatus(); } 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 bbbea4b9..ebacc958 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -887,8 +887,8 @@ public class RetrofitClient { sApiServer.roomRanking(type).compose(new DefaultTransformer<>()).subscribe(observer); } else if (ranking_type.equals("1") || ranking_type.equals("2")) { sApiServer.wealthRanking(ranking_type, type).compose(new DefaultTransformer<>()).subscribe(observer); - } else if (ranking_type.equals("3")) { - sApiServer.loveRanking(type).compose(new DefaultTransformer<>()).subscribe(observer); + } else if (ranking_type.equals("3")) {//2025年12月11日14:57:44,原是传递的type,现在修改成0.只是将真爱榜变成心动榜 + sApiServer.loveRanking("0").compose(new DefaultTransformer<>()).subscribe(observer); } else if (ranking_type.equals("4")) { sApiServer.guildRanking().compose(new DefaultTransformer<>()).subscribe(observer); } @@ -921,6 +921,8 @@ public class RetrofitClient { BaseModel> baseModel = response.body(); if (baseModel.getCode() == 1) { observer.onNext(baseModel.getData()); + }else if (baseModel.getCode() == 0) { + observer.onNext(new ArrayList<>()); } } } @@ -940,6 +942,8 @@ public class RetrofitClient { BaseModel> baseModel = response.body(); if (baseModel.getCode() == 1) { observer.onNext(baseModel.getData()); + }else if (baseModel.getCode() == 0) { + observer.onNext(new ArrayList<>()); } } } @@ -961,7 +965,7 @@ public class RetrofitClient { if (baseModel.getCode() == 1) { observer.onNext(baseModel.getData()); } else { - observer.onNext(null); +// observer.onNext(null); } } } @@ -982,7 +986,7 @@ public class RetrofitClient { if (baseModel.getCode() == 1) { observer.onNext(baseModel.getMsg()); } else { - observer.onNext(null); +// observer.onNext(null); } } } @@ -1058,8 +1062,8 @@ public class RetrofitClient { sApiServer.dailyTasksOpenBox(gift_box_id).compose(new DefaultTransformer<>()).subscribe(observer); } - public void dailyTasksReceive(String task_id, BaseObserver observer) { - sApiServer.dailyTasksReceive(task_id).enqueue(new Callback() { + public void dailyTasksReceive(String task_id,String student_id, BaseObserver observer) { + sApiServer.dailyTasksReceive(task_id,student_id).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { @@ -2277,6 +2281,26 @@ public class RetrofitClient { }); } + public void taskJumpRoomId(String taskId, BaseObserver observer) { + sApiServer.taskJumpRoomId(taskId).enqueue(new Callback>() { + + @Override + public void onResponse(Call> call, Response> response) { + if (response.code() == 200) { + BaseModel stringBaseModel = response.body(); + if (stringBaseModel.getCode() == 1) { + observer.onNext(stringBaseModel.getData()); + } + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }); + } + public void updatePassword(String roomId, String password, BaseObserver observer) { sApiServer.updatePassword(roomId, password).enqueue(new Callback>() { @@ -4913,6 +4937,83 @@ public class RetrofitClient { } } + public void signIn(BaseObserver> observer) { + sApiServer.signIn().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()!=null ? baseModel.getData() : new ArrayList()); + }else if (baseModel.getCode()==0){ + com.hjq.toast.ToastUtils.show(baseModel.getMsg()); + }else if (baseModel.getCode()==301){ + try { + CommonAppContext.getInstance().clearLoginInfo(); + ToastUtils.showShort(baseModel.getMsg()); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + }else { + LogUtils.e("signIn",response.errorBody()); + } + } + + @Override + public void onFailure(Call>> call, Throwable t) { + LogUtils.e("signIn", t.fillInStackTrace()); + } + }); + + } + public void dailyTasksSign(BaseObserver observer) { + sApiServer.postDailyTasksSign().enqueue(new Callback>(){ + + @Override + public void onResponse(Call> call, Response> response) { + onNextRetu(response, observer); + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("signIn", t.fillInStackTrace()); + } + }); + + } + public void tasksSignStatus(BaseObserver observer) { + sApiServer.postDailyTasksSignStatus().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()==0){ + com.hjq.toast.ToastUtils.show(baseModel.getMsg()); + }else if (baseModel.getCode()==301){ + try { + CommonAppContext.getInstance().clearLoginInfo(); + ToastUtils.showShort(baseModel.getMsg()); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + }else { + LogUtils.e("postDailyTasksSignStatus",response.errorBody()); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + LogUtils.e("postDailyTasksSignStatus", t.fillInStackTrace()); + } + }); + + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageListenerSingleton.java b/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageListenerSingleton.java index 7c21e43b..4ef33b50 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageListenerSingleton.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/listener/MessageListenerSingleton.java @@ -17,6 +17,7 @@ import com.xscm.moduleutil.event.RoomJoinMountModel; import com.xscm.moduleutil.event.UnreadCountEvent; import com.xscm.moduleutil.http.RetrofitClient; import com.xscm.moduleutil.rtc.MusicPlayBean; +import com.xscm.moduleutil.utils.CustomMsgCode; import com.xscm.moduleutil.utils.SpUtil; import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener; import com.tencent.imsdk.v2.V2TIMCallback; @@ -66,6 +67,8 @@ public class MessageListenerSingleton { private final Map> cachedMessages = new ConcurrentHashMap<>(); private final Set joinedRooms = ConcurrentHashMap.newKeySet(); + private OnMsgTaskListener onMsgTaskListener; + // private boolean listenersAdded = false; // 标记监听器是否已添加 // 1. 添加新的监听器接口 public interface PublicScreenMessageListener { @@ -321,6 +324,10 @@ public class MessageListenerSingleton { if (event.getMsgType() == 130 || event.getMsgType() == 131) { // EventBus.getDefault().post(event); RetrofitClient.getInstance().getCpListener().onReceiveMsg(event); + } else if (event.getMsgType() == CustomMsgCode.INSTANCE.getCODE_TASK_APPRENTICE_JOIN_ROOM()) { + if (onMsgTaskListener != null) { + onMsgTaskListener.onMsgTask(event); + } } else { notifyMessageReceived(event); } @@ -400,7 +407,7 @@ public class MessageListenerSingleton { // 使用默认解析 event = GsonUtils.fromJson(message, RoomMessageEvent.class); } - LogUtils.e("收到群自定义消息:"+mRoomId+"===" + event); + LogUtils.e("收到群自定义消息:" + mRoomId + "===" + event); // event = GsonUtils.fromJson(message, RoomMessageEvent.class); } catch (Exception e) { // 处理 JSON 解析过程中可能出现的异常,例如记录日志 @@ -608,6 +615,30 @@ public class MessageListenerSingleton { } + + // TODO: 2025/11/19 添加发送公共方法,messageType:发送的type;message:发送的内容 userId:发送给谁 + public void sendCustomC2CMessage(int messageType, String userId,RoomMessageEvent.T text) { + text.setFromUserInfo(SpUtil.getUserInfo()); + LogUtils.e("发送消息", "messageType:" + messageType + "\nuserId:" + userId + "\ntext:" + text,toString()); + RoomMessageEvent roomMessageEvent = new RoomMessageEvent(messageType, mRoomId, text); + String json = com.blankj.utilcode.util.GsonUtils.toJson(roomMessageEvent); + // 转换为 byte[] + byte[] binaryData = json.getBytes(StandardCharsets.UTF_8); + + // 创建自定义群消息 + V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData); + v2TIMMessage.setExcludedFromUnreadCount(true); + v2TIMMessage.setExcludedFromContentModeration(true); +// v2TIMMessage.setNeedReadReceipt(true); +// +// // 发送消息 + V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH, + true, + null, + sendCallback); + + } + public void sendCustomC2CMessage125(String userId, byte[] binaryData) { // 创建自定义群消息 V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData); @@ -664,4 +695,13 @@ public class MessageListenerSingleton { public interface OnMessageReceivedListener { void onMessageReceived(RoomMessageEvent message); } + + + public void setOnMsgTaskListener(OnMsgTaskListener listener) { + this.onMsgTaskListener = listener; + } + + public interface OnMsgTaskListener { + void onMsgTask(RoomMessageEvent message); + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/CustomMsgCode.kt b/BaseModule/src/main/java/com/xscm/moduleutil/utils/CustomMsgCode.kt new file mode 100644 index 00000000..1ac523e2 --- /dev/null +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/CustomMsgCode.kt @@ -0,0 +1,8 @@ +package com.xscm.moduleutil.utils + +object CustomMsgCode { + val CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID = "132" + val CODE_TASK_APPRENTICE_JOIN_ROOM = 132 + val CODE_TASK_APPRENTICE_JOIN_ROOM_MSG = "您的师傅邀请您进入房间,您是否同意?" + val CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE = "您的徒弟拒绝了您的邀请。" +} \ No newline at end of file diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/DateSelectDialog.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/DateSelectDialog.java index 40431a5f..8fb3f577 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/DateSelectDialog.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/DateSelectDialog.java @@ -135,7 +135,7 @@ public class DateSelectDialog extends BaseBottomSheetDialog getYear() { int currentYear = TimeUtils.getYear(); int minYear = currentYear - 100; // 最小年份设为100年前 - int maxYear = currentYear - 16; // 最大年份设为16年前 + int maxYear = currentYear - 18; // 最大年份设为16年前 List yearList = new ArrayList<>(); for (int i = minYear; i <= maxYear; i++) { diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/utils/DownloadUtil.java b/BaseModule/src/main/java/com/xscm/moduleutil/utils/DownloadUtil.java index 4d4e7c23..ddf0d1c1 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/DownloadUtil.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/DownloadUtil.java @@ -1,16 +1,21 @@ package com.xscm.moduleutil.utils; +import android.annotation.SuppressLint; import android.content.Context; import android.os.Environment; import android.os.Handler; import android.os.Looper; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import android.util.Log; import com.alibaba.android.arouter.utils.TextUtils; import com.blankj.utilcode.util.FileUtils; +import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.ThreadUtils; +import com.blankj.utilcode.util.ToastUtils; import java.io.File; import java.io.FileNotFoundException; @@ -19,6 +24,11 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; @@ -41,14 +51,58 @@ public class DownloadUtil { private static final String PATH_AUDIO = Environment.getExternalStorageDirectory() + "/qipao/audio"; - public DownloadUtil(Context context) { + @SuppressLint("CheckResult") + public DownloadUtil(Context context, String downUrl,final DownloadListener downloadListener) { + // 1. 判空,避免空指针 + if (context == null) { + ToastUtils.showShort("Context 不能为 null!"); + LogUtils.e("Context 不能为 null!."+(mApi == null)); + return; + } + if (downUrl == null || downUrl.trim().isEmpty()) { + ToastUtils.showShort("下载链接不能为 null 或空!"); + LogUtils.e("下载链接不能为 null 或空!."+(mApi == null)); + return; + } + this.mContext = context; + final String dUrl = downUrl; + File qipaoDir = new File(mContext.getFilesDir(), PATH_APK); + if (qipaoDir.exists() && qipaoDir.isDirectory()) { + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + LogUtils.e("删除文件中."+(mApi == null)); + FileUtils.deleteAllInDir(qipaoDir); + emitter.onNext(true); + } + }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(result -> { + LogUtils.e("删除成功."+(mApi == null)); + if (mApi == null) { + //初始化网络请求接口 + mApi = ApiHelper.getInstance().createService(ApiInterface.class); + int i = dUrl.lastIndexOf('/');//一定是找最后一个'/'出现的位置 + String downUrlEnd = ""; + if (i != -1) { + downUrlEnd = dUrl.substring(i); + } + mApkPath = new File(mContext.getFilesDir(), PATH_APK + downUrlEnd).getAbsolutePath(); + } + downloadFile(dUrl, downloadListener); + }); + } else { + LogUtils.e("else ."+(mApi == null)); + if (mApi == null) { + //初始化网络请求接口 + mApi = ApiHelper.getInstance().createService(ApiInterface.class); + int i = downUrl.lastIndexOf('/');//一定是找最后一个'/'出现的位置 + if (i != -1) { + downUrl = downUrl.substring(i); + } + mApkPath = new File(mContext.getFilesDir(), PATH_APK + downUrl).getAbsolutePath(); + } - if (mApi == null) { - //初始化网络请求接口 - mApi = ApiHelper.getInstance().createService(ApiInterface.class); - mApkPath = new File(mContext.getFilesDir(), PATH_APK).getAbsolutePath(); - + downloadFile(downUrl, downloadListener); } } 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 ebd61b7e..3ff66af2 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/utils/TimeUtils.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/utils/TimeUtils.java @@ -1,5 +1,7 @@ package com.xscm.moduleutil.utils; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -258,6 +260,25 @@ public class TimeUtils { return "1天"; // 或者 return "0天"; } + + /** + * 计算时间差值并向上取整为天数 + * @param currentTimeMillis 当前时间(毫秒级时间戳) + * @param createTimeSecond 创建时间(秒级时间戳) + * @return 向上取整后的天数 + */ + public static int calculateDays(long currentTimeMillis, long createTimeSecond) { + // 1. 计算时间差(毫秒) + long timeDiffMillis = currentTimeMillis - createTimeSecond; + + // 2. 转换为天数(1天 = 24*60*60*1000 毫秒) + BigDecimal daysDecimal = new BigDecimal(timeDiffMillis) + .divide(new BigDecimal(24 * 60 * 60 * 1000), 10, RoundingMode.HALF_UP); + + // 3. 向上取整(即使是 8.0001 天也会变成 9 天) + return daysDecimal.setScale(0, RoundingMode.CEILING).intValue(); + } + /** * 根据生日字符串计算年龄 * @param birthDay 生日字符串,格式为 "yyyy-MM-dd" diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java index 3b543724..ea1ab281 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/AvatarFrameView.java @@ -422,6 +422,7 @@ public class AvatarFrameView extends FrameLayout { mainHandler.post(() -> { // 检查是否已销毁 if (file.exists()) { + LogUtils.e("有缓存:"+file.exists()+"===="+file.getAbsolutePath()); playMp4File(file); } else { LogUtils.w(TAG, "有缓存2222222222222"); 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 c57f1536..63d77d95 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -260,6 +260,7 @@ public class Constants { public static final String GET_DECORATE = "/api/Decorate/user_decorate";//装扮详情 public static final String SET_USER_DECORATE = "/api/Decorate/set_user_decorate";//用户装扮 public static final String JOIN_ROOM = "/api/Room/join_room";//加入房间 + public static final String TASK_JUMP_ROOM = "/api/Room/task_jump_room";//师徒任务 加入房间 public static final String UPDATEPASSWORD = "/api/room/setRoomPassword";//更新房间秘密啊 public static final String GET_ROOM_ONLINE = "/api/Room/room_online_list";//房间在线列表 @@ -360,9 +361,11 @@ public class Constants { public static final String POST_ROOM_RANKING = "/api/Ranking/room_ranking";//房间榜 public static final String GUILD_RANKING = "/api/Ranking/guild_ranking";//公会榜 public static final String POST_LOVE_RANKING = "/api/Ranking/love_ranking";//真爱榜 - public static final String GET_TASKS_LIHEN = "/api/Dailytasks/dailyTasksList";//每日任务列表 - public static final String GET_DAILY_TASK_BOX = "/api/Dailytasks/dailyTasksBoxRecord";//礼盒记录 - public static final String dailyTasksOpenBox = "/api/Dailytasks/dailyTasksOpenBox";//开启礼盒 + public static final String GET_TASKS_LIHEN = "/api/Tasks/dailyTasksList";//每日任务列表 + public static final String GET_DAILY_TASK_BOX = "/api/Tasks/dailyTasksBoxRecord";//礼盒记录 + public static final String dailyTasksOpenBox = "/api/Tasks/dailyTasksOpenBox";//开启礼盒 + public static final String dailyTasksReceive = "/api/Tasks/dailyTasksReceive";//领取每日任务奖励 + public static final String dailyTasksComplete = "/api/Tasks/dailyTasksComplete";//领取每日任务奖励 public static final String GET_MY_BAG_DATA = "/api/UserGiftPack/get_gift_pack_income";//背包收入 public static final String GET_MY_BAG_OUTCOME = "/api/UserGiftPack/get_gift_pack_outcome";//背包礼物支出列表 public static final String GET_GIFT_PACK = "/api/UserGiftPack/get_gift_pack_list";//获取背包礼物列表 @@ -386,9 +389,7 @@ public class Constants { public static final String GET_ACTIVITIES_PERMISSION = "/api/Activities/activities_permission";//活动弹框权限 public static final String GET_INDEX_RECOMMEND_ROOM = "/api/Index/index_recommend_room";//首页弹窗推荐房间 public static final String GET_DAY_DROP_GIFT = "/api/Activities/day_drop_gift";//天降好礼列表接口(弹框) - public static final String dailyTasksReceive = "/api/Dailytasks/dailyTasksReceive";//领取每日任务奖励 public static final String postRoomSwToken = "/api/Room/update_user_sw_token";//获取用户声网token - public static final String dailyTasksComplete = "/api/Dailytasks/dailyTasksComplete";//领取每日任务奖励 public static final String POST_CANCEL_USER_DECORATE = "/api/Decorate/cancel_user_decorate";//取消装扮 public static final String GET_THEME_DATA = "/api/Theme/get_theme_data";//主题接口 public static final String START_FRIEND = "/api/Friend/start_friend";//点击开始按钮 交友房 @@ -436,6 +437,9 @@ public class Constants { public static final String POST_FREE_RE_SIGN = "/api/Sign/free_re_sign";//免费续约 public static final String POST_RE_SIGN = "/api/Sign/re_sign";//续签(花金币) public static final String POST_SIGN_REFUSE = "/api/RoomPit/refuse_sign_room_host_invite";//签约房间主持邀请上签约麦用户拒绝 + public static final String GET_SIGN_IN_LIST = "/api/Tasks/dailyTasksSignList";//签到列表页面 + public static final String POST_DAILY_TASKS_SIGN = "/api/Tasks/dailyTasksSign";//每日签到 + public static final String POST_DAILY_TASKS_SIGN_STATUS = "/api/Tasks/dailyTasksSignStatus";//每日签到状态 diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/CustomViewPager.kt b/BaseModule/src/main/java/com/xscm/moduleutil/widget/CustomViewPager.kt index 5062b21a..a7881582 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/CustomViewPager.kt +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/CustomViewPager.kt @@ -15,6 +15,8 @@ class CustomViewPager(context: Context, attrs: AttributeSet?) : ViewPager(contex private var initialX = 0f private var initialY = 0f + private var isBeingDragged = false + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { when (ev.action) { MotionEvent.ACTION_DOWN -> { @@ -31,11 +33,34 @@ class CustomViewPager(context: Context, attrs: AttributeSet?) : ViewPager(contex if (deltaX > deltaY && deltaX > 30) { // 30是阈值,可以根据需要调整 return super.onInterceptTouchEvent(ev) } - // 否则,不拦截,让子视图处理 - parent.requestDisallowInterceptTouchEvent(true) - return false + + // 如果是向上滑动,确保父容器不拦截 + if (deltaY > deltaX && ev.y < initialY) { + parent.requestDisallowInterceptTouchEvent(true) + return false + } +// // 否则,不拦截,让子视图处理 +// parent.requestDisallowInterceptTouchEvent(true) +// return false + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + isBeingDragged = false } } return super.onInterceptTouchEvent(ev) } + + override fun onTouchEvent(ev: MotionEvent): Boolean { + when (ev.action) { + MotionEvent.ACTION_DOWN -> { + parent.requestDisallowInterceptTouchEvent(true) + } + MotionEvent.ACTION_MOVE -> { + if (isBeingDragged) { + parent.requestDisallowInterceptTouchEvent(true) + } + } + } + return super.onTouchEvent(ev) + } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/GiftAnimView.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/GiftAnimView.java index 39a83acf..b4ab4536 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/GiftAnimView.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/GiftAnimView.java @@ -10,26 +10,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.blankj.utilcode.util.LogUtils; -import com.opensource.svgaplayer.SVGACallback; -import com.opensource.svgaplayer.SVGADrawable; -import com.opensource.svgaplayer.SVGAImageView; -import com.opensource.svgaplayer.SVGAParser; -import com.opensource.svgaplayer.SVGAVideoEntity; import com.tencent.qgame.animplayer.AnimConfig; import com.tencent.qgame.animplayer.AnimView; import com.tencent.qgame.animplayer.inter.IAnimListener; -import com.xscm.moduleutil.R; import com.xscm.moduleutil.bean.GiftBean; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; import lombok.Setter; @@ -276,55 +267,52 @@ public class GiftAnimView extends FrameLayout implements GiftSvgaView.OnAnimatio if (isLoadEffect && giftModel != null && !TextUtils.isEmpty(giftModel)) { String finalGiftModel = giftModel; - post(new Runnable() { - @Override - public void run() { - String playImage = finalGiftModel; - if (playImage.endsWith("mp4")) { - downloadAndPlay(getContext(), playImage, new DownloadCallback() { - @Override - public void onSuccess(File file) { - post(() -> { - playerMp4View.setVisibility(View.VISIBLE); - svgaView.setVisibility(View.GONE); - playerMp4View.startPlay(file); - }); - } - - @Override - public void onFailure(Exception e) { - LogUtils.e("MP4下载或播放失败: " + e.getMessage()); - // 处理失败情况,继续播放下一个 - post(() -> { - lock.lock(); - try { - isLoadEffect = false; - } finally { - lock.unlock(); - } - loadStartSVGAPlayer(); - }); - } - }); - } else if (playImage.endsWith("svga")) { -// File file = downloadAndPlay(getContext(), playImage); - post(() -> { - playerMp4View.setVisibility(View.GONE); - svgaView.setVisibility(View.VISIBLE); - svgaView.loadSVGAPlayerWith(finalGiftModel, false); - }); - } else { - lock.lock(); - try { - isLoadEffect = false; - } finally { - lock.unlock(); + post(() -> { + String playImage = finalGiftModel; + if (playImage.endsWith("mp4")) { + downloadAndPlay(getContext(), playImage, new DownloadCallback() { + @Override + public void onSuccess(File file) { + post(() -> { + playerMp4View.setVisibility(View.VISIBLE); + svgaView.setVisibility(View.GONE); + playerMp4View.startPlay(file); + }); } - loadStartSVGAPlayer(); - // 直接播放缓存文件 - } + @Override + public void onFailure(Exception e) { + LogUtils.e("MP4下载或播放失败: " + e.getMessage()); + // 处理失败情况,继续播放下一个 + post(() -> { + lock.lock(); + try { + isLoadEffect = false; + } finally { + lock.unlock(); + } + loadStartSVGAPlayer(); + }); + } + }); + } else if (playImage.endsWith("svga")) { +// File file = downloadAndPlay(getContext(), playImage); + post(() -> { + playerMp4View.setVisibility(View.GONE); + svgaView.setVisibility(View.VISIBLE); + svgaView.loadSVGAPlayerWith(finalGiftModel, false); + }); + } else { + lock.lock(); + try { + isLoadEffect = false; + } finally { + lock.unlock(); + } + loadStartSVGAPlayer(); + // 直接播放缓存文件 } + }); } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/ShineTextView.kt b/BaseModule/src/main/java/com/xscm/moduleutil/widget/ShineTextView.kt index 5e952be4..6803a7f9 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/ShineTextView.kt +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/ShineTextView.kt @@ -37,7 +37,7 @@ class ShineTextView : AppCompatTextView { var _count: Int = 0 //自行运行动画次数 - private lateinit var mLinearGradient: LinearGradient + private var mLinearGradient: LinearGradient? = null private var mGradientMatrix: Matrix = Matrix() private var mViewWidth = 0 private var mTranslate = 0 @@ -121,13 +121,13 @@ class ShineTextView : AppCompatTextView { _count++ } mGradientMatrix.setTranslate(mTranslate.toFloat(), 0f) - mLinearGradient.setLocalMatrix(mGradientMatrix) + mLinearGradient?.setLocalMatrix(mGradientMatrix) when { shineType == 0 && _count < shineCount -> postInvalidateDelayed(50) shineType == 1 && _count < 1 -> postInvalidateDelayed(50) else -> { mGradientMatrix.setTranslate((1.2 * mViewWidth).toFloat(), 0f) - mLinearGradient.setLocalMatrix(mGradientMatrix) + mLinearGradient?.setLocalMatrix(mGradientMatrix) } } } diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java index 9e6263b1..c22a5d2e 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/widget/dialog/RewardGiftDialogFragment.java @@ -270,7 +270,7 @@ public class RewardGiftDialogFragment extends BaseMvpDialogFragment + + + + \ No newline at end of file diff --git a/BaseModule/src/main/res/drawable/bg_r99_e7fe67_90ff86_5cfbbd.xml b/BaseModule/src/main/res/drawable/bg_r99_e7fe67_90ff86_5cfbbd.xml new file mode 100644 index 00000000..a63e8901 --- /dev/null +++ b/BaseModule/src/main/res/drawable/bg_r99_e7fe67_90ff86_5cfbbd.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/BaseModule/src/main/res/drawable/bg_sigin_status.xml b/BaseModule/src/main/res/drawable/bg_sigin_status.xml new file mode 100644 index 00000000..bf75507c --- /dev/null +++ b/BaseModule/src/main/res/drawable/bg_sigin_status.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/BaseModule/src/main/res/drawable/selector_sign_bg.xml b/BaseModule/src/main/res/drawable/selector_sign_bg.xml new file mode 100644 index 00000000..71db39f0 --- /dev/null +++ b/BaseModule/src/main/res/drawable/selector_sign_bg.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/BaseModule/src/main/res/layout/item_gift_room.xml b/BaseModule/src/main/res/layout/item_gift_room.xml index 7eb2f114..064c40ad 100644 --- a/BaseModule/src/main/res/layout/item_gift_room.xml +++ b/BaseModule/src/main/res/layout/item_gift_room.xml @@ -90,7 +90,7 @@ android:id="@+id/im_heartssss" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@mipmap/icon_heart" + tools:src="@mipmap/icon_heart" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" android:scaleType="fitCenter" 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 2ab25571..12682e45 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,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/dp_1" android:orientation="horizontal" - app:layout_constraintGuide_percent="0.59" /> + app:layout_constraintGuide_percent="0.62" /> #EFF2F8 #5B5B5B #C7BF62 + #FFE3FAE4 diff --git a/MainModule/src/main/java/com/xscm/modulemain/Application.kt b/MainModule/src/main/java/com/xscm/modulemain/Application.kt index 3b40ebc6..dd0feeb6 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/Application.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/Application.kt @@ -2,6 +2,9 @@ package com.xscm.modulemain import android.app.Activity import android.content.Context +import android.text.TextUtils +import android.view.View +import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.CrashUtils import com.blankj.utilcode.util.LogUtils @@ -10,14 +13,22 @@ import com.opensource.svgaplayer.utils.log.SVGALogger import com.scwang.smartrefresh.layout.SmartRefreshLayout import com.scwang.smartrefresh.layout.footer.ClassicsFooter import com.scwang.smartrefresh.layout.header.ClassicsHeader -import com.xscm.modulemain.activity.main.activity.MainActivity +import com.xscm.modulemain.activity.room.activity.RoomActivity import com.xscm.modulemain.dialog.InviteDialog +import com.xscm.modulemain.manager.RoomManager +import com.xscm.modulemain.utils.TimerManager import com.xscm.modulemain.widget.WheatLayoutSingManager import com.xscm.moduleutil.base.CommonAppContext import com.xscm.moduleutil.bean.IndexRecommendRoom +import com.xscm.moduleutil.bean.RoomMessageEvent +import com.xscm.moduleutil.dialog.ConfirmDialog import com.xscm.moduleutil.http.BaseObserver import com.xscm.moduleutil.http.RetrofitClient +import com.xscm.moduleutil.listener.MessageListenerSingleton +import com.xscm.moduleutil.utils.CustomMsgCode import io.reactivex.disposables.Disposable +import org.json.JSONObject +import java.util.concurrent.TimeUnit open class Application : CommonAppContext() { @@ -29,6 +40,7 @@ open class Application : CommonAppContext() { var isAgoraStop = false var inviteDialog: InviteDialog? = null + var currDialogActivity: Activity? = null // 单例实例 companion object { @@ -48,10 +60,9 @@ open class Application : CommonAppContext() { override fun onCreate() { super.onCreate() + APP_CONENT = getExternalFilesDir("APP_CONTENT")?.absolutePath.toString() LOGUTILS_SAVE_PATH = getExternalFilesDir("APP_CONTENT/APP_LOG")?.absolutePath.toString() CRASHUTILS_SAVE_PATH = getExternalFilesDir("APP_CONTENT/APP_CRASH")?.absolutePath.toString() - getExternalFilesDir("") - APP_CONENT = getExternalFilesDir("APP_CONTENT")?.absolutePath.toString() // 初始化单例实例 instance = this @@ -66,7 +77,127 @@ open class Application : CommonAppContext() { initCrashUtils() initSmartRefreshLayout() + initImMsg() + } + private fun initImMsg() { + MessageListenerSingleton.getInstance().setOnMsgTaskListener { event -> + when (event.msgType) { + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM -> { + TimerManager.cancelTimer(CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID) + try { + val json = JSONObject(event.text.text) + if (!json.isNull("status")) { + event.text.status = json.getString("status") + } + if (TextUtils.isEmpty(event.text.status)) + return@setOnMsgTaskListener + when (event.text.status) { + "1" -> {//1:邀请 + if (!json.isNull("room_id")) + event.text.room_id = json.getString("room_id") + if (event?.text?.room_id.isNullOrEmpty()) + return@setOnMsgTaskListener + customDialog( + event.text.room_id, + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG, + 5, + 1, + event.text + ) + } + + "2" -> {//2:拒绝 + customDialog( + "", + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE, + 5, + 3, + null, + "", + "知道了" + ) + } + } + }catch (E: Exception){ + LogUtils.e("Exception",E.message.toString()) + } + } + } + } + } + + private fun customDialog( + roomId: String, + message: String, + downCount: Int, + status: Int = 1, + event: RoomMessageEvent.T?, + confirm: String = "同意", + cancel: String = "拒绝", + ) { + // 创建并显示确认对话框 + ConfirmDialog( + ActivityUtils.getTopActivity(), + "提示", + message, + confirm, + cancel, + { v: View? -> + when (status) { + 1 -> { + if (!TextUtils.isEmpty(CommonAppContext.getInstance().playId) + && roomId == CommonAppContext.getInstance().playId + && ActivityUtils.getTopActivity() is RoomActivity + ) { + return@ConfirmDialog + } + + if (ActivityUtils.getTopActivity() is RoomActivity) { + (ActivityUtils.getTopActivity() as RoomActivity).refreshRoomInfo(roomId) + return@ConfirmDialog + } + + RoomManager.getInstance() + .fetchRoomDataAndEnter(ActivityUtils.getTopActivity(), roomId, "", null) + } + } + }, + { v: View? -> + when (status) { + 1 -> { + val text = RoomMessageEvent.T() + val json = JSONObject() + json.put("status", "2") + json.put("room_id", roomId) + text.text = json.toString() + MessageListenerSingleton.getInstance().sendCustomC2CMessage( + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM, + event?.fromUserInfo?.user_id.toString(), + text + ) + } + } + }, true, downCount + ).show() + } + + fun inviteApprenticeTaskTimer() { + TimerManager.scheduleTimer( + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_TIMER_ID, + 20, + TimeUnit.SECONDS, + onTimeUp = { + customDialog( + "", + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE, + 5, + 3, + null, + "", + "知道了" + ) + }) } @@ -80,8 +211,9 @@ open class Application : CommonAppContext() { } override fun onNext(t: IndexRecommendRoom) { + LogUtils.e(t) if (!t.room_id.isNullOrEmpty()) { - showInviteDialog(activity, t) + showInviteDialog(activity, t) } } }) @@ -94,11 +226,17 @@ open class Application : CommonAppContext() { }) } - fun showInviteDialog(activity: Activity?,t: IndexRecommendRoom) { - if (inviteDialog == null) { - inviteDialog = activity?.let { InviteDialog(it, t) } + fun showInviteDialog(activity: Activity?, t: IndexRecommendRoom) { + if (activity != null && activity == currDialogActivity && inviteDialog != null) { + inviteDialog?.setData(t) + return } + inviteDialog?.dismiss() + inviteDialog = null + + inviteDialog = activity?.let { InviteDialog(it, t) } inviteDialog?.setData(t) + currDialogActivity = activity } private fun initLogUtils() { diff --git a/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java b/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java index d522b1c5..fabcfb66 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java @@ -42,6 +42,7 @@ import com.tencent.qcloud.tuikit.tuichat.bean.ChatInfo; import com.xscm.modulemain.activity.WebViewActivity; import com.xscm.modulemain.activity.main.activity.MainActivity; import com.xscm.modulemain.activity.room.activity.RoomActivity; +import com.xscm.modulemain.activity.user.activity.DailyTasksActivity; import com.xscm.modulemain.activity.user.activity.HeartCpActivity; import com.xscm.modulemain.activity.user.activity.MyRoomActivity; import com.xscm.modulemain.manager.RoomManager; @@ -147,6 +148,8 @@ public abstract class BaseMvpActivity

clazz) { + Intent intent = new Intent(this, clazz); + startActivity(intent); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/TransparentActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/TransparentActivity.kt index f50d3e76..09c83c0d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/TransparentActivity.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/TransparentActivity.kt @@ -1,10 +1,7 @@ package com.xscm.modulemain import android.os.Bundle -import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat class TransparentActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/login/activity/ImproveInfoActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/login/activity/ImproveInfoActivity.java index 0304b557..874bd2ca 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/login/activity/ImproveInfoActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/login/activity/ImproveInfoActivity.java @@ -17,6 +17,7 @@ import androidx.fragment.app.Fragment; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.hjq.toast.ToastUtils; import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.engine.CropFileEngine; @@ -139,6 +140,11 @@ public class ImproveInfoActivity extends BaseMvpActivity(), private var circularProgress: CircularProgressView? = null private var publicScreenFragment: ChatRoomFragment? = null // 添加成员变量 - // 添加成员变量 - private var isLayoutAdjusted = false - // 存储当前显示的弹框引用 private val activeDialogs: MutableList = ArrayList() private val activeDialogFragments: MutableList = ArrayList() @@ -243,6 +241,8 @@ class RoomActivity : BaseMvpActivity(), private var appStateListener: AppStateListener? = null private var qxRedPacketManager: QXRedPacketManager? = null + //用户列表用 + private var mOnlineBean: RoomOnline? = null override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) { @@ -515,15 +515,10 @@ class RoomActivity : BaseMvpActivity(), mBinding?.roomTop?.userRecyclerView?.adapter = likeUserAdapter likeUserAdapter!!.onItemClickListener = BaseQuickAdapter.OnItemClickListener { adapter, view, position -> - val fragment = RoomOnlineDialogFragment.show( + showUserListDialog( roomId, "", mRoomUserBean, mRoomInfoResp, supportFragmentManager ) - - LogUtils.e("fragment_onItemClickListener: ${(fragment != null)}") - if (fragment != null) { - addActiveDialogFragment(fragment) // 添加到管理列表 - } } mBinding!!.ivChat.setOnClickListener { view: View -> @@ -903,6 +898,7 @@ class RoomActivity : BaseMvpActivity(), override fun onSelfInfoUpdated(info: V2TIMUserFullInfo?) {} } + @SuppressLint("CheckResult") private fun setView(resp: RoomInfoResp?, isSwitchRoomType: Boolean = false) { if (resp == null) return @@ -1014,6 +1010,17 @@ class RoomActivity : BaseMvpActivity(), setupEffectView() MvpPre?.roomRedPackets(roomId) + + Observable.timer(1000, TimeUnit.MILLISECONDS).observeOn( + AndroidSchedulers.mainThread() + ).subscribe { aLong: Long? -> + if (ActivityUtils.getTopActivity() is RoomActivity) { + startActivity( + Intent(ActivityUtils.getTopActivity(), TransparentActivity::class.java) + ) + } + } + } @@ -1519,7 +1526,7 @@ class RoomActivity : BaseMvpActivity(), roomFragment?.handleRoomMessage(messageEvent) } else if (msgType == EMMessageInfo.QXRoomMessageTypeSignDelayText) { roomFragment?.handleRoomMessage(messageEvent) - }else if (msgType == EMMessageInfo.QXRoomMessageTypeSignTipText) { + } else if (msgType == EMMessageInfo.QXRoomMessageTypeSignTipText) { roomFragment?.handleRoomMessage(messageEvent) } } @@ -1925,11 +1932,13 @@ class RoomActivity : BaseMvpActivity(), roomFragment!!.upRoomInfoData(mRoomInfoResp) roomFragment?.handleRoomMessage(messageEvent) } - RoomType.SIGN_CONTRACT ->{ + + RoomType.SIGN_CONTRACT -> { mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] = RoomPitBean(pitNumber) roomFragment!!.upRoomInfoData(mRoomInfoResp) roomFragment?.handleRoomMessage(messageEvent) } + else -> { roomFragment!!.updateSeatViewExchangedWithPitArray(mRoomInfoResp) } @@ -2002,6 +2011,8 @@ class RoomActivity : BaseMvpActivity(), LogUtils.e("1020_mRoomBean", mRoomInfoResp?.room_info.toString()) EventBus.getDefault().post(mRoomInfoResp?.room_info) changeBackgroundColor(mRoomInfoResp?.room_info?.room_background) + ImageUtils.loadHeadCC(mRoomInfoResp?.room_info?.room_cover, mBinding!!.roomTop.avatar) + mBinding?.roomTop?.name?.text = mRoomInfoResp?.room_info?.room_name } private fun handleMsgType1011(messageEvent: RoomMessageEvent, text: T?) { @@ -2620,13 +2631,10 @@ class RoomActivity : BaseMvpActivity(), } else if (id == R.id.btn_close_live) { //退出房间 showExitRoomDialog() } else if (id == R.id.tv_num) { - val fragment = RoomOnlineDialogFragment.show( + showUserListDialog( roomId, "", mRoomUserBean, mRoomInfoResp, supportFragmentManager ) - if (fragment != null) { - addActiveDialogFragment(fragment) // 添加到管理列表 - } } else if (id == R.id.rl) { MvpPre!!.clearUserCharm(roomId, "") } else if (id == R.id.ll_input) { @@ -3377,7 +3385,7 @@ class RoomActivity : BaseMvpActivity(), // ) // MessageListenerSingleton.getInstance() // .joinGroup(mRoomInfoResp?.room_info?.head_line?.room_id) - roomId2=mRoomInfoResp?.room_info?.head_line?.room_id + roomId2 = mRoomInfoResp?.room_info?.head_line?.room_id getHour() MvpPre?.getRoomIn(mRoomInfoResp?.room_info?.head_line?.room_id, "") } else { @@ -3778,7 +3786,7 @@ class RoomActivity : BaseMvpActivity(), } fun refreshRoomInfo(roomId: String) { - roomId2=roomId + roomId2 = roomId getHour() MvpPre?.getRoomIn(roomId, "") } @@ -3814,84 +3822,12 @@ class RoomActivity : BaseMvpActivity(), } } - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - LogUtils.e("RoomActivity", "onWindowFocusChanged") - if (hasFocus && !isLayoutAdjusted) { -// adjustLayoutHeights() - isLayoutAdjusted = true - } - } - var maxHeightDp: Int = 333 - /** - * 动态调整布局高度以适配不同设备 - */ - private fun adjustLayoutHeights() { - if (mBinding == null) return - - try { - // 获取主容器 - val mainContainer = mBinding!!.mainContentContainer - val pager: View = mBinding!!.vpRoomPager - val easeContainer: View = mBinding!!.easeContainer - - if (mainContainer != null && pager != null && easeContainer != null) { - // 强制测量主容器 - val widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) - val heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) - mainContainer.measure(widthSpec, heightSpec) - - var containerHeight = mainContainer.measuredHeight - if (containerHeight <= 0) { - // 如果测量不到高度,使用布局参数中的高度 - val containerParams = - mainContainer.layoutParams as ConstraintLayout.LayoutParams - containerHeight = (resources.displayMetrics.heightPixels - - statusBarHeight - - resources.getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_50) // room_top 高度 - - resources.getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_15) * 3) // 底部控件高度 - } - - // 确保最小高度 - if (containerHeight > 0) { - // 设置 vp_room_pager 占用 70% 空间 - val pagerParams = pager.layoutParams as ConstraintLayout.LayoutParams - pagerParams.height = SystemUtils.getWidth(maxHeightDp) - pager.layoutParams = pagerParams - - // 设置 ease_container 占用 30% 空间 - val easeParams = easeContainer.layoutParams as ConstraintLayout.LayoutParams - easeParams.height = 0 - easeContainer.layoutParams = easeParams - - // 请求重新布局 - mainContainer.requestLayout() - } - } - } catch (e: Exception) { - LogUtils.e("adjustLayoutHeights error: " + e.message) - } - } - - private val statusBarHeight: Int - /** - * 获取状态栏高度 - */ - get() { - var result = 0 - val resourceId = - resources.getIdentifier("status_bar_height", "dimen", "android") - if (resourceId > 0) { - result = resources.getDimensionPixelSize(resourceId) - } - return result - } - - // TODO: 根据返回的在线列表获取对应的值,查看是否有在线用户 + // TODO: 根据返回的在线列表获取对应的值,查看是否有在线用户 override fun getRoomOnline(onlineBean: RoomOnline?) { if (onlineBean != null) { + mOnlineBean = onlineBean val onlineBeans: MutableList = ArrayList() if (onlineBean.on_pit.size > 0) { onlineBeans.addAll(onlineBean.on_pit) @@ -3908,6 +3844,25 @@ class RoomActivity : BaseMvpActivity(), } } + + fun showUserListDialog( + roomId: String?, + pitNumber: String?, + mRoomUserBean: RoomUserBean?, + mRoomInfoResp: RoomInfoResp?, + supportFragmentManager: FragmentManager + ) { + val fragment = RoomOnlineDialogFragment.show( + roomId, pitNumber, mOnlineBean, mRoomUserBean, mRoomInfoResp, + supportFragmentManager + ) + + LogUtils.e("fragment_onItemClickListener: ${(fragment != null)}") + if (fragment != null) { + addActiveDialogFragment(fragment) // 添加到管理列表 + } + } + override fun applyPit() { } @@ -4090,6 +4045,7 @@ class RoomActivity : BaseMvpActivity(), "@@@", "上一个房间的roonid" + AgoraManager.getInstance().lastRoomId ) + MessageListenerSingleton.getInstance().joinGroup(AgoraManager.getInstance().lastRoomId) MvpPre?.getRoomIn(AgoraManager.getInstance().lastRoomId, "") AgoraManager.getInstance().lastRoomId = "" } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/SearchActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/SearchActivity.java index 81e443a3..5cb16e80 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/SearchActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/SearchActivity.java @@ -226,11 +226,11 @@ public class SearchActivity extends BaseMvpActivity 2) { - mSearchRoomResultAdapter.setNewData(data.getRooms().subList(0, 2)); - } else { +// if (data.getRooms().size() > 2) { +// mSearchRoomResultAdapter.setNewData(data.getRooms().subList(0, 2)); +// } else { mSearchRoomResultAdapter.setNewData(data.getRooms()); - } +// } mBinding.tvRoomCount.setText("全部 " + data.getRooms().size()); } if (data.getUsers() != null && data.getUsers().size() != 0) { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/VoiceContacts.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/VoiceContacts.java index aa63a302..4f5c19b7 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/VoiceContacts.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/contacts/VoiceContacts.java @@ -5,6 +5,7 @@ import android.app.Activity; import com.xscm.moduleutil.activity.IPresenter; import com.xscm.moduleutil.activity.IView; import com.xscm.moduleutil.bean.ActivitiesPermission; +import com.xscm.moduleutil.bean.TasksSignStatus; public final class VoiceContacts { @@ -15,6 +16,8 @@ public final class VoiceContacts { void hideRecommend(boolean hideRecommend,boolean hideGame); void activitiesPermissionSuccess(ActivitiesPermission activitiesPermission); + void tasksSignStatus(TasksSignStatus tasksSignStatus); + } public interface IIndexPre extends IPresenter { @@ -25,6 +28,8 @@ public final class VoiceContacts { void activitiesPermission();//活动弹框权限 + void tasksSignStatus(); + } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java index 12679172..78cd51ad 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/FriendshipRoomFragment.java @@ -82,6 +82,7 @@ public class FriendshipRoomFragment extends BaseRoomFragment { // 处理抱麦逻辑 - RoomOnlineDialogFragment.show(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); + if (getActivity() != null && getActivity() instanceof RoomActivity) { + ((RoomActivity) getActivity()).showUserListDialog(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); + } popupWindow.dismiss(); }); } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/HotListFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/HotListFragment.java index 4b50e072..d47b8e04 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/HotListFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/HotListFragment.java @@ -72,6 +72,7 @@ public class HotListFragment extends BaseMvpFragment currentData = mAdapter.getData(); - if (!currentData.isEmpty() && !data.isEmpty()) { - // 检查第一条数据是否已经存在 - TopRoom firstNewData = data.get(0); - for (TopRoom item : currentData) { - if (item.getRoom_id().equals(firstNewData.getRoom_id())) { - hasDuplicate = true; - break; - } - } - } +// List currentData = mAdapter.getData(); +// if (!currentData.isEmpty() && !data.isEmpty()) { +// // 检查第一条数据是否已经存在 +// TopRoom firstNewData = data.get(0); +// for (TopRoom item : currentData) { +// if (item.getRoom_id().equals(firstNewData.getRoom_id())) { +// hasDuplicate = true; +// break; +// } +// } +// } if (!hasDuplicate) { mAdapter.addData(data); // 加载更多时添加数据 diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java index de700db6..3db0be27 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomAuctionFragment.java @@ -406,7 +406,9 @@ public class RoomAuctionFragment extends BaseMvpFragment{ + aLong -> { retryCount++; LogUtils.e("switchFragment retry"); switchFragment(newFragment, containerId, true); @@ -569,8 +569,9 @@ public class RoomFragment extends BaseMvpFragment{ - startActivity(new Intent(ActivityUtils.getTopActivity(), TransparentActivity.class)); + aLong -> { + if (ActivityUtils.getTopActivity() instanceof RoomActivity) + startActivity(new Intent(ActivityUtils.getTopActivity(), TransparentActivity.class)); } ); } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java index e1814cbd..02dd6a1a 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/RoomJukeboxFragment.java @@ -141,10 +141,12 @@ public class RoomJukeboxFragment extends BaseMvpFragment { // 处理抱麦逻辑 - RoomOnlineDialogFragment.show(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); + if (getActivity() != null && getActivity() instanceof RoomActivity) { + ((RoomActivity) getActivity()).showUserListDialog(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); + } popupWindow.dismiss(); }); } @@ -757,8 +761,8 @@ public class RoomJukeboxFragment extends BaseMvpFragment(), MentorShipContacts.View, View.OnClickListener { @@ -65,7 +65,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : private var popupWindow: PopupWindow? = null private var mPitBean: RoomPitBean? = null - private var mRoomId: String = mRoomInfo?.room_info?.room_id!! + private var mRoomId: String = mRoomInfoResp?.room_info?.room_id!! private var mSignPitBean: RoomPitBean? = null private var mSignId: String? = null @@ -75,7 +75,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : private val startOrDelay = arrayOf("开始", "延时") - private var mUserInfo: RoomUserBean? = mRoomInfo?.user_info + private var mUserInfo: RoomUserBean? = mRoomInfoResp?.user_info private var dialogMentorShip: DialogMentorShip? = null @@ -83,6 +83,9 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : private var signTypeDialog: DialogSignType? = null + private var disposable: Disposable? = null + + private val ivForMai = arrayOf( com.xscm.moduleutil.R.mipmap.icon_apply_for_mai, com.xscm.moduleutil.R.mipmap.icon_show_alent, @@ -116,9 +119,9 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : mBinding.tvTimeLeft.visibility = View.GONE for ((idx, view) in viewList.withIndex()) { - if (mRoomInfo?.room_info?.pit_list!!.size > indexList[idx].toInt() - 1) { + if (mRoomInfoResp?.room_info?.pit_list!!.size > indexList[idx].toInt() - 1) { view.setRoomWheatNumber(indexList[idx]) - val bean = mRoomInfo?.room_info?.pit_list!![indexList[idx].toInt() - 1] + val bean = mRoomInfoResp?.room_info?.pit_list!![indexList[idx].toInt() - 1] if (idx == 0) { view.setHostTv(mBinding.tvHostName) } else if (idx == 1) { @@ -139,7 +142,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : if (!view.getUserId().equals("") && !view.getUserId().equals("0")) { RoomUserInfoFragment.show( - mRoomInfo?.room_info?.room_id, + mRoomInfoResp?.room_info?.room_id, view.getUserId(), view.pitNumber, getHostUser(), @@ -154,7 +157,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : } else { when (indexList[idx]) { "9" -> { - MvpPre.applyPit(mRoomInfo?.room_info?.room_id!!, "9") + MvpPre.applyPit(mRoomInfoResp?.room_info?.room_id!!, "9") } "2" -> { @@ -163,14 +166,14 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : "1", "3", "4", "5" -> { mPitBean = - mRoomInfo?.room_info?.pit_list!![indexList[idx].toInt() - 1] + mRoomInfoResp?.room_info?.pit_list!![indexList[idx].toInt() - 1] // 处理抱麦逻辑 - RoomOnlineDialogFragment.show( + (activity as RoomActivity).showUserListDialog( mRoomId, mPitBean?.pit_number, - mRoomInfo?.user_info, - mRoomInfo, + mRoomInfoResp?.user_info, + mRoomInfoResp, childFragmentManager ) } @@ -186,10 +189,10 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : mBinding.tvTimeRight.setOnClickListener(this) mBinding.ivHelp.setOnClickListener(this) - if (mRoomInfo?.sign_info?.sign_id != "-1") { - mSignId = mRoomInfo?.sign_info?.sign_id - if (mRoomInfo?.sign_info?.sign_status == 1) { - startTimer(mRoomInfo?.sign_info?.end_time!!) + if (mRoomInfoResp?.sign_info?.sign_id != "-1") { + mSignId = mRoomInfoResp?.sign_info?.sign_id + if (mRoomInfoResp?.sign_info?.sign_status == 1) { + startTimer(mRoomInfoResp?.sign_info?.end_time!!) if (mUserInfo?.user_id?.toString().equals(mSignPitBean?.user_id)) { setIvForMai(1) } else if (!mSignPitBean?.user_id.equals("0")) { @@ -201,9 +204,9 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : setIvForMai(0) } mBinding.tvSignDay.visibility = View.VISIBLE - mBinding.tvLeftPrice.text = mRoomInfo?.sign_info?.current_body_value.toString() + mBinding.tvLeftPrice.text = mRoomInfoResp?.sign_info?.current_body_value.toString() - mBinding.tvSignDay.text = "签约${mRoomInfo?.sign_info?.sign_day}天" + mBinding.tvSignDay.text = "签约${mRoomInfoResp?.sign_info?.sign_day}天" } else { setIvForMai(0) } @@ -215,7 +218,8 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : R.id.iv_apply_for_mai -> { when (mBinding.ivApplyForMai.tag) { ivForMai[0] -> { - MvpPre!!.applyPit(mRoomInfo?.room_info?.room_id!!, "") + mBinding.ivApplyForMai.isClickable = false + MvpPre!!.applyPit(mRoomInfoResp?.room_info?.room_id!!, "") } ivForMai[1] -> { @@ -265,52 +269,80 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : } } + @SuppressLint("CheckResult") private fun showBtn(isSignUser: Boolean = false) { - if (isStart) { - mBinding.tvTimeLeft.text = startOrDelay[1] - mBinding.tvTime.visibility = View.VISIBLE - mBinding.groupLeftPrice.visibility = View.VISIBLE - if (getHostUser() < 4) { - mBinding.tvTimeRight.visibility = View.VISIBLE - } - } else { - mBinding.tvTimeLeft.text = startOrDelay[0] - mBinding.tvTimeLeft.visibility = View.GONE - mBinding.tvTime.visibility = View.GONE - mBinding.tvTimeRight.visibility = View.GONE - mBinding.groupLeftPrice.visibility = View.GONE - if (!isSignUser) { - mBinding.tvLeftPrice.text = "0" - mBinding.tvSignDay.visibility = View.GONE + activity?.runOnUiThread { + if (isStart) { + mBinding.tvTimeLeft.text = startOrDelay[1] + mBinding.tvTime.visibility = View.VISIBLE + mBinding.groupLeftPrice.visibility = View.VISIBLE + if (getHostUser() < 4) { + mBinding.tvTimeRight.visibility = View.VISIBLE + } else { + mBinding.tvTimeRight.visibility = View.GONE + } + } else { + mBinding.tvTimeLeft.text = startOrDelay[0] + + mBinding.tvTimeRight.visibility = View.GONE + mBinding.tvTime.visibility = View.GONE + mBinding.tvJsq.visibility = View.GONE + + mBinding.tvTimeLeft.visibility = View.GONE + + + mBinding.groupLeftPrice.visibility = View.GONE + if (!isSignUser) { + mBinding.tvLeftPrice.text = "0" + mBinding.tvSignDay.visibility = View.GONE + } + + mBinding.tvTime.text = "倒计时 00:00:00" + setIvForMai(0) } - mBinding.tvTime.text = "倒计时 00:00:00" - setIvForMai(0) + if (viewList[0].pitBean.user_id.equals(mUserInfo?.user_id.toString()) && !mSignPitBean?.user_id.equals( + "0" + ) + ) { + mBinding.tvTimeLeft.visibility = View.VISIBLE + } else { + mBinding.tvTimeLeft.visibility = View.GONE + } } + + LogUtils.e( - "showBtn", - "showBtn: $isSignUser isStart: $isStart viewList[0].pitBean.user_id: ${viewList[0].pitBean.user_id} mSignPitBean?.user_id: ${mSignPitBean?.user_id} mRoomInfo?.user_info?.user_id: ${mRoomInfo?.user_info?.user_id} mUserInfo?.user_id: ${mUserInfo?.user_id}" + "showBtn ${Thread.currentThread()}", + "showBtn: isSignUser: $isSignUser " + + "\nisStart: $isStart " + + "\n viewList[0].pitBean.user_id: ${viewList[0].pitBean.user_id} " + + "\n mSignPitBean?.user_id: ${mSignPitBean?.user_id} " + + "\n mRoomInfo?.user_info?.user_id: ${mRoomInfoResp?.user_info?.user_id} " + + "\n mUserInfo?.user_id: ${mUserInfo?.user_id}" + + "\n mBinding.tvTimeRight: ${mBinding.tvTimeRight.visibility == View.VISIBLE}" + + "\n mBinding.tvTime: ${mBinding.tvTime.visibility == View.VISIBLE}" + + "\n mBinding.tvTimeLeft: ${mBinding.tvTimeLeft.visibility == View.VISIBLE}" ) - if (viewList[0].pitBean.user_id.equals(mUserInfo?.user_id.toString()) && !mSignPitBean?.user_id.equals( - "0" - ) - ) { - mBinding.tvTimeLeft.visibility = View.VISIBLE - } else { - mBinding.tvTimeLeft.visibility = View.GONE - } } + // 核心工具方法:检查 Fragment 是否和 Activity 有效绑定 + private fun checkFragmentAttached(): Boolean { + // 依次检查:Fragment 是否附加到 Activity、是否已销毁、是否处于正常状态 + return isAdded && !isDetached && !requireActivity().isFinishing && !requireActivity().isDestroyed + } - fun roomInfoUpdate(mRoomInfoResp: RoomInfoResp) { - mRoomInfo = mRoomInfoResp - mUserInfo = mRoomInfo?.user_info + fun roomInfoUpdate(roomInfoResp: RoomInfoResp) { + this.mRoomInfoResp = roomInfoResp + mUserInfo = this.mRoomInfoResp?.user_info + mRoomId = this.mRoomInfoResp?.room_info?.room_id!! showBtn() } - fun roomTypeSwitch(mRoomInfoResp: RoomInfoResp) { - mRoomInfo = mRoomInfoResp - mUserInfo = mRoomInfo?.user_info + fun roomTypeSwitch(roomInfoResp: RoomInfoResp) { + this.mRoomInfoResp = roomInfoResp + mUserInfo = this.mRoomInfoResp?.user_info + mRoomId = this.mRoomInfoResp?.room_info?.room_id!! initView() } @@ -318,7 +350,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : val pitNumber = messageEvent.text.pit_number if (indexList.contains(pitNumber)) { val viewPos = indexList.indexOf(pitNumber) - val pitBean = mRoomInfo?.room_info?.pit_list!![pitNumber.toInt() - 1] + val pitBean = mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] viewList[viewPos].setData(pitBean) if (pitNumber == "1") { mSignPitBean = pitBean @@ -331,7 +363,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : val pitNumber = messageEvent.text.pit_number if (indexList.contains(pitNumber)) { val viewPos = indexList.indexOf(pitNumber) - val pitBean = mRoomInfo?.room_info?.pit_list!![pitNumber.toInt() - 1] + val pitBean = mRoomInfoResp?.room_info?.pit_list!![pitNumber.toInt() - 1] viewList[viewPos].setData(pitBean) if (pitNumber == "1") { mSignPitBean = pitBean @@ -345,6 +377,8 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : * sign_id :场次id(这个出价的时候要传回来) */ fun event1090(messageEvent: RoomMessageEvent?) { + mBinding.ivApplyForMai.isClickable = true + mSignId = messageEvent?.text?.sign_id val endTime = messageEvent?.text?.end_time val signDay = messageEvent?.text?.sign_day @@ -354,7 +388,6 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : signTypeDialog?.show(0) - mBinding.tvTimeLeft.text = startOrDelay[1] mBinding.tvLeftPrice.text = currBodyValue mBinding.tvSignDay.visibility = View.VISIBLE @@ -385,17 +418,6 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : pitBean.charm = fromUserInfo.charm viewList[indexList.indexOf("2")].setData(pitBean) - //当前麦上出价,需要更麦上数据 -// for (i in 0 until viewList.size) { -// if(i == 1 || i == 2){ -// continue -// } -// if (viewList[i].pitBean?.user_id != "0" && viewList[i].pitBean?.user_id == pitBean.user_id) { -// viewList[i].setData(mRoomInfo?.room_info?.pit_list!![indexList[i].toInt() - 1]) -// } -// } - - if (dialogMentorShip != null && dialogMentorShip?.isShowing!!) { MvpPre!!.signCoinList(mSignId!!) } @@ -447,8 +469,6 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : override fun onItemClick(coin: String) { dialogMentorShip?.setClickable(false) - - MvpPre!!.signCoin(mSignId!!, coin) } }) @@ -470,6 +490,16 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : // 观察时间变化 scope.launch { timer.timeLeft.collect { time -> + LogUtils.e("startTimer:" + time) + if (time / 1000 <= 10) { + mBinding.tvJsq.visibility = View.VISIBLE + mBinding.tvJsq.text = (time / 1000).toString() + if ((time / 1000).toInt() <= 0) { + mBinding.tvJsq.visibility = View.GONE + } + } else { + mBinding.tvJsq.visibility = View.GONE + } val formattedTime = timer.formatTime(time) // 更新UI显示 updateTimerDisplay(formattedTime) @@ -488,6 +518,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : private fun updateTimerDisplay(time: String) { // 在这里更新你的UI,比如: mBinding.tvTime.text = "倒计时 ${time}" + LogUtils.e("updateTimerDisplay:" + mBinding.tvTime.text.toString() + "\n" + (mBinding.tvTime.visibility == View.VISIBLE)) } // 延迟后重新开始计时 @@ -503,7 +534,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : val fromUserId = messageEvent.text.fromUserInfo.user_id for (i in 0 until viewList.size) { if (viewList[i].pitBean?.user_id == fromUserId.toString()) { - val pitBean = mRoomInfo?.room_info?.pit_list!![indexList[i].toInt() - 1] + val pitBean = mRoomInfoResp?.room_info?.pit_list!![indexList[i].toInt() - 1] viewList[i].setData(pitBean) break } @@ -515,7 +546,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : val toId = messageEvent.text.to_pit_number if (indexList.contains(fromId)) { val viewPos = indexList.indexOf(fromId) - val pitBean = mRoomInfo?.room_info?.pit_list!![fromId.toInt() - 1] + val pitBean = mRoomInfoResp?.room_info?.pit_list!![fromId.toInt() - 1] viewList[viewPos].setData(pitBean) if (fromId == "1") { mSignPitBean = pitBean @@ -524,7 +555,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : if (indexList.contains(toId)) { val viewPos = indexList.indexOf(toId) - val pitBean = mRoomInfo?.room_info?.pit_list!![toId.toInt() - 1] + val pitBean = mRoomInfoResp?.room_info?.pit_list!![toId.toInt() - 1] viewList[viewPos].setData(pitBean) if (toId == "1") { mSignPitBean = pitBean @@ -619,8 +650,11 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : tvHugMic.setOnClickListener { v: View? -> // 处理抱麦逻辑 - RoomOnlineDialogFragment.show( - mRoomId, mPitBean?.pit_number, mRoomInfo?.user_info, mRoomInfo, + (activity as RoomActivity).showUserListDialog( + mRoomId, + mPitBean?.pit_number, + mRoomInfoResp?.user_info, + mRoomInfoResp, childFragmentManager ) popupWindow!!.dismiss() @@ -629,11 +663,11 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : private fun getHostUser(): Int { - return if (mRoomInfo?.user_info?.is_room_owner == 1) { + return if (mRoomInfoResp?.user_info?.is_room_owner == 1) { 1 - } else if (mRoomInfo?.user_info?.is_management == 1) { + } else if (mRoomInfoResp?.user_info?.is_management == 1) { 2 - } else if (mRoomInfo?.user_info?.is_host == 1) { + } else if (mRoomInfoResp?.user_info?.is_host == 1) { 3 } else { 4 @@ -641,7 +675,7 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : } private fun isNumberWhether(): Int { - if (mRoomInfo?.user_info?.pit_number == 9) { + if (mRoomInfoResp?.user_info?.pit_number == 9) { return 1 } return 0 @@ -715,10 +749,10 @@ class RoomMentorShipFragment(var mRoomInfo: RoomInfoResp?) : "确认", "拒绝", { v: View? -> - MvpPre.applyPit(mRoomInfo?.room_info?.room_id!!, "1") + MvpPre.applyPit(mRoomInfoResp?.room_info?.room_id!!, "1") }, { v: View? -> - MvpPre.signRefuse(mRoomInfo?.room_info?.room_id!!) + MvpPre.signRefuse(mRoomInfoResp?.room_info?.room_id!!) }, true, 5 ).show() } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java index 8f40264c..2df858a5 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/fragment/SingSongFragment.java @@ -184,9 +184,9 @@ public class SingSongFragment extends BaseRoomFragment { // 处理抱麦逻辑 - RoomOnlineDialogFragment.show(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); + if(getActivity() != null && getActivity() instanceof RoomActivity) { + ((RoomActivity) getActivity()).showUserListDialog(roomId, pitNumber, roomInfoResp.getUser_info(), roomInfoResp, getChildFragmentManager()); + } popupWindow.dismiss(); }); } @@ -713,7 +715,9 @@ public class SingSongFragment extends BaseRoomFragment 0 ) { + if (s != null && !s.getLists().isEmpty()) { // 判断当前是刷新还是加载更多 RefreshState state = mBinding.smartRefreshLayout.getState(); if (state == RefreshState.Refreshing) { @@ -192,7 +194,7 @@ public class SongHistoryFragment extends BaseMvpFragment 0) { + if (!s.getLists().isEmpty()) { // 只添加新加载的数据,而不是整个列表 songList.addAll(s.getLists()); adapter.addData(s.getLists()); @@ -210,6 +212,8 @@ public class SongHistoryFragment extends BaseMvpFragment implements VoiceContacts.View { @@ -98,7 +102,7 @@ public class VoiceFragment extends BaseMvpFragment() { + @Override + public Unit invoke() { + MvpPre.activitiesPermission(); + return null; + } + }); + signInDialog.show(); + } + } + private void setDialog(){ if(ActivityUtils.getTopActivity() instanceof MainActivity){ ((MainActivity)ActivityUtils.getTopActivity()).dialogUp(); diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/VoicePresenter.java b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/VoicePresenter.java index a12f2387..a2f74581 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/VoicePresenter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/room/presenter/VoicePresenter.java @@ -4,6 +4,7 @@ import android.content.Context; import com.xscm.modulemain.activity.room.contacts.VoiceContacts; import com.xscm.moduleutil.bean.ActivitiesPermission; +import com.xscm.moduleutil.bean.TasksSignStatus; import com.xscm.moduleutil.http.BaseObserver; import com.xscm.moduleutil.presenter.BasePresenter; @@ -134,4 +135,22 @@ public class VoicePresenter extends BasePresenter implements } }); } + + @Override + public void tasksSignStatus() { + api.tasksSignStatus(new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + addDisposable(d); + } + + @Override + public void onNext(TasksSignStatus tasksSignStatus) { + if (MvpRef==null) + MvpRef=new WeakReference<>(mView); + MvpRef.get().tasksSignStatus(tasksSignStatus); + } + }); + } } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/DailyTasksActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/DailyTasksActivity.java index 92415b4f..8ad3c90d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/DailyTasksActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/DailyTasksActivity.java @@ -1,14 +1,20 @@ package com.xscm.modulemain.activity.user.activity; +import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Intent; +import android.text.TextUtils; import android.view.View; import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; import com.alibaba.android.arouter.facade.annotation.Route; +import com.blankj.utilcode.util.ActivityUtils; +import com.blankj.utilcode.util.LogUtils; +import com.xscm.modulemain.Application; import com.xscm.modulemain.R; +import com.xscm.modulemain.activity.room.activity.RoomActivity; import com.xscm.modulemain.adapter.TaskBoxAdapter; import com.xscm.modulemain.adapter.TaskDataAdapter; import com.xscm.modulemain.adapter.TaskSectionAdapter; @@ -18,13 +24,20 @@ import com.xscm.modulemain.activity.user.conacts.DailyTasksConacts; import com.xscm.modulemain.activity.user.presenter.DailyTasksPresenter; import com.xscm.modulemain.BaseMvpActivity; import com.xscm.modulemain.activity.WebViewActivity; +import com.xscm.modulemain.dialog.SignInDialog; import com.xscm.modulemain.manager.RoomManager; +import com.xscm.moduleutil.base.CommonAppContext; +import com.xscm.moduleutil.bean.RoomMessageEvent; +import com.xscm.moduleutil.utils.CustomMsgCode; import com.xscm.moduleutil.base.WebUrlConstants; import com.xscm.moduleutil.bean.GiftBoxBean; import com.xscm.moduleutil.bean.GiftName; -import com.xscm.moduleutil.bean.TaskItem; +import com.xscm.moduleutil.listener.MessageListenerSingleton; import com.xscm.moduleutil.utils.ARouteConstants; import com.xscm.moduleutil.utils.ColorManager; +import com.xscm.moduleutil.utils.SpUtil; + +import org.json.JSONObject; import java.util.ArrayList; import java.util.List; @@ -32,6 +45,8 @@ import java.util.concurrent.TimeUnit; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; +import kotlin.Unit; +import kotlin.jvm.functions.Function0; /** * @author qx @@ -46,6 +61,10 @@ public class DailyTasksActivity extends BaseMvpActivity taskList = new ArrayList<>(); + + private boolean isJoinRoom = false; + @Override protected DailyTasksPresenter bindPresenter() { return new DailyTasksPresenter(this, this); @@ -78,6 +97,31 @@ public class DailyTasksActivity extends BaseMvpActivity { Intent intent = new Intent(this, WebViewActivity.class); @@ -93,6 +137,16 @@ public class DailyTasksActivity extends BaseMvpActivity { + mBinding.coolWaitView.setVisibility(View.GONE); + }); + } + } + @Override protected int getLayoutId() { return R.layout.activity_daily_tasks; @@ -103,59 +157,74 @@ public class DailyTasksActivity extends BaseMvpActivity sections = new ArrayList<>(); - // 每日任务 - sections.add(new TaskItem("今日任务", giftBoxBean.getTasks().getDaily_tasks())); - // 特殊任务 - sections.add(new TaskItem("特殊任务", giftBoxBean.getTasks().getDaily_tasks_special()));// - // 师徒任务 - if (giftBoxBean.getTasks().getTeacher_tasks() != null && giftBoxBean.getTasks().getTeacher_tasks().size() > 0) { - sections.add(new TaskItem("师徒任务", giftBoxBean.getTasks().getTeacher_tasks())); - } - - // 平台任务 - sections.add(new TaskItem("平台任务", giftBoxBean.getTasks().getUsual_tasks())); - mTaskDataAdapter = new TaskSectionAdapter(sections); - mBinding.rvTaskToday.setAdapter(mTaskDataAdapter); - mTaskDataAdapter.setOnItemClickListener(new TaskSectionAdapter.OnItemClickListener() { - @Override - public void onItemClick(TaskItem taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item) { - if (taskItem.getTitle().equals("今日任务") || taskItem.getTitle().equals("平台任务") || taskItem.getTitle().equals("师徒任务")) { - if (item.getTask_status() == 2) { - MvpPre.dailyTasksReceive(item.getTask_id() + ""); - } - } else { - if (item.getTask_status() == 2) { - MvpPre.dailyTasksReceive(item.getTask_id() + ""); - } else if (item.getTask_status() == 1) { - mBinding.coolWaitView.setVisibility(View.VISIBLE); -// if (item.getTask_id() == 9) { - RoomManager.getInstance().fetchRoomDataAndEnter(DailyTasksActivity.this, item.getFrom_id(), "", item.getTask_id() + ""); - finish(); -// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("roomId", item.getFrom_id()).withString("taskId", item.getTask_id() + "").navigation(); -// } else { -// RoomManager.getInstance().fetchRoomDataAndEnter(DailyTasksActivity.this, item.getFrom_id(), "", item.getTask_id() + ""); - -// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("roomId", item.getFrom_id()).withString("taskId", item.getTask_id() + "").navigation(); -// } - } - } - } - }); + taskList.clear(); + giftBoxBean.getTasks().stream() + .filter(task -> !task.getTask_list().isEmpty()) + .forEach(taskList::add); + mTaskDataAdapter.notifyDataSetChanged(); } + private void taskStatus1(GiftBoxBean.TaskDataBean.DailyTasksBean item) { + switch (item.getTask_id()) { + case 1: + SignInDialog sginDialog = new SignInDialog(this); + sginDialog.setOnCloseListener(new Function0() { + @Override + public Unit invoke() { + MvpPre.tasksLihen(); + return null; + } + }); + sginDialog.show(); + break; + default: + switch (item.getJump_type()) { + case 1: + toActivity(RealNameActivity.class); + break; + case 2: + toActivity(CreateAlbumActivity.class); + break; + case 3: + toActivity(BindCardActivity.class); + break; + case 4: + mBinding.coolWaitView.setVisibility(View.VISIBLE); + MvpPre.taskJumpRoom(item, item.getTask_id() + ""); + break; + case 5: + //跳转加入公会 + Intent intent = new Intent(DailyTasksActivity.this, WebViewActivity.class); + intent.putExtra("url", String.format(WebUrlConstants.INSTANCE.getWEB_GUILD_URL(), SpUtil.getToken(), "")); + intent.putExtra("title", "公会"); + startActivity(intent); + break; + case 6: + toActivity(RechargeActivity.class); + break; + case 0: + break; + } + break; + } + } + + @SuppressLint("CheckResult") @Override protected void onPause() { super.onPause(); Observable.timer(5, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(aLong -> { mBinding.coolWaitView.setVisibility(View.GONE); + if (!isFinishing() && isJoinRoom) { + finish(); + } }); + } + @Override public void dailyTasksOpenBox(GiftName giftName) { ToastUtils.show(giftName.getGift_name()); @@ -167,4 +236,52 @@ public class DailyTasksActivity extends BaseMvpActivity 1) { + if (ActivityUtils.getActivityList().get(ActivityUtils.getActivityList().size() - 2) instanceof RoomActivity) { + if (!TextUtils.isEmpty(CommonAppContext.getInstance().playId) && CommonAppContext.getInstance().playId.equals(roomId)) { + finish(); + return; + } + ((RoomActivity) ActivityUtils.getActivityList().get(ActivityUtils.getActivityList().size() - 2)).refreshRoomInfo(roomId); + finish(); + return; + } + } + RoomManager.getInstance().fetchRoomDataAndEnter(DailyTasksActivity.this, roomId, "", null); + isJoinRoom = true; + } catch (Exception e) { + e.printStackTrace(); + LogUtils.e("taskJumpRoom error: " + e.getMessage()); + } + } + + } \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftBoxRecordActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftBoxRecordActivity.java index 7bf22747..fdeb9387 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftBoxRecordActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/GiftBoxRecordActivity.java @@ -37,7 +37,7 @@ public class GiftBoxRecordActivity extends BaseMvpActivity ARouter.getInstance().build(ARouteConstants.USER_HOME_PAGE) - .withString("userId", mHeartData?.gift_log!![position].from_user_id.toString()) + .withString("userId", dataList?.get(position)?.from_user_id.toString()) .navigation(); finish() } @@ -94,12 +95,12 @@ class HeartCpActivity : BaseMvpActivity 1) { + // 如果当前录音片段太短且不是第一个片段,则移除它 + File lastSegment = recordingSegments.get(recordingSegments.size() - 1); + if (lastSegment.exists()) { + lastSegment.delete(); + } + recordingSegments.remove(recordingSegments.size() - 1); + LogUtils.d("SingerVerification", "移除过短的录音片段: " + lastSegment.getAbsolutePath()); + } // 处理录音片段 - if (recordingSegments.size() > 1) { - // 如果有多个录音片段,合并它们 + // 修复:每次停止录音时都合并所有片段,确保录音连续性 + if (recordingSegments.size() >= 1) { + // 始终合并所有录音片段,确保连续性 mergeAudioFiles(); // 更新录音时长为所有片段的总时长 updateRecordingDuration(); - } else if (recordingSegments.size() == 1) { - // 只有一个录音片段,直接使用 - recordingFile = recordingSegments.get(0); } // 更新状态 @@ -749,11 +725,9 @@ public class SingerVerificationActivity extends BaseMvpActivity { - cleanupSegments(processedSegments); - }, 30000); // 延迟30秒删除,确保用户有足够时间试听 + // 修复:不删除录音片段,以便后续继续追加录音 + // 只在用户点击"重新录音"时才删除所有片段 + // cleanupSegments(processedSegments); } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/TotalRevenueActivity.kt b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/TotalRevenueActivity.kt index b3de06d7..397b15d3 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/TotalRevenueActivity.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/TotalRevenueActivity.kt @@ -80,7 +80,7 @@ class TotalRevenueActivity : BaseMvpActivity { diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UnderageActivity.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UnderageActivity.java index 9c3f09c6..ff0cab47 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UnderageActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/activity/UnderageActivity.java @@ -127,7 +127,7 @@ public class UnderageActivity extends BaseMvpActivity mSongPlaylistBean; + private List mSongPlaylistBean = new ArrayList<>(); @Override protected void initView() { @@ -60,7 +62,7 @@ public class UserPlaylistActivity extends BaseMvpActivity()); + mAdapter = new UserPlaylistAdapter(this, mSongPlaylistBean); mBinding.recycleView.setAdapter(mAdapter); // 设置滑动操作 // ItemTouchHelper itemTouchHelper = UserPlaylistAdapter.getItemTouchHelper(mAdapter); @@ -146,31 +148,24 @@ public class UserPlaylistActivity extends BaseMvpActivity implements DailyTasksConacts.IMePre{ + + DailyTasksConacts.View mView; public DailyTasksPresenter(DailyTasksConacts.View view, Context context) { super(view, context); + mView = view; } //获取礼盒列表 @Override public void tasksLihen() { - api.tasksLihen(new BaseObserver() { + RetrofitClient.getInstance().tasksLihen(new BaseObserver() { @Override public void onSubscribe(Disposable d) { addDisposable(d); @@ -26,6 +32,9 @@ public class DailyTasksPresenter extends BasePresenter i @Override public void onNext(GiftBoxBean giftBoxBean) { + if (MvpRef == null){ + MvpRef = new WeakReference<>(mView); + } MvpRef.get().setGiftBox(giftBoxBean); } }); @@ -33,7 +42,7 @@ public class DailyTasksPresenter extends BasePresenter i @Override public void dailyTasksOpenBox(String gift_box_id) { - api.dailyTasksOpenBox(gift_box_id, new BaseObserver() { + RetrofitClient.getInstance().dailyTasksOpenBox(gift_box_id, new BaseObserver() { @Override public void onSubscribe(Disposable d) { addDisposable(d); @@ -41,14 +50,17 @@ public class DailyTasksPresenter extends BasePresenter i @Override public void onNext(GiftName giftName) { + if (MvpRef == null){ + MvpRef = new WeakReference<>(mView); + } MvpRef.get().dailyTasksOpenBox(giftName); } }); } @Override - public void dailyTasksReceive(String task_id) { - api.dailyTasksReceive(task_id, new BaseObserver() { + public void dailyTasksReceive(String task_id,String student_id) { + RetrofitClient.getInstance().dailyTasksReceive(task_id,student_id, new BaseObserver() { @Override public void onSubscribe(Disposable d) { @@ -57,11 +69,33 @@ public class DailyTasksPresenter extends BasePresenter i @Override public void onNext(String s) { + if (MvpRef == null){ + MvpRef = new WeakReference<>(mView); + } MvpRef.get().dailyTasksComplete(); } }); } + @Override + public void taskJumpRoom(GiftBoxBean.TaskDataBean.DailyTasksBean item,String taskId) { + RetrofitClient.getInstance().taskJumpRoomId(taskId, new BaseObserver() { + + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(String s) { + if (MvpRef == null){ + MvpRef = new WeakReference<>(mView); + } + MvpRef.get().taskJumpRoom(item,s); + } + }); + } + } diff --git a/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/MyBagPresenter.java b/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/MyBagPresenter.java index f73dc35a..5ca811a4 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/MyBagPresenter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/activity/user/presenter/MyBagPresenter.java @@ -55,6 +55,7 @@ public class MyBagPresenter extends BasePresenter implements MvpRef=new WeakReference<>(mView); } MvpRef.get().packOutcome(myBagDataBeans); + MvpRef.get().finishRefreshLoadMore(); } }); } diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt b/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt index 8d7428b4..d80127ee 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/BosomFriendAdapter.kt @@ -78,36 +78,57 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic holder.setText(R.id.tv_heartbeat, noCpBean.relation_name) // 显示关系名称 - holder.setText(R.id.tv_cp_lv, 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,noCpBean.relation_list[0].dress1) - meHeadView2.setSex(noCpBean.relation_list[0].sex2,noCpBean.relation_list[0].avatar2,noCpBean.relation_list[0].dress2) + if (noCpBean.relation_list[0].user_id1 == userId.toInt()){ + meHeadView.setSex(noCpBean.relation_list[0].sex1,noCpBean.relation_list[0].avatar1,noCpBean.relation_list[0].dress1) + holder.setText(R.id.tv_nickname1, noCpBean.relation_list[0].nickname1) + holder.setText(R.id.tv_nickname2, noCpBean.relation_list[0].nickname2) + meHeadView2.setSex(noCpBean.relation_list[0].sex2,noCpBean.relation_list[0].avatar2,noCpBean.relation_list[0].dress2) + + }else{ + meHeadView.setSex(noCpBean.relation_list[0].sex2,noCpBean.relation_list[0].avatar2,noCpBean.relation_list[0].dress2) + holder.setText(R.id.tv_nickname1, noCpBean.relation_list[0].nickname2) + holder.setText(R.id.tv_nickname2, noCpBean.relation_list[0].nickname1) + meHeadView2.setSex(noCpBean.relation_list[0].sex1,noCpBean.relation_list[0].avatar1,noCpBean.relation_list[0].dress1) + + } + // 设置点击事件 + holder.getView(R.id.user_nav1).setOnClickListener { + if(noCpBean.relation_list[0].user_id1 == userId.toInt()){ + onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id1.toString()) + }else{ + onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id2.toString()) + } + // 点击第一个用户头像 + } + holder.getView(R.id.user_nav2).setOnClickListener { + // 点击第二个用户头像 +// onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id2.toString()) + if(noCpBean.relation_list[0].user_id2 == userId.toInt()){ + onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id2.toString()) + + }else{ + onItemClickListener?.onUserClick(noCpBean.relation_list[0].user_id1.toString()) + } + } // 显示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()) { + + 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 { @@ -188,7 +209,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic meHeadView=holder.getView(R.id.user_nav1) meHeadView2=holder.getView(R.id.user_nav2) - if (relation1.user_id1== SpUtil.getUserId()){ + if (relation1.user_id1== userId.toInt()){ meHeadView.setSex(relation1.sex2,relation1.avatar2,relation1.dress2) holder.setText(R.id.tv_nickname1, relation1.nickname2) @@ -197,7 +218,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic holder.setText(R.id.tv_nickname1, relation1.nickname1) } - if (relation2.user_id1== SpUtil.getUserId()){ + if (relation2.user_id1==userId.toInt()){ meHeadView2.setSex(relation2.sex2,relation2.avatar2,relation2.dress2) holder.setText(R.id.tv_nickname2, relation2.nickname2) }else{ @@ -215,7 +236,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic holder.setText(R.id.tv_gx_time2, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[1].end_time.toLong()* 1000 - System.currentTimeMillis())) holder.getView(R.id.user_nav1).setOnClickListener { - if (relation1.user_id1== SpUtil.getUserId()){ + if (relation1.user_id1== userId.toInt()){ // 点击第一个用户头像 onItemClickListener?.onUserClick(relation1.user_id2.toString()) }else { @@ -225,7 +246,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic } holder.getView(R.id.user_nav2).setOnClickListener { - if (relation2.user_id1== SpUtil.getUserId()) { + if (relation2.user_id1== userId.toInt()) { // 点击第二个用户头像 onItemClickListener?.onUserClick(relation2.user_id2.toString()) }else{ @@ -251,7 +272,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic meHeadView2=holder.getView(R.id.user_nav2) meHeadView3=holder.getView(R.id.user_nav3) - if (relation1.user_id1== SpUtil.getUserId()){ + if (relation1.user_id1== userId.toInt()){ meHeadView.setSex(relation1.sex2,relation1.avatar2,relation1.dress2) holder.setText(R.id.tv_nickname1, relation1.nickname2) }else{ @@ -259,7 +280,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic holder.setText(R.id.tv_nickname1, relation1.nickname1) } - if (relation2.user_id1== SpUtil.getUserId()){ + if (relation2.user_id1== userId.toInt()){ meHeadView2.setSex(relation2.sex2,relation2.avatar2,relation2.dress2) holder.setText(R.id.tv_nickname2, relation2.nickname2) }else{ @@ -267,7 +288,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic holder.setText(R.id.tv_nickname2, relation2.nickname1) } - if (relation3.user_id1== SpUtil.getUserId()){ + if (relation3.user_id1==userId.toInt()){ meHeadView3.setSex(relation3.sex2,relation3.avatar2,relation3.dress2) holder.setText(R.id.tv_nickname3, relation3.nickname2) }else{ @@ -292,7 +313,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic holder.setText(R.id.tv_gx_time3, TimeUtils.formatDurationDaysOnly(noCpBean.relation_list[2].end_time.toLong()* 1000 - System.currentTimeMillis())) holder.getView(R.id.user_nav1).setOnClickListener { - if (relation1.user_id1== SpUtil.getUserId()){ + if (relation1.user_id1== userId.toInt()){ // 点击第一个用户头像 onItemClickListener?.onUserClick(relation1.user_id2.toString()) }else { @@ -302,7 +323,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic } holder.getView(R.id.user_nav2).setOnClickListener { - if (relation2.user_id1== SpUtil.getUserId()) { + if (relation2.user_id1== userId.toInt()) { // 点击第二个用户头像 onItemClickListener?.onUserClick(relation2.user_id2.toString()) }else{ @@ -310,7 +331,7 @@ class BosomFriendAdapter(data: MutableList) : BaseMultiItemQuic } } holder.getView(R.id.user_nav3).setOnClickListener { - if (relation3.user_id1== SpUtil.getUserId()) { + if (relation3.user_id1==userId.toInt()) { // 点击第三个用户头像 onItemClickListener?.onUserClick(relation3.user_id2.toString()) }else{ diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/EaseChatAdapter.java b/MainModule/src/main/java/com/xscm/modulemain/adapter/EaseChatAdapter.java index 514b75ec..603f882b 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/EaseChatAdapter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/EaseChatAdapter.java @@ -227,7 +227,7 @@ public class EaseChatAdapter extends BaseMultiItemQuickAdapter { FullScreenUtil.showFullScreenDialog(mContext, position, oneImageYuanJiaoAdapter.getList_adapter()); }); - }else { + } else { helper.getView(R.id.dy_image_recyc).setVisibility(View.GONE); } @@ -129,7 +129,7 @@ public class ExpandColumnAdapter extends BaseQuickAdapter images = item.getIcon(); // 获取图片列表 for (String url : images) { - if (url.contains("http")) { + if (url != null && url.contains("http")) { ImageView imageView = new ImageView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/PlaceholderFragment.java b/MainModule/src/main/java/com/xscm/modulemain/adapter/PlaceholderFragment.java index c4c22a1b..5346d336 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/PlaceholderFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/PlaceholderFragment.java @@ -224,12 +224,10 @@ public class PlaceholderFragment extends BaseMvpFragment images = item.getIcon(); // 获取图片列表 for (String url : images) { - if (url.contains("http")) { + if (url != null && url.contains("http")) { ImageView imageView1 = new ImageView(helper.itemView.getContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, @@ -128,7 +128,7 @@ public class RoomOnlineAdapter extends BaseMultiItemQuickAdapter { - private List sections; + private List sections; - public TaskSectionAdapter(List sections) { + public TaskSectionAdapter(List sections) { this.sections = sections; } + // 定义点击事件接口 public interface OnItemClickListener { - void onItemClick(TaskItem taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item); + void onItemClick(GiftBoxBean.TaskDataBean taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item); } private OnItemClickListener listener; @@ -32,6 +33,7 @@ public class TaskSectionAdapter extends RecyclerView.Adapter { + if (listener != null) { + listener.onItemClick(section, item); } }); } diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomGiftDialogFragment.java b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomGiftDialogFragment.java index 388673a0..06f7992d 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomGiftDialogFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomGiftDialogFragment.java @@ -622,7 +622,7 @@ public class RoomGiftDialogFragment extends BaseMvpDialogFragment implements RoomHostContacts.View { - private String mRoomId ; + private String mRoomId; private BaseQuickAdapter mAdapter; // TODO: Customize parameter initialization @@ -51,11 +52,13 @@ public class RoomHostAddFragment extends BaseMvpDialogFragment0){ + if (!item.getIcon().isEmpty() || item.getIcon().size() > 0) { for (String url : item.getIcon()) { - if (url.contains("http")) { + if (url != null && url.contains("http")) { ImageView imageView = new ImageView(getContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( getContext().getResources().getDimensionPixelSize(com.xscm.moduleutil.R.dimen.dp_57), @@ -154,7 +157,6 @@ public class RoomHostAddFragment extends BaseMvpDialogFragment list) { - mAdapter.setNewData(list); + mAdapter.setNewData(list); } @Override @@ -232,7 +234,4 @@ public class RoomHostAddFragment extends BaseMvpDialogFragment onlineBeanList = new ArrayList<>(); + + private RoomOnline mOnlineBean; + @Override protected RoomPresenter bindPresenter() { return new RoomPresenter(this, getActivity()); } - public static RoomOnlineDialogFragment show(String id, String pit_number, RoomUserBean hostUser, RoomInfoResp roomInfoResp, FragmentManager fragmentManager) { + public static RoomOnlineDialogFragment show(String id, String pit_number, RoomOnline mOnlineBean, RoomUserBean hostUser, RoomInfoResp roomInfoResp, FragmentManager fragmentManager) { RoomOnlineDialogFragment dialogFragment = new RoomOnlineDialogFragment(); Bundle args = new Bundle(); args.putString("roomId", id); // 可选:传递参数 args.putString("pit_number", pit_number); args.putSerializable("hostUser", hostUser); // 可选:传递参数 args.putSerializable("roomInfoResp", roomInfoResp); + args.putSerializable("mOnlineBean", mOnlineBean); dialogFragment.setArguments(args); dialogFragment.show(fragmentManager, "RoomOnlineDialogFragment"); return dialogFragment; @@ -66,7 +72,7 @@ public class RoomOnlineDialogFragment extends BaseMvpDialogFragment roomOnlineBeanList = processOnlineData(mOnlineBean); + onlineBeanList.addAll(roomOnlineBeanList); + updateUserCount(mOnlineBean.getCount()); mBinding.rvComment.setLayoutManager(new LinearLayoutManager(getActivity())); - roomOnlineAdapter = new RoomOnlineAdapter(new ArrayList()); + roomOnlineAdapter = new RoomOnlineAdapter(onlineBeanList); mBinding.rvComment.setAdapter(roomOnlineAdapter); roomOnlineAdapter.setListener(new RoomOnlineAdapter.OnJoinButtonClickListener() { @@ -216,41 +225,15 @@ public class RoomOnlineDialogFragment extends BaseMvpDialogFragment { - finishRefreshOrLoad(); - - if (onlineBean == null) { - handleEmptyData(); - return; - } - - List roomOnlineBeanList = processOnlineData(onlineBean); - updateAdapterData(roomOnlineBeanList); - updateUserCount(onlineBean.getCount()); - }); + List roomOnlineBeanList = processOnlineData(onlineBean); + updateAdapterData(roomOnlineBeanList); + updateUserCount(onlineBean.getCount()); } private boolean isValidContext() { return getActivity() != null && mBinding != null; } - private void finishRefreshOrLoad() { - if (mBinding.srl == null) return; - - if (page <= 1) { - mBinding.srl.finishRefresh(); - } else { - mBinding.srl.finishLoadMore(); - } - } - - private void handleEmptyData() { - if (page <= 1) { - roomOnlineAdapter.setNewData(new ArrayList<>()); - } else if (mBinding.srl != null) { - mBinding.srl.finishLoadMoreWithNoMoreData(); - } - } private List processOnlineData(RoomOnline onlineBean) { List result = new ArrayList<>(); @@ -296,13 +279,11 @@ public class RoomOnlineDialogFragment extends BaseMvpDialogFragment newData) { - if (page <= 1) { - roomOnlineAdapter.setNewData(newData); - } else if (!newData.isEmpty()) { - roomOnlineAdapter.addData(newData); - } else if (mBinding.srl != null) { - mBinding.srl.finishLoadMoreWithNoMoreData(); + if (page == 1) { + onlineBeanList.clear(); } + onlineBeanList.addAll(newData); + roomOnlineAdapter.notifyDataSetChanged(); } private void updateUserCount(int count) { @@ -315,11 +296,7 @@ public class RoomOnlineDialogFragment extends BaseMvpDialogFragment onlineBean) { -// roomOnlineAdapter.setNewData(onlineBean); -// mBinding.tvNum.setText("在线用户("+onlineBean.size()+")人"); -// } + @Override public void onResume() { super.onResume(); diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomUserInfoFragment.java b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomUserInfoFragment.java index 122e5805..6a718a3f 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomUserInfoFragment.java +++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/RoomUserInfoFragment.java @@ -119,6 +119,7 @@ public class RoomUserInfoFragment extends BaseMvpDialogFragment(context) { + var signInDataLists: List? = ArrayList() + private var onCloseCallback: (() -> Unit)? = null + + fun setOnCloseListener(callback: () -> Unit) = apply { + onCloseCallback = callback + } + + + init { + // 设置对话框从底部弹出 + window?.setGravity(Gravity.CENTER) + // 设置对话框的宽度为屏幕宽度 + // 2025年12月12日15:56:12 实验这里去掉,然后给布局中设置paddingHorizontal,效果和这里设置固定宽度是一样的 +// window?.setLayout( +// (ScreenUtils.getScreenWidth() * 331f / 375).toInt(), +// ViewGroup.LayoutParams.WRAP_CONTENT +// ) + // 添加动画效果 + window?.setWindowAnimations(com.xscm.moduleutil.R.style.DialogAnimationt) + setCancelable(false) + setCanceledOnTouchOutside(false) + } + + override fun getLayoutId(): Int { + return R.layout.dialog_sign + } + + override fun initView() { + mBinding.ivClose.setOnClickListener { + onCloseCallback?.invoke() + dismiss() + } + mBinding.btnSign.setOnClickListener { + + RetrofitClient.getInstance().dailyTasksSign(object : BaseObserver() { + override fun onSubscribe(d: Disposable) { + } + + override fun onNext(t: String) { + var signInSuccessDialog=SignInSuccessDialog(context) + signInSuccessDialog.viewData(signInData) + signInSuccessDialog.setOnCloseListener { + onCloseCallback?.invoke() + } + signInSuccessDialog.show() + dismiss() + } + }) + } + } + + override fun initData() { + RetrofitClient.getInstance().signIn(object : BaseObserver>() { + override fun onSubscribe(d: Disposable) { + } + + override fun onNext(t: List) { + if (t.isNotEmpty()) { + signInDataLists = t + for (i in signInDataLists!!) { + setUpView(i) + } + }else{ + onCloseCallback?.invoke() + dismiss() + } + } + + }) + } + + var signInData = SignInData() + + fun setUpView(signInData: SignInData) { + if (signInData.is_today == 1) { + this.signInData = signInData + if (signInData.sign_in_status == 1) { + mBinding.btnSign.text = "已签到" + mBinding.btnSign.isEnabled = false + mBinding.btnSign.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_r53_f3f3f3) + } + } + if (signInData.day == 1) { + mBinding.day1.tvDay.text = signInData.day.toString() + + mBinding.day1.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day1.ivCollected.visibility = View.VISIBLE + mBinding.day1.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day1.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day1.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day1.ivSign + ) + } + } else if (signInData.day == 2) { + mBinding.day2.tvDay.text = signInData.day.toString() + + mBinding.day2.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day2.ivCollected.visibility = View.VISIBLE + mBinding.day2.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day2.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day2.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day2.ivSign + ) + } + } else if (signInData.day == 3) { + mBinding.day3.tvDay.text = signInData.day.toString() + + mBinding.day3.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day3.ivCollected.visibility = View.VISIBLE + mBinding.day3.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day3.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day3.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day3.ivSign + ) + } + } else if (signInData.day == 4) { + mBinding.day4.tvDay.text = signInData.day.toString() + + mBinding.day4.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day4.ivCollected.visibility = View.VISIBLE + mBinding.day4.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day4.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day4.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day4.ivSign + ) + } + } else if (signInData.day == 5) { + mBinding.day5.tvDay.text = signInData.day.toString() + + mBinding.day5.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day5.ivCollected.visibility = View.VISIBLE + mBinding.day5.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day5.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day5.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day5.ivSign + ) + } + } else if (signInData.day == 6) { + mBinding.day6.tvDay.text = signInData.day.toString() + + mBinding.day6.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day6.ivCollected.visibility = View.VISIBLE + mBinding.day6.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day6.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day6.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day6.ivSign + ) + } + } else if (signInData.day == 7) { + mBinding.day7.tvDay.text = signInData.day.toString() + + mBinding.day7.tvSiginPrice.text = signInData.gift_name + "*" + signInData.num + if (signInData.sign_in_status == 1) { + mBinding.day7.ivCollected.visibility = View.VISIBLE + mBinding.day7.root.setBackgroundResource(com.xscm.moduleutil.R.drawable.bg_sigin_status) + ImageLoader.loadImage( + context, + mBinding.day7.ivSign, + signInData.base_image, + 0.4f + ) + } else { + mBinding.day7.ivCollected.visibility = View.GONE + com.xscm.moduleutil.utils.ImageUtils.loadHead( + signInData.base_image, + mBinding.day7.ivSign + ) + } + } + } +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInSuccessDialog.kt b/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInSuccessDialog.kt new file mode 100644 index 00000000..956dbec0 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/dialog/SignInSuccessDialog.kt @@ -0,0 +1,57 @@ +package com.xscm.modulemain.dialog + +import android.content.Context +import android.view.Gravity +import android.view.ViewGroup +import com.blankj.utilcode.util.ScreenUtils +import com.xscm.modulemain.R +import com.xscm.modulemain.databinding.DialogSignSuccesBinding +import com.xscm.moduleutil.bean.SignInData +import com.xscm.moduleutil.utils.ImageUtils +import com.xscm.moduleutil.widget.dialog.BaseDialog + +/** + * 项目名称:羽声语音 + * 时间:2025/12/12 9:37 + * 用途:签到成功后展示页面 + */ +class SignInSuccessDialog(context: Context) : BaseDialog(context) { + private var onCloseCallback: (() -> Unit)? = null + + fun setOnCloseListener(callback: () -> Unit) = apply { + onCloseCallback = callback + } + init { + // 设置对话框从底部弹出 + window?.setGravity(Gravity.CENTER) + // 设置对话框的宽度为屏幕宽度 + window?.setLayout( + (ScreenUtils.getScreenWidth() * 315f / 375).toInt(), + ViewGroup.LayoutParams.WRAP_CONTENT + ) + // 添加动画效果 + window?.setWindowAnimations(com.xscm.moduleutil.R.style.DialogAnimationt) + setCancelable(false) + setCanceledOnTouchOutside(false) + } + + override fun getLayoutId(): Int { + return R.layout.dialog_sign_succes + } + + override fun initView() { + mBinding.btnSign.setOnClickListener { + onCloseCallback?.invoke() + dismiss() + } + } + + override fun initData() { + } + + fun viewData(signInData: SignInData) { + ImageUtils.loadHead(signInData.base_image, mBinding.imV) + mBinding.tvSignPrice.text ="签到成功 "+ signInData.gift_name+""+signInData.num + } + +} \ No newline at end of file diff --git a/MainModule/src/main/java/com/xscm/modulemain/manager/RoomManager.java b/MainModule/src/main/java/com/xscm/modulemain/manager/RoomManager.java index cdf23b4c..40f63587 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/manager/RoomManager.java +++ b/MainModule/src/main/java/com/xscm/modulemain/manager/RoomManager.java @@ -16,6 +16,7 @@ import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.ToastUtils; import com.xscm.modulemain.activity.main.activity.MainActivity; import com.xscm.modulemain.activity.room.activity.RoomActivity; +import com.xscm.modulemain.activity.user.activity.DailyTasksActivity; import com.xscm.modulemain.activity.user.activity.MyRoomActivity; import com.xscm.moduleutil.base.CommonAppContext; import com.xscm.moduleutil.bean.room.RoomInfoResp; @@ -155,6 +156,10 @@ public class RoomManager { if (resp != null) { if (ActivityUtils.getTopActivity() instanceof MainActivity){ ((MainActivity) ActivityUtils.getTopActivity()).isShowLoading(false); + }else if (ActivityUtils.getTopActivity() instanceof MyRoomActivity){ + ((MyRoomActivity) ActivityUtils.getTopActivity()).isShowLoading(false); + }else if (ActivityUtils.getTopActivity() instanceof DailyTasksActivity){ + ((DailyTasksActivity) ActivityUtils.getTopActivity()).isShowLoading(false); } if (!resp.getRoom_id().isEmpty()){ if(CommonAppContext.getInstance().playId==null){ @@ -194,6 +199,8 @@ public class RoomManager { ((MainActivity) ActivityUtils.getTopActivity()).isShowLoading(false); }else if (ActivityUtils.getTopActivity() instanceof MyRoomActivity){ ((MyRoomActivity) ActivityUtils.getTopActivity()).isShowLoading(false); + } else if (ActivityUtils.getTopActivity() instanceof DailyTasksActivity){ + ((DailyTasksActivity) ActivityUtils.getTopActivity()).isShowLoading(false); } } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/utils/TimerManager.kt b/MainModule/src/main/java/com/xscm/modulemain/utils/TimerManager.kt new file mode 100644 index 00000000..5b9045f7 --- /dev/null +++ b/MainModule/src/main/java/com/xscm/modulemain/utils/TimerManager.kt @@ -0,0 +1,82 @@ +package com.xscm.modulemain.utils + +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledFuture +import java.util.concurrent.TimeUnit + +/** + * 单例定时器管理类 + * 特性: + * 1. 单例模式,全局唯一实例 + * 2. 支持多任务管理(通过taskId区分) + * 3. 时间到触发回调,支持取消指定/所有定时器 + * 4. 线程安全,适配多线程场景 + */ +object TimerManager { + // 线程安全的ScheduledExecutorService(核心线程数1,足够处理定时任务) + private val scheduler = Executors.newSingleThreadScheduledExecutor() + + // 存储定时任务的Future(用于取消任务),ConcurrentHashMap保证线程安全 + private val taskMap = ConcurrentHashMap>() + + /** + * 启动一个定时任务 + * @param taskId 任务唯一标识(用于后续取消) + * @param delay 延迟时间(比如5表示5秒/5分钟,取决于unit) + * @param unit 时间单位(TimeUnit.SECONDS/TimeUnit.MILLISECONDS等) + * @param onTimeUp 时间到的回调(默认在后台线程执行) + */ + fun scheduleTimer( + taskId: String, + delay: Long, + unit: TimeUnit, + onTimeUp: () -> Unit + ) { + // 先取消同名任务(避免重复创建) + if (taskMap.containsKey(taskId)) { + cancelTimer(taskId) + } + + // 提交定时任务 + val future = scheduler.schedule({ + try { + onTimeUp.invoke() // 执行回调 + taskMap.remove(taskId) // 执行完自动移除任务记录 + } catch (e: Exception) { + // 捕获回调异常,避免影响定时器线程 + println("Timer task $taskId callback error: ${e.message}") + } + }, delay, unit) + + // 记录任务Future + taskMap[taskId] = future + } + + /** + * 取消指定的定时任务 + * @param taskId 任务唯一标识 + * @return 是否取消成功(true=取消成功/任务已执行;false=任务不存在) + */ + fun cancelTimer(taskId: String): Boolean { + val future = taskMap.remove(taskId) ?: return false + // mayInterruptIfRunning:是否中断正在执行的任务(这里设为false,避免强制中断) + return future.cancel(false) + } + + /** + * 取消所有定时任务 + */ + fun cancelAllTimers() { + taskMap.values.forEach { it.cancel(false) } + taskMap.clear() + } + + /** + * 销毁定时器(应用退出时调用,释放资源) + */ + fun destroy() { + cancelAllTimers() + scheduler.shutdown() // 关闭线程池 + } +} \ No newline at end of file diff --git a/MainModule/src/main/res/drawable/shape_8.xml b/MainModule/src/main/res/drawable/shape_8.xml new file mode 100644 index 00000000..36e0c16a --- /dev/null +++ b/MainModule/src/main/res/drawable/shape_8.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/activity_daily_tasks.xml b/MainModule/src/main/res/layout/activity_daily_tasks.xml index d9b3329e..570a6a60 100644 --- a/MainModule/src/main/res/layout/activity_daily_tasks.xml +++ b/MainModule/src/main/res/layout/activity_daily_tasks.xml @@ -11,7 +11,7 @@ + android:background="@color/color_e3fae4"> + android:layout_marginTop="@dimen/dp_10" + android:layout_marginEnd="@dimen/dp_16"> + + @@ -53,7 +58,8 @@ android:layout_below="@+id/tv_title" android:layout_marginTop="@dimen/dp_8" android:background="@drawable/bg_r16_fff" - android:padding="@dimen/dp_16" /> + android:paddingHorizontal="@dimen/dp_11" + android:paddingVertical="@dimen/dp_16" /> @@ -62,51 +68,34 @@ android:id="@+id/rv_task_today" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="@dimen/dp_12" android:paddingStart="@dimen/dp_16" - android:paddingBottom="@dimen/dp_100" - android:paddingEnd="@dimen/dp_16" /> - - + android:paddingEnd="@dimen/dp_16" + android:clipToPadding="false" + android:paddingBottom="@dimen/dp_100" /> - - - - - - - - - - - - - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + @@ -235,7 +236,6 @@ android:clipChildren="false" android:clipToPadding="false" android:paddingHorizontal="@dimen/dp_16" - android:paddingBottom="@dimen/dp_100" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:spanCount="1" tools:listitem="@layout/item_heart_cp_layout" /> diff --git a/MainModule/src/main/res/layout/activity_room_details.xml b/MainModule/src/main/res/layout/activity_room_details.xml index 41b9bfec..503f68f5 100644 --- a/MainModule/src/main/res/layout/activity_room_details.xml +++ b/MainModule/src/main/res/layout/activity_room_details.xml @@ -10,7 +10,7 @@ + android:textSize="@dimen/sp_12" + android:visibility="gone"/> @@ -30,7 +31,7 @@ android:layout_centerInParent="true" android:layout_gravity="center_horizontal" android:gravity="center" - android:text="选择相册" + tools:text="选择话题" android:textColor="@color/black" android:textSize="16sp" /> diff --git a/MainModule/src/main/res/layout/day_sgin.xml b/MainModule/src/main/res/layout/day_sgin.xml new file mode 100644 index 00000000..f2103f87 --- /dev/null +++ b/MainModule/src/main/res/layout/day_sgin.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/day_sgin2.xml b/MainModule/src/main/res/layout/day_sgin2.xml new file mode 100644 index 00000000..7fbb4280 --- /dev/null +++ b/MainModule/src/main/res/layout/day_sgin2.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/dialog_sign.xml b/MainModule/src/main/res/layout/dialog_sign.xml new file mode 100644 index 00000000..c6b572d0 --- /dev/null +++ b/MainModule/src/main/res/layout/dialog_sign.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainModule/src/main/res/layout/dialog_sign_succes.xml b/MainModule/src/main/res/layout/dialog_sign_succes.xml new file mode 100644 index 00000000..cc88e3d4 --- /dev/null +++ b/MainModule/src/main/res/layout/dialog_sign_succes.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainModule/src/main/res/layout/fragment_bosom_friend.xml b/MainModule/src/main/res/layout/fragment_bosom_friend.xml index 02614b06..bb761b9a 100644 --- a/MainModule/src/main/res/layout/fragment_bosom_friend.xml +++ b/MainModule/src/main/res/layout/fragment_bosom_friend.xml @@ -8,256 +8,279 @@ - - + android:orientation="vertical"> - + android:layout_height="match_parent"> - + + + + + + + + + + + + + + android:layout_marginHorizontal="@dimen/dp_10" + android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/im_intimate"> - - - + android:layout_height="match_parent" + android:orientation="vertical"> - + - - - - - - - - + android:text="心动" + android:textColor="#fff" + android:textSize="@dimen/sp_16" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:layout_marginHorizontal="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_15" + android:background="@mipmap/icon_dialog_u_cp_bg" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_heartbeat" + tools:visibility="visible"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + android:visibility="visible" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_heartbeat" /> + - + - + android:clipToPadding="false" + android:nestedScrollingEnabled="false" + android:paddingBottom="@dimen/dp_200" + tools:listitem="@layout/item_relationship_list" /> + + + - - - - - - - - + - - - - \ No newline at end of file diff --git a/MainModule/src/main/res/layout/fragment_jukebox.xml b/MainModule/src/main/res/layout/fragment_jukebox.xml index 4df32fbf..b5e789c7 100644 --- a/MainModule/src/main/res/layout/fragment_jukebox.xml +++ b/MainModule/src/main/res/layout/fragment_jukebox.xml @@ -75,7 +75,7 @@ android:id="@+id/tv_performer_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_3" + android:layout_marginTop="-15dp" android:text="请点歌" android:textColor="@color/colorWhite45" android:textSize="@dimen/sp_12" @@ -210,7 +210,7 @@ + android:lines="1" + android:ellipsize="end" + tools:text="演唱歌曲:我的好兄弟我的好兄弟我的好兄弟我的好兄弟我的好兄弟我的好兄弟" /> @@ -68,10 +69,7 @@ android:text="开始" android:textColor="@color/white" android:textSize="@dimen/sp_13" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="@id/tv_time" - app:layout_constraintEnd_toStartOf="@id/tv_time" - app:layout_constraintTop_toTopOf="@id/tv_time" /> + android:visibility="gone"/> + android:visibility="gone" /> @@ -353,6 +348,25 @@ + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/fragment_my_bag_list.xml b/MainModule/src/main/res/layout/fragment_my_bag_list.xml index 5088afd5..e805903a 100644 --- a/MainModule/src/main/res/layout/fragment_my_bag_list.xml +++ b/MainModule/src/main/res/layout/fragment_my_bag_list.xml @@ -2,22 +2,29 @@ - + android:layout_height="match_parent"> - - + android:layout_height="match_parent" + app:layout_constraintTop_toTopOf="parent" + app:srlEnableLoadMore="true" + app:srlEnableRefresh="true"> + + + \ No newline at end of file diff --git a/MainModule/src/main/res/layout/item_task_box.xml b/MainModule/src/main/res/layout/item_task_box.xml index 3c1989bb..4d0df284 100644 --- a/MainModule/src/main/res/layout/item_task_box.xml +++ b/MainModule/src/main/res/layout/item_task_box.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/item" - android:layout_marginEnd="@dimen/dp_10" + android:layout_marginHorizontal="@dimen/dp_7" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:custom="http://schemas.android.com/tools"> diff --git a/MainModule/src/main/res/layout/item_task_data.xml b/MainModule/src/main/res/layout/item_task_data.xml index ab086cc4..516ceedb 100644 --- a/MainModule/src/main/res/layout/item_task_data.xml +++ b/MainModule/src/main/res/layout/item_task_data.xml @@ -3,10 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/dp_16" - android:layout_marginTop="@dimen/dp_16" - android:layout_marginEnd="@dimen/dp_16" - android:layout_marginBottom="@dimen/dp_10"> + xmlns:tools="http://schemas.android.com/tools" + android:layout_marginBottom="@dimen/dp_20"> @@ -35,9 +31,10 @@ diff --git a/MainModule/src/main/res/layout/item_task_header.xml b/MainModule/src/main/res/layout/item_task_header.xml index 9a1abc67..138cbedd 100644 --- a/MainModule/src/main/res/layout/item_task_header.xml +++ b/MainModule/src/main/res/layout/item_task_header.xml @@ -2,7 +2,7 @@ @@ -20,7 +20,7 @@ android:id="@+id/rv_task_list" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_12" + android:layout_marginTop="@dimen/dp_14" android:nestedScrollingEnabled="false" android:paddingStart="@dimen/dp_16" android:paddingEnd="@dimen/dp_16" /> diff --git a/MainModule/src/main/res/layout/room_ranking_child.xml b/MainModule/src/main/res/layout/room_ranking_child.xml index 45cf8535..a9cad56f 100644 --- a/MainModule/src/main/res/layout/room_ranking_child.xml +++ b/MainModule/src/main/res/layout/room_ranking_child.xml @@ -24,8 +24,8 @@ + app:layout_constraintStart_toStartOf="@id/view_top2" + android:visibility="gone"/> + app:layout_constraintStart_toStartOf="@id/view_top1" + android:visibility="gone"/> + app:layout_constraintStart_toStartOf="@id/view_top3" + android:visibility="gone"/>