From d470b2fdb1e43f0578e2b4bf2b1b01ab68995171 Mon Sep 17 00:00:00 2001 From: lzl <1239365383@qq.com> Date: Thu, 11 Dec 2025 21:05:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xscm/moduleutil/bean/GiftBoxBean.java | 83 ++++++++--- .../moduleutil/bean/RoomMessageEvent.java | 3 + .../com/xscm/moduleutil/http/ApiServer.java | 6 +- .../xscm/moduleutil/http/RetrofitClient.java | 24 +++- .../listener/MessageListenerSingleton.java | 42 +++++- .../xscm/moduleutil/utils/CustomMsgCode.kt | 8 ++ .../com/xscm/moduleutil/widget/Constants.java | 11 +- BaseModule/src/main/res/values/colors.xml | 1 + .../java/com/xscm/modulemain/Application.kt | 112 ++++++++++++++- .../com/xscm/modulemain/BaseMvpActivity.java | 4 + .../user/activity/DailyTasksActivity.java | 135 +++++++++++++----- .../user/conacts/DailyTasksConacts.java | 6 +- .../user/presenter/DailyTasksPresenter.java | 25 +++- .../modulemain/adapter/TaskBoxAdapter.java | 21 ++- .../modulemain/adapter/TaskDataAdapter.java | 13 +- .../adapter/TaskSectionAdapter.java | 17 +-- .../com/xscm/modulemain/utils/TimerManager.kt | 82 +++++++++++ MainModule/src/main/res/drawable/shape_8.xml | 7 + .../main/res/layout/activity_daily_tasks.xml | 57 +++----- .../src/main/res/layout/item_task_box.xml | 2 +- .../src/main/res/layout/item_task_data.xml | 25 ++-- .../src/main/res/layout/item_task_header.xml | 4 +- 22 files changed, 537 insertions(+), 151 deletions(-) create mode 100644 BaseModule/src/main/java/com/xscm/moduleutil/utils/CustomMsgCode.kt create mode 100644 MainModule/src/main/java/com/xscm/modulemain/utils/TimerManager.kt create mode 100644 MainModule/src/main/res/drawable/shape_8.xml diff --git a/BaseModule/src/main/java/com/xscm/moduleutil/bean/GiftBoxBean.java b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GiftBoxBean.java index 55d0d283..adf4c50d 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/bean/GiftBoxBean.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/bean/GiftBoxBean.java @@ -3,16 +3,18 @@ package com.xscm.moduleutil.bean; import java.util.List; import lombok.Data; + /** - *@author qx - *@data 2025/5/27 - *@description: 礼盒数据 + * @author qx + * @data 2025/5/27 + * @description: 礼盒数据 */ @Data public class GiftBoxBean { private String user_gold;//累计获取的金币 private List gift_box_list; 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;// //解锁进度 @@ -47,18 +64,52 @@ public class GiftBoxBean { @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/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/http/ApiServer.java b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java index 5aa73c41..34bbfab6 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -80,7 +80,7 @@ public interface ApiServer { @FormUrlEncoded @POST(Constants.dailyTasksReceive) - Call 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); 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 fdf81a86..1f085d78 100644 --- a/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/BaseModule/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -1058,8 +1058,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 +2277,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>() { 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/widget/Constants.java b/BaseModule/src/main/java/com/xscm/moduleutil/widget/Constants.java index c57f1536..fbc36ffd 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";//点击开始按钮 交友房 diff --git a/BaseModule/src/main/res/values/colors.xml b/BaseModule/src/main/res/values/colors.xml index 1bdcabeb..42543366 100644 --- a/BaseModule/src/main/res/values/colors.xml +++ b/BaseModule/src/main/res/values/colors.xml @@ -299,6 +299,7 @@ #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 f904b91f..9d2cc82a 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/Application.kt +++ b/MainModule/src/main/java/com/xscm/modulemain/Application.kt @@ -2,6 +2,8 @@ package com.xscm.modulemain import android.app.Activity import android.content.Context +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 @@ -12,12 +14,20 @@ 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.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() { @@ -66,7 +76,105 @@ 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) + val json = JSONObject(event.text.text) + event.text.status = json.getString("status") + event.text.room_id = json.getString("room_id") + when (event.text.status) { + "1" -> {//1:邀请 + 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, + "知道了", + "" + ) + } + } + } + } + } + } + + 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 (roomId.equals(CommonAppContext.getInstance().playId)) + return@ConfirmDialog + RoomManager.getInstance() + .fetchRoomDataAndEnter(ActivityUtils.getTopActivity(), roomId, "", "") + } + } + }, + { v: View? -> + when (status) { + 1 -> { + val text = RoomMessageEvent.T() + val json = JSONObject() + json.put("status", "2") + 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, + 15, + TimeUnit.SECONDS, + onTimeUp = { + customDialog( + "", + CustomMsgCode.CODE_TASK_APPRENTICE_JOIN_ROOM_MSG_REFUSE, + 5, + 3, + null, + "知道了", + "" + ) + }) } @@ -82,7 +190,7 @@ open class Application : CommonAppContext() { override fun onNext(t: IndexRecommendRoom) { LogUtils.e(t) if (!t.room_id.isNullOrEmpty()) { - showInviteDialog(activity, t) + showInviteDialog(activity, t) } } }) @@ -95,7 +203,7 @@ open class Application : CommonAppContext() { }) } - fun showInviteDialog(activity: Activity?,t: IndexRecommendRoom) { + fun showInviteDialog(activity: Activity?, t: IndexRecommendRoom) { if (inviteDialog == null) { inviteDialog = activity?.let { InviteDialog(it, t) } } diff --git a/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java b/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java index d522b1c5..019596d1 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java +++ b/MainModule/src/main/java/com/xscm/modulemain/BaseMvpActivity.java @@ -1142,5 +1142,9 @@ public abstract class BaseMvpActivity

clazz) { + Intent intent = new Intent(this, clazz); + startActivity(intent); + } } 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 c8baf223..638ae783 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,13 +1,15 @@ package com.xscm.modulemain.activity.user.activity; +import android.annotation.SuppressLint; import android.content.Intent; 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.LogUtils; +import com.xscm.modulemain.Application; import com.xscm.modulemain.R; import com.xscm.modulemain.adapter.TaskBoxAdapter; import com.xscm.modulemain.adapter.TaskDataAdapter; @@ -19,12 +21,18 @@ import com.xscm.modulemain.activity.user.presenter.DailyTasksPresenter; import com.xscm.modulemain.BaseMvpActivity; import com.xscm.modulemain.activity.WebViewActivity; import com.xscm.modulemain.manager.RoomManager; +import com.xscm.moduleutil.bean.RoomMessageEvent; +import com.xscm.moduleutil.bean.TaskDataBean; +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; @@ -46,6 +54,8 @@ public class DailyTasksActivity extends BaseMvpActivity taskList = new ArrayList<>(); + @Override protected DailyTasksPresenter bindPresenter() { return new DailyTasksPresenter(this, this); @@ -78,6 +88,27 @@ public class DailyTasksActivity extends BaseMvpActivity { Intent intent = new Intent(this, WebViewActivity.class); @@ -103,44 +134,46 @@ 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(giftBoxBean.getTasks()); - mBinding.rvTaskToday.setAdapter(mTaskDataAdapter); - mTaskDataAdapter.setOnItemClickListener(new TaskSectionAdapter.OnItemClickListener() { - @Override - public void onItemClick(GiftBoxBean.TaskDataBean 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); -// RoomManager.getInstance().fetchRoomDataAndEnter(DailyTasksActivity.this, item.getFrom_id(), "", item.getTask_id() + ""); -// finish(); -// } -// } - } - }); + 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.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; + } + } + + @SuppressLint("CheckResult") @Override protected void onPause() { super.onPause(); @@ -160,4 +193,34 @@ public class DailyTasksActivity extends BaseMvpActivity i @Override public void tasksLihen() { - api.tasksLihen(new BaseObserver() { + RetrofitClient.getInstance().tasksLihen(new BaseObserver() { @Override public void onSubscribe(Disposable d) { addDisposable(d); @@ -33,7 +34,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); @@ -47,8 +48,8 @@ public class DailyTasksPresenter extends BasePresenter i } @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) { @@ -63,5 +64,21 @@ public class DailyTasksPresenter extends BasePresenter i } + @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) { + MvpRef.get().taskJumpRoom(item,s); + } + }); + } + } diff --git a/MainModule/src/main/java/com/xscm/modulemain/adapter/TaskBoxAdapter.java b/MainModule/src/main/java/com/xscm/modulemain/adapter/TaskBoxAdapter.java index f4362c20..7befe2f3 100644 --- a/MainModule/src/main/java/com/xscm/modulemain/adapter/TaskBoxAdapter.java +++ b/MainModule/src/main/java/com/xscm/modulemain/adapter/TaskBoxAdapter.java @@ -1,6 +1,8 @@ package com.xscm.modulemain.adapter; import android.annotation.SuppressLint; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; @@ -39,13 +41,15 @@ public class TaskBoxAdapter extends BaseQuickAdapter sections) { this.sections = sections; } + // 定义点击事件接口 public interface OnItemClickListener { void onItemClick(GiftBoxBean.TaskDataBean taskItem, GiftBoxBean.TaskDataBean.DailyTasksBean item); @@ -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/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"> + 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" />