diff --git a/app/src/main/java/com/yizhuan/erban/avroom/adapter/ExitRoomAdapter.kt b/app/src/main/java/com/yizhuan/erban/avroom/adapter/ExitRoomAdapter.kt new file mode 100644 index 000000000..0953a5f23 --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/adapter/ExitRoomAdapter.kt @@ -0,0 +1,24 @@ +package com.yizhuan.erban.avroom.adapter + +import android.graphics.Color +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yizhuan.erban.R +import com.yizhuan.erban.ui.utils.ImageLoadUtils +import com.yizhuan.erban.ui.widget.LivingIconView +import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo + +class ExitRoomAdapter : + BaseQuickAdapter(R.layout.item_exit_room) { + + override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) { + + ImageLoadUtils.loadImage(mContext, item.avatar, helper.getView(R.id.iv_avatar)) + ImageLoadUtils.loadImage(mContext, item.tagPict, helper.getView(R.id.iv_tag)) + helper.setText(R.id.tv_online_num, item.onlineNum.toString()) + .setText(R.id.tv_title, item.title) + val livingIconView = helper.getView(R.id.liv_living_icon) + livingIconView.setColor(Color.WHITE) + livingIconView.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/dialog/ExitRoomPopupWindow.kt b/app/src/main/java/com/yizhuan/erban/avroom/dialog/ExitRoomPopupWindow.kt new file mode 100644 index 000000000..960863a4d --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/avroom/dialog/ExitRoomPopupWindow.kt @@ -0,0 +1,199 @@ +package com.yizhuan.erban.avroom.dialog + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.ImageView +import android.widget.PopupWindow +import android.widget.TextView +import androidx.core.view.drawToBitmap +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.netease.nim.uikit.common.util.sys.ScreenUtil +import com.yizhuan.erban.R +import com.yizhuan.erban.UIHelper +import com.yizhuan.erban.avroom.activity.AVRoomActivity +import com.yizhuan.erban.avroom.adapter.ExitRoomAdapter +import com.yizhuan.erban.avroom.presenter.HomePartyPresenter +import com.yizhuan.erban.common.widget.dialog.DialogManager.LambdaOkDialogListener +import com.yizhuan.erban.common.widget.dialog.DialogManager.OkCancelDialogListener +import com.yizhuan.erban.ui.utils.RVDelegate +import com.yizhuan.erban.utils.FastBlur +import com.yizhuan.xchat_android_constants.XChatConstants +import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo +import com.yizhuan.xchat_android_core.manager.AvRoomDataManager +import com.yizhuan.xchat_android_core.room.model.AvRoomModel +import com.yizhuan.xchat_android_library.annatation.ActLayoutRes +import io.reactivex.disposables.Disposable + + +@ActLayoutRes(R.layout.dialog_exit_room) +class ExitRoomPopupWindow(val avRoomActivity: AVRoomActivity, val rootView: View) : PopupWindow() { + + companion object { + + @JvmStatic + fun newInstance(avRoomActivity: AVRoomActivity, rootView: View): ExitRoomPopupWindow { + return ExitRoomPopupWindow(avRoomActivity, rootView) + } + } + + private val recyclerView: RecyclerView + private val llEmpty: View + private val tvReport: TextView + private val tvMiniRoom: TextView + private val tvExitRoom: TextView + + private var disposable: Disposable? = null + + private val exitRoomAdapter = ExitRoomAdapter() + private lateinit var rvDelegate: RVDelegate + + init { + contentView = LayoutInflater.from(avRoomActivity).inflate(R.layout.dialog_exit_room, null) + width = ScreenUtil.dip2px(250f) + height = WindowManager.LayoutParams.MATCH_PARENT + isFocusable = true + recyclerView = contentView.findViewById(R.id.recycler_view) + llEmpty = contentView.findViewById(R.id.ll_empty) + tvReport = contentView.findViewById(R.id.tv_report) + tvMiniRoom = contentView.findViewById(R.id.tv_mini_room) + tvExitRoom = contentView.findViewById(R.id.tv_exit_room) + initView() + isClippingEnabled = false + } + + private fun initView() { + + animationStyle = R.style.style_anim_right_in_out + setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + contentView.findViewById(R.id.tv_more).setOnClickListener { + //HomeMoreRoomActivity.start(context) + } + + tvReport.setOnClickListener { + val roomInfo = AvRoomDataManager.get().mCurrentRoomInfo ?: return@setOnClickListener + UIHelper.showReportPage(avRoomActivity, roomInfo.uid, XChatConstants.REPORT_TYPE_ROOM) + dismiss() + } + + tvExitRoom.setOnClickListener { + handleExitRoom() + dismiss() + } + + tvMiniRoom.setOnClickListener { + if (AvRoomDataManager.get().isSelfGamePlaying) { + avRoomActivity.dialogManager.showOkCancelDialog( + "游戏中最小化房间默认逃跑,确定进行此操作?", false + ) { + avRoomActivity.toBack() + dismiss() + } + return@setOnClickListener + } + avRoomActivity.onBackPressed() + dismiss() + } + + rvDelegate = RVDelegate.Builder() + .setLayoutManager(LinearLayoutManager(avRoomActivity)) + .setRecyclerView(recyclerView) + .setAdapter(exitRoomAdapter) + .build() + + exitRoomAdapter.setOnItemClickListener { _, _, position -> + exitRoomAdapter.getItem(position)?.let { + AVRoomActivity.start(avRoomActivity, it.uid) + dismiss() + } + } + + disposable = AvRoomModel.get() + .getRecommendRoomList(AvRoomDataManager.get().roomId.toString()) + .subscribe( + { + llEmpty.isVisible = it.isNullOrEmpty() + recyclerView.isGone = it.isNullOrEmpty() + rvDelegate.setNewData(it) + }, + { + llEmpty.isVisible = true + recyclerView.isVisible = true + } + ) + + setOnDismissListener { + disposable?.dispose() + } + + val bitmap = rootView.drawToBitmap() + val bitmapX = bitmap.width + val bitmapY = bitmap.height + val bitmap1 = Bitmap.createBitmap( + bitmap, + bitmapX - ScreenUtil.dip2px(250f), + 0, + ScreenUtil.dip2px(250f), + bitmapY + ) + blur(bitmap1, contentView.findViewById(R.id.iv_blur)) + } + + private fun blur(bkg: Bitmap, view: ImageView) { + val scaleFactor = 8 + var overlay = + Bitmap.createScaledBitmap(bkg, bkg.width / scaleFactor, bkg.height / scaleFactor, false) + overlay = FastBlur.blur(overlay, 5, true) //高斯模糊 + view.setImageBitmap(overlay) + } + + private fun handleExitRoom() { + if (AvRoomDataManager.get().isSelfGamePlaying) { + avRoomActivity.dialogManager.showOkCancelDialog("游戏中退出房间默认逃跑,确定进行此操作?", false, + OkCancelDialogListener { avRoomActivity.toBack() }) + return + } + if (AvRoomDataManager.get().isOpenKTV && AvRoomDataManager.get().isOwnerOnMic) { + avRoomActivity.dialogManager.showOkCancelDialog("KTV模式下退出房间会移除您已点的所有歌曲,确定进行此操作?", + false, + OkCancelDialogListener { avRoomActivity.toBack() }) + return + } + if ((AvRoomDataManager.get().isQueuingMicro || AvRoomDataManager.get().isOpenPKMode) + && AvRoomDataManager.get().myIsInQueue + ) { + avRoomActivity.dialogManager.showOkCancelDialog("退出房间将会取消你的报名,确定进行此操作?", false, + LambdaOkDialogListener { avRoomActivity.toBack() }) + return + } + if (AvRoomDataManager.get().haveStartDragon) { + avRoomActivity.dialogManager.showOkCancelDialog( + "你正在交友匹配中,此操作代表你放弃本局匹配展示,确定进行此操作?", + false, + object : OkCancelDialogListener { + override fun onCancel() {} + + @SuppressLint("CheckResult") + override fun onOk() { + avRoomActivity.giveUpDragonBar() + .subscribe { s: String? -> + HomePartyPresenter().cancelDragon() + avRoomActivity.toBack() + } + } + }) + } else { + avRoomActivity.toBack() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java index f4532cde8..cf1969a0d 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyFragment.java @@ -3,6 +3,7 @@ package com.yizhuan.erban.avroom.fragment; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; +import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewStub; @@ -25,6 +26,7 @@ import com.yizhuan.erban.UIHelper; import com.yizhuan.erban.avroom.activity.AVRoomActivity; import com.yizhuan.erban.avroom.activity.RoomOnlineUserActivity; import com.yizhuan.erban.avroom.adapter.SelectGameAdapter; +import com.yizhuan.erban.avroom.dialog.ExitRoomPopupWindow; import com.yizhuan.erban.avroom.presenter.HomePartyPresenter; import com.yizhuan.erban.avroom.widget.GiftV2View; import com.yizhuan.erban.base.BaseFragment; @@ -492,7 +494,9 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe public void onClick(View v) { switch (v.getId()) { case R.id.room_more: - showMoreItems(); + View view = requireActivity().findViewById(android.R.id.content); + ExitRoomPopupWindow.newInstance((AVRoomActivity) requireActivity(), view) + .showAtLocation(gameMainBinding.getRoot(), Gravity.END, 0, 0); break; case R.id.ll_room_info: RoomOnlineUserActivity.start(getActivity()); @@ -563,83 +567,6 @@ public class HomePartyFragment extends BaseFragment implements View.OnClickListe StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_ROOM_SHARE_CLICK, "语音房_分享"); } - /** - * 房间右上角更多 - */ - @SuppressLint("CheckResult") - private void showMoreItems() { - List buttonItems = new ArrayList<>(); - - ButtonItem buttonItem1 = new ButtonItem("退出房间", new ButtonItem.OnClickListener() { - @Override - public void onClick() { - if (AvRoomDataManager.get().isSelfGamePlaying()) { - getDialogManager().showOkCancelDialog("游戏中退出房间默认逃跑,确定进行此操作?", false, - () -> ((AVRoomActivity) getActivity()).toBack()); - return; - } - if (AvRoomDataManager.get().isOpenKTV() && AvRoomDataManager.get().isOwnerOnMic()) { - getDialogManager().showOkCancelDialog("KTV模式下退出房间会移除您已点的所有歌曲,确定进行此操作?", false, - () -> ((AVRoomActivity) getActivity()).toBack()); - return; - } - if ((AvRoomDataManager.get().isQueuingMicro() || AvRoomDataManager.get().isOpenPKMode()) - && AvRoomDataManager.get().myIsInQueue) { - getDialogManager().showOkCancelDialog("退出房间将会取消你的报名,确定进行此操作?", false, - (DialogManager.LambdaOkDialogListener) () -> - ((AVRoomActivity) getActivity()).toBack()); - return; - } - if (AvRoomDataManager.get().haveStartDragon) { - getDialogManager().showOkCancelDialog("你正在交友匹配中,此操作代表你放弃本局匹配展示,确定进行此操作?", false, new DialogManager.OkCancelDialogListener() { - @Override - public void onCancel() { - } - - @Override - public void onOk() { - ((AVRoomActivity) getActivity()).giveUpDragonBar().subscribe(s -> { - new HomePartyPresenter().cancelDragon(); - ((AVRoomActivity) getActivity()).toBack(); - }); - } - }); - } else { - ((AVRoomActivity) getActivity()).toBack(); - } - } - }); - ButtonItem buttonItem2 = new ButtonItem("最小化房间", new ButtonItem.OnClickListener() { - @Override - public void onClick() { - if (AvRoomDataManager.get().isSelfGamePlaying()) { - getDialogManager().showOkCancelDialog("游戏中最小化房间默认逃跑,确定进行此操作?", false, - () -> ((AVRoomActivity) getActivity()).toBack()); - return; - } - getActivity().onBackPressed(); - } - }); - ButtonItem buttonItem3 = new ButtonItem("举报房间", new ButtonItem.OnClickListener() { - @Override - public void onClick() { - RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; - if (roomInfo == null) { - return; - } - UIHelper.showReportPage(mContext, roomInfo.getUid(), XChatConstants.REPORT_TYPE_ROOM); - } - }); - //buttonItems.add(buttonItem0); - buttonItems.add(buttonItem1); - buttonItems.add(buttonItem2); - buttonItems.add(buttonItem3); - DialogManager dialogManager = ((BaseMvpActivity) getActivity()).getDialogManager(); - if (dialogManager != null) { - dialogManager.showCommonPopupDialog(buttonItems, "取消"); - } - } - @Override public void onInAppSharingItemClick() { shareDialog.dismiss(); diff --git a/app/src/main/res/drawable-xhdpi/ic_room_exit.png b/app/src/main/res/drawable-xhdpi/ic_room_exit.png new file mode 100644 index 000000000..3d8461a2c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_room_exit.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_room_mini.png b/app/src/main/res/drawable-xhdpi/ic_room_mini.png new file mode 100644 index 000000000..72d81c320 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_room_mini.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_room_report.png b/app/src/main/res/drawable-xhdpi/ic_room_report.png new file mode 100644 index 000000000..8699fe22d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_room_report.png differ diff --git a/app/src/main/res/drawable/bg_item_recommend_onlien_num.xml b/app/src/main/res/drawable/bg_item_recommend_onlien_num.xml new file mode 100644 index 000000000..fccbd9ac9 --- /dev/null +++ b/app/src/main/res/drawable/bg_item_recommend_onlien_num.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_item_recommend_room.xml b/app/src/main/res/drawable/bg_item_recommend_room.xml new file mode 100644 index 000000000..64da614a6 --- /dev/null +++ b/app/src/main/res/drawable/bg_item_recommend_room.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/layout/dialog_exit_room.xml b/app/src/main/res/layout/dialog_exit_room.xml new file mode 100644 index 000000000..bb50f073d --- /dev/null +++ b/app/src/main/res/layout/dialog_exit_room.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_exit_room.xml b/app/src/main/res/layout/item_exit_room.xml new file mode 100644 index 000000000..4eb082a6f --- /dev/null +++ b/app/src/main/res/layout/item_exit_room.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8a6eda7d8..930331a52 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -561,4 +561,9 @@ @color/color_black_333333 + + diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java index 655f20bab..b61f3ba97 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/AvRoomModel.java @@ -20,6 +20,7 @@ import com.yizhuan.xchat_android_core.bean.response.ServiceResult; import com.yizhuan.xchat_android_core.decoration.car.bean.CarInfo; import com.yizhuan.xchat_android_core.decoration.headwear.bean.HeadWearInfo; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; +import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo; import com.yizhuan.xchat_android_core.level.UserLevelVo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; @@ -631,4 +632,11 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel { .compose(RxHelper.handleStringData()) .compose(RxHelper.handleSchAndExce()); } + + @Override + public Single> getRecommendRoomList(String roomId) { + return mRoomService.getRecommendRoomList(roomId) + .compose(RxHelper.handleBeanData()) + .compose(RxHelper.handleSchedulers()); + } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java index 18d41c265..b67b83964 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/RoomBaseModel.java @@ -29,6 +29,7 @@ import com.yizhuan.xchat_android_core.bean.response.ServiceResult; import com.yizhuan.xchat_android_core.decoration.headwear.bean.HeadWearInfo; import com.yizhuan.xchat_android_core.exception.ErrorThrowable; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; +import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo; import com.yizhuan.xchat_android_core.manager.AvRoomDataManager; import com.yizhuan.xchat_android_core.manager.IMNetEaseManager; import com.yizhuan.xchat_android_core.room.activitytimer.TimerBean; @@ -1126,6 +1127,14 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel { Single> cleanScreen(@Field("roomUid") long roomUid, @Field("uid") long uid); + /** + * 房内推荐房间列表 + * + * @return + */ + @GET("/roominsiderecommend/recommendRoomList") + Single>> getRecommendRoomList(@Query("roomId") String roomId); + } } diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java index 6f8ec29d8..450b4167f 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/room/model/inteface/IAvRoomModel.java @@ -5,6 +5,7 @@ import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData; import com.yizhuan.xchat_android_core.base.IModel; import com.yizhuan.xchat_android_core.bean.response.ServiceResult; import com.yizhuan.xchat_android_core.home.bean.BannerInfo; +import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo; import com.yizhuan.xchat_android_core.room.activitytimer.TimerBean; import com.yizhuan.xchat_android_core.room.bean.BroadcastInfo; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; @@ -174,4 +175,6 @@ public interface IAvRoomModel extends IModel { Single sendRoomBroadcast(String msg, long roomId); Single cleanScreen(long roomUid, long uid); + + Single> getRecommendRoomList(String roomId); }