diff --git a/app/src/main/java/com/mango/moshen/ui/gift/dialog/GiftInfoVm.java b/app/src/main/java/com/mango/moshen/ui/gift/dialog/GiftInfoVm.java index d15fbdce4..e6883bc87 100644 --- a/app/src/main/java/com/mango/moshen/ui/gift/dialog/GiftInfoVm.java +++ b/app/src/main/java/com/mango/moshen/ui/gift/dialog/GiftInfoVm.java @@ -28,36 +28,38 @@ public class GiftInfoVm extends BaseItem { public final ObservableField countText = new ObservableField<>(); - public Drawable nobleDrawable = null; + public Drawable nobleDrawable; - public Drawable radishDrawable = null; + public Drawable radishDrawable; - public Drawable radishDrawableSelected = null; + public Drawable radishDrawableSelected; /** * 是否显示新 */ - public boolean isShowNew = false; + public boolean isShowNew; /** * 显示限定 */ - public boolean isShowLimit = false; + public boolean isShowLimit; /** * 显示特定 */ - public boolean isShowEffect = false; + public boolean isShowEffect; /** * 是否显示专属礼物 */ - public boolean isExclusive = false; + public boolean isExclusive; - public boolean isLocked = false; + public boolean isLocked; public String vipIcon; + public boolean isPrivateChat; + public GiftInfoVm(Context context, GiftInfo data, boolean select, boolean isKnap) { super(context, data); this.isSelect.set(select); diff --git a/app/src/main/java/com/mango/moshen/ui/im/actions/GiftAction.java b/app/src/main/java/com/mango/moshen/ui/im/actions/GiftAction.java index c94162a76..5311c9fc0 100644 --- a/app/src/main/java/com/mango/moshen/ui/im/actions/GiftAction.java +++ b/app/src/main/java/com/mango/moshen/ui/im/actions/GiftAction.java @@ -1,32 +1,19 @@ package com.mango.moshen.ui.im.actions; -import android.annotation.SuppressLint; - -import com.netease.nim.uikit.business.session.actions.BaseAction; -import com.netease.nim.uikit.business.session.helper.MessageListPanelHelper; import com.mango.moshen.R; -import com.mango.moshen.common.widget.dialog.DialogManager; import com.mango.moshen.ui.widget.GiftDialog; -import com.mango.core.gift.GiftModel; -import com.mango.core.gift.bean.GiftInfo; -import com.mango.core.gift.toolbox.GiftToolbox; -import com.mango.core.room.queue.bean.MicMemberInfo; -import com.mango.core.statistic.StatisticManager; -import com.mango.core.statistic.protocol.StatisticsProtocol; -import com.mango.core.utils.net.VipLevelNotEnoughException; - -import java.util.ArrayList; -import java.util.List; +import com.mango.moshen.ui.widget.PrivateChatGiftDialog; +import com.netease.nim.uikit.business.session.actions.BaseAction; /** * Created by xiaoyu * on 2017/10/2. */ -public class GiftAction extends BaseAction implements GiftDialog.OnGiftDialogBtnClickListener { +public class GiftAction extends BaseAction { - transient private GiftDialog giftDialog; + transient private PrivateChatGiftDialog giftDialog; public GiftAction() { super(R.drawable.icon_gift_action, R.string.gift_action); @@ -36,43 +23,11 @@ public class GiftAction extends BaseAction implements GiftDialog.OnGiftDialogBtn public void onClick() { if (giftDialog == null) { GiftDialog.GIFT_DIALOG_FROM = "私聊"; - - giftDialog = new GiftDialog(getActivity(), Long.valueOf(getAccount()), false, false, true); - giftDialog.setGiftDialogBtnClickListener(this); + giftDialog = new PrivateChatGiftDialog(getActivity(), Long.valueOf(getAccount())); giftDialog.setOnDismissListener(dialog -> giftDialog = null); } if (!giftDialog.isShowing()) { giftDialog.show(); } } - - @SuppressLint("CheckResult") - @Override - public void onSendGiftBtnClick(GiftInfo giftInfo, ArrayList micMemberInfos, int number, String msg, boolean isknap, boolean isWholeMic, List> drawFixedArray, GiftDialog.SenGiftCallback callback) { - if (giftInfo == null) return; - GiftModel.get().sendPersonalGift(giftInfo.getGiftId(), micMemberInfos.get(0).getAccount(), number, msg, isknap) - .doOnError(throwable -> { - if (callback != null) { - callback.onFail(); - } - if (throwable instanceof VipLevelNotEnoughException) { - new DialogManager(getActivity()).showOkDialog("尚未达到赠送" + - giftInfo.getGiftName() + - "所需贵族等级,所需贵族等级:" + - giftInfo.getGiftVipInfo().getVipName()); - } - }) - .flatMap(serviceResult -> GiftToolbox.sendGiftPrivateChatMessage(serviceResult.getData())) - .subscribe(imMessage -> { - // 手动更新送礼物的消息 - MessageListPanelHelper.getInstance().notifyAddMessage(imMessage); - if (callback != null) { - StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_PRIVATECHAT_SENDGIFT, - "私聊_送礼物"); - callback.onSuccess(); - } - }); - - } - } \ No newline at end of file diff --git a/app/src/main/java/com/mango/moshen/ui/widget/PrivateChatGiftDialog.java b/app/src/main/java/com/mango/moshen/ui/widget/PrivateChatGiftDialog.java new file mode 100644 index 000000000..4a45a3600 --- /dev/null +++ b/app/src/main/java/com/mango/moshen/ui/widget/PrivateChatGiftDialog.java @@ -0,0 +1,902 @@ +package com.mango.moshen.ui.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.SparseArray; +import android.view.Display; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.LinearInterpolator; +import android.view.animation.RotateAnimation; +import android.widget.Button; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.mango.core.UriProvider; +import com.mango.core.auth.AuthModel; +import com.mango.core.gift.GiftModel; +import com.mango.core.gift.bean.GiftInfo; +import com.mango.core.gift.bean.GiftTab; +import com.mango.core.gift.bean.GiftType; +import com.mango.core.gift.event.UpdateKnapEvent; +import com.mango.core.gift.toolbox.GiftToolbox; +import com.mango.core.initial.InitialModel; +import com.mango.core.initial.bean.InitInfo; +import com.mango.core.manager.AvRoomDataManager; +import com.mango.core.manager.IMNetEaseManager; +import com.mango.core.manager.RoomEvent; +import com.mango.core.pay.PayModel; +import com.mango.core.pay.bean.WalletInfo; +import com.mango.core.pay.event.UpdateWalletInfoEvent; +import com.mango.core.statistic.StatisticManager; +import com.mango.core.statistic.protocol.StatisticsProtocol; +import com.mango.core.utils.net.RxHelper; +import com.mango.core.utils.net.VipLevelNotEnoughException; +import com.mango.moshen.BR; +import com.mango.moshen.R; +import com.mango.moshen.base.BaseActivity; +import com.mango.moshen.common.widget.CircleImageView; +import com.mango.moshen.common.widget.dialog.DialogManager; +import com.mango.moshen.ui.gift.dialog.GiftInfoVm; +import com.mango.moshen.ui.gift.dialog.PageIndicatorView; +import com.mango.moshen.ui.pay.ChargeDialog; +import com.mango.moshen.ui.utils.ImageLoadUtils; +import com.mango.moshen.ui.webview.CommonWebViewActivity; +import com.mango.moshen.ui.webview.DialogWebViewActivity; +import com.mango.moshen.ui.widget.dialog.GiftManualQuantityDialog; +import com.mango.moshen.ui.widget.magicindicator.GiftIndicator; +import com.mango.moshen.ui.widget.magicindicator.buildins.UIUtil; +import com.mango.moshen.utils.SpannableBuilder; +import com.mango.xchat_android_library.bindinglist.IItem; +import com.mango.xchat_android_library.bindinglist.MultiTypeAdapter; +import com.mango.xchat_android_library.utils.FormatUtils; +import com.mango.xchat_android_library.utils.ListUtils; +import com.mango.xchat_android_library.utils.SingleToastUtil; +import com.mango.xchat_android_library.utils.TextWatcherWrapper; +import com.mango.xchat_android_library.widget.DrawableCenterTextView; +import com.netease.nim.uikit.business.session.helper.MessageListPanelHelper; +import com.zyyoona7.lib.EasyPopup; +import com.zyyoona7.lib.HorizontalGravity; +import com.zyyoona7.lib.VerticalGravity; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; + +/** + * @author chenran + * @date 2017/7/27 + */ + +public class PrivateChatGiftDialog extends BottomSheetDialog implements View.OnClickListener { + + private static final String TAG = "GiftDialog"; + public static String GIFT_DIALOG_FROM = ""; // 埋点用,标识从哪个位置打开弹框 + private final Context context; + private final long uid; + @Nullable + private GiftInfo currentGiftInfo; + private List currentGiftInfoList; + private EasyPopup easyPopup; + private int giftNumber = 1; + private Disposable mSubscribe; + private CompositeDisposable compositeDisposable; + private GiftInfoVm lastSelectedItem; + private List> pagerList; + private WalletInfo goldWalletInfo = PayModel.get().getCurrentWalletInfo(); + + private GiftIndicator giftIndicator; + private LinearLayout llStarWeek; + private LinearLayout llWeekStarDetail; + private ImageView ivWeekStarIcon; + private CircleImageView ivAvatarCharm; + private TextView tvWeekStarDesc; + private TextView tvWeekStarFirstUsername; + private TextView tvWeekStarEmpty; + private DrawableCenterTextView tvWeekStarIn; + private TextView tvGiftValue; + private LinearLayout layoutLoading; + private ImageView ivLoading; + private LinearLayout layoutLoadFailed; + private TextView tvReload; + private ViewPager gridView; + private LinearLayout layoutEmpty; + private PageIndicatorView indicator; + private EditText etGiftMessage; + private TextView tvRecharge; + private TextView tvTextGold; + private LinearLayout sendContainer; + private LinearLayout giftNumberLayout; + private TextView giftNumberText; + private ImageView ivGiftNumberOptions; + private Button btnSend; + + /*** + * + * @param context context + * @param OtherUid 送礼人uid + */ + public PrivateChatGiftDialog(Context context, long OtherUid) { + super(context, R.style.ErbanBottomSheetDialog); + this.context = context; + this.uid = OtherUid; + } + + private List> beanTransformVm(Context context, + List data, + boolean isKnap, + int pageSize, + @Nullable GiftInfo selectGiftInfo) { + List> result = new ArrayList<>(); + if (ListUtils.isListEmpty(data)) { + return result; + } + boolean hasSelectGift = false; + for (int i = 0; i < data.size(); i++) { + GiftInfoVm item = null; + List page = null; + if (i % pageSize == 0) { + page = new ArrayList<>(); + result.add(page); + } else { + if (result.size() > 0) { + page = result.get(result.size() - 1); + } + } + + boolean select = false; + if (selectGiftInfo != null && selectGiftInfo.getGiftId() == data.get(i).getGiftId()) { + hasSelectGift = true; + select = true; + } + item = new GiftInfoVm(context, data.get(i), select, isKnap); + item.isPrivateChat = true; + if (page != null) { + page.add(item); + } + } + if (!hasSelectGift) { + result.get(0).get(0).isSelect.set(true); + } + return result; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EventBus.getDefault().register(this); + setCanceledOnTouchOutside(true); + setContentView(R.layout.dialog_private_chat_gift); + compositeDisposable = new CompositeDisposable(); + init(); + + FrameLayout bottomSheet = findViewById(R.id.design_bottom_sheet); + if (bottomSheet != null) { + BottomSheetBehavior.from(bottomSheet).setSkipCollapsed(false); + BottomSheetBehavior.from(bottomSheet).setHideable(false); + } + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display d = windowManager.getDefaultDisplay(); + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + d.getRealMetrics(realDisplayMetrics); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.width = WindowManager.LayoutParams.MATCH_PARENT; + params.height = WindowManager.LayoutParams.MATCH_PARENT; + params.dimAmount = 0f; + getWindow().setAttributes(params); + mSubscribe = IMNetEaseManager.get().getChatRoomEventObservable().subscribe(this::onReceiveRoomEvent); + } + + @Override + protected void onStop() { + super.onStop(); + GIFT_DIALOG_FROM = ""; + } + + private void onReceiveRoomEvent(RoomEvent roomEvent) { + int event = roomEvent.getEvent(); + if (event == RoomEvent.GIFT_OUT_OF_DATE) { + onGiftOutOfDate(roomEvent.getMessage()); + } + } + + @SuppressLint("CheckResult") + private void init() { + initView(); + findViewById(R.id.tv_recharge).setOnClickListener(this); + tvReload.setOnClickListener(this); + showLoadingView(); + showLoadingAnimation(); + btnSend.setOnClickListener(this); + giftNumberLayout.setOnClickListener(this); + List tabInfoList = new ArrayList<>(); + tabInfoList.add(new GiftTab(GiftIndicator.TYPE_NORMAL, "礼物", "礼物")); + tabInfoList.add(new GiftTab(GiftIndicator.TYPE_NOBLE, "贵族", "贵族")); + tabInfoList.add(new GiftTab(GiftIndicator.TYPE_WEEK, "星座礼物", "星座礼物")); + tabInfoList.add(new GiftTab(GiftIndicator.TYPE_KNAP, "背包", "背包")); + giftIndicator = findViewById(R.id.gift_indicator); + giftIndicator.initTab( + tabInfoList, + Color.parseColor("#BABBCD"), + Color.parseColor("#171A58") + ); + + giftIndicator.addClick() + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(integer -> { + updateGiftView(integer); + //福袋礼物有定时更新逻辑,每次点击都需要刷新福袋礼物信息 + if (integer == GiftIndicator.TYPE_LUCKY) { + reloadData(false); + } + }); + giftIndicator.hidePosition(GiftIndicator.TYPE_LUCKY); + giftIndicator.hidePosition(GiftIndicator.TYPE_DRAW_GIFT); + indicator.setVisibility(View.INVISIBLE); + tvTextGold.setSelected(true); + tvWeekStarIn.setOnClickListener(this); + layoutEmpty.setVisibility(View.GONE); + etGiftMessage.addTextChangedListener(new TextWatcherWrapper() { + @Override + public void afterTextChanged(Editable s) { + if (s.toString().trim().length() > 15) { + SingleToastUtil.showToast(getContext().getString(R.string.tips_input_gift_message_limit)); + btnSend.setEnabled(false); + } + } + }); + compositeDisposable.add(GiftModel.get().requestKnapGiftInfos().subscribe()); + showGiftTab(); + } + + private void initView() { + llStarWeek = findViewById(R.id.ll_star_week); + llWeekStarDetail = findViewById(R.id.ll_week_star_detail); + ivWeekStarIcon = findViewById(R.id.iv_week_star_icon); + ivAvatarCharm = findViewById(R.id.iv_avatar_charm); + tvWeekStarDesc = findViewById(R.id.tv_week_star_desc); + tvWeekStarFirstUsername = findViewById(R.id.tv_week_star_first_username); + tvWeekStarEmpty = findViewById(R.id.tv_week_star_empty); + tvWeekStarIn = findViewById(R.id.tv_week_star_in); + tvGiftValue = findViewById(R.id.tv_gift_value); + layoutLoading = findViewById(R.id.layout_loading); + ivLoading = findViewById(R.id.iv_loading); + layoutLoadFailed = findViewById(R.id.layout_load_failed); + tvReload = findViewById(R.id.tv_reload); + gridView = findViewById(R.id.gridView); + layoutEmpty = findViewById(R.id.layout_empty); + indicator = findViewById(R.id.indicator); + etGiftMessage = findViewById(R.id.et_gift_message); + tvRecharge = findViewById(R.id.tv_recharge); + tvTextGold = findViewById(R.id.tv_text_gold); + sendContainer = findViewById(R.id.send_container); + giftNumberLayout = findViewById(R.id.gift_number_layout); + giftNumberText = findViewById(R.id.gift_number_text); + ivGiftNumberOptions = findViewById(R.id.iv_gift_number_options); + btnSend = findViewById(R.id.btn_send); + } + + + private void showLoadingAnimation() { + Animation rotateAnimation = new RotateAnimation(0, 360, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f); + rotateAnimation.setFillAfter(true); + rotateAnimation.setDuration(1000); + rotateAnimation.setRepeatCount(-1); + rotateAnimation.setInterpolator(new LinearInterpolator()); + ivLoading.startAnimation(rotateAnimation); + } + + private void setGoldOrRadishText(IItem lastSelectedItem) { + if (lastSelectedItem == null) { + setTvGoldText(); + return; + } + if (lastSelectedItem instanceof GiftInfoVm) { + GiftInfoVm giftInfoVm = (GiftInfoVm) lastSelectedItem; + btnSend.setEnabled(true); + setTvGoldText(); + } + } + + private void setTvGoldText() { + tvRecharge.setVisibility(View.VISIBLE); + tvRecharge.setText(context.getText(R.string.charge)); + if (goldWalletInfo == null) { + return; + } + String goldNumText = getContext().getString(R.string.gold_num_text, goldWalletInfo.getDiamondNum()); + SpannableBuilder builder = new SpannableBuilder(); + builder.append(context.getText(R.string.gift_wallet_overage), new ForegroundColorSpan( + context.getResources().getColor(R.color.white_transparent_50))) + .append(goldNumText); + tvTextGold.setText(builder.build()); + } + + private void updateGiftView(int position) { + updateGiftView(position, null); + } + + private void updateGiftView(int position, @Nullable GiftInfo selectGiftInfo) { + showDataView(); + // 获得对应的普通礼物/贵族礼物/背包礼物 + List nobleGiftInfos = getNobleGiftInfos(); + if (position == GiftIndicator.TYPE_KNAP) { + currentGiftInfoList = GiftModel.get().getKnapList(); + } else if (position == GiftIndicator.TYPE_NOBLE) { + currentGiftInfoList = nobleGiftInfos; + } else if (position == GiftIndicator.TYPE_NORMAL) { + currentGiftInfoList = getNormalGiftInfos(); + } else if (position == GiftIndicator.TYPE_WEEK) { + currentGiftInfoList = getWeekStarGiftInfos(); + } + //是否背包礼物 + final boolean isKnap = (position == GiftIndicator.TYPE_KNAP); + initEasyPop(isKnap); + if (ListUtils.isListEmpty(currentGiftInfoList)) { + currentGiftInfo = null; + if (isKnap) { + tvGiftValue.setVisibility(View.VISIBLE); + showEmptyView(); + } else if (position == GiftIndicator.TYPE_LUCKY || + position == GiftIndicator.TYPE_WEEK || + position == GiftIndicator.TYPE_DRAW_GIFT || + position == GiftIndicator.TYPE_SING_ROOM || + position == GiftIndicator.TYPE_PENALTY) { + showEmptyView(); + updateWeekStarDesc(); + } else { + showLoadFailedView(); + } + return; + } + currentGiftInfo = selectGiftInfo == null ? currentGiftInfoList.get(0) : selectGiftInfo; + if (currentGiftInfo.isSendMsg()) { + etGiftMessage.setVisibility(View.VISIBLE); + } + pagerList = beanTransformVm(context, currentGiftInfoList, isKnap, 8, selectGiftInfo); + setGridViewData(pagerList); + if (isKnap) { + tvGiftValue.setVisibility(View.VISIBLE); + updateTotalPrice(); + } else { + if (giftNumber == -1) { + updateNumber(1); + } + } + updateWeekStarDesc(); + } + + @SuppressLint("CheckResult") + private void updateWeekStarDesc() { + InitInfo initInfo = InitialModel.get().getCacheInitInfo(); + if (giftIndicator.getCurrrentType() == GiftIndicator.TYPE_WEEK && + initInfo != null && initInfo.isTwelveStarSwitch()) { + llStarWeek.setVisibility(View.VISIBLE); + } else { + llStarWeek.setVisibility(View.INVISIBLE); + return; + } + + GiftModel.get().getLastRankFirst() + .subscribe(weekStarInfo -> { + if (TextUtils.isEmpty(weekStarInfo.getNick())) { + tvWeekStarEmpty.setVisibility(View.VISIBLE); + llWeekStarDetail.setVisibility(View.GONE); + } else { + tvWeekStarEmpty.setVisibility(View.GONE); + llWeekStarDetail.setVisibility(View.VISIBLE); + ImageLoadUtils.loadImage(context, weekStarInfo.getAvatar(), ivAvatarCharm); + ImageLoadUtils.loadImage(context, weekStarInfo.getMarkUrl(), ivWeekStarIcon); + tvWeekStarFirstUsername.setText(weekStarInfo.getNick()); + tvWeekStarDesc.setText("上期星座月" + weekStarInfo.getTwelveStarName() + "星主"); + } + }, throwable -> { + tvWeekStarEmpty.setVisibility(View.VISIBLE); + llWeekStarDetail.setVisibility(View.GONE); + }); + } + + + private void updateTotalPrice() { + String diamond = ""; + double totalValue = 0; + for (int i = 0; i < currentGiftInfoList.size(); i++) { + totalValue += currentGiftInfoList.get(i).getCount() * currentGiftInfoList.get(i).getGoldPrice(); + } + if (totalValue >= 10000) { + totalValue = totalValue / 10000.0f; + diamond = FormatUtils.formatBigDecimal(totalValue) + "W+"; + } else { + diamond = String.valueOf((int) totalValue); + } + SpannableBuilder text = new SpannableBuilder() + .append("总价值: ", new ForegroundColorSpan(Color.parseColor("#BABBCD"))) + .append(diamond + "", new ForegroundColorSpan(Color.parseColor("#5FCCE4"))); + tvGiftValue.setText(text.build()); + } + + private void showEmptyView() { + //tab对应的礼物列表为空的情况 + layoutEmpty.setVisibility(View.VISIBLE); + layoutLoadFailed.setVisibility(View.GONE); + layoutLoading.setVisibility(View.GONE); + gridView.setVisibility(View.INVISIBLE); + etGiftMessage.setVisibility(View.GONE); + indicator.setVisibility(View.INVISIBLE); + } + + private void showLoadFailedView() { + layoutLoading.setVisibility(View.GONE); + layoutLoadFailed.setVisibility(View.VISIBLE); + layoutEmpty.setVisibility(View.GONE); + gridView.setVisibility(View.GONE); + etGiftMessage.setVisibility(View.GONE); + indicator.setVisibility(View.GONE); + } + + private void showLoadingView() { + layoutLoading.setVisibility(View.VISIBLE); + layoutLoadFailed.setVisibility(View.GONE); + layoutEmpty.setVisibility(View.GONE); + } + + private void showDataView() { + layoutLoading.setVisibility(View.GONE); + layoutLoadFailed.setVisibility(View.GONE); + layoutEmpty.setVisibility(View.GONE); + etGiftMessage.setVisibility(View.GONE); + tvGiftValue.setVisibility(View.GONE); + llStarWeek.setVisibility(View.GONE); + + gridView.setVisibility(View.VISIBLE); + indicator.setVisibility(View.VISIBLE); + sendContainer.setVisibility(View.VISIBLE); + } + + private void setGridViewData(List> pagerList) { + if (ListUtils.isListEmpty(pagerList)) { + return; + } + indicator.initIndicator(pagerList.size()); + int defaultSelectPage = 0; + int defaultSelectItem = 0; + wai: + for (int i = 0; i < pagerList.size(); i++) { + List pager = pagerList.get(i); + for (int j = 0; j < pager.size(); j++) { + GiftInfoVm iItem = pager.get(j); + if (iItem != null && iItem.isSelect.get()) { + defaultSelectPage = i; + defaultSelectItem = j; + break wai; + } + } + } + indicator.setSelectedPage(defaultSelectPage); + layoutEmpty.setVisibility(View.GONE); + gridView.setVisibility(View.VISIBLE); + + indicator.setVisibility(pagerList.size() > 1 ? View.VISIBLE : View.INVISIBLE); + SparseArray cacheItemView = new SparseArray<>(); + lastSelectedItem = pagerList.get(defaultSelectPage).get(defaultSelectItem); + setGoldOrRadishText(lastSelectedItem); + gridView.setAdapter(new PagerAdapter() { + + @Override + public int getCount() { + return pagerList.size(); + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == object; + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int pagePos) { + RecyclerView recyclerView; + MultiTypeAdapter giftAdapter; + if (cacheItemView.get(pagePos) == null) { + recyclerView = new RecyclerView(context); + recyclerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + recyclerView.setLayoutManager(new GridLayoutManager(context, 4)); + giftAdapter = new MultiTypeAdapter<>(BR.item, true); + recyclerView.setAdapter(giftAdapter); + cacheItemView.put(pagePos, recyclerView); + } else { + recyclerView = cacheItemView.get(pagePos); + giftAdapter = (MultiTypeAdapter) recyclerView.getAdapter(); + } + giftAdapter.clearAllItem(); + giftAdapter.addData(pagerList.get(pagePos)); + + giftAdapter.setOnItemClickListener(item -> { + if (item.data.isSendMsg()) { + etGiftMessage.setVisibility(View.VISIBLE); + } else { + etGiftMessage.setVisibility(View.GONE); + } + if (lastSelectedItem != null) { + lastSelectedItem.isSelect.set(false); + } + item.isSelect.set(true); + lastSelectedItem = item; + currentGiftInfo = item.data; + setGoldOrRadishText(lastSelectedItem); + updateWeekStarDesc(); + }); + container.addView(recyclerView); + return recyclerView; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + RecyclerView recyclerView = cacheItemView.get(position); + MultiTypeAdapter adapter = (MultiTypeAdapter) recyclerView.getAdapter(); + adapter.getAllItems().clear(); + container.removeView(recyclerView); + } + }); + gridView.setCurrentItem(defaultSelectPage); + gridView.addOnPageChangeListener(new OnPageSelectedListener() { + @Override + public void onPageSelected(int position) { + if (pagerList.size() > 1) { + indicator.setSelectedPage(position); + } + } + }); + } + + private List loadGiftInfoList() { + List giftInfos; + // 私聊送礼面板 不在房间内,直接在普通的列表里选出房间礼物进行显示 + giftInfos = GiftModel.get().getGiftInfoList(GiftType.GIFT_TYPE_NORMAL); + if (ListUtils.isListEmpty(giftInfos)) return new ArrayList<>(); + return giftInfos; + } + + private List getNormalGiftInfos() { + List giftInfos = loadGiftInfoList(); + List infos = new ArrayList<>(); + for (int i = 0; i < giftInfos.size(); i++) { + GiftInfo giftInfo = giftInfos.get(i); + if (!giftInfo.isNobleGift() || giftInfo.getLevel() == 0) { + infos.add(giftInfo); + } + } + return infos; + } + + private List getWeekStarGiftInfos() { + return GiftModel.get().getGiftInfosByType( + String.valueOf(AvRoomDataManager.get().getRoomUid()), + GiftType.GIFT_TYPE_WEEK_STAR); + } + + private List getNobleGiftInfos() { + return GiftModel.get().getGiftInfoList(GiftType.GIFT_TYPE_VIP); + } + + private void initEasyPop(boolean isBag) { + + easyPopup = new EasyPopup(getContext()) + .setContentView(R.layout.dialog_gift_number) + .setFocusAndOutsideEnable(true) + .createPopup(); + + easyPopup.getView(R.id.number_1).setOnClickListener(this); + easyPopup.getView(R.id.number_10).setOnClickListener(this); + easyPopup.getView(R.id.number_66).setOnClickListener(this); + easyPopup.getView(R.id.number_99).setOnClickListener(this); + easyPopup.getView(R.id.number_188).setOnClickListener(this); + easyPopup.getView(R.id.number_520).setOnClickListener(this); + easyPopup.getView(R.id.number_1314).setOnClickListener(this); + if (isBag) { + easyPopup.getView(R.id.number_all).setVisibility(View.VISIBLE); + easyPopup.getView(R.id.number_all).setOnClickListener(this); + } else { + easyPopup.getView(R.id.number_all).setVisibility(View.GONE); + } + easyPopup.getView(R.id.number_manual).setOnClickListener(this); + + easyPopup.setOnDismissListener(() -> ivGiftNumberOptions.animate().rotationBy(180).start()); + } + + @SuppressLint("CheckResult") + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.tv_recharge: + StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_GIFT_PANEL_TO_RECHARGE, "礼物面板_去充值:" + GIFT_DIALOG_FROM); + ChargeDialog.start(getContext()); + dismiss(); + break; + //送礼物 + case R.id.btn_send: + final GiftInfo finalCurrentGiftInfo = currentGiftInfo; + btnSend.setEnabled(false); + btnSend.setText("赠送中..."); + Log.e(TAG, "onClick: indicator type: " + giftIndicator.getCurrrentType()); + if (!AuthModel.get().isImLogin()) { + SingleToastUtil.showToast("网络异常,请重试!"); + btnSend.setText("赠送"); + btnSend.setEnabled(true); + return; + } + if (finalCurrentGiftInfo == null) { + btnSend.setText("赠送"); + btnSend.setEnabled(true); + return; + } + String giftMessage = getGiftMessage(); + if (Objects.equals(giftMessage, "")) { + SingleToastUtil.showToast("请输入喊话内容"); + btnSend.setText("赠送"); + btnSend.setEnabled(true); + } else { + GiftModel.get().sendPersonalGift(finalCurrentGiftInfo.getGiftId(), String.valueOf(uid), giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber, + giftMessage, + giftIndicator.getCurrrentType() == GiftIndicator.TYPE_KNAP) + .doOnError(throwable -> { + if (btnSend == null) return; + btnSend.setText("赠送"); + btnSend.setEnabled(true); + if (throwable instanceof VipLevelNotEnoughException) { + new DialogManager(context).showOkDialog("尚未达到赠送" + + finalCurrentGiftInfo.getGiftName() + + "所需贵族等级,所需贵族等级:" + + finalCurrentGiftInfo.getGiftVipInfo().getVipName()); + } + }) + .flatMap(serviceResult -> GiftToolbox.sendGiftPrivateChatMessage(serviceResult.getData())) + .subscribe(imMessage -> { + // 手动更新送礼物的消息 + MessageListPanelHelper.getInstance().notifyAddMessage(imMessage); + StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_PRIVATECHAT_SENDGIFT, + "私聊_送礼物"); + onSendGiftSuccess(finalCurrentGiftInfo); + }); + etGiftMessage.setText(""); + } + + break; + case R.id.number_1: + updateNumber(1); + break; + case R.id.number_10: + updateNumber(10); + break; + case R.id.number_66: + updateNumber(66); + break; + case R.id.number_99: + updateNumber(99); + break; + case R.id.number_188: + updateNumber(188); + break; + case R.id.number_520: + updateNumber(520); + break; + case R.id.number_1314: + updateNumber(1314); + break; + case R.id.number_all: + updateNumber(-1); + break; + case R.id.number_manual: + GiftManualQuantityDialog giftManualQuantityDialog = new GiftManualQuantityDialog(context); + giftManualQuantityDialog.setOnConfirmClick(new GiftManualQuantityDialog.OnConfirmClick() { + @Override + public void onConfirm(int quantity) { + updateNumber(quantity); + giftManualQuantityDialog.dismiss(); + } + }); + giftManualQuantityDialog.show(); + easyPopup.dismiss(); + break; + case R.id.gift_number_layout: + showEasyPopup(); + break; + case R.id.iv_lucky_bag_intro: + if (currentGiftInfo == null) break; + DialogWebViewActivity.start(context, UriProvider.getLuckyGiftRule(currentGiftInfo.getGiftId()), true); + break; + + case R.id.tv_reload: + reloadData(true); + break; + case R.id.tv_week_star_in: + CommonWebViewActivity.start(context, UriProvider.getWeekStarUrl()); + break; + case R.id.tv_tab_send_gift: + showGiftTab(); + break; + default: + break; + } + } + + private void showGiftTab() { + showGiftTab(GiftIndicator.TYPE_NORMAL, null); + } + + private void showGiftTab(int position, @Nullable GiftInfo selectGiftInfo) { + giftIndicator.hidePosition(GiftIndicator.TYPE_DRAW_GIFT); + giftIndicator.hidePosition(GiftIndicator.TYPE_PENALTY); + giftIndicator.showPosition(GiftIndicator.TYPE_LUCKY); + giftIndicator.showPosition(GiftIndicator.TYPE_NOBLE); + giftIndicator.showPosition(GiftIndicator.TYPE_WEEK); + giftIndicator.showPosition(GiftIndicator.TYPE_NORMAL); + if (AvRoomDataManager.get().isSingleRoom()) { + giftIndicator.showPosition(GiftIndicator.TYPE_SING_ROOM); + } else { + giftIndicator.hidePosition(GiftIndicator.TYPE_SING_ROOM); + } + + giftIndicator.setPosition(position); + updateGiftView(giftIndicator.getCurrrentType(), selectGiftInfo); + } + + private void onSendGiftSuccess(GiftInfo giftInfo) { + if (btnSend == null) return; + btnSend.setText("赠送"); + btnSend.setEnabled(true); + } + + private void reloadData(final boolean needShowLoading) { + if (needShowLoading) showLoadingView(); + int currentType = giftIndicator.getCurrrentType(); + switch (currentType) { + case GiftIndicator.TYPE_NORMAL: + case GiftIndicator.TYPE_LUCKY: + case GiftIndicator.TYPE_NOBLE: + case GiftIndicator.TYPE_WEEK: + compositeDisposable.add(GiftModel.get().refreshGiftList(null) + .subscribe((giftListInfoServiceResult, throwable) -> { + if (throwable == null) { + // 返回结果时,当前选中选项与请求时的选项一样时才显示 + if (currentType == giftIndicator.getCurrrentType()) { + updateGiftView(giftIndicator.getCurrrentType()); + } + } else { + if (needShowLoading) showLoadFailedView(); + } + }) + ); + break; + + case GiftIndicator.TYPE_KNAP: + compositeDisposable.add(GiftModel.get() + .requestKnapGiftInfos() + .subscribe((listServiceResult, throwable) -> { + if (throwable == null) { + if (currentType == giftIndicator.getCurrrentType()) { + updateGiftView(giftIndicator.getCurrrentType()); + } + } else { + if (needShowLoading) showLoadFailedView(); + } + }) + ); + break; + } + } + + private String getGiftMessage() { + if (currentGiftInfo != null && currentGiftInfo.isSendMsg()) { + if (etGiftMessage.getText().toString().length() == 0) { + return getContext().getString(R.string.tips_input_gift_message); + } else { + if (Objects.equals(etGiftMessage.getText().toString().trim(), "")) { + return ""; + } else { + return etGiftMessage.getText().toString().trim(); + } + } + } else { + return null; + } + } + + private void updateNumber(int number) { + giftNumber = number; + giftNumberText.setText(giftNumber == -1 ? "all" : giftNumber + ""); + easyPopup.dismiss(); + } + + private void showEasyPopup() { + ivGiftNumberOptions.animate().rotationBy(180).start(); + easyPopup.showAtAnchorView(giftNumberLayout, VerticalGravity.ABOVE, HorizontalGravity.ALIGN_LEFT, + 0, -UIUtil.dip2px(context, 11)); + } + + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + EventBus.getDefault().unregister(this); + if (mSubscribe != null) { + mSubscribe.dispose(); + mSubscribe = null; + } + if (compositeDisposable != null) { + compositeDisposable.dispose(); + compositeDisposable = null; + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onWalletInfoUpdate(UpdateWalletInfoEvent event) { + goldWalletInfo = PayModel.get().getCurrentWalletInfo(); + setGoldOrRadishText(lastSelectedItem); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRecieveGiftKnapMsg(UpdateKnapEvent event) { + //刷新背包礼物 + compositeDisposable.add(GiftModel.get().requestKnapGiftInfos() + .compose(RxHelper.handleSchedulers()) + .subscribe()); + if (giftIndicator.getCurrrentType() != GiftIndicator.TYPE_KNAP) { + return; + } + int giftId = event.getGiftId(); + int sendNum = event.getSendNumber(); + if (ListUtils.isListEmpty(pagerList)) { + return; + } + for (List page : pagerList) { + for (GiftInfoVm item : page) { + if (item.data.getGiftId() == giftId) { + int count = item.data.getCount() - sendNum; + item.data.setCount(Math.max(count, 0)); + item.updateCount(); + break; + } + } + } + updateTotalPrice(); + } + + private void onGiftOutOfDate(String message) { + ((BaseActivity) getContext()).toast(message); + } + +} diff --git a/app/src/main/res/drawable/bg_dialog_private_chat.xml b/app/src/main/res/drawable/bg_dialog_private_chat.xml new file mode 100644 index 000000000..4805a521e --- /dev/null +++ b/app/src/main/res/drawable/bg_dialog_private_chat.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_private_chat_gift.xml b/app/src/main/res/layout/dialog_private_chat_gift.xml new file mode 100644 index 000000000..b66718fcf --- /dev/null +++ b/app/src/main/res/layout/dialog_private_chat_gift.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +