diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 65d80d5..2cf9741 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -927,6 +927,16 @@ public static java.lang.String TABLENAME; *; } +-keep class com.xscm.moduleutil.bean.RedBean** {*;} +-keepclassmembers class com.xscm.moduleutil.bean.RedBean** { + *; +} + +-keep class com.xscm.moduleutil.bean.HourlyBean** {*;} +-keepclassmembers class com.xscm.moduleutil.bean.HourlyBean** { + *; +} + # 保持EventBus相关类不被混淆 -keepclassmembers class * { @org.greenrobot.eventbus.Subscribe ; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseAppCompatActivity.java b/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseAppCompatActivity.java index a13623c..692a510 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseAppCompatActivity.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseAppCompatActivity.java @@ -14,6 +14,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -57,6 +58,7 @@ import com.xscm.moduleutil.base.RoomManager; import com.xscm.moduleutil.bean.XLHBean; import com.xscm.moduleutil.event.HourlyBean; import com.xscm.moduleutil.event.MqttBean; +import com.xscm.moduleutil.event.RedBean; import com.xscm.moduleutil.utils.ARouteConstants; import com.xscm.moduleutil.utils.BackgroundManager; import com.xscm.moduleutil.utils.ColorManager; @@ -446,12 +448,16 @@ public abstract class BaseAppCompatActivity extends // 在类中添加以下成员变量 private final List mqttMessageQueue = new ArrayList<>(); // MQTT消息队列 private final List xlhMessageQueue = new ArrayList<>(); // XLH消息队列 + private final List redMessageQueue = new ArrayList<>(); // 红包队列 private boolean isMqttPlaying = false; // MQTT播放状态标志 private boolean isXlhPlaying = false; // XLH播放状态标志 + private boolean isRedPlaying = false; // XLH播放状态标志 private final Object mqttQueueLock = new Object(); // MQTT队列同步锁 private final Object xlhQueueLock = new Object(); // XLH队列同步锁 + private final Object RedQueueLock = new Object(); // XLH队列同步锁 private View currentMqttView = null; // 当前正在播放的MQTT视图 private View currentXlhView = null; // 当前正在播放的XLH视图 + private View currentRedView = null; // 当前正在播放的XLH视图 private final List hourlyMessageQueue = new ArrayList<>(); // 小时榜消息队列 private final Map currentHourlyViews = new HashMap<>(); // 当前显示的小时榜视图 @@ -711,6 +717,166 @@ public abstract class BaseAppCompatActivity extends } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(RedBean event){ + LogUtils.e("收到红包", event); + if (event==null) return; + if (SpUtil.getFloatingScreen()==1){ + + synchronized (RedQueueLock) { + redMessageQueue.add(event); + if (!isRedPlaying) { + isRedPlaying = true; + processNextRedMessage(); + } + } + } else { + redMessageQueue.clear(); + } + } + + private void processNextRedMessage() { + RedBean redBean; + synchronized (RedQueueLock) { + if (redMessageQueue.isEmpty()) { + isRedPlaying = false; + return; + } + redBean = redMessageQueue.remove(0); + } + showPiaoPingMessageRed(redBean); + } + + private void showPiaoPingMessageRed(RedBean redBean){ + try { + // 清理之前的视图(如果存在) + if (currentRedView != null && currentRedView.getParent() != null) { + ViewGroup parent = (ViewGroup) currentRedView.getParent(); + parent.removeView(currentRedView); + } + + if (decorView2 == null) { + decorView2 = (ViewGroup) getWindow().getDecorView(); + } + + currentRedView = LayoutInflater.from(this).inflate(R.layout.item_piaoping_red, null); + FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.WRAP_CONTENT); + layoutParams.topMargin = com.sunfusheng.marqueeview.DisplayUtil.dip2px(this, 140); + layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; + currentRedView.setLayoutParams(layoutParams); + decorView2.addView(currentRedView); + + updateRedFloatingViewData(currentRedView, redBean); + // 播放红包音效 + playRedPacketSound(); + resetAndStartXlhAnimation(currentRedView, () -> { + // 清理当前视图 + if (currentRedView != null && currentRedView.getParent() != null) { + ViewGroup parent = (ViewGroup) currentRedView.getParent(); + parent.removeView(currentRedView); + } + currentRedView = null; + + // 处理队列中的下一条消息 + synchronized (RedQueueLock) { + isRedPlaying = false; + processNextRedMessage(); + } + }); + } catch (Exception e) { + LogUtils.e("显示红包飘屏失败", e); + // 出现异常时继续处理队列 + synchronized (RedQueueLock) { + isRedPlaying = false; + processNextRedMessage(); + } + } + } + // 在类中添加成员变量 + private MediaPlayer redPacketMediaPlayer = null; + private boolean isRedPacketMediaPrepared = false; + // 添加播放红包音效的方法 + private void playRedPacketSound() { + try { + if (!isRedPacketMediaPrepared) { + // 第一次初始化MediaPlayer + if (redPacketMediaPlayer == null) { + redPacketMediaPlayer = MediaPlayer.create(this, R.raw.red_packet_come); // 假设音效文件名为red_packet_sound.mp3 + redPacketMediaPlayer.setOnPreparedListener(mp -> { + isRedPacketMediaPrepared = true; + mp.start(); + }); + redPacketMediaPlayer.setOnCompletionListener(mp -> { + // 播放完成后重置,以便下次重新播放 + try { + mp.seekTo(0); + } catch (Exception e) { + LogUtils.e("MediaPlayer重置失败", e); + } + }); + } + + if (redPacketMediaPlayer != null) { + redPacketMediaPlayer.prepareAsync(); // 异步准备 + } + } else { + // 已经准备好了,直接重新播放 + if (redPacketMediaPlayer != null && !redPacketMediaPlayer.isPlaying()) { + redPacketMediaPlayer.seekTo(0); + redPacketMediaPlayer.start(); + } + } + } catch (Exception e) { + LogUtils.e("播放红包音效失败", e); + } + } + + private void updateRedFloatingViewData(View view, RedBean redBean){ + TextView textView = view.findViewById(R.id.tv_name); + + if (redBean != null) { + String fullText = redBean.getText(); + if (redBean.getNickname() != null && redBean.getRoom_name() != null) { + SpannableStringBuilder builder = new SpannableStringBuilder(fullText); + + // 为用户名设置蓝色 + int userNameStart = fullText.indexOf(redBean.getNickname()); + if (userNameStart >= 0) { + builder.setSpan( + new ForegroundColorSpan(ContextCompat.getColor(this, R.color.colorPrimary)), + userNameStart, + userNameStart + redBean.getNickname().length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ); + } + + // 为房间名设置蓝色 + int roomNameStart = fullText.indexOf(redBean.getRoom_name()); + if (roomNameStart >= 0) { + builder.setSpan( + new ForegroundColorSpan(ContextCompat.getColor(this, R.color.colorPrimary)), + roomNameStart, + roomNameStart + redBean.getRoom_name().length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ); + } + + textView.setText(builder); + } else { + textView.setText(fullText); + } + } else { + textView.setText(""); + } + + view.setOnClickListener(v -> { + // 点击时执行跳转操作 + handleRedItemClick(redBean); + }); + } + // 处理下一个MQTT消息 private void processNextMqttMessage() { MqttBean.ListBean mqttBean; @@ -737,8 +903,9 @@ public abstract class BaseAppCompatActivity extends showPiaoPingMessageXlh(xlhBean); } - ViewGroup decorView; - ViewGroup decorView1; + ViewGroup decorView;//礼物的 + ViewGroup decorView1;//巡乐会的 + ViewGroup decorView2;//红包的 private void showFloatingMessage(MqttBean.ListBean mqttBean) { @@ -977,7 +1144,7 @@ public abstract class BaseAppCompatActivity extends LogUtils.e("XLH动画执行失败", e); onAnimationEnd.run(); } - }, 3000); + }, 5000); } catch (Exception e) { LogUtils.e("XLH动画启动失败", e); onAnimationEnd.run(); @@ -1031,6 +1198,15 @@ public abstract class BaseAppCompatActivity extends } + private void handleRedItemClick(RedBean redBean) { + // 这里可以根据实际需求实现跳转逻辑 + // 例如:跳转到礼物详情页面、用户主页等 + // 使用缓存数据进入房间 + RoomManager.getInstance().fetchRoomDataAndEnter(getApplicationContext(), redBean.getRoom_id(), ""); +// ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("from", "我的界面").withString("roomId", xlhBean.getRoom_id()).navigation(); + + } + @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(ChatInfo event) { diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseMvpActivity.java b/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseMvpActivity.java index 2cbfc5b..8e9699d 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseMvpActivity.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/activity/BaseMvpActivity.java @@ -213,24 +213,6 @@ public abstract class BaseMvpActivity

