Merge remote-tracking branch 'origin/dev_6.5.5_语聊' into dev_6.5.5_语聊

This commit is contained in:
hch
2023-10-18 14:33:13 +08:00
12 changed files with 1072 additions and 157 deletions

View File

@@ -21,6 +21,7 @@ import com.shayu.onetoone.activity.fragments.MyFragment;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.event.MessageMsgBusEvent;
import com.shayu.onetoone.manager.CallClientManager;
import com.shayu.onetoone.manager.OTONetManager;
import com.shayu.onetoone.manager.RouteManager;
import com.yunbao.common.CommonAppConfig;
@@ -114,6 +115,7 @@ public class MainActivity extends AbsOTOActivity {
Bus.get().post(new MessageMsgBusEvent(MessageMsgBusEvent.TYPE_UPDATE_SYSTEM));
}
});
CallClientManager.getManager();
}
@Override

View File

@@ -1,21 +1,60 @@
package com.shayu.onetoone.activity.message;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.lzf.easyfloat.EasyFloat;
import com.lzf.easyfloat.enums.ShowPattern;
import com.lzf.easyfloat.interfaces.OnFloatCallbacks;
import com.makeramen.roundedimageview.RoundedImageView;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.AbsOTOActivity;
import com.shayu.onetoone.dialog.GiftDialog;
import com.shayu.onetoone.listener.OnCallStatusListener;
import com.shayu.onetoone.manager.CallClientManager;
import com.shayu.onetoone.manager.RouteManager;
import com.shayu.onetoone.utils.ConversationUtils;
import com.yunbao.common.utils.DpUtil;
import com.yunbao.common.utils.ToastUtil;
import java.util.HashMap;
import io.rong.calllib.CallUserProfile;
import io.rong.calllib.IRongCallListener;
import io.rong.calllib.RongCallClient;
import io.rong.calllib.RongCallCommon;
import io.rong.calllib.RongCallSession;
import io.rong.calllib.StartIncomingPreviewCallback;
@Route(path = RouteManager.ACTIVITY_CALL_VIDEO)
public class CallVideoActivity extends AbsOTOActivity {
private SurfaceView myView;
private SurfaceView targetView;
private ViewGroup myView;
private ViewGroup targetView;
private ViewGroup callLayout;
private ViewGroup rootView;
private View buttonView;
private ImageView callStop;
private ImageView gift;
private ImageView message;
@@ -31,35 +70,98 @@ public class CallVideoActivity extends AbsOTOActivity {
private OnCallStatusListener onCallStatusListener;
private String targetId;
private String callId;
private String model;
public void setOnCallStatusListener(OnCallStatusListener onCallStatusListener) {
this.onCallStatusListener = onCallStatusListener;
}
@Override
protected int getLayoutId() {
return R.layout.activity_call_video;
}
@Override
protected boolean onCreate() {
return false;
}
@Override
protected void main(Bundle savedInstanceState) {
initView();
Bundle bundle = getIntent().getBundleExtra("bundle");
if (bundle == null) {
finish();
return;
}
targetId = bundle.getString("targetId");
callId = bundle.getString("callId");
model = bundle.getString("model");
onCallStatusListener = new CallStatusListener();
CallClientManager.getManager().addOnVoIPCallListener(onCallStatusListener);
if (!EasyFloat.isShow("call")) {
RongCallClient.getInstance()
.startIncomingPreview(
new StartIncomingPreviewCallback() {
@Override
public void onDone(boolean isFront, SurfaceView localVideo) {
myView.removeAllViews();
myView.addView(localVideo);
}
@Override
public void onError(int errorCode) {
}
});
}
}
@Override
protected void onResume() {
super.onResume();
if (EasyFloat.isShow("call") && CallClientManager.getManager().getRemoteVideo(targetId) != null) {
callLayout.setVisibility(View.GONE);
EasyFloat.getFloatView("call").setOnClickListener(null);
((ViewGroup) EasyFloat.getFloatView("call").getParent()).removeAllViews();
EasyFloat.dismiss("call");
myView.removeAllViews();
new Handler(Looper.getMainLooper())
.postDelayed(() -> {
SurfaceView surfaceView = CallClientManager.getManager().getRemoteVideo(targetId);
surfaceView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
myView.addView(surfaceView);
myView.addView(buttonView);
targetView.addView(CallClientManager.getManager().getLocalVideo());
}, 300);
}
}
private void initView() {
rootView = findViewById(R.id.rootView);
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);
callLayout = findViewById(R.id.rc_voip_two_btn);
buttonView = LayoutInflater.from(mContext).inflate(R.layout.view_call_video_item, rootView, false);
initButton(buttonView);
// 为所有View设置点击事件监听器
setClickListeners();
}
private void initButton(View itemView) {
callStop = itemView.findViewById(R.id.call_stop);
gift = itemView.findViewById(R.id.gift);
message = itemView.findViewById(R.id.message);
cameraCloseSwitch = itemView.findViewById(R.id.camera_close_switch);
cameraSwitch = itemView.findViewById(R.id.camera_switch);
micSwitch = itemView.findViewById(R.id.mic_switch);
money = itemView.findViewById(R.id.money);
avatar = itemView.findViewById(R.id.avatar);
close = itemView.findViewById(R.id.close);
follow = itemView.findViewById(R.id.follow);
followText = itemView.findViewById(R.id.follow_text);
// 为所有View设置点击事件监听器
setClickListeners();
}
@@ -78,14 +180,191 @@ public class CallVideoActivity extends AbsOTOActivity {
avatar.setOnClickListener(onClickListener);
close.setOnClickListener(onClickListener);
follow.setOnClickListener(onClickListener);
findViewById(R.id.rc_voip_call_answer_btn).setOnClickListener(onClickListener);
findViewById(R.id.rc_voip_call_hang_up).setOnClickListener(onClickListener);
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
private void accept() {
callLayout.setVisibility(View.GONE);
CallClientManager.getManager().acceptCall(targetId);
}
private void closeCamera() {
RongCallClient.getInstance().setEnableLocalVideo(!RongCallClient.getInstance().isLocalVideoEnabled());
cameraCloseSwitch.setImageResource(RongCallClient.getInstance().isLocalAudioEnabled() ? R.mipmap.ic_call_video_select : R.mipmap.ic_call_video);
if (RongCallClient.getInstance().isLocalVideoEnabled()) {
targetView.setVisibility(View.VISIBLE);
} else {
targetView.setVisibility(View.INVISIBLE);
}
}
private void switchCamera() {
RongCallClient.getInstance().switchCamera();
}
private void switchAudio() {
RongCallClient.getInstance().setEnableLocalAudio(!RongCallClient.getInstance().isLocalAudioEnabled());
ToastUtil.show("麦克风状态:" + RongCallClient.getInstance().isLocalAudioEnabled());
micSwitch.setImageResource(RongCallClient.getInstance().isLocalAudioEnabled() ? R.mipmap.ic_call_audio_select : R.mipmap.ic_call_audio);
}
private void showWindow(boolean toChatView) {
CallClientManager.getManager().getRemoteVideo(targetId).setTag(getIntent().getBundleExtra("bundle"));
myView.removeAllViews();
targetView.removeAllViews();
finish();
CallClientManager.getManager().getRemoteVideo(targetId).setLayoutParams(new ViewGroup.LayoutParams(DpUtil.dp2px(114), DpUtil.dp2px(164)));
EasyFloat.with(this)
.setLayout(CallClientManager.getManager().getRemoteVideo(targetId))
.setShowPattern(ShowPattern.FOREGROUND)
.setTag("call")
.setDragEnable(true)
.setBorder()
.registerCallbacks(new OnFloatCallbacks() {
OnCallStatusListener windowListener;
@Override
public void createdResult(boolean b, @Nullable String s, @Nullable View view) {
}
@Override
public void show(@NonNull View view) {
view.setOnClickListener(v -> {
RouteManager.forwardActivity(RouteManager.ACTIVITY_CALL_VIDEO, (Bundle) v.getTag());
});
windowListener = new WindowCallStatusListener();
CallClientManager.getManager().addOnVoIPCallListener(windowListener);
}
@Override
public void hide(@NonNull View view) {
}
@Override
public void dismiss() {
CallClientManager.getManager().removeOnVoIPCallListener(windowListener);
}
@Override
public void touchEvent(@NonNull View view, @NonNull MotionEvent motionEvent) {
}
@Override
public void drag(@NonNull View view, @NonNull MotionEvent motionEvent) {
}
@Override
public void dragEnd(@NonNull View view) {
}
}).show();
if (toChatView) {
ConversationUtils.startConversation(mContext, targetId);
}
}
private final View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// 在这里编写点击事件的处理逻辑
int id = v.getId();
if (id == R.id.rc_voip_call_answer_btn) {
accept();
} else if (id == R.id.call_stop || id == R.id.rc_voip_call_hang_up) {
CallClientManager.getManager().endCall();
} else if (id == R.id.gift) {
new GiftDialog(mContext)
.setTargetId(targetId)
.showDialog();
} else if (id == R.id.camera_close_switch) {
closeCamera();
} else if (id == R.id.camera_switch) {
switchCamera();
} else if (id == R.id.mic_switch) {
switchAudio();
} else if (id == R.id.close) {
showWindow(false);
} else if (id == R.id.message) {
showWindow(true);
}
}
};
private class CallStatusListener extends OnCallStatusListener {
@Override
public void onCallWait(SurfaceView surfaceView) {
myView.removeAllViews();
myView.addView(surfaceView);
}
@Override
public void onCallStart(String userId, SurfaceView surfaceView) {
surfaceView.setZOrderOnTop(false);
surfaceView.setZOrderMediaOverlay(false);
surfaceView.invalidate();
surfaceView.setOnClickListener(v -> {
surfaceView.setZOrderOnTop(false);
surfaceView.setZOrderMediaOverlay(false);
surfaceView.invalidate();
});
if (model.equals(CallClientManager.VIDEO_CALL)) {
targetView.removeAllViews();
targetView.addView(surfaceView);
myView.removeAllViews();
myView.addView(CallClientManager.getManager().getLocalVideo());
} else {
myView.removeAllViews();
myView.addView(surfaceView);
targetView.removeAllViews();
targetView.addView(CallClientManager.getManager().getLocalVideo());
myView.addView(buttonView);
}
}
@Override
public void onCallEnd() {
finish();
}
@Override
public void onStartFirstFrame() {
/* CallClientManager.getManager().getRemoteVideo(targetId).setZOrderOnTop(false);
CallClientManager.getManager().getRemoteVideo(targetId).setZOrderMediaOverlay(false);
CallClientManager.getManager().getRemoteVideo(targetId).invalidate();*/
}
}
private class WindowCallStatusListener extends OnCallStatusListener {
@Override
public void onCallWait(SurfaceView surfaceView) {
}
@Override
public void onCallStart(String userId, SurfaceView surfaceView) {
}
@Override
public void onCallEnd() {
EasyFloat.dismiss("call");
}
@Override
public void onStartFirstFrame() {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
CallClientManager.getManager().removeOnVoIPCallListener(onCallStatusListener);
}
}