From da6ca4fbbb2508cf760f318d927a73b78aa1f51d Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Tue, 10 Oct 2023 18:30:44 +0800 Subject: [PATCH] update --- .../java/com/shayu/onetoone/AppContext.java | 2 + .../activity/fragments/home/HotFragment.java | 14 +- .../message/ChatMessageFragment.java | 142 +++++++-- .../activity/message/CallVideoActivity.java | 91 ++++++ .../onetoone/adapter/GiftListAdapter.java | 72 +++++ .../onetoone/adapter/HomeHotListAdapter.java | 55 +++- .../adapter/HomeRecommendListAdapter.java | 7 + .../com/shayu/onetoone/bean/GiftBean.java | 279 ++++++++++++++++++ .../com/shayu/onetoone/bean/HomeItemBean.java | 18 ++ .../onetoone/bean/MessageChatGiftContent.java | 151 ++++++++++ .../bean/MessageConsumeConfigBean.java | 47 +++ .../com/shayu/onetoone/dialog/GiftDialog.java | 69 +++++ .../com/shayu/onetoone/dialog/TipsDialog.java | 82 +++++ .../listener/OnCallStatusListener.java | 11 + .../listener/OnDialogClickListener.java | 12 + .../listener/OnSendMessageListener.java | 14 + .../onetoone/manager/CallClientManager.java | 230 +++++++++++++++ .../shayu/onetoone/manager/OTONetManager.java | 89 +++++- .../onetoone/manager/SendMessageManager.java | 142 +++++++++ .../shayu/onetoone/network/OneToOneApi.java | 86 ++++-- .../MessageChatReceiveGiftItemProvider.java | 57 ++++ .../provider/MessageChatTipHandler.java | 23 -- OneToOne/src/main/res/drawable/bg_button.xml | 9 + .../src/main/res/drawable/bg_chat_gift.xml | 9 + .../src/main/res/drawable/bg_dialog_tip.xml | 13 + .../main/res/drawable/bg_dialog_tip_apply.xml | 9 + .../res/drawable/bg_dialog_tip_cancel.xml | 9 + .../src/main/res/drawable/bg_gift_select.xml | 9 + .../src/main/res/drawable/bg_gift_top_up.xml | 9 + .../main/res/drawable/bg_home_hot_cover.xml | 9 + .../main/res/layout/activity_call_video.xml | 142 +++++++++ OneToOne/src/main/res/layout/dialog_tips1.xml | 58 ++++ OneToOne/src/main/res/layout/item_gift.xml | 67 +++++ .../src/main/res/layout/item_home_hot.xml | 98 +++--- .../main/res/layout/item_home_recommend.xml | 7 + .../res/layout/rc_extension_input_panel.xml | 3 +- .../layout/view_message_chat_receive_gift.xml | 45 +++ .../res/layout/view_message_input_gift.xml | 77 +++++ .../main/res/mipmap-xxhdpi/ic_call_audio.png | Bin 0 -> 12106 bytes .../mipmap-xxhdpi/ic_call_audio_select.png | Bin 0 -> 8675 bytes .../main/res/mipmap-xxhdpi/ic_call_camera.png | Bin 0 -> 10525 bytes .../main/res/mipmap-xxhdpi/ic_call_close.png | Bin 0 -> 2180 bytes .../main/res/mipmap-xxhdpi/ic_call_follow.png | Bin 0 -> 6106 bytes .../main/res/mipmap-xxhdpi/ic_call_gift.png | Bin 0 -> 10926 bytes .../main/res/mipmap-xxhdpi/ic_call_money.png | Bin 0 -> 12616 bytes .../main/res/mipmap-xxhdpi/ic_call_msg.png | Bin 0 -> 10145 bytes .../main/res/mipmap-xxhdpi/ic_call_stop.png | Bin 0 -> 11073 bytes .../main/res/mipmap-xxhdpi/ic_call_video.png | Bin 0 -> 10578 bytes .../mipmap-xxhdpi/ic_call_video_select.png | Bin 0 -> 7791 bytes .../main/res/mipmap-xxhdpi/ic_home_auth.png | Bin 0 -> 8122 bytes .../res/mipmap-xxhdpi/ic_home_hot_man.png | Bin 0 -> 1538 bytes .../mipmap-xxhdpi/ic_home_hot_status_busy.png | Bin 0 -> 7461 bytes .../ic_home_hot_status_offine.png | Bin 0 -> 8126 bytes ...atus.png => ic_home_hot_status_online.png} | Bin 54 files changed, 2136 insertions(+), 130 deletions(-) create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/adapter/GiftListAdapter.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/bean/GiftBean.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/bean/MessageChatGiftContent.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/bean/MessageConsumeConfigBean.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/dialog/GiftDialog.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/dialog/TipsDialog.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/listener/OnDialogClickListener.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatReceiveGiftItemProvider.java delete mode 100644 OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java create mode 100644 OneToOne/src/main/res/drawable/bg_button.xml create mode 100644 OneToOne/src/main/res/drawable/bg_chat_gift.xml create mode 100644 OneToOne/src/main/res/drawable/bg_dialog_tip.xml create mode 100644 OneToOne/src/main/res/drawable/bg_dialog_tip_apply.xml create mode 100644 OneToOne/src/main/res/drawable/bg_dialog_tip_cancel.xml create mode 100644 OneToOne/src/main/res/drawable/bg_gift_select.xml create mode 100644 OneToOne/src/main/res/drawable/bg_gift_top_up.xml create mode 100644 OneToOne/src/main/res/drawable/bg_home_hot_cover.xml create mode 100644 OneToOne/src/main/res/layout/activity_call_video.xml create mode 100644 OneToOne/src/main/res/layout/dialog_tips1.xml create mode 100644 OneToOne/src/main/res/layout/item_gift.xml create mode 100644 OneToOne/src/main/res/layout/view_message_chat_receive_gift.xml create mode 100644 OneToOne/src/main/res/layout/view_message_input_gift.xml create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_audio.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_audio_select.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_camera.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_close.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_follow.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_gift.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_money.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_msg.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_stop.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_video.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_call_video_select.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_home_auth.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_home_hot_man.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_home_hot_status_busy.png create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_home_hot_status_offine.png rename OneToOne/src/main/res/mipmap-xxhdpi/{ic_home_hot_status.png => ic_home_hot_status_online.png} (100%) diff --git a/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java b/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java index 264445a4a..375fc1224 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java @@ -12,6 +12,7 @@ import com.shayu.onetoone.activity.fragments.message.ChatMessageFragment; import com.shayu.onetoone.activity.message.ChatActivity; import com.shayu.onetoone.bean.MessageChatTipsContent; import com.shayu.onetoone.provider.CustomConversationProvider; +import com.shayu.onetoone.provider.MessageChatReceiveGiftItemProvider; import com.shayu.onetoone.provider.MessageChatTipsItemProvider; import com.shayu.onetoone.utils.NeverCrashUtils; import com.yunbao.common.BuildConfig; @@ -81,6 +82,7 @@ public class AppContext extends CommonAppContext { RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext())); RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatTipsItemProvider(getApplicationContext())); + RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatReceiveGiftItemProvider(getApplicationContext())); String appKey = "pvxdm17jpd3hr"; boolean enablePush = true; diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java index b84dd9694..3299b6255 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java @@ -32,7 +32,7 @@ public class HotFragment extends BaseFragment { public void initView(View itemView) { recyclerView = itemView.findViewById(R.id.recyclerView); mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); - adapter=new HomeHotListAdapter(getContext()); + adapter = new HomeHotListAdapter(getContext()); recyclerView.setAdapter(adapter); mRefreshLayout.setNestedScrollingEnabled(false); mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext())); @@ -47,19 +47,24 @@ public class HotFragment extends BaseFragment { onConversationListLoadMore(); } }); + initData(); } + private void onConversationListLoadMore() { + mRefreshLayout.finishLoadMore(); } private void onConversationListRefresh(RefreshLayout refreshLayout) { - + initData(); + refreshLayout.finishRefresh(); } - private void initData(){ + + private void initData() { OTONetManager.getInstance(mContext) .getHomeHot(new HttpCallback>() { @Override public void onSuccess(List data) { - + adapter.setList(data); } @Override @@ -68,6 +73,7 @@ public class HotFragment extends BaseFragment { } }); } + @Override public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_hot, container, false); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java index f479be0a3..22990decc 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java @@ -1,6 +1,7 @@ package com.shayu.onetoone.activity.fragments.message; import android.annotation.SuppressLint; +import android.app.Dialog; import android.net.Uri; import android.os.Bundle; import android.util.Log; @@ -23,7 +24,12 @@ import com.makeramen.roundedimageview.RoundedImageView; import com.shayu.onetoone.R; import com.shayu.onetoone.bean.MessageChatTipsContent; import com.shayu.onetoone.bean.UserBean; +import com.shayu.onetoone.dialog.GiftDialog; +import com.shayu.onetoone.dialog.TipsDialog; +import com.shayu.onetoone.listener.OnDialogClickListener; +import com.shayu.onetoone.listener.OnSendMessageListener; import com.shayu.onetoone.manager.OTONetManager; +import com.shayu.onetoone.manager.SendMessageManager; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.base.HttpCallback; @@ -48,6 +54,7 @@ import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.Message; import io.rong.message.ImageMessage; +import io.rong.message.TextMessage; /** * 融云聊天UI @@ -55,11 +62,12 @@ import io.rong.message.ImageMessage; public class ChatMessageFragment extends AbsConversationFragment { Button mSendBtn; View mInputPanel; + EditText mEditText; ImageView img, call, video, gift; ProcessImageUtil cameraUtil; String targetId; Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE; - View audioLayout; + ViewGroup audioLayout; ImageView btnAudio; ImageView btnText; ImageView btnClose; @@ -75,6 +83,7 @@ public class ChatMessageFragment extends AbsConversationFragment { ImageView status; Button follow; + private String token; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { @@ -83,7 +92,7 @@ public class ChatMessageFragment extends AbsConversationFragment { initChat(); targetId = getActivity().getIntent().getStringExtra("targetId"); cameraUtil = new ProcessImageUtil(getActivity(), "com.shayu.onetoone.fileprovider"); - mSendBtn.setOnClickListener(v -> sendText()); + mRongExtension.setVisibility(View.VISIBLE); img.setOnClickListener(v -> cameraUtil.getImageByCamera()); initCamera(); @@ -104,12 +113,43 @@ public class ChatMessageFragment extends AbsConversationFragment { } }); }); + mSendBtn.setOnClickListener(v -> { + System.out.println("点击"); + SendMessageManager.sendMessageForText(targetId, mEditText.getText().toString(), new OnSendMessageListener() { + @Override + public void onSuccess(String token) { + super.onSuccess(token); + ChatMessageFragment.this.token = token; + sendText(); + + } + + @Override + public void onError(int status, String msg) { + super.onError(status, msg); + if (status == OnSendMessageListener.STATUS_NOT_PRICE) { + new TipsDialog(mContext) + .setTitle("餘額不足") + .setContent(String.format("文字聊天每條續消耗%s鑽,您可通過充值獲取更多鑽石,以便繼續聊天", msg)) + .setOnDialogClickListener(new OnDialogClickListener() { + + @Override + public void onApply(Dialog dialog) { + super.onApply(dialog); + } + }).showDialog(); + } else { + ToastUtil.show(msg); + } + } + }); + }); updateMyInfo(); } @Override public View getLayoutView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.rc_conversation_fragment,container,false); + return inflater.inflate(R.layout.rc_conversation_fragment, container, false); } @Override @@ -148,21 +188,51 @@ public class ChatMessageFragment extends AbsConversationFragment { assert mVoiceToggleBtn != null; mVoiceToggleBtn.setOnClickListener(v -> { - changeAudioLayout(); + SendMessageManager.sendMessageForAudio(targetId, new OnSendMessageListener() { + @Override + public void onSuccess(String token) { + super.onSuccess(token); + ChatMessageFragment.this.token = token; + changeAudioLayout(); + } + + @Override + public void onError(int status, String msg) { + super.onError(status, msg); + if (status == OnSendMessageListener.STATUS_NOT_PRICE) { + new TipsDialog(mContext) + .setTitle("餘額不足") + .setContent(String.format("聊天每條續消耗%s鑽,您可通過充值獲取更多鑽石,以便繼續聊天", msg)) + .setOnDialogClickListener(new OnDialogClickListener() { + + @Override + public void onApply(Dialog dialog) { + super.onApply(dialog); + } + }).showDialog(); + } else { + ToastUtil.show(msg); + } + } + }); + }); img = mInputPanel.findViewById(R.id.input_panel_image_btn); video = mInputPanel.findViewById(R.id.input_panel_video_btn); call = mInputPanel.findViewById(R.id.input_panel_call_btn); gift = mInputPanel.findViewById(R.id.input_panel_gift_btn); audioLayout = mInputPanel.findViewById(R.id.audio_layout); - btnAudio = mInputPanel.findViewById(R.id.audio_btn); - btnText = mInputPanel.findViewById(R.id.text_btn); - btnClose = mInputPanel.findViewById(R.id.close_btn); + audioLayout.addView(LayoutInflater.from(mContext).inflate(R.layout.view_message_input_audio, (ViewGroup) mInputPanel,false)); + btnAudio = audioLayout.findViewById(R.id.audio_btn); + btnText = audioLayout.findViewById(R.id.text_btn); + btnClose = audioLayout.findViewById(R.id.close_btn); + mEditText = audioLayout.findViewById(R.id.edit_btn); btnText.setOnClickListener(v -> changeAudioLayout()); btnClose.setOnClickListener(v -> changeAudioLayout()); btnAudio.setOnTouchListener(new View.OnTouchListener() { + @Override public boolean onTouch(View v, MotionEvent event) { float mOffsetLimit = 70.0F * v.getContext().getResources().getDisplayMetrics().density; @@ -194,8 +264,14 @@ public class ChatMessageFragment extends AbsConversationFragment { } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { - AudioRecordManager.getInstance().stopRecord(); + SendMessageManager.onCallSuccess(token, new OnSendMessageListener() { + @Override + public void onError(int status, String msg) { + super.onError(status, msg); + ToastUtil.show(msg); + } + }); } if (mRongExtension.getConversationIdentifier().getType().equals(Conversation.ConversationType.PRIVATE)) { @@ -206,7 +282,9 @@ public class ChatMessageFragment extends AbsConversationFragment { return true; } }); - + gift.setOnClickListener(v -> { + new GiftDialog(mContext).showDialog(); + }); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); @@ -216,21 +294,49 @@ public class ChatMessageFragment extends AbsConversationFragment { private void changeAudioLayout() { if (audioLayout.getVisibility() == View.VISIBLE) { audioLayout.setVisibility(View.GONE); + SendMessageManager.cancel(token); } else { audioLayout.setVisibility(View.VISIBLE); } } private void sendText() { - try { - Field field = mRongExtension.getInputPanel().getClass().getDeclaredField("mSendBtn"); - field.setAccessible(true); - Button send = (Button) field.get(mRongExtension.getInputPanel()); - assert send != null; - send.callOnClick(); - } catch (Exception e) { - throw new RuntimeException(e); - } + Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE; + TextMessage messageContent = TextMessage.obtain(mEditText.getText().toString()); + + Message message = Message.obtain(targetId, conversationType, messageContent); + + IMCenter.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { + + @Override + public void onAttached(Message message) { + + } + + @Override + public void onSuccess(Message message) { + SendMessageManager.onCallSuccess(token, new OnSendMessageListener() { + @Override + public void onError(int status, String msg) { + super.onError(status, msg); + ToastUtil.show(msg); + } + + @Override + public void onSuccess(String token) { + super.onSuccess(token); + ToastUtil.show(token); + mEditText.setText(""); + } + }); + } + + @Override + public void onError(Message message, RongIMClient.ErrorCode errorCode) { + + } + }); + } private void sendImage(File file) { diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java new file mode 100644 index 000000000..3fd04ab4c --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java @@ -0,0 +1,91 @@ +package com.shayu.onetoone.activity.message; + +import android.os.Bundle; +import android.util.Log; +import android.view.SurfaceView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.makeramen.roundedimageview.RoundedImageView; +import com.shayu.onetoone.R; +import com.shayu.onetoone.activity.AbsOTOActivity; +import com.shayu.onetoone.listener.OnCallStatusListener; + +public class CallVideoActivity extends AbsOTOActivity { + + private SurfaceView myView; + private SurfaceView targetView; + private ImageView callStop; + private ImageView gift; + private ImageView message; + private ImageView cameraCloseSwitch; + private ImageView cameraSwitch; + private ImageView micSwitch; + private ImageView money; + private RoundedImageView avatar; + private ImageView close; + private ImageView follow; + private TextView followText; + + private OnCallStatusListener onCallStatusListener; + + private String targetId; + + public void setOnCallStatusListener(OnCallStatusListener onCallStatusListener) { + this.onCallStatusListener = onCallStatusListener; + } + + @Override + protected int getLayoutId() { + return R.layout.activity_call_video; + } + + @Override + protected void main(Bundle savedInstanceState) { + initView(); + } + + private void initView() { + myView = findViewById(R.id.my_view); + targetView = findViewById(R.id.target_view); + callStop = findViewById(R.id.call_stop); + gift = findViewById(R.id.gift); + message = findViewById(R.id.message); + cameraCloseSwitch = findViewById(R.id.camera_close_switch); + cameraSwitch = findViewById(R.id.camera_switch); + micSwitch = findViewById(R.id.mic_switch); + money = findViewById(R.id.money); + avatar = findViewById(R.id.avatar); + close = findViewById(R.id.close); + follow = findViewById(R.id.follow); + followText = findViewById(R.id.follow_text); + // 为所有View设置点击事件监听器 + setClickListeners(); + } + + private void setClickListeners() { + // 为所有ImageView设置点击事件监听器 + callStop.setOnClickListener(onClickListener); + gift.setOnClickListener(onClickListener); + message.setOnClickListener(onClickListener); + cameraCloseSwitch.setOnClickListener(onClickListener); + cameraSwitch.setOnClickListener(onClickListener); + micSwitch.setOnClickListener(onClickListener); + money.setOnClickListener(onClickListener); + + // 为其他View设置点击事件监听器 + avatar.setOnClickListener(onClickListener); + close.setOnClickListener(onClickListener); + follow.setOnClickListener(onClickListener); + } + + private View.OnClickListener onClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + // 在这里编写点击事件的处理逻辑 + int id = v.getId(); + + } + }; +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/GiftListAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/GiftListAdapter.java new file mode 100644 index 000000000..b9ac260b4 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/GiftListAdapter.java @@ -0,0 +1,72 @@ +package com.shayu.onetoone.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.shayu.onetoone.R; +import com.shayu.onetoone.bean.GiftBean; +import com.yunbao.common.glide.ImgLoader; + +import java.util.List; + +public class GiftListAdapter extends RecyclerView.Adapter { + private Context mContext; + private List list; + + public GiftListAdapter(Context mContext) { + this.mContext = mContext; + } + + public void setList(List list) { + this.list = list; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_gift, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.setData(list.get(position), position); + } + + @Override + public int getItemCount() { + return list.size(); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + private ImageView giftIcon; + private TextView giftName; + private TextView money; + private View select; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + giftIcon = itemView.findViewById(R.id.gift_icon); + giftName = itemView.findViewById(R.id.gift_name); + money = itemView.findViewById(R.id.money); + select.findViewById(R.id.bg_select); + itemView.setOnClickListener(v -> { + select.setVisibility(View.VISIBLE); + }); + } + + private void setData(GiftBean giftBean, int position) { + giftName.setText(giftBean.getGiftname()); + money.setText(giftBean.getNeedcoin() + ""); + ImgLoader.display(itemView.getContext(), giftBean.getGifticon(), giftIcon); + select.setVisibility(View.GONE); + } + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java index 12b359f6e..f795efe9e 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java @@ -13,6 +13,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.makeramen.roundedimageview.RoundedImageView; import com.shayu.onetoone.R; import com.shayu.onetoone.bean.HomeItemBean; +import com.shayu.onetoone.utils.ConversationUtils; +import com.yunbao.common.glide.ImgLoader; import java.util.ArrayList; import java.util.List; @@ -40,7 +42,7 @@ public class HomeHotListAdapter extends RecyclerView.Adapter CREATOR = new Creator() { + @Override + public MessageChatGiftContent createFromParcel(Parcel in) { + return new MessageChatGiftContent(in); + } + + @Override + public MessageChatGiftContent[] newArray(int size) { + return new MessageChatGiftContent[size]; + } + }; + + @Override + public byte[] encode() { + JSONObject jsonObj = new JSONObject(); + try { + // 消息携带用户信息时, 自定义消息需添加下面代码 + if (getJSONUserInfo() != null) { + jsonObj.putOpt("user", getJSONUserInfo()); + } + // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 + if (getJsonMentionInfo() != null) { + jsonObj.putOpt("mentionedInfo", getJsonMentionInfo()); + } + // 将所有自定义消息的内容,都序列化至 json 对象中 + jsonObj.put("content", this.content); + jsonObj.put("title", this.title); + jsonObj.put("imageUrl", this.imageUrl); + } catch (JSONException e) { + } + + try { + return jsonObj.toString().getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return null; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + ParcelUtils.writeToParcel(dest, getExtra()); + ParcelUtils.writeToParcel(dest, content); + ParcelUtils.writeToParcel(dest, title); + ParcelUtils.writeToParcel(dest, imageUrl); + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/bean/MessageConsumeConfigBean.java b/OneToOne/src/main/java/com/shayu/onetoone/bean/MessageConsumeConfigBean.java new file mode 100644 index 000000000..55af17e57 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/bean/MessageConsumeConfigBean.java @@ -0,0 +1,47 @@ +package com.shayu.onetoone.bean; + +import com.google.gson.annotations.SerializedName; +import com.yunbao.common.bean.BaseModel; + +public class MessageConsumeConfigBean extends BaseModel { + @SerializedName("vodiePrice") + private int videoPrice;//视频扣费金额 + private int mp3Price;//音频扣费金额 + private int price;//消息扣费金额 + private int pingTime;//心跳时间,单位秒 + + public MessageConsumeConfigBean() { + } + + public int getVideoPrice() { + return videoPrice; + } + + public void setVideoPrice(int videoPrice) { + this.videoPrice = videoPrice; + } + + public int getMp3Price() { + return mp3Price; + } + + public void setMp3Price(int mp3Price) { + this.mp3Price = mp3Price; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public int getPingTime() { + return pingTime; + } + + public void setPingTime(int pingTime) { + this.pingTime = pingTime; + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/dialog/GiftDialog.java b/OneToOne/src/main/java/com/shayu/onetoone/dialog/GiftDialog.java new file mode 100644 index 000000000..3ce2d3317 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/dialog/GiftDialog.java @@ -0,0 +1,69 @@ +package com.shayu.onetoone.dialog; + +import android.content.Context; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.shayu.onetoone.R; +import com.shayu.onetoone.adapter.GiftListAdapter; +import com.shayu.onetoone.bean.GiftBean; +import com.shayu.onetoone.manager.OTONetManager; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.common.http.base.HttpCallback; + +import java.util.List; + +public class GiftDialog extends AbsDialogPopupWindow { + RecyclerView gifList; + GiftListAdapter mAdapter; + TextView money; + Button topUpBtn; + Button sendBtn; + + + public GiftDialog(@NonNull Context context) { + super(context); + } + + @Override + public void buildDialog(XPopup.Builder builder) { + + } + + @Override + public int bindLayoutId() { + return R.layout.view_message_input_gift; + } + + @Override + protected void onCreate() { + super.onCreate(); + gifList = findViewById(R.id.gift_list); + money = findViewById(R.id.money); + topUpBtn = findViewById(R.id.top_up_btn); + sendBtn = findViewById(R.id.send_btn); + + mAdapter = new GiftListAdapter(mContext); + gifList.setAdapter(mAdapter); + initData(); + } + + private void initData() { + OTONetManager.getInstance(mContext) + .getGiftList(new HttpCallback>() { + @Override + public void onSuccess(List data) { + mAdapter.setList(data); + } + + @Override + public void onError(String error) { + + } + }); + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/dialog/TipsDialog.java b/OneToOne/src/main/java/com/shayu/onetoone/dialog/TipsDialog.java new file mode 100644 index 000000000..6e9fda8c9 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/dialog/TipsDialog.java @@ -0,0 +1,82 @@ +package com.shayu.onetoone.dialog; + +import android.content.Context; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.XPopup; +import com.shayu.onetoone.R; +import com.shayu.onetoone.listener.OnDialogClickListener; +import com.yunbao.common.dialog.AbsDialogCenterPopupWindow; +import com.yunbao.common.utils.StringUtil; + +public class TipsDialog extends AbsDialogCenterPopupWindow { + private String title, content; + private OnDialogClickListener onDialogClickListener; + TextView mTitle,mContent; + Button mCancel,mApply; + + public TipsDialog(@NonNull Context context) { + super(context); + } + + public TipsDialog setTitle(String title) { + this.title = title; + return this; + } + + public TipsDialog setContent(String content) { + this.content = content; + return this; + } + + public TipsDialog setOnDialogClickListener(OnDialogClickListener onDialogClickListener) { + this.onDialogClickListener = onDialogClickListener; + return this; + } + + @Override + public void buildDialog(XPopup.Builder builder) { + + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_tips1; + } + + @Override + protected void onCreate() { + super.onCreate(); + mTitle=findViewById(R.id.title); + mContent=findViewById(R.id.content); + mCancel=findViewById(R.id.cancel); + mApply=findViewById(R.id.apply); + + if(StringUtil.isEmpty(title)){ + mTitle.setVisibility(GONE); + }else{ + mTitle.setText(title); + } + if(StringUtil.isEmpty(content)){ + mContent.setVisibility(GONE); + }else{ + mContent.setText(content); + } + mCancel.setOnClickListener(v -> { + if(onDialogClickListener!=null){ + onDialogClickListener.onCancel(dialog); + } + dismiss(); + }); + mApply.setOnClickListener(v ->{ + if(onDialogClickListener!=null){ + onDialogClickListener.onApply(dialog); + } + dismiss(); + }); + + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java new file mode 100644 index 000000000..7960e6614 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnCallStatusListener.java @@ -0,0 +1,11 @@ +package com.shayu.onetoone.listener; + +import android.view.SurfaceView; + +public abstract class OnCallStatusListener { + public abstract void onCallWait(SurfaceView localVideo); + + public abstract void onCallStart(String userId, SurfaceView remoteVideo); + + public abstract void onCallEnd(); +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnDialogClickListener.java b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnDialogClickListener.java new file mode 100644 index 000000000..759de8941 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnDialogClickListener.java @@ -0,0 +1,12 @@ +package com.shayu.onetoone.listener; + +import android.app.Dialog; + +public abstract class OnDialogClickListener { + public void onCancel(Dialog dialog){ + + } + public void onApply(Dialog dialog){ + + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java new file mode 100644 index 000000000..0aa7ea5b9 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/listener/OnSendMessageListener.java @@ -0,0 +1,14 @@ +package com.shayu.onetoone.listener; + +public abstract class OnSendMessageListener { + public static final int STATUS_NOT_PRICE = 0;//金额不够 + public static final int STATUS_ERROR = 1;//接口错误 + + + public void onSuccess(String token) { + + } + + public void onError(int status, String msg) { + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java new file mode 100644 index 000000000..664e0a1ba --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java @@ -0,0 +1,230 @@ +package com.shayu.onetoone.manager; + +import android.Manifest; +import android.view.SurfaceView; + +import com.blankj.utilcode.util.PermissionUtils; +import com.shayu.onetoone.listener.OnCallStatusListener; +import com.yunbao.common.manager.IMLoginManager; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import io.rong.calllib.IRongCallListener; +import io.rong.calllib.IRongReceivedCallListener; +import io.rong.calllib.RongCallClient; +import io.rong.calllib.RongCallCommon; +import io.rong.calllib.RongCallSession; +import io.rong.calllib.StartCameraCallback; +import io.rong.imlib.model.Conversation; + +public class CallClientManager { + public static CallClientManager manager; + + public static CallClientManager getManager() { + if (manager == null) { + manager = new CallClientManager(); + } + return manager; + } + + private CallClientManager() { + init(); + } + + private void init() { + RongCallClient.setReceivedCallListener(new CallMeListener()); + } + public void callVideo(String targetId, OnCallStatusListener statusListener) { + List userIds = new ArrayList<>(); + userIds.add(targetId); + RongCallClient.getInstance().setVoIPCallListener(new CallStatusListener(statusListener)); + RongCallClient.getInstance().startCall(Conversation.ConversationType.PRIVATE,targetId,userIds,null, RongCallCommon.CallMediaType.VIDEO,null); + } + + + + private static class CallMeListener implements IRongReceivedCallListener { + + @Override + public void onReceivedCall(RongCallSession callSession) { + + } + + @Override + public void onCheckPermission(RongCallSession callSession) { + PermissionUtils.permission(Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO).callback(new PermissionUtils.SimpleCallback() { + @Override + public void onGranted() { + RongCallClient.getInstance().onPermissionGranted(); + } + + @Override + public void onDenied() { + RongCallClient.getInstance().onPermissionDenied(); + } + }); + } + } + + + private static class CallStatusListener implements IRongCallListener { + OnCallStatusListener statusListener; + + public CallStatusListener(OnCallStatusListener statusListener) { + this.statusListener = statusListener; + } + + @Override + public void onCallIncoming(RongCallSession callSession, SurfaceView localVideo) { + + } + + /** + * 电话已拨出。 + * 主叫端拨出电话后,通过回调 onCallOutgoing 通知当前 call 的详细信息。 + * + * @param callSession 通话实体。 + * @param localVideo 本地 camera 信息。 + */ + @Override + public void onCallOutgoing(RongCallSession callSession, SurfaceView localVideo) { + statusListener.onCallWait(localVideo); + } + + /** + * 已建立通话。 + * 通话接通时,通过回调 onCallConnected 通知当前 call 的详细信息。 + * + * @param callSession 通话实体。 + * @param localVideo 本地 camera 信息。 + */ + @Override + public void onCallConnected(RongCallSession callSession, SurfaceView localVideo) { + + } + + /** + * 通话结束。 + * 通话中,对方挂断,己方挂断,或者通话过程网络异常造成的通话中断,都会回调 onCallDisconnected。 + * + * @param callSession 通话实体。 + * @param reason 通话中断原因。 + */ + @Override + public void onCallDisconnected(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) { + statusListener.onCallEnd(); + } + + @Override + public void onRemoteUserRinging(String userId) { + + } + + @Override + public void onRemoteUserAccept(String userId, RongCallCommon.CallMediaType mediaType) { + + } + + /** + * 被叫端加入通话。 + * 主叫端拨出电话,被叫端收到请求后,加入通话,回调 onRemoteUserJoined。 + * + * @param userId 加入用户的 id。
+ * @param mediaType 加入用户的媒体类型,audio or video。
+ * @param userType 加入用户的类型,1:正常用户,2:观察者。
+ * @param remoteVideo 加入用户者的 camera 信息。如果 userType为2,remoteVideo对象为空;
+ * 如果对端调用{@link RongCallClient#startCall(int, boolean, Conversation.ConversationType, String, List, List, RongCallCommon.CallMediaType, String, StartCameraCallback)} 或 + * {@link RongCallClient#acceptCall(String, int, boolean, StartCameraCallback)}开始的音视频通话,则可以使用如下设置改变对端视频流的镜像显示:
+ *
+         *                                            public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
+         *                                                 if (null != remoteVideo) {
+         *                                                     ((RongRTCVideoView) remoteVideo).setMirror( boolean);//观看对方视频流是否镜像处理
+         *                                                 }
+         *                                            }
+         *                                            
+ */ + @Override + public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) { + statusListener.onCallStart(userId,remoteVideo); + } + + @Override + public void onRemoteUserInvited(String userId, RongCallCommon.CallMediaType mediaType) { + + } + + /** + * 通话中的远端参与者离开。 + * 回调 onRemoteUserLeft 通知状态更新。 + * + * @param userId 远端参与者的 id。 + * @param reason 远端参与者离开原因。 + */ + @Override + public void onRemoteUserLeft(String userId, RongCallCommon.CallDisconnectedReason reason) { + + } + + @Override + public void onMediaTypeChanged(String userId, RongCallCommon.CallMediaType mediaType, SurfaceView video) { + + } + + @Override + public void onError(RongCallCommon.CallErrorCode errorCode) { + + } + + @Override + public void onRemoteCameraDisabled(String userId, boolean disabled) { + + } + + @Override + public void onRemoteMicrophoneDisabled(String userId, boolean disabled) { + + } + + @Override + public void onNetworkReceiveLost(String userId, int lossRate) { + + } + + @Override + public void onNetworkSendLost(int lossRate, int delay) { + + } + + @Override + public void onFirstRemoteVideoFrame(String userId, int height, int width) { + + } + + @Override + public void onFirstRemoteAudioFrame(String userId) { + + } + + @Override + public void onAudioLevelSend(String audioLevel) { + + } + + @Override + public void onAudioLevelReceive(HashMap audioLevel) { + + } + + @Override + public void onRemoteUserPublishVideoStream(String userId, String streamId, String tag, SurfaceView surfaceView) { + + } + + @Override + public void onRemoteUserUnpublishVideoStream(String userId, String streamId, String tag) { + + } + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java index 3ed2216b2..62dd851c1 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java @@ -6,9 +6,11 @@ import android.util.Log; import com.alibaba.fastjson.JSONObject; import com.shayu.onetoone.bean.AvatarBean; +import com.shayu.onetoone.bean.GiftBean; import com.shayu.onetoone.bean.GreetBean; import com.shayu.onetoone.bean.HomeItemBean; import com.shayu.onetoone.bean.JoinAnchorBean; +import com.shayu.onetoone.bean.MessageConsumeConfigBean; import com.shayu.onetoone.bean.OfficialNoticeBean; import com.shayu.onetoone.bean.SystemMessageBean; import com.shayu.onetoone.bean.TargetUserInfoBean; @@ -36,6 +38,7 @@ import io.rong.imlib.model.UserInfo; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; +import retrofit2.http.Query; /** * 网络管理类 使用参考{@link com.yunbao.common.http.live.LiveNetManager} @@ -363,7 +366,7 @@ public class OTONetManager { MultipartBody.Part uploadFile = createUploadFile(file); IMLoginModel userInfo = IMLoginManager.get(mContext).getUserInfo(); API.get().otoApi(mContext) - .updateFile(uploadFile,userInfo.getId()+"",userInfo.getToken()) + .updateFile(uploadFile, userInfo.getId() + "", userInfo.getToken()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer>() { @@ -383,6 +386,7 @@ public class OTONetManager { } }).isDisposed(); } + public void getMessageSystemLists(HttpCallback> callback) { API.get().otoApi(mContext) .getLists() @@ -406,8 +410,8 @@ public class OTONetManager { }).isDisposed(); } - public void getTargetUserInfoList(List ids,HttpCallback> callback) { - StringBuilder sb=new StringBuilder(); + public void getTargetUserInfoList(List ids, HttpCallback> callback) { + StringBuilder sb = new StringBuilder(); for (Integer id : ids) { sb.append(id).append(","); } @@ -432,7 +436,8 @@ public class OTONetManager { } }).isDisposed(); } - public void getTargetUserInfo(int toUid,HttpCallback callback) { + + public void getTargetUserInfo(int toUid, HttpCallback callback) { API.get().otoApi(mContext) .getTargetUserInfo(toUid) @@ -503,7 +508,8 @@ public class OTONetManager { } }).isDisposed(); } - public void getSystemMessageList(int type,HttpCallback> callback) { + + public void getSystemMessageList(int type, HttpCallback> callback) { API.get().otoApi(mContext) .getSystemMessageList(type) @@ -527,6 +533,79 @@ public class OTONetManager { }).isDisposed(); } + public void sendMessage(int tuid, + int type, + String giftId, + String msg, + String time, + int online, + String method, + HttpCallback callback) { + + API.get().otoApi(mContext) + .sendMessage(tuid, type, giftId, msg, time, online, method) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(model -> { + if (callback != null) { + callback.onSuccess(new HttpCallbackModel(model.getData().getCode(), model.getData().getMsg())); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + } + }).isDisposed(); + } + + public void getMessageConsumeConfig(String toUid, HttpCallback callback) { + + API.get().otoApi(mContext) + .getMessageConsumeConfig(toUid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel model) throws Exception { + if (callback != null) { + callback.onSuccess(model.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + } + }).isDisposed(); + } + + public void getGiftList(HttpCallback> callback) { + + API.get().otoApi(mContext) + .getGiftList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(model -> { + if (callback != null) { + callback.onSuccess(model.getData().getInfo()); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + } + }).isDisposed(); + } + private MultipartBody.Part createUploadFile(File file) { RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); return MultipartBody.Part.createFormData("file", file.getName(), requestBody); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java new file mode 100644 index 000000000..4ec765244 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/SendMessageManager.java @@ -0,0 +1,142 @@ +package com.shayu.onetoone.manager; + +import com.shayu.onetoone.bean.MessageConsumeConfigBean; +import com.shayu.onetoone.listener.OnSendMessageListener; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.http.base.HttpCallback; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class SendMessageManager { + private static final Map cache = new HashMap<>(); + + public static void sendMessageForAudio(String toUid,OnSendMessageListener listener){ + SendData sendData = new SendData(Integer.parseInt(toUid), + 1, + "not", + "录音消息", + "1", + 1); + send(sendData, listener); + } + public static void sendMessageForText(String toUid, String text, OnSendMessageListener messageListener) { + SendData sendData = new SendData(Integer.parseInt(toUid), + 1, + "not", + text, + "1", + 1); + send(sendData, messageListener); + } + + private static void send(SendData sendData, OnSendMessageListener messageListener) { + OTONetManager.getInstance(null) + .sendMessage(sendData.toUid, + sendData.type, + sendData.giftId, + sendData.content, + sendData.time, + sendData.online, + "before", + new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + if (data.getCode() != 0) { + OTONetManager.getInstance(null) + .getMessageConsumeConfig(sendData.toUid + "", new HttpCallback() { + @Override + public void onSuccess(MessageConsumeConfigBean data) { + String msg; + if (sendData.type == 2) { + msg = data.getVideoPrice() + ""; + } else if (sendData.type == 5) { + msg = data.getMp3Price() + ""; + } else { + msg = data.getPrice() + ""; + } + messageListener.onError(OnSendMessageListener.STATUS_NOT_PRICE, msg); + } + + @Override + public void onError(String error) { + + } + }); + } else { + String token = UUID.randomUUID().toString(); + cache.put(token, sendData); + messageListener.onSuccess(token); + } + + } + + @Override + public void onError(String error) { + messageListener.onError(OnSendMessageListener.STATUS_ERROR, error); + } + } + ); + } + + public static void onCallSuccess(String token, OnSendMessageListener listener) { + if (cache.containsKey(token)) { + SendData sendData = cache.get(token); + assert sendData != null; + OTONetManager.getInstance(null) + .sendMessage(sendData.toUid, + sendData.type, + sendData.giftId, + sendData.content, + sendData.time, + sendData.online, + "after", + new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel sd) { + if (sd.getCode() != 0) { + listener.onSuccess(sd.getMsg()); + } else { + cache.remove(token); + listener.onSuccess(null); + } + + } + + @Override + public void onError(String error) { + listener.onError(OnSendMessageListener.STATUS_ERROR, error); + } + } + ); + } else { + if (listener != null) { + listener.onError(OnSendMessageListener.STATUS_ERROR, "消息发送异常"); + } + } + } + + public static void cancel(String token) { + cache.remove(token); + } + + public static class SendData { + private int toUid; + private int type; + private String giftId; + private String content; + private String time; + private int online; + + public SendData(int toUid, int type, String giftId, String content, String time, int online) { + this.toUid = toUid; + this.type = type; + this.giftId = giftId; + this.content = content; + this.time = time; + this.online = online; + } + } + +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java index 8f235b327..0f3589180 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java @@ -1,9 +1,11 @@ package com.shayu.onetoone.network; import com.shayu.onetoone.bean.AvatarBean; +import com.shayu.onetoone.bean.GiftBean; import com.shayu.onetoone.bean.GreetBean; import com.shayu.onetoone.bean.HomeItemBean; import com.shayu.onetoone.bean.JoinAnchorBean; +import com.shayu.onetoone.bean.MessageConsumeConfigBean; import com.shayu.onetoone.bean.OfficialNoticeBean; import com.shayu.onetoone.bean.SystemMessageBean; import com.shayu.onetoone.bean.TargetUserInfoBean; @@ -30,7 +32,6 @@ import retrofit2.http.Query; public interface OneToOneApi { /** * 用户手机号登录 - * */ @FormUrlEncoded @POST("/api/public/?service=Login.userLogin") @@ -46,63 +47,94 @@ public interface OneToOneApi { * 用户手机号登录 */ @GET("/api/public/?service=Friendappinfos.getInfo") - Observable> getBaseInfos(@Query("login")int login); + Observable> getBaseInfos(@Query("login") int login); @GET("/api/public/?service=Home.getRandJoinAnchor") Observable>> getRandJoinAnchor(); + @GET("/api/public/?service=Home.getCustomerService") Observable>> getCustomerService(); + @GET("/api/public/?service=Login.userLoginByThird") - Observable> userLoginByThird(@Query("user_id")String uid, - @Query("openid") String openId, - @Query("admin_id") String promCode, - @Query("uuid_Device") String uuid, - @Query("nicename") String nickName, - @Query("avatar") String avatar, - @Query("app_source")String source, - @Query("source")String devices, - @Query("sign")String sign, - @Query("lastlogindevice")String lastlogindevice, - @Query("type") String type, - @Query("pushid")String pushid + Observable> userLoginByThird(@Query("user_id") String uid, + @Query("openid") String openId, + @Query("admin_id") String promCode, + @Query("uuid_Device") String uuid, + @Query("nicename") String nickName, + @Query("avatar") String avatar, + @Query("app_source") String source, + @Query("source") String devices, + @Query("sign") String sign, + @Query("lastlogindevice") String lastlogindevice, + @Query("type") String type, + @Query("pushid") String pushid ); @GET("/api/public/?service=Friendappinfos.getText") Observable>> getMessageMoreGreetConfig(); + @GET("/api/public/?service=Friendappinfos.addText") - Observable> addMoreGreetConfig( @Query("status")String status, - @Query("content")String content, - @Query("type")String type); + Observable> addMoreGreetConfig(@Query("status") String status, + @Query("content") String content, + @Query("type") String type); + @GET("/api/public/?service=Friendappinfos.editText") - Observable> setMoreGreetConfig( @Query("id")String id, - @Query("status")String status, - @Query("content")String content, - @Query("type")String type); + Observable> setMoreGreetConfig(@Query("id") String id, + @Query("status") String status, + @Query("content") String content, + @Query("type") String type); + @GET("/api/public/?service=Friendappinfos.delText") - Observable> removeMoreGreetConfig( @Query("id")String id); + Observable> removeMoreGreetConfig(@Query("id") String id); + @GET("/api/public/?service=Friendappinfos.cleanText") Observable> cleanMoreGreetConfig(); + @GET("/api/public/?service=Friendappinfos.isHolle") Observable> getGreetConfigStatus(); + @GET("/api/public/?service=Friendappinfos.setTextStatus") - Observable> setGreetConfigGreet( @Query("id")String id, @Query("status")String status); + Observable> setGreetConfigGreet(@Query("id") String id, @Query("status") String status); + @Multipart @POST("/api/public/?service=Friendappinfos.updateAvatar") - Observable> updateFile(@Part MultipartBody.Part file,@Query("uid")String uid,@Query("token")String token); + Observable> updateFile(@Part MultipartBody.Part file, @Query("uid") String uid, @Query("token") String token); @GET("/api/public/?service=Message.getLists") Observable>> getLists(); @GET("/api/public/?service=Friendappinfos.getOtherInfo") - Observable> getTargetUserInfo(@Query("tuid")int id); + Observable> getTargetUserInfo(@Query("tuid") int id); + @GET("/api/public/?service=Friendappinfos.getOtherList") - Observable>> getTargetUserInfoList(@Query("ids")String ids); + Observable>> getTargetUserInfoList(@Query("ids") String ids); + @GET("/api/public/?service=Friendappuser.hot") Observable>> getHomeHot(); + @GET("/api/public/?service=Friendappuser.recommend") Observable>> getHomeRecommend(); + @GET("/api/public/?service=Message.getListInfo") - Observable>> getSystemMessageList(@Query("type")int type); + Observable>> getSystemMessageList(@Query("type") int type); + + @GET("/api/public/?service=Friendappmsg.sendAfter") + Observable>> sendMessage( + @Query("tuid") int tuid, + @Query("type") int type, + @Query("gift_id") String giftId, + @Query("msg") String msg, + @Query("time") String time, + @Query("online") int online, + @Query("method") String method + ); + + @GET("/api/public/?service=Friendappmsg.getConfig") + Observable> getMessageConsumeConfig(@Query("tuid") String toUid); + + @GET("/api/public/?service=Friendappmsg.giftList") + Observable>> getGiftList(); + } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatReceiveGiftItemProvider.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatReceiveGiftItemProvider.java new file mode 100644 index 000000000..faeb30daa --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatReceiveGiftItemProvider.java @@ -0,0 +1,57 @@ +package com.shayu.onetoone.provider; + +import android.content.Context; +import android.text.Spannable; +import android.view.ViewGroup; + +import com.shayu.onetoone.R; +import com.shayu.onetoone.bean.MessageChatGiftContent; +import com.shayu.onetoone.bean.MessageChatGiftContent; +import com.yunbao.common.glide.ImgLoader; + +import java.util.List; + +import io.rong.imkit.conversation.messgelist.provider.BaseMessageItemProvider; +import io.rong.imkit.model.UiMessage; +import io.rong.imkit.widget.adapter.IViewProviderListener; +import io.rong.imkit.widget.adapter.ViewHolder; +import io.rong.imlib.model.MessageContent; + +public class MessageChatReceiveGiftItemProvider extends BaseMessageItemProvider { + private Context mContext; + + public MessageChatReceiveGiftItemProvider(Context mContext) { + this.mContext = mContext; + mConfig.showPortrait = false; + mConfig.showSummaryWithName = false; + mConfig.showContentBubble = false; + mConfig.centerInHorizontal = true; + } + + @Override + protected ViewHolder onCreateMessageContentViewHolder(ViewGroup parent, int viewType) { + return ViewHolder.createViewHolder(mContext, parent, R.layout.view_message_chat_receive_gift); + } + + @Override + protected void bindMessageContentViewHolder(ViewHolder holder, ViewHolder parentHolder, MessageChatGiftContent messageChatGiftContent, UiMessage uiMessage, int position, List list, IViewProviderListener listener) { + holder.setText(R.id.title, messageChatGiftContent.getTitle()); + holder.setText(R.id.description, messageChatGiftContent.getContent()); + ImgLoader.display(mContext, messageChatGiftContent.getImageUrl(), holder.getView(R.id.giftIcon)); + } + + @Override + protected boolean onItemClick(ViewHolder holder, MessageChatGiftContent messageChatGiftContent, UiMessage uiMessage, int position, List list, IViewProviderListener listener) { + return false; + } + + @Override + protected boolean isMessageViewType(MessageContent messageContent) { + return messageContent instanceof MessageChatGiftContent; + } + + @Override + public Spannable getSummarySpannable(Context context, MessageChatGiftContent messageChatGiftContent) { + return null; + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java deleted file mode 100644 index 361ea9f11..000000000 --- a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.shayu.onetoone.provider; - -import android.content.Context; - -import io.rong.imlib.model.Message; -import io.rong.imlib.model.MessageContent; -import io.rong.message.MessageHandler; - -public class MessageChatTipHandler extends MessageHandler { - public MessageChatTipHandler(Context context) { - super(context); - } - - @Override - public void decodeMessage(Message message, MessageContent content) { - - } - - @Override - public void encodeMessage(Message message) { - - } -} diff --git a/OneToOne/src/main/res/drawable/bg_button.xml b/OneToOne/src/main/res/drawable/bg_button.xml new file mode 100644 index 000000000..61c18dbb6 --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_button.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_chat_gift.xml b/OneToOne/src/main/res/drawable/bg_chat_gift.xml new file mode 100644 index 000000000..b4a63db23 --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_chat_gift.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_dialog_tip.xml b/OneToOne/src/main/res/drawable/bg_dialog_tip.xml new file mode 100644 index 000000000..44e6b456f --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_dialog_tip.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_dialog_tip_apply.xml b/OneToOne/src/main/res/drawable/bg_dialog_tip_apply.xml new file mode 100644 index 000000000..1ce07ca26 --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_dialog_tip_apply.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_dialog_tip_cancel.xml b/OneToOne/src/main/res/drawable/bg_dialog_tip_cancel.xml new file mode 100644 index 000000000..df3d3961b --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_dialog_tip_cancel.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_gift_select.xml b/OneToOne/src/main/res/drawable/bg_gift_select.xml new file mode 100644 index 000000000..aec332c9e --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_gift_select.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_gift_top_up.xml b/OneToOne/src/main/res/drawable/bg_gift_top_up.xml new file mode 100644 index 000000000..ae032536c --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_gift_top_up.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_home_hot_cover.xml b/OneToOne/src/main/res/drawable/bg_home_hot_cover.xml new file mode 100644 index 000000000..b1989d53a --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_home_hot_cover.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/activity_call_video.xml b/OneToOne/src/main/res/layout/activity_call_video.xml new file mode 100644 index 000000000..92b34aba1 --- /dev/null +++ b/OneToOne/src/main/res/layout/activity_call_video.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/dialog_tips1.xml b/OneToOne/src/main/res/layout/dialog_tips1.xml new file mode 100644 index 000000000..fcd2980ed --- /dev/null +++ b/OneToOne/src/main/res/layout/dialog_tips1.xml @@ -0,0 +1,58 @@ + + + + + + + + + +