## 红包雨组件

### 版本历史

版本号 | 更新时间 | 更新描述
--- | --- | ---
1.0.1 | 2022.5.7 | 红包雨组件上线
1.0.2 | 2022.11.24 | 支持自定义封面
1.2.4 | 2023.8.7 | 修复已知问题
1.2.6 | 2023.12.1 | 升级依赖Glide4.x版本
1.2.7 | 2024.2.2 | 修复已知问题

### 组件引入

注意：所有使用互动组件必须要引入basemodule库，最新版本见 互动组件对接文档

项目根目录build.gradle引入：

     repositories {     maven { url 'http://nexus-app.bokecc.com/repository/sdk-group/' } }

module的build.gradle引入：

     dependencies {     api ('com.bokecc:basemodule:x.x.x')     api ('com.bokecc.module:redpacketmodule:x.x.x') }

Application的onCreate方法中，调用 `DWLiveEngine.init` 初始化dwlivesdk后，添加代码：

    RedPacketInteractSDK.getInstance().init(app);

### 1. 组件描述

红包雨组件是基于基础组件库扩展的红包雨组件服务，通过IM组件实现红包雨活动事件的实时推送，包括接收红包雨事件，查询红包雨详情、提交红包雨结果等功能，为业务方提供红包雨能力。红包雨组件包含管理器和基于管理器实现的UI界面，接入方可基于管理器对外API实现完全自定义UI的红包雨，也可直接集成组件SDK提供的UI。

### 2. 组件架构

#### 2.1 组件架构图

#### 2.2 核心对外API

IRedPacketManager内部唯一实现类为RedPacketManagerImpl

作用 | API
--- | ---
初始化 | init(BaseRedPacketListener listener, String userId, String roomId, String interactToken)
发送礼物 | robRed(String redActivityId, IBaseCallBack sendVoteCallBack)
红包结果列表 | getRankList(String redActivityId, IBaseCallBack voteListCallBack)
获取用户红包记录 | getUserRecord(IBaseCallBack historyCallBack)
获取红包详情 | getRedDetail(String redActivityId, IBaseCallBack historyCallBack)
重连 | reConnect()
释放 | release()

API接口代码

    public interface IRedPacketManager {
        /**     * @param listener      监听     * @param userId        viewerId     * @param roomId        房间id     * @param interactToken token     */    void init(BaseRedPacketListener listener, String userId, String roomId, String interactToken);
        /**     * 抢红包     *     * @param redActivityId    红包雨活动id     * @param sendVoteCallBack 回调     */    void robRed(String redActivityId, IBaseCallBack<RobRedBean> sendVoteCallBack);
        /**     * 红包结果列表     *     * @param redActivityId    红包雨活动id     * @param voteListCallBack 回调     */    void getRankList(String redActivityId, IBaseCallBack<RankListBean> voteListCallBack);
        /**     * 获取用户红包记录     *     * @param historyCallBack 回调     */    void getUserRecord(IBaseCallBack<UserRecordBean> historyCallBack);
        /**     * 获取红包详情     *     * @param redActivityId   红包雨活动id     * @param historyCallBack 回调     */    void getRedDetail(String redActivityId, IBaseCallBack<RedPacketBean> historyCallBack);
        /**     * 重连     */    void reConnect();
        /**     * 释放     */    void release();
    }

#### 2.3 数据参数定义

数据类参数说明