records; private MyRecord my_record; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/UserInfo.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/UserInfo.java index 6c64b59..faad91f 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/UserInfo.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/UserInfo.java @@ -64,6 +64,7 @@ public class UserInfo implements Serializable { private int heartId; // "heartId": 4, private int heartNum; // + private String red_num; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/XLHBean.java b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/XLHBean.java index 0505640..bd5e04a 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/bean/XLHBean.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/bean/XLHBean.java @@ -2,13 +2,16 @@ package com.xscm.moduleutil.bean; import lombok.Data; +import java.io.Serializable; + /** *@author qx *@data 2025/9/2 *@description: 巡乐会开始后推送的信息 */ @Data -public class XLHBean { +public class XLHBean implements Serializable { + private static final long serialVersionUID = 1L; private String text; private String room_id; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/HourlyBean.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/HourlyBean.java index afe1d96..8b9015c 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/event/HourlyBean.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/HourlyBean.java @@ -2,11 +2,14 @@ package com.xscm.moduleutil.event; import lombok.Data; +import java.io.Serializable; + /** * 小时榜飘屏 */ @Data -public class HourlyBean { +public class HourlyBean implements Serializable { + private static final long serialVersionUID = 1L; private String room_id; private String room_name; private String text; diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedBean.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedBean.java new file mode 100644 index 0000000..aadd00a --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedBean.java @@ -0,0 +1,14 @@ +package com.xscm.moduleutil.event; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class RedBean implements Serializable { + private static final long serialVersionUID = 1L; + private String room_id; + private String room_name; + private String text; + private String nickname; +} diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java index 82d24ef..df40bce 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/event/RedEnvelopeStatus.java @@ -4,8 +4,14 @@ package com.xscm.moduleutil.event; */ public enum RedEnvelopeStatus { - READY_TO_OPEN, // 可以直接打开 - COUNTDOWN_TO_OPEN, // 倒计时后可打开 - CONDITION_TO_OPEN, // 满足条件后可打开 - COUNTDOWN_AND_CONDITION // 先倒计时,再满足条件后可打开 + /// 打开红包 + QXRedBagDrawTypeOpen, + /// 仅倒计时 + QXRedBagDrawTypeTimeDown, + /// 仅收藏房间 + QXRedBagDrawTypeCollect, + /// 手慢了被领完了 + QXRedBagDrawTypeFinished, + /// 发送评论领红包 + QXRedBagDrawTypePwdSend, } diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/http/ApiServer.java b/moduleUtil/src/main/java/com/xscm/moduleutil/http/ApiServer.java index cc16ede..1db428e 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/http/ApiServer.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/http/ApiServer.java @@ -387,6 +387,10 @@ public interface ApiServer { @POST(Constants.POST_GZ) Call> userGuanz(@Field("user_id") String userId, @Field("type") String type); + @FormUrlEncoded + @POST(Constants.POST_FOLLOW_ROOM) + Call> followRoom(@Field("room_id") String roomId, @Field("type") String type); + @FormUrlEncoded @POST(Constants.ACCEPT_PK) Call> acceptPk(@Field("pk_id") String pk_id, @Field("type") String type); diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java b/moduleUtil/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java index 1f5a23d..6922d13 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/http/RetrofitClient.java @@ -3418,6 +3418,20 @@ public class RetrofitClient { }); } + public void followRoom(String room_id, String type, BaseObserver observer) { + sApiServer.followRoom(room_id, type).enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + onNextRetu(response, observer); + } + + @Override + public void onFailure(Call> call, Throwable t) { + t.printStackTrace(); + } + }); + } + public void acceptPk(String pk_id, String type, BaseObserver observer) { sApiServer.acceptPk(pk_id, type).enqueue(new Callback>() { @Override @@ -3642,7 +3656,6 @@ public class RetrofitClient { } catch (ClassNotFoundException e) { throw new RuntimeException(e); } - ToastUtils.showShort(string.getMsg()); } else { ToastUtils.showShort(string.getMsg()); } diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttConnect.java b/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttConnect.java index b4eaed1..34427f0 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttConnect.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttConnect.java @@ -32,6 +32,8 @@ public class MqttConnect { public static String shutdown = ""; public static String update_app = ""; public static String qx_hour_ranking = ""; + + public static String qx_redpacket_arrive="";//红包飘屏的主题 Handler handler = new Handler(Looper.getMainLooper()); String[] topic; int[] qos = {1,2,3,0,0,0,0,0,0,0,0,0,0}; // 消息质量 @@ -47,11 +49,13 @@ public class MqttConnect { update_app = "qx_xunlehui"; // 发送更新APP // qx_hour_ranking = "qx_hour_ranking"; qx_hour_ranking = "qx_hour_ranking"; + qx_redpacket_arrive="qx_redpacket_arrive"; ArrayList topicList = new ArrayList<>(); topicList.add(shutdown); topicList.add(update_app); topicList.add(qx_hour_ranking); + topicList.add(qx_redpacket_arrive); topic = topicList.toArray(new String[0]); } @@ -87,6 +91,7 @@ public class MqttConnect { sub(shutdown); sub(update_app); sub(qx_hour_ranking); + sub(qx_redpacket_arrive); // uiTip("MQTT连接成功"); }catch (MqttException e){ // uiTip("MQTT连接失败,准备重连。。。:"+e.getMessage()); diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttInitCallback.java b/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttInitCallback.java index 79e3763..b794aed 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttInitCallback.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/service/MqttInitCallback.java @@ -13,6 +13,7 @@ import com.orhanobut.logger.Logger; import com.xscm.moduleutil.bean.MqttXlhEnd; import com.xscm.moduleutil.bean.XLHBean; import com.xscm.moduleutil.event.HourlyBean; +import com.xscm.moduleutil.event.RedBean; import com.xscm.moduleutil.event.RoomGiftRunable; import com.xscm.moduleutil.utils.SpUtil; @@ -63,9 +64,49 @@ public class MqttInitCallback implements MqttCallback { receiveXlhMessage(messageStr); }else if (topic.equals("qx_hour_ranking")){ receiveQXHourRanking(topic, messageStr); + }else if (topic.equals("qx_redpacket_arrive")){ + receiveRed(topic, messageStr); } } + private void receiveRed(String topic, String messageStr) { + try { + JSONObject jsonObject = JSON.parseObject(messageStr); + String message = jsonObject.getString("msg"); + // 将事件处理放到主线程执行 + new Handler(Looper.getMainLooper()).post(() -> { + processRedMessage(topic, message); + }); + } catch (Exception e) { + Log.e("MQTT", "解析MQTT消息异常", e); + } + } + + private void processRedMessage(String topic, String message) { + try { + // 如果 data 是集合字符串 + // 解析为集合 + RedBean dataList = JSON.parseObject(message, RedBean.class); + + // 在主线程处理集合数据 + new Handler(Looper.getMainLooper()).post(() -> { + processDataRed(dataList); + }); + } catch (Exception e) { + Log.e("MQTT", "解析MQTT消息异常", e); + } + } + + private void processDataRed(RedBean dataList) { + // 遍历集合并发送每个元素 +// for (HourlyBean dataItem : dataList) { +// EventBus.getDefault().post(dataItem); +// } + + // 或者发送整个集合 + EventBus.getDefault().post(dataList); + } + private void receiveQXHourRanking(String topic, String data) { try { JSONObject jsonObject = JSON.parseObject(data); diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java index 5aebda6..21b84a8 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/QXRedPacketManager.java @@ -2,12 +2,16 @@ package com.xscm.moduleutil.utils; import android.os.Handler; import android.os.Looper; +import com.blankj.utilcode.util.LogUtils; import com.xscm.moduleutil.bean.RedPacketInfo; +import lombok.Getter; +import lombok.Setter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 红包管理器单例类 @@ -20,7 +24,7 @@ public class QXRedPacketManager { // 私有构造函数,防止外部实例化 private QXRedPacketManager() { - this.redPackets = new HashMap<>(); + this.redPackets = new ConcurrentHashMap<>(); } /** @@ -53,6 +57,8 @@ public class QXRedPacketManager { this.redPackets.put(model.getRedpacket_id(), model); } + // 在添加数据后启动定时器(如果尚未启动) + startCheckTimer(); if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { ((QXRedPacketManagerDelegate) this.delegate).onRedPacketsAdded(redPackets, this.redPackets.size()); } @@ -70,6 +76,8 @@ public class QXRedPacketManager { this.redPackets.put(redPacket.getRedpacket_id(), redPacket); + // 在添加数据后启动定时器(如果尚未启动) + startCheckTimer(); if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { ((QXRedPacketManagerDelegate) this.delegate).onRedPacketAdded(redPacket, this.redPackets.size()); } @@ -111,6 +119,10 @@ public class QXRedPacketManager { * 开始检查定时器 */ public void startCheckTimer() { + // 如果定时器已经在运行,直接返回 + if (checkTimerRunnable != null && checkTimerHandler != null) { + return; + } if (checkTimerRunnable == null) { checkTimerRunnable = new Runnable() { @Override @@ -128,9 +140,35 @@ public class QXRedPacketManager { * 检查并更新红包状态 */ private void checkAndUpdateRedPackets() { + // 添加空值检查 + if (this.redPackets == null || this.redPackets.isEmpty()) { + return; + } List packets = new ArrayList<>(this.redPackets.values()); for (RedPacketInfo packet : packets) { + long packetTime = packet.remainingTime(); + LogUtils.e("红包剩余时间:" + packet.getRedpacket_time()); + long redpacketTime = 0; + try { + if (packet.getRedpacket_time() != null) { + redpacketTime = Long.parseLong(packet.getRedpacket_time()); + } + } catch (NumberFormatException e) { + LogUtils.e("红包时间格式错误: " + packet.getRedpacket_time()); + } + if (packetTime <= -redpacketTime) { + + removeRedPacket(packet.getRedpacket_id()); + } + if (packet.getCountdown()==0){ + continue; + } + + if (this.delegate != null && this.delegate instanceof QXRedPacketManagerDelegate) { + ((QXRedPacketManagerDelegate) this.delegate).didUpdateRedPacketTime(packet, packetTime); + } + boolean wasAvailable = packet.isAvailable(); packet.setAvailable(packet.canOpenNow()); @@ -140,12 +178,6 @@ public class QXRedPacketManager { ((QXRedPacketManagerDelegate) this.delegate).onRedPacketUpdated(packet, this.redPackets.size()); } } - - // 倒计时结束的红包可以设置自动移除 - if (packet.getCountdown() > 0 && packet.remainingTime() <= -(Long.getLong(packet.getRedpacket_time()))) { - // 倒计时结束10秒后自动移除 - removeRedPacket(packet.getRedpacket_id()); - } } // 继续执行定时任务 @@ -157,6 +189,7 @@ public class QXRedPacketManager { */ public void removeAllRedPackets() { this.redPackets.clear(); + endCheckTimer(); } /** @@ -179,24 +212,6 @@ public class QXRedPacketManager { this.delegate = null; } - /** - * 设置委托对象 - * - * @param delegate 委托对象 - */ - public void setDelegate(QXRedPacketManagerDelegate delegate) { - this.delegate = delegate; - } - - /** - * 获取委托对象 - * - * @return 委托对象 - */ - public QXRedPacketManagerDelegate getDelegate() { - return this.delegate; - } - /** * 委托接口 */ @@ -232,8 +247,29 @@ public class QXRedPacketManager { * @param remainingCount 剩余数量 */ void onRedPacketUpdated(RedPacketInfo packet, int remainingCount); + + /** + * 更新红包时间回调 + * + * @param packet 红包模型 + * @param packetTime 红包剩余时间 + */ + void didUpdateRedPacketTime(RedPacketInfo packet, long packetTime); } + /** + * -- SETTER -- + * 设置委托对象 + * + * + * -- GETTER -- + * 获取委托对象 + * + @param delegate 委托对象 + * @return 委托对象 + */ + @Getter + @Setter private QXRedPacketManagerDelegate delegate; } diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/Constants.java b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/Constants.java index 22d521b..d5776ad 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/widget/Constants.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/widget/Constants.java @@ -248,6 +248,7 @@ public class Constants { public static final String GET_USER_HOME_ZONE = "/api/User/user_home_zone";//获取用户动态 public static final String GET_LIKE_LIST = "/api/UserZone/like_list";//获取点赞列表 public static final String POST_GZ = "/api/User/follow";//关注、回关、取关 + public static final String POST_FOLLOW_ROOM = "/api/User/follow_room";//收藏 public static final String GET_ALBUM_DETAIL = "/api/User/get_album_detail";//相册详情 public static final String UP_ALBUM = "/api/User/add_album_content";//添加相册图片 public static final String MOVE_ALBUM = "/api/User/move_album_images";//移动相册图片 diff --git a/moduleUtil/src/main/res/drawable/bg_r6_000000.xml b/moduleUtil/src/main/res/drawable/bg_r6_000000.xml index 484611d..a9d95c1 100644 --- a/moduleUtil/src/main/res/drawable/bg_r6_000000.xml +++ b/moduleUtil/src/main/res/drawable/bg_r6_000000.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/moduleUtil/src/main/res/layout/item_piaoping_red.xml b/moduleUtil/src/main/res/layout/item_piaoping_red.xml new file mode 100644 index 0000000..8025789 --- /dev/null +++ b/moduleUtil/src/main/res/layout/item_piaoping_red.xml @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file diff --git a/moduleUtil/src/main/res/mipmap-mdpi/red_tx.png b/moduleUtil/src/main/res/mipmap-mdpi/red_tx.png new file mode 100644 index 0000000..d303fcd Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-mdpi/red_tx.png differ diff --git a/moduleUtil/src/main/res/mipmap-mdpi/red_tx.webp b/moduleUtil/src/main/res/mipmap-mdpi/red_tx.webp deleted file mode 100644 index ba7b906..0000000 Binary files a/moduleUtil/src/main/res/mipmap-mdpi/red_tx.webp and /dev/null differ diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/red_bj_h.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_bj_h.png new file mode 100644 index 0000000..92a41e6 Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_bj_h.png differ diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/red_kl_b.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_kl_b.png new file mode 100644 index 0000000..0ee0af4 Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_kl_b.png differ diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/red_liet_bj.webp b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_liet_bj.webp new file mode 100644 index 0000000..af216fd Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_liet_bj.webp differ diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/red_pp.webp b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_pp.webp new file mode 100644 index 0000000..0ebd0eb Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/red_pp.webp differ diff --git a/moduleUtil/src/main/res/raw/red_packet_come.MP3 b/moduleUtil/src/main/res/raw/red_packet_come.MP3 new file mode 100644 index 0000000..88db62d Binary files /dev/null and b/moduleUtil/src/main/res/raw/red_packet_come.MP3 differ diff --git a/moduleroom/src/main/java/com/example/moduleroom/activity/RedResultActivity.java b/moduleroom/src/main/java/com/example/moduleroom/activity/RedResultActivity.java index bd5eb19..00a5ba9 100644 --- a/moduleroom/src/main/java/com/example/moduleroom/activity/RedResultActivity.java +++ b/moduleroom/src/main/java/com/example/moduleroom/activity/RedResultActivity.java @@ -93,13 +93,14 @@ public class RedResultActivity extends BaseMvpActivity(), // 在onCreate中初始化红包管理器实例,以便在整个Activity生命周期中使用 qxRedPacketManager = QXRedPacketManager.getInstance() // 获取单例实例并设置委托 - QXRedPacketManager.getInstance().setDelegate(this); + qxRedPacketManager!!.setDelegate(this); + } @@ -602,7 +603,7 @@ class RoomActivity : BaseMvpActivity(), override fun onConnectSuccess() { //重连成功 if (CommonAppContext.getInstance().playId != null) { LogUtils.e("@@@", "重连成功") - LogUtils.e("@@@", ""+CommonAppContext.getInstance().playId) + LogUtils.e("@@@", "" + CommonAppContext.getInstance().playId) RetrofitClient.getInstance().roomUserReconnect(CommonAppContext.getInstance().playId) } } @@ -835,10 +836,14 @@ class RoomActivity : BaseMvpActivity(), } // TODO: 发红包 - fun redDialogView(){ - RedBagSendDialog(this,roomId).show() + fun redDialogView() { + RedBagSendDialog(this, roomId).show() } + var redEnvelopesFragment: RedEnvelopesFragment? = null + var redListDialog: RedListDialog? = null + var redPacketInfo: RedPacketInfo? = null + override fun initView() { super.initView() floatingMagnetView = findViewById(R.id.flaoat) @@ -883,9 +888,6 @@ class RoomActivity : BaseMvpActivity(), layoutParams.height = SystemUtils.getWidth(74) // 示例高度 mBinding!!.roomTop.root.layoutParams = layoutParams - // MP4PlaybackCallback mp4PlaybackCallback=MP4PlaybackCallback.getInstance(); -// mp4PlaybackCallback.setAvatarFrameView(mBinding.svgaGift); -// mBinding.svgaGift.setAnimListener(mp4PlaybackCallback); mBinding!!.xlhIm.setOnClickListener { val fm = supportFragmentManager if (fm != null && !fm.isDestroyed) { @@ -904,8 +906,24 @@ class RoomActivity : BaseMvpActivity(), mBinding!!.drvRed.visibility = View.GONE mBinding!!.redBj.setOnClickListener { - val redListDialog = RedListDialog(this) - redListDialog.show() + redListDialog = RedListDialog(this) + redListDialog!!.setOnRedPacketClickListener(object : RedListDialog.OnRedPacketClickListener { + + override fun onRedPacketClick(redPacketInfos: RedPacketInfo?, position: Int) { + redPacketInfo = redPacketInfos + if (redPacketInfos!=null && redPacketInfos.is_qiang==1){ + ARouter.getInstance().build(ARouteConstants.ROOM_RED_RESULT).withString("redpacketId", redPacketInfos.getRedpacket_id()).navigation(); + }else { + redEnvelopesFragment = RedEnvelopesFragment(this@RoomActivity) + redEnvelopesFragment!!.setIsCollectedRoom(mRoomUserBean!!.is_collect == 1) + redEnvelopesFragment!!.setFromToComment(false) + redEnvelopesFragment!!.setRedPacket(redPacketInfos) + redEnvelopesFragment!!.show() + redListDialog!!.dismiss() + } + } + }) + redListDialog!!.show(); } } @@ -1521,7 +1539,7 @@ class RoomActivity : BaseMvpActivity(), } xlhDjs(messageEvent.text.end_time) - }else if(msgType==1060){ + } else if (msgType == 1060) { qxRedPacketManager!!.addRedPacket(messageEvent.text.redpacketInfo) } } @@ -1655,10 +1673,10 @@ class RoomActivity : BaseMvpActivity(), // ivSoundEffects(false) // } - if ("9" == toPitNumber && messageEvent.text.user_id .equals(SpUtil.getUserId().toString())) { + if ("9" == toPitNumber && messageEvent.text.user_id.equals(SpUtil.getUserId().toString())) { mBinding!!.roomTop.rl.visibility = View.VISIBLE ivSoundEffects(true) - }else{ + } else { if (customMusicFloatingView != null) { customMusicFloatingView!!.destroy() AgoraManager.getInstance(this@RoomActivity).desMusic() @@ -2505,6 +2523,10 @@ class RoomActivity : BaseMvpActivity(), mBinding!!.roomTop.tvNum.text = number.toString() + "" } + fun setUserInfo() { + mRoomInfoResp!!.user_info.is_collect = 1 + } + /** * 特效设置 */ @@ -3130,6 +3152,13 @@ class RoomActivity : BaseMvpActivity(), } etContent.setText("") countDownTimer() + if (redEnvelopesFragment != null) { + redEnvelopesFragment = RedEnvelopesFragment(this@RoomActivity) + redEnvelopesFragment!!.setIsCollectedRoom(mRoomUserBean!!.is_collect == 1) + redEnvelopesFragment!!.setFromToComment(true) + redEnvelopesFragment!!.setRedPacket(redPacketInfo) + redEnvelopesFragment!!.show() + } dialog.dismiss() }) @@ -3172,11 +3201,11 @@ class RoomActivity : BaseMvpActivity(), @Subscribe(threadMode = ThreadMode.MAIN) fun roomInfoEvent(messageEvent: UserInfo) { -// mBinding.llInput.setVisibility(View.VISIBLE); -// mBinding.inputMenu1.bringToFront(); // 强制将该 View 置于最上层 -// mBinding.inputMenu1.show(); -// mBinding.inputMenu1.setText("@" + messageEvent.getNickname()); - inputSting = "@" + messageEvent.nickname + if (messageEvent != null && messageEvent.red_num != null) { + inputSting = messageEvent.red_num + } else { + inputSting = "@" + messageEvent.nickname + } dialogDismiss() } @@ -3426,10 +3455,11 @@ class RoomActivity : BaseMvpActivity(), } } mBinding!!.ivQuanC.setOnClickListener { v: View? -> - if (mRoomInfoResp!!.room_info.head_line.room_id != null && mRoomInfoResp!!.room_info.head_line.room_id.isNotEmpty()){ - if (mRoomInfoResp!!.room_info.head_line.room_id != roomId){ - RoomManager.getInstance().fetchRoomDataAndEnter(applicationContext,mRoomInfoResp!!.room_info.head_line.room_id,"") - }else{ + if (mRoomInfoResp!!.room_info.head_line.room_id != null && mRoomInfoResp!!.room_info.head_line.room_id.isNotEmpty()) { + if (mRoomInfoResp!!.room_info.head_line.room_id != roomId) { + RoomManager.getInstance() + .fetchRoomDataAndEnter(applicationContext, mRoomInfoResp!!.room_info.head_line.room_id, "") + } else { com.blankj.utilcode.util.ToastUtils.showLong("您就在当前房间") } } @@ -3869,7 +3899,7 @@ class RoomActivity : BaseMvpActivity(), val roomBean = resp.room_info - if (roomBean!!.type_id.equals("6")){ + if (roomBean!!.type_id.equals("6")) { // upHeight() initPublicScreenFragment() @@ -4132,7 +4162,7 @@ class RoomActivity : BaseMvpActivity(), } override fun roomRedPackets(list: MutableList?) { - if(list!=null) { + if (list != null) { qxRedPacketManager!!.addRedPackets(list!!) } } @@ -4176,6 +4206,9 @@ class RoomActivity : BaseMvpActivity(), clearMinimizeState() cleanupResources() } + if (qxRedPacketManager != null) { + qxRedPacketManager!!.endCheckTimer(); + } // 确保父类的 onDestroy 被调用 super.onDestroy() } @@ -4496,29 +4529,93 @@ class RoomActivity : BaseMvpActivity(), override fun onRedPacketsAdded(redPackets: MutableList?, remainingCount: Int) { // 处理添加红包列表的逻辑 - if (redPackets!!.isNotEmpty()){ - mBinding!!.drvRed.visibility=View.VISIBLE - mBinding!!.redNum.visibility=View.VISIBLE - mBinding!!.redNum.text="x"+remainingCount.toString() + if (redPackets!!.isNotEmpty()) { + mBinding!!.drvRed.visibility = View.VISIBLE + mBinding!!.redNum.visibility = View.VISIBLE + mBinding!!.redNum.text = "x" + remainingCount.toString() + } else { + mBinding!!.drvRed.visibility = View.GONE + mBinding!!.redNum.visibility = View.GONE + qxRedPacketManager!!.removeAllRedPackets() } } override fun onRedPacketAdded(redPacket: RedPacketInfo?, remainingCount: Int) { // 处理添加单个红包的逻辑 - if (redPacket!=null){ - mBinding!!.drvRed.visibility=View.VISIBLE - mBinding!!.redNum.visibility=View.VISIBLE - mBinding!!.redNum.text="x"+remainingCount.toString() + if (redPacket != null) { + mBinding!!.drvRed.visibility = View.VISIBLE + mBinding!!.redNum.visibility = View.VISIBLE + mBinding!!.redNum.text = "x" + remainingCount.toString() } } override fun onRedPacketRemoved(packetId: String?, remainingCount: Int) { // 处理移除红包的逻辑 + if (remainingCount == 0) { + mBinding!!.drvRed.visibility = View.GONE + } else { + mBinding!!.drvRed.visibility = View.VISIBLE + } + mBinding!!.redNum.text = "x" + remainingCount.toString() } override fun onRedPacketUpdated(packet: RedPacketInfo?, remainingCount: Int) { // 处理红包状态更新的逻辑 + if (redEnvelopesFragment != null && redEnvelopesFragment!!.mRedPacketInfo != null && redEnvelopesFragment!!.mRedPacketInfo!!.countdown > 0) { + if (redEnvelopesFragment!!.mRedPacketInfo.type == 1) { + redEnvelopesFragment!!.changeViewType(RedEnvelopeStatus.QXRedBagDrawTypeOpen) + }else{ + if (redEnvelopesFragment!!.isFromToComment) { + redEnvelopesFragment!!.changeViewType(RedEnvelopeStatus.QXRedBagDrawTypeOpen) + } + } + } + } + + override fun didUpdateRedPacketTime(packet: RedPacketInfo?, packetTime: Long) { + + if ((redEnvelopesFragment != null) && (redEnvelopesFragment!!.mRedPacketInfo != null) && + (redEnvelopesFragment!!.mRedPacketInfo!!.countdown > 0) && packetTime >= 0 + ) { + LogUtils.e("进入倒计时" + packetTime) + if (redEnvelopesFragment!!.mRedPacketInfo.type == 1) { + if (redEnvelopesFragment!!.mRedPacketInfo.conditions.contains("1")) { + //有收藏房间条件 + if (mRoomInfoResp!!.user_info.is_collect == 1) { + //需要满足收藏在倒计时 + redEnvelopesFragment!!.setNeedTime(packetTime) + } + } else { + redEnvelopesFragment!!.setNeedTime(packetTime) + } + } else { + if (redEnvelopesFragment!!.isFromToComment) { + if (redEnvelopesFragment!!.mRedPacketInfo.conditions.contains("1")) { + //有收藏房间条件 + if (mRoomInfoResp!!.user_info.is_collect == 1) { + redEnvelopesFragment!!.setNeedTime(packetTime) + } + } else { + redEnvelopesFragment!!.setNeedTime(packetTime) + } + } + } + } + if (redListDialog != null) { + if (redListDialog!!.isShowing && redListDialog!!.adapter != null) { + val adapter = redListDialog!!.adapter + val list = adapter.data + for (i in list.indices) { + val redPacketInfo = list[i] + if (redPacketInfo.redpacket_id == packet!!.redpacket_id) { + adapter.updateCountdown(i, packetTime) + break + } + } + + } + } } diff --git a/moduleroom/src/main/java/com/example/moduleroom/adapter/RedAdapter.java b/moduleroom/src/main/java/com/example/moduleroom/adapter/RedAdapter.java index f92dbd4..ae3776c 100644 --- a/moduleroom/src/main/java/com/example/moduleroom/adapter/RedAdapter.java +++ b/moduleroom/src/main/java/com/example/moduleroom/adapter/RedAdapter.java @@ -23,7 +23,7 @@ public class RedAdapter extends BaseQuickAdapter { + private Map viewMap; public RedBagAdapter() { super(R.layout.item_red_bag); + viewMap=new ConcurrentHashMap<>(); } @Override protected void convert(BaseViewHolder helper, RedPacketInfo item) { + viewMap.put(helper.getLayoutPosition(),helper.itemView); + ImageView iv_red_bag= helper.getView(R.id.iv_red_bag); + if (item.getIs_qiang()==1){ + iv_red_bag.setImageResource(com.xscm.moduleutil.R.mipmap.red_bj_h); + helper.setVisible(R.id.tv_user_name,false); + helper.setVisible(R.id.tv_djs,false); + }else { + iv_red_bag.setImageResource(com.xscm.moduleutil.R.mipmap.red); + + if (item.getType()==2){ + helper.setVisible(R.id.im_list_bj,true); + }else { + helper.setVisible(R.id.im_list_bj,false); + } + + // 显示倒计时 + if (item.getCountdown() > 0) { + helper.setVisible(R.id.tv_djs, true); + long minutes = item.getCountdown() / 60; + long seconds = item.getCountdown() % 60; + String timeFormat = String.format("%02d:%02d", minutes, seconds); + helper.setText(R.id.tv_djs, timeFormat); + } else { + helper.setVisible(R.id.tv_djs, false); + } + } + + helper.setText(R.id.tv_user_name, item.getNickname()); } + + /** + * 更新指定位置的倒计时显示,不刷新整个item + * @param position 列表位置 + * @param countdown 倒计时时间(秒) + */ + public void updateCountdown(int position, long countdown) { + if (position >= 0 && position < getData().size()) { + // 获取对应位置的item view + View view = viewMap.get(position); + if (view != null) { + // 直接更新倒计时文本,不刷新整个item + TextView tvDjs = view.findViewById(R.id.tv_djs); + if (tvDjs != null) { + // 格式化倒计时显示 + long minutes = countdown / 60; + long seconds = countdown % 60; + String timeFormat = String.format("%02d:%02d", minutes, seconds); + tvDjs.setText(timeFormat); + + // 控制倒计时显示状态 + if (countdown > 0) { + tvDjs.setVisibility(View.VISIBLE); + } else { + tvDjs.setVisibility(View.GONE); + } + } + } + } + } + + /** + * 根据位置获取item view + * @param position 位置 + * @return item对应的view + */ + private View getViewByPosition(int position) { + RecyclerView recyclerView = getRecyclerView(); + if (recyclerView != null) { + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager != null) { + // 检查 position 是否在可见范围内 + if (layoutManager instanceof LinearLayoutManager) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; + int firstVisiblePosition = linearLayoutManager.findFirstVisibleItemPosition(); + int lastVisiblePosition = linearLayoutManager.findLastVisibleItemPosition(); + + // 确保 position 在可见范围内 + if (position >= firstVisiblePosition && position <= lastVisiblePosition) { + return layoutManager.findViewByPosition(position); + } + } + } + } + return null; + } + + } diff --git a/moduleroom/src/main/java/com/example/moduleroom/dialog/RedListDialog.java b/moduleroom/src/main/java/com/example/moduleroom/dialog/RedListDialog.java index 40da164..69d64bc 100644 --- a/moduleroom/src/main/java/com/example/moduleroom/dialog/RedListDialog.java +++ b/moduleroom/src/main/java/com/example/moduleroom/dialog/RedListDialog.java @@ -10,19 +10,14 @@ import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.alibaba.android.arouter.launcher.ARouter; import com.blankj.utilcode.util.ScreenUtils; import com.example.moduleroom.R; import com.example.moduleroom.adapter.RedBagAdapter; import com.example.moduleroom.databinding.DialogRedListBinding; -import com.example.moduleroom.fragment.RedEnvelopesFragment; -import com.xscm.moduleutil.utils.ARouteConstants; +import com.xscm.moduleutil.bean.RedPacketInfo; import com.xscm.moduleutil.utils.QXRedPacketManager; import com.xscm.moduleutil.widget.dialog.BaseDialog; -import java.util.ArrayList; -import java.util.List; - /** * 这是红包列表 */ @@ -34,7 +29,10 @@ public class RedListDialog extends BaseDialog { public RedListDialog(@NonNull Context context) { super(context, com.xscm.moduleutil.R.style.BaseDialogStyleH); } - + // 添加获取适配器的方法 + public RedBagAdapter getAdapter() { + return redBagAdapter; + } @Override public int getLayoutId() { return R.layout.dialog_red_list; @@ -121,27 +119,21 @@ public class RedListDialog extends BaseDialog { redBagAdapter.setNewData(qxRedPacketManager.getAllRedPackets()) ; redBagAdapter.setOnItemClickListener((adapter, view, position) -> { - RedEnvelopesFragment redEnvelopesFragment = new RedEnvelopesFragment(getContext()); - redEnvelopesFragment.setRedPacket(qxRedPacketManager.getAllRedPackets().get(position)); - redEnvelopesFragment.show(); + if (mListener != null) { + mListener.onRedPacketClick(redBagAdapter.getData().get(position), position); + } }); - -// List list = new ArrayList<>(); -// list.add("1"); -// list.add("2"); -// list.add("3"); -// list.add("4"); -// list.add("5"); -// list.add("4"); -// list.add("5"); -// list.add("4"); -// list.add("5"); -// list.add("4"); -// list.add("5"); -// redBagAdapter.setNewData(list); } + public interface OnRedPacketClickListener { + void onRedPacketClick(RedPacketInfo redPacketInfo,int position); + } + private OnRedPacketClickListener mListener; + + public void setOnRedPacketClickListener(OnRedPacketClickListener listener) { + this.mListener = listener; + } private Resources getResources() { diff --git a/moduleroom/src/main/java/com/example/moduleroom/fragment/RedEnvelopesFragment.java b/moduleroom/src/main/java/com/example/moduleroom/fragment/RedEnvelopesFragment.java index 0da0dbd..ce69873 100644 --- a/moduleroom/src/main/java/com/example/moduleroom/fragment/RedEnvelopesFragment.java +++ b/moduleroom/src/main/java/com/example/moduleroom/fragment/RedEnvelopesFragment.java @@ -1,6 +1,7 @@ package com.example.moduleroom.fragment; import android.content.Context; +import android.os.CountDownTimer; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -8,21 +9,29 @@ import android.view.WindowManager; import androidx.annotation.NonNull; import com.alibaba.android.arouter.launcher.ARouter; import com.blankj.utilcode.util.ScreenUtils; +import com.blankj.utilcode.util.TimeUtils; import com.blankj.utilcode.util.ToastUtils; import com.example.moduleroom.R; +import com.example.moduleroom.activity.RoomActivity; import com.example.moduleroom.databinding.FragmentRedEnvelopesBinding; import com.xscm.moduleutil.bean.RedPackGrab; import com.xscm.moduleutil.bean.RedPacketInfo; +import com.xscm.moduleutil.bean.UserInfo; import com.xscm.moduleutil.event.RedEnvelopeStatus; import com.xscm.moduleutil.http.BaseObserver; import com.xscm.moduleutil.http.RetrofitClient; import com.xscm.moduleutil.utils.ARouteConstants; import com.xscm.moduleutil.utils.ImageUtils; +import com.xscm.moduleutil.utils.QXRedPacketManager; import com.xscm.moduleutil.view.QXRedBagSendView; import com.xscm.moduleutil.widget.dialog.BaseDialog; +import com.xscm.moduleutil.widget.floatingView.IFloatingView; import io.reactivex.disposables.Disposable; +import org.greenrobot.eventbus.EventBus; import org.jetbrains.annotations.NotNull; +import static com.xscm.moduleutil.event.RedEnvelopeStatus.*; + /** * @author xscm * @ClassName RedEnvelopesFragment @@ -31,12 +40,28 @@ import org.jetbrains.annotations.NotNull; * @Version 1.0 */ public class RedEnvelopesFragment extends BaseDialog { - private RedEnvelopeStatus mCurrentStatus; - private RedPacketInfo mRedPacketInfo; + private RedEnvelopeStatus drawType; + public RedPacketInfo mRedPacketInfo; + public boolean isCollectedRoom;//是否收藏房间 + + public long needTime;// 倒计时 + public boolean isFromToComment;//是否是发送评论地方过来 + + private CountDownTimer countDownTimer; + public RedEnvelopesFragment(@NonNull @NotNull Context context) { super(context, com.xscm.moduleutil.R.style.BaseDialogStyleH); } + //是否收藏方法 + public void setIsCollectedRoom(boolean isCollectedRoom) { + this.isCollectedRoom = isCollectedRoom; + } + + public void setFromToComment(boolean isFromToComment) { + this.isFromToComment = isFromToComment; + } + @Override public void initData() { @@ -49,7 +74,8 @@ public class RedEnvelopesFragment extends BaseDialog() { + @Override + public void onSubscribe(@NotNull Disposable d) { + + } + + @Override + public void onNext(@NotNull String s) { + if (getContext() instanceof RoomActivity) { + ((RoomActivity) getContext()).setUserInfo(); + } + + if (mRedPacketInfo.canOpenNow()){ + setType(QXRedBagDrawTypeOpen); + }else { + setType(QXRedBagDrawTypeTimeDown); + } + } + }); + + }else if (drawType == RedEnvelopeStatus.QXRedBagDrawTypePwdSend){ + UserInfo userInfo = new UserInfo(); + userInfo.setRed_num(mRedPacketInfo.getPassword()); + EventBus.getDefault().post(userInfo); + dismiss(); + } +// ARouter.getInstance().build(ARouteConstants.ROOM_RED_RESULT).withString("redpacketId", mRedPacketInfo.getRedpacket_id()).navigation(); + } + }); } - private void snatched(){ + private void snatched() { mBinding.tvRedCount.setText("手慢,没有抢到"); mBinding.imRedK.setVisibility(View.GONE); mBinding.textPl.setVisibility(View.GONE); @@ -109,7 +172,6 @@ public class RedEnvelopesFragment extends BaseDialog 0) { + mBinding.textPl.setText(TimeUtils.millis2String(needTime*1000, "mm:ss")+"后开启红包"); + } + } + + private RedEnvelopeStatus getDrawTypeWithRedpacktModel(RedPacketInfo redPacketInfo) { + drawType = QXRedBagDrawTypeOpen; + if (redPacketInfo.getType() == 1) {//普通红包 + drawType = QXRedBagDrawTypeOpen; + if (redPacketInfo.getCountdown() > 0) { + if (redPacketInfo.remainingTime() > 0) { + drawType = QXRedBagDrawTypeTimeDown; + } + } + //收藏房间在先 + if (redPacketInfo.getConditions().contains("1") && !isCollectedRoom) { + drawType = QXRedBagDrawTypeCollect; + } + } else {//口令红包 + drawType = QXRedBagDrawTypePwdSend; + if (isFromToComment) { + if (redPacketInfo.getConditions().contains("1") && !isCollectedRoom) { + drawType = QXRedBagDrawTypeCollect; + } else { + if (redPacketInfo.canOpenNow()) { + drawType = QXRedBagDrawTypeOpen; + } else { + drawType = QXRedBagDrawTypeTimeDown; + } + } + } + } + return drawType; + } + + private void setType(RedEnvelopeStatus type) { + this.drawType = type; + switch (type) { + case QXRedBagDrawTypeOpen: + handleReadyToOpen(); + break; + case QXRedBagDrawTypeFinished: + qXRedBagDrawTypeFinished(); + break; + case QXRedBagDrawTypeCollect: + qXRedBagDrawTypeCollect(); + break; + case QXRedBagDrawTypeTimeDown: + qXRedBagDrawTypeTimeDown(); + break; + + case QXRedBagDrawTypePwdSend: + qXRedBagDrawTypePwdSend(); + break; + } + } + + private void qXRedBagDrawTypePwdSend() { + mBinding.imRedK.setVisibility(View.GONE); + mBinding.tvRedCount.setText(mRedPacketInfo.getRemark()); + mBinding.tvCk.setVisibility(View.GONE); + mBinding.textPl.setVisibility(View.VISIBLE); + mBinding.textPl.setText(setValue(QXRedBagDrawTypePwdSend)); + + } + + private void qXRedBagDrawTypeTimeDown() { + mBinding.imRedK.setVisibility(View.GONE); + mBinding.tvRedCount.setText(mRedPacketInfo.getRemark()); + mBinding.tvCk.setVisibility(View.GONE); + mBinding.textPl.setVisibility(View.VISIBLE); + mBinding.textPl.setText(setValue(QXRedBagDrawTypeTimeDown)); + } + + private void qXRedBagDrawTypeCollect() { + mBinding.imRedK.setVisibility(View.GONE); + mBinding.tvRedCount.setText(mRedPacketInfo.getRemark()); + mBinding.tvCk.setVisibility(View.GONE); + mBinding.textPl.setVisibility(View.VISIBLE); + mBinding.textPl.setText(setValue(QXRedBagDrawTypeCollect)); + mBinding.textShare.setVisibility(View.VISIBLE); + mBinding.clPwd.setVisibility(View.VISIBLE); + mBinding.tvPinl.setVisibility(View.GONE); + mBinding.tvKl.setVisibility(View.VISIBLE); + mBinding.tvKl.setText("收藏房间"); + + } + + private String setValue(RedEnvelopeStatus type) { + switch (type) { + + case QXRedBagDrawTypeCollect: + return "收藏房间抢红包"; + case QXRedBagDrawTypeTimeDown: + return "00:00后开启红包"; + case QXRedBagDrawTypePwdSend: + return "发送评论抢红包"; + default: + return "点击打开红包"; + } + } + + private void qXRedBagDrawTypeFinished() { + mBinding.textPl.setVisibility(View.GONE); + mBinding.tvTitle.setVisibility(View.GONE); + mBinding.tvPinl.setVisibility(View.GONE); + mBinding.tvKl.setVisibility(View.GONE); + mBinding.tvCk.setVisibility(View.VISIBLE); + mBinding.tvRedCount.setText("手慢了,红包被领完了"); + mBinding.imRedK.setVisibility(View.GONE); + mBinding.clPwd.setVisibility(View.GONE); + mBinding.textShare.setVisibility(View.GONE); + } private void handleReadyToOpen() { mBinding.textPl.setVisibility(View.GONE); mBinding.tvTitle.setVisibility(View.GONE); mBinding.tvPinl.setVisibility(View.GONE); - mBinding.tvKl.setVisibility(View.VISIBLE); + mBinding.tvKl.setVisibility(View.GONE); mBinding.imRedK.setVisibility(View.VISIBLE); } + + @Override + protected void onStop() { + super.onStop(); + // 取消倒计时,避免内存泄漏 + if (countDownTimer != null) { + countDownTimer.cancel(); + countDownTimer = null; + } + } + + public void changeViewType(RedEnvelopeStatus type) { + setType(type); + } } diff --git a/moduleroom/src/main/res/layout/dialog_red_list.xml b/moduleroom/src/main/res/layout/dialog_red_list.xml index e55a544..019ffb6 100644 --- a/moduleroom/src/main/res/layout/dialog_red_list.xml +++ b/moduleroom/src/main/res/layout/dialog_red_list.xml @@ -75,7 +75,7 @@ android:layout_height="0dp" android:layout_marginStart="@dimen/dp_25" android:layout_marginEnd="@dimen/dp_25" - android:layout_marginTop="@dimen/dp_156" + android:layout_marginTop="@dimen/dp_146" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="@+id/im_x" app:layout_constraintStart_toStartOf="parent" diff --git a/moduleroom/src/main/res/layout/fragment_red.xml b/moduleroom/src/main/res/layout/fragment_red.xml index c7f1a8b..930c918 100644 --- a/moduleroom/src/main/res/layout/fragment_red.xml +++ b/moduleroom/src/main/res/layout/fragment_red.xml @@ -111,7 +111,7 @@ android:layout_height="wrap_content" android:textColor="#fff" android:textSize="@dimen/sp_13" - tools:text="已存入金币,可直接提现" + tools:text="已存入金币" app:layout_constraintTop_toBottomOf="@+id/tv_red_jb" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="@dimen/dp_31" diff --git a/moduleroom/src/main/res/layout/fragment_red_envelopes.xml b/moduleroom/src/main/res/layout/fragment_red_envelopes.xml index 26484cc..c736bd0 100644 --- a/moduleroom/src/main/res/layout/fragment_red_envelopes.xml +++ b/moduleroom/src/main/res/layout/fragment_red_envelopes.xml @@ -12,6 +12,7 @@ android:layout_marginEnd="@dimen/dp_10" android:background="@color/color_transparent"> + + + @@ -93,51 +104,62 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" - android:layout_marginBottom="@dimen/dp_88" + android:layout_marginBottom="@dimen/dp_80" android:textColor="@color/color_FFFFFFE0" android:textSize="@dimen/sp_23" android:textStyle="bold" tools:text="发布评论抢红包" - android:paddingTop="@dimen/dp_9" + android:paddingTop="@dimen/dp_12" android:gravity="top|center"/> - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/text_pl"> - - + + + + + + diff --git a/moduleroom/src/main/res/layout/item_red_bag.xml b/moduleroom/src/main/res/layout/item_red_bag.xml index d81517a..d3f55d2 100644 --- a/moduleroom/src/main/res/layout/item_red_bag.xml +++ b/moduleroom/src/main/res/layout/item_red_bag.xml @@ -3,16 +3,58 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" - > + xmlns:tools="http://schemas.android.com/tools" + > + + + + + + \ No newline at end of file