package io.rong.callkit; import android.Manifest; import android.annotation.TargetApi; import android.content.Intent; import android.content.pm.PackageManager; import android.media.AudioManager; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import io.rong.calllib.CallUserProfile; import io.rong.calllib.RongCallClient; import io.rong.calllib.RongCallCommon; import io.rong.calllib.RongCallSession; import io.rong.common.RLog; import io.rong.imkit.RongContext; import io.rong.imkit.RongIM; import io.rong.imkit.utilities.PermissionCheckUtil; import io.rong.imkit.widget.AsyncImageView; import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.Discussion; import io.rong.imlib.model.UserInfo; import io.rong.message.InformationNotificationMessage; public class MultiVideoCallActivity extends BaseCallActivity { private static final String TAG = "VoIPMultiVideoCallActivity"; RongCallSession callSession; SurfaceView localView; FrameLayout localViewContainer; LinearLayout remoteViewContainer; LinearLayout remoteViewContainer1; LinearLayout remoteViewContainer2; LinearLayout topContainer; LinearLayout waitingContainer; LinearLayout bottomButtonContainer; LinearLayout participantPortraitContainer; LayoutInflater inflater; ImageView minimizeButton; ImageView addButton; ImageView switchCameraButton; int remoteUserViewWidth; boolean isFullScreen = false; boolean startForCheckPermissions = false; String localViewUserId; @Override @TargetApi(23) protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rc_voip_multi_video_call); Intent intent = getIntent(); startForCheckPermissions = intent.getBooleanExtra("checkPermissions", false); RongContext.getInstance().getEventBus().register(this); if (!requestCallPermissions(RongCallCommon.CallMediaType.VIDEO, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)) { return; } initViews(); setupIntent(); } @Override protected void onNewIntent(Intent intent) { startForCheckPermissions = intent.getBooleanExtra("checkPermissions", false); if (!requestCallPermissions(RongCallCommon.CallMediaType.VIDEO, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)) { return; } initViews(); setupIntent(); super.onNewIntent(intent); } @TargetApi(23) @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: Map<String, Integer> mapPermissions = new HashMap<>(); mapPermissions.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED); mapPermissions.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED); for (int i = 0; i < permissions.length; i++) { mapPermissions.put(permissions[i], grantResults[i]); } if (mapPermissions.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && mapPermissions.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { if (startForCheckPermissions) { startForCheckPermissions = false; RongCallClient.getInstance().onPermissionGranted(); } else { initViews(); setupIntent(); } } else { if (startForCheckPermissions) { startForCheckPermissions = false; RongCallClient.getInstance().onPermissionDenied(); } else { finish(); } } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS) { if (PermissionCheckUtil.checkPermissions(this, VIDEO_CALL_PERMISSIONS)) { if (startForCheckPermissions) { startForCheckPermissions = false; RongCallClient.getInstance().onPermissionGranted(); } else { initViews(); setupIntent(); } } else { if (startForCheckPermissions) { startForCheckPermissions = false; RongCallClient.getInstance().onPermissionDenied(); } else { finish(); } } } else { if (callSession.getEndTime() != 0) { finish(); return; } setShouldShowFloat(true); if (resultCode == RESULT_OK) { ArrayList<String> invited = data.getStringArrayListExtra("invited"); RongCallClient.getInstance().addParticipants(callSession.getCallId(), invited); } } } @Override protected void onDestroy() { RongContext.getInstance().getEventBus().unregister(this); super.onDestroy(); } @Override public String onSaveFloatBoxState(Bundle bundle) { super.onSaveFloatBoxState(bundle); String intentAction = getIntent().getAction(); bundle.putString("localViewUserId", localViewUserId); bundle.putString("callAction", RongCallAction.ACTION_RESUME_CALL.getName()); bundle.putInt("mediaType", RongCallCommon.CallMediaType.VIDEO.getValue()); return intentAction; } @Override public void onRestoreFloatBox(Bundle bundle) { super.onRestoreFloatBox(bundle); callSession = RongCallClient.getInstance().getCallSession(); if (bundle != null) { RongCallAction callAction = RongCallAction.valueOf(bundle.getString("callAction")); if (!callAction.equals(RongCallAction.ACTION_RESUME_CALL)) return; localViewUserId = bundle.getString("localViewUserId"); if (callSession == null){ setShouldShowFloat(false); finish(); } boolean isLocalViewExist = false; for (CallUserProfile profile : callSession.getParticipantProfileList()) { if (profile.getUserId().equals(localViewUserId)) { isLocalViewExist = true; break; } } remoteViewContainer1.removeAllViews(); remoteViewContainer2.removeAllViews(); for (CallUserProfile profile : callSession.getParticipantProfileList()) { String currentUserId = RongIMClient.getInstance().getCurrentUserId(); if (profile.getUserId().equals(localViewUserId) || (!isLocalViewExist && profile.getUserId().equals(currentUserId))) { localView = profile.getVideoView(); if (localView.getParent() != null) { ((ViewGroup) localView.getParent()).removeAllViews(); } localViewUserId = profile.getUserId(); localView.setZOrderOnTop(false); localView.setZOrderMediaOverlay(false); localViewContainer.addView(localView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); localView.setTag(localViewUserId); TextView userNameView = (TextView) topContainer.findViewById(R.id.rc_voip_user_name); userNameView.setTag(localViewUserId + "name"); UserInfo userInfo = RongContext.getInstance().getUserInfoFromCache(localViewUserId); if (userInfo != null) { userNameView.setText(userInfo.getName()); } else { userNameView.setText(localViewUserId); } } } onCallConnected(callSession, null); } } @Override public void onCallOutgoing(final RongCallSession callSession, SurfaceView localVideo) { super.onCallOutgoing(callSession, localVideo); this.callSession = callSession; RongCallClient.getInstance().setEnableLocalAudio(true); RongCallClient.getInstance().setEnableLocalVideo(true); localView = localVideo; onOutgoingCallRinging(); localViewContainer.addView(localView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); localViewUserId = RongIMClient.getInstance().getCurrentUserId(); localView.setTag(localViewUserId); } @Override public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, SurfaceView remoteVideo) { stopRing(); View singleRemoteView = remoteViewContainer.findViewWithTag(userId + "view"); if (singleRemoteView == null) { singleRemoteView = addSingleRemoteView(userId); } addRemoteVideo(singleRemoteView, remoteVideo, userId); singleRemoteView.findViewById(R.id.user_status).setVisibility(View.GONE); } @Override public void onRemoteUserLeft(String userId, RongCallCommon.CallDisconnectedReason reason) { //incoming状态,localViewUserId为空 if (localViewUserId == null) return; if (localViewUserId.equals(userId)) { localViewContainer.removeAllViews(); String currentUserId = RongIMClient.getInstance().getCurrentUserId(); FrameLayout remoteVideoView = (FrameLayout) remoteViewContainer.findViewWithTag(currentUserId); localView = (SurfaceView) remoteVideoView.getChildAt(0); remoteVideoView.removeAllViews(); localViewContainer.addView(localView); TextView topUserNameView = (TextView) topContainer.findViewById(R.id.rc_voip_user_name); topUserNameView.setTag(currentUserId + "name"); UserInfo userInfo = RongContext.getInstance().getUserInfoFromCache(currentUserId); if (userInfo != null) { topUserNameView.setText(userInfo.getName()); } else { topUserNameView.setText(currentUserId); } localViewUserId = currentUserId; } View singleRemoteView = remoteViewContainer.findViewWithTag(userId + "view"); if (singleRemoteView == null) return; LinearLayout container = (LinearLayout) singleRemoteView.getParent(); container.removeView(singleRemoteView); if (container.equals(remoteViewContainer2)) { if (remoteViewContainer1.getChildCount() > 0) { View childView = remoteViewContainer1.getChildAt(0); remoteViewContainer1.removeView(childView); remoteViewContainer2.addView(childView); } } } @Override public void onRemoteUserInvited(String userId, RongCallCommon.CallMediaType mediaType) { super.onRemoteUserInvited(userId, mediaType); if (callSession != null) { for (CallUserProfile profile : callSession.getParticipantProfileList()) { if (profile.getUserId().equals(RongIMClient.getInstance().getCurrentUserId())) { if (profile.getCallStatus().equals(RongCallCommon.CallStatus.CONNECTED)) { addSingleRemoteView(userId); } } } } } @Override public void onCallConnected(RongCallSession callSession, SurfaceView localVideo) { super.onCallConnected(callSession, localVideo); this.callSession = callSession; AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); if (audioManager.isWiredHeadsetOn()) { RongCallClient.getInstance().setEnableSpeakerphone(false); } else { RongCallClient.getInstance().setEnableSpeakerphone(true); } if (localView == null) { localView = localVideo; localViewContainer.addView(localView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); localViewUserId = RongIMClient.getInstance().getCurrentUserId(); localView.setTag(localViewUserId); } localViewContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isFullScreen) { isFullScreen = true; topContainer.setVisibility(View.GONE); bottomButtonContainer.setVisibility(View.GONE); } else { isFullScreen = false; topContainer.setVisibility(View.VISIBLE); bottomButtonContainer.setVisibility(View.VISIBLE); } } }); bottomButtonContainer.removeAllViews(); FrameLayout bottomButtonLayout = (FrameLayout) inflater.inflate(R.layout.rc_voip_multi_video_calling_bottom_view, null); bottomButtonContainer.addView(bottomButtonLayout); topContainer.setVisibility(View.VISIBLE); minimizeButton.setVisibility(View.VISIBLE); addButton.setVisibility(View.VISIBLE); switchCameraButton.setVisibility(View.VISIBLE); waitingContainer.setVisibility(View.GONE); remoteViewContainer.setVisibility(View.VISIBLE); participantPortraitContainer.setVisibility(View.GONE); TextView remindInfo = (TextView) topContainer.findViewById(R.id.rc_voip_call_remind_info); setupTime(remindInfo); TextView userNameView = (TextView) topContainer.findViewById(R.id.rc_voip_user_name); String currentUserId = RongIMClient.getInstance().getCurrentUserId(); userNameView.setTag(currentUserId + "name"); UserInfo userInfo = RongContext.getInstance().getUserInfoFromCache(currentUserId); if (userInfo != null) { userNameView.setText(userInfo.getName()); } else { userNameView.setText(currentUserId); } updateRemoteVideoViews(callSession); } void updateRemoteVideoViews(RongCallSession callSession) { for (CallUserProfile profile : callSession.getParticipantProfileList()) { String userId = profile.getUserId(); if (userId.equals(localViewUserId)) continue; View singleRemoteView = remoteViewContainer.findViewWithTag(userId + "view"); if (singleRemoteView == null) { singleRemoteView = addSingleRemoteView(userId); } SurfaceView video = profile.getVideoView(); if (video != null) { FrameLayout remoteVideoView = (FrameLayout) remoteViewContainer.findViewWithTag(userId); if (remoteVideoView == null) { addRemoteVideo(singleRemoteView, video, userId); } } } } void addRemoteVideo(View singleRemoteView, SurfaceView video, String userId) { if (singleRemoteView == null) return; FrameLayout remoteVideoView = (FrameLayout) singleRemoteView.findViewById(R.id.viewlet_remote_video_user); remoteVideoView.removeAllViews(); if (video.getParent() != null) { ((ViewGroup) video.getParent()).removeView(video); } remoteVideoView.addView(video, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); // TextView remoteNameTextView = new TextView(this); // TextView tv = (TextView) singleRemoteView.findViewById(R.id.user_name); // ViewGroup.LayoutParams params = tv.getLayoutParams(); // remoteNameTextView.setLayoutParams(params); // remoteNameTextView.setTextAppearance(this, R.style.rc_voip_text_style_style); // UserInfo userInfo = RongContext.getInstance().getUserInfoFromCache(userId); // if (userInfo != null) { // remoteNameTextView.setText(userInfo.getName()); // } else { // remoteNameTextView.setText(userId); // } // remoteVideoView.addView(remoteNameTextView); remoteVideoView.setVisibility(View.VISIBLE); remoteVideoView.setTag(userId); } View addSingleRemoteView(String userId) { View singleRemoteView = inflater.inflate(R.layout.rc_voip_viewlet_remote_user, null); UserInfo userInfo = RongContext.getInstance().getUserInfoFromCache(userId); singleRemoteView.setTag(userId + "view"); AsyncImageView userPortraitView = (AsyncImageView) singleRemoteView.findViewById(R.id.user_portrait); if (userInfo != null) { if (userInfo.getPortraitUri() != null) { userPortraitView.setAvatar(userInfo.getPortraitUri().toString(), R.drawable.rc_default_portrait); } } LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(remoteUserViewWidth, remoteUserViewWidth); params.setMargins(0, 0, 10, 0); if (remoteViewContainer2.getChildCount() < 4) { remoteViewContainer2.addView(singleRemoteView, params); } else if (remoteViewContainer1.getChildCount() < 4) { remoteViewContainer1.addView(singleRemoteView, params); } return singleRemoteView; } @Override public void onCallDisconnected(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) { isFinishing = true; if (reason == null || callSession == null) { RLog.e(TAG, "onCallDisconnected. callSession is null!"); postRunnableDelay(new Runnable() { @Override public void run() { finish(); } }); return; } InformationNotificationMessage informationMessage; if (reason.equals(RongCallCommon.CallDisconnectedReason.NO_RESPONSE)) { informationMessage = InformationNotificationMessage.obtain(RongContext.getInstance().getString(R.string.rc_voip_video_no_response)); } else { informationMessage = InformationNotificationMessage.obtain(RongContext.getInstance().getString(R.string.rc_voip_video_ended)); } RongIM.getInstance().insertMessage(callSession.getConversationType(), callSession.getTargetId(), callSession.getCallerUserId(), informationMessage, null); stopRing(); postRunnableDelay(new Runnable() { @Override public void run() { finish(); } }); super.onCallDisconnected(callSession, reason); } @Override public void onRemoteCameraDisabled(String userId, boolean muted) { if (muted) { if (userId.equals(localViewUserId)) { localView.setVisibility(View.GONE); } else { remoteViewContainer.findViewWithTag(userId).setVisibility(View.GONE); } } else { if (userId.equals(localViewUserId)) { localView.setVisibility(View.VISIBLE); } else { remoteViewContainer.findViewWithTag(userId).setVisibility(View.VISIBLE); } } } protected void initViews() { inflater = LayoutInflater.from(this); localViewContainer = (FrameLayout) findViewById(R.id.rc_local_user_view); remoteViewContainer = (LinearLayout) findViewById(R.id.rc_remote_user_container); remoteViewContainer1 = (LinearLayout) findViewById(R.id.rc_remote_user_container_1); remoteViewContainer2 = (LinearLayout) findViewById(R.id.rc_remote_user_container_2); topContainer = (LinearLayout) findViewById(R.id.rc_top_container); waitingContainer = (LinearLayout) findViewById(R.id.rc_waiting_container); bottomButtonContainer = (LinearLayout) findViewById(R.id.rc_bottom_button_container); participantPortraitContainer = (LinearLayout) findViewById(R.id.rc_participant_portait_container); minimizeButton = (ImageView) findViewById(R.id.rc_voip_call_minimize); addButton = (ImageView) findViewById(R.id.rc_voip_call_add); switchCameraButton = (ImageView) findViewById(R.id.rc_voip_switch_camera); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); remoteUserViewWidth = (metrics.widthPixels - 50) / 4; localView = null; localViewContainer.removeAllViews(); remoteViewContainer1.removeAllViews(); remoteViewContainer2.removeAllViews(); minimizeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MultiVideoCallActivity.super.onMinimizeClick(v); } }); } protected void setupIntent() { Intent intent = getIntent(); RongCallAction callAction = RongCallAction.valueOf(intent.getStringExtra("callAction")); if (callAction == null || callAction.equals(RongCallAction.ACTION_RESUME_CALL)) { return; } ArrayList<String> invitedList = new ArrayList<>(); if (callAction.equals(RongCallAction.ACTION_INCOMING_CALL)) { callSession = intent.getParcelableExtra("callSession"); onIncomingCallRinging(); TextView callRemindInfoView = (TextView) topContainer.findViewById(R.id.rc_voip_call_remind_info); TextView userNameView = (TextView) topContainer.findViewById(R.id.rc_voip_user_name); callRemindInfoView.setText(R.string.rc_voip_video_call_inviting); if (callSession != null) { UserInfo userInfo = RongContext.getInstance().getUserInfoFromCache(callSession.getInviterUserId()); userNameView.setTag(callSession.getInviterUserId() + "name"); if (userInfo != null) { userNameView.setText(userInfo.getName()); } else { userNameView.setText(callSession.getInviterUserId()); } List<CallUserProfile> list = callSession.getParticipantProfileList(); for (CallUserProfile profile : list) { if (!profile.getUserId().equals(callSession.getSelfUserId())) invitedList.add(profile.getUserId()); } FrameLayout bottomButtonLayout = (FrameLayout) inflater.inflate(R.layout.rc_voip_call_bottom_incoming_button_layout, null); ImageView answerV = (ImageView) bottomButtonLayout.findViewById(R.id.rc_voip_call_answer_btn); answerV.setImageResource(R.drawable.rc_voip_vedio_answer_selector); bottomButtonContainer.addView(bottomButtonLayout); for (int i = 0; i < invitedList.size(); i++) { if (invitedList.get(i).equals(callSession.getCallerUserId())) continue; View userPortraitView = inflater.inflate(R.layout.rc_voip_user_portrait, null); AsyncImageView portraitView = (AsyncImageView) userPortraitView.findViewById(R.id.rc_user_portrait); userInfo = RongContext.getInstance().getUserInfoFromCache(invitedList.get(i)); if (userInfo != null && userInfo.getPortraitUri() != null) { portraitView.setAvatar(userInfo.getPortraitUri().toString(), R.drawable.rc_default_portrait); } LinearLayout portraitContainer1 = (LinearLayout) participantPortraitContainer.findViewById(R.id.rc_participant_portait_container_1); LinearLayout portraitContainer2 = (LinearLayout) participantPortraitContainer.findViewById(R.id.rc_participant_portait_container_2); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(10, 0, 0, 0); if (i < 4) { portraitContainer1.addView(userPortraitView, params); portraitContainer1.setTag(invitedList.get(i) + "participantPortraitView"); } else { portraitContainer2.addView(userPortraitView, params); portraitContainer2.setTag(invitedList.get(i) + "participantPortraitView"); } } } topContainer.setVisibility(View.VISIBLE); minimizeButton.setVisibility(View.GONE); addButton.setVisibility(View.GONE); switchCameraButton.setVisibility(View.GONE); waitingContainer.setVisibility(View.GONE); remoteViewContainer.setVisibility(View.GONE); participantPortraitContainer.setVisibility(View.VISIBLE); bottomButtonContainer.setVisibility(View.VISIBLE); } else if (callAction.equals(RongCallAction.ACTION_OUTGOING_CALL)) { Conversation.ConversationType conversationType = Conversation.ConversationType.valueOf(intent.getStringExtra("conversationType").toUpperCase(Locale.US)); String targetId = intent.getStringExtra("targetId"); ArrayList<String> userIds = intent.getStringArrayListExtra("invitedUsers"); for (int i = 0; i < userIds.size(); i++) { if (!userIds.get(i).equals(RongIMClient.getInstance().getCurrentUserId())) { invitedList.add(userIds.get(i)); String userId = userIds.get(i); addSingleRemoteView(userId); } } RongCallClient.getInstance().startCall(conversationType, targetId, invitedList, RongCallCommon.CallMediaType.VIDEO, "multi"); FrameLayout bottomButtonLayout = (FrameLayout) inflater.inflate(R.layout.rc_voip_multi_video_calling_bottom_view, null); bottomButtonLayout.findViewById(R.id.rc_voip_call_mute).setVisibility(View.GONE); bottomButtonLayout.findViewById(R.id.rc_voip_disable_camera).setVisibility(View.GONE); bottomButtonContainer.addView(bottomButtonLayout); topContainer.setVisibility(View.GONE); waitingContainer.setVisibility(View.VISIBLE); remoteViewContainer.setVisibility(View.VISIBLE); participantPortraitContainer.setVisibility(View.GONE); bottomButtonContainer.setVisibility(View.VISIBLE); } } public void onHangupBtnClick(View view) { if (callSession == null || isFinishing) { return; } stopRing(); RongCallClient.getInstance().hangUpCall(callSession.getCallId()); } public void onReceiveBtnClick(View view) { if (callSession == null || isFinishing) { return; } RongCallClient.getInstance().acceptCall(callSession.getCallId()); RongCallClient.getInstance().setEnableLocalAudio(true); RongCallClient.getInstance().setEnableLocalVideo(true); stopRing(); } public void onAddButtonClick(View view) { setShouldShowFloat(false); if (callSession.getConversationType().equals(Conversation.ConversationType.DISCUSSION)) { RongIMClient.getInstance().getDiscussion(callSession.getTargetId(), new RongIMClient.ResultCallback<Discussion>() { @Override public void onSuccess(Discussion discussion) { Intent intent = new Intent(MultiVideoCallActivity.this, CallSelectMemberActivity.class); ArrayList<String> added = new ArrayList<>(); List<CallUserProfile> list = RongCallClient.getInstance().getCallSession().getParticipantProfileList(); for (CallUserProfile profile : list) { added.add(profile.getUserId()); } intent.putStringArrayListExtra("allMembers", (ArrayList<String>) discussion.getMemberIdList()); intent.putStringArrayListExtra("invitedMembers", added); intent.putExtra("mediaType", RongCallCommon.CallMediaType.VIDEO.getValue()); startActivityForResult(intent, 110); } @Override public void onError(RongIMClient.ErrorCode e) { } }); } else if (callSession.getConversationType().equals(Conversation.ConversationType.GROUP)) { Intent intent = new Intent(MultiVideoCallActivity.this, CallSelectMemberActivity.class); ArrayList<String> added = new ArrayList<>(); List<CallUserProfile> list = RongCallClient.getInstance().getCallSession().getParticipantProfileList(); for (CallUserProfile profile : list) { added.add(profile.getUserId()); } intent.putStringArrayListExtra("invitedMembers", added); intent.putExtra("groupId", callSession.getTargetId()); intent.putExtra("mediaType", RongCallCommon.CallMediaType.VIDEO.getValue()); startActivityForResult(intent, 110); } } public void onSwitchCameraClick(View view) { RongCallClient.getInstance().switchCamera(); } public void onMuteButtonClick(View view) { RongCallClient.getInstance().setEnableLocalAudio(view.isSelected()); view.setSelected(!view.isSelected()); } public void onDisableCameraBtnClick(View view) { TextView text = (TextView) bottomButtonContainer.findViewById(R.id.rc_voip_disable_camera_text); String currentUserId = RongIMClient.getInstance().getCurrentUserId(); RongCallClient.getInstance().setEnableLocalVideo(view.isSelected()); if (view.isSelected()) { text.setText(R.string.rc_voip_disable_camera); if (localViewUserId.equals(currentUserId)) { localView.setVisibility(View.VISIBLE); } else { remoteViewContainer.findViewWithTag(currentUserId).setVisibility(View.VISIBLE); } } else { text.setText(R.string.rc_voip_enable_camera); if (localViewUserId.equals(currentUserId)) { localView.setVisibility(View.GONE); } else { remoteViewContainer.findViewWithTag(currentUserId).setVisibility(View.GONE); } } view.setSelected(!view.isSelected()); } public void onSwitchRemoteUsers(View view) { String from = (String) view.getTag(); if (from == null) return; String to = (String) localView.getTag(); FrameLayout layout = (FrameLayout) view; SurfaceView fromView = (SurfaceView) layout.getChildAt(0); SurfaceView toView = localView; localViewContainer.removeAllViews(); layout.removeAllViews(); View singleRemoteView = remoteViewContainer.findViewWithTag(from + "view"); UserInfo toUserInfo = RongContext.getInstance().getUserInfoFromCache(to); UserInfo fromUserInfo = RongContext.getInstance().getUserInfoFromCache(from); AsyncImageView userPortraitView = (AsyncImageView) singleRemoteView.findViewById(R.id.user_portrait); TextView backUserNameView = (TextView) singleRemoteView.findViewById(R.id.user_name); if (toUserInfo != null) { if (toUserInfo.getPortraitUri() != null) { userPortraitView.setAvatar(toUserInfo.getPortraitUri().toString(), R.drawable.rc_default_portrait); } backUserNameView.setText(toUserInfo.getName()); } else { backUserNameView.setText(to); } singleRemoteView.setTag(to + "view"); fromView.setZOrderOnTop(false); fromView.setZOrderMediaOverlay(false); localViewContainer.addView(fromView); toView.setZOrderOnTop(true); toView.setZOrderMediaOverlay(true); layout.addView(toView); TextView topUserNameView = (TextView) topContainer.findViewById(R.id.rc_voip_user_name); topUserNameView.setTag(from + "name"); if (fromUserInfo != null) { topUserNameView.setText(fromUserInfo.getName()); } else { topUserNameView.setText(from); } layout.setTag(to); localView = fromView; localView.setTag(from); localViewUserId = from; } @Override public void onBackPressed() { List<CallUserProfile> participantProfiles = callSession.getParticipantProfileList(); RongCallCommon.CallStatus callStatus = null; for (CallUserProfile item : participantProfiles) { if (item.getUserId().equals(callSession.getSelfUserId())) { callStatus = item.getCallStatus(); break; } } if (callStatus != null && callStatus.equals(RongCallCommon.CallStatus.CONNECTED)) { super.onBackPressed(); } else { RongCallClient.getInstance().hangUpCall(callSession.getCallId()); } } public void onEventMainThread(UserInfo userInfo) { if (participantPortraitContainer.getVisibility() == View.VISIBLE) { View participantView = participantPortraitContainer.findViewWithTag(userInfo.getUserId() + "participantPortraitView"); if (participantView != null && userInfo.getPortraitUri() != null) { AsyncImageView portraitView = (AsyncImageView) participantView.findViewById(R.id.rc_user_portrait); portraitView.setAvatar(userInfo.getPortraitUri().toString(), R.drawable.rc_default_portrait); } } if (remoteViewContainer.getVisibility() == View.VISIBLE) { View remoteView = remoteViewContainer.findViewWithTag(userInfo.getUserId() + "view"); if (remoteView != null && userInfo.getPortraitUri() != null) { AsyncImageView portraitView = (AsyncImageView) remoteView.findViewById(R.id.rc_user_portrait); portraitView.setAvatar(userInfo.getPortraitUri().toString(), R.drawable.rc_default_portrait); } } if (topContainer.getVisibility() == View.VISIBLE) { TextView nameView = (TextView) topContainer.findViewWithTag(userInfo.getUserId() + "name"); if (nameView != null && userInfo.getName() != null) nameView.setText(userInfo.getName()); } } }