#####

    public class RankListBean {
        /**     * 本人中奖总金额 分     */    private long totalPrice;    /**     * win     */    private String win;    /**     * 本人id     */    private String userId;    /**     * 1@现金红包 2@几分红包     */    private int redKind;

        /**     * 记录     */    private List<RecordsDTO> records;}
    public class RedPacketBean {
        /**     * 订单编号     */    private String orderNo;    /**     * 红包活动id     */    private String redActivityId;    /**     * 红包名称     */    private String redName;    /**     * 红包发送时间     */    private String redSendTime;    /**     * 红包价格 分     */    private long redPrice;    /**     * 红包类型:1@随机红包 2@等分红包     */    private int redType;    /**     * 红包种类:1@普通红包 2@积分红包     */    private int redKind;    /**     * 红包领取金额     */    private long redReceive;    /**     * 红包数量     */    private int redNumber;    /**     * 红包有效期     */    private int redExpireTime;    /**     * 红包时长     */    private long redDuration;    /**     * 红包描述     */    private String redDesc;    /**     * 红包概率     */    private int redProbability;    /**     * 红包掉落的速度:1@慢 2@正常 3@快 4@很快     */    private int redSpeed;    /**     * 红包最小金额 分     */    private long redMinPrice;    /**     * 红包状态 1@初始化 2@充值完成 3@活动开始 4@活动结束     */    private int redStatus;    /**     * 中奖次数     */    private int redWinTimes;    /**     * 是否自动关闭 1@是 0@不是     */    private int redAutoClose;    /**     * 服务器时间     */    private long serverTime;}

### 3. 组件接入

#### 3.1 使用组件提供UI

投票ViewGroup为VoteMainLayout

1. 登录业务SDK（云直播等）

2. 初始化组件

   1. 获取token-初始化投票需要传递参数token，可以通过业务SDK（云直播等）提供的对外API获取token

   2. 获取正在进行活动-如果需要进入时就展示互动组件，需要调用业务SDK提供的正在进行中组件活动API获取正在进行的活动

   3. 初始化组件-使用前两步获取的信息初始化组件SDK

      代码示例（以云直播为例）：

       DWLive..getInstance().getInteractiveToken(new BaseCallback<String>() {                    @Override                    public void onError(String error) {
                           }
                           @Override                    public void onSuccess(String token) {                        //获取正在进行的互动                        DWLive.getInstance().getInteractiveOngoing(new BaseCallback<List<InteractionOngoing>>() {                            @Override                            public void onError(String error) {                                initRedPacket(token,                                        loginInfo.getUserId(),                                        loginInfo.getRoomId(),                                        false,                                        ""                                );
                                   }
                                   @Override                            public void onSuccess(List<InteractionOngoing> interactionOngoings) {                                //是否正在进行                                boolean isOngoing = false;                                String ongoingId = "";                                if (interactionOngoings != null) {                                    for (int i = 0; i < interactionOngoings.size(); i++) {                                      //  互动组件红包雨 TYPE_INTERACT_RED_PACKET = 6;                                      // 互动组件投票 TYPE_INTERACT_VOTE = 7;                                        if (interactionOngoings.get(i).getType() == InteractionOngoing.TYPE_INTERACT_VOTE) {                                            isOngoing = true;                                            ongoingId = interactionOngoings.get(i).getId();                                            break;                                        }                                    }                                }
                                       initRedPacket(                                        token,                                        loginInfo.getUserId(),                                        loginInfo.getRoomId(),                                        isOngoing,                                        ongoingId                                );                            }                        });                    }                });

       private void initRedPacket(String token, String userId, String roomId, boolean isOngoing, String ongoingId) {  //获取组件开关，用于判断房间组件是否开启，以云直播为例        if (DWLive.getInstance().getInteractionConfigure().getRedEnvelopesSwitch() == 1) {            redPacketBaseHelper = new RedPacketHelper(RedPacketTestActivity.this);                redPacketBaseHelper.initialize(new RedPacketBaseHelper.RedPacketConfig()                        .setUserId(userId)                        .setRoomId(roomId)                        .setInteractToken(token)                        .setOngoing(isOngoing)                        .setOngoingId(ongoingId));        }    }

3. 销毁组件

       @Override    protected void onDestroy() {        super.onDestroy();        if (redPacketBaseHelper!=null){            redPacketBaseHelper.release();        }    }

#### 3.2 使用组件管理器+自定义UI

红包雨管理器实现类为RedPacketManagerImpl，对外方法参照IRedPacketManager，helper实现可以参考RedPacketBaseHelper以及其子类RedPacketHelper实现

### 4. 混淆配置

混淆配置

    -keep class com.bokecc.**{*;}-keep interface com.bokecc.**{*;}

### 5. 组件库依赖

    ximplementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support:recyclerview-v7:28.0.0'implementation 'com.github.bumptech.glide:glide:4.9.0'