From 926a1a3cb626d51c8d0a19719231774b9584ea3e Mon Sep 17 00:00:00 2001 From: 18401019693 Date: Wed, 10 Jan 2024 15:48:10 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E6=88=BF=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/shayu/phonelive/AppContext.java | 8 + common/src/main/assets/chat_message_bg.png | Bin 0 -> 712 bytes .../common/activity/SudGameActivity.java | 215 ++++++++- .../common/adapter/SudGameChatAdapter.java | 122 +++++ .../adapter/SudGameUserListAdapter.java | 61 +++ .../common/bean/SudGameChatImModel.java | 26 ++ .../yunbao/common/bean/SudGameUserModel.java | 14 + .../dialog/SudGameInputPopupWindow.java | 73 +++ .../common/event/SudGameSocketImEvent.java | 120 +++++ .../manager/imrongcloud/GameMicManager.java | 429 ++++++++++++++++++ .../common/sud/QuickStartGameViewModel.java | 4 + .../sud/audio/AudioEngineUpdateType.java | 6 + .../yunbao/common/sud/audio/AudioPCMData.java | 8 + .../common/sud/audio/AudioRoomState.java | 34 ++ .../yunbao/common/sud/audio/AudioStream.java | 7 + .../common/sud/audio/ISudAudioEngine.java | 121 +++++ .../sud/audio/ISudAudioEventListener.java | 95 ++++ .../common/sud/audio/MediaViewMode.java | 7 + .../common/sud/model/AudioJoinRoomModel.java | 16 + .../common/utils/LoadDian9TuUtilSud.java | 108 +++++ .../yunbao/common}/utils/NinePatchChunk.java | 2 +- .../common/views/SudGameChatViewHolder.java | 49 ++ .../views/SudGameUserListViewHolder.java | 12 + .../com/yunbao/common/views}/TopGradual.java | 2 +- .../drawable/background_sud_game_input.xml | 5 + .../background_sud_game_input_edit_text.xml | 5 + .../drawable/bg_live_sud_game_back_new.png | Bin 0 -> 2678 bytes .../bg_live_sud_game_bottom_input.xml | 5 + .../bg_live_sud_game_bottom_input_right.xml | 7 + .../res/drawable/bg_live_sud_game_top_new.xml | 5 + .../src/main/res/layout/activity_sud_game.xml | 252 +++++----- .../main/res/layout/dialog_sud_game_input.xml | 29 ++ .../layout/view_sud_game_chat_item_holder.xml | 24 + .../layout/view_sud_game_user_list_holder.xml | 21 + .../mipmap-xxhdpi/icon_game_close_wheat.png | Bin 0 -> 6267 bytes .../res/mipmap-xxhdpi/icon_game_hang_up.png | Bin 0 -> 6173 bytes .../mipmap-xxhdpi/icon_game_open_wheat.png | Bin 0 -> 5400 bytes .../main/res/mipmap-xxhdpi/icon_game_seat.png | Bin 0 -> 5927 bytes .../main/res/mipmap-xxhdpi/icon_send_game.png | Bin 0 -> 13814 bytes .../icon_sud_history_live_new.png | Bin 0 -> 6035 bytes .../mipmap-xxhdpi/icon_vacancy_sud_game.png | Bin 0 -> 3409 bytes common/src/main/res/values/strings.xml | 1 + .../dialog/LiveGiveHotDialogFragment.java | 4 +- .../yunbao/live/utils/LoadDian9TuUtil.java | 1 + .../yunbao/live/views/LiveRoomViewHolder.java | 2 +- .../live/views/SystemMessageViewHolder.java | 2 +- 46 files changed, 1769 insertions(+), 133 deletions(-) create mode 100644 common/src/main/assets/chat_message_bg.png create mode 100644 common/src/main/java/com/yunbao/common/adapter/SudGameChatAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/adapter/SudGameUserListAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/bean/SudGameChatImModel.java create mode 100644 common/src/main/java/com/yunbao/common/bean/SudGameUserModel.java create mode 100644 common/src/main/java/com/yunbao/common/dialog/SudGameInputPopupWindow.java create mode 100644 common/src/main/java/com/yunbao/common/event/SudGameSocketImEvent.java create mode 100644 common/src/main/java/com/yunbao/common/manager/imrongcloud/GameMicManager.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/AudioEngineUpdateType.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/AudioPCMData.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/AudioRoomState.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/AudioStream.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEngine.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEventListener.java create mode 100644 common/src/main/java/com/yunbao/common/sud/audio/MediaViewMode.java create mode 100644 common/src/main/java/com/yunbao/common/sud/model/AudioJoinRoomModel.java create mode 100644 common/src/main/java/com/yunbao/common/utils/LoadDian9TuUtilSud.java rename {live/src/main/java/com/yunbao/live => common/src/main/java/com/yunbao/common}/utils/NinePatchChunk.java (98%) create mode 100644 common/src/main/java/com/yunbao/common/views/SudGameChatViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/SudGameUserListViewHolder.java rename {live/src/main/java/com/yunbao/live/custom => common/src/main/java/com/yunbao/common/views}/TopGradual.java (97%) create mode 100644 common/src/main/res/drawable/background_sud_game_input.xml create mode 100644 common/src/main/res/drawable/background_sud_game_input_edit_text.xml create mode 100644 common/src/main/res/drawable/bg_live_sud_game_back_new.png create mode 100644 common/src/main/res/drawable/bg_live_sud_game_bottom_input.xml create mode 100644 common/src/main/res/drawable/bg_live_sud_game_bottom_input_right.xml create mode 100644 common/src/main/res/drawable/bg_live_sud_game_top_new.xml create mode 100644 common/src/main/res/layout/dialog_sud_game_input.xml create mode 100644 common/src/main/res/layout/view_sud_game_chat_item_holder.xml create mode 100644 common/src/main/res/layout/view_sud_game_user_list_holder.xml create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_game_close_wheat.png create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_game_hang_up.png create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_game_open_wheat.png create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_game_seat.png create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_send_game.png create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_sud_history_live_new.png create mode 100644 common/src/main/res/mipmap-xxhdpi/icon_vacancy_sud_game.png diff --git a/app/src/main/java/com/shayu/phonelive/AppContext.java b/app/src/main/java/com/shayu/phonelive/AppContext.java index 499fa2607..8d2e7884e 100644 --- a/app/src/main/java/com/shayu/phonelive/AppContext.java +++ b/app/src/main/java/com/shayu/phonelive/AppContext.java @@ -23,6 +23,7 @@ import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.Utils; import com.facebook.appevents.AppEventsLogger; import com.fm.openinstall.OpenInstall; +import com.google.gson.Gson; import com.shayu.phonelive.utils.LogUtils; import com.tencent.imsdk.v2.V2TIMGroupMemberInfo; import com.tencent.imsdk.v2.V2TIMManager; @@ -36,12 +37,14 @@ import com.yunbao.common.CommonAppContext; import com.yunbao.common.Constants; import com.yunbao.common.bean.AnchorStartLiveBean; import com.yunbao.common.bean.CrashSaveBean; +import com.yunbao.common.event.SudGameSocketImEvent; import com.yunbao.common.manager.imrongcloud.InstructorSendReward; import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider; import com.yunbao.common.manager.imrongcloud.MessageIMManager; import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.AppManager; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.GoogleUtils; import com.yunbao.common.utils.L; import com.yunbao.common.utils.SpUtil; @@ -210,6 +213,11 @@ public class AppContext extends CommonAppContext { SocketReceiveBean received = JSON.parseObject(content.getContent(), SocketReceiveBean.class); JSONObject map = received.getMsg().getJSONObject(0); sendStartAnchorLive(map); + } else if (message.getTargetId().contains("v")) { + String contentJson = ((TextMessage) message.getContent()).getContent(); + Log.e("wewe", contentJson); + SudGameSocketImEvent sudGameSocketImEvent = new Gson().fromJson(contentJson, SudGameSocketImEvent.class); + Bus.get().post(sudGameSocketImEvent); } //主播页面 if (TextUtils.isEmpty(PortraitLiveManager.liveID) && SocketRyClient.mSocketHandler != null) { diff --git a/common/src/main/assets/chat_message_bg.png b/common/src/main/assets/chat_message_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4138e7e12289f519d646c632d70c9a0342b19291 GIT binary patch literal 712 zcmeAS@N?(olHy`uVBq!ia0vp^SAf`ugAGWEzMg3Yq(brvLXsJnm^guK7*GH*K$r)L zffPd~5N89iDiEs!F(Wee0dkP}AokM2j-w0=O!}TKjv*Dd-rjZ07D<;m@Nj--wZR3E zz}2j*x)Cqc1rEMn-|m#(8s)+NY(WO!Hk0n&j&`4Sn@>wim(P2?SY^5T+ST?~ORB8*mZ>&bt&j`jXE|d2ru1ui>92a$ zt*h$R$^F#3q3C{f^{dO*d0s83GK;--a9w1${?=NC8sTDmLwn2y1!y|3=hY5s1uTG;IG%Rukgbg9l~teHw{1w_U-eqKX;=2N3#)z=x&&-LBlK*mf%=N~X9ZXN%5w>r zXMJ#Iv!LToR?9OviRXI~WE>k8I0PtYfUtlF2y<|;u!3+C69@yP8Nf;!z{+4sBt);w zG(5OR>>0~eGxrs*N?Zcu&j2k*cL`8`#u2(#Uhqov_rQRwvjrXJh8|Blc}O;Vz8gzu zY05mEJMzVRv!t)=`gPhTa>e4bcV+pX626BTZ{tlo{wMmc-S-E7dHw!W?$X?Sy{BHE z-}=FpD$D2hGG{NCoUFR{hFYn#4H0Qs2Bc^Y#M0uvL#={xv^4 zU$!XZZ`j}MXJ@bH{lT0U;=k(mKJI;i;^(8%-#?2@3lLxDKfQ7L>cg5Q(_3P$He9=U nfA0S|FV3n-^Fw0y!`52H&4oU%A}!~w28npO`njxgN@xNA8yp~d literal 0 HcmV?d00001 diff --git a/common/src/main/java/com/yunbao/common/activity/SudGameActivity.java b/common/src/main/java/com/yunbao/common/activity/SudGameActivity.java index 93544495f..f059a0103 100644 --- a/common/src/main/java/com/yunbao/common/activity/SudGameActivity.java +++ b/common/src/main/java/com/yunbao/common/activity/SudGameActivity.java @@ -3,29 +3,40 @@ package com.yunbao.common.activity; import android.app.Activity; import android.view.View; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.TextView; import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.google.gson.Gson; import com.lxj.xpopup.XPopup; -import com.makeramen.roundedimageview.RoundedImageView; import com.yunbao.common.R; +import com.yunbao.common.adapter.SudGameChatAdapter; +import com.yunbao.common.adapter.SudGameUserListAdapter; import com.yunbao.common.bean.CheckRemainingBalance; import com.yunbao.common.bean.CreateSudRoomModel; import com.yunbao.common.bean.CustomSidebarChildModel; import com.yunbao.common.bean.CustomSidebarInfoModel; +import com.yunbao.common.bean.SudGameChatImModel; +import com.yunbao.common.dialog.SudGameInputPopupWindow; import com.yunbao.common.event.CheckRemainingBalanceEvent; +import com.yunbao.common.event.SudGameSocketImEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.manager.imrongcloud.GameMicManager; import com.yunbao.common.sud.QuickStartGameViewModel; import com.yunbao.common.sud.model.GameConfigModel; +import com.yunbao.common.sud.model.GameViewInfoModel; import com.yunbao.common.sud.state.SudMGPMGState; import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.LiveSudGameHistoryPopup; +import com.yunbao.common.views.TopGradual; import com.yunbao.common.views.weight.ViewClicksAntiShake; import org.greenrobot.eventbus.Subscribe; @@ -35,15 +46,28 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -public class SudGameActivity extends AbsActivity { +import cn.rongcloud.rtc.api.RCRTCEngine; +import cn.rongcloud.rtc.api.RCRTCRemoteUser; +import cn.rongcloud.rtc.api.RCRTCRoom; +import cn.rongcloud.rtc.api.stream.RCRTCInputStream; +import cn.rongcloud.rtc.base.RTCErrorCode; + +public class SudGameActivity extends AbsActivity implements GameMicManager.MeetingCallback { private FrameLayout gameContainer; private long mInteractionID; private String mLiveUid; private final QuickStartGameViewModel gameViewModel = new QuickStartGameViewModel(); // 创建ViewModel private CreateSudRoomModel mCreateSudRoomModel; - private TextView gameTitle, roomName, roomNumber; - private RoundedImageView mAvatar; + private TextView roomName, roomNumber; + private GameMicManager gameMicManager; + private ImageView gameCloseWheat, gameSeat; + private boolean disable = true, publishDefault = false; + + private RecyclerView chatList, userList; + private SudGameChatAdapter mLiveChatAdapter; + private SudGameUserListAdapter sudGameUserListAdapter; + @Override protected int getLayoutId() { return R.layout.activity_sud_game; @@ -56,7 +80,9 @@ public class SudGameActivity extends AbsActivity { initView(); initDate(); } + private List customSidebarChildModels = new ArrayList<>(); + private void initDate() { LiveNetManager.get(mContext) .getCustomSidebarInfo("1", new HttpCallback>() { @@ -75,10 +101,21 @@ public class SudGameActivity extends AbsActivity { } }); + gameMicManager = new GameMicManager(); + gameMicManager.attachView(this); + gameMicManager.config(this); + gameMicManager.joinRoom(mLiveUid); + // 设置禁用麦克风采集 + RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(disable); + ImgLoader.display(mContext, R.mipmap.icon_game_close_wheat, gameCloseWheat); + gameCloseWheat.setVisibility(View.INVISIBLE); } + @Override protected void onDestroy() { Bus.getOff(this); + gameMicManager.leaveRoom(); + gameMicManager.detachView(); super.onDestroy(); } @@ -89,15 +126,33 @@ public class SudGameActivity extends AbsActivity { mLiveUid = mCreateSudRoomModel.getSudGameRoomId(); gameContainer = findViewById(R.id.game_container); - gameTitle = findViewById(R.id.game_title); roomName = findViewById(R.id.room_name); roomNumber = findViewById(R.id.room_number); - mAvatar = findViewById(R.id.avatar); + gameCloseWheat = findViewById(R.id.game_close_wheat); + gameSeat = findViewById(R.id.game_seat); + chatList = findViewById(R.id.chat_list); + userList = findViewById(R.id.user_list); + //聊天栏 + FrameLayout.LayoutParams params1 = (FrameLayout.LayoutParams) + chatList.getLayoutParams(); + params1.topMargin = DpUtil.dp2px(65); + chatList.setLayoutParams(params1); + + chatList.setHasFixedSize(true); + LinearLayoutManager layoutManager = new LinearLayoutManager(mContext); + layoutManager.setOrientation(RecyclerView.VERTICAL); + layoutManager.setStackFromEnd(true); + chatList.setLayoutManager(layoutManager); + chatList.addItemDecoration(new TopGradual()); + chatList.setItemViewCacheSize(10); + mLiveChatAdapter = new SudGameChatAdapter(mContext); + chatList.setAdapter(mLiveChatAdapter); + sudGameUserListAdapter = new SudGameUserListAdapter(new ArrayList<>()); + userList.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); + userList.setAdapter(sudGameUserListAdapter); if (mCreateSudRoomModel != null) { - gameTitle.setText(mCreateSudRoomModel.getSudGameName()); roomName.setText(mCreateSudRoomModel.getRoomName()); roomNumber.setText(mCreateSudRoomModel.getSudGameRoomId()); - ImgLoader.display(mContext, mCreateSudRoomModel.getAvatar(), mAvatar); } ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.exit), new ViewClicksAntiShake.ViewClicksCallBack() { @Override @@ -115,6 +170,52 @@ public class SudGameActivity extends AbsActivity { .asCustom(new LiveSudGameHistoryPopup(mContext, customSidebarChildModels)).show(); } }); + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.game_seat), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (publishDefault) { + disable = true; + // 设置禁用麦克风采集 + RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(disable); + ImgLoader.display(mContext, R.mipmap.icon_game_close_wheat, gameCloseWheat); + gameMicManager.unPublishStreams(); + } else { + gameMicManager.publishDefaultAVStream(); + } + + } + }); + ViewClicksAntiShake.clicksAntiShake(gameCloseWheat, new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (disable) { + disable = false; + // 设置禁用麦克风采集 + RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(disable); + ImgLoader.display(mContext, R.mipmap.icon_game_open_wheat, gameCloseWheat); + } else { + disable = true; + // 设置禁用麦克风采集 + RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(disable); + ImgLoader.display(mContext, R.mipmap.icon_game_close_wheat, gameCloseWheat); + } + } + }); + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.game_review_input), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + new XPopup.Builder(mContext) + .enableDrag(false) + .asCustom(new SudGameInputPopupWindow(mContext, new SudGameInputPopupWindow.SudGameInputCallBack() { + @Override + public void sendMessage(String textMessage) { + gameMicManager.sendMessage(textMessage); + } + })) + .show(); + } + }); + gameViewModel.gameViewLiveData.observe(this, new Observer() { @Override public void onChanged(View view) { @@ -122,7 +223,9 @@ public class SudGameActivity extends AbsActivity { gameContainer.removeAllViews(); } else { // 把游戏View添加到容器内 gameContainer.addView(view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); + } + } }); // 加载游戏,参数定义可查看BaseGameViewModel.switchGame()方法注释 @@ -137,6 +240,7 @@ public class SudGameActivity extends AbsActivity { gameConfigModel.ui.game_settle_again_btn.custom = true; gameConfigModel.ui.start_btn.custom = true; + // SudMGP平台64bit游戏ID gameViewModel.switchGame((Activity) mContext, mLiveUid, mInteractionID); // gameViewModel.sudFSTAPPDecorator.notifyAPPCommonSelfIn(true, -1, true, 1); @@ -147,6 +251,13 @@ public class SudGameActivity extends AbsActivity { // // } // }); + // 设置游戏安全操作区域 + GameViewInfoModel.GameViewRectModel gameViewRectModel = new GameViewInfoModel.GameViewRectModel(); + gameViewRectModel.left = 0; + gameViewRectModel.top = DpUtil.dp2px(155); + gameViewRectModel.right = 0; + gameViewRectModel.bottom = DpUtil.dp2px(155); + gameViewModel.gameViewRectModel = gameViewRectModel; } @@ -156,6 +267,7 @@ public class SudGameActivity extends AbsActivity { switch (event.getSudMGPMGState()) { case SudMGPMGState.MG_COMMON_SELF_CLICK_JOIN_BTN: case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_SETTLE_AGAIN_BTN: + LiveNetManager.get(mContext).checkRemainingBalance(mCreateSudRoomModel.getSudGameRoomId(), new HttpCallback() { @Override public void onSuccess(CheckRemainingBalance data) { @@ -190,9 +302,9 @@ public class SudGameActivity extends AbsActivity { HttpCallback() { @Override public void onSuccess(CheckRemainingBalance data) { - if (data.getStatus()==1){ + if (data.getStatus() == 1) { gameViewModel.sudFSTAPPDecorator.notifyAPPCommonSelfPlaying(true); - }else { + } else { } @@ -205,10 +317,91 @@ public class SudGameActivity extends AbsActivity { }); break; case SudMGPMGState.MG_COMMON_GAME_STATE: - LiveNetManager.get(mContext).deductMoney( mCreateSudRoomModel.getSudGameRoomId()); + LiveNetManager.get(mContext).deductMoney(mCreateSudRoomModel.getSudGameRoomId()); break; } } + @Override + public void onJoinRoomSuccess(RCRTCRoom rcrtcRoom) { + + // 主动订阅远端用户发布的资源 + gameMicManager.subscribeAVStream(); + } + + @Override + public void onJoinRoomFailed(RTCErrorCode rtcErrorCode) { + ToastUtil.show("加入失败 "); + } + + @Override + public void onPublishSuccess() { + runOnUiThread(new Runnable() { + @Override + public void run() { + ImgLoader.display(mContext, R.mipmap.icon_game_hang_up, gameSeat); + publishDefault = true; + gameCloseWheat.setVisibility(View.VISIBLE); + disable = false; + // 设置禁用麦克风采集 + RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(disable); + ImgLoader.display(mContext, R.mipmap.icon_game_open_wheat, gameCloseWheat); + } + }); + + } + + @Override + public void onPublishFailed() { + ToastUtil.show("发布失败 "); + } + + @Override + public void onSubscribeSuccess(List inputStreamList) { + ToastUtil.show("订阅成功 "); + } + + @Override + public void onSubscribeFailed() { + ToastUtil.show("订阅失败 "); + } + + @Override + public void onUserJoined(RCRTCRemoteUser rcrtcRemoteUser) { + + } + + @Override + public void onUserLeft(RCRTCRemoteUser rcrtcRemoteUser) { + + } + + @Override + public void insertItem(SudGameChatImModel sudGameChatImModel) { + mLiveChatAdapter.insertItem(sudGameChatImModel); + } + + @Override + public void onUnPublishStreamsSuccess() { + runOnUiThread(new Runnable() { + @Override + public void run() { + ImgLoader.display(mContext, R.mipmap.icon_game_seat, gameSeat); + publishDefault = false; + gameCloseWheat.setVisibility(View.INVISIBLE); + } + }); + + } + + @Override + public void onUnPublishStreamsFailed() { + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onSudGameSocketImEvent(SudGameSocketImEvent event) { + gameMicManager.processingMessage(event); + } } diff --git a/common/src/main/java/com/yunbao/common/adapter/SudGameChatAdapter.java b/common/src/main/java/com/yunbao/common/adapter/SudGameChatAdapter.java new file mode 100644 index 000000000..0cc916894 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/SudGameChatAdapter.java @@ -0,0 +1,122 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.SudGameChatImModel; +import com.yunbao.common.views.SudGameChatViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class SudGameChatAdapter extends RecyclerView.Adapter { + private boolean isBottom = false; + List sudGameChatImModels = new ArrayList<>(); + private RecyclerView mRecyclerView; + private LinearLayoutManager mLayoutManager; + private int mRecyclerViewScrolledDy; + private Context mContext; + + public SudGameChatAdapter(Context mContext) { + this.mContext = mContext; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View herdView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_sud_game_chat_item_holder, parent, false); + return new SudGameChatViewHolder(herdView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof SudGameChatViewHolder) { + SudGameChatViewHolder itemViewHolder = (SudGameChatViewHolder) holder; + itemViewHolder.sudGameChat(sudGameChatImModels.get(position)); + + } + } + + @Override + public int getItemCount() { + return sudGameChatImModels.size(); + } + + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + mRecyclerView = recyclerView; + mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + if (isBottom && dy >= 0) return; + mRecyclerViewScrolledDy = dy; + isBottom = false; + + } + + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == 0 && isSlideToBottom(recyclerView)) { + mRecyclerViewScrolledDy = 0; + scrollToBottom(); + isBottom = true; + } else if (newState == 0) { + isBottom = false; + } + } + }); + } + + public synchronized void insertItem(SudGameChatImModel bean) { + if (bean == null) { + return; + } + int size = sudGameChatImModels.size(); + //设置最大展示99条消息 + if (size >= 100 && (isBottom || mRecyclerViewScrolledDy == 0)) { + + sudGameChatImModels.subList(0, 50).clear(); + notifyItemRangeRemoved(0, 50); + } + sudGameChatImModels.add(bean); + if (getItemCount() == 1) { + notifyDataSetChanged(); + } else { + notifyItemInserted(getItemCount()); + } + if (isBottom || mRecyclerViewScrolledDy == 0) { + scrollToBottom(); + } + } + + /** + * 判断是否滚到底部 + * + * @param recyclerView + * @return + */ + public boolean isSlideToBottom(RecyclerView recyclerView) { + if (recyclerView == null) return false; + if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() >= recyclerView.computeVerticalScrollRange()) + return true; + return false; + } + + public void scrollToBottom() { + if (sudGameChatImModels.size() > 0) { + mRecyclerView.smoothScrollToPosition(getItemCount()); + } + mRecyclerViewScrolledDy = 0; + } + +} diff --git a/common/src/main/java/com/yunbao/common/adapter/SudGameUserListAdapter.java b/common/src/main/java/com/yunbao/common/adapter/SudGameUserListAdapter.java new file mode 100644 index 000000000..3c7afd853 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/SudGameUserListAdapter.java @@ -0,0 +1,61 @@ +package com.yunbao.common.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.SudGameUserModel; +import com.yunbao.common.views.SudGameChatViewHolder; +import com.yunbao.common.views.SudGameUserListViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class SudGameUserListAdapter extends RecyclerView.Adapter { + private List gameUserModels = new ArrayList<>(); + + public SudGameUserListAdapter(List gameUserModels) { + + if (gameUserModels.size() < 7) { + this.gameUserModels.addAll(gameUserModels); + for (int i = 0; i < this.gameUserModels.size(); i++) { + this.gameUserModels.get(i).setNullUser(false); + } + int size = 7 - gameUserModels.size(); + for (int i = 0; i < size; i++) { + this.gameUserModels.add(new SudGameUserModel().setNullUser(true)); + } + } else if (gameUserModels.size() == 7) { + this.gameUserModels.addAll(gameUserModels); + for (int i = 0; i < this.gameUserModels.size(); i++) { + this.gameUserModels.get(i).setNullUser(false); + } + } else { + for (int i = 0; i < 7; i++) { + this.gameUserModels.add(gameUserModels.get(i).setNullUser(false)); + } + } + + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View herdView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_sud_game_user_list_holder, parent, false); + return new SudGameUserListViewHolder(herdView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + + } + + @Override + public int getItemCount() { + return gameUserModels.size(); + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/SudGameChatImModel.java b/common/src/main/java/com/yunbao/common/bean/SudGameChatImModel.java new file mode 100644 index 000000000..e55ee691d --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/SudGameChatImModel.java @@ -0,0 +1,26 @@ +package com.yunbao.common.bean; + +public class SudGameChatImModel extends BaseModel { + //昵称 + private String nickname; + //文字消息 + private String textMessage; + + public String getNickname() { + return nickname; + } + + public SudGameChatImModel setNickname(String nickname) { + this.nickname = nickname; + return this; + } + + public String getTextMessage() { + return textMessage; + } + + public SudGameChatImModel setTextMessage(String textMessage) { + this.textMessage = textMessage; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/SudGameUserModel.java b/common/src/main/java/com/yunbao/common/bean/SudGameUserModel.java new file mode 100644 index 000000000..e7b45af68 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/SudGameUserModel.java @@ -0,0 +1,14 @@ +package com.yunbao.common.bean; + +public class SudGameUserModel extends BaseModel { + private boolean nullUser; + + public boolean isNullUser() { + return nullUser; + } + + public SudGameUserModel setNullUser(boolean nullUser) { + this.nullUser = nullUser; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/dialog/SudGameInputPopupWindow.java b/common/src/main/java/com/yunbao/common/dialog/SudGameInputPopupWindow.java new file mode 100644 index 000000000..6cac0cc25 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/SudGameInputPopupWindow.java @@ -0,0 +1,73 @@ +package com.yunbao.common.dialog; + +import android.content.Context; +import android.text.TextUtils; +import android.widget.EditText; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +/*** + * 游戏房字体输入 + */ +public class SudGameInputPopupWindow extends BottomPopupView { + private EditText textMessage; + private SudGameInputCallBack sudGameInputCallBack; + + public SudGameInputPopupWindow(@NonNull Context context, SudGameInputCallBack sudGameInputCallBack) { + super(context); + this.sudGameInputCallBack = sudGameInputCallBack; + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_sud_game_input; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + initView(); + initDate(); + + } + + private void initView() { + textMessage = findViewById(R.id.text_message); + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.send), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + dialog.dismiss(); + if (sudGameInputCallBack != null) { + String textMessageStr = textMessage.getText().toString(); + if (!TextUtils.isEmpty(textMessageStr)) { + if (textMessageStr.length() > 100) { + ToastUtil.show(WordUtil.isNewZh() ? "超出字數限制" : "Exceed word limit"); + } else { + sudGameInputCallBack.sendMessage(textMessageStr); + } + } else { + ToastUtil.show(WordUtil.getNewString(R.string.cannot_be_empty)); + } + + } + } + }); + + } + + private void initDate() { + + } + + public interface SudGameInputCallBack { + void sendMessage(String textMessage); + } +} diff --git a/common/src/main/java/com/yunbao/common/event/SudGameSocketImEvent.java b/common/src/main/java/com/yunbao/common/event/SudGameSocketImEvent.java new file mode 100644 index 000000000..31d9ec28e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/SudGameSocketImEvent.java @@ -0,0 +1,120 @@ +package com.yunbao.common.event; + +import com.google.gson.annotations.SerializedName; +import com.yunbao.common.bean.BaseModel; + +import java.util.List; + +public class SudGameSocketImEvent extends BaseModel { + + @SerializedName("msg") + private List msg; + @SerializedName("retcode") + private String retcode; + @SerializedName("retmsg") + private String retmsg; + + public List getMsg() { + return msg; + } + + public void setMsg(List msg) { + this.msg = msg; + } + + public String getRetcode() { + return retcode; + } + + public void setRetcode(String retcode) { + this.retcode = retcode; + } + + public String getRetmsg() { + return retmsg; + } + + public void setRetmsg(String retmsg) { + this.retmsg = retmsg; + } + + public static class MsgDTO { + @SerializedName("action") + private String action; + @SerializedName("uid") + private String uid; + @SerializedName("roomnum") + private String roomnum; + @SerializedName("ct") + private String ct; + @SerializedName("uname") + private String uname; + @SerializedName("_method_") + private String method; + @SerializedName("equipment") + private String equipment; + + public String getAction() { + return action; + } + + public MsgDTO setAction(String action) { + this.action = action; + return this; + } + + public String getUid() { + return uid; + } + + public MsgDTO setUid(String uid) { + this.uid = uid; + return this; + } + + public String getRoomnum() { + return roomnum; + } + + public MsgDTO setRoomnum(String roomnum) { + this.roomnum = roomnum; + return this; + } + + public String getCt() { + return ct; + } + + public MsgDTO setCt(String ct) { + this.ct = ct; + return this; + } + + public String getUname() { + return uname; + } + + public MsgDTO setUname(String uname) { + this.uname = uname; + return this; + } + + public String getMethod() { + return method; + } + + public MsgDTO setMethod(String method) { + this.method = method; + return this; + } + + public String getEquipment() { + return equipment; + } + + public MsgDTO setEquipment(String equipment) { + this.equipment = equipment; + return this; + } + } +} diff --git a/common/src/main/java/com/yunbao/common/manager/imrongcloud/GameMicManager.java b/common/src/main/java/com/yunbao/common/manager/imrongcloud/GameMicManager.java new file mode 100644 index 000000000..abd8b6d7f --- /dev/null +++ b/common/src/main/java/com/yunbao/common/manager/imrongcloud/GameMicManager.java @@ -0,0 +1,429 @@ +package com.yunbao.common.manager.imrongcloud; + +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; + +import com.google.gson.Gson; +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.bean.IMLoginModel; +import com.yunbao.common.bean.SudGameChatImModel; +import com.yunbao.common.event.SudGameSocketImEvent; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; + +import java.util.ArrayList; +import java.util.List; + +import cn.rongcloud.rtc.api.RCRTCEngine; +import cn.rongcloud.rtc.api.RCRTCRemoteUser; +import cn.rongcloud.rtc.api.RCRTCRoom; +import cn.rongcloud.rtc.api.RCRTCRoomConfig; +import cn.rongcloud.rtc.api.callback.IRCRTCResultCallback; +import cn.rongcloud.rtc.api.callback.IRCRTCResultDataCallback; +import cn.rongcloud.rtc.api.callback.IRCRTCRoomEventsListener; +import cn.rongcloud.rtc.api.stream.RCRTCInputStream; +import cn.rongcloud.rtc.base.RCRTCRoomType; +import cn.rongcloud.rtc.base.RTCErrorCode; +import io.rong.imlib.IRongCallback; +import io.rong.imlib.IRongCoreCallback; +import io.rong.imlib.IRongCoreEnum; +import io.rong.imlib.RongIMClient; +import io.rong.imlib.chatroom.base.RongChatRoomClient; +import io.rong.imlib.model.Conversation; +import io.rong.imlib.model.Message; +import io.rong.message.TextMessage; + +public class GameMicManager { + MeetingCallback mMeetingCallback = null; + private RCRTCRoom mRtcRoom = null; + private String mRoomID = ""; + + + private final IRCRTCRoomEventsListener roomEventsListener = new IRCRTCRoomEventsListener() { + /** + * 房间内用户发布资源 + * + * @param rcrtcRemoteUser 远端用户 + * @param list 发布的资源 + */ + @Override + public void onRemoteUserPublishResource(RCRTCRemoteUser rcrtcRemoteUser, final List list) { + subscribeAVStream(); + } + + @Override + public void onRemoteUserMuteAudio(RCRTCRemoteUser rcrtcRemoteUser, RCRTCInputStream rcrtcInputStream, boolean b) { + + } + + @Override + public void onRemoteUserMuteVideo(RCRTCRemoteUser rcrtcRemoteUser, RCRTCInputStream rcrtcInputStream, boolean b) { + } + + + @Override + public void onRemoteUserUnpublishResource(RCRTCRemoteUser rcrtcRemoteUser, List list) { + } + + /** + * 用户加入房间 + * + * @param rcrtcRemoteUser 远端用户 + */ + @Override + public void onUserJoined(final RCRTCRemoteUser rcrtcRemoteUser) { + try { + getView().onUserJoined(rcrtcRemoteUser); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + + /** + * 用户离开房间 + * + * @param rcrtcRemoteUser 远端用户 + */ + @Override + public void onUserLeft(RCRTCRemoteUser rcrtcRemoteUser) { + try { + getView().onUserLeft(rcrtcRemoteUser); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + + @Override + public void onUserOffline(RCRTCRemoteUser rcrtcRemoteUser) { + } + + @Override + public void onPublishLiveStreams(List list) { + } + + @Override + public void onUnpublishLiveStreams(List list) { + } + + /** + * 自己退出房间。 例如断网退出等 + * @param i 状态码 + */ + @Override + public void onLeaveRoom(int i) { + } + }; + + protected MeetingCallback getView() { + if (mMeetingCallback == null) { + throw new IllegalStateException("view is not attached"); + } else { + return mMeetingCallback; + } + } + + public void attachView(MeetingCallback callback) { + mMeetingCallback = callback; + } + + public void detachView() { + mMeetingCallback = null; + } + + /** + * 主动订阅远端用户发布的流 + * 视频流需要用户设置用于显示载体的videoview + */ + public void subscribeAVStream() { + if (mRtcRoom == null || mRtcRoom.getRemoteUsers() == null) { + return; + } + final List inputStreams = new ArrayList<>(); + for (final RCRTCRemoteUser remoteUser : mRtcRoom.getRemoteUsers()) { + if (remoteUser.getStreams().size() == 0) { + continue; + } + + inputStreams.addAll(remoteUser.getStreams()); + } + + if (inputStreams.size() == 0) { + return; + } + mRtcRoom.getLocalUser().subscribeStreams(inputStreams, new IRCRTCResultCallback() { + @Override + public void onSuccess() { + + + try { + getView().onSubscribeSuccess(inputStreams); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailed(RTCErrorCode errorCode) { + try { + getView().onSubscribeFailed(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + }); + } + + public void unPublishStreams() { + if (mRtcRoom == null) { + return; + } + mRtcRoom.getLocalUser().unpublishStream(RCRTCEngine.getInstance().getDefaultAudioStream(), new IRCRTCResultCallback() { + @Override + public void onSuccess() { + try { + getView().onUnPublishStreamsSuccess(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailed(RTCErrorCode errorCode) { + try { + getView().onUnPublishStreamsFailed(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + }); + } + + /** + * 发布默认流 + */ + public void publishDefaultAVStream() { + if (mRtcRoom == null) { + return; + } + mRtcRoom.getLocalUser().publishStream(RCRTCEngine.getInstance().getDefaultAudioStream(), new IRCRTCResultCallback() { + @Override + public void onSuccess() { + try { + getView().onPublishSuccess(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailed(RTCErrorCode rtcErrorCode) { + try { + getView().onPublishFailed(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + }); + } + + + /** + * 配置rtc sdk + */ + public void config(Context context) { + +// RCRTCConfig.Builder configBuilder = RCRTCConfig.Builder.create(); +// // 是否硬解码 +// configBuilder.enableHardwareDecoder(true); +// // 是否硬编码 +// configBuilder.enableHardwareEncoder(true); +// +// // init 需结合 uninit 使用,否则有些配置无法重新初始化 +// RCRTCEngine.getInstance().unInit(); +// RCRTCEngine.getInstance().init(context, configBuilder.build()); + +// RCRTCVideoStreamConfig.Builder videoConfigBuilder = RCRTCVideoStreamConfig.Builder.create(); +// // 设置分辨率 +// videoConfigBuilder.setVideoResolution(RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_720_1280); +// // 设置帧率 +// videoConfigBuilder.setVideoFps(RCRTCParamsType.RCRTCVideoFps.Fps_30); +// /** +// * 设置最小码率,可根据分辨率RCRTCVideoResolution设置 +// * {@link RCRTCParamsType.RCRTCVideoResolution)} +// */ +// videoConfigBuilder.setMinRate(250); +// /** +// * 设置最大码率,可根据分辨率RCRTCVideoResolution设置 +// * {@link RCRTCParamsType.RCRTCVideoResolution)} +// */ +// videoConfigBuilder.setMaxRate(2200); +// RCRTCEngine.getInstance().getDefaultVideoStream().setVideoConfig(videoConfigBuilder.build()); + //打开扬声器。 + RCRTCEngine.getInstance().enableSpeaker(true); + // 启用耳返功能 +// RCRTCEngine.getInstance().getDefaultAudioStream().enableEarMonitoring(true); + RCRTCEngine.getInstance().getDefaultAudioStream().setMicrophoneDisable(false); + } + + public void joinRoom(String roomId) { + mRoomID = roomId; + RCRTCRoomConfig roomConfig = RCRTCRoomConfig.Builder.create() + // 根据实际场景,选择音视频直播:LIVE_AUDIO_VIDEO 或音频直播:LIVE_AUDIO + .setRoomType(RCRTCRoomType.MEETING) + .build(); + RCRTCEngine.getInstance().joinRoom("v" + roomId, roomConfig, new IRCRTCResultDataCallback() { + @Override + public void onSuccess(final RCRTCRoom rcrtcRoom) { + GameMicManager.this.mRtcRoom = rcrtcRoom; + // 注册房间回调 + rcrtcRoom.registerRoomListener(roomEventsListener); + try { + getView().onJoinRoomSuccess(rcrtcRoom); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailed(RTCErrorCode rtcErrorCode) { + try { + getView().onJoinRoomFailed(rtcErrorCode); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + }); + RongChatRoomClient.getInstance().joinChatRoom("v" + roomId, -1, new IRongCoreCallback.OperationCallback() { + @Override + public void onSuccess() { + Log.i("tx", "加入成功"); + + } + + @Override + public void onError(IRongCoreEnum.CoreErrorCode coreErrorCode) { + Log.i("tx", "加入" + "失败" + coreErrorCode); + if (WordUtil.isNewZh()) { + ToastUtil.show("網絡不佳無法連接,請重新進入"); + } else { + ToastUtil.show("The network is not connected, please re-enter"); + } + } + }); + } + + public void leaveRoom() { + RCRTCEngine.getInstance().leaveRoom(new IRCRTCResultCallback() { + @Override + public void onFailed(RTCErrorCode rtcErrorCode) { + } + + @Override + public void onSuccess() { + } + }); + RongChatRoomClient.getInstance().quitChatRoom("v" + mRoomID, new IRongCoreCallback.OperationCallback() { + @Override + public void onSuccess() { + Log.i("tx", "退出成功"); + } + + @Override + public void onError(IRongCoreEnum.CoreErrorCode coreErrorCode) { + Log.i("tx", "退出" + "" + coreErrorCode); + } + }); + } + + /** + * 处理游戏房Im消息 + */ + public void processingMessage(SudGameSocketImEvent socketImModel) { + + List msgDTOS = socketImModel.getMsg(); + if (msgDTOS.isEmpty()) return; + SudGameSocketImEvent.MsgDTO msgDTO = msgDTOS.get(0); + //正常文字消息 + if (TextUtils.equals(msgDTO.getMethod(), "SendMsg")) { + getView().insertItem(new SudGameChatImModel().setNickname(msgDTO.getUname()).setTextMessage(msgDTO.getCt())); + } + } + + /** + * 发送聊天信息 + * + * @param textMessage + */ + public void sendMessage(String textMessage) { + IMLoginModel loginModel = IMLoginManager.get(CommonAppContext.sInstance.getApplicationContext()).getUserInfo(); + SudGameSocketImEvent sudGameSocketImEvent = new SudGameSocketImEvent(); + sudGameSocketImEvent.setRetcode("000000"); + sudGameSocketImEvent.setRetmsg("ok"); + + SudGameSocketImEvent.MsgDTO msgDTO = new SudGameSocketImEvent.MsgDTO(); + msgDTO.setAction("0") + .setCt(textMessage) + .setEquipment("app") + .setUid(String.valueOf(loginModel.getId())) + .setMethod("SendMsg") + .setUname(loginModel.getUserNicename()) + .setRoomnum(mRoomID); + + List msgDTOS = new ArrayList<>(); + msgDTOS.add(msgDTO); + sudGameSocketImEvent.setMsg(msgDTOS); + Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; + TextMessage messageContent = TextMessage.obtain(new Gson().toJson(sudGameSocketImEvent)); + Message message = Message.obtain("v" + mRoomID, conversationType, messageContent); + RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { + @Override + public void onAttached(Message message) { + + } + + @Override + public void onSuccess(Message message) { + Log.i("tx", "发送成功"); + String contentJson = ((TextMessage) message.getContent()).getContent(); + Log.e("wewe", contentJson); + SudGameSocketImEvent sudGameSocketImEvent = new Gson().fromJson(contentJson, SudGameSocketImEvent.class); + processingMessage(sudGameSocketImEvent); + } + + @Override + public void onError(Message message, RongIMClient.ErrorCode errorCode) { + + } + }); + } + + /** + * activity相关回调 + */ + public interface MeetingCallback { + void onJoinRoomSuccess(RCRTCRoom rcrtcRoom); + + void onJoinRoomFailed(RTCErrorCode rtcErrorCode); + + void onPublishSuccess(); + + + void onPublishFailed(); + + void onUnPublishStreamsSuccess(); + + void onUnPublishStreamsFailed(); + + void onSubscribeSuccess(List inputStreamList); + + void onSubscribeFailed(); + + void onUserJoined(RCRTCRemoteUser rcrtcRemoteUser); + + void onUserLeft(RCRTCRemoteUser rcrtcRemoteUser); + + void insertItem(SudGameChatImModel sudGameChatImModel); + } +} diff --git a/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java b/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java index d0dd12dc1..4a98859bd 100644 --- a/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java +++ b/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java @@ -52,6 +52,10 @@ public class QuickStartGameViewModel extends BaseGameViewModel { */ public GameViewInfoModel.GameViewRectModel gameViewRectModel; + public GameViewInfoModel.GameViewRectModel getGameViewRectModel() { + return gameViewRectModel; + } + /** * 游戏的语言代码 */ diff --git a/common/src/main/java/com/yunbao/common/sud/audio/AudioEngineUpdateType.java b/common/src/main/java/com/yunbao/common/sud/audio/AudioEngineUpdateType.java new file mode 100644 index 000000000..11b5f8fda --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/AudioEngineUpdateType.java @@ -0,0 +1,6 @@ +package com.yunbao.common.sud.audio; + +public enum AudioEngineUpdateType { + ADD, + DELETE +} diff --git a/common/src/main/java/com/yunbao/common/sud/audio/AudioPCMData.java b/common/src/main/java/com/yunbao/common/sud/audio/AudioPCMData.java new file mode 100644 index 000000000..2873dceb4 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/AudioPCMData.java @@ -0,0 +1,8 @@ +package com.yunbao.common.sud.audio; + +import java.nio.ByteBuffer; + +public class AudioPCMData { + public ByteBuffer data; + public int dataLength; +} diff --git a/common/src/main/java/com/yunbao/common/sud/audio/AudioRoomState.java b/common/src/main/java/com/yunbao/common/sud/audio/AudioRoomState.java new file mode 100644 index 000000000..d6c0da466 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/AudioRoomState.java @@ -0,0 +1,34 @@ +package com.yunbao.common.sud.audio; + +/** + * 语聊房房间状态 + */ +public enum AudioRoomState { + DISCONNECTED(0), + CONNECTING(1), + CONNECTED(2); + + private int value; + + private AudioRoomState(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + + public static AudioRoomState getZegoRoomState(int value) { + try { + if (DISCONNECTED.value == value) { + return DISCONNECTED; + } else if (CONNECTING.value == value) { + return CONNECTING; + } else { + return CONNECTED.value == value ? CONNECTED : null; + } + } catch (Exception var2) { + throw new RuntimeException("The enumeration cannot be found"); + } + } +} diff --git a/common/src/main/java/com/yunbao/common/sud/audio/AudioStream.java b/common/src/main/java/com/yunbao/common/sud/audio/AudioStream.java new file mode 100644 index 000000000..af265e8ee --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/AudioStream.java @@ -0,0 +1,7 @@ +package com.yunbao.common.sud.audio; + +public class AudioStream { + public String userID; + public String streamID; + public String extraInfo; +} diff --git a/common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEngine.java b/common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEngine.java new file mode 100644 index 000000000..5653c8a57 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEngine.java @@ -0,0 +1,121 @@ +package com.yunbao.common.sud.audio; + +import android.view.View; + +import com.yunbao.common.sud.model.AudioJoinRoomModel; + +public interface ISudAudioEngine { + // region 1. 初始化、销毁SDK, 设置IAudioEventHandler回调 + + /** + * 设置事件处理器 + * + * @param listener 事件处理实例 + */ + void setEventListener(ISudAudioEventListener listener); + + + /** + * 销毁引擎SDK + */ + void destroy(); + // endregion + + // region 2. 登录房间、退出房间 + + /** + * 加入房间, 登录成功后, 默认不推流, 默认拉流 + * + * @param model roomId + */ + void joinRoom(AudioJoinRoomModel model); + + /** + * 离开房间 + */ + void leaveRoom(); + // endregion + + // region 3. 开启推流、停止推流 + + /** + * 开启推流 + */ + void startPublishStream(); + + /** + * 停止推流 + */ + void stopPublishStream(); + // endregion + + // region 4. 开启拉流、停止拉流 + + /** + * 开启拉流,进入房间,默认订阅拉流 + */ + void startSubscribingStream(); + + /** + * 停止拉流 + */ + void stopSubscribingStream(); + // endregion + + // region 5. 开始音频流监听、关闭音频流监听 + + /** + * 开始音频流监听 + */ + void startPCMCapture(); + + /** + * 关闭音频流监听 + */ + void stopPCMCapture(); + // endregion + + // region 6. 是否使用扬声器作为音频通道 + + /** + * 切换扬声器作为音频通道 + */ + void setAudioRouteToSpeaker(boolean enabled); + // endregion + + // region 7. 发送信令 + + /** + * 发送信令 + * + * @param command 信令内容 + * @param listener 回调 + */ + void sendCommand(String command, SendCommandListener listener); + + /** + * 发送指令回调接口 + */ + interface SendCommandListener { + void onResult(int value); + } + // endregion + + // region 8. 直播接口 + + /** + * 观众开始拉流 + * + * @param streamID + * @param view + * @param mediaViewMode 图像拉伸 + */ + void startPlayingStream(String streamID, MediaViewMode mediaViewMode, View view); + + /** + * 观众停止拉流 + * + * @param streamID + */ + void stopPlayingStream(String streamID); +} diff --git a/common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEventListener.java b/common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEventListener.java new file mode 100644 index 000000000..e68a17a47 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/ISudAudioEventListener.java @@ -0,0 +1,95 @@ +package com.yunbao.common.sud.audio; + +import com.alibaba.fastjson.JSONObject; + +import java.util.HashMap; +import java.util.List; + +public interface ISudAudioEventListener { + /** + * 捕获本地音量变化, 可用于展示自己说话音浪大小 + * + * @param soundLevel 本地音量级别,取值范围[0, 100] + */ + void onCapturedSoundLevelUpdate(float soundLevel); + + /** + * 捕获远程音流音量变化, 可用于展示远端说话音浪大小 + * + * @param soundLevels [userId: 音量],音量取值范围[0, 100] + */ + void onRemoteSoundLevelUpdate(HashMap soundLevels); + + /** + * 房间流更新 增、减。可用于知道当前推流人数 + * + * @param roomId 房间id + * @param type 流更新类型 增,减 + * @param streamList 变动流列表 + * @param extendedData 扩展信息 + */ + void onRoomStreamUpdate(String roomId, AudioEngineUpdateType type, List streamList, JSONObject extendedData); + + /** + * 接收自定义指令信息回调 + * + * @param fromUserID 用户 + * @param command 指令内容 + */ + void onRecvCommand(String fromUserID, String command); + + /** + * 接收跨房指令信息回调 + * + * @param fromRoomID 消息的房间 ID + * @param fromUserID 消息的用户 ID + * @param command 指令内容 + */ + void onRecvXRoomCommand(String fromRoomID, String fromUserID, String command); + + /** + * 房间内当前在线用户数量回调 + * + * @param count 人数 + */ + void onRoomOnlineUserCountUpdate(int count); + + /** + * 房间状态变化 + * + * @param state 状态 + * @param errorCode 错误码 + * @param extendedData 扩展信息 + */ + void onRoomStateUpdate(AudioRoomState state, int errorCode, JSONObject extendedData); + + /** + * 监听音频PCM流回调 + * + * @param audioPCMData 音频流数据 + */ + void onCapturedPCMData(AudioPCMData audioPCMData); + + /** + * 观众拉流成功通知 + * + * @param streamID + */ + void onPlayingStreamingAdd(String streamID); + + /** + * 观众拉流结束通知 + * + * @param streamID + */ + void onPlayingStreamingDelete(String streamID); + + /** + * 拉流分辨率变更通知。 + * + * @param streamID 流id + * @param width 宽 + * @param height 高 + */ + void onPlayerVideoSizeChanged(String streamID, int width, int height); +} diff --git a/common/src/main/java/com/yunbao/common/sud/audio/MediaViewMode.java b/common/src/main/java/com/yunbao/common/sud/audio/MediaViewMode.java new file mode 100644 index 000000000..f28264417 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/audio/MediaViewMode.java @@ -0,0 +1,7 @@ +package com.yunbao.common.sud.audio; + +public enum MediaViewMode { + ASPECT_FIT, // 等比缩放,可能有黑边 + ASPECT_FILL, // 等比缩放填充整个 View,可能有部分被裁减 + SCALE_TO_FILL; // 填充整个 View,图像可能被拉伸 +} diff --git a/common/src/main/java/com/yunbao/common/sud/model/AudioJoinRoomModel.java b/common/src/main/java/com/yunbao/common/sud/model/AudioJoinRoomModel.java new file mode 100644 index 000000000..4407efe35 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/sud/model/AudioJoinRoomModel.java @@ -0,0 +1,16 @@ +package com.yunbao.common.sud.model; + +public class AudioJoinRoomModel { + + public String userID; + + public String userName; + + public String roomID; + + public String token; + + public long timestamp; + + public String appId; +} diff --git a/common/src/main/java/com/yunbao/common/utils/LoadDian9TuUtilSud.java b/common/src/main/java/com/yunbao/common/utils/LoadDian9TuUtilSud.java new file mode 100644 index 000000000..cad240b93 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/utils/LoadDian9TuUtilSud.java @@ -0,0 +1,108 @@ +package com.yunbao.common.utils; + +import android.app.Activity; +import android.content.Context; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.NinePatch; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.NinePatchDrawable; +import android.os.Build; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.yunbao.common.manager.IMLoginManager; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class LoadDian9TuUtilSud { + private static final List BITMAP_CACHE = new ArrayList<>();//.9图Bitmap缓存 + + public void loadDian9TuAssets(Context context, View imageView, int position) { + if (TextUtils.isEmpty(IMLoginManager.get(context).getKeyDefaultBubbleUrl())) { + Bitmap bitmap = getImageFromAssetsFile(context, "chat_message_bg.png"); + BITMAP_CACHE.add(bitmap); + setNinePathImage(context, imageView, bitmap, position); + } else { + String url = IMLoginManager.get(context).getKeyDefaultBubbleUrl(); + LoadDian9Tu(context, imageView, url, 1); + } + + } + + public void setNinePathImage(Context context, View imageView, Bitmap bitmap, int position) { + if (bitmap == null) + return; + byte[] chunk = bitmap.getNinePatchChunk(); + if (NinePatch.isNinePatchChunk(chunk)) { + NinePatchDrawable patchy = new NinePatchDrawable(context.getResources(), bitmap, chunk, NinePatchChunk.deserialize(chunk, position).mPaddings, null); + imageView.setBackground(patchy); + } + } + + public void LoadDian9Tu(Context context, View imageView, String imgUrl, int position) { + if (context == null) { + return; + } + if (context instanceof Activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (((Activity) context).isDestroyed()) { + return; + } + } + } + Glide.with(context) + .asFile() + .load(imgUrl) + .into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull File resource, @Nullable Transition transition) { + try { + FileInputStream is = new FileInputStream(resource); + Bitmap bitmap = BitmapFactory.decodeStream(is); + BITMAP_CACHE.add(bitmap); + setNinePathImage(context, imageView, bitmap, position); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + } + + /** + * 从Assets中读取图片 + * + * @param fileName + * @return + */ + private Bitmap getImageFromAssetsFile(Context context, String fileName) { + Bitmap image = null; + AssetManager am = context.getResources().getAssets(); + try { + InputStream is = am.open(fileName); + image = BitmapFactory.decodeStream(is); + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return image; + } +} diff --git a/live/src/main/java/com/yunbao/live/utils/NinePatchChunk.java b/common/src/main/java/com/yunbao/common/utils/NinePatchChunk.java similarity index 98% rename from live/src/main/java/com/yunbao/live/utils/NinePatchChunk.java rename to common/src/main/java/com/yunbao/common/utils/NinePatchChunk.java index 1a275d321..6ebd8c7e4 100644 --- a/live/src/main/java/com/yunbao/live/utils/NinePatchChunk.java +++ b/common/src/main/java/com/yunbao/common/utils/NinePatchChunk.java @@ -1,4 +1,4 @@ -package com.yunbao.live.utils; +package com.yunbao.common.utils; import android.graphics.Rect; diff --git a/common/src/main/java/com/yunbao/common/views/SudGameChatViewHolder.java b/common/src/main/java/com/yunbao/common/views/SudGameChatViewHolder.java new file mode 100644 index 000000000..a76cbc058 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/SudGameChatViewHolder.java @@ -0,0 +1,49 @@ +package com.yunbao.common.views; + +import android.graphics.Color; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.SudGameChatImModel; +import com.yunbao.common.utils.LoadDian9TuUtilSud; + +public class SudGameChatViewHolder extends RecyclerView.ViewHolder { + private LinearLayout mBg; + private TextView chatMessage; + + public SudGameChatViewHolder(@NonNull View itemView) { + super(itemView); + mBg = (LinearLayout) itemView.findViewById(R.id.bg); + chatMessage = itemView.findViewById(R.id.chat_message); + + } + + /** + * 幸运100%活动 + */ + public void sudGameChat(SudGameChatImModel msgModel) { + new LoadDian9TuUtilSud().loadDian9TuAssets(itemView.getContext(), mBg, 1); + StringBuffer buffer = new StringBuffer(); + String userName = msgModel.getNickname() + ":"; + buffer.append(userName) + .append(" ") + .append(msgModel.getTextMessage()); + + String msg = buffer.toString(); + + int unameIndexOf = msg.indexOf(userName); + int unameSize = userName.length(); + SpannableStringBuilder builder = new SpannableStringBuilder(); + builder.append(msg); + builder.setSpan(new ForegroundColorSpan(Color.parseColor("#FFBD0D")), unameIndexOf, unameIndexOf + unameSize, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + chatMessage.setText(builder); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/SudGameUserListViewHolder.java b/common/src/main/java/com/yunbao/common/views/SudGameUserListViewHolder.java new file mode 100644 index 000000000..4a8511d0e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/SudGameUserListViewHolder.java @@ -0,0 +1,12 @@ +package com.yunbao.common.views; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class SudGameUserListViewHolder extends RecyclerView.ViewHolder { + public SudGameUserListViewHolder(@NonNull View itemView) { + super(itemView); + } +} diff --git a/live/src/main/java/com/yunbao/live/custom/TopGradual.java b/common/src/main/java/com/yunbao/common/views/TopGradual.java similarity index 97% rename from live/src/main/java/com/yunbao/live/custom/TopGradual.java rename to common/src/main/java/com/yunbao/common/views/TopGradual.java index 7cc8d818f..8e1d3d422 100644 --- a/live/src/main/java/com/yunbao/live/custom/TopGradual.java +++ b/common/src/main/java/com/yunbao/common/views/TopGradual.java @@ -1,4 +1,4 @@ -package com.yunbao.live.custom; +package com.yunbao.common.views; import android.graphics.Canvas; import android.graphics.Color; diff --git a/common/src/main/res/drawable/background_sud_game_input.xml b/common/src/main/res/drawable/background_sud_game_input.xml new file mode 100644 index 000000000..bdbe71942 --- /dev/null +++ b/common/src/main/res/drawable/background_sud_game_input.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/background_sud_game_input_edit_text.xml b/common/src/main/res/drawable/background_sud_game_input_edit_text.xml new file mode 100644 index 000000000..de7f97453 --- /dev/null +++ b/common/src/main/res/drawable/background_sud_game_input_edit_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_live_sud_game_back_new.png b/common/src/main/res/drawable/bg_live_sud_game_back_new.png new file mode 100644 index 0000000000000000000000000000000000000000..217fffa4910c4cfb4fca62c278f7df931228f665 GIT binary patch literal 2678 zcmV-+3W@cJP)Px87c6Nb^8nCq~qNt^9tO2qTW@q0FR7x!>Ry0;Z z3Dtx)snJ#q2~cgR0pmxEt;IApZIQIGhBmd7)!3c6^JX?kBRAp-+u-j#K zX5Kx{nSHY^%goN3nfLZ%=DmNGW$)+jopId5qToZ&tYzMri!w;|J>W77_U}ZMyd3Uf$r$&_>`t;TM;oh4Tp$Id9lVaXqx8kWHR|erJ0MRuNn06 z<;z#6nl@Ywz5 zbUMAgr>Ezi)poFI(7LWK0D#BXJVwMRRoANRyxn|6#OmNVrPOA_F#cgT-`I3jfsRBX z*8srJdF`Q^N@s8$wgI+CDUVdzhl)Y#x_&JHJlF`5JRYVc*=Lke-!Kg0FO|Tq2=vO8 zE9WVt_7hRC-iM1)5E(Wi4ra62^~q%N-*#c!2EA|>?+UlO#g>%6$~LjYJ_2WuB@zklX3I8wR!wiDP^iyXNrQhr1=05&Gobldoo~YA!mk$hSnZBbm+qPTtz{L!{J?;rrkJ$ z7VYiPa6gq#DfL1kk=RxibR-h_2mm|+0EO)*_nTK=H4F$LHg|V-pB&q*@e+-ZNaQX6 zxXqgYtAG1M^q7?L;js)a0^Q!;K06o;K9yUUo9}_H8Z__DyqU>lzTDH((_bj%BG7D{ zXqxtY-W9I88ZRT8=dIan_FJh`>OfJ@xf4VOgb<~ii27u;9hvRVnhm}%W6NyAJ4_ept+Y#|j zPo;AhGXSf44@)T@#l?#kH_e+j?*Tr><*jQt3)))$c=7b<)7x>?s#SAL)7;BvmOY7f z7PO^ooYFLHBU(G#2R+D+LmpM3g%CGkI2^uC)3m2OYtS{&Y$bjXJ3BkqS{lbCYpAYO z-B<;;u;#(5b$27;CL&5VR{tlbw}{w8M2|D*p8`M_0H(!#yvgbQq}IZxQ4Q2}{g;Ty z=jmq36^KctA`JD@FH`Yi_CDI#0JyqIJ`@yRWZrn|Iv6 zJhX@eSTL7?* zZ)%Mma*Rf!+llBFZ>Pl}$^cr_3 zzh4BJf6;aQc_G9V-a+)5VY83a6Y+Tb^M#Twx>^wmg>Lrwd_V9man=T!uT~Jz-HAk^ zt0?FdD^|>EYHHf&ox`gMblylwr_&osUKX;3k1dG!m71z*@XUO*TT013r$(PkZq7!d z(W{8)2>@toa9-7Re*h70i^XEEPYBwQ>TT>W&^x_UF>4MAKoZA7$5O8JM0WUZ{1FiQ)$2N5@V+g+ESWOr1wR0Z17MA+{VFR9kOZ#*6@i0G`( z=i@Q?bfu6vebt~jvvs}segODH9jksEH0|)<;NXtKhYwc;xn|H@z>+0P{B3P*Ul&5$ zUWY~vFBLy}{`~o$*iqqXHdyR@DxIC3H{>*td+RCSO>W4zKaoiM-cJ9^rKxG?7+<&- z!l^WFM?rHnmYaGG49R0R8#goM>N8(~IBS~bj<&Y8=^d18?E7Soy+pJ_2obXUobpSZ z&SCa?g2CW@cKr318zzeV-EoN?Ur96?{h(564FKFEgjm4d!>0jo?l%Wddrc{I5D~ki zl*g+9Xg81Rpsj{rdwct=U@&+C0DKJq-h+t4Q(#&0b`!gG;Pr_gx3sjxy1Kg9f2iwU z+GK&g=*34OktJ5_+3Sgj?|5)1sDe4~RHqAlV`GEETJx9GOGHmfDPOTGiB6@P63~Ul zTPuPeC!%W+aS;(MM#L+|gsEoN7Wo%YCR{Zq;lN>hu#my>zd1DZt3-4H5szdtnU^Ok zknfa?(RL+*C(q{Q=HT$~Fpr%d;`rdX=yF#v_}phcyG#J~^Xy8PV}TP9#{)k$JUl$u k+}u3qRt#CY{VJsUACl%e&RKi_i2wiq07*qoM6N<$g0p)!m;e9( literal 0 HcmV?d00001 diff --git a/common/src/main/res/drawable/bg_live_sud_game_bottom_input.xml b/common/src/main/res/drawable/bg_live_sud_game_bottom_input.xml new file mode 100644 index 000000000..4f5623992 --- /dev/null +++ b/common/src/main/res/drawable/bg_live_sud_game_bottom_input.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_live_sud_game_bottom_input_right.xml b/common/src/main/res/drawable/bg_live_sud_game_bottom_input_right.xml new file mode 100644 index 000000000..75e3be568 --- /dev/null +++ b/common/src/main/res/drawable/bg_live_sud_game_bottom_input_right.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_live_sud_game_top_new.xml b/common/src/main/res/drawable/bg_live_sud_game_top_new.xml new file mode 100644 index 000000000..6f5dd06ca --- /dev/null +++ b/common/src/main/res/drawable/bg_live_sud_game_top_new.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_sud_game.xml b/common/src/main/res/layout/activity_sud_game.xml index 6f6ae2637..ddf4fbc31 100644 --- a/common/src/main/res/layout/activity_sud_game.xml +++ b/common/src/main/res/layout/activity_sud_game.xml @@ -1,57 +1,10 @@ - - - - - - - - - - - - - - @@ -61,73 +14,142 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_sud_game_input.xml b/common/src/main/res/layout/dialog_sud_game_input.xml new file mode 100644 index 000000000..32515abd5 --- /dev/null +++ b/common/src/main/res/layout/dialog_sud_game_input.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_sud_game_chat_item_holder.xml b/common/src/main/res/layout/view_sud_game_chat_item_holder.xml new file mode 100644 index 000000000..d697f53ab --- /dev/null +++ b/common/src/main/res/layout/view_sud_game_chat_item_holder.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_sud_game_user_list_holder.xml b/common/src/main/res/layout/view_sud_game_user_list_holder.xml new file mode 100644 index 000000000..197037ea2 --- /dev/null +++ b/common/src/main/res/layout/view_sud_game_user_list_holder.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/mipmap-xxhdpi/icon_game_close_wheat.png b/common/src/main/res/mipmap-xxhdpi/icon_game_close_wheat.png new file mode 100644 index 0000000000000000000000000000000000000000..363e0e3801e6627a31803d55f5fef1b3c7864206 GIT binary patch literal 6267 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�qDCJI{ zK3)Ifi!YwWB=Q-7tQA9U#`F9-0JFv_=J#2^8)y`Bb94JW_Sj>0=vL5|qeqWkfByOB zD+Oyw!9W7?Fe%uYJHS8^ou8jS7}i0p0ob{7=g*rqZMq~z59B3yfsC=ws7j^6#d1uu zL7!+Hhr119CKeVJ#zjO#+_uoPts^ET<``^{k#F$e!9iEAUNzsiaRY&TT7;0EYC_Ql z%FmuXJ7UF(6;5Sk&~oZHRy4#*L=Yqets~t%iooj4`GID?30bjq>H? zvZkiSeC*gUW%usg?XH;A)YP()l9GB5CnhE)c=ztz!ww!iSe=oPalv{z@`|lNWssSf z*;mkn3IJiFhoWrPu3gulEgdy#RA^34&LDfhT)1$-_~@gL{@`mvL8~yc0xRYaAq2eN zXHKoxuV1$uKYm;p9v*IY#k~3Eo2UQwx4*SmtMuyCE8xI^198}RVKteao_;|vY4wz? zwbq0R1|HbhGcq#H9z1xk#T#MrxtbgK(CrZJ;!BSSOS{3!wQ%~KtmzI*P*&29MRaKcLPMmlW69TH`wQJW# zPnj~suD8PW?c0BP@4fdfgDv`O23sp`0mdJ!40jed8g1RW6`>T{B+OjgXMX@gR8eq0tB#0I{7`}Toj#*DGM&**fz zx>sL)^+%)8$b(p8#*FE-ZQHgsD@;nZCiD%KGzA3(F++w7v8yO7E-t>YY}qom%%(hL zch=+b4_GmOrj#P&h)-t&j=c{*{BS4S6YO;wv-Y*uUi;_Y|Ni$ntQtrQ($mxLPf1DX zE##M)tqB*<`1tscyu7?vd*--URk^vj7e4vqldFERJ;MdF2*A8cDSg~stA0;rM3*jI zWIK2691KA z4j4IdWY^Y&k&>;oHpdk@ckI})+S#*bpX%DRtFJ{dElpa5m|56k##$pMIdpuL3M~+N zz<>ckJ9q9J>d46m_myqiwq5+-gAabe5f)`|a9FZrNw3t@)X31#&=%(;so7fVODNjF z1$6S{$tP-RYAk+YV`w&%=lS13AJa!Jmw)B26@x>-n{U2($KGKNc=*li*su#?T@>QKm)9phK7bIf@=A{DW!fhU4rcF$dMy) z{rdGoARLDYN9etK_g;l4Mqpz&v7x|%1q*sinlvfAPoF+PSbcl;?76&Y)27?*8Q!Q2 zAhUb+*=Kv~+qds34k1!;3^DaE#%=`!1pEh$jg1Wp4h}|SKEy)ynY_%lQy|*Ffdhj+ z`skyWu&^+vyj!c))@EmC|MdO$-`@%e36Tjb1%8wQNYT;Jfe^=^J$ts%mgRUOTSNW0 zc=~C>zrA1xA*Cjh>E(7aUjjHYX3Pj*zI=H27Z{f#MSXfw-laurF<;$0wAY`;9 zn5}ZH^{n(pWgupTOPuFl=1Zu!y$t@a-{j`z_W#Xqeq&cYWpB_01qGK6A3l8J{Q2_@ zU^5Ut;)B(JmoI{YgQ=jp#>G)8O{l~GII8XrgTHn&kwx!t;##w2O`n-FXSx;n!eB61 z%FD|Q_=^>VeG5lkh;e%K=n;73%9Vyyt5#j~R%PHPK!j%QG?8r&qjK8;gO$ynKfn8; zMT?@PB!pC_H7Wb#tgbdjoda8%J9jSjoc>bkJfysY`Vt_!ZWw6L>f8Uh zukFj64GwH)=+L2xS6+D~a{T!5Ee^5XB&jc<-t8Q};lmYaX=%}pB)($mvdzdj;y-v17+iTeoh#t%daF5-Mg4Zsbuki=tNR_4>~o z0n?o^hEOHKqdRWY?VGH)L_+kgR;xpkl9D>b#l?m8?%g{$Dk@6h%pViM<1Ssg)PT>) zlP3+wj~_Q^G@4tjy^}q?gi1Wx`uh6%r)}S*xr3F>m@z|k=FFM5pxyPQIg=-Y!t92C zQ=w4cuEO={(a(s*te|q(GG*DxAP?w8q2@vbh`Dn@1eC( zFi07)#1jC-lmQ`OHTmhMpTdaHE--@z4f@`l$V%<0dttFa1WyCWNdXF2PV18n2?gx^?AUp}ZCMm#RKz^}rA@Gc)t-7himF-I3d&m@tx1L9brD z`V8!^MXI1Z4_1l+!GVV{w%htLpU;(OxUWo^GNo%~W+ooN_Djmo&#!{!(^2##v25+g zks~!LR;)M&uw8ToX-ESp#HCMI(pxfF%faXxMwCY!KQ`xQBb{wugx9 z6DCaP78w~Cc=6&z)BgSYtBZ?^4KDOZbw;D{SxKKM5r`t@VIL_8h`OX+EvVB|3AHdb ztZ3L400>MV*c>>k6YmcZLgx77VIQGWDwS$Nb1>5lQUh==*N6AqG#ZW5*DqR+U(_Dc zx=>f)~lXuFInlbg)7#R)>^s)M~Z+z3G}H z#8fJkNtDtL2q6d*BEp{KVrm)Aw17x>B0^C*9Hzixx#VWYsZft z?>NuK3*f}Y#`X#f4E#OEaZmX}eBQT}Q&nX=2u$}UUQCrMbDZD$^Nh~)!LZd2`DxT;0$#{LES!{ub zOki<7jm+T&L191$mh}tI^IvfscUY^{o^YeQBw5=97;DdIVq#(!j^iF=j3rY_M_AR@ z?FCQ^AUw~1M+n(V2sx(L>ucNV(9)j3+%dCaVqzi{3dKCe*hK4#g18@mSYUNhvpa!J zVG`8CyMa<#Xfzu0%gf6zNiyZVtfa#LV>=F|Qi-R0V<@FV8Dsd~pX0a)Yd}@RXhwut zh@}L;Y{3(V4uu#pwcI!Gv3hM?BZQnKgp>;(olaNgB^@O%-XVdp86_7R8ylifD1w`s znu0lw16Tt&jvL4r!`_5P*A$deh}b(>%i(!nykmx=ELOrVgpkVSBYUMxCM!3a%_gJK lXu?}(w$}BMQ`XB0{|^yn0x2}gqLBaq002ovPDHLkV1klcHr4Py1*GWV{RCr$Poe7u~)tQFhQ@8g96fi;y5sb(pLW_cN%Oq+P6%!Q0H+0_$f1Rp(tE;PSovM4g zVV3(m{m|S#b(a78zwi8KEyYg!vHwm5TdARiYAUH=E5pgKA2vf#^ag5C)MC>Ki(Rk* z#pl3gY&K&#|E|Jf5jKl~g=A=;nk_WYpa!#bXKlXP*(zqg!d_Sm!D1ka{mDAN_ooXL zGy_?n1so8(kN&ou`#l55PZ_X*tysJXEXL+_T39B(t9n-KOt#o*fUy^F1X+HG z#Q>lhMYUsKF}h|#{uBJ&`@4J}_Padke@624(!v(xN3o0+eyWD>mz@Ei9R`g33}sZ) z9gA-QS5Qk|$3&j@7Xw5gfPx@-tE8y zTChxEk;vReZbxyI8qC`E2B=+uv0tZ_^-LhcMO4tk2~NEdOVx*@WmNDv6Im3AYhoRW zDKvAFs%LY10n~25*e@`O7H-C(4{E!gCGqUE#x^l-u&*+G#;cQ-HyewUWVlcb;E(MA zPRW6>pP|a>*vpvGDxOJdfHdiofS)#)@MKP&mvK?EqXxIDeP}8rKqUpnewINfCQ;3? zG#ZRQ;+Wz8dwWM~QGHpQgVZ`9_LEplQ2X+BslX{2F!r+y!{*OebPpX6c7!*_8L?0x z5f@}cIgzwW&oq1t9HR#FYAL`e2{86Nj-isdt)@zXITvHJG|wh+ggE9#mG1{r(o{Io zc8uDWKNky5(ZJaA_#qZI1tvYhr%=)uIM~8q9;FC}gL%Z2S(sfin|Getk2{M2rzl|T zrk`J6Vq{Iqm7gqEsiFKlEjX!xvFGt?s`z)OlTRWAX&arS zj36jU93gEv!FK7O;5s#w%hQ093K)AX7m;z~t1u{GxqIIw_2{GqD~4(Q+3c|T7OG3z zc3rH71Z-u1RAON4d7Mm^hn&1i(ZP3wHz#$1(zok)HIyd}@CX&3*yrrI97;7WIPz7B zPWS(UtcjguDrXyqtNnN(*2r!GW5(D|G62O(D7v;`OHvO@nm&x39R+Hbtoh3}k!zji zQ_49+4dN{maEySl|41bkk8THMq?4&%e!}!Nt&KF`D_DkJjh#ykCz?#( zm;v(ymr~2bR?{q{kg{T#Q%v6xRsZ&Emqcm}T&C)|A&xb%z}QbRnlk1%tBj_Gh@*cJ z&olAjQs!5vjY--S<#aMTu$3`te>Z@NK&T)v_S1ByiPxO1LP=z%6ii4`UL1HP#xBI5 zV&%H6^uJGMhN!(+AH|%)!2E%0P+Zw6hU*A}buPVuo$Z9SrrCOBxCHyd6;re3hi5xu;zc8tc69SNgT?1 zUizACJfenivN16BV~n7N`7{){(atXsNj=hEThpK;Z5c_WtW@pl?98Vfq=xa|L2yDD zV?WCCSRCeTM=hmMil@J>ze$~n0V(OTY1^gu4?M39%h;IC0xU|&rc_1uQV_Y!ybNg84Tc(EaB+A@MNTJX@(eYyGp9Y*H%q*sp{=(_7&vb34x5vT9518+( zPHMYqXRq{yY6MfGfLTF?zIj3g04nPQRwnwWLzu_J88XfbqZ*lGUJJBrO6N#XWlNoR zKLZB1z`QjMKAM@=m{QA{>`!Z9nHs^MHdV5J&tPg;;_NLB%8gV+4h;>z6S^J%w$wai zp-jH>vmj6Y_}^k@?Lx9p3O4=?7XLsWObTPL9HL0-!IHkm$uMY^E_B&xuxZI2Y$Mp!x$Hn@>+9BW`5-RL9hHBM4{76)T7cl-9%E^Qi@Gl+s_ zSHgluiZ4(DP~8oV{X`e>I|bzt^5f+f{5PyzNt1D1H3)KbALw}oSTg_Ne&QTKTLfx{ z!fq$&hdy}(HZKa-?yvyEt7mpAd^{7H-Zhoe4cLrS2lKM7#%#_9rlPP)vX&pF_3~X! zANcx8-Pnhf_Hy|?sxwXE0AWFfYvb55!piA!8VtNw*KOHZux^&Aaoak9iG%5<*6SJ1cFMZ4)s5@Kdy5=5eSlYUeDVUE9Ywv*U zCbQ%1eyOwBKobL$eLsDuWTmt2lElbqe0f7t4tp^d6zSi58=O`}NJ z{rs3puFuVnnRswoSraMqfU&c%<$YNG8(2CqA3B#JLJP{8WkJPm;j$7M?q*^4F)(0? z&grd-;KMl}`2o&M{@p%Jc&#^Ja}qkj{Sw<(%2dAxyk5O&Vd$v96T0G(yH5 z_-$AMi!X*xUx4Pu{4~aniq@pux-(#~J6HC`I9MBq%A#aHiGqYVh2GwDm$L8UDatt7 zISrP^*g@|sG%gWfj&p%|@f$GkXVA?H25ngL82n=*tbI=RKVgk8R@O|~C}jkJSu;~R zOq}7P0E_$HYnMK7`?LVFfD8w=8pFgDo+d_@fsgY0f2Hp28 zJX24W`fpM)S|(7?Vu#;JV+yLI>va+govrJ%_*7W^NWLzn`S_hc`cca@Tp{}jFj-zw z_6(L|u~+DdWts{U@GL^shGI;k6u-$uhf@}=) zLP`4N-$C6eKFaL`zkc+4SoAGDL@4C=0$>Y^lzlI2u;>|k^;8@cgMfq;E{yR5L9=jzXy7s)poKq6dwiICQ#*|-0)BW zlc;e@DvT{ydoL_GJAAU$PXJMf7FG)|a#vS=`qjk1CXrhhkOIsomoX2xjPX}Wz$~lM z%o%<+WZeBAVz^ba;q?olWn=5HPmtB}|B9~q*`RU5{x5mgjfKJP;^E54u>4o~iO(p2 zO!_Lnow5zE?X#%~|L6YK9Am3>bPFn$j)txOcVM9NNZftgugcG+XlkxxL6k$F#U zcn@A41sneXGNtbCjFT`r=nO|Jh1!A8_yIh(FEqPbii>S;l=0*Ga9e}~W~~4d-T9YV);jrsxj#h8g0dv#%Z8qc&M^2I=y!=r^bg?K!=Pbh z`g5Q%kRNyj4E&|ebM3?M^5}4>Ny0`a`f?vg9C|YdU&c@-tXDBRaw{sY}1hVbHJIGOpNf-nty#xvp?0Ux;aXW5z;d z-_1NS9NB7TOreIQ@d7VD0p^=7F!%X@F&!5Pdun!vh7ZFxUxd{=sPppw1MY-9zpwuy z>+-U~DH}VId>rGt5uHRCvTW|i;U%zQa=v~^XD{>s^Uun@gV|ItHg|=Uso|68t7mwT zvLG;N*%!x(V7>zCF8yKuyP*5wc?dSY11}#9vJ7nMAYR_ho1pG=*zZ=I-{xiT!eEea zJ8io(F!u>CKc$Lmb5}!~0F$;*Va$mxV`dmgSbs1@%u2uy)ve86+AZ(TI7g?Z9csfbZ{BCY~?a#-_8lt z@ObX*e$W%c818)+SMeZ#0?bJ+F!ve&lP0S1mnmyZbzgyg7sDQ-^A=w<6XtK*Zg zzD|EH;4C-=Hm%GrLxee?kfE|G^f?duU#mlT0p;bdLc{XtRZdej%Ft~K$0_?Z_NIz| zxj;mWC8|%v&`YC%VJt^l+EV`tcmPuk*Va&-c zW9~6vOjH9+`nSqDIBvO?G0}WkT6kszG;eLq2${ke^kW!wZN39vISrOv3@tKM<5r@q z25R?#L;nlPyXibXc?RYm2e!NXo5rbwZIq?uW?5Rk4H4a^$uPXtefe>P1SKvmz2j{@ zV5YlE%RWgjdfA~>BNgm@0etB^c>6|JHA_ceZR+XHM)y1lhTaHWhUi>2EQWU`!#j7w z?jvBpRnTLU{#$knte6UK{{pscXg%wklr3!)M}{w7SN7Fd?BQ--3NDwL7(1AzkT(l3 zqg}>$!1$-~ldvzU9KT^y1&F6ROTz|N3rpC1&;wBC_D6OzY+4FcU(7EvZ+ZjfkJkN( zpDD%mhf+U1vpkKFjCagxPvd-)a|A$d_)A+zoMA=E#<;-TU4)eRjc+1rrrV8ksU-moUZy z=C1aZGPm_njP{HpKuABcYhT#yaHu;8c0WS*BhJT%s?0=hdK2Ei4>r6GAI*d2toHP< zX_%ydDK>0hBpa!Y_qNE&rt%8jMbRVl0-rc0L{%W@&7DJlG4Iu!=}0xI2AR(V+ZE19eN_%HCmgRu5l4UPv=ns!;N zBTFB3yt}E~m9tqW_ZWt0%v}huu)m3vean@yJ4+;GQL^Tpxc1so(Fw}rI7T`2I1>6@ z2;B~9z0o1NO;7!QI1iRy37b~uH>^wGweKac=XZ5qoLg9yj*W{mX1M%6AOI0p?Z?qKa1{2bxJ~8J1q8%md~QpOh6E#HL}ZJX3cxly`yZ zo=~+r?DkdY+#jmzyqe|z-LeYSJ_R2>4evdmXSDtD8 z2ryyiV@knHseAtmV8m2CB9}dE!io)V!iRs+tY}=XL5SM?ZQ^`>C-L6PBwf^g*F$YT zsOhVZo~(Zj{(7Wtum9tfAr88g@#+L_2?ypz>Zo*HtR|OfgtNonshL#XpQgMP`ntPU z-o7_}L8%y!q!aIZh6ZHQa`?=h1M|Qr6s;v~S5S(*;6mzO+a1cfK*NggMLpdIZX&}z zYE=HcG_A69E@0S=+p!qu*d#96iIbI3_}zT{FK`Qvozjk@!i+6-@GDtVV3T%;U}7WB zPGRj5#%7sLXU2~d#-78CMYEqrViu3X`V5aflID?fU@=Ob6Ya7YSfsR)v z7Pzv+OK;!I^C%9BozyHw){+`K4)CP;nT(6t+lh1?o>wOtT=L^6*kne~iTSys8HMOy zEI3I#yBKhiloOO3Q_z!?A#IVNP!k8KZyH{U<$yEAy-3b`OKW@d1MTgRUj9i8R*L@3 zq+JrBHS>r%Il)D8E->;g<3+g(u;U6VmN`k;kY>um)bssyX|HxEKHGj3|4=n1;nj;S zIM-~C8Ll)sj@J?NFNHUo$a0~;z!cmu}cM{mrtqMB7MtNPEccc!k=~U z_cr60u*CL_{FrLrIn5+qm!v^S@+}2Rlge6>wuJRl`d+dhsj*Bd1WK@&$h6KSKrK9q z#mLy%fKnJNtpSpNlc=WONzQtBWXXCMmpmRS1M40medj0b?Q4E_`1a$I1~8~ z6hHZYSqlk<6qD4q`H?wCTBl6S7$0*cptuovBZ{eanx->ll!*)_k+tM~h^~RIuT7Q- z>MVYf7L?R|Oq)JuG9$_Gr^pinQTqqd7{22S>^FA)_o(tEg^cQ(7^%+YsbWAW88D8U zOmtow{|7Sck$a1VNuOZi?O|y;ighNApn38EiWAgXJJD<7bFy|Fds4wfDmW!~LM_hl z!M~?rQCu0pJWY&kx~!nDv6_S8Qgs#~=iAe9r|3SWjjUZw1)caF8E%bz|4gxK9Z3va zT)z=6YkK$Ozf#NHYHS- z>nZO!SMmO!@GNm!blMFVr}k6nL<2t*np4hhxy?CIMkypoX$)y1aY+wB<@xtVyo-#YEVD1C|0M&LCv{7`)#_w5Po4NHk{{;qu^I2h28^opSP{#NxPG48NU6sj|a#_igK2V8Y&$#dOPWb6=5H*MV|5HU+)l-{JVuF6mQ54N0hM;n}uq8 z+nta*8kwCEm|U>%AQ@IWM?$LEMh#^g2n@kysPo2js71Ly;9e`vdK8lqaBSyoAUn&H!@`9uBu%h00000NkvXXu0mjf5XIL% literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxhdpi/icon_game_open_wheat.png b/common/src/main/res/mipmap-xxhdpi/icon_game_open_wheat.png new file mode 100644 index 0000000000000000000000000000000000000000..19a8c1b9738ca15b9f66fd88bee29246ba6eabc4 GIT binary patch literal 5400 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 JPDHLkV1nu8dGP=M literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxhdpi/icon_send_game.png b/common/src/main/res/mipmap-xxhdpi/icon_send_game.png new file mode 100644 index 0000000000000000000000000000000000000000..13b06a19049b446a576d3a1a77fad158b73df72a GIT binary patch literal 13814 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 literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxhdpi/icon_sud_history_live_new.png b/common/src/main/res/mipmap-xxhdpi/icon_sud_history_live_new.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c550e28bee3794d25977f8bb8c04d7d946974a GIT binary patch literal 6035 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 literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxhdpi/icon_vacancy_sud_game.png b/common/src/main/res/mipmap-xxhdpi/icon_vacancy_sud_game.png new file mode 100644 index 0000000000000000000000000000000000000000..d2475e35d1633907bc34762661e253b69535dad8 GIT binary patch literal 3409 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 literal 0 HcmV?d00001 diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 6eedc57e5..584af597c 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1428,4 +1428,5 @@ Limited ride And limited avatar frame The quantity of goods exchanged has reached the upper limit Successfully opened You have purchased the BattlePass + 評論 diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java index 84b75209c..0e748b6e6 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveGiveHotDialogFragment.java @@ -24,9 +24,7 @@ import com.opensource.svgaplayer.SVGADrawable; import com.opensource.svgaplayer.SVGAImageView; import com.opensource.svgaplayer.SVGAParser; import com.opensource.svgaplayer.SVGAVideoEntity; -import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; -import com.yunbao.common.bean.LevelBean; import com.yunbao.common.dialog.AbsDialogFragment; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; @@ -36,7 +34,7 @@ import com.yunbao.common.utils.SVGAViewUtils; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.bean.HotBean; -import com.yunbao.live.custom.TopGradual; +import com.yunbao.common.views.TopGradual; import com.yunbao.common.http.LiveHttpUtil; import com.yunbao.live.utils.LiveTextRender; diff --git a/live/src/main/java/com/yunbao/live/utils/LoadDian9TuUtil.java b/live/src/main/java/com/yunbao/live/utils/LoadDian9TuUtil.java index 634f805c9..90c95bb03 100644 --- a/live/src/main/java/com/yunbao/live/utils/LoadDian9TuUtil.java +++ b/live/src/main/java/com/yunbao/live/utils/LoadDian9TuUtil.java @@ -19,6 +19,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.NinePatchChunk; import com.yunbao.live.activity.LiveActivity; import java.io.File; diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java index ae325bc80..1b5c91314 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java @@ -160,7 +160,7 @@ import com.yunbao.live.bean.LiveWishlistBean; import com.yunbao.live.bean.WishlistItemModel; import com.yunbao.live.custom.LiveLightView; import com.yunbao.live.custom.RightGradual; -import com.yunbao.live.custom.TopGradual; +import com.yunbao.common.views.TopGradual; import com.yunbao.live.dialog.GiftWallDialog; import com.yunbao.live.dialog.LiveContactDetailsSendGiftDialog; import com.yunbao.live.dialog.LiveFaceUnityDialogFragment; diff --git a/live/src/main/java/com/yunbao/live/views/SystemMessageViewHolder.java b/live/src/main/java/com/yunbao/live/views/SystemMessageViewHolder.java index 4a0f83171..f77180201 100644 --- a/live/src/main/java/com/yunbao/live/views/SystemMessageViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/SystemMessageViewHolder.java @@ -67,7 +67,7 @@ import com.yunbao.live.adapter.YouLikeMessageAdapter; import com.yunbao.live.bean.SearchUserBean; import com.yunbao.live.bean.SystemMessageBean; import com.yunbao.live.bean.YouLikeBean; -import com.yunbao.live.custom.TopGradual; +import com.yunbao.common.views.TopGradual; import com.yunbao.live.http.ImHttpConsts; import com.yunbao.live.http.ImHttpUtil;