package io.rong.callkit;
import android.content.Context;
import android.content.Intent;
import java.util.ArrayList;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
public class RongCallKit {
public enum CallMediaType {
CALL_MEDIA_TYPE_AUDIO, CALL_MEDIA_TYPE_VIDEO
}
public interface ICallUsersProvider {
void onGotUserList(ArrayList<String> userIds);
}
private static GroupMembersProvider mGroupMembersProvider;
/**
* 发起单人通话。
*
* @param context 上下文
* @param targetId 会话 id
* @param mediaType 会话媒体类型
*/
public static void startSingleCall(Context context, String targetId, CallMediaType mediaType) {
String action;
if (mediaType.equals(CallMediaType.CALL_MEDIA_TYPE_AUDIO)) {
action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_SINGLEAUDIO;
} else {
action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_SINGLEVIDEO;
}
Intent intent = new Intent(action);
intent.putExtra("conversationType", Conversation.ConversationType.PRIVATE.getName().toLowerCase());
intent.putExtra("targetId", targetId);
intent.putExtra("callAction", RongCallAction.ACTION_OUTGOING_CALL.getName());
context.startActivity(intent);
}
/**
* 发起多人通话
*
* @param context 上下文
* @param conversationType 会话类型
* @param targetId 会话 id
* @param mediaType 会话媒体类型
* @param userIds 参与者 id 列表
*/
public static void startMultiCall(Context context, Conversation.ConversationType conversationType, String targetId, CallMediaType mediaType, ArrayList<String> userIds) {
String action;
if (mediaType.equals(CallMediaType.CALL_MEDIA_TYPE_AUDIO)) {
action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_MULTIAUDIO;
} else {
action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_MULTIVIDEO;
}
Intent intent = new Intent(action);
userIds.add(RongIMClient.getInstance().getCurrentUserId());
intent.putExtra("conversationType", conversationType.getName().toLowerCase());
intent.putExtra("targetId", targetId);
intent.putExtra("callAction", RongCallAction.ACTION_OUTGOING_CALL.getName());
intent.putStringArrayListExtra("invitedUsers", userIds);
context.startActivity(intent);
}
/**
* 开始多人通话。
* 返回当前会话用户列表提供者对象,用户拿到该对象后,异步从服务器取出当前会话用户列表后,
* 调用提供者中的 onGotUserList 方法,填充 ArrayList<String> userIds 后,就会自动发起多人通话。
*
* @param context 上下文
* @param conversationType 会话类型
* @param targetId 会话 id
* @param mediaType 通话的媒体类型:CALL_MEDIA_TYPE_AUDIO, CALL_MEDIA_TYPE_VIDEO
* @return 返回当前会话用户列表提供者对象
*/
public static ICallUsersProvider startMultiCall(final Context context, final Conversation.ConversationType conversationType, final String targetId, final CallMediaType mediaType) {
return new ICallUsersProvider() {
@Override
public void onGotUserList(ArrayList<String> userIds) {
String action;
if (mediaType.equals(CallMediaType.CALL_MEDIA_TYPE_AUDIO)) {
action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_MULTIAUDIO;
} else {
action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_MULTIVIDEO;
}
Intent intent = new Intent(action);
userIds.add(RongIMClient.getInstance().getCurrentUserId());
intent.putExtra("conversationType", conversationType.getName().toLowerCase());
intent.putExtra("targetId", targetId);
intent.putExtra("callAction", RongCallAction.ACTION_OUTGOING_CALL.getName());
intent.putStringArrayListExtra("invitedUsers", userIds);
context.startActivity(intent);
}
};
}
/**
* 群组成员提供者。
* CallKit 本身不保存群组成员,如果在聊天中需要使用群组成员,CallKit 将调用此 Provider 获取群组成员。
*/
public interface GroupMembersProvider {
/**
* 获取群组成员列表,用户根据groupId返回对应的群组成员列表。
* @param groupId 群组id
* @param result getMemberList可以同步返回,也可以异步返回。
* 同步返回的情况下,直接返回成员列表。
* 异步返回的情况下,需要在异步返回的时候调用{@link RongCallKit.OnGroupMembersResult#onGotMemberList(ArrayList)}
* 来通知CallKit刷新列表。
* @return 同步返回的时候返回列表,异步返回直接返回null。
*/
ArrayList<String> getMemberList(String groupId, OnGroupMembersResult result);
}
/**
* 群组成员提供者的异步回调接口。
*/
public interface OnGroupMembersResult {
/**
* 群组成员提供者的异步回调接口。
* @param members 成员列表。
*/
void onGotMemberList(ArrayList<String> members);
}
/**
* <p>设置群组成员的提供者。</p>
* <p>设置后,当 {@link CallSelectMemberActivity} 界面展示群组成员时,会回调 {@link GroupMembersProvider#getMemberList(String, OnGroupMembersResult)},
* 使用者只需要根据对应的 groupId 提供对应的群组成员。
* 如果需要异步从服务器获取群组成员,使用者可以在此方法中发起异步请求,然后返回 null 信息。
* 在异步请求结果返回后,根据返回的结果调用 {@link RongCallKit.OnGroupMembersResult#onGotMemberList(ArrayList)} 刷新信息。</p>
* @param groupMembersProvider 群组成员提供者。
*/
public static void setGroupMemberProvider(GroupMembersProvider groupMembersProvider) {
mGroupMembersProvider = groupMembersProvider;
}
/**
* 获取群组成员提供者。
* @return 群组成员提供者。
*/
public static GroupMembersProvider getGroupMemberProvider () {
return mGroupMembersProvider;
}
}