添加项目

This commit is contained in:
zhanglei
2025-06-30 14:12:14 +08:00
commit 8a60755b60
2374 changed files with 198527 additions and 0 deletions
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tencent.qcloud.tuikit.tuigroup">
<application>
<provider
android:name=".TUIGroupService"
android:authorities="${applicationId}.TUIGroup.Init"
android:enabled="true"
android:exported="false" />
<!-- **************** Classic UI Activity Start **************** -->
<activity android:name=".classicui.page.GroupNoticeActivity"
android:screenOrientation="portrait" />
<activity android:name=".classicui.page.SetGroupManagerActivity"
android:screenOrientation="portrait" />
<activity android:name=".classicui.page.GroupMemberActivity"
android:screenOrientation="portrait" />
<activity android:name=".classicui.page.ManageGroupActivity"
android:screenOrientation="portrait" />
<activity android:name=".classicui.page.GroupInfoActivity"
android:screenOrientation="portrait" />
<activity android:name=".classicui.page.GroupApplyManagerActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<!-- **************** Classic UI Activity End **************** -->
<!-- **************** Minimalist UI Activity Start **************** -->
<activity android:name=".minimalistui.page.GroupNoticeMinimalistActivity"
android:screenOrientation="portrait" />
<activity android:name=".minimalistui.page.SetGroupManagerMinimalistActivity"
android:screenOrientation="portrait" />
<activity android:name=".minimalistui.page.GroupMemberMinimalistActivity"
android:screenOrientation="portrait" />
<activity android:name=".minimalistui.page.ManageGroupMinimalistActivity"
android:screenOrientation="portrait" />
<activity android:name=".minimalistui.page.GroupInfoMinimalistActivity"
android:screenOrientation="portrait" />
<activity android:name=".minimalistui.page.GroupApplyManagerMinimalistActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<!-- **************** Minimalist UI Activity End **************** -->
</application>
</manifest>
@@ -0,0 +1,12 @@
package com.tencent.qcloud.tuikit.tuigroup;
import com.tencent.qcloud.tuicore.interfaces.ITUIService;
import java.util.Map;
public interface ITUIGroupService extends ITUIService {
@Override
Object onCall(String method, Map<String, Object> param);
}
@@ -0,0 +1,39 @@
package com.tencent.qcloud.tuikit.tuigroup;
public class TUIGroupConstants {
public static final class ActivityRequest {
public static final int CODE_1 = 1;
}
public static final class Group {
public static final int MODIFY_GROUP_NAME = 0X01;
public static final int MODIFY_GROUP_NOTICE = 0X02;
public static final int MODIFY_GROUP_JOIN_TYPE = 0X03;
public static final int MODIFY_MEMBER_NAME = 0X11;
public static final String GROUP_ID = "group_id";
public static final String GROUP_INFO = "groupInfo";
public static final String MEMBER_APPLY = "apply";
}
public static class Selection {
public static final String SELECT_FRIENDS = "select_friends";
public static final String SELECT_FOR_CALL = "isSelectForCall";
public static final String IS_SELECT_MODE = "isSelectMode";
public static final String CONTENT = "content";
public static final String TYPE = "type";
public static final String TITLE = "title";
public static final String LIST = "list";
public static final String LIMIT = "limit";
public static final String EXCLUDE_LIST = "excludeList";
public static final String SELECTED_LIST = "selectedList";
public static final String FILTER = "filter";
}
public static final String GROUP_FACE_URL = "https://im.sdk.cloud.tencent.cn/download/tuikit-resource/group-avatar/group_avatar_%s.png";
public static final int GROUP_FACE_COUNT = 24;
}
@@ -0,0 +1,232 @@
package com.tencent.qcloud.tuikit.tuigroup;
import android.content.Context;
import com.tencent.imsdk.v2.V2TIMGroupChangeInfo;
import com.tencent.imsdk.v2.V2TIMGroupListener;
import com.tencent.imsdk.v2.V2TIMGroupMemberChangeInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.qcloud.tuicore.ServiceInitializer;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.GroupEventListener;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupUtils;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class TUIGroupService extends ServiceInitializer implements ITUIGroupService {
public static final String TAG = TUIGroupService.class.getSimpleName();
private static TUIGroupService instance;
private final List<WeakReference<GroupEventListener>> groupEventListenerList = new ArrayList<>();
public static TUIGroupService getInstance() {
return instance;
}
@Override
public void init(Context context) {
instance = this;
TUICore.registerService(TUIConstants.TUIGroup.SERVICE_NAME, this);
initIMListener();
}
@Override
public Object onCall(String method, Map<String, Object> param) {
return null;
}
private void initIMListener() {
V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {
@Override
public void onMemberEnter(String groupID, List<V2TIMGroupMemberInfo> memberList) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
ArrayList<String> userIds = new ArrayList<>();
for (V2TIMGroupMemberInfo memberInfo : memberList) {
userIds.add(memberInfo.getUserID());
}
param.put(TUIConstants.TUIGroup.GROUP_MEMBER_ID_LIST, userIds);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_JOIN_GROUP, param);
if (userIds.contains(TUILogin.getLoginUser())) {
TUIGroupUtils.toastGroupEvent(TUIGroupUtils.GROUP_EVENT_TIP_JOINED, groupID);
}
}
@Override
public void onMemberLeave(String groupID, V2TIMGroupMemberInfo member) {
super.onMemberLeave(groupID, member);
}
@Override
public void onMemberInvited(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
ArrayList<String> userIds = new ArrayList<>();
for (V2TIMGroupMemberInfo memberInfo : memberList) {
userIds.add(memberInfo.getUserID());
}
param.put(TUIConstants.TUIGroup.GROUP_MEMBER_ID_LIST, userIds);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_INVITED_GROUP, param);
if (userIds.contains(TUILogin.getLoginUser())) {
TUIGroupUtils.toastGroupEvent(TUIGroupUtils.GROUP_EVENT_TIP_INVITED, groupID);
}
}
@Override
public void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
ArrayList<String> userIds = new ArrayList<>();
for (V2TIMGroupMemberInfo memberInfo : memberList) {
userIds.add(memberInfo.getUserID());
}
param.put(TUIConstants.TUIGroup.GROUP_MEMBER_ID_LIST, userIds);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_MEMBER_KICKED_GROUP, param);
if (userIds.contains(TUILogin.getLoginUser())) {
TUIGroupUtils.toastGroupEvent(TUIGroupUtils.GROUP_EVENT_TIP_KICKED, groupID);
}
}
@Override
public void onMemberInfoChanged(String groupID, List<V2TIMGroupMemberChangeInfo> v2TIMGroupMemberChangeInfoList) {
super.onMemberInfoChanged(groupID, v2TIMGroupMemberChangeInfoList);
}
@Override
public void onGroupCreated(String groupID) {
super.onGroupCreated(groupID);
}
@Override
public void onGroupDismissed(String groupID, V2TIMGroupMemberInfo opUser) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_GROUP_DISMISS, param);
TUIGroupUtils.toastGroupEvent(TUIGroupUtils.GROUP_EVENT_TIP_DISBANDED, groupID);
}
@Override
public void onGroupRecycled(String groupID, V2TIMGroupMemberInfo opUser) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_GROUP_RECYCLE, param);
}
@Override
public void onGroupInfoChanged(String groupID, List<V2TIMGroupChangeInfo> changeInfos) {
List<GroupEventListener> groupEventListeners = getGroupEventListenerList();
for (GroupEventListener groupEventListener : groupEventListeners) {
groupEventListener.onGroupInfoChanged(groupID);
}
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
for (V2TIMGroupChangeInfo changeInfo : changeInfos) {
if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_NAME) {
param.put(TUIConstants.TUIGroup.GROUP_NAME, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_FACE_URL) {
param.put(TUIConstants.TUIGroup.GROUP_FACE_URL, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER) {
param.put(TUIConstants.TUIGroup.GROUP_OWNER, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_NOTIFICATION) {
param.put(TUIConstants.TUIGroup.GROUP_NOTIFICATION, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_INTRODUCTION) {
param.put(TUIConstants.TUIGroup.GROUP_INTRODUCTION, changeInfo.getValue());
} else {
return;
}
}
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_GROUP_INFO_CHANGED, param);
}
@Override
public void onReceiveJoinApplication(String groupID, V2TIMGroupMemberInfo member, String opReason) {
super.onReceiveJoinApplication(groupID, member, opReason);
}
@Override
public void onApplicationProcessed(String groupID, V2TIMGroupMemberInfo opUser, boolean isAgreeJoin, String opReason) {
super.onApplicationProcessed(groupID, opUser, isAgreeJoin, opReason);
}
@Override
public void onGrantAdministrator(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) {
super.onGrantAdministrator(groupID, opUser, memberList);
}
@Override
public void onRevokeAdministrator(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) {
super.onRevokeAdministrator(groupID, opUser, memberList);
}
@Override
public void onQuitFromGroup(String groupID) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.GROUP_ID, groupID);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_EXIT_GROUP, param);
}
@Override
public void onReceiveRESTCustomData(String groupID, byte[] customData) {
super.onReceiveRESTCustomData(groupID, customData);
}
@Override
public void onGroupAttributeChanged(String groupID, Map<String, String> groupAttributeMap) {
super.onGroupAttributeChanged(groupID, groupAttributeMap);
}
});
}
public void addGroupEventListener(GroupEventListener groupEventListener) {
if (groupEventListener == null) {
return;
}
for (WeakReference<GroupEventListener> listenerWeakReference : groupEventListenerList) {
if (listenerWeakReference.get() == groupEventListener) {
return;
}
}
groupEventListenerList.add(new WeakReference<>(groupEventListener));
}
public List<GroupEventListener> getGroupEventListenerList() {
List<GroupEventListener> listeners = new ArrayList<>();
Iterator<WeakReference<GroupEventListener>> iterator = groupEventListenerList.listIterator();
while(iterator.hasNext()) {
WeakReference<GroupEventListener> listenerWeakReference = iterator.next();
GroupEventListener listener = listenerWeakReference.get();
if (listener == null) {
iterator.remove();
} else {
listeners.add(listener);
}
}
return listeners;
}
@Override
public int getLightThemeResId() {
return R.style.TUIGroupLightTheme;
}
@Override
public int getLivelyThemeResId() {
return R.style.TUIGroupLivelyTheme;
}
@Override
public int getSeriousThemeResId() {
return R.style.TUIGroupSeriousTheme;
}
}
@@ -0,0 +1,157 @@
package com.tencent.qcloud.tuikit.tuigroup.bean;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMGroupAtInfo;
import java.io.Serializable;
import java.util.List;
/**
* 聊天信息基本类
*/
public class ChatInfo implements Serializable {
public static final int TYPE_C2C = V2TIMConversation.V2TIM_C2C;
public static final int TYPE_GROUP = V2TIMConversation.V2TIM_GROUP;
public static final int TYPE_INVALID = V2TIMConversation.CONVERSATION_TYPE_INVALID;
private static List<V2TIMGroupAtInfo> atInfoList;
private String chatName;
private int type = V2TIMConversation.V2TIM_C2C;
private String id;
private String groupType;
private boolean isTopChat;
private boolean isFolded;
public ChatInfo() {
}
/**
* 获取聊天的标题,单聊一般为对方名称,群聊为群名字
*
* Get the title of the chat, usually the name of the other party for a single chat, and the group name for a group chat
*
* @return
*/
public String getChatName() {
return chatName;
}
/**
* 设置聊天的标题,单聊一般为对方名称,群聊为群名字
*
* Set the title of the chat, usually the name of the other party for a single chat, and the group name for a group chat
*
* @param chatName
*/
public void setChatName(String chatName) {
this.chatName = chatName;
}
/**
* 获取聊天类型,C2C为单聊,Group为群聊
*
* Get the chat type, C2C is a single chat, Group is a group chat
*
* @return
*/
public int getType() {
return type;
}
/**
* 设置聊天类型,C2C为单聊,Group为群聊
*
* Set the chat type, C2C is a single chat, Group is a group chat
*
* @param type
*/
public void setType(int type) {
this.type = type;
}
/**
* 获取聊天唯一标识
*
* Get chat id
*
* @return
*/
public String getId() {
return id;
}
/**
* 设置聊天唯一标识
*
* Set chat id
*
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取群组类型
*
* Get group type
*/
public String getGroupType() {
return groupType;
}
/**
* 设置群组类型
*
* Set group type
*/
public void setGroupType(String groupType) {
this.groupType = groupType;
}
/**
* 是否为置顶的会话
*
* Is it a pinned conversation
*
* @return
*/
public boolean isTopChat() {
return isTopChat;
}
/**
* 设置会话是否置顶
*
* Set whether the conversation is sticky
*
* @param topChat
*/
public void setTopChat(boolean topChat) {
isTopChat = topChat;
}
/**
* 是否为折叠的会话
*/
public boolean isFolded() {
return isFolded;
}
/**
* 设置会话折叠
*/
public void setFolded(boolean folded) {
isFolded = folded;
}
public List<V2TIMGroupAtInfo> getAtInfoList() {
return atInfoList;
}
}
@@ -0,0 +1,60 @@
package com.tencent.qcloud.tuikit.tuigroup.bean;
import com.tencent.imsdk.v2.V2TIMGroupApplication;
import java.io.Serializable;
public class GroupApplyInfo implements Serializable {
public static final int APPLIED = 1;
public static final int REFUSED = -1;
public static final int UNHANDLED = 0;
private int status;
private V2TIMGroupApplication timGroupApplication;
public GroupApplyInfo(V2TIMGroupApplication timGroupApplication) {
this.timGroupApplication = timGroupApplication;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public V2TIMGroupApplication getGroupApplication() {
return timGroupApplication;
}
public String getFromUser() {
if (timGroupApplication != null) {
return timGroupApplication.getFromUser();
}
return "";
}
public String getFromUserNickName() {
if (timGroupApplication != null) {
return timGroupApplication.getFromUserNickName();
}
return "";
}
public String getRequestMsg() {
if (timGroupApplication != null) {
return timGroupApplication.getRequestMsg();
}
return "";
}
public boolean isStatusHandled() {
if (timGroupApplication != null) {
return timGroupApplication.getHandleStatus() != V2TIMGroupApplication.V2TIM_GROUP_APPLICATION_HANDLE_STATUS_UNHANDLED;
}
return false;
}
}
@@ -0,0 +1,251 @@
package com.tencent.qcloud.tuikit.tuigroup.bean;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMGroupInfoResult;
import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import java.util.ArrayList;
import java.util.List;
public class GroupInfo extends ChatInfo {
public static final String GROUP_TYPE_MEETING = V2TIMManager.GROUP_TYPE_MEETING;
public static final String GROUP_TYPE_AVCHATROOM = V2TIMManager.GROUP_TYPE_AVCHATROOM;
public static final String GROUP_TYPE_COMMUNITY = V2TIMManager.GROUP_TYPE_COMMUNITY;
public static final String GROUP_TYPE_PUBLIC = V2TIMManager.GROUP_TYPE_PUBLIC;
public static final String GROUP_TYPE_WORK = V2TIMManager.GROUP_TYPE_WORK;
public static final int GROUP_MEMBER_FILTER_ALL = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL;
public static final int GROUP_MEMBER_FILTER_OWNER = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_OWNER;
public static final int GROUP_MEMBER_FILTER_ADMIN = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ADMIN;
public static final int GROUP_MEMBER_FILTER_COMMON = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_COMMON;
private String groupType;
private int memberCount;
private String groupName;
private String notice;
private List<GroupMemberInfo> memberDetails = new ArrayList<>();
private int joinType;
private String owner;
private boolean messageReceiveOption;
private String faceUrl;
private long mNextSeq = 0;
private boolean canManagerGroup;
private boolean isAllMuted;
public GroupInfo() {
setType(V2TIMConversation.V2TIM_GROUP);
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
/**
* 获取群公告
*
* Get group announcements
*
* @return
*/
public String getNotice() {
return notice;
}
/**
* 设置群公告
*
* Set group announcements
*
* @param signature
*/
public void setNotice(String signature) {
this.notice = signature;
}
/**
* 获取加群验证方式
*
* Get the group verification method
*
* @return
*/
public int getJoinType() {
return joinType;
}
/**
* 设置加群验证方式
*
* Set the group verification method
*
* @param joinType
*/
public void setJoinType(int joinType) {
this.joinType = joinType;
}
/**
* 获取群类型,Public/Private/ChatRoom
*
* Get the group type, Public/Private/ChatRoom
*
* @return
*/
public String getGroupType() {
return groupType;
}
/**
* 设置群类型
*
* Set the group type
*
* @param groupType
*/
public void setGroupType(String groupType) {
this.groupType = groupType;
}
/**
* 获取成员详细信息
*
* Get member details
*
* @return
*/
public List<GroupMemberInfo> getMemberDetails() {
return memberDetails;
}
/**
* 设置成员详细信息
*
* Set member details
*
* @param memberDetails
*/
public void setMemberDetails(List<GroupMemberInfo> memberDetails) {
this.memberDetails = memberDetails;
}
/**
* 获取群成员数量
*
* Get the number of members that have joined the group
*
* @return
*/
public int getMemberCount() {
return memberCount;
}
/**
* 设置群成员数量
*
* Set the number of members that have joined the group
*
* @param memberCount
*/
public void setMemberCount(int memberCount) {
this.memberCount = memberCount;
}
/**
* 返回是否是群主
*
* Returns whether it is the owner of the group
*
* @return
*/
public boolean isOwner() {
return V2TIMManager.getInstance().getLoginUser().equals(owner);
}
/**
* 设置是否是群主
*
* Set whether it is the owner of the group
*
* @param owner
*/
public void setOwner(String owner) {
this.owner = owner;
}
/**
* 获取消息接收选项
*
* Get the current user's message receiving option in the group. To modify the group message receiving option, please call the setReceiveMessageOpt API.
*
* @return
*/
public boolean getMessageReceiveOption() {
return messageReceiveOption;
}
/**
* 设置消息接收选项
* @param messageReceiveOption, true,免打扰; false,接收消息
*
*
* Set the current user's message receiving option in the group.
* @param messageReceiveOption, true,no message will be received falsemessages will be received.
*/
public void setMessageReceiveOption(boolean messageReceiveOption) {
this.messageReceiveOption = messageReceiveOption;
}
public String getFaceUrl() {
return faceUrl;
}
public void setFaceUrl(String faceUrl) {
this.faceUrl = faceUrl;
}
public long getNextSeq() {
return mNextSeq;
}
public void setNextSeq(long mNextSeq) {
this.mNextSeq = mNextSeq;
}
public boolean isCanManagerGroup() {
return canManagerGroup;
}
public boolean isAllMuted() {
return isAllMuted;
}
public GroupInfo covertTIMGroupDetailInfo(V2TIMGroupInfoResult infoResult) {
if (infoResult.getResultCode() != 0) {
return this;
}
setChatName(infoResult.getGroupInfo().getGroupName());
setGroupName(infoResult.getGroupInfo().getGroupName());
setId(infoResult.getGroupInfo().getGroupID());
setNotice(infoResult.getGroupInfo().getNotification());
setMemberCount(infoResult.getGroupInfo().getMemberCount());
setGroupType(infoResult.getGroupInfo().getGroupType());
setOwner(infoResult.getGroupInfo().getOwner());
setJoinType(infoResult.getGroupInfo().getGroupAddOpt());
setMessageReceiveOption(infoResult.getGroupInfo().getRecvOpt() == V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE ? true : false);
setFaceUrl(infoResult.getGroupInfo().getFaceUrl());
int role = infoResult.getGroupInfo().getRole();
canManagerGroup = role == V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_OWNER
|| role == V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN
|| groupType == V2TIMManager.GROUP_TYPE_WORK;
isAllMuted = infoResult.getGroupInfo().isAllMuted();
return this;
}
}
@@ -0,0 +1,140 @@
package com.tencent.qcloud.tuikit.tuigroup.bean;
import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import java.io.Serializable;
public class GroupMemberInfo implements Serializable {
private String iconUrl;
private String account;
private String signature;
private String location;
private String birthday;
private String nameCard;
private String nickName;
private boolean isTopChat;
private boolean isFriend;
private long joinTime;
private long tinyId;
private int memberType;
private boolean isSelected = false;
public String getIconUrl() {
return iconUrl;
}
public void setIconUrl(String iconUrl) {
this.iconUrl = iconUrl;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public void setNameCard(String nameCard) {
this.nameCard = nameCard;
}
public String getNameCard() {
return nameCard;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getNickName() {
return this.nickName;
}
public boolean isTopChat() {
return isTopChat;
}
public void setTopChat(boolean topChat) {
isTopChat = topChat;
}
public boolean isFriend() {
return isFriend;
}
public void setFriend(boolean friend) {
isFriend = friend;
}
public long getJoinTime() {
return joinTime;
}
public void setJoinTime(long joinTime) {
this.joinTime = joinTime;
}
public long getTinyId() {
return tinyId;
}
public void setTinyId(long tinyId) {
this.tinyId = tinyId;
}
public int getMemberType() {
return memberType;
}
public void setMemberType(int memberType) {
this.memberType = memberType;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
public boolean isSelected() {
return isSelected;
}
public GroupMemberInfo covertTIMGroupMemberInfo(V2TIMGroupMemberInfo info) {
if (info instanceof V2TIMGroupMemberFullInfo) {
V2TIMGroupMemberFullInfo v2TIMGroupMemberFullInfo = (V2TIMGroupMemberFullInfo)info;
setJoinTime(v2TIMGroupMemberFullInfo.getJoinTime());
setMemberType(v2TIMGroupMemberFullInfo.getRole());
}
setAccount(info.getUserID());
setNameCard(info.getNameCard());
setIconUrl(info.getFaceUrl());
setNickName(info.getNickName());
return this;
}
}
@@ -0,0 +1,7 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
public interface IGroupMemberChangedCallback {
void onMemberRemoved(GroupMemberInfo memberInfo);
}
@@ -0,0 +1,16 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import java.util.ArrayList;
public interface IGroupMemberListener {
void forwardListMember(GroupInfo info);
void forwardAddMember(GroupInfo info);
void forwardDeleteMember(GroupInfo info);
default void setSelectedMember(ArrayList<String> members) {}
}
@@ -0,0 +1,59 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupApplyPresenter;
import com.tencent.qcloud.tuikit.tuigroup.classicui.view.GroupApplyManagerLayout;
public class GroupApplyManagerActivity extends BaseLightActivity {
private GroupApplyManagerLayout mManagerLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_apply_manager_activity);
if (getIntent().getExtras() == null) {
finish();
return;
}
mManagerLayout = findViewById(R.id.group_apply_manager_layout);
GroupApplyPresenter presenter = new GroupApplyPresenter(mManagerLayout);
mManagerLayout.setPresenter(presenter);
String groupId = getIntent().getExtras().getString(TUIGroupConstants.Group.GROUP_ID);
GroupInfo groupInfo = new GroupInfo();
groupInfo.setId(groupId);
mManagerLayout.setDataSource(groupInfo);
}
@Override
public void onResume() {
super.onResume();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != TUIGroupConstants.ActivityRequest.CODE_1) {
return;
}
if (resultCode != RESULT_OK) {
return;
}
GroupApplyInfo info = (GroupApplyInfo) data.getSerializableExtra(TUIGroupConstants.Group.MEMBER_APPLY);
if (info == null) {
return;
}
mManagerLayout.updateItemData(info);
}
}
@@ -0,0 +1,46 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import java.util.List;
public class GroupInfoActivity extends BaseLightActivity {
public static final int REQUEST_FOR_CHANGE_OWNER = 1;
private GroupInfoFragment fragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_info_activity);
fragment = new GroupInfoFragment();
fragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().replace(R.id.group_manager_base, fragment).commitAllowingStateLoss();
}
@Override
public void finish() {
super.finish();
setResult(1001);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_FOR_CHANGE_OWNER && data != null) {
List<String> selectedList = data.getStringArrayListExtra(TUIGroupConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
String newOwnerId = selectedList.get(0);
fragment.changeGroupOwner(newOwnerId);
}
}
}
}
@@ -0,0 +1,253 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.activities.ImageSelectActivity;
import com.tencent.qcloud.tuicore.component.fragments.BaseFragment;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.classicui.view.GroupInfoLayout;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupLog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class GroupInfoFragment extends BaseFragment {
private static final int CHOOSE_AVATAR_REQUEST_CODE = 101;
private View baseView;
private GroupInfoLayout groupInfoLayout;
private String groupId;
private GroupInfoPresenter groupInfoPresenter = null;
private String mChatBackgroundThumbnailUrl;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
baseView = inflater.inflate(R.layout.group_info_fragment, container, false);
initView();
return baseView;
}
private void initView() {
Bundle bundle = getArguments();
if (bundle == null) {
ToastUtil.toastShortMessage("groupId is empty. bundle is null");
return;
}
groupId = bundle.getString(TUIGroupConstants.Group.GROUP_ID);
mChatBackgroundThumbnailUrl = bundle.getString(TUIConstants.TUIChat.CHAT_BACKGROUND_URI);
groupInfoLayout = baseView.findViewById(R.id.group_info_layout);
// 新建 presenter 与 layout 互相绑定
groupInfoPresenter = new GroupInfoPresenter(groupInfoLayout);
groupInfoPresenter.setGroupEventListener();
groupInfoLayout.setGroupInfoPresenter(groupInfoPresenter);
groupInfoLayout.setOnModifyGroupAvatarListener(new OnModifyGroupAvatarListener() {
@Override
public void onModifyGroupAvatar(String originAvatarUrl) {
ArrayList<ImageSelectActivity.ImageBean> faceList = new ArrayList<>();
for (int i = 0; i < TUIGroupConstants.GROUP_FACE_COUNT; i++) {
ImageSelectActivity.ImageBean imageBean = new ImageSelectActivity.ImageBean();
imageBean.setThumbnailUri(String.format(TUIGroupConstants.GROUP_FACE_URL, (i + 1) + ""));
imageBean.setImageUri(String.format(TUIGroupConstants.GROUP_FACE_URL, (i + 1) + ""));
faceList.add(imageBean);
}
Intent intent = new Intent(getContext(), ImageSelectActivity.class);
intent.putExtra(ImageSelectActivity.TITLE, getResources().getString(R.string.group_choose_avatar));
intent.putExtra(ImageSelectActivity.SPAN_COUNT, 4);
intent.putExtra(ImageSelectActivity.ITEM_WIDTH, ScreenUtil.dip2px(77));
intent.putExtra(ImageSelectActivity.ITEM_HEIGHT, ScreenUtil.dip2px(77));
intent.putExtra(ImageSelectActivity.DATA, faceList);
intent.putExtra(ImageSelectActivity.SELECTED, new ImageSelectActivity.ImageBean(originAvatarUrl, originAvatarUrl, false));
startActivityForResult(intent, CHOOSE_AVATAR_REQUEST_CODE);
}
});
groupInfoLayout.loadGroupInfo(groupId);
groupInfoLayout.setRouter(new IGroupMemberListener() {
@Override
public void forwardListMember(GroupInfo info) {
Intent intent = new Intent(getContext(), GroupMemberActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, false);
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, info.getId());
startActivity(intent);
}
@Override
public void forwardAddMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : info.getMemberDetails()) {
selectedList.add(memberInfo.getAccount());
}
param.putStringArrayList(TUIGroupConstants.Selection.SELECTED_LIST, selectedList);
TUICore.startActivity(GroupInfoFragment.this, "StartGroupMemberSelectActivity", param, 1);
}
@Override
public void forwardDeleteMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FOR_CALL, true);
TUICore.startActivity(GroupInfoFragment.this, "StartGroupMemberSelectActivity", param, 2);
}
});
groupInfoLayout.setOnButtonClickListener(new GroupInfoLayout.OnButtonClickListener() {
@Override
public void onSetChatBackground() {
ArrayList<ImageSelectActivity.ImageBean> faceList = new ArrayList<>();
ImageSelectActivity.ImageBean defaultFace = new ImageSelectActivity.ImageBean();
defaultFace.setDefault(true);
faceList.add(defaultFace);
for (int i = 0; i < TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_COUNT; i++) {
ImageSelectActivity.ImageBean imageBean = new ImageSelectActivity.ImageBean();
imageBean.setImageUri(String.format(TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_URL, (i + 1) + ""));
imageBean.setThumbnailUri(String.format(TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_THUMBNAIL_URL, (i + 1) + ""));
faceList.add(imageBean);
}
Intent intent = new Intent(getContext(), ImageSelectActivity.class);
intent.putExtra(ImageSelectActivity.TITLE, getResources().getString(R.string.chat_background_title));
intent.putExtra(ImageSelectActivity.SPAN_COUNT, 2);
intent.putExtra(ImageSelectActivity.ITEM_WIDTH, ScreenUtil.dip2px(186));
intent.putExtra(ImageSelectActivity.ITEM_HEIGHT, ScreenUtil.dip2px(124));
intent.putExtra(ImageSelectActivity.DATA, faceList);
if (TextUtils.isEmpty(mChatBackgroundThumbnailUrl) || TextUtils.equals(TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_DEFAULT_URL, mChatBackgroundThumbnailUrl)) {
intent.putExtra(ImageSelectActivity.SELECTED, defaultFace);
} else {
intent.putExtra(ImageSelectActivity.SELECTED, new ImageSelectActivity.ImageBean(mChatBackgroundThumbnailUrl, "", false));
}
intent.putExtra(ImageSelectActivity.NEED_DOWLOAD_LOCAL, true);
startActivityForResult(intent, TUIConstants.TUIChat.CHAT_REQUEST_BACKGROUND_CODE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 3) {
List<String> friends = (List<String>) data.getSerializableExtra(TUIGroupConstants.Selection.LIST);
if (requestCode == 1) {
inviteGroupMembers(friends);
} else if (requestCode == 2) {
deleteGroupMembers(friends);
}
} else if (requestCode == CHOOSE_AVATAR_REQUEST_CODE && resultCode == ImageSelectActivity.RESULT_CODE_SUCCESS) {
if (data != null) {
ImageSelectActivity.ImageBean imageBean = (ImageSelectActivity.ImageBean) data.getSerializableExtra(ImageSelectActivity.DATA);
if (imageBean == null) {
return;
}
String avatarUrl = imageBean.getImageUri();
modifyGroupAvatar(avatarUrl);
}
} else if (requestCode == TUIConstants.TUIChat.CHAT_REQUEST_BACKGROUND_CODE) {
if (data == null) {
return;
}
ImageSelectActivity.ImageBean imageBean = (ImageSelectActivity.ImageBean) data.getSerializableExtra(ImageSelectActivity.DATA);
if (imageBean == null) {
TUIGroupLog.e("GroupInfoFragment", "onActivityResult imageBean is null");
return;
}
String backgroundUri = imageBean.getLocalPath();
String thumbnailUri = imageBean.getThumbnailUri();
String dataUri = thumbnailUri + "," + backgroundUri;
TUIGroupLog.d("GroupInfoFragment", "onActivityResult backgroundUri = " + backgroundUri);
mChatBackgroundThumbnailUrl = thumbnailUri;
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIChat.CHAT_ID, groupId);
param.put(TUIConstants.TUIChat.CHAT_BACKGROUND_URI, dataUri);
TUICore.callService(TUIConstants.TUIChat.SERVICE_NAME, TUIConstants.TUIChat.METHOD_UPDATE_DATA_STORE_CHAT_URI, param);
}
}
private void modifyGroupAvatar(String avatarUrl) {
groupInfoLayout.modifyGroupAvatar(avatarUrl);
}
private void deleteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
if (groupInfoPresenter != null) {
groupInfoPresenter.deleteGroupMembers(groupId, friends, new IUIKitCallback<List<String>>() {
@Override
public void onSuccess(List<String> data) {
groupInfoPresenter.loadGroupInfo(groupId);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
}
}
private void inviteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
groupInfoPresenter.inviteGroupMembers(groupId, friends, new IUIKitCallback<Object>() {
@Override
public void onSuccess(Object data) {
if (data instanceof String) {
ToastUtil.toastLongMessage(data.toString());
} else {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_suc));
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_fail) + errCode + "=" + errMsg);
}
});
}
}
public void changeGroupOwner(String newOwnerId) {
groupInfoPresenter.transferGroupOwner(groupId, newOwnerId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
groupInfoLayout.loadGroupInfo(groupId);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
public interface OnModifyGroupAvatarListener {
void onModifyGroupAvatar(String originAvatarUrl);
}
}
@@ -0,0 +1,176 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import android.view.View;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import com.tencent.qcloud.tuikit.tuigroup.classicui.view.GroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupMemberActivity extends BaseLightActivity {
private GroupMemberLayout mMemberLayout;
private String groupID;
private GroupInfoPresenter presenter;
private boolean isSelectMode = false;
private ArrayList<String> excludeList;
private ArrayList<String> alreadySelectedList;
private String userData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_members_list);
mMemberLayout = findViewById(R.id.group_member_grid_layout);
init();
}
private void init() {
Intent intent = getIntent();
groupID = intent.getStringExtra(TUIConstants.TUIGroup.GROUP_ID);
int limit = getIntent().getIntExtra(TUIConstants.TUIGroup.LIMIT, Integer.MAX_VALUE);
isSelectMode = intent.getBooleanExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
String title = intent.getStringExtra(TUIConstants.TUIGroup.TITLE);
excludeList = intent.getStringArrayListExtra(TUIConstants.TUIGroup.EXCLUDE_LIST);
alreadySelectedList = intent.getStringArrayListExtra(TUIConstants.TUIGroup.SELECTED_LIST);
userData = intent.getStringExtra(TUIConstants.TUIGroup.USER_DATA);
int filter = intent.getIntExtra(TUIConstants.TUIGroup.FILTER, GroupInfo.GROUP_MEMBER_FILTER_ALL);
mMemberLayout.setSelectMode(isSelectMode);
mMemberLayout.setTitle(title);
mMemberLayout.setExcludeList(excludeList);
mMemberLayout.setAlreadySelectedList(alreadySelectedList);
presenter = new GroupInfoPresenter(mMemberLayout);
mMemberLayout.setPresenter(presenter);
presenter.loadGroupInfo(groupID, filter);
mMemberLayout.getTitleBar().setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mMemberLayout.setGroupMemberListener(new IGroupMemberListener() {
@Override
public void setSelectedMember(ArrayList<String> members) {
if (members == null || members.isEmpty()) {
return;
}
if (members.size() > limit) {
String overLimitTip = getString(R.string.group_over_limit_tip, limit);
ToastUtil.toastShortMessage(overLimitTip);
return;
}
Intent result = new Intent();
result.putStringArrayListExtra(TUIConstants.TUIGroup.LIST, members);
setResult(0, result);
Map<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.LIST, members);
param.put(TUIConstants.TUIGroup.USER_DATA, userData);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_GROUP_MEMBER_SELECTED, param);
finish();
}
@Override
public void forwardListMember(GroupInfo info) {
}
@Override
public void forwardAddMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : info.getMemberDetails()) {
selectedList.add(memberInfo.getAccount());
}
param.putStringArrayList(TUIGroupConstants.Selection.SELECTED_LIST, selectedList);
TUICore.startActivity(GroupMemberActivity.this, "StartGroupMemberSelectActivity", param, 1);
}
@Override
public void forwardDeleteMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FOR_CALL, true);
TUICore.startActivity(GroupMemberActivity.this, "StartGroupMemberSelectActivity", param, 2);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 3) {
List<String> friends = (List<String>) data.getSerializableExtra(TUIGroupConstants.Selection.LIST);
if (requestCode == 1) {
inviteGroupMembers(friends);
} else if (requestCode == 2) {
deleteGroupMembers(friends);
}
}
}
private void deleteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
if (presenter != null) {
presenter.deleteGroupMembers(groupID, friends, new IUIKitCallback<List<String>>() {
@Override
public void onSuccess(List<String> data) {
presenter.loadGroupInfo(groupID);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
}
}
private void inviteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
if (presenter != null) {
presenter.inviteGroupMembers(groupID, friends, new IUIKitCallback<Object>() {
@Override
public void onSuccess(Object data) {
if (data instanceof String) {
ToastUtil.toastLongMessage(data.toString());
} else {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_suc));
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_fail) + errCode + "=" + errMsg);
}
});
}
}
}
}
@@ -0,0 +1,152 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupManagerPresenter;
public class GroupNoticeActivity extends BaseLightActivity {
private static OnGroupNoticeChangedListener changedListener;
private EditText editText;
private GroupInfo groupInfo;
private TitleBarLayout titleBarLayout;
private boolean isEditModel = false;
private GroupManagerPresenter presenter;
public static void setOnGroupNoticeChangedListener(OnGroupNoticeChangedListener listener) {
GroupNoticeActivity.changedListener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_notice);
editText = findViewById(R.id.group_notice_text);
titleBarLayout = findViewById(R.id.group_notice_title_bar);
groupInfo = (GroupInfo) getIntent().getSerializableExtra(TUIGroupConstants.Group.GROUP_INFO);
presenter = new GroupManagerPresenter();
if (!TextUtils.isEmpty(groupInfo.getNotice())) {
editText.setText(groupInfo.getNotice());
}
titleBarLayout.getLeftGroup().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
titleBarLayout.setTitle(getString(R.string.group_notice), ITitleBarLayout.Position.MIDDLE);
titleBarLayout.getRightIcon().setVisibility(View.GONE);
if (groupInfo.isCanManagerGroup()) {
titleBarLayout.setTitle(getString(R.string.group_edit), ITitleBarLayout.Position.RIGHT);
}
titleBarLayout.getRightGroup().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isEditModel) {
titleBarLayout.setTitle(getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
editText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
editText.setClickable(true);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
showSoftInput();
editText.setSelection(editText.getText().toString().length());
isEditModel = true;
} else {
titleBarLayout.setTitle(getString(R.string.group_edit), ITitleBarLayout.Position.RIGHT);
editText.setInputType(EditorInfo.TYPE_NULL);
editText.setClickable(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(false);
hideSoftInput();
setGroupNotice(editText.getText().toString());
isEditModel = false;
}
}
});
}
private void setGroupNotice(String groupNotice) {
if (TextUtils.equals(groupNotice, groupInfo.getNotice())) {
return;
}
presenter.modifyGroupNotification(groupInfo.getId(), groupNotice, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
groupInfo.setNotice(groupNotice);
if (changedListener != null) {
changedListener.onChanged(groupNotice);
}
ToastUtil.toastShortMessage(getResources().getString(R.string.modify_group_notice_success));
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage("modifyGroupNotice error , errCode " + errCode + " errMsg " + errMsg);
}
});
}
private void showSoftInput() {
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (!isSoftInputShown()) {
imm.toggleSoftInput(0, 0);
}
}
public void hideSoftInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
editText.clearFocus();
}
private boolean isSoftInputShown() {
View decorView = getWindow().getDecorView();
int screenHeight = decorView.getHeight();
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
return screenHeight - rect.bottom - getNavigateBarHeight() >= 0;
}
// 兼容有导航键的情况
private int getNavigateBarHeight() {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
windowManager.getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight) {
return realHeight - usableHeight;
} else {
return 0;
}
}
public interface OnGroupNoticeChangedListener {
void onChanged(String notice);
}
}
@@ -0,0 +1,318 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.CompoundButton;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuicore.component.LineControllerView;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupManagerPresenter;
import java.util.ArrayList;
import java.util.List;
public class ManageGroupActivity extends BaseLightActivity {
private TitleBarLayout titleBarLayout;
private LineControllerView setManagerView;
private LineControllerView muteAllView;
private View addMuteMemberView;
private RecyclerView mutedList;
private MutedMemberAdapter mutedMemberAdapter;
private GroupManagerPresenter presenter;
private GroupInfo groupInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_manager);
presenter = new GroupManagerPresenter();
titleBarLayout = findViewById(R.id.group_manage_title_bar);
setManagerView = findViewById(R.id.group_manage_set_manager);
muteAllView = findViewById(R.id.group_manage_mute_all);
addMuteMemberView = findViewById(R.id.group_manage_add_mute_member);
mutedList = findViewById(R.id.group_manage_muted_member_list);
mutedList.setLayoutManager(new CustomLinearLayoutManager(this));
mutedMemberAdapter = new MutedMemberAdapter();
mutedList.setAdapter(mutedMemberAdapter);
groupInfo = (GroupInfo) getIntent().getSerializableExtra(TUIGroupConstants.Group.GROUP_INFO);
muteAllView.setChecked(groupInfo.isAllMuted());
if (groupInfo.isAllMuted()) {
addMuteMemberView.setVisibility(View.GONE);
mutedList.setVisibility(View.GONE);
}
titleBarLayout.setTitle(getString(R.string.group_manager), ITitleBarLayout.Position.MIDDLE);
setClickListener();
loadMutedMember();
}
private void setClickListener() {
titleBarLayout.getLeftIcon().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
muteAllView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
presenter.muteAll(groupInfo.getId(), isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
if (isChecked) {
addMuteMemberView.setVisibility(View.GONE);
mutedList.setVisibility(View.GONE);
} else {
addMuteMemberView.setVisibility(View.VISIBLE);
mutedList.setVisibility(View.VISIBLE);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
});
setManagerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_WORK)) {
ToastUtil.toastShortMessage(getString(R.string.group_not_support_set_manager));
return;
}
Intent intent = new Intent(ManageGroupActivity.this, SetGroupManagerActivity.class);
intent.putExtra(TUIGroupConstants.Group.GROUP_INFO, groupInfo);
startActivity(intent);
}
});
addMuteMemberView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_WORK)) {
ToastUtil.toastShortMessage(getString(R.string.group_not_support_mute_member));
return;
}
Intent intent = new Intent(ManageGroupActivity.this, GroupMemberActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
intent.putExtra(TUIConstants.TUIGroup.FILTER, GroupInfo.GROUP_MEMBER_FILTER_COMMON);
if (mutedMemberAdapter.getGroupMemberInfoList() != null) {
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : mutedMemberAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getAccount());
}
intent.putExtra(TUIConstants.TUIGroup.SELECTED_LIST, selectedList);
}
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, groupInfo.getId());
startActivityForResult(intent, 1);
}
});
mutedMemberAdapter.setOnItemLongClickListener(new SetGroupManagerActivity.OnItemLongClickListener() {
@Override
public void onClick(View view, GroupMemberInfo memberInfo, int position) {
Drawable drawable = view.getBackground();
if (drawable != null) {
drawable.setColorFilter(0xd9d9d9, PorterDuff.Mode.SRC_IN);
}
View itemPop = LayoutInflater.from(ManageGroupActivity.this).inflate(R.layout.group_manager_pop_menu, null);
PopupWindow popupWindow = new PopupWindow(itemPop, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.setOutsideTouchable(true);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
if (drawable != null) {
drawable.clearColorFilter();
}
}
});
TextView popText = itemPop.findViewById(R.id.pop_text);
popText.setText(R.string.group_cancel_mute_label);
popText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
presenter.cancelMuteGroupMember(groupInfo.getId(), memberInfo.getAccount(), new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mutedMemberAdapter.onItemRemoved(memberInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
});
int x = view.getWidth() / 2;
int y = - view.getHeight() / 3;
int popHeight = ScreenUtil.dip2px(45) * 3;
if (y + popHeight + view.getY() + view.getHeight() > mutedList.getBottom()) {
y = y - popHeight;
}
popupWindow.showAsDropDown(view, x, y, Gravity.TOP | Gravity.START);
}
});
}
private void loadMutedMember() {
presenter.loadMutedMembers(groupInfo.getId(), new IUIKitCallback<List<GroupMemberInfo>>() {
@Override
public void onSuccess(List<GroupMemberInfo> data) {
mutedMemberAdapter.setGroupMemberInfoList(data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
List<String> selectedList = data.getStringArrayListExtra(TUIGroupConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.muteGroupMember(groupInfo.getId(), userId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
loadMutedMember();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
}
}
}
class MutedMemberAdapter extends RecyclerView.Adapter<MutedMemberAdapter.MutedMemberViewHolder> {
private List<GroupMemberInfo> groupMemberInfoList;
private SetGroupManagerActivity.OnItemLongClickListener onItemLongClickListener;
public void setOnItemLongClickListener(SetGroupManagerActivity.OnItemLongClickListener onItemLongClickListener) {
this.onItemLongClickListener = onItemLongClickListener;
}
public void onItemRemoved(GroupMemberInfo memberInfo) {
int index = groupMemberInfoList.indexOf(memberInfo);
groupMemberInfoList.remove(memberInfo);
notifyItemRemoved(index);
}
public void setGroupMemberInfoList(List<GroupMemberInfo> groupMemberInfoList) {
this.groupMemberInfoList = groupMemberInfoList;
notifyDataSetChanged();
}
public List<GroupMemberInfo> getGroupMemberInfoList() {
return groupMemberInfoList;
}
@NonNull
@Override
public MutedMemberViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_manager_item, parent, false);
return new MutedMemberViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MutedMemberViewHolder holder, int position) {
GroupMemberInfo groupMemberInfo = groupMemberInfoList.get(position);
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemLongClickListener != null) {
onItemLongClickListener.onClick(v, groupMemberInfo, position);
}
return false;
}
});
String displayName = getDisplayName(groupMemberInfo);
holder.managerName.setText(displayName);
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getIconUrl());
}
@Override
public int getItemCount() {
if (groupMemberInfoList == null || groupMemberInfoList.isEmpty()) {
return 0;
}
return groupMemberInfoList.size();
}
class MutedMemberViewHolder extends RecyclerView.ViewHolder {
ShadeImageView faceIcon;
TextView managerName;
public MutedMemberViewHolder(@NonNull View itemView) {
super(itemView);
faceIcon = itemView.findViewById(R.id.group_manager_face);
managerName = itemView.findViewById(R.id.group_manage_name);
}
}
}
private String getDisplayName(GroupMemberInfo groupMemberInfo) {
String displayName = groupMemberInfo.getNameCard();
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getNickName();
}
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getAccount();
}
return displayName;
}
interface OnItemLongClickListener {
void onClick(View view, GroupMemberInfo groupMemberInfo);
}
}
@@ -0,0 +1,288 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.page;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupManagerPresenter;
import java.util.ArrayList;
import java.util.List;
public class SetGroupManagerActivity extends BaseLightActivity {
private TitleBarLayout titleBarLayout;
private TextView managerCountLabel;
private GroupManagerPresenter presenter;
private GroupInfo groupInfo;
private RecyclerView managerList;
private ManagerAdapter managerAdapter;
private ShadeImageView ownerFace;
private TextView ownerName;
private View setManagerView;
private String ownerID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_set_group_manager);
titleBarLayout = findViewById(R.id.set_group_manager_title_bar);
managerCountLabel = findViewById(R.id.set_group_manager_manager_label);
managerList = findViewById(R.id.set_group_manager_manager_list);
ownerFace = findViewById(R.id.set_group_manager_owner_face);
ownerName = findViewById(R.id.set_group_manager_owner_name);
setManagerView = findViewById(R.id.set_group_manager_add_manager);
titleBarLayout.setTitle(getString(R.string.group_set_manager), ITitleBarLayout.Position.MIDDLE);
managerList.setLayoutManager(new CustomLinearLayoutManager(this));
managerAdapter = new ManagerAdapter();
managerList.setAdapter(managerAdapter);
groupInfo = (GroupInfo) getIntent().getSerializableExtra(TUIGroupConstants.Group.GROUP_INFO);
presenter = new GroupManagerPresenter();
setClickListener();
loadGroupManager();
loadGroupOwner();
}
private void loadGroupManager() {
presenter.loadGroupManager(groupInfo.getId(), new IUIKitCallback<List<GroupMemberInfo>>() {
@Override
public void onSuccess(List<GroupMemberInfo> data) {
if (data != null) {
managerCountLabel.setText(getString(R.string.group_add_manager_count_label, data.size()));
managerAdapter.setGroupMemberInfoList(data);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
private void loadGroupOwner() {
presenter.loadGroupOwner(groupInfo.getId(), new IUIKitCallback<GroupMemberInfo>() {
@Override
public void onSuccess(GroupMemberInfo data) {
ownerID = data.getAccount();
String faceUrl = data.getIconUrl();
String displayName = getDisplayName(data);
GlideEngine.loadUserIcon(ownerFace, faceUrl);
ownerName.setText(displayName);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
private void setClickListener() {
titleBarLayout.getLeftIcon().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
setManagerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SetGroupManagerActivity.this, GroupMemberActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
ArrayList<String> selectedList = new ArrayList<>();
if (managerAdapter.getGroupMemberInfoList() != null) {
for (GroupMemberInfo memberInfo : managerAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getAccount());
}
intent.putExtra(TUIConstants.TUIGroup.SELECTED_LIST, selectedList);
}
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(ownerID);
intent.putExtra(TUIConstants.TUIGroup.EXCLUDE_LIST, excludeList);
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, groupInfo.getId());
startActivityForResult(intent, 1);
}
});
managerAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public void onClick(View view, GroupMemberInfo memberInfo, int position) {
Drawable drawable = view.getBackground();
if (drawable != null) {
drawable.setColorFilter(0xd9d9d9, PorterDuff.Mode.SRC_IN);
}
View itemPop = LayoutInflater.from(SetGroupManagerActivity.this).inflate(R.layout.group_manager_pop_menu, null);
PopupWindow popupWindow = new PopupWindow(itemPop, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.setOutsideTouchable(true);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
if (drawable != null) {
drawable.clearColorFilter();
}
}
});
TextView popText = itemPop.findViewById(R.id.pop_text);
popText.setText(R.string.group_remove_manager_label);
popText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
presenter.clearGroupManager(groupInfo.getId(), memberInfo.getAccount(), new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
loadGroupManager();
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
});
int x = view.getWidth() / 2;
int y = - view.getHeight() / 3;
int popHeight = ScreenUtil.dip2px(45) * 3;
if (y + popHeight + view.getY() + view.getHeight() > managerList.getBottom()) {
y = y - popHeight;
}
popupWindow.showAsDropDown(view, x, y, Gravity.TOP | Gravity.START);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
List<String> selectedList = data.getStringArrayListExtra(TUIGroupConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.setGroupManager(groupInfo.getId(), userId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
loadGroupManager();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
}
}
}
class ManagerAdapter extends RecyclerView.Adapter<ManagerAdapter.ManagerViewHolder> {
private List<GroupMemberInfo> groupMemberInfoList;
private OnItemLongClickListener onItemLongClickListener;
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
this.onItemLongClickListener = onItemLongClickListener;
}
public void setGroupMemberInfoList(List<GroupMemberInfo> groupMemberInfoList) {
this.groupMemberInfoList = groupMemberInfoList;
notifyDataSetChanged();
}
public List<GroupMemberInfo> getGroupMemberInfoList() {
return groupMemberInfoList;
}
@NonNull
@Override
public ManagerAdapter.ManagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_manager_item, parent, false);
return new ManagerViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ManagerViewHolder holder, int position) {
GroupMemberInfo groupMemberInfo = groupMemberInfoList.get(position);
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemLongClickListener != null) {
onItemLongClickListener.onClick(v, groupMemberInfo, position);
}
return true;
}
});
String displayName = getDisplayName(groupMemberInfo);
holder.managerName.setText(displayName);
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getIconUrl());
}
@Override
public int getItemCount() {
if (groupMemberInfoList == null || groupMemberInfoList.isEmpty()) {
return 0;
}
return groupMemberInfoList.size();
}
class ManagerViewHolder extends RecyclerView.ViewHolder {
ShadeImageView faceIcon;
TextView managerName;
public ManagerViewHolder(@NonNull View itemView) {
super(itemView);
faceIcon = itemView.findViewById(R.id.group_manager_face);
managerName = itemView.findViewById(R.id.group_manage_name);
}
}
}
private String getDisplayName(GroupMemberInfo groupMemberInfo) {
String displayName = groupMemberInfo.getNameCard();
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getNickName();
}
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getAccount();
}
return displayName;
}
interface OnItemLongClickListener {
void onClick(View view, GroupMemberInfo groupMemberInfo, int position);
}
}
@@ -0,0 +1,170 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.view;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupApplyPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupApplyAdapter extends BaseAdapter {
private List<GroupApplyInfo> mGroupMembers = new ArrayList<>();
private OnItemClickListener mOnItemClickListener;
private GroupApplyPresenter presenter;
public GroupApplyAdapter() {
}
public void setPresenter(GroupApplyPresenter presenter) {
this.presenter = presenter;
}
@Override
public int getCount() {
return mGroupMembers.size();
}
public int getUnHandledSize() {
int total = 0;
for (GroupApplyInfo i : mGroupMembers) {
if (i.getStatus() == GroupApplyInfo.UNHANDLED) {
total++;
}
}
return total;
}
@Override
public GroupApplyInfo getItem(int i) {
return mGroupMembers.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
MyViewHolder holder;
final GroupApplyInfo info = getItem(i);
if (view == null) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.group_member_apply_adpater, viewGroup, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null && info.getStatus() == GroupApplyInfo.UNHANDLED) {
mOnItemClickListener.onItemClick(info);
}
}
});
holder = new MyViewHolder();
holder.memberIcon = view.findViewById(R.id.group_apply_member_icon);
holder.memberName = view.findViewById(R.id.group_apply_member_name);
holder.reason = view.findViewById(R.id.group_apply_reason);
holder.accept = view.findViewById(R.id.group_apply_accept);
holder.refuse = view.findViewById(R.id.group_apply_refuse);
view.setTag(holder);
} else {
holder = (MyViewHolder) view.getTag();
}
holder.memberName.setText(info.getGroupApplication().getFromUser());
holder.reason.setText(info.getGroupApplication().getRequestMsg());
if (info.getStatus() == GroupApplyInfo.UNHANDLED) {
holder.accept.setVisibility(View.VISIBLE);
holder.accept.setText(R.string.accept);
holder.accept.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.color.bg_positive_btn));
holder.accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
acceptApply(i, info);
}
});
holder.refuse.setVisibility(View.VISIBLE);
holder.refuse.setText(R.string.refuse);
holder.refuse.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.color.bg_negative_btn));
holder.refuse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
refuseApply(i, info);
}
});
} else if (info.getStatus() == GroupApplyInfo.APPLIED) {
holder.accept.setVisibility(View.VISIBLE);
holder.accept.setClickable(false);
holder.accept.setText(R.string.accepted);
holder.accept.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.drawable.gray_btn_bg));
holder.refuse.setVisibility(View.GONE);
} else if (info.getStatus() == GroupApplyInfo.REFUSED) {
holder.refuse.setVisibility(View.VISIBLE);
holder.refuse.setClickable(false);
holder.refuse.setText(R.string.refused);
holder.refuse.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.drawable.gray_btn_bg));
holder.accept.setVisibility(View.GONE);
}
return view;
}
public void setOnItemClickListener(OnItemClickListener l) {
mOnItemClickListener = l;
}
public void updateItemData(GroupApplyInfo info) {
for (GroupApplyInfo i : mGroupMembers) {
if (TextUtils.equals(i.getGroupApplication().getFromUser(), info.getGroupApplication().getFromUser())) {
i.setStatus(info.getStatus());
notifyDataSetChanged();
break;
}
}
}
public void setDataSource(GroupInfo info) {
presenter.loadGroupApplies();
}
public void setDataSource(List<GroupApplyInfo> applyInfoList) {
mGroupMembers = applyInfoList;
notifyDataSetChanged();
}
public void acceptApply(final int position, final GroupApplyInfo item) {
if (presenter == null) {
return;
}
presenter.acceptApply(item);
}
public void refuseApply(final int position, final GroupApplyInfo item) {
if (presenter == null) {
return;
}
presenter.refuseApply(item);
}
public interface OnItemClickListener {
void onItemClick(GroupApplyInfo info);
}
private class MyViewHolder {
private ImageView memberIcon;
private TextView memberName, reason;
private Button accept, refuse;
}
}
@@ -0,0 +1,110 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.view;
import android.app.Activity;
import android.content.Context;
import androidx.annotation.Nullable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupApplyPresenter;
import java.util.HashMap;
import java.util.List;
public class GroupApplyManagerLayout extends LinearLayout implements IGroupApplyLayout {
private TitleBarLayout mTitleBar;
private ListView mApplyMemberList;
private GroupApplyAdapter mAdapter;
private GroupApplyPresenter presenter;
public GroupApplyManagerLayout(Context context) {
super(context);
init();
}
public GroupApplyManagerLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GroupApplyManagerLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inflate(getContext(), R.layout.group_apply_manager_layout, this);
mApplyMemberList = findViewById(R.id.group_apply_members);
mAdapter = new GroupApplyAdapter();
mAdapter.setOnItemClickListener(new GroupApplyAdapter.OnItemClickListener() {
@Override
public void onItemClick(GroupApplyInfo info) {
Bundle bundle = new Bundle();
bundle.putString("fromUser", info.getFromUser());
bundle.putString("fromUserNickName", info.getFromUserNickName());
bundle.putString("requestMsg", info.getRequestMsg());
bundle.putSerializable("groupApplication", info.getGroupApplication());
TUICore.startActivity(getContext(),"FriendProfileActivity", bundle, TUIGroupConstants.ActivityRequest.CODE_1);
}
});
mApplyMemberList.setAdapter(mAdapter);
mTitleBar = findViewById(R.id.group_apply_title_bar);
mTitleBar.getRightGroup().setVisibility(View.GONE);
mTitleBar.setTitle(getResources().getString(R.string.group_apply_members), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (getContext() instanceof Activity) {
((Activity) getContext()).finish();
}
}
});
}
public TitleBarLayout getTitleBar() {
return mTitleBar;
}
public void updateItemData(GroupApplyInfo info) {
mAdapter.updateItemData(info);
}
public void onDataSetChanged() {
mAdapter.notifyDataSetChanged();
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIChat.IS_GROUP_CHAT, true);
param.put(TUIConstants.TUIChat.GROUP_APPLY_NUM, mAdapter.getCount()-1);
TUICore.callService(TUIConstants.TUIChat.SERVICE_NAME, TUIConstants.TUIChat.METHOD_GROUP_APPLICAITON_PROCESSED, param);
}
public void setPresenter(GroupApplyPresenter groupApplyPresenter) {
this.presenter = groupApplyPresenter;
mAdapter.setPresenter(groupApplyPresenter);
}
public void onGroupApplyInfoListChanged(List<GroupApplyInfo> applyInfoList) {
mAdapter.setDataSource(applyInfoList);
}
public void setDataSource(GroupInfo dataSource) {
presenter.setGroupInfo(dataSource);
mAdapter.setDataSource(dataSource);
}
}
@@ -0,0 +1,213 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.view;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.util.BackgroundTasks;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupInfoAdapter extends BaseAdapter {
private static final int ADD_TYPE = -100;
private static final int DEL_TYPE = -101;
private static final int OWNER_PRIVATE_MAX_LIMIT = 8; //讨论组,owner可以添加成员和删除成员,
private static final int OWNER_PUBLIC_MAX_LIMIT = 9; //公开群,owner不可以添加成员,但是可以删除成员
private static final int OWNER_CHATROOM_MAX_LIMIT = 9; //聊天室,owner不可以添加成员,但是可以删除成员
private static final int OWNER_COMMUNITY_MAX_LIMIT = 8; //社群,owner可以添加成员和删除成员,
private static final int NORMAL_PRIVATE_MAX_LIMIT = 9; //讨论组,普通人可以添加成员
private static final int NORMAL_PUBLIC_MAX_LIMIT = 10; //公开群,普通人没有权限添加成员和删除成员
private static final int NORMAL_CHATROOM_MAX_LIMIT = 10; //聊天室,普通人没有权限添加成员和删除成员
private static final int NORMAL_COMMUNITY_MAX_LIMIT = 9; //社群,普通人可以添加成员
private List<GroupMemberInfo> mGroupMembers = new ArrayList<>();
private IGroupMemberListener mTailListener;
private GroupInfo mGroupInfo;
private GroupInfoPresenter presenter;
public void setPresenter(GroupInfoPresenter presenter) {
this.presenter = presenter;
}
public void setManagerCallBack(IGroupMemberListener listener) {
mTailListener = listener;
}
@Override
public int getCount() {
return mGroupMembers.size();
}
@Override
public GroupMemberInfo getItem(int i) {
return mGroupMembers.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, final ViewGroup viewGroup) {
MyViewHolder holder;
if (view == null) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.group_member_item_layout, viewGroup, false);
holder = new MyViewHolder();
holder.memberIcon = view.findViewById(R.id.group_member_icon);
holder.memberName = view.findViewById(R.id.group_member_name);
view.setTag(holder);
} else {
holder = (MyViewHolder) view.getTag();
}
final GroupMemberInfo info = getItem(i);
GlideEngine.loadImage(holder.memberIcon, info.getIconUrl());
// 显示优先级 群名片->昵称->账号
if (!TextUtils.isEmpty(info.getNameCard())) {
holder.memberName.setText(info.getNameCard());
} else {
if (!TextUtils.isEmpty(info.getNickName())) {
holder.memberName.setText(info.getNickName());
} else {
if (!TextUtils.isEmpty(info.getAccount())) {
holder.memberName.setText(info.getAccount());
} else {
holder.memberName.setText("");
}
}
}
view.setOnClickListener(null);
holder.memberIcon.setBackground(null);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_CROP);
if (info.getMemberType() == ADD_TYPE) {
holder.memberIcon.setImageResource(R.drawable.add_group_member);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
holder.memberIcon.setBackgroundResource(R.drawable.bottom_action_border);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTailListener != null) {
mTailListener.forwardAddMember(mGroupInfo);
}
}
});
} else if (info.getMemberType() == DEL_TYPE) {
holder.memberIcon.setImageResource(R.drawable.del_group_member);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
holder.memberIcon.setBackgroundResource(R.drawable.bottom_action_border);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTailListener != null) {
mTailListener.forwardDeleteMember(mGroupInfo);
}
}
});
}
return view;
}
public void setDataSource(GroupInfo info) {
mGroupInfo = info;
mGroupMembers.clear();
List<GroupMemberInfo> members = info.getMemberDetails();
if (members != null) {
int shootMemberCount = 0;
if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_WORK)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_PRIVATE_MAX_LIMIT ? OWNER_PRIVATE_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_PRIVATE_MAX_LIMIT ? NORMAL_PRIVATE_MAX_LIMIT : members.size();
}
} else if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_PUBLIC)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_PUBLIC_MAX_LIMIT ? OWNER_PUBLIC_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_PUBLIC_MAX_LIMIT ? NORMAL_PUBLIC_MAX_LIMIT : members.size();
}
} else if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_CHAT_ROOM)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_MEETING)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_CHATROOM_MAX_LIMIT ? OWNER_CHATROOM_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_CHATROOM_MAX_LIMIT ? NORMAL_CHATROOM_MAX_LIMIT : members.size();
}
} else if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_COMMUNITY)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_COMMUNITY_MAX_LIMIT ? OWNER_COMMUNITY_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_COMMUNITY_MAX_LIMIT ? NORMAL_COMMUNITY_MAX_LIMIT : members.size();
}
}
for (int i = 0; i < shootMemberCount; i++) {
mGroupMembers.add(members.get(i));
}
if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_WORK)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_COMMUNITY)) {
// 公开群/聊天室 只有APP管理员可以邀请他人入群
GroupMemberInfo add = new GroupMemberInfo();
add.setMemberType(ADD_TYPE);
mGroupMembers.add(add);
}
GroupMemberInfo self = null;
for (int i = 0; i < mGroupMembers.size(); i++) {
GroupMemberInfo memberInfo = mGroupMembers.get(i);
if (isSelf(memberInfo.getAccount())) {
self = memberInfo;
break;
}
}
if (info.isOwner() || (self != null && isAdmin(self.getMemberType()))) {
GroupMemberInfo del = new GroupMemberInfo();
del.setMemberType(DEL_TYPE);
mGroupMembers.add(del);
}
BackgroundTasks.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}
public boolean isAdmin(int memberType) {
if (presenter != null) {
return presenter.isAdmin(memberType);
}
return false;
}
public boolean isSelf(String userId) {
if (presenter != null) {
return presenter.isSelf(userId);
}
return false;
}
private class MyViewHolder {
private ImageView memberIcon;
private TextView memberName;
}
}
@@ -0,0 +1,680 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.view;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.component.LineControllerView;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.SelectionActivity;
import com.tencent.qcloud.tuicore.component.dialog.TUIKitDialog;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.component.popupcard.PopupInputCard;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.TUIUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.classicui.page.GroupInfoActivity;
import com.tencent.qcloud.tuikit.tuigroup.classicui.page.GroupInfoFragment;
import com.tencent.qcloud.tuikit.tuigroup.classicui.page.GroupMemberActivity;
import com.tencent.qcloud.tuikit.tuigroup.classicui.page.GroupNoticeActivity;
import com.tencent.qcloud.tuikit.tuigroup.classicui.page.ManageGroupActivity;
import com.tencent.qcloud.tuikit.tuigroup.component.BottomSelectSheet;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupLog;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupInfoLayout extends LinearLayout implements IGroupMemberLayout, View.OnClickListener {
private static final String TAG = GroupInfoLayout.class.getSimpleName();
private TitleBarLayout mTitleBar;
private LineControllerView mMemberView;
private GroupInfoAdapter mMemberAdapter;
private IGroupMemberListener mMemberPreviewListener;
private LineControllerView mGroupTypeView;
private TextView mGroupIDView;
private TextView mGroupNameView;
private View groupDetailArea;
private ImageView mGroupIcon;
private ImageView mGroupDetailArrow;
private View mGroupNotice;
private TextView mGroupNoticeText;
private LineControllerView mGroupManageView;
private LineControllerView mNickView;
private LineControllerView mJoinTypeView;
private LineControllerView mTopSwitchView;
private LineControllerView mMsgRevOptionSwitchView;
private LineControllerView mFoldGroupChatSwitchView;
private LineControllerView mChatBackground;
private View mLayoutFold;
private TextView mDissolveBtn;
private TextView mClearMsgBtn;
private TextView mChangeOwnerBtn;
private GridView memberList;
private OnButtonClickListener mListener;
private GroupInfo mGroupInfo;
private GroupInfoPresenter mPresenter;
private ArrayList<String> mJoinTypes = new ArrayList<>();
private GroupInfoFragment.OnModifyGroupAvatarListener onModifyGroupAvatarListener;
public GroupInfoLayout(Context context) {
super(context);
init();
}
public GroupInfoLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GroupInfoLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inflate(getContext(), R.layout.group_info_layout, this);
// 标题
mTitleBar = findViewById(R.id.group_info_title_bar);
mTitleBar.getRightGroup().setVisibility(GONE);
mTitleBar.setTitle(getResources().getString(R.string.group_detail), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((Activity) getContext()).finish();
}
});
// 成员标题
mMemberView = findViewById(R.id.group_member_bar);
mMemberView.setOnClickListener(this);
mMemberView.setCanNav(true);
// 成员列表
memberList = findViewById(R.id.group_members);
mMemberAdapter = new GroupInfoAdapter();
memberList.setAdapter(mMemberAdapter);
// 群类型,只读
mGroupTypeView = findViewById(R.id.group_type_bar);
// 群ID,只读
mGroupIDView = findViewById(R.id.group_account);
// 群聊名称
mGroupNameView = findViewById(R.id.group_name);
groupDetailArea = findViewById(R.id.group_detail_area);
groupDetailArea.setOnClickListener(this);
// 群头像
mGroupIcon = findViewById(R.id.group_icon);
mGroupIcon.setOnClickListener(this);
// 群详情右箭头
mGroupDetailArrow = findViewById(R.id.group_detail_arrow);
// 群公告
mGroupNotice = findViewById(R.id.group_notice);
mGroupNotice.setOnClickListener(this);
mGroupNoticeText = findViewById(R.id.group_notice_text);
// 群管理
mGroupManageView = findViewById(R.id.group_manage);
mGroupManageView.setOnClickListener(this);
// 加群方式
mJoinTypeView = findViewById(R.id.join_type_bar);
mJoinTypeView.setOnClickListener(this);
mJoinTypeView.setCanNav(true);
mJoinTypes.addAll(Arrays.asList(getResources().getStringArray(R.array.group_join_type)));
// 群昵称
mNickView = findViewById(R.id.self_nickname_bar);
mNickView.setOnClickListener(this);
mNickView.setCanNav(true);
// 是否置顶
mTopSwitchView = findViewById(R.id.chat_to_top_switch);
mTopSwitchView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
if (mGroupInfo == null) {
return;
}
mPresenter.setTopConversation(mGroupInfo.getId(), isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
buttonView.setChecked(false);
}
});
}
});
// 消息接收选项
mMsgRevOptionSwitchView = findViewById(R.id.msg_rev_option);
// 折叠
mLayoutFold = findViewById(R.id.layout_fold);
mFoldGroupChatSwitchView = findViewById(R.id.fold_group_chat);
// 退群
mDissolveBtn = findViewById(R.id.group_dissolve_button);
mDissolveBtn.setOnClickListener(this);
// 清空群消息按钮
mClearMsgBtn = findViewById(R.id.group_clear_msg_button);
mClearMsgBtn.setOnClickListener(this);
// 转让群主
mChangeOwnerBtn = findViewById(R.id.group_change_owner_button);
mChangeOwnerBtn.setOnClickListener(this);
mChatBackground = findViewById(R.id.chat_background);
mChatBackground.setOnClickListener(this);
mChatBackground.setCanNav(true);
}
private void initView() {
int radius = ScreenUtil.dip2px(5);
GlideEngine.loadUserIcon(mGroupIcon, mGroupInfo.getFaceUrl(), TUIUtil.getDefaultGroupIconResIDByGroupType(getContext(), mGroupInfo.getGroupType()), radius);
if (!mGroupInfo.isCanManagerGroup()) {
mGroupDetailArrow.setVisibility(GONE);
}
if (mGroupInfo.isOwner()) {
mChangeOwnerBtn.setVisibility(VISIBLE);
} else {
mChangeOwnerBtn.setVisibility(GONE);
}
}
public void setGroupInfoPresenter(GroupInfoPresenter presenter) {
this.mPresenter = presenter;
if (mMemberAdapter != null) {
mMemberAdapter.setPresenter(presenter);
}
}
@Override
public void onClick(View v) {
if (mGroupInfo == null) {
TUIGroupLog.e(TAG, "mGroupInfo is NULL");
return;
}
if (v.getId() == R.id.group_member_bar) {
if (mMemberPreviewListener != null) {
mMemberPreviewListener.forwardListMember(mGroupInfo);
}
} else if (v.getId() == R.id.group_detail_area) {
if (!mGroupInfo.isCanManagerGroup()) {
return;
}
PopupInputCard popupInputCard = new PopupInputCard((Activity) getContext());
BottomSelectSheet sheet = new BottomSelectSheet(getContext());
List<String> stringList = new ArrayList<>();
String modifyGroupName = getResources().getString(R.string.modify_group_name);
String modifyGroupNotice = getResources().getString(R.string.modify_group_notice);
stringList.add(modifyGroupName);
stringList.add(modifyGroupNotice);
sheet.setSelectList(stringList);
sheet.setOnClickListener(new BottomSelectSheet.BottomSelectSheetOnClickListener() {
@Override
public void onSheetClick(int index) {
if (index == 0) {
popupInputCard.setContent(mGroupNameView.getText().toString());
popupInputCard.setTitle(modifyGroupName);
popupInputCard.setOnPositive((result -> {
mPresenter.modifyGroupName(result);
if (!TextUtils.isEmpty(result)) {
mGroupNameView.setText(result);
}
}));
popupInputCard.show(groupDetailArea, Gravity.BOTTOM);
} else if (index == 1) {
popupInputCard.setContent(mGroupNoticeText.getText().toString());
popupInputCard.setTitle(modifyGroupNotice);
popupInputCard.setOnPositive((result -> {
mPresenter.modifyGroupNotice(result);
if (TextUtils.isEmpty(result)) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(result);
}
}));
popupInputCard.show(groupDetailArea, Gravity.BOTTOM);
}
}
});
sheet.show();
} else if (v.getId() == R.id.group_icon) {
if (!mGroupInfo.isCanManagerGroup()) {
return;
}
if (onModifyGroupAvatarListener != null) {
onModifyGroupAvatarListener.onModifyGroupAvatar(mGroupInfo.getFaceUrl());
}
} else if (v.getId() == R.id.group_notice) {
Intent intent = new Intent(getContext(), GroupNoticeActivity.class);
GroupNoticeActivity.setOnGroupNoticeChangedListener(new GroupNoticeActivity.OnGroupNoticeChangedListener() {
@Override
public void onChanged(String notice) {
if (TextUtils.isEmpty(notice)) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(notice);
}
}
});
intent.putExtra(TUIGroupConstants.Group.GROUP_INFO, mGroupInfo);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(intent);
} else if (v.getId() == R.id.self_nickname_bar) {
PopupInputCard popupInputCard = new PopupInputCard((Activity) getContext());
popupInputCard.setContent(mNickView.getContent());
popupInputCard.setTitle(getResources().getString(R.string.modify_nick_name_in_goup));
String description = getResources().getString(R.string.group_modify_remark_rule);
popupInputCard.setRule("^[a-zA-Z0-9_\u4e00-\u9fa5]*$");
popupInputCard.setDescription(description);
popupInputCard.setOnPositive((result -> {
mPresenter.modifyMyGroupNickname(result);
mNickView.setContent(result);
}));
popupInputCard.show(mNickView, Gravity.BOTTOM);
} else if (v.getId() == R.id.join_type_bar) {
if (mGroupTypeView.getContent().equals(getContext().getString(R.string.chat_room))) {
ToastUtil.toastLongMessage(getContext().getString(R.string.chat_room_tip));
return;
}
Bundle bundle = new Bundle();
bundle.putString(SelectionActivity.Selection.TITLE, getResources().getString(R.string.group_join_type));
bundle.putStringArrayList(SelectionActivity.Selection.LIST, mJoinTypes);
bundle.putInt(SelectionActivity.Selection.DEFAULT_SELECT_ITEM_INDEX, mGroupInfo.getJoinType());
SelectionActivity.startListSelection((Activity) getContext(), bundle, new SelectionActivity.OnResultReturnListener() {
@Override
public void onReturn(final Object text) {
mPresenter.modifyGroupInfo((Integer) text, TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE);
}
});
} else if (v.getId() == R.id.group_dissolve_button) {
if (mGroupInfo.isOwner() &&
(!mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_WORK)
&& !mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_PRIVATE))) {
new TUIKitDialog(getContext())
.builder()
.setCancelable(true)
.setCancelOutside(true)
.setTitle(getContext().getString(R.string.dismiss_group_tip))
.setDialogWidth(0.75f)
.setPositiveButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.deleteGroup(new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
((Activity) GroupInfoLayout.this.getContext()).finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(errMsg);
}
});
}
})
.setNegativeButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.cancel), new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
} else {
new TUIKitDialog(getContext())
.builder()
.setCancelable(true)
.setCancelOutside(true)
.setTitle(getContext().getString(R.string.quit_group_tip))
.setDialogWidth(0.75f)
.setPositiveButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.quitGroup(new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
((Activity) GroupInfoLayout.this.getContext()).finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
((Activity) GroupInfoLayout.this.getContext()).finish();
ToastUtil.toastShortMessage("quitGroup failed, errCode = " + errCode + " errMsg = " + errMsg);
}
});
}
})
.setNegativeButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.cancel), new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
}
} else if (v.getId() == R.id.group_clear_msg_button) {
new TUIKitDialog(getContext())
.builder()
.setCancelable(true)
.setCancelOutside(true)
.setTitle(getContext().getString(R.string.clear_group_msg_tip))
.setDialogWidth(0.75f)
.setPositiveButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), new View.OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> hashMap = new HashMap<>();
hashMap.put(TUIConstants.TUIGroup.GROUP_ID, mGroupInfo.getId());
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP,
TUIConstants.TUIGroup.EVENT_SUB_KEY_CLEAR_MESSAGE, hashMap);
}
})
.setNegativeButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.cancel), new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
} else if (v.getId() == R.id.group_manage) {
Intent intent = new Intent(getContext(), ManageGroupActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(TUIGroupConstants.Group.GROUP_INFO, mGroupInfo);
getContext().startActivity(intent);
} else if (v == mChangeOwnerBtn) {
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(TUILogin.getLoginUser());
Intent intent = new Intent(getContext(), GroupMemberActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, mGroupInfo.getId());
intent.putExtra(TUIConstants.TUIGroup.LIMIT, 1);
intent.putExtra(TUIConstants.TUIGroup.EXCLUDE_LIST, excludeList);
intent.putExtra(TUIConstants.TUIGroup.TITLE, getResources().getString(R.string.group_transfer_group_owner));
((Activity) getContext()).startActivityForResult(intent, GroupInfoActivity.REQUEST_FOR_CHANGE_OWNER);
} else if (v.getId() == R.id.chat_background) {
if (mListener != null) {
mListener.onSetChatBackground();
}
}
}
public void loadGroupInfo(String groupId) {
mPresenter.loadGroupInfo(groupId);
}
public void getGroupMembers(GroupInfo groupInfo) {
mPresenter.getGroupMembers(groupInfo, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
setGroupInfo((GroupInfo) data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
public void setGroupInfo(GroupInfo info) {
if (info == null) {
return;
}
this.mGroupInfo = info;
mGroupNameView.setText(info.getGroupName());
mGroupIDView.setText(info.getId());
if (TextUtils.isEmpty(info.getNotice())) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(info.getNotice());
}
mMemberView.setContent(info.getMemberCount() + "");
mMemberAdapter.setDataSource(info);
int columnNum = memberList.getNumColumns();
int rowNum = (int) Math.ceil(mMemberAdapter.getCount() * 1.0f / columnNum);
int itemHeight = ScreenUtil.dip2px(88);
ViewGroup.LayoutParams layoutParams = memberList.getLayoutParams();
layoutParams.height = itemHeight * rowNum;
memberList.setLayoutParams(layoutParams);
mGroupTypeView.setContent(convertGroupText(info.getGroupType()));
mJoinTypeView.setContent(mJoinTypes.get(info.getJoinType()));
mNickView.setContent(mPresenter.getNickName());
mTopSwitchView.setChecked(mGroupInfo.isTopChat());
if (GroupInfo.GROUP_TYPE_MEETING.equals(info.getGroupType())) {
mMsgRevOptionSwitchView.setVisibility(GONE);
mLayoutFold.setVisibility(GONE);
} else {
if (mGroupInfo.getMessageReceiveOption()) {
mLayoutFold.setVisibility(View.VISIBLE);
if (mGroupInfo.isFolded()) {
mFoldGroupChatSwitchView.setChecked(true);
}
} else {
mLayoutFold.setVisibility(View.GONE);
}
mMsgRevOptionSwitchView.setChecked(mGroupInfo.getMessageReceiveOption());
mMsgRevOptionSwitchView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
mPresenter.setGroupNotDisturb(mGroupInfo, isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
if (!isChecked) {
mLayoutFold.setVisibility(View.GONE);
if (mGroupInfo.isFolded()) {
mPresenter.setGroupFold(mGroupInfo, false, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mFoldGroupChatSwitchView.setChecked(false);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
}
} else {
mLayoutFold.setVisibility(View.VISIBLE);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
}
});
}
if (mGroupInfo.isFolded()) {
mTopSwitchView.setMask(true);
}
mFoldGroupChatSwitchView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mPresenter.setGroupFold(mGroupInfo, isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
if (isChecked) {
if (mGroupInfo.isTopChat()) {
mPresenter.setTopConversation(mGroupInfo.getId(), false, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mTopSwitchView.setChecked(false);
mTopSwitchView.setMask(true);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
} else {
mTopSwitchView.setMask(true);
}
} else {
mTopSwitchView.setMask(false);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
}
});
mDissolveBtn.setText(R.string.dissolve);
mClearMsgBtn.setText(R.string.clear_message);
if (mGroupInfo.isOwner()) {
mJoinTypeView.setVisibility(VISIBLE);
if (mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_WORK)
|| mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_PRIVATE)) {
mDissolveBtn.setText(R.string.exit_group);
}
} else {
mJoinTypeView.setCanNav(false);
mJoinTypeView.setOnClickListener(null);
mDissolveBtn.setText(R.string.exit_group);
}
if (mGroupInfo.isCanManagerGroup()) {
mGroupManageView.setVisibility(VISIBLE);
}
initView();
}
private String convertGroupText(String groupType) {
String groupText = "";
if (TextUtils.isEmpty(groupType)) {
return groupText;
}
if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_WORK)) {
groupText = getContext().getString(R.string.private_group);
} else if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_PUBLIC)) {
groupText = getContext().getString(R.string.public_group);
} else if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_CHAT_ROOM)
|| TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_MEETING)) {
groupText = getContext().getString(R.string.chat_room);
} else if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_COMMUNITY)) {
groupText = getContext().getString(R.string.community_group);
}
return groupText;
}
public void onGroupInfoModified(Object value, int type) {
switch (type) {
case TUIGroupConstants.Group.MODIFY_GROUP_NAME:
ToastUtil.toastLongMessage(getResources().getString(R.string.modify_group_name_success));
mGroupNameView.setText(value.toString());
break;
case TUIGroupConstants.Group.MODIFY_GROUP_NOTICE:
if (TextUtils.isEmpty(value.toString())) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(value.toString());
}
ToastUtil.toastLongMessage(getResources().getString(R.string.modify_group_notice_success));
break;
case TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE:
mJoinTypeView.setContent(mJoinTypes.get((Integer) value));
break;
case TUIGroupConstants.Group.MODIFY_MEMBER_NAME:
ToastUtil.toastLongMessage(getResources().getString(R.string.modify_nickname_success));
mNickView.setContent(value.toString());
break;
}
}
public void setRouter(IGroupMemberListener listener) {
mMemberPreviewListener = listener;
mMemberAdapter.setManagerCallBack(listener);
}
public void setOnModifyGroupAvatarListener(GroupInfoFragment.OnModifyGroupAvatarListener onModifyGroupAvatarListener) {
this.onModifyGroupAvatarListener = onModifyGroupAvatarListener;
}
public void modifyGroupAvatar(String avatarUrl) {
mPresenter.modifyGroupFaceUrl(mGroupInfo.getId(), avatarUrl, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mGroupInfo.setFaceUrl(avatarUrl);
setGroupInfo(mGroupInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(TUIGroupService.getAppContext().getString(R.string.modify_icon_fail) + ", code = " + errCode + ", info = " + errMsg);
}
});
}
@Override
public void onGroupInfoChanged(GroupInfo dataSource) {
setGroupInfo(dataSource);
}
@Override
public TitleBarLayout getTitleBar() {
return mTitleBar;
}
@Override
public void setParentLayout(Object parent) {
}
public void setOnButtonClickListener(OnButtonClickListener l) {
mListener = l;
}
public interface OnButtonClickListener {
default void onSetChatBackground() {};
}
}
@@ -0,0 +1,238 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.view;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.BackgroundTasks;
import com.tencent.qcloud.tuicore.util.PopWindowUtil;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberAdapter extends RecyclerView.Adapter<GroupMemberAdapter.GroupMemberViewHodler> {
private IGroupMemberChangedCallback mCallback;
private GroupInfo mGroupInfo;
private List<GroupMemberInfo> mGroupMembers = new ArrayList<>();
private List<GroupMemberInfo> selectedGroupMemberInfos = new ArrayList<>();
private GroupInfoPresenter presenter;
private boolean isSelectMode;
private GroupMemberLayout.OnSelectChangedListener onSelectChangedListener;
private ArrayList<String> selectedMember = new ArrayList<>();
private ArrayList<String> excludeList;
private ArrayList<String> alreadySelectedList;
public void setSelectMode(boolean selectMode) {
isSelectMode = selectMode;
}
public ArrayList<String> getSelectedMember() {
return selectedMember;
}
public List<GroupMemberInfo> getSelectedMemberInfoList() {
return selectedGroupMemberInfos;
}
public void setPresenter(GroupInfoPresenter presenter) {
this.presenter = presenter;
}
public void setMemberChangedCallback(IGroupMemberChangedCallback callback) {
this.mCallback = callback;
}
public void setExcludeList(ArrayList<String> excludeList) {
this.excludeList = excludeList;
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
this.alreadySelectedList = alreadySelectedList;
}
public void setOnSelectChangedListener(GroupMemberLayout.OnSelectChangedListener onSelectChangedListener) {
this.onSelectChangedListener = onSelectChangedListener;
}
@NonNull
@Override
public GroupMemberViewHodler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_member_list_item, parent, false);
return new GroupMemberViewHodler(view);
}
@Override
public void onBindViewHolder(@NonNull GroupMemberViewHodler holder, int position) {
final GroupMemberInfo info = mGroupMembers.get(position);
GlideEngine.loadImage(holder.memberIcon, info.getIconUrl());
if (!TextUtils.isEmpty(info.getNameCard())) {
holder.memberName.setText(info.getNameCard());
} else {
if (!TextUtils.isEmpty(info.getNickName())) {
holder.memberName.setText(info.getNickName());
} else {
if (!TextUtils.isEmpty(info.getAccount())) {
holder.memberName.setText(info.getAccount());
} else {
holder.memberName.setText("");
}
}
}
if (isSelectMode) {
holder.checkBox.setVisibility(View.VISIBLE);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkBox.setChecked(!holder.checkBox.isChecked());
if (holder.checkBox.isChecked()) {
info.setSelected(true);
selectedMember.add(info.getAccount());
selectedGroupMemberInfos.add(info);
} else {
info.setSelected(false);
selectedMember.remove(info.getAccount());
selectedGroupMemberInfos.remove(info);
}
if (onSelectChangedListener != null) {
onSelectChangedListener.onSelectChanged();
}
}
});
} else {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (!mGroupInfo.isOwner()) {
return false;
}
TextView delete = new TextView(holder.itemView.getContext());
delete.setText(R.string.group_remove_member);
int padding = ScreenUtil.getPxByDp(10);
delete.setPadding(padding, padding, padding, padding);
delete.setBackgroundResource(R.drawable.text_border);
int location[] = new int[2];
v.getLocationInWindow(location);
final PopupWindow window = PopWindowUtil.popupWindow(delete, holder.itemView, location[0], location[1] + v.getMeasuredHeight() / 3);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<GroupMemberInfo> dels = new ArrayList<>();
dels.add(info);
if (presenter == null) {
return;
}
presenter.removeGroupMembers(mGroupInfo, dels, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
mGroupMembers.remove(info);
notifyDataSetChanged();
if (mCallback != null) {
mCallback.onMemberRemoved(info);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.remove_fail_tip) + ":errCode=" + errCode);
}
});
window.dismiss();
}
});
return false;
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, info.getAccount());
TUICore.startActivity("FriendProfileActivity", bundle);
}
});
}
setAlreadySelected(holder, info);
}
private void setAlreadySelected(GroupMemberViewHodler holder, GroupMemberInfo memberInfo) {
if (alreadySelectedList != null && alreadySelectedList.contains(memberInfo.getAccount())) {
holder.checkBox.setChecked(true);
holder.itemView.setEnabled(false);
holder.checkBox.setEnabled(false);
} else {
holder.itemView.setEnabled(true);
holder.checkBox.setEnabled(true);
holder.checkBox.setSelected(memberInfo.isSelected());
}
}
@Override
public int getItemCount() {
if (mGroupMembers == null) {
return 0;
}
return mGroupMembers.size();
}
public void setDataSource(GroupInfo groupInfo) {
if (groupInfo != null) {
mGroupInfo = groupInfo;
mGroupMembers.clear();
if (excludeList == null || excludeList.isEmpty()) {
mGroupMembers.addAll(groupInfo.getMemberDetails());
} else {
for (GroupMemberInfo groupMemberInfo : groupInfo.getMemberDetails()) {
if (excludeList.contains(groupMemberInfo.getAccount())) {
continue;
}
mGroupMembers.add(groupMemberInfo);
}
}
BackgroundTasks.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}
protected class GroupMemberViewHodler extends RecyclerView.ViewHolder {
private ImageView memberIcon;
private TextView memberName;
private CheckBox checkBox;
public GroupMemberViewHodler(@NonNull View itemView) {
super(itemView);
checkBox = itemView.findViewById(R.id.group_member_check_box);
memberIcon = itemView.findViewById(R.id.group_member_icon);
memberName = itemView.findViewById(R.id.group_member_name);
}
}
}
@@ -0,0 +1,299 @@
package com.tencent.qcloud.tuikit.tuigroup.classicui.view;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuigroup.classicui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.component.BottomSelectSheet;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberLayout extends LinearLayout implements IGroupMemberLayout {
// 取一个足够大的偏移保证能一次性滚动到最底部
// Take a large enough offset to scroll to the bottom at one time
private static final int SCROLL_TO_END_OFFSET = -999999;
private TitleBarLayout mTitleBar;
private GroupMemberAdapter mAdapter;
private IGroupMemberListener groupMemberListener;
private GroupInfo mGroupInfo;
private RecyclerView recyclerView;
private boolean isSelectMode;
private String title;
private ArrayList<String> excludeList;
private ArrayList<String> alreadySelectedList;
private RecyclerView selectedList;
private SelectedAdapter selectedListAdapter;
private View selectArea;
private TextView confirmButton;
private GroupInfoPresenter presenter;
public GroupMemberLayout(Context context) {
super(context);
init();
}
public GroupMemberLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GroupMemberLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inflate(getContext(), R.layout.group_member_layout, this);
mTitleBar = findViewById(R.id.group_member_title_bar);
mTitleBar.setTitle(getContext().getString(R.string.manager), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightIcon().setVisibility(GONE);
mTitleBar.setOnRightClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buildPopMenu();
}
});
mAdapter = new GroupMemberAdapter();
mAdapter.setMemberChangedCallback(new IGroupMemberChangedCallback() {
@Override
public void onMemberRemoved(GroupMemberInfo memberInfo) {
if (!TextUtils.isEmpty(title)) {
mTitleBar.setTitle(title, ITitleBarLayout.Position.MIDDLE);
} else {
mTitleBar.setTitle(getContext().getString(R.string.group_members) +
"(" + mGroupInfo.getMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
});
recyclerView = findViewById(R.id.group_all_members);
recyclerView.setLayoutManager(new CustomLinearLayoutManager(getContext()));
recyclerView.setAdapter(mAdapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (layoutManager == null) {
return;
}
int lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (mAdapter != null) {
if (lastPosition == mAdapter.getItemCount() - 1) {
if (mGroupInfo != null && mGroupInfo.getNextSeq() != 0) {
presenter.getGroupMembers(mGroupInfo, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
onGroupInfoChanged(data);
mAdapter.notifyDataSetChanged();
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
}
}
}
}
});
selectArea = findViewById(R.id.select_area);
selectedList = findViewById(R.id.selected_list);
selectedListAdapter = new SelectedAdapter();
selectedList.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.HORIZONTAL, false));
selectedList.setAdapter(selectedListAdapter);
confirmButton = findViewById(R.id.confirm_button);
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmAndFinish();
}
});
mAdapter.setOnSelectChangedListener(new OnSelectChangedListener() {
@Override
public void onSelectChanged() {
selectedListAdapter.setMembers(mAdapter.getSelectedMemberInfoList());
selectedListAdapter.notifyDataSetChanged();
}
});
}
private void confirmAndFinish() {
if (groupMemberListener != null) {
groupMemberListener.setSelectedMember(mAdapter.getSelectedMember());
}
}
public TitleBarLayout getTitleBar() {
return mTitleBar;
}
public void setExcludeList(ArrayList<String> excludeList) {
this.excludeList = excludeList;
mAdapter.setExcludeList(excludeList);
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
this.alreadySelectedList = alreadySelectedList;
mAdapter.setAlreadySelectedList(alreadySelectedList);
}
public void setSelectMode(boolean selectMode) {
isSelectMode = selectMode;
if (isSelectMode) {
mTitleBar.setTitle(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightGroup().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (groupMemberListener != null) {
groupMemberListener.setSelectedMember(mAdapter.getSelectedMember());
}
}
});
selectArea.setVisibility(VISIBLE);
}
mAdapter.setSelectMode(isSelectMode);
}
@Override
public void setParentLayout(Object parent) {
}
public void setTitle(String title) {
this.title = title;
}
public void onGroupInfoChanged(GroupInfo groupInfo) {
mGroupInfo = groupInfo;
presenter.setGroupInfo(groupInfo);
mAdapter.setDataSource(groupInfo);
if (groupInfo != null) {
if (!TextUtils.isEmpty(title)) {
mTitleBar.setTitle(title, ITitleBarLayout.Position.MIDDLE);
} else {
mTitleBar.setTitle(getContext().getString(R.string.group_members) +
"(" + groupInfo.getMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
}
@Override
public void onGroupInfoModified(Object value, int type) {
}
private void buildPopMenu() {
if (mGroupInfo == null) {
return;
}
BottomSelectSheet sheet = new BottomSelectSheet(getContext());
List<String> stringList = new ArrayList<>();
String addMember = getResources().getString(R.string.add_group_member);
String removeMember = getResources().getString(R.string.remove_group_member);
stringList.add(addMember);
if (mGroupInfo.isOwner()) {
stringList.add(removeMember);
}
sheet.setSelectList(stringList);
sheet.setOnClickListener(new BottomSelectSheet.BottomSelectSheetOnClickListener() {
@Override
public void onSheetClick(int index) {
if (index == 0) {
if (groupMemberListener != null) {
groupMemberListener.forwardAddMember(mGroupInfo);
}
} else if (index == 1) {
if (groupMemberListener != null) {
groupMemberListener.forwardDeleteMember(mGroupInfo);
}
}
}
});
sheet.show();
}
public void setGroupMemberListener(IGroupMemberListener listener) {
this.groupMemberListener = listener;
}
public void setPresenter(GroupInfoPresenter presenter) {
this.presenter = presenter;
mAdapter.setPresenter(presenter);
}
public static class SelectedAdapter extends RecyclerView.Adapter<SelectedAdapter.SelectedViewHolder> {
private List<GroupMemberInfo> mMembers;
public void setMembers(List<GroupMemberInfo> mMembers) {
this.mMembers = mMembers;
}
@NonNull
@Override
public SelectedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new SelectedViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.group_member_selected_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull SelectedAdapter.SelectedViewHolder holder, int position) {
GlideEngine.loadImage(holder.userIconView, mMembers.get(position).getIconUrl());
}
@Override
public int getItemCount() {
if (mMembers == null) {
return 0;
}
return mMembers.size();
}
public static class SelectedViewHolder extends RecyclerView.ViewHolder {
public final ImageView userIconView;
public SelectedViewHolder(@NonNull View itemView) {
super(itemView);
userIconView = (ImageView) itemView.findViewById(R.id.ivAvatar);
}
}
}
public interface OnSelectChangedListener {
void onSelectChanged();
}
}
@@ -0,0 +1,93 @@
package com.tencent.qcloud.tuikit.tuigroup.component;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.tencent.qcloud.tuikit.tuigroup.R;
import java.util.ArrayList;
import java.util.List;
public class BottomSelectSheet {
private List<String> selectList = new ArrayList<>();
private Dialog dialog;
private ArrayAdapter<String> listAdapter;
private BottomSelectSheetOnClickListener onClickListener;
public BottomSelectSheet(Context context) {
View view = View.inflate(context, R.layout.bottom_select_sheet, null);
dialog = new Dialog(context, R.style.BottomSelectSheet);
dialog.setContentView(view);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
Window window = dialog.getWindow();
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager m = window.getWindowManager();
Display d = m.getDefaultDisplay();
WindowManager.LayoutParams p = window.getAttributes();
p.width = d.getWidth();
p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
window.setAttributes(p);
window.setGravity(Gravity.BOTTOM);
window.setWindowAnimations(R.style.BottomSelectSheet_Anim); //添加动画
final ListView listView = view.findViewById(R.id.item_list);
listAdapter = new ArrayAdapter<>(context, R.layout.bottom_sheet_item, R.id.sheet_item, selectList);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
dismiss();
if (onClickListener != null) {
onClickListener.onSheetClick(position);
}
}
});
TextView cancelButton = view.findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
public void dismiss() {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
public void show() {
if (dialog != null && !dialog.isShowing()) {
listAdapter.notifyDataSetChanged();
dialog.show();
}
}
public void setSelectList(List<String> selectList) {
this.selectList.clear();
this.selectList.addAll(selectList);
}
public void setOnClickListener(BottomSelectSheetOnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
public interface BottomSelectSheetOnClickListener {
void onSheetClick(int index);
}
}
@@ -0,0 +1,5 @@
package com.tencent.qcloud.tuikit.tuigroup.interfaces;
public interface GroupEventListener {
void onGroupInfoChanged(String groupID);
}
@@ -0,0 +1,14 @@
package com.tencent.qcloud.tuikit.tuigroup.interfaces;
import android.content.Context;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import java.util.List;
public interface IGroupApplyLayout {
void onGroupApplyInfoListChanged(List<GroupApplyInfo> dataSource);
void onDataSetChanged();
Context getContext();
}
@@ -0,0 +1,11 @@
package com.tencent.qcloud.tuikit.tuigroup.interfaces;
import com.tencent.qcloud.tuicore.component.interfaces.ILayout;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
public interface IGroupMemberLayout extends ILayout {
void onGroupInfoChanged(GroupInfo dataSource);
void onGroupInfoModified(Object value, int type);
}
@@ -0,0 +1,7 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
public interface IGroupMemberChangedCallback {
void onMemberRemoved(GroupMemberInfo memberInfo);
}
@@ -0,0 +1,16 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import java.util.ArrayList;
public interface IGroupMemberListener {
void forwardListMember(GroupInfo info);
void forwardAddMember(GroupInfo info);
void forwardDeleteMember(GroupInfo info);
default void setSelectedMember(ArrayList<String> members) {}
}
@@ -0,0 +1,59 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.view.GroupApplyManagerLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupApplyPresenter;
public class GroupApplyManagerMinimalistActivity extends BaseLightActivity {
private GroupApplyManagerLayout mManagerLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_minimalist_apply_manager_activity);
if (getIntent().getExtras() == null) {
finish();
return;
}
mManagerLayout = findViewById(R.id.group_apply_manager_layout);
GroupApplyPresenter presenter = new GroupApplyPresenter(mManagerLayout);
mManagerLayout.setPresenter(presenter);
String groupId = getIntent().getExtras().getString(TUIGroupConstants.Group.GROUP_ID);
GroupInfo groupInfo = new GroupInfo();
groupInfo.setId(groupId);
mManagerLayout.setDataSource(groupInfo);
}
@Override
public void onResume() {
super.onResume();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != TUIGroupConstants.ActivityRequest.CODE_1) {
return;
}
if (resultCode != RESULT_OK) {
return;
}
GroupApplyInfo info = (GroupApplyInfo) data.getSerializableExtra(TUIGroupConstants.Group.MEMBER_APPLY);
if (info == null) {
return;
}
mManagerLayout.updateItemData(info);
}
}
@@ -0,0 +1,46 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import java.util.List;
public class GroupInfoMinimalistActivity extends BaseLightActivity {
public static final int REQUEST_FOR_CHANGE_OWNER = 1;
private GroupInfoMinimalistFragment fragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_info_activity);
fragment = new GroupInfoMinimalistFragment();
fragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().replace(R.id.group_manager_base, fragment).commitAllowingStateLoss();
}
@Override
public void finish() {
super.finish();
setResult(1001);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_FOR_CHANGE_OWNER && data != null) {
List<String> selectedList = data.getStringArrayListExtra(TUIGroupConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
String newOwnerId = selectedList.get(0);
fragment.changeGroupOwner(newOwnerId);
}
}
}
}
@@ -0,0 +1,253 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.activities.ImageSelectActivity;
import com.tencent.qcloud.tuicore.component.fragments.BaseFragment;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.view.GroupInfoLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupLog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class GroupInfoMinimalistFragment extends BaseFragment {
private static final int CHOOSE_AVATAR_REQUEST_CODE = 101;
private View baseView;
private GroupInfoLayout groupInfoLayout;
private String groupId;
private GroupInfoPresenter groupInfoPresenter = null;
private String mChatBackgroundThumbnailUrl;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
baseView = inflater.inflate(R.layout.group_minimalist_info_fragment, container, false);
initView();
return baseView;
}
private void initView() {
Bundle bundle = getArguments();
if (bundle == null) {
ToastUtil.toastShortMessage("groupId is empty. bundle is null");
return;
}
groupId = bundle.getString(TUIGroupConstants.Group.GROUP_ID);
mChatBackgroundThumbnailUrl = bundle.getString(TUIConstants.TUIChat.CHAT_BACKGROUND_URI);
groupInfoLayout = baseView.findViewById(R.id.group_info_layout);
// 新建 presenter 与 layout 互相绑定
groupInfoPresenter = new GroupInfoPresenter(groupInfoLayout);
groupInfoPresenter.setGroupEventListener();
groupInfoLayout.setGroupInfoPresenter(groupInfoPresenter);
groupInfoLayout.setOnModifyGroupAvatarListener(new OnModifyGroupAvatarListener() {
@Override
public void onModifyGroupAvatar(String originAvatarUrl) {
ArrayList<ImageSelectActivity.ImageBean> faceList = new ArrayList<>();
for (int i = 0; i < TUIGroupConstants.GROUP_FACE_COUNT; i++) {
ImageSelectActivity.ImageBean imageBean = new ImageSelectActivity.ImageBean();
imageBean.setThumbnailUri(String.format(TUIGroupConstants.GROUP_FACE_URL, (i + 1) + ""));
imageBean.setImageUri(String.format(TUIGroupConstants.GROUP_FACE_URL, (i + 1) + ""));
faceList.add(imageBean);
}
Intent intent = new Intent(getContext(), ImageSelectActivity.class);
intent.putExtra(ImageSelectActivity.TITLE, getResources().getString(R.string.group_choose_avatar));
intent.putExtra(ImageSelectActivity.SPAN_COUNT, 4);
intent.putExtra(ImageSelectActivity.ITEM_WIDTH, ScreenUtil.dip2px(77));
intent.putExtra(ImageSelectActivity.ITEM_HEIGHT, ScreenUtil.dip2px(77));
intent.putExtra(ImageSelectActivity.DATA, faceList);
intent.putExtra(ImageSelectActivity.SELECTED, new ImageSelectActivity.ImageBean(originAvatarUrl, originAvatarUrl, false));
startActivityForResult(intent, CHOOSE_AVATAR_REQUEST_CODE);
}
});
groupInfoLayout.loadGroupInfo(groupId);
groupInfoLayout.setRouter(new IGroupMemberListener() {
@Override
public void forwardListMember(GroupInfo info) {
Intent intent = new Intent(getContext(), GroupMemberMinimalistActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, false);
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, info.getId());
startActivity(intent);
}
@Override
public void forwardAddMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : info.getMemberDetails()) {
selectedList.add(memberInfo.getAccount());
}
param.putStringArrayList(TUIGroupConstants.Selection.SELECTED_LIST, selectedList);
TUICore.startActivity(GroupInfoMinimalistFragment.this, "StartGroupMemberSelectMinimalistActivity", param, 1);
}
@Override
public void forwardDeleteMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FOR_CALL, true);
TUICore.startActivity(GroupInfoMinimalistFragment.this, "StartGroupMemberSelectMinimalistActivity", param, 2);
}
});
groupInfoLayout.setOnButtonClickListener(new GroupInfoLayout.OnButtonClickListener() {
@Override
public void onSetChatBackground() {
ArrayList<ImageSelectActivity.ImageBean> faceList = new ArrayList<>();
ImageSelectActivity.ImageBean defaultFace = new ImageSelectActivity.ImageBean();
defaultFace.setDefault(true);
faceList.add(defaultFace);
for (int i = 0; i < TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_COUNT; i++) {
ImageSelectActivity.ImageBean imageBean = new ImageSelectActivity.ImageBean();
imageBean.setImageUri(String.format(TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_URL, (i + 1) + ""));
imageBean.setThumbnailUri(String.format(TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_THUMBNAIL_URL, (i + 1) + ""));
faceList.add(imageBean);
}
Intent intent = new Intent(getContext(), ImageSelectActivity.class);
intent.putExtra(ImageSelectActivity.TITLE, getResources().getString(R.string.chat_background_title));
intent.putExtra(ImageSelectActivity.SPAN_COUNT, 2);
intent.putExtra(ImageSelectActivity.ITEM_WIDTH, ScreenUtil.dip2px(186));
intent.putExtra(ImageSelectActivity.ITEM_HEIGHT, ScreenUtil.dip2px(124));
intent.putExtra(ImageSelectActivity.DATA, faceList);
if (TextUtils.isEmpty(mChatBackgroundThumbnailUrl) || TextUtils.equals(TUIConstants.TUIChat.CHAT_CONVERSATION_BACKGROUND_DEFAULT_URL, mChatBackgroundThumbnailUrl)) {
intent.putExtra(ImageSelectActivity.SELECTED, defaultFace);
} else {
intent.putExtra(ImageSelectActivity.SELECTED, new ImageSelectActivity.ImageBean(mChatBackgroundThumbnailUrl, "", false));
}
intent.putExtra(ImageSelectActivity.NEED_DOWLOAD_LOCAL, true);
startActivityForResult(intent, TUIConstants.TUIChat.CHAT_REQUEST_BACKGROUND_CODE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 3) {
List<String> friends = (List<String>) data.getSerializableExtra(TUIGroupConstants.Selection.LIST);
if (requestCode == 1) {
inviteGroupMembers(friends);
} else if (requestCode == 2) {
deleteGroupMembers(friends);
}
} else if (requestCode == CHOOSE_AVATAR_REQUEST_CODE && resultCode == ImageSelectActivity.RESULT_CODE_SUCCESS) {
if (data != null) {
ImageSelectActivity.ImageBean imageBean = (ImageSelectActivity.ImageBean) data.getSerializableExtra(ImageSelectActivity.DATA);
if (imageBean == null) {
return;
}
String avatarUrl = imageBean.getImageUri();
modifyGroupAvatar(avatarUrl);
}
} else if (requestCode == TUIConstants.TUIChat.CHAT_REQUEST_BACKGROUND_CODE) {
if (data == null) {
return;
}
ImageSelectActivity.ImageBean imageBean = (ImageSelectActivity.ImageBean) data.getSerializableExtra(ImageSelectActivity.DATA);
if (imageBean == null) {
TUIGroupLog.e("GroupInfoMinimalistFragment", "onActivityResult imageBean is null");
return;
}
String backgroundUri = imageBean.getLocalPath();
String thumbnailUri = imageBean.getThumbnailUri();
String dataUri = thumbnailUri + "," + backgroundUri;
TUIGroupLog.d("GroupInfoMinimalistFragment", "onActivityResult backgroundUri = " + backgroundUri);
mChatBackgroundThumbnailUrl = thumbnailUri;
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIChat.CHAT_ID, groupId);
param.put(TUIConstants.TUIChat.CHAT_BACKGROUND_URI, dataUri);
TUICore.callService(TUIConstants.TUIChat.SERVICE_NAME, TUIConstants.TUIChat.METHOD_UPDATE_DATA_STORE_CHAT_URI, param);
}
}
private void modifyGroupAvatar(String avatarUrl) {
groupInfoLayout.modifyGroupAvatar(avatarUrl);
}
private void deleteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
if (groupInfoPresenter != null) {
groupInfoPresenter.deleteGroupMembers(groupId, friends, new IUIKitCallback<List<String>>() {
@Override
public void onSuccess(List<String> data) {
groupInfoPresenter.loadGroupInfo(groupId);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
}
}
private void inviteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
groupInfoPresenter.inviteGroupMembers(groupId, friends, new IUIKitCallback<Object>() {
@Override
public void onSuccess(Object data) {
if (data instanceof String) {
ToastUtil.toastLongMessage(data.toString());
} else {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_suc));
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_fail) + errCode + "=" + errMsg);
}
});
}
}
public void changeGroupOwner(String newOwnerId) {
groupInfoPresenter.transferGroupOwner(groupId, newOwnerId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
groupInfoLayout.loadGroupInfo(groupId);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
public interface OnModifyGroupAvatarListener {
void onModifyGroupAvatar(String originAvatarUrl);
}
}
@@ -0,0 +1,175 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.view.GroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupMemberMinimalistActivity extends BaseLightActivity {
private GroupMemberLayout mMemberLayout;
private String groupID;
private GroupInfoPresenter presenter;
private boolean isSelectMode = false;
private ArrayList<String> excludeList;
private ArrayList<String> alreadySelectedList;
private String userData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_minimalist_members_list);
mMemberLayout = findViewById(R.id.group_member_grid_layout);
init();
}
private void init() {
Intent intent = getIntent();
groupID = intent.getStringExtra(TUIConstants.TUIGroup.GROUP_ID);
int limit = getIntent().getIntExtra(TUIConstants.TUIGroup.LIMIT, Integer.MAX_VALUE);
isSelectMode = intent.getBooleanExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
String title = intent.getStringExtra(TUIConstants.TUIGroup.TITLE);
excludeList = intent.getStringArrayListExtra(TUIConstants.TUIGroup.EXCLUDE_LIST);
alreadySelectedList = intent.getStringArrayListExtra(TUIConstants.TUIGroup.SELECTED_LIST);
userData = intent.getStringExtra(TUIConstants.TUIGroup.USER_DATA);
int filter = intent.getIntExtra(TUIConstants.TUIGroup.FILTER, GroupInfo.GROUP_MEMBER_FILTER_ALL);
mMemberLayout.setSelectMode(isSelectMode);
mMemberLayout.setTitle(title);
mMemberLayout.setExcludeList(excludeList);
mMemberLayout.setAlreadySelectedList(alreadySelectedList);
presenter = new GroupInfoPresenter(mMemberLayout);
mMemberLayout.setPresenter(presenter);
presenter.loadGroupInfo(groupID, filter);
mMemberLayout.getTitleBar().setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mMemberLayout.setGroupMemberListener(new IGroupMemberListener() {
@Override
public void setSelectedMember(ArrayList<String> members) {
if (members == null || members.isEmpty()) {
return;
}
if (members.size() > limit) {
String overLimitTip = getString(R.string.group_over_limit_tip, limit);
ToastUtil.toastShortMessage(overLimitTip);
return;
}
Intent result = new Intent();
result.putStringArrayListExtra(TUIConstants.TUIGroup.LIST, members);
setResult(0, result);
Map<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIGroup.LIST, members);
param.put(TUIConstants.TUIGroup.USER_DATA, userData);
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP, TUIConstants.TUIGroup.EVENT_SUB_KEY_GROUP_MEMBER_SELECTED, param);
finish();
}
@Override
public void forwardListMember(GroupInfo info) {
}
@Override
public void forwardAddMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : info.getMemberDetails()) {
selectedList.add(memberInfo.getAccount());
}
param.putStringArrayList(TUIGroupConstants.Selection.SELECTED_LIST, selectedList);
TUICore.startActivity(GroupMemberMinimalistActivity.this, "StartGroupMemberSelectMinimalistActivity", param, 1);
}
@Override
public void forwardDeleteMember(GroupInfo info) {
Bundle param = new Bundle();
param.putString(TUIGroupConstants.Group.GROUP_ID, info.getId());
param.putBoolean(TUIGroupConstants.Selection.SELECT_FOR_CALL, true);
TUICore.startActivity(GroupMemberMinimalistActivity.this, "StartGroupMemberSelectMinimalistActivity", param, 2);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 3) {
List<String> friends = (List<String>) data.getSerializableExtra(TUIGroupConstants.Selection.LIST);
if (requestCode == 1) {
inviteGroupMembers(friends);
} else if (requestCode == 2) {
deleteGroupMembers(friends);
}
}
}
private void deleteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
if (presenter != null) {
presenter.deleteGroupMembers(groupID, friends, new IUIKitCallback<List<String>>() {
@Override
public void onSuccess(List<String> data) {
presenter.loadGroupInfo(groupID);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
}
}
private void inviteGroupMembers(List<String> friends) {
if (friends != null && friends.size() > 0) {
if (presenter != null) {
presenter.inviteGroupMembers(groupID, friends, new IUIKitCallback<Object>() {
@Override
public void onSuccess(Object data) {
if (data instanceof String) {
ToastUtil.toastLongMessage(data.toString());
} else {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_suc));
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.invite_fail) + errCode + "=" + errMsg);
}
});
}
}
}
}
@@ -0,0 +1,152 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupManagerPresenter;
public class GroupNoticeMinimalistActivity extends BaseLightActivity {
private static OnGroupNoticeChangedListener changedListener;
private EditText editText;
private GroupInfo groupInfo;
private TitleBarLayout titleBarLayout;
private boolean isEditModel = false;
private GroupManagerPresenter presenter;
public static void setOnGroupNoticeChangedListener(OnGroupNoticeChangedListener listener) {
GroupNoticeMinimalistActivity.changedListener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_notice);
editText = findViewById(R.id.group_notice_text);
titleBarLayout = findViewById(R.id.group_notice_title_bar);
groupInfo = (GroupInfo) getIntent().getSerializableExtra(TUIGroupConstants.Group.GROUP_INFO);
presenter = new GroupManagerPresenter();
if (!TextUtils.isEmpty(groupInfo.getNotice())) {
editText.setText(groupInfo.getNotice());
}
titleBarLayout.getLeftGroup().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
titleBarLayout.setTitle(getString(R.string.group_notice), ITitleBarLayout.Position.MIDDLE);
titleBarLayout.getRightIcon().setVisibility(View.GONE);
if (groupInfo.isCanManagerGroup()) {
titleBarLayout.setTitle(getString(R.string.group_edit), ITitleBarLayout.Position.RIGHT);
}
titleBarLayout.getRightGroup().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isEditModel) {
titleBarLayout.setTitle(getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
editText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
editText.setClickable(true);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
showSoftInput();
editText.setSelection(editText.getText().toString().length());
isEditModel = true;
} else {
titleBarLayout.setTitle(getString(R.string.group_edit), ITitleBarLayout.Position.RIGHT);
editText.setInputType(EditorInfo.TYPE_NULL);
editText.setClickable(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(false);
hideSoftInput();
setGroupNotice(editText.getText().toString());
isEditModel = false;
}
}
});
}
private void setGroupNotice(String groupNotice) {
if (TextUtils.equals(groupNotice, groupInfo.getNotice())) {
return;
}
presenter.modifyGroupNotification(groupInfo.getId(), groupNotice, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
groupInfo.setNotice(groupNotice);
if (changedListener != null) {
changedListener.onChanged(groupNotice);
}
ToastUtil.toastShortMessage(getResources().getString(R.string.modify_group_notice_success));
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage("modifyGroupNotice error , errCode " + errCode + " errMsg " + errMsg);
}
});
}
private void showSoftInput() {
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (!isSoftInputShown()) {
imm.toggleSoftInput(0, 0);
}
}
public void hideSoftInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
editText.clearFocus();
}
private boolean isSoftInputShown() {
View decorView = getWindow().getDecorView();
int screenHeight = decorView.getHeight();
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
return screenHeight - rect.bottom - getNavigateBarHeight() >= 0;
}
// 兼容有导航键的情况
private int getNavigateBarHeight() {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
windowManager.getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight) {
return realHeight - usableHeight;
} else {
return 0;
}
}
public interface OnGroupNoticeChangedListener {
void onChanged(String notice);
}
}
@@ -0,0 +1,319 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.CompoundButton;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuicore.component.LineControllerView;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupManagerPresenter;
import java.util.ArrayList;
import java.util.List;
public class ManageGroupMinimalistActivity extends BaseLightActivity {
private TitleBarLayout titleBarLayout;
private LineControllerView setManagerView;
private LineControllerView muteAllView;
private View addMuteMemberView;
private RecyclerView mutedList;
private MutedMemberAdapter mutedMemberAdapter;
private GroupManagerPresenter presenter;
private GroupInfo groupInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_manager);
presenter = new GroupManagerPresenter();
titleBarLayout = findViewById(R.id.group_manage_title_bar);
setManagerView = findViewById(R.id.group_manage_set_manager);
muteAllView = findViewById(R.id.group_manage_mute_all);
addMuteMemberView = findViewById(R.id.group_manage_add_mute_member);
mutedList = findViewById(R.id.group_manage_muted_member_list);
mutedList.setLayoutManager(new CustomLinearLayoutManager(this));
mutedMemberAdapter = new MutedMemberAdapter();
mutedList.setAdapter(mutedMemberAdapter);
groupInfo = (GroupInfo) getIntent().getSerializableExtra(TUIGroupConstants.Group.GROUP_INFO);
muteAllView.setChecked(groupInfo.isAllMuted());
if (groupInfo.isAllMuted()) {
addMuteMemberView.setVisibility(View.GONE);
mutedList.setVisibility(View.GONE);
}
titleBarLayout.setTitle(getString(R.string.group_manager), ITitleBarLayout.Position.MIDDLE);
setClickListener();
loadMutedMember();
}
private void setClickListener() {
titleBarLayout.getLeftIcon().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
muteAllView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
presenter.muteAll(groupInfo.getId(), isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
if (isChecked) {
addMuteMemberView.setVisibility(View.GONE);
mutedList.setVisibility(View.GONE);
} else {
addMuteMemberView.setVisibility(View.VISIBLE);
mutedList.setVisibility(View.VISIBLE);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
});
setManagerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_WORK)) {
ToastUtil.toastShortMessage(getString(R.string.group_not_support_set_manager));
return;
}
Intent intent = new Intent(ManageGroupMinimalistActivity.this, SetGroupManagerMinimalistActivity.class);
intent.putExtra(TUIGroupConstants.Group.GROUP_INFO, groupInfo);
startActivity(intent);
}
});
addMuteMemberView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(groupInfo.getGroupType(), GroupInfo.GROUP_TYPE_WORK)) {
ToastUtil.toastShortMessage(getString(R.string.group_not_support_mute_member));
return;
}
Intent intent = new Intent(ManageGroupMinimalistActivity.this, GroupMemberMinimalistActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
intent.putExtra(TUIConstants.TUIGroup.FILTER, GroupInfo.GROUP_MEMBER_FILTER_COMMON);
if (mutedMemberAdapter.getGroupMemberInfoList() != null) {
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : mutedMemberAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getAccount());
}
intent.putExtra(TUIConstants.TUIGroup.SELECTED_LIST, selectedList);
}
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, groupInfo.getId());
startActivityForResult(intent, 1);
}
});
mutedMemberAdapter.setOnItemLongClickListener(new SetGroupManagerMinimalistActivity.OnItemLongClickListener() {
@Override
public void onClick(View view, GroupMemberInfo memberInfo, int position) {
Drawable drawable = view.getBackground();
if (drawable != null) {
drawable.setColorFilter(0xd9d9d9, PorterDuff.Mode.SRC_IN);
}
View itemPop = LayoutInflater.from(ManageGroupMinimalistActivity.this).inflate(R.layout.group_manager_pop_menu, null);
PopupWindow popupWindow = new PopupWindow(itemPop, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.setOutsideTouchable(true);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
if (drawable != null) {
drawable.clearColorFilter();
}
}
});
TextView popText = itemPop.findViewById(R.id.pop_text);
popText.setText(R.string.group_cancel_mute_label);
popText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
presenter.cancelMuteGroupMember(groupInfo.getId(), memberInfo.getAccount(), new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mutedMemberAdapter.onItemRemoved(memberInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
});
int x = view.getWidth() / 2;
int y = - view.getHeight() / 3;
int popHeight = ScreenUtil.dip2px(45) * 3;
if (y + popHeight + view.getY() + view.getHeight() > mutedList.getBottom()) {
y = y - popHeight;
}
popupWindow.showAsDropDown(view, x, y, Gravity.TOP | Gravity.START);
}
});
}
private void loadMutedMember() {
presenter.loadMutedMembers(groupInfo.getId(), new IUIKitCallback<List<GroupMemberInfo>>() {
@Override
public void onSuccess(List<GroupMemberInfo> data) {
mutedMemberAdapter.setGroupMemberInfoList(data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
List<String> selectedList = data.getStringArrayListExtra(TUIGroupConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.muteGroupMember(groupInfo.getId(), userId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
loadMutedMember();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
}
}
}
class MutedMemberAdapter extends RecyclerView.Adapter<MutedMemberAdapter.MutedMemberViewHolder> {
private List<GroupMemberInfo> groupMemberInfoList;
private SetGroupManagerMinimalistActivity.OnItemLongClickListener onItemLongClickListener;
public void setOnItemLongClickListener(SetGroupManagerMinimalistActivity.OnItemLongClickListener onItemLongClickListener) {
this.onItemLongClickListener = onItemLongClickListener;
}
public void onItemRemoved(GroupMemberInfo memberInfo) {
int index = groupMemberInfoList.indexOf(memberInfo);
groupMemberInfoList.remove(memberInfo);
notifyItemRemoved(index);
}
public void setGroupMemberInfoList(List<GroupMemberInfo> groupMemberInfoList) {
this.groupMemberInfoList = groupMemberInfoList;
notifyDataSetChanged();
}
public List<GroupMemberInfo> getGroupMemberInfoList() {
return groupMemberInfoList;
}
@NonNull
@Override
public MutedMemberViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_manager_item, parent, false);
return new MutedMemberViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MutedMemberViewHolder holder, int position) {
GroupMemberInfo groupMemberInfo = groupMemberInfoList.get(position);
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemLongClickListener != null) {
onItemLongClickListener.onClick(v, groupMemberInfo, position);
}
return false;
}
});
String displayName = getDisplayName(groupMemberInfo);
holder.managerName.setText(displayName);
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getIconUrl());
}
@Override
public int getItemCount() {
if (groupMemberInfoList == null || groupMemberInfoList.isEmpty()) {
return 0;
}
return groupMemberInfoList.size();
}
class MutedMemberViewHolder extends RecyclerView.ViewHolder {
ShadeImageView faceIcon;
TextView managerName;
public MutedMemberViewHolder(@NonNull View itemView) {
super(itemView);
faceIcon = itemView.findViewById(R.id.group_manager_face);
faceIcon.setRadius(ScreenUtil.dip2px(20));
managerName = itemView.findViewById(R.id.group_manage_name);
}
}
}
private String getDisplayName(GroupMemberInfo groupMemberInfo) {
String displayName = groupMemberInfo.getNameCard();
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getNickName();
}
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getAccount();
}
return displayName;
}
interface OnItemLongClickListener {
void onClick(View view, GroupMemberInfo groupMemberInfo);
}
}
@@ -0,0 +1,290 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.page;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupManagerPresenter;
import java.util.ArrayList;
import java.util.List;
public class SetGroupManagerMinimalistActivity extends BaseLightActivity {
private TitleBarLayout titleBarLayout;
private TextView managerCountLabel;
private GroupManagerPresenter presenter;
private GroupInfo groupInfo;
private RecyclerView managerList;
private ManagerAdapter managerAdapter;
private ShadeImageView ownerFace;
private TextView ownerName;
private View setManagerView;
private String ownerID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_set_group_manager);
titleBarLayout = findViewById(R.id.set_group_manager_title_bar);
managerCountLabel = findViewById(R.id.set_group_manager_manager_label);
managerList = findViewById(R.id.set_group_manager_manager_list);
ownerFace = findViewById(R.id.set_group_manager_owner_face);
ownerFace.setRadius(ScreenUtil.dip2px(20));
ownerName = findViewById(R.id.set_group_manager_owner_name);
setManagerView = findViewById(R.id.set_group_manager_add_manager);
titleBarLayout.setTitle(getString(R.string.group_set_manager), ITitleBarLayout.Position.MIDDLE);
managerList.setLayoutManager(new CustomLinearLayoutManager(this));
managerAdapter = new ManagerAdapter();
managerList.setAdapter(managerAdapter);
groupInfo = (GroupInfo) getIntent().getSerializableExtra(TUIGroupConstants.Group.GROUP_INFO);
presenter = new GroupManagerPresenter();
setClickListener();
loadGroupManager();
loadGroupOwner();
}
private void loadGroupManager() {
presenter.loadGroupManager(groupInfo.getId(), new IUIKitCallback<List<GroupMemberInfo>>() {
@Override
public void onSuccess(List<GroupMemberInfo> data) {
if (data != null) {
managerCountLabel.setText(getString(R.string.group_add_manager_count_label, data.size()));
managerAdapter.setGroupMemberInfoList(data);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
private void loadGroupOwner() {
presenter.loadGroupOwner(groupInfo.getId(), new IUIKitCallback<GroupMemberInfo>() {
@Override
public void onSuccess(GroupMemberInfo data) {
ownerID = data.getAccount();
String faceUrl = data.getIconUrl();
String displayName = getDisplayName(data);
GlideEngine.loadUserIcon(ownerFace, faceUrl);
ownerName.setText(displayName);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
private void setClickListener() {
titleBarLayout.getLeftIcon().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
setManagerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SetGroupManagerMinimalistActivity.this, GroupMemberMinimalistActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
ArrayList<String> selectedList = new ArrayList<>();
if (managerAdapter.getGroupMemberInfoList() != null) {
for (GroupMemberInfo memberInfo : managerAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getAccount());
}
intent.putExtra(TUIConstants.TUIGroup.SELECTED_LIST, selectedList);
}
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(ownerID);
intent.putExtra(TUIConstants.TUIGroup.EXCLUDE_LIST, excludeList);
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, groupInfo.getId());
startActivityForResult(intent, 1);
}
});
managerAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public void onClick(View view, GroupMemberInfo memberInfo, int position) {
Drawable drawable = view.getBackground();
if (drawable != null) {
drawable.setColorFilter(0xd9d9d9, PorterDuff.Mode.SRC_IN);
}
View itemPop = LayoutInflater.from(SetGroupManagerMinimalistActivity.this).inflate(R.layout.group_manager_pop_menu, null);
PopupWindow popupWindow = new PopupWindow(itemPop, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.setOutsideTouchable(true);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
if (drawable != null) {
drawable.clearColorFilter();
}
}
});
TextView popText = itemPop.findViewById(R.id.pop_text);
popText.setText(R.string.group_remove_manager_label);
popText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
presenter.clearGroupManager(groupInfo.getId(), memberInfo.getAccount(), new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
loadGroupManager();
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
});
int x = view.getWidth() / 2;
int y = - view.getHeight() / 3;
int popHeight = ScreenUtil.dip2px(45) * 3;
if (y + popHeight + view.getY() + view.getHeight() > managerList.getBottom()) {
y = y - popHeight;
}
popupWindow.showAsDropDown(view, x, y, Gravity.TOP | Gravity.START);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && data != null) {
List<String> selectedList = data.getStringArrayListExtra(TUIGroupConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.setGroupManager(groupInfo.getId(), userId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
loadGroupManager();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(errCode + ", " + errMsg);
}
});
}
}
}
}
class ManagerAdapter extends RecyclerView.Adapter<ManagerAdapter.ManagerViewHolder> {
private List<GroupMemberInfo> groupMemberInfoList;
private OnItemLongClickListener onItemLongClickListener;
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
this.onItemLongClickListener = onItemLongClickListener;
}
public void setGroupMemberInfoList(List<GroupMemberInfo> groupMemberInfoList) {
this.groupMemberInfoList = groupMemberInfoList;
notifyDataSetChanged();
}
public List<GroupMemberInfo> getGroupMemberInfoList() {
return groupMemberInfoList;
}
@NonNull
@Override
public ManagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_manager_item, parent, false);
return new ManagerViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ManagerViewHolder holder, int position) {
GroupMemberInfo groupMemberInfo = groupMemberInfoList.get(position);
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onItemLongClickListener != null) {
onItemLongClickListener.onClick(v, groupMemberInfo, position);
}
return true;
}
});
String displayName = getDisplayName(groupMemberInfo);
holder.managerName.setText(displayName);
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getIconUrl());
}
@Override
public int getItemCount() {
if (groupMemberInfoList == null || groupMemberInfoList.isEmpty()) {
return 0;
}
return groupMemberInfoList.size();
}
class ManagerViewHolder extends RecyclerView.ViewHolder {
ShadeImageView faceIcon;
TextView managerName;
public ManagerViewHolder(@NonNull View itemView) {
super(itemView);
faceIcon = itemView.findViewById(R.id.group_manager_face);
faceIcon.setRadius(ScreenUtil.dip2px(20));
managerName = itemView.findViewById(R.id.group_manage_name);
}
}
}
private String getDisplayName(GroupMemberInfo groupMemberInfo) {
String displayName = groupMemberInfo.getNameCard();
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getNickName();
}
if (TextUtils.isEmpty(displayName)) {
displayName = groupMemberInfo.getAccount();
}
return displayName;
}
interface OnItemLongClickListener {
void onClick(View view, GroupMemberInfo groupMemberInfo, int position);
}
}
@@ -0,0 +1,170 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.view;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupApplyPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupApplyAdapter extends BaseAdapter {
private List<GroupApplyInfo> mGroupMembers = new ArrayList<>();
private OnItemClickListener mOnItemClickListener;
private GroupApplyPresenter presenter;
public GroupApplyAdapter() {
}
public void setPresenter(GroupApplyPresenter presenter) {
this.presenter = presenter;
}
@Override
public int getCount() {
return mGroupMembers.size();
}
public int getUnHandledSize() {
int total = 0;
for (GroupApplyInfo i : mGroupMembers) {
if (i.getStatus() == GroupApplyInfo.UNHANDLED) {
total++;
}
}
return total;
}
@Override
public GroupApplyInfo getItem(int i) {
return mGroupMembers.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
MyViewHolder holder;
final GroupApplyInfo info = getItem(i);
if (view == null) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.group_member_apply_adpater, viewGroup, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null && info.getStatus() == GroupApplyInfo.UNHANDLED) {
mOnItemClickListener.onItemClick(info);
}
}
});
holder = new MyViewHolder();
holder.memberIcon = view.findViewById(R.id.group_apply_member_icon);
holder.memberName = view.findViewById(R.id.group_apply_member_name);
holder.reason = view.findViewById(R.id.group_apply_reason);
holder.accept = view.findViewById(R.id.group_apply_accept);
holder.refuse = view.findViewById(R.id.group_apply_refuse);
view.setTag(holder);
} else {
holder = (MyViewHolder) view.getTag();
}
holder.memberName.setText(info.getGroupApplication().getFromUser());
holder.reason.setText(info.getGroupApplication().getRequestMsg());
if (info.getStatus() == GroupApplyInfo.UNHANDLED) {
holder.accept.setVisibility(View.VISIBLE);
holder.accept.setText(R.string.accept);
holder.accept.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.color.bg_positive_btn));
holder.accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
acceptApply(i, info);
}
});
holder.refuse.setVisibility(View.VISIBLE);
holder.refuse.setText(R.string.refuse);
holder.refuse.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.color.bg_negative_btn));
holder.refuse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
refuseApply(i, info);
}
});
} else if (info.getStatus() == GroupApplyInfo.APPLIED) {
holder.accept.setVisibility(View.VISIBLE);
holder.accept.setClickable(false);
holder.accept.setText(R.string.accepted);
holder.accept.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.drawable.gray_btn_bg));
holder.refuse.setVisibility(View.GONE);
} else if (info.getStatus() == GroupApplyInfo.REFUSED) {
holder.refuse.setVisibility(View.VISIBLE);
holder.refuse.setClickable(false);
holder.refuse.setText(R.string.refused);
holder.refuse.setBackground(TUIGroupService.getAppContext().getResources().getDrawable(R.drawable.gray_btn_bg));
holder.accept.setVisibility(View.GONE);
}
return view;
}
public void setOnItemClickListener(OnItemClickListener l) {
mOnItemClickListener = l;
}
public void updateItemData(GroupApplyInfo info) {
for (GroupApplyInfo i : mGroupMembers) {
if (TextUtils.equals(i.getGroupApplication().getFromUser(), info.getGroupApplication().getFromUser())) {
i.setStatus(info.getStatus());
notifyDataSetChanged();
break;
}
}
}
public void setDataSource(GroupInfo info) {
presenter.loadGroupApplies();
}
public void setDataSource(List<GroupApplyInfo> applyInfoList) {
mGroupMembers = applyInfoList;
notifyDataSetChanged();
}
public void acceptApply(final int position, final GroupApplyInfo item) {
if (presenter == null) {
return;
}
presenter.acceptApply(item);
}
public void refuseApply(final int position, final GroupApplyInfo item) {
if (presenter == null) {
return;
}
presenter.refuseApply(item);
}
public interface OnItemClickListener {
void onItemClick(GroupApplyInfo info);
}
private class MyViewHolder {
private ImageView memberIcon;
private TextView memberName, reason;
private Button accept, refuse;
}
}
@@ -0,0 +1,109 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.view;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupApplyPresenter;
import java.util.HashMap;
import java.util.List;
public class GroupApplyManagerLayout extends LinearLayout implements IGroupApplyLayout {
private TitleBarLayout mTitleBar;
private ListView mApplyMemberList;
private GroupApplyAdapter mAdapter;
private GroupApplyPresenter presenter;
public GroupApplyManagerLayout(Context context) {
super(context);
init();
}
public GroupApplyManagerLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GroupApplyManagerLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inflate(getContext(), R.layout.group_apply_manager_layout, this);
mApplyMemberList = findViewById(R.id.group_apply_members);
mAdapter = new GroupApplyAdapter();
mAdapter.setOnItemClickListener(new GroupApplyAdapter.OnItemClickListener() {
@Override
public void onItemClick(GroupApplyInfo info) {
Bundle bundle = new Bundle();
bundle.putString("fromUser", info.getFromUser());
bundle.putString("fromUserNickName", info.getFromUserNickName());
bundle.putString("requestMsg", info.getRequestMsg());
bundle.putSerializable("groupApplication", info.getGroupApplication());
TUICore.startActivity(getContext(),"FriendProfileActivity", bundle, TUIGroupConstants.ActivityRequest.CODE_1);
}
});
mApplyMemberList.setAdapter(mAdapter);
mTitleBar = findViewById(R.id.group_apply_title_bar);
mTitleBar.getRightGroup().setVisibility(View.GONE);
mTitleBar.setTitle(getResources().getString(R.string.group_apply_members), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (getContext() instanceof Activity) {
((Activity) getContext()).finish();
}
}
});
}
public TitleBarLayout getTitleBar() {
return mTitleBar;
}
public void updateItemData(GroupApplyInfo info) {
mAdapter.updateItemData(info);
}
public void onDataSetChanged() {
mAdapter.notifyDataSetChanged();
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIChat.IS_GROUP_CHAT, true);
param.put(TUIConstants.TUIChat.GROUP_APPLY_NUM, mAdapter.getCount()-1);
TUICore.callService(TUIConstants.TUIChat.SERVICE_NAME, TUIConstants.TUIChat.METHOD_GROUP_APPLICAITON_PROCESSED, param);
}
public void setPresenter(GroupApplyPresenter groupApplyPresenter) {
this.presenter = groupApplyPresenter;
mAdapter.setPresenter(groupApplyPresenter);
}
public void onGroupApplyInfoListChanged(List<GroupApplyInfo> applyInfoList) {
mAdapter.setDataSource(applyInfoList);
}
public void setDataSource(GroupInfo dataSource) {
presenter.setGroupInfo(dataSource);
mAdapter.setDataSource(dataSource);
}
}
@@ -0,0 +1,216 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.view;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.util.BackgroundTasks;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupInfoAdapter extends BaseAdapter {
private static final int ADD_TYPE = -100;
private static final int DEL_TYPE = -101;
private static final int OWNER_PRIVATE_MAX_LIMIT = 8; //讨论组,owner可以添加成员和删除成员,
private static final int OWNER_PUBLIC_MAX_LIMIT = 9; //公开群,owner不可以添加成员,但是可以删除成员
private static final int OWNER_CHATROOM_MAX_LIMIT = 9; //聊天室,owner不可以添加成员,但是可以删除成员
private static final int OWNER_COMMUNITY_MAX_LIMIT = 8; //社群,owner可以添加成员和删除成员,
private static final int NORMAL_PRIVATE_MAX_LIMIT = 9; //讨论组,普通人可以添加成员
private static final int NORMAL_PUBLIC_MAX_LIMIT = 10; //公开群,普通人没有权限添加成员和删除成员
private static final int NORMAL_CHATROOM_MAX_LIMIT = 10; //聊天室,普通人没有权限添加成员和删除成员
private static final int NORMAL_COMMUNITY_MAX_LIMIT = 9; //社群,普通人可以添加成员
private List<GroupMemberInfo> mGroupMembers = new ArrayList<>();
private IGroupMemberListener mTailListener;
private GroupInfo mGroupInfo;
private GroupInfoPresenter presenter;
public void setPresenter(GroupInfoPresenter presenter) {
this.presenter = presenter;
}
public void setManagerCallBack(IGroupMemberListener listener) {
mTailListener = listener;
}
@Override
public int getCount() {
return mGroupMembers.size();
}
@Override
public GroupMemberInfo getItem(int i) {
return mGroupMembers.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, final ViewGroup viewGroup) {
MyViewHolder holder;
if (view == null) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.group_member_item_layout, viewGroup, false);
holder = new MyViewHolder();
holder.memberIcon = view.findViewById(R.id.group_member_icon);
holder.memberIcon.setRadius(ScreenUtil.dip2px(24));
holder.memberName = view.findViewById(R.id.group_member_name);
view.setTag(holder);
} else {
holder = (MyViewHolder) view.getTag();
}
final GroupMemberInfo info = getItem(i);
GlideEngine.loadImage(holder.memberIcon, info.getIconUrl());
// 显示优先级 群名片->昵称->账号
if (!TextUtils.isEmpty(info.getNameCard())) {
holder.memberName.setText(info.getNameCard());
} else {
if (!TextUtils.isEmpty(info.getNickName())) {
holder.memberName.setText(info.getNickName());
} else {
if (!TextUtils.isEmpty(info.getAccount())) {
holder.memberName.setText(info.getAccount());
} else {
holder.memberName.setText("");
}
}
}
view.setOnClickListener(null);
holder.memberIcon.setBackground(null);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_CROP);
if (info.getMemberType() == ADD_TYPE) {
holder.memberIcon.setImageResource(R.drawable.add_group_member);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
holder.memberIcon.setBackgroundResource(R.drawable.group_minimalist_add_border);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTailListener != null) {
mTailListener.forwardAddMember(mGroupInfo);
}
}
});
} else if (info.getMemberType() == DEL_TYPE) {
holder.memberIcon.setImageResource(R.drawable.del_group_member);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
holder.memberIcon.setBackgroundResource(R.drawable.bottom_action_border);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTailListener != null) {
mTailListener.forwardDeleteMember(mGroupInfo);
}
}
});
}
return view;
}
public void setDataSource(GroupInfo info) {
mGroupInfo = info;
mGroupMembers.clear();
List<GroupMemberInfo> members = info.getMemberDetails();
if (members != null) {
int shootMemberCount = 0;
if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_WORK)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_PRIVATE_MAX_LIMIT ? OWNER_PRIVATE_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_PRIVATE_MAX_LIMIT ? NORMAL_PRIVATE_MAX_LIMIT : members.size();
}
} else if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_PUBLIC)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_PUBLIC_MAX_LIMIT ? OWNER_PUBLIC_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_PUBLIC_MAX_LIMIT ? NORMAL_PUBLIC_MAX_LIMIT : members.size();
}
} else if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_CHAT_ROOM)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_MEETING)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_CHATROOM_MAX_LIMIT ? OWNER_CHATROOM_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_CHATROOM_MAX_LIMIT ? NORMAL_CHATROOM_MAX_LIMIT : members.size();
}
} else if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_COMMUNITY)) {
if (info.isOwner()) {
shootMemberCount = members.size() > OWNER_COMMUNITY_MAX_LIMIT ? OWNER_COMMUNITY_MAX_LIMIT : members.size();
} else {
shootMemberCount = members.size() > NORMAL_COMMUNITY_MAX_LIMIT ? NORMAL_COMMUNITY_MAX_LIMIT : members.size();
}
}
for (int i = 0; i < shootMemberCount; i++) {
mGroupMembers.add(members.get(i));
}
if (TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_WORK)
|| TextUtils.equals(info.getGroupType(), TUIConstants.GroupType.TYPE_COMMUNITY)) {
// 公开群/聊天室 只有APP管理员可以邀请他人入群
GroupMemberInfo add = new GroupMemberInfo();
add.setMemberType(ADD_TYPE);
mGroupMembers.add(add);
}
GroupMemberInfo self = null;
for (int i = 0; i < mGroupMembers.size(); i++) {
GroupMemberInfo memberInfo = mGroupMembers.get(i);
if (isSelf(memberInfo.getAccount())) {
self = memberInfo;
break;
}
}
if (info.isOwner() || (self != null && isAdmin(self.getMemberType()))) {
GroupMemberInfo del = new GroupMemberInfo();
del.setMemberType(DEL_TYPE);
mGroupMembers.add(del);
}
BackgroundTasks.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}
public boolean isAdmin(int memberType) {
if (presenter != null) {
return presenter.isAdmin(memberType);
}
return false;
}
public boolean isSelf(String userId) {
if (presenter != null) {
return presenter.isSelf(userId);
}
return false;
}
private class MyViewHolder {
private ShadeImageView memberIcon;
private TextView memberName;
}
}
@@ -0,0 +1,682 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.view;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.component.LineControllerView;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.activities.SelectionActivity;
import com.tencent.qcloud.tuicore.component.dialog.TUIKitDialog;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.component.popupcard.PopupInputCard;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.TUIUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.component.BottomSelectSheet;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.page.GroupInfoMinimalistActivity;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.page.GroupInfoMinimalistFragment;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.page.GroupMemberMinimalistActivity;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.page.GroupNoticeMinimalistActivity;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.page.ManageGroupMinimalistActivity;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupLog;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupInfoLayout extends LinearLayout implements IGroupMemberLayout, View.OnClickListener {
private static final String TAG = GroupInfoLayout.class.getSimpleName();
private TitleBarLayout mTitleBar;
private LineControllerView mMemberView;
private GroupInfoAdapter mMemberAdapter;
private IGroupMemberListener mMemberPreviewListener;
private LineControllerView mGroupTypeView;
private TextView mGroupIDView;
private TextView mGroupNameView;
private View groupDetailArea;
private ShadeImageView mGroupIcon;
private ImageView mGroupDetailArrow;
private View mGroupNotice;
private TextView mGroupNoticeText;
private LineControllerView mGroupManageView;
private LineControllerView mNickView;
private LineControllerView mJoinTypeView;
private LineControllerView mTopSwitchView;
private LineControllerView mMsgRevOptionSwitchView;
private LineControllerView mFoldGroupChatSwitchView;
private LineControllerView mChatBackground;
private View mLayoutFold;
private TextView mDissolveBtn;
private TextView mClearMsgBtn;
private TextView mChangeOwnerBtn;
private GridView memberList;
private OnButtonClickListener mListener;
private GroupInfo mGroupInfo;
private GroupInfoPresenter mPresenter;
private ArrayList<String> mJoinTypes = new ArrayList<>();
private GroupInfoMinimalistFragment.OnModifyGroupAvatarListener onModifyGroupAvatarListener;
public GroupInfoLayout(Context context) {
super(context);
init();
}
public GroupInfoLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GroupInfoLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inflate(getContext(), R.layout.group_info_layout, this);
// 标题
mTitleBar = findViewById(R.id.group_info_title_bar);
mTitleBar.getRightGroup().setVisibility(GONE);
mTitleBar.setTitle(getResources().getString(R.string.group_detail), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
((Activity) getContext()).finish();
}
});
// 成员标题
mMemberView = findViewById(R.id.group_member_bar);
mMemberView.setOnClickListener(this);
mMemberView.setCanNav(true);
// 成员列表
memberList = findViewById(R.id.group_members);
mMemberAdapter = new GroupInfoAdapter();
memberList.setAdapter(mMemberAdapter);
// 群类型,只读
mGroupTypeView = findViewById(R.id.group_type_bar);
// 群ID,只读
mGroupIDView = findViewById(R.id.group_account);
// 群聊名称
mGroupNameView = findViewById(R.id.group_name);
groupDetailArea = findViewById(R.id.group_detail_area);
groupDetailArea.setOnClickListener(this);
// 群头像
mGroupIcon = findViewById(R.id.group_icon);
mGroupIcon.setRadius(ScreenUtil.dip2px(25));
mGroupIcon.setOnClickListener(this);
// 群详情右箭头
mGroupDetailArrow = findViewById(R.id.group_detail_arrow);
// 群公告
mGroupNotice = findViewById(R.id.group_notice);
mGroupNotice.setOnClickListener(this);
mGroupNoticeText = findViewById(R.id.group_notice_text);
// 群管理
mGroupManageView = findViewById(R.id.group_manage);
mGroupManageView.setOnClickListener(this);
// 加群方式
mJoinTypeView = findViewById(R.id.join_type_bar);
mJoinTypeView.setOnClickListener(this);
mJoinTypeView.setCanNav(true);
mJoinTypes.addAll(Arrays.asList(getResources().getStringArray(R.array.group_join_type)));
// 群昵称
mNickView = findViewById(R.id.self_nickname_bar);
mNickView.setOnClickListener(this);
mNickView.setCanNav(true);
// 是否置顶
mTopSwitchView = findViewById(R.id.chat_to_top_switch);
mTopSwitchView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
if (mGroupInfo == null) {
return;
}
mPresenter.setTopConversation(mGroupInfo.getId(), isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
buttonView.setChecked(false);
}
});
}
});
// 消息接收选项
mMsgRevOptionSwitchView = findViewById(R.id.msg_rev_option);
// 折叠
mLayoutFold = findViewById(R.id.layout_fold);
mFoldGroupChatSwitchView = findViewById(R.id.fold_group_chat);
// 退群
mDissolveBtn = findViewById(R.id.group_dissolve_button);
mDissolveBtn.setOnClickListener(this);
// 清空群消息按钮
mClearMsgBtn = findViewById(R.id.group_clear_msg_button);
mClearMsgBtn.setOnClickListener(this);
// 转让群主
mChangeOwnerBtn = findViewById(R.id.group_change_owner_button);
mChangeOwnerBtn.setOnClickListener(this);
mChatBackground = findViewById(R.id.chat_background);
mChatBackground.setOnClickListener(this);
mChatBackground.setCanNav(true);
}
private void initView() {
int radius = ScreenUtil.dip2px(5);
GlideEngine.loadUserIcon(mGroupIcon, mGroupInfo.getFaceUrl(), TUIUtil.getDefaultGroupIconResIDByGroupType(getContext(), mGroupInfo.getGroupType()), radius);
if (!mGroupInfo.isCanManagerGroup()) {
mGroupDetailArrow.setVisibility(GONE);
}
if (mGroupInfo.isOwner()) {
mChangeOwnerBtn.setVisibility(VISIBLE);
} else {
mChangeOwnerBtn.setVisibility(GONE);
}
}
public void setGroupInfoPresenter(GroupInfoPresenter presenter) {
this.mPresenter = presenter;
if (mMemberAdapter != null) {
mMemberAdapter.setPresenter(presenter);
}
}
@Override
public void onClick(View v) {
if (mGroupInfo == null) {
TUIGroupLog.e(TAG, "mGroupInfo is NULL");
return;
}
if (v.getId() == R.id.group_member_bar) {
if (mMemberPreviewListener != null) {
mMemberPreviewListener.forwardListMember(mGroupInfo);
}
} else if (v.getId() == R.id.group_detail_area) {
if (!mGroupInfo.isCanManagerGroup()) {
return;
}
PopupInputCard popupInputCard = new PopupInputCard((Activity) getContext());
BottomSelectSheet sheet = new BottomSelectSheet(getContext());
List<String> stringList = new ArrayList<>();
String modifyGroupName = getResources().getString(R.string.modify_group_name);
String modifyGroupNotice = getResources().getString(R.string.modify_group_notice);
stringList.add(modifyGroupName);
stringList.add(modifyGroupNotice);
sheet.setSelectList(stringList);
sheet.setOnClickListener(new BottomSelectSheet.BottomSelectSheetOnClickListener() {
@Override
public void onSheetClick(int index) {
if (index == 0) {
popupInputCard.setContent(mGroupNameView.getText().toString());
popupInputCard.setTitle(modifyGroupName);
popupInputCard.setOnPositive((result -> {
mPresenter.modifyGroupName(result);
if (!TextUtils.isEmpty(result)) {
mGroupNameView.setText(result);
}
}));
popupInputCard.show(groupDetailArea, Gravity.BOTTOM);
} else if (index == 1) {
popupInputCard.setContent(mGroupNoticeText.getText().toString());
popupInputCard.setTitle(modifyGroupNotice);
popupInputCard.setOnPositive((result -> {
mPresenter.modifyGroupNotice(result);
if (TextUtils.isEmpty(result)) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(result);
}
}));
popupInputCard.show(groupDetailArea, Gravity.BOTTOM);
}
}
});
sheet.show();
} else if (v.getId() == R.id.group_icon) {
if (!mGroupInfo.isCanManagerGroup()) {
return;
}
if (onModifyGroupAvatarListener != null) {
onModifyGroupAvatarListener.onModifyGroupAvatar(mGroupInfo.getFaceUrl());
}
} else if (v.getId() == R.id.group_notice) {
Intent intent = new Intent(getContext(), GroupNoticeMinimalistActivity.class);
GroupNoticeMinimalistActivity.setOnGroupNoticeChangedListener(new GroupNoticeMinimalistActivity.OnGroupNoticeChangedListener() {
@Override
public void onChanged(String notice) {
if (TextUtils.isEmpty(notice)) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(notice);
}
}
});
intent.putExtra(TUIGroupConstants.Group.GROUP_INFO, mGroupInfo);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(intent);
} else if (v.getId() == R.id.self_nickname_bar) {
PopupInputCard popupInputCard = new PopupInputCard((Activity) getContext());
popupInputCard.setContent(mNickView.getContent());
popupInputCard.setTitle(getResources().getString(R.string.modify_nick_name_in_goup));
String description = getResources().getString(R.string.group_modify_remark_rule);
popupInputCard.setRule("^[a-zA-Z0-9_\u4e00-\u9fa5]*$");
popupInputCard.setDescription(description);
popupInputCard.setOnPositive((result -> {
mPresenter.modifyMyGroupNickname(result);
mNickView.setContent(result);
}));
popupInputCard.show(mNickView, Gravity.BOTTOM);
} else if (v.getId() == R.id.join_type_bar) {
if (mGroupTypeView.getContent().equals(getContext().getString(R.string.chat_room))) {
ToastUtil.toastLongMessage(getContext().getString(R.string.chat_room_tip));
return;
}
Bundle bundle = new Bundle();
bundle.putString(SelectionActivity.Selection.TITLE, getResources().getString(R.string.group_join_type));
bundle.putStringArrayList(SelectionActivity.Selection.LIST, mJoinTypes);
bundle.putInt(SelectionActivity.Selection.DEFAULT_SELECT_ITEM_INDEX, mGroupInfo.getJoinType());
SelectionActivity.startListSelection((Activity) getContext(), bundle, new SelectionActivity.OnResultReturnListener() {
@Override
public void onReturn(final Object text) {
mPresenter.modifyGroupInfo((Integer) text, TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE);
}
});
} else if (v.getId() == R.id.group_dissolve_button) {
if (mGroupInfo.isOwner() &&
(!mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_WORK)
&& !mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_PRIVATE))) {
new TUIKitDialog(getContext())
.builder()
.setCancelable(true)
.setCancelOutside(true)
.setTitle(getContext().getString(R.string.dismiss_group_tip))
.setDialogWidth(0.75f)
.setPositiveButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), new OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.deleteGroup(new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
((Activity) GroupInfoLayout.this.getContext()).finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(errMsg);
}
});
}
})
.setNegativeButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.cancel), new OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
} else {
new TUIKitDialog(getContext())
.builder()
.setCancelable(true)
.setCancelOutside(true)
.setTitle(getContext().getString(R.string.quit_group_tip))
.setDialogWidth(0.75f)
.setPositiveButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), new OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.quitGroup(new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
((Activity) GroupInfoLayout.this.getContext()).finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
((Activity) GroupInfoLayout.this.getContext()).finish();
ToastUtil.toastShortMessage("quitGroup failed, errCode = " + errCode + " errMsg = " + errMsg);
}
});
}
})
.setNegativeButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.cancel), new OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
}
} else if (v.getId() == R.id.group_clear_msg_button) {
new TUIKitDialog(getContext())
.builder()
.setCancelable(true)
.setCancelOutside(true)
.setTitle(getContext().getString(R.string.clear_group_msg_tip))
.setDialogWidth(0.75f)
.setPositiveButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), new OnClickListener() {
@Override
public void onClick(View v) {
Map<String, Object> hashMap = new HashMap<>();
hashMap.put(TUIConstants.TUIGroup.GROUP_ID, mGroupInfo.getId());
TUICore.notifyEvent(TUIConstants.TUIGroup.EVENT_GROUP,
TUIConstants.TUIGroup.EVENT_SUB_KEY_CLEAR_MESSAGE, hashMap);
}
})
.setNegativeButton(getContext().getString(com.tencent.qcloud.tuicore.R.string.cancel), new OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
} else if (v.getId() == R.id.group_manage) {
Intent intent = new Intent(getContext(), ManageGroupMinimalistActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(TUIGroupConstants.Group.GROUP_INFO, mGroupInfo);
getContext().startActivity(intent);
} else if (v == mChangeOwnerBtn) {
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(TUILogin.getLoginUser());
Intent intent = new Intent(getContext(), GroupMemberMinimalistActivity.class);
intent.putExtra(TUIConstants.TUIGroup.IS_SELECT_MODE, true);
intent.putExtra(TUIConstants.TUIGroup.GROUP_ID, mGroupInfo.getId());
intent.putExtra(TUIConstants.TUIGroup.LIMIT, 1);
intent.putExtra(TUIConstants.TUIGroup.EXCLUDE_LIST, excludeList);
intent.putExtra(TUIConstants.TUIGroup.TITLE, getResources().getString(R.string.group_transfer_group_owner));
((Activity) getContext()).startActivityForResult(intent, GroupInfoMinimalistActivity.REQUEST_FOR_CHANGE_OWNER);
} else if (v.getId() == R.id.chat_background) {
if (mListener != null) {
mListener.onSetChatBackground();
}
}
}
public void loadGroupInfo(String groupId) {
mPresenter.loadGroupInfo(groupId);
}
public void getGroupMembers(GroupInfo groupInfo) {
mPresenter.getGroupMembers(groupInfo, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
setGroupInfo((GroupInfo) data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
public void setGroupInfo(GroupInfo info) {
if (info == null) {
return;
}
this.mGroupInfo = info;
mGroupNameView.setText(info.getGroupName());
mGroupIDView.setText(info.getId());
if (TextUtils.isEmpty(info.getNotice())) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(info.getNotice());
}
mMemberView.setContent(info.getMemberCount() + "");
mMemberAdapter.setDataSource(info);
int columnNum = memberList.getNumColumns();
int rowNum = (int) Math.ceil(mMemberAdapter.getCount() * 1.0f / columnNum);
int itemHeight = ScreenUtil.dip2px(88);
ViewGroup.LayoutParams layoutParams = memberList.getLayoutParams();
layoutParams.height = itemHeight * rowNum;
memberList.setLayoutParams(layoutParams);
mGroupTypeView.setContent(convertGroupText(info.getGroupType()));
mJoinTypeView.setContent(mJoinTypes.get(info.getJoinType()));
mNickView.setContent(mPresenter.getNickName());
mTopSwitchView.setChecked(mGroupInfo.isTopChat());
if (GroupInfo.GROUP_TYPE_MEETING.equals(info.getGroupType())) {
mMsgRevOptionSwitchView.setVisibility(GONE);
mLayoutFold.setVisibility(GONE);
} else {
if (mGroupInfo.getMessageReceiveOption()) {
mLayoutFold.setVisibility(View.VISIBLE);
if (mGroupInfo.isFolded()) {
mFoldGroupChatSwitchView.setChecked(true);
}
} else {
mLayoutFold.setVisibility(View.GONE);
}
mMsgRevOptionSwitchView.setChecked(mGroupInfo.getMessageReceiveOption());
mMsgRevOptionSwitchView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, boolean isChecked) {
mPresenter.setGroupNotDisturb(mGroupInfo, isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
if (!isChecked) {
mLayoutFold.setVisibility(View.GONE);
if (mGroupInfo.isFolded()) {
mPresenter.setGroupFold(mGroupInfo, false, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mFoldGroupChatSwitchView.setChecked(false);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
}
} else {
mLayoutFold.setVisibility(View.VISIBLE);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
}
});
}
if (mGroupInfo.isFolded()) {
mTopSwitchView.setMask(true);
}
mFoldGroupChatSwitchView.setCheckListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mPresenter.setGroupFold(mGroupInfo, isChecked, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
if (isChecked) {
if (mGroupInfo.isTopChat()) {
mPresenter.setTopConversation(mGroupInfo.getId(), false, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mTopSwitchView.setChecked(false);
mTopSwitchView.setMask(true);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
} else {
mTopSwitchView.setMask(true);
}
} else {
mTopSwitchView.setMask(false);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(module + ", Error code = " + errCode + ", desc = " + errMsg);
}
});
}
});
mDissolveBtn.setText(R.string.dissolve);
mClearMsgBtn.setText(R.string.clear_message);
if (mGroupInfo.isOwner()) {
mJoinTypeView.setVisibility(VISIBLE);
if (mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_WORK)
|| mGroupInfo.getGroupType().equals(TUIConstants.GroupType.TYPE_PRIVATE)) {
mDissolveBtn.setText(R.string.exit_group);
}
} else {
mJoinTypeView.setCanNav(false);
mJoinTypeView.setOnClickListener(null);
mDissolveBtn.setText(R.string.exit_group);
}
if (mGroupInfo.isCanManagerGroup()) {
mGroupManageView.setVisibility(VISIBLE);
}
initView();
}
private String convertGroupText(String groupType) {
String groupText = "";
if (TextUtils.isEmpty(groupType)) {
return groupText;
}
if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_WORK)) {
groupText = getContext().getString(R.string.private_group);
} else if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_PUBLIC)) {
groupText = getContext().getString(R.string.public_group);
} else if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_CHAT_ROOM)
|| TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_MEETING)) {
groupText = getContext().getString(R.string.chat_room);
} else if (TextUtils.equals(groupType, TUIConstants.GroupType.TYPE_COMMUNITY)) {
groupText = getContext().getString(R.string.community_group);
}
return groupText;
}
public void onGroupInfoModified(Object value, int type) {
switch (type) {
case TUIGroupConstants.Group.MODIFY_GROUP_NAME:
ToastUtil.toastLongMessage(getResources().getString(R.string.modify_group_name_success));
mGroupNameView.setText(value.toString());
break;
case TUIGroupConstants.Group.MODIFY_GROUP_NOTICE:
if (TextUtils.isEmpty(value.toString())) {
mGroupNoticeText.setText(getResources().getString(R.string.group_notice_empty_tip));
} else {
mGroupNoticeText.setText(value.toString());
}
ToastUtil.toastLongMessage(getResources().getString(R.string.modify_group_notice_success));
break;
case TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE:
mJoinTypeView.setContent(mJoinTypes.get((Integer) value));
break;
case TUIGroupConstants.Group.MODIFY_MEMBER_NAME:
ToastUtil.toastLongMessage(getResources().getString(R.string.modify_nickname_success));
mNickView.setContent(value.toString());
break;
}
}
public void setRouter(IGroupMemberListener listener) {
mMemberPreviewListener = listener;
mMemberAdapter.setManagerCallBack(listener);
}
public void setOnModifyGroupAvatarListener(GroupInfoMinimalistFragment.OnModifyGroupAvatarListener onModifyGroupAvatarListener) {
this.onModifyGroupAvatarListener = onModifyGroupAvatarListener;
}
public void modifyGroupAvatar(String avatarUrl) {
mPresenter.modifyGroupFaceUrl(mGroupInfo.getId(), avatarUrl, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
mGroupInfo.setFaceUrl(avatarUrl);
setGroupInfo(mGroupInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(TUIGroupService.getAppContext().getString(R.string.modify_icon_fail) + ", code = " + errCode + ", info = " + errMsg);
}
});
}
@Override
public void onGroupInfoChanged(GroupInfo dataSource) {
setGroupInfo(dataSource);
}
@Override
public TitleBarLayout getTitleBar() {
return mTitleBar;
}
@Override
public void setParentLayout(Object parent) {
}
public void setOnButtonClickListener(OnButtonClickListener l) {
mListener = l;
}
public interface OnButtonClickListener {
default void onSetChatBackground() {};
}
}
@@ -0,0 +1,240 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.view;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.BackgroundTasks;
import com.tencent.qcloud.tuicore.util.PopWindowUtil;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberAdapter extends RecyclerView.Adapter<GroupMemberAdapter.GroupMemberViewHodler> {
private IGroupMemberChangedCallback mCallback;
private GroupInfo mGroupInfo;
private List<GroupMemberInfo> mGroupMembers = new ArrayList<>();
private List<GroupMemberInfo> selectedGroupMemberInfos = new ArrayList<>();
private GroupInfoPresenter presenter;
private boolean isSelectMode;
private GroupMemberLayout.OnSelectChangedListener onSelectChangedListener;
private ArrayList<String> selectedMember = new ArrayList<>();
private ArrayList<String> excludeList;
private ArrayList<String> alreadySelectedList;
public void setSelectMode(boolean selectMode) {
isSelectMode = selectMode;
}
public ArrayList<String> getSelectedMember() {
return selectedMember;
}
public List<GroupMemberInfo> getSelectedMemberInfoList() {
return selectedGroupMemberInfos;
}
public void setPresenter(GroupInfoPresenter presenter) {
this.presenter = presenter;
}
public void setMemberChangedCallback(IGroupMemberChangedCallback callback) {
this.mCallback = callback;
}
public void setExcludeList(ArrayList<String> excludeList) {
this.excludeList = excludeList;
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
this.alreadySelectedList = alreadySelectedList;
}
public void setOnSelectChangedListener(GroupMemberLayout.OnSelectChangedListener onSelectChangedListener) {
this.onSelectChangedListener = onSelectChangedListener;
}
@NonNull
@Override
public GroupMemberViewHodler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_member_list_item, parent, false);
return new GroupMemberViewHodler(view);
}
@Override
public void onBindViewHolder(@NonNull GroupMemberViewHodler holder, int position) {
final GroupMemberInfo info = mGroupMembers.get(position);
GlideEngine.loadImage(holder.memberIcon, info.getIconUrl());
if (!TextUtils.isEmpty(info.getNameCard())) {
holder.memberName.setText(info.getNameCard());
} else {
if (!TextUtils.isEmpty(info.getNickName())) {
holder.memberName.setText(info.getNickName());
} else {
if (!TextUtils.isEmpty(info.getAccount())) {
holder.memberName.setText(info.getAccount());
} else {
holder.memberName.setText("");
}
}
}
if (isSelectMode) {
holder.checkBox.setVisibility(View.VISIBLE);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkBox.setChecked(!holder.checkBox.isChecked());
if (holder.checkBox.isChecked()) {
info.setSelected(true);
selectedMember.add(info.getAccount());
selectedGroupMemberInfos.add(info);
} else {
info.setSelected(false);
selectedMember.remove(info.getAccount());
selectedGroupMemberInfos.remove(info);
}
if (onSelectChangedListener != null) {
onSelectChangedListener.onSelectChanged();
}
}
});
} else {
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (!mGroupInfo.isOwner()) {
return false;
}
TextView delete = new TextView(holder.itemView.getContext());
delete.setText(R.string.group_remove_member);
int padding = ScreenUtil.getPxByDp(10);
delete.setPadding(padding, padding, padding, padding);
delete.setBackgroundResource(R.drawable.text_border);
int location[] = new int[2];
v.getLocationInWindow(location);
final PopupWindow window = PopWindowUtil.popupWindow(delete, holder.itemView, location[0], location[1] + v.getMeasuredHeight() / 3);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<GroupMemberInfo> dels = new ArrayList<>();
dels.add(info);
if (presenter == null) {
return;
}
presenter.removeGroupMembers(mGroupInfo, dels, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
mGroupMembers.remove(info);
notifyDataSetChanged();
if (mCallback != null) {
mCallback.onMemberRemoved(info);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIGroupService.getAppContext().getString(R.string.remove_fail_tip) + ":errCode=" + errCode);
}
});
window.dismiss();
}
});
return false;
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, info.getAccount());
TUICore.startActivity("FriendProfileActivity", bundle);
}
});
}
setAlreadySelected(holder, info);
}
private void setAlreadySelected(GroupMemberViewHodler holder, GroupMemberInfo memberInfo) {
if (alreadySelectedList != null && alreadySelectedList.contains(memberInfo.getAccount())) {
holder.checkBox.setChecked(true);
holder.itemView.setEnabled(false);
holder.checkBox.setEnabled(false);
} else {
holder.itemView.setEnabled(true);
holder.checkBox.setEnabled(true);
holder.checkBox.setSelected(memberInfo.isSelected());
}
}
@Override
public int getItemCount() {
if (mGroupMembers == null) {
return 0;
}
return mGroupMembers.size();
}
public void setDataSource(GroupInfo groupInfo) {
if (groupInfo != null) {
mGroupInfo = groupInfo;
mGroupMembers.clear();
if (excludeList == null || excludeList.isEmpty()) {
mGroupMembers.addAll(groupInfo.getMemberDetails());
} else {
for (GroupMemberInfo groupMemberInfo : groupInfo.getMemberDetails()) {
if (excludeList.contains(groupMemberInfo.getAccount())) {
continue;
}
mGroupMembers.add(groupMemberInfo);
}
}
BackgroundTasks.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}
protected class GroupMemberViewHodler extends RecyclerView.ViewHolder {
private ShadeImageView memberIcon;
private TextView memberName;
private CheckBox checkBox;
public GroupMemberViewHodler(@NonNull View itemView) {
super(itemView);
checkBox = itemView.findViewById(R.id.group_member_check_box);
memberIcon = itemView.findViewById(R.id.group_member_icon);
memberIcon.setRadius(ScreenUtil.dip2px(20));
memberName = itemView.findViewById(R.id.group_member_name);
}
}
}
@@ -0,0 +1,302 @@
package com.tencent.qcloud.tuikit.tuigroup.minimalistui.view;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuicore.component.RoundCornerImageView;
import com.tencent.qcloud.tuicore.component.TitleBarLayout;
import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine;
import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.component.BottomSelectSheet;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuigroup.minimalistui.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuigroup.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberLayout extends LinearLayout implements IGroupMemberLayout {
// 取一个足够大的偏移保证能一次性滚动到最底部
// Take a large enough offset to scroll to the bottom at one time
private static final int SCROLL_TO_END_OFFSET = -999999;
private TitleBarLayout mTitleBar;
private GroupMemberAdapter mAdapter;
private IGroupMemberListener groupMemberListener;
private GroupInfo mGroupInfo;
private RecyclerView recyclerView;
private boolean isSelectMode;
private String title;
private ArrayList<String> excludeList;
private ArrayList<String> alreadySelectedList;
private RecyclerView selectedList;
private SelectedAdapter selectedListAdapter;
private View selectArea;
private TextView confirmButton;
private GroupInfoPresenter presenter;
public GroupMemberLayout(Context context) {
super(context);
init();
}
public GroupMemberLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GroupMemberLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inflate(getContext(), R.layout.group_member_layout, this);
mTitleBar = findViewById(R.id.group_member_title_bar);
mTitleBar.setTitle(getContext().getString(R.string.manager), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightIcon().setVisibility(GONE);
mTitleBar.setOnRightClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buildPopMenu();
}
});
mAdapter = new GroupMemberAdapter();
mAdapter.setMemberChangedCallback(new IGroupMemberChangedCallback() {
@Override
public void onMemberRemoved(GroupMemberInfo memberInfo) {
if (!TextUtils.isEmpty(title)) {
mTitleBar.setTitle(title, ITitleBarLayout.Position.MIDDLE);
} else {
mTitleBar.setTitle(getContext().getString(R.string.group_members) +
"(" + mGroupInfo.getMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
});
recyclerView = findViewById(R.id.group_all_members);
recyclerView.setLayoutManager(new CustomLinearLayoutManager(getContext()));
recyclerView.setAdapter(mAdapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (layoutManager == null) {
return;
}
int lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (mAdapter != null) {
if (lastPosition == mAdapter.getItemCount() - 1) {
if (mGroupInfo != null && mGroupInfo.getNextSeq() != 0) {
presenter.getGroupMembers(mGroupInfo, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
onGroupInfoChanged(data);
mAdapter.notifyDataSetChanged();
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
}
}
}
}
});
selectArea = findViewById(R.id.select_area);
selectedList = findViewById(R.id.selected_list);
selectedListAdapter = new SelectedAdapter();
selectedList.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.HORIZONTAL, false));
selectedList.setAdapter(selectedListAdapter);
confirmButton = findViewById(R.id.confirm_button);
confirmButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
confirmAndFinish();
}
});
mAdapter.setOnSelectChangedListener(new OnSelectChangedListener() {
@Override
public void onSelectChanged() {
selectedListAdapter.setMembers(mAdapter.getSelectedMemberInfoList());
selectedListAdapter.notifyDataSetChanged();
}
});
}
private void confirmAndFinish() {
if (groupMemberListener != null) {
groupMemberListener.setSelectedMember(mAdapter.getSelectedMember());
}
}
public TitleBarLayout getTitleBar() {
return mTitleBar;
}
public void setExcludeList(ArrayList<String> excludeList) {
this.excludeList = excludeList;
mAdapter.setExcludeList(excludeList);
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
this.alreadySelectedList = alreadySelectedList;
mAdapter.setAlreadySelectedList(alreadySelectedList);
}
public void setSelectMode(boolean selectMode) {
isSelectMode = selectMode;
if (isSelectMode) {
mTitleBar.setTitle(getContext().getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightGroup().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (groupMemberListener != null) {
groupMemberListener.setSelectedMember(mAdapter.getSelectedMember());
}
}
});
selectArea.setVisibility(VISIBLE);
}
mAdapter.setSelectMode(isSelectMode);
}
@Override
public void setParentLayout(Object parent) {
}
public void setTitle(String title) {
this.title = title;
}
public void onGroupInfoChanged(GroupInfo groupInfo) {
mGroupInfo = groupInfo;
presenter.setGroupInfo(groupInfo);
mAdapter.setDataSource(groupInfo);
if (groupInfo != null) {
if (!TextUtils.isEmpty(title)) {
mTitleBar.setTitle(title, ITitleBarLayout.Position.MIDDLE);
} else {
mTitleBar.setTitle(getContext().getString(R.string.group_members) +
"(" + groupInfo.getMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
}
@Override
public void onGroupInfoModified(Object value, int type) {
}
private void buildPopMenu() {
if (mGroupInfo == null) {
return;
}
BottomSelectSheet sheet = new BottomSelectSheet(getContext());
List<String> stringList = new ArrayList<>();
String addMember = getResources().getString(R.string.add_group_member);
String removeMember = getResources().getString(R.string.remove_group_member);
stringList.add(addMember);
if (mGroupInfo.isOwner()) {
stringList.add(removeMember);
}
sheet.setSelectList(stringList);
sheet.setOnClickListener(new BottomSelectSheet.BottomSelectSheetOnClickListener() {
@Override
public void onSheetClick(int index) {
if (index == 0) {
if (groupMemberListener != null) {
groupMemberListener.forwardAddMember(mGroupInfo);
}
} else if (index == 1) {
if (groupMemberListener != null) {
groupMemberListener.forwardDeleteMember(mGroupInfo);
}
}
}
});
sheet.show();
}
public void setGroupMemberListener(IGroupMemberListener listener) {
this.groupMemberListener = listener;
}
public void setPresenter(GroupInfoPresenter presenter) {
this.presenter = presenter;
mAdapter.setPresenter(presenter);
}
public static class SelectedAdapter extends RecyclerView.Adapter<SelectedAdapter.SelectedViewHolder> {
private List<GroupMemberInfo> mMembers;
public void setMembers(List<GroupMemberInfo> mMembers) {
this.mMembers = mMembers;
}
@NonNull
@Override
public SelectedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new SelectedViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.group_member_selected_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull SelectedViewHolder holder, int position) {
GlideEngine.loadImage(holder.userIconView, mMembers.get(position).getIconUrl());
}
@Override
public int getItemCount() {
if (mMembers == null) {
return 0;
}
return mMembers.size();
}
public static class SelectedViewHolder extends RecyclerView.ViewHolder {
public final RoundCornerImageView userIconView;
public SelectedViewHolder(@NonNull View itemView) {
super(itemView);
userIconView = itemView.findViewById(R.id.ivAvatar);
userIconView.setRadius(ScreenUtil.dip2px(20));
}
}
}
public interface OnSelectChangedListener {
void onSelectChanged();
}
}
@@ -0,0 +1,670 @@
package com.tencent.qcloud.tuikit.tuigroup.model;
import android.text.TextUtils;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMConversationOperationResult;
import com.tencent.imsdk.v2.V2TIMGroupApplication;
import com.tencent.imsdk.v2.V2TIMGroupApplicationResult;
import com.tencent.imsdk.v2.V2TIMGroupInfo;
import com.tencent.imsdk.v2.V2TIMGroupInfoResult;
import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfoResult;
import com.tencent.imsdk.v2.V2TIMGroupMemberOperationResult;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMValueCallback;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ErrorMessageConverter;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupLog;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GroupInfoProvider {
private static final String TAG = GroupInfoProvider.class.getSimpleName();
private static final int PAGE = 50;
public void loadGroupInfo(final String groupId, final IUIKitCallback<GroupInfo> callBack) {
loadGroupInfo(groupId, V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL, callBack);
}
public void loadGroupInfo(final String groupId, int filter, final IUIKitCallback<GroupInfo> callBack) {
loadGroupPublicInfo(groupId, new IUIKitCallback<V2TIMGroupInfoResult>() {
@Override
public void onSuccess(V2TIMGroupInfoResult data) {
GroupInfo groupInfo = new GroupInfo();
groupInfo.covertTIMGroupDetailInfo(data);
String conversationId = TUIGroupUtils.getConversationIdByUserId(groupId, true);
V2TIMManager.getConversationManager().getConversation(conversationId, new V2TIMValueCallback<V2TIMConversation>() {
@Override
public void onSuccess(V2TIMConversation v2TIMConversation) {
boolean isTop = v2TIMConversation.isPinned();
groupInfo.setTopChat(isTop);
List<Long> markList = v2TIMConversation.getMarkList();
if (markList.contains(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_FOLD)) {
groupInfo.setFolded(true);
}
// 异步获取群成员
loadGroupMembers(groupInfo, filter , 0, callBack);
}
@Override
public void onError(int code, String desc) {
loadGroupMembers(groupInfo, filter, 0, callBack);
}
});
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e(TAG, "loadGroupPublicInfo failed, code: " + errCode + "|desc: " + ErrorMessageConverter.convertIMError(errCode, errMsg));
if (callBack != null) {
callBack.onError(module, errCode, ErrorMessageConverter.convertIMError(errCode, errMsg));
}
}
});
}
public void deleteGroup(String groupId, final IUIKitCallback<Void> callBack) {
V2TIMManager.getInstance().dismissGroup(groupId, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callBack, TAG, code, desc);
TUIGroupLog.e(TAG, "deleteGroup failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callBack, null);
}
});
}
public void loadGroupPublicInfo(String groupId, final IUIKitCallback<V2TIMGroupInfoResult> callBack) {
List<String> groupList = new ArrayList<>();
groupList.add(groupId);
V2TIMManager.getGroupManager().getGroupsInfo(groupList, new V2TIMValueCallback<List<V2TIMGroupInfoResult>>() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "loadGroupPublicInfo failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
callBack.onError(TAG, code, ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(List<V2TIMGroupInfoResult> v2TIMGroupInfoResults) {
if (v2TIMGroupInfoResults.size() > 0) {
V2TIMGroupInfoResult infoResult = v2TIMGroupInfoResults.get(0);
TUIGroupLog.i(TAG, infoResult.toString());
callBack.onSuccess(infoResult);
}
}
});
}
public void loadGroupMembers(GroupInfo groupInfo, long nextSeq, final IUIKitCallback<GroupInfo> callBack) {
loadGroupMembers(groupInfo, V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL, nextSeq, callBack);
}
public void loadGroupMembers(GroupInfo groupInfo, int filter, long nextSeq, final IUIKitCallback<GroupInfo> callBack) {
if (filter != V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL && filter != V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_OWNER
&& filter != V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ADMIN && filter != V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_COMMON) {
filter = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL;
}
V2TIMManager.getGroupManager().getGroupMemberList(groupInfo.getId(), filter, nextSeq, new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "loadGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callBack, TAG, code, desc);
}
@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
List<GroupMemberInfo> members = new ArrayList<>();
for (int i = 0; i < v2TIMGroupMemberInfoResult.getMemberInfoList().size(); i++) {
GroupMemberInfo member = new GroupMemberInfo();
members.add(member.covertTIMGroupMemberInfo(v2TIMGroupMemberInfoResult.getMemberInfoList().get(i)));
}
List<GroupMemberInfo> memberInfoList = groupInfo.getMemberDetails();
Iterator<GroupMemberInfo> iterator = members.iterator();
while (iterator.hasNext()) {
GroupMemberInfo memberInfo = iterator.next();
for (GroupMemberInfo existsMemberInfo : memberInfoList) {
if (TextUtils.equals(memberInfo.getAccount(), existsMemberInfo.getAccount())) {
iterator.remove();
break;
}
}
}
memberInfoList.addAll(members);
groupInfo.setNextSeq(v2TIMGroupMemberInfoResult.getNextSeq());
TUIGroupUtils.callbackOnSuccess(callBack, groupInfo);
}
});
}
public void modifyGroupInfo(GroupInfo groupInfo, final Object value, final int type, final IUIKitCallback callBack) {
V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();
v2TIMGroupInfo.setGroupID(groupInfo.getId());
if (type == TUIGroupConstants.Group.MODIFY_GROUP_NAME) {
v2TIMGroupInfo.setGroupName(value.toString());
} else if (type == TUIGroupConstants.Group.MODIFY_GROUP_NOTICE) {
v2TIMGroupInfo.setNotification(value.toString());
} else if (type == TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE) {
v2TIMGroupInfo.setGroupAddOpt((Integer)value);
}
V2TIMManager.getGroupManager().setGroupInfo(v2TIMGroupInfo, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.i(TAG, "modifyGroupInfo failed type| value| code| desc " + value + ":" + type + ":" + code + ":" + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callBack, TAG, code, desc);
}
@Override
public void onSuccess() {
if (type == TUIGroupConstants.Group.MODIFY_GROUP_NAME) {
groupInfo.setGroupName(value.toString());
} else if (type == TUIGroupConstants.Group.MODIFY_GROUP_NOTICE) {
groupInfo.setNotice(value.toString());
} else if (type == TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE) {
groupInfo.setJoinType((Integer) value);
}
TUIGroupUtils.callbackOnSuccess(callBack, value);
}
});
}
public void modifyMyGroupNickname(GroupInfo groupInfo, final String nickname, final IUIKitCallback callBack) {
if (groupInfo == null) {
ToastUtil.toastLongMessage("modifyMyGroupNickname fail: NO GROUP");
return;
}
V2TIMGroupMemberFullInfo v2TIMGroupMemberFullInfo = new V2TIMGroupMemberFullInfo();
v2TIMGroupMemberFullInfo.setUserID(V2TIMManager.getInstance().getLoginUser());
v2TIMGroupMemberFullInfo.setNameCard(nickname);
V2TIMManager.getGroupManager().setGroupMemberInfo(groupInfo.getId(), v2TIMGroupMemberFullInfo, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
callBack.onError(TAG, code, ErrorMessageConverter.convertIMError(code, desc));
ToastUtil.toastLongMessage("modifyMyGroupNickname fail: " + code + "=" + ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess() {
callBack.onSuccess(null);
}
});
}
public void setTopConversation(String conversationId, boolean isSetTop, IUIKitCallback<Void> callBack) {
TUIGroupLog.i(TAG, "setConversationTop id:" + conversationId + "|isTop:" + isSetTop);
V2TIMManager.getConversationManager().pinConversation(conversationId, isSetTop, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callBack, null);
}
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "setConversationTop code:" + code + "|desc:" + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callBack, code, desc);
}
});
}
public void quitGroup(String groupId, final IUIKitCallback<Void> callBack) {
V2TIMManager.getInstance().quitGroup(groupId, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "quitGroup failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callBack, TAG, code, desc);
}
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callBack, null);
}
});
}
public void inviteGroupMembers(GroupInfo groupInfo, List<String> addMembers, final IUIKitCallback callBack) {
if (addMembers == null || addMembers.size() == 0) {
return;
}
V2TIMManager.getGroupManager().inviteUserToGroup(groupInfo.getId(), addMembers, new V2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "addGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
callBack.onError(TAG, code, ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(List<V2TIMGroupMemberOperationResult> v2TIMGroupMemberOperationResults) {
final List<String> adds = new ArrayList<>();
if (v2TIMGroupMemberOperationResults.size() > 0) {
for (int i = 0; i < v2TIMGroupMemberOperationResults.size(); i++) {
V2TIMGroupMemberOperationResult res = v2TIMGroupMemberOperationResults.get(i);
if (res.getResult() == V2TIMGroupMemberOperationResult.OPERATION_RESULT_PENDING) {
callBack.onSuccess(TUIGroupService.getAppContext().getString(R.string.request_wait));
return;
}
if (res.getResult() > 0) {
adds.add(res.getMemberID());
}
}
}
if (adds.size() > 0) {
groupInfo.getMemberDetails().clear();
loadGroupMembers(groupInfo, 0, callBack);
}
}
});
}
public void removeGroupMembers(String groupId, List<String> members, final IUIKitCallback<List<String>> callBack) {
if (members == null || members.size() == 0) {
return;
}
V2TIMManager.getGroupManager().kickGroupMember(groupId, members, "", new V2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "removeGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
callBack.onError(TAG, code, ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(List<V2TIMGroupMemberOperationResult> v2TIMGroupMemberOperationResults) {
List<String> dels = new ArrayList<>();
for (int i = 0; i < v2TIMGroupMemberOperationResults.size(); i++) {
V2TIMGroupMemberOperationResult res = v2TIMGroupMemberOperationResults.get(i);
if (res.getResult() == V2TIMGroupMemberOperationResult.OPERATION_RESULT_SUCC) {
dels.add(res.getMemberID());
}
}
callBack.onSuccess(dels);
}
});
}
public List<GroupApplyInfo> getApplyList() {
return null;
}
public void loadGroupApplies(GroupInfo groupInfo, final IUIKitCallback<List<GroupApplyInfo>> callBack) {
loadApplyInfo(new IUIKitCallback<List<GroupApplyInfo>>() {
@Override
public void onSuccess(List<GroupApplyInfo> data) {
if (groupInfo == null) {
callBack.onError(TAG, 0, "no groupInfo");
return;
}
String groupId = groupInfo.getId();
List<GroupApplyInfo> applyInfos = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
GroupApplyInfo applyInfo = data.get(i);
if (groupId.equals(applyInfo.getGroupApplication().getGroupID())
&& applyInfo.getGroupApplication().getHandleStatus() == V2TIMGroupApplication.V2TIM_GROUP_APPLICATION_HANDLE_STATUS_UNHANDLED) {
applyInfos.add(applyInfo);
}
}
callBack.onSuccess(applyInfos);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e(TAG, "loadApplyInfo failed, code: " + errCode + "|desc: " + ErrorMessageConverter.convertIMError(errCode, errMsg));
callBack.onError(module, errCode, ErrorMessageConverter.convertIMError(errCode, errMsg));
}
});
}
private void loadApplyInfo(final IUIKitCallback<List<GroupApplyInfo>> callBack) {
final List<GroupApplyInfo> applies = new ArrayList<>();
V2TIMManager.getGroupManager().getGroupApplicationList(new V2TIMValueCallback<V2TIMGroupApplicationResult>() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "getGroupPendencyList failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
callBack.onError(TAG, code, ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(V2TIMGroupApplicationResult v2TIMGroupApplicationResult) {
List<V2TIMGroupApplication> v2TIMGroupApplicationList = v2TIMGroupApplicationResult.getGroupApplicationList();
for (int i = 0; i < v2TIMGroupApplicationList.size(); i++) {
GroupApplyInfo info = new GroupApplyInfo(v2TIMGroupApplicationList.get(i));
info.setStatus(0);
applies.add(info);
}
callBack.onSuccess(applies);
}
});
}
public void acceptApply(final GroupApplyInfo item, final IUIKitCallback<Void> callBack) {
V2TIMManager.getGroupManager().acceptGroupApplication(item.getGroupApplication(), "", new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "acceptApply failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
callBack.onError(TAG, code, ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess() {
callBack.onSuccess(null);
}
});
}
public void refuseApply(final GroupApplyInfo item, final IUIKitCallback<Void> callBack) {
V2TIMManager.getGroupManager().refuseGroupApplication(item.getGroupApplication(), "", new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "refuseApply failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callBack, TAG, code, desc);
}
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callBack, null);
}
});
}
public void setGroupReceiveMessageOpt(String groupId, boolean isReceive, IUIKitCallback callBack) {
int option;
if (!isReceive) {
option = V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE;
} else {
option = V2TIMMessage.V2TIM_RECEIVE_MESSAGE;
}
V2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupId, option, new V2TIMCallback(){
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callBack, null);
TUIGroupLog.d(TAG, "setReceiveMessageOpt onSuccess");
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callBack, code, desc);
TUIGroupLog.d(TAG, "setReceiveMessageOpt onError code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
}
});
}
public void setGroupFold(String groupID, boolean isFold, IUIKitCallback callback) {
TUIGroupLog.i(TAG, "setGroupFold id:" + groupID + "|isTop:" + isFold);
String conversationID = "group_" + groupID;
List<String> conversationIDList = new ArrayList<>();
conversationIDList.add(conversationID);
V2TIMManager.getConversationManager().markConversation(conversationIDList,
V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_FOLD, isFold,
new V2TIMValueCallback<List<V2TIMConversationOperationResult>>() {
@Override
public void onSuccess(List<V2TIMConversationOperationResult> v2TIMConversationOperationResults) {
TUIGroupUtils.callbackOnSuccess(callback, null);
TUIGroupLog.d(TAG, "markConversation fold onSuccess");
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
TUIGroupLog.d(TAG, "markConversation fold onError code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
}
});
}
public void modifyGroupFaceUrl(String groupId, String faceUrl, IUIKitCallback<Void> callback) {
V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();
v2TIMGroupInfo.setGroupID(groupId);
v2TIMGroupInfo.setFaceUrl(faceUrl);
V2TIMManager.getGroupManager().setGroupInfo(v2TIMGroupInfo, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "modify group icon failed, code:" + code + "|desc:" + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callback, code, desc);
}
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
});
}
public GroupMemberInfo getSelfGroupMemberInfo(GroupInfo groupInfo) {
for (int i = 0; i < groupInfo.getMemberDetails().size(); i++) {
GroupMemberInfo memberInfo = groupInfo.getMemberDetails().get(i);
if (TextUtils.equals(memberInfo.getAccount(), V2TIMManager.getInstance().getLoginUser())) {
return memberInfo;
}
}
return null;
}
public boolean isAdmin(int memberType) {
return memberType == V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN;
}
public boolean isSelf(String userId) {
return TextUtils.equals(userId, V2TIMManager.getInstance().getLoginUser());
}
public void muteAll(String groupId, boolean isAllMute, IUIKitCallback<Void> callback) {
V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();
v2TIMGroupInfo.setGroupID(groupId);
v2TIMGroupInfo.setAllMuted(isAllMute);
V2TIMManager.getGroupManager().setGroupInfo(v2TIMGroupInfo, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "muteAll failed, code:" + code + "|desc:" + ErrorMessageConverter.convertIMError(code, desc));
TUIGroupUtils.callbackOnError(callback, code, desc);
}
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
});
}
public void loadGroupManagers(String groupId, IUIKitCallback<List<GroupMemberInfo>> callback) {
List<GroupMemberInfo> managerList = new ArrayList<>();
V2TIMValueCallback<V2TIMGroupMemberInfoResult> v2TIMValueCallback = new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
List<V2TIMGroupMemberFullInfo> infoList = v2TIMGroupMemberInfoResult.getMemberInfoList();
for (V2TIMGroupMemberFullInfo fullInfo : infoList) {
GroupMemberInfo member = new GroupMemberInfo();
managerList.add(member.covertTIMGroupMemberInfo(fullInfo));
}
long loadNextSeq = v2TIMGroupMemberInfoResult.getNextSeq();
if (loadNextSeq == 0) {
TUIGroupUtils.callbackOnSuccess(callback, managerList);
} else {
loadGroupManagers(groupId, loadNextSeq, this);
}
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
};
loadGroupManagers(groupId, 0, v2TIMValueCallback);
}
private void loadGroupManagers(String groupId, long nextSeq, V2TIMValueCallback<V2TIMGroupMemberInfoResult> callback) {
int filter = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ADMIN;
V2TIMManager.getGroupManager().getGroupMemberList(groupId, filter, nextSeq, callback);
}
private void loadGroupMembers(String groupId, long nextSeq, V2TIMValueCallback<V2TIMGroupMemberInfoResult> callback) {
int filter = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL;
V2TIMManager.getGroupManager().getGroupMemberList(groupId, filter, nextSeq, callback);
}
public void loadMutedMembers(String groupId, IUIKitCallback<List<GroupMemberInfo>> callback) {
List<GroupMemberInfo> managerList = new ArrayList<>();
V2TIMValueCallback<V2TIMGroupMemberInfoResult> v2TIMValueCallback = new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
List<V2TIMGroupMemberFullInfo> infoList = v2TIMGroupMemberInfoResult.getMemberInfoList();
long serverTime = V2TIMManager.getInstance().getServerTime();
for (V2TIMGroupMemberFullInfo fullInfo : infoList) {
long mutedUntil = fullInfo.getMuteUntil();
if (mutedUntil > serverTime) {
GroupMemberInfo member = new GroupMemberInfo();
managerList.add(member.covertTIMGroupMemberInfo(fullInfo));
}
}
long loadNextSeq = v2TIMGroupMemberInfoResult.getNextSeq();
if (loadNextSeq == 0) {
TUIGroupUtils.callbackOnSuccess(callback, managerList);
} else {
loadGroupMembers(groupId, loadNextSeq, this);
}
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
};
loadGroupMembers(groupId, 0, v2TIMValueCallback);
}
public void loadGroupOwner(String groupId, IUIKitCallback<GroupMemberInfo> callback) {
int filter = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_OWNER;
V2TIMManager.getGroupManager().getGroupMemberList(groupId, filter, 0, new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
List<V2TIMGroupMemberFullInfo> list = v2TIMGroupMemberInfoResult.getMemberInfoList();
GroupMemberInfo member = new GroupMemberInfo();
member.covertTIMGroupMemberInfo(list.get(0));
TUIGroupUtils.callbackOnSuccess(callback, member);
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
});
}
public void muteGroupMember(String groupId, String userId, int seconds, IUIKitCallback<Void> callback) {
V2TIMManager.getGroupManager().muteGroupMember(groupId, userId, seconds, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
});
}
public void cancelMuteGroupMember(String groupId, String userId, IUIKitCallback<Void> callback) {
V2TIMManager.getGroupManager().muteGroupMember(groupId, userId, 0, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
});
}
public void setGroupManager(String groupId, String userId, IUIKitCallback<Void> callback) {
int role = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN;
V2TIMManager.getGroupManager().setGroupMemberRole(groupId, userId, role, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
});
}
public void clearGroupManager(String groupId, String userId, IUIKitCallback<Void> callback) {
int role = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_MEMBER;
V2TIMManager.getGroupManager().setGroupMemberRole(groupId, userId, role, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
});
}
public void transferGroupOwner(String groupId, String userId, IUIKitCallback<Void> callback) {
V2TIMManager.getGroupManager().transferGroupOwner(groupId, userId, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIGroupUtils.callbackOnError(callback, code, desc);
}
});
}
public void modifyGroupNotification(String groupId, final String value, final IUIKitCallback callBack) {
V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();
v2TIMGroupInfo.setGroupID(groupId);
v2TIMGroupInfo.setNotification(value);
V2TIMManager.getGroupManager().setGroupInfo(v2TIMGroupInfo, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "modifyGroupNotification failed value| code| desc " + value + ":" + code + ":" + desc);
TUIGroupUtils.callbackOnError(callBack, TAG, code, desc);
}
@Override
public void onSuccess() {
TUIGroupUtils.callbackOnSuccess(callBack, null);
}
});
}
}
@@ -0,0 +1,71 @@
package com.tencent.qcloud.tuikit.tuigroup.presenter;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuigroup.model.GroupInfoProvider;
import java.util.List;
public class GroupApplyPresenter {
private final IGroupApplyLayout layout;
private final GroupInfoProvider provider;
private GroupInfo groupInfo;
public GroupApplyPresenter(IGroupApplyLayout layout) {
this.layout = layout;
provider = new GroupInfoProvider();
}
public void setGroupInfo(GroupInfo groupInfo) {
this.groupInfo = groupInfo;
}
public void loadGroupApplies() {
provider.loadGroupApplies(groupInfo, new IUIKitCallback<List<GroupApplyInfo>>() {
@Override
public void onSuccess(List<GroupApplyInfo> data) {
layout.onGroupApplyInfoListChanged(data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
}
});
}
public void acceptApply(GroupApplyInfo item) {
provider.acceptApply(item, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
item.setStatus(GroupApplyInfo.APPLIED);
layout.onDataSetChanged();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(errMsg);
}
});
}
public void refuseApply(final GroupApplyInfo item) {
provider.refuseApply(item, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
item.setStatus(GroupApplyInfo.REFUSED);
layout.onDataSetChanged();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(errMsg);
}
});
}
}
@@ -0,0 +1,369 @@
package com.tencent.qcloud.tuikit.tuigroup.presenter;
import android.text.TextUtils;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupConstants;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.GroupEventListener;
import com.tencent.qcloud.tuikit.tuigroup.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuigroup.model.GroupInfoProvider;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupLog;
import com.tencent.qcloud.tuikit.tuigroup.util.TUIGroupUtils;
import java.util.ArrayList;
import java.util.List;
public class GroupInfoPresenter {
public static final String TAG = GroupInfoPresenter.class.getSimpleName();
private final IGroupMemberLayout layout;
private final GroupInfoProvider provider;
private GroupInfo groupInfo;
private GroupMemberInfo selfGroupMemberInfo;
private GroupEventListener groupEventListener;
public GroupInfoPresenter(IGroupMemberLayout layout) {
this.layout = layout;
provider = new GroupInfoProvider();
}
public void setGroupEventListener() {
groupEventListener = new GroupEventListener() {
@Override
public void onGroupInfoChanged(String groupID) {
GroupInfoPresenter.this.onGroupInfoChanged(groupID);
}
};
TUIGroupService.getInstance().addGroupEventListener(groupEventListener);
}
public void setGroupInfo(GroupInfo groupInfo) {
this.groupInfo = groupInfo;
}
public void loadGroupInfo(String groupId) {
loadGroupInfo(groupId, GroupInfo.GROUP_MEMBER_FILTER_ALL);
}
public void loadGroupInfo(String groupId, int filter) {
provider.loadGroupInfo(groupId, filter, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
groupInfo = data;
layout.onGroupInfoChanged(data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e("loadGroupInfo", errCode + ":" + errMsg);
ToastUtil.toastLongMessage(errMsg);
}
});
}
private void onGroupInfoChanged(String groupID) {
if (groupInfo != null && TextUtils.equals(groupID, groupInfo.getId())) {
loadGroupInfo(groupID);
}
}
public void getGroupMembers(GroupInfo groupInfo, final IUIKitCallback<GroupInfo> callBack) {
provider.loadGroupMembers(groupInfo, groupInfo.getNextSeq(), new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
if (layout != null) {
layout.onGroupInfoChanged(data);
}
TUIGroupUtils.callbackOnSuccess(callBack, data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e("loadGroupInfo", errCode + ":" + errMsg);
TUIGroupUtils.callbackOnError(callBack, errCode, errMsg);
ToastUtil.toastLongMessage(errMsg);
}
});
}
public void modifyGroupName(final String name) {
if (groupInfo == null) {
return;
}
provider.modifyGroupInfo(groupInfo, name, TUIGroupConstants.Group.MODIFY_GROUP_NAME, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
layout.onGroupInfoModified(name, TUIGroupConstants.Group.MODIFY_GROUP_NAME);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e("modifyGroupName", errCode + ":" + errMsg);
ToastUtil.toastLongMessage(errMsg);
}
});
}
public void modifyGroupNotice(final String notice) {
if (groupInfo == null) {
return;
}
provider.modifyGroupInfo(groupInfo, notice, TUIGroupConstants.Group.MODIFY_GROUP_NOTICE, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
layout.onGroupInfoModified(notice, TUIGroupConstants.Group.MODIFY_GROUP_NOTICE);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e("modifyGroupNotice", errCode + ":" + errMsg);
ToastUtil.toastLongMessage(errMsg);
}
});
}
public String getNickName() {
String nickName = "";
GroupMemberInfo self = getSelfGroupMemberInfo();
if (self != null) {
nickName = self.getNameCard();
}
return nickName == null ? "" : nickName;
}
public void modifyMyGroupNickname(final String nickname) {
provider.modifyMyGroupNickname(groupInfo, nickname, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
layout.onGroupInfoModified(nickname, TUIGroupConstants.Group.MODIFY_MEMBER_NAME);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e("modifyMyGroupNickname", errCode + ":" + errMsg);
ToastUtil.toastLongMessage(errMsg);
}
});
}
public void deleteGroup(IUIKitCallback<Void> callback) {
if (groupInfo == null) {
return;
}
String groupId = groupInfo.getId();
provider.deleteGroup(groupId, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupLog.e("deleteGroup", errCode + ":" + errMsg);
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void setTopConversation(String groupId, boolean isSetTop, IUIKitCallback<Void> callback) {
String conversationId = TUIGroupUtils.getConversationIdByUserId(groupId, true);
provider.setTopConversation(conversationId, isSetTop, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
groupInfo.setTopChat(isSetTop);
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void quitGroup(IUIKitCallback<Void> callback) {
if (groupInfo == null) {
return;
}
String groupId = groupInfo.getId();
provider.quitGroup(groupId, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
TUIGroupLog.e("quitGroup", errCode + ":" + errMsg);
}
});
}
public void modifyGroupInfo(int value, int type) {
if (groupInfo == null) {
return;
}
provider.modifyGroupInfo(groupInfo, value, type, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
layout.onGroupInfoModified(data, TUIGroupConstants.Group.MODIFY_GROUP_JOIN_TYPE);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage("modifyGroupInfo fail :" + errCode + "=" + errMsg);
}
});
}
public void inviteGroupMembers(String groupId, List<String> addMembers, IUIKitCallback<Object> callback) {
provider.loadGroupInfo(groupId, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
groupInfo = data;
inviteGroupMembers(addMembers, callback);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void deleteGroupMembers(String groupId, List<String> members, IUIKitCallback<List<String>> callback) {
provider.removeGroupMembers(groupId, members, callback);
}
private void inviteGroupMembers(List<String> addMembers, IUIKitCallback<Object> callback) {
provider.inviteGroupMembers(groupInfo, addMembers, new IUIKitCallback<Object>() {
@Override
public void onSuccess(Object data) {
TUIGroupUtils.callbackOnSuccess(callback, data);
if (layout != null) {
layout.onGroupInfoChanged(groupInfo);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void removeGroupMembers(GroupInfo groupInfo, List<GroupMemberInfo> delMembers, IUIKitCallback callBack) {
List<String> memberAccountList = new ArrayList<>();
for (GroupMemberInfo memberInfo : delMembers) {
memberAccountList.add(memberInfo.getAccount());
}
provider.removeGroupMembers(groupInfo.getId(), memberAccountList, new IUIKitCallback<List<String>>() {
@Override
public void onSuccess(List<String> data) {
List<GroupMemberInfo> memberInfoList = groupInfo.getMemberDetails();
for (int i = 0; i < data.size(); i++) {
for (int j = memberInfoList.size() - 1; j >= 0; j--) {
if (memberInfoList.get(j).getAccount().equals(data.get(i))) {
memberInfoList.remove(j);
break;
}
}
}
TUIGroupUtils.callbackOnSuccess(callBack, data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callBack, errCode, errMsg);
}
});
}
public void setGroupNotDisturb(GroupInfo groupInfo, boolean isChecked, IUIKitCallback<Void> callback) {
if (groupInfo == null) {
TUIGroupLog.e(TAG, "mGroupInfo is NULL");
return;
}
provider.setGroupReceiveMessageOpt(groupInfo.getId(), !isChecked, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
groupInfo.setMessageReceiveOption(!isChecked);
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void setGroupFold(GroupInfo groupInfo, boolean isChecked, IUIKitCallback<Void> callback) {
if (groupInfo == null) {
TUIGroupLog.e(TAG, "mGroupInfo is NULL");
return;
}
provider.setGroupFold(groupInfo.getId(), isChecked, new IUIKitCallback() {
@Override
public void onSuccess(Object data) {
groupInfo.setFolded(isChecked);
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void modifyGroupFaceUrl(String groupId, String faceUrl, IUIKitCallback<Void> callback) {
provider.modifyGroupFaceUrl(groupId, faceUrl, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
TUIGroupUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIGroupUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public GroupMemberInfo getSelfGroupMemberInfo() {
if (selfGroupMemberInfo != null) {
return selfGroupMemberInfo;
}
if (groupInfo == null) {
return null;
}
GroupMemberInfo groupMemberInfo = provider.getSelfGroupMemberInfo(groupInfo);
selfGroupMemberInfo = groupMemberInfo;
return selfGroupMemberInfo;
}
public boolean isAdmin(int memberType) {
return provider.isAdmin(memberType);
}
public boolean isSelf(String userId) {
return provider.isSelf(userId);
}
public void transferGroupOwner(String groupId, String userId, IUIKitCallback<Void> callback) {
provider.transferGroupOwner(groupId, userId, callback);
}
}
@@ -0,0 +1,52 @@
package com.tencent.qcloud.tuikit.tuigroup.presenter;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuigroup.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuigroup.model.GroupInfoProvider;
import java.util.List;
public class GroupManagerPresenter {
private final GroupInfoProvider provider;
public GroupManagerPresenter() {
provider = new GroupInfoProvider();
}
public void muteAll(String groupId, boolean isAllMute, IUIKitCallback<Void> callback) {
provider.muteAll(groupId, isAllMute, callback);
}
public void loadGroupManager(String groupId, IUIKitCallback<List<GroupMemberInfo>> callback) {
provider.loadGroupManagers(groupId, callback);
}
public void loadGroupOwner(String groupId, IUIKitCallback<GroupMemberInfo> callback) {
provider.loadGroupOwner(groupId, callback);
}
public void loadMutedMembers(String groupId, IUIKitCallback<List<GroupMemberInfo>> callback) {
provider.loadMutedMembers(groupId, callback);
}
public void muteGroupMember(String groupId, String userId, IUIKitCallback<Void> callback) {
int muteTime = 365 * 24 * 3600; // 365 days
provider.muteGroupMember(groupId, userId, muteTime, callback);
}
public void setGroupManager(String groupId, String userId, IUIKitCallback<Void> callback) {
provider.setGroupManager(groupId, userId, callback);
}
public void clearGroupManager(String groupId, String userId, IUIKitCallback<Void> callback) {
provider.clearGroupManager(groupId, userId, callback);
}
public void cancelMuteGroupMember(String groupId, String userId, IUIKitCallback<Void> callback) {
provider.cancelMuteGroupMember(groupId, userId, callback);
}
public void modifyGroupNotification(String groupId, String value, IUIKitCallback<Void> callback) {
provider.modifyGroupNotification(groupId, value, callback);
}
}
@@ -0,0 +1,37 @@
package com.tencent.qcloud.tuikit.tuigroup.util;
import com.tencent.imsdk.common.IMLog;
public class TUIGroupLog extends IMLog {
private static final String PRE = "TUIGroup-";
private static String mixTag(String tag) {
return PRE + tag;
}
public static void v(String strTag, String strInfo) {
IMLog.v(mixTag(strTag), strInfo);
}
public static void d(String strTag, String strInfo) {
IMLog.d(mixTag(strTag), strInfo);
}
public static void i(String strTag, String strInfo) {
IMLog.i(mixTag(strTag), strInfo);
}
public static void w(String strTag, String strInfo) {
IMLog.w(mixTag(strTag), strInfo);
}
public static void w(String strTag, String strInfo, Throwable e) {
IMLog.w(mixTag(strTag), strInfo + e.getMessage());
}
public static void e(String strTag, String strInfo) {
IMLog.e(mixTag(strTag), strInfo);
}
}
@@ -0,0 +1,96 @@
package com.tencent.qcloud.tuikit.tuigroup.util;
import static com.tencent.qcloud.tuicore.TUIConstants.TUIConversation.CONVERSATION_C2C_PREFIX;
import static com.tencent.qcloud.tuicore.TUIConstants.TUIConversation.CONVERSATION_GROUP_PREFIX;
import android.text.TextUtils;
import com.tencent.imsdk.v2.V2TIMGroupInfo;
import com.tencent.imsdk.v2.V2TIMGroupInfoResult;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMValueCallback;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuigroup.R;
import com.tencent.qcloud.tuikit.tuigroup.TUIGroupService;
import java.util.ArrayList;
import java.util.List;
public class TUIGroupUtils {
private static final String TAG = "TUIGroupUtils";
public static final int GROUP_EVENT_TIP_JOINED = 1;
public static final int GROUP_EVENT_TIP_INVITED = 2;
public static final int GROUP_EVENT_TIP_KICKED = 3;
public static final int GROUP_EVENT_TIP_DISBANDED = 4;
public static <T> void callbackOnError(IUIKitCallback<T> callBack, String module, int errCode, String desc) {
if (callBack != null) {
callBack.onError(module, errCode, desc);
}
}
public static <T> void callbackOnError(IUIKitCallback<T> callBack, int errCode, String desc) {
if (callBack != null) {
callBack.onError(null, errCode, desc);
}
}
public static <T> void callbackOnSuccess(IUIKitCallback<T> callBack, T data) {
if (callBack != null) {
callBack.onSuccess(data);
}
}
public static String getConversationIdByUserId(String id, boolean isGroup) {
String conversationIdPrefix = isGroup ? CONVERSATION_GROUP_PREFIX : CONVERSATION_C2C_PREFIX;
return conversationIdPrefix + id;
}
public static void toastGroupEvent(int type, String groupID) {
List<String> groupList = new ArrayList<>();
groupList.add(groupID);
V2TIMManager.getGroupManager().getGroupsInfo(groupList, new V2TIMValueCallback<List<V2TIMGroupInfoResult>>() {
@Override
public void onSuccess(List<V2TIMGroupInfoResult> v2TIMGroupInfoResults) {
V2TIMGroupInfoResult v2TIMGroupInfoResult = v2TIMGroupInfoResults.get(0);
if (v2TIMGroupInfoResult.getResultCode() == 0) {
V2TIMGroupInfo groupInfo = v2TIMGroupInfoResult.getGroupInfo();
if (TextUtils.equals(TUILogin.getLoginUser(), groupInfo.getOwner())) {
return;
}
String groupName = groupInfo.getGroupName();
if (TextUtils.isEmpty(groupName)) {
groupName = groupID;
}
toastGroupEventByName(type, groupName);
} else {
TUIGroupLog.e(TAG, "toastGroupEvent failed, code=" + v2TIMGroupInfoResult.getResultCode() + ", msg=" + v2TIMGroupInfoResult.getResultMessage());
}
}
@Override
public void onError(int code, String desc) {
TUIGroupLog.e(TAG, "toastGroupEvent failed, code=" + code + ", msg=" + desc);
toastGroupEventByName(type, groupID);
}
});
}
private static void toastGroupEventByName(int type, String groupName) {
String toastString = null;
if (type == GROUP_EVENT_TIP_JOINED) {
toastString = TUIGroupService.getAppContext().getString(R.string.joined_tip) + groupName;
} else if (type == GROUP_EVENT_TIP_INVITED) {
toastString = TUIGroupService.getAppContext().getString(R.string.join_group_tip) + groupName;
} else if (type == GROUP_EVENT_TIP_KICKED) {
toastString = TUIGroupService.getAppContext().getString(R.string.kick_group) + groupName;
} else if (type == GROUP_EVENT_TIP_DISBANDED) {
toastString = TUIGroupService.getAppContext().getString(R.string.dismiss_tip_before) + groupName + TUIGroupService.getAppContext().getString(R.string.dismiss_tip_after);
}
if (toastString != null) {
// ToastUtil.toastLongMessage(toastString); //当前需要不要提示,所以注释掉
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TUIGroupLightTheme" parent="TUIBaseLightTheme">
<item name="group_add_icon">@drawable/group_add_icon_light</item>
</style>
</resources>
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TUIGroupLivelyTheme" parent="TUIBaseLivelyTheme">
<item name="group_add_icon">@drawable/group_add_icon_lively</item>
</style>
</resources>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#ffffff" />
<stroke
android:dashGap="5dp"
android:dashWidth="5dp"
android:width="1dp"
android:color="#bfbfbf" />
<corners android:radius="25dp" />
</shape>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<com.tencent.qcloud.tuikit.tuigroup.minimalistui.view.GroupApplyManagerLayout
android:id="@+id/group_apply_manager_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.tencent.qcloud.tuikit.tuigroup.minimalistui.view.GroupInfoLayout
android:id="@+id/group_info_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/status_bar_color"
android:orientation="vertical">
<com.tencent.qcloud.tuikit.tuigroup.minimalistui.view.GroupMemberLayout
android:id="@+id/group_member_grid_layout"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/limit_tips"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:paddingBottom="36dp"
android:paddingTop="12dp"
android:background="#F6F6F6"
android:textColor="#999999"
android:textSize="12sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:visibility="visible"
tools:text="123"
android:visibility="gone"/>
</LinearLayout>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TUIGroupSeriousTheme" parent="TUIBaseSeriousTheme">
<item name="group_add_icon">@drawable/group_add_icon_serious</item>
</style>
</resources>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:fromYDelta="100%"
android:toXDelta="0"
android:toYDelta="0"
android:duration="150">
</translate>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="100"
android:duration="150">
</translate>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/btn_negative_hover">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="2.5dp" />
<solid android:color="@color/btn_negative_hover" />
</shape>
</item>
<item android:color="@color/btn_negative">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="2.5dp" />
<solid android:color="@color/btn_negative" />
</shape>
</item>
</selector>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/btn_positive_hover" >
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="5dp" />
<solid android:color="@color/btn_positive_hover" />
</shape>
</item>
<item android:color="@color/btn_positive" >
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="5dp" />
<solid android:color="@color/btn_positive" />
</shape>
</item>
</selector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:dashGap="5dp"
android:dashWidth="5dp"
android:width="1dp"
android:color="#bfbfbf" />
<corners android:radius="5dp" />
</shape>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<corners android:radius="10dp" />
</shape>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="@color/item_split_color" />
<solid android:color="#00000000" />
</shape>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp" />
<solid android:color="#c3c3c3" />
</shape>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/check_box_selected" android:state_checked="true" android:state_enabled="true"/>
<item android:drawable="@drawable/group_select_disable" android:state_checked="true" android:state_enabled="false"/>
<item android:drawable="@drawable/check_box_unselected" android:state_checked="false" />
<item android:drawable="@drawable/check_box_unselected" />
</selector>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?attr/core_primary_color"/>
<corners android:radius="4dp"/>
</shape>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#E5E5E5"/>
<size
android:height="0.5dp"/>
</shape>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/green" />
<size android:width="1dp" />
</shape>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<stroke
android:width="1dp"
android:color="#cccccc" />
<solid android:color="#ffffff" />
</shape>
</item>
</layer-list>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="@color/item_split_color" />
<solid android:color="#fff" />
</shape>
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F2F3F5"
android:orientation="vertical"
tools:context=".classicui.page.ManageGroupActivity">
<com.tencent.qcloud.tuicore.component.TitleBarLayout
android:id="@+id/group_manage_title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/group_manage_set_manager"
app:isTop="true"
app:canNav="true"
app:name="@string/group_set_manager"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"/>
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/group_manage_mute_all"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
app:name="@string/group_mute_all"
app:isSwitch="true"
app:isTop="true"
app:canNav="false"/>
<TextView
android:text="@string/group_mute_tip"
android:textSize="11.52sp"
android:lineHeight="17.28dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/group_manage_add_mute_member"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:background="@color/white"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height">
<ImageView
android:background="?attr/group_add_icon"
android:scaleType="centerCrop"
android:layout_width="19.2dp"
android:layout_height="19.2dp"
android:layout_marginRight="13.44dp"/>
<TextView
android:text="@string/group_add_mute_member_tip"
android:textSize="15.36sp"
android:textColor="#444444"
android:lineHeight="23sp"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/group_manage_muted_member_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".classicui.page.GroupNoticeActivity">
<com.tencent.qcloud.tuicore.component.TitleBarLayout
android:id="@+id/group_notice_title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height" />
<EditText
android:id="@+id/group_notice_text"
android:longClickable="false"
android:paddingTop="10dp"
android:paddingLeft="15.36dp"
android:paddingRight="15.36dp"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:background="@null"
android:gravity="start"
android:lines="8"
android:maxLines="10"
android:text="@string/group_notice_empty_tip"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F2F3F5"
android:orientation="vertical"
tools:context=".classicui.page.SetGroupManagerActivity">
<com.tencent.qcloud.tuicore.component.TitleBarLayout
android:id="@+id/set_group_manager_title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height" />
<TextView
android:id="@+id/set_group_manager_owner_label"
android:text="@string/group_owner_label"
android:textSize="13.44sp"
android:lineHeight="19.2dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="30dp"/>
<LinearLayout
android:id="@+id/set_group_manager_group_owner"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:background="@color/white"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="60dp">
<com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView
android:id="@+id/set_group_manager_owner_face"
android:scaleType="centerCrop"
android:layout_marginRight="11.52dp"
android:layout_width="38.4dp"
android:layout_height="38.4dp"/>
<TextView
android:id="@+id/set_group_manager_owner_name"
android:textSize="17.28sp"
android:textColor="#444444"
android:lineHeight="23sp"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<TextView
android:id="@+id/set_group_manager_manager_label"
android:textSize="13.44sp"
android:lineHeight="19.2dp"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/set_group_manager_add_manager"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:background="@color/white"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height">
<ImageView
android:background="?attr/group_add_icon"
android:scaleType="centerCrop"
android:layout_width="19.2dp"
android:layout_height="19.2dp"
android:layout_marginRight="13.44dp"/>
<TextView
android:text="@string/group_add_manager_label"
android:textSize="15.36sp"
android:textColor="#444444"
android:lineHeight="23sp"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<View
android:background="@drawable/group_list_divider"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_width="match_parent"
android:layout_height="0.6dp"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/set_group_manager_manager_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="@null"
android:paddingBottom="15dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@+id/item_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bottom_sheet_border" />
<TextView
android:id="@+id/cancel_button"
android:text="@string/cancel"
android:textSize="17sp"
android:gravity="center"
android:textColor="?attr/core_primary_color"
android:textStyle="bold"
android:background="@drawable/bottom_sheet_border"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="48dp"/>
</LinearLayout>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/sheet_item"
android:textSize="17sp"
android:gravity="center"
android:background="@null"
android:textColor="?attr/core_primary_color"
android:layout_width="match_parent"
android:layout_height="48dp"/>
</FrameLayout>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<com.tencent.qcloud.tuikit.tuigroup.classicui.view.GroupApplyManagerLayout
android:id="@+id/group_apply_manager_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.tencent.qcloud.tuicore.component.TitleBarLayout
android:id="@+id/group_apply_title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height" />
<ListView
android:id="@+id/group_apply_members"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/group_manager_base"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/status_bar_color"
android:clickable="true"
android:orientation="vertical">
</LinearLayout>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<com.tencent.qcloud.tuikit.tuigroup.classicui.view.GroupInfoLayout
android:id="@+id/group_info_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
@@ -0,0 +1,320 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/core_bg_color"
android:orientation="vertical">
<com.tencent.qcloud.tuicore.component.TitleBarLayout
android:id="@+id/group_info_title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/group_detail_area"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_height"
android:background="#FFFFFF">
<com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView
android:id="@+id/group_icon"
android:layout_width="@dimen/group_profile_face_size"
android:layout_height="@dimen/group_profile_face_size"
android:layout_gravity="center"
android:layout_marginLeft="@dimen/group_profile_face_margin_left"
android:layout_marginTop="@dimen/group_profile_face_margin_top"
android:layout_marginRight="@dimen/group_profile_face_margin_right"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/group_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/group_icon"
android:layout_toEndOf="@id/group_icon"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:textSize="@dimen/group_profile_group_name_size"
tools:text="群聊" />
<TextView
android:id="@+id/group_account_tag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/group_name"
android:layout_alignStart="@id/group_name"
android:layout_marginTop="7.64dp"
android:gravity="center_vertical"
android:text="@string/group_account_tag"
android:textSize="@dimen/group_profile_group_id_size" />
<TextView
android:id="@+id/group_account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/group_name"
android:layout_alignTop="@+id/group_account_tag"
android:layout_toEndOf="@id/group_account_tag"
android:gravity="center_vertical"
android:textIsSelectable="true"
android:textSize="@dimen/group_profile_group_id_size"
tools:text="99618" />
<ImageView
android:id="@+id/group_detail_arrow"
android:layout_width="11.52dp"
android:layout_height="11.52dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="20dp"
android:src="@drawable/arrow_right" />
</RelativeLayout>
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/group_member_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
android:layout_marginTop="10dp"
app:name="@string/group_members" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:orientation="vertical">
<GridView
android:id="@+id/group_members"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="0.6dp"
android:background="@color/white"
android:fadeScrollbars="true"
android:numColumns="5"
android:paddingLeft="@dimen/group_profile_member_grid_padding_left_right"
android:paddingTop="@dimen/group_profile_member_grid_padding_top"
android:scrollbars="none" />
<LinearLayout
android:id="@+id/view_more_group_members"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="20dp"
android:paddingEnd="7.68dp"
android:text="@string/group_view_more_group_members" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/arrow_right" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/group_notice"
android:layout_width="match_parent"
android:layout_height="69dp"
android:background="@color/white"
android:paddingLeft="@dimen/group_profile_face_margin_left"
android:paddingRight="20dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="11.52dp"
android:lineHeight="23.04sp"
android:text="@string/group_notice"
android:textColor="#444444"
android:textSize="15.36sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15.36dp"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:id="@+id/group_notice_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:text="@string/group_notice_empty_tip"
android:lineHeight="17.28sp"
android:singleLine="true"
android:textColor="#888888"
android:textSize="11.52sp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/arrow_right" />
</LinearLayout>
</LinearLayout>
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/group_notice"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
android:layout_marginTop="10dp"
android:visibility="gone"
app:name="@string/group_notice" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/group_manage"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
android:visibility="gone"
app:canNav="true"
app:isTop="true"
app:name="@string/group_manager"
tools:visibility="visible" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/group_type_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
app:isTop="true"
app:name="@string/group_type" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/join_type_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
app:isTop="true"
app:name="@string/join_group_type" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/self_nickname_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
android:layout_marginTop="10dp"
app:name="@string/in_group_nick_name" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/msg_rev_option"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
android:layout_marginTop="10dp"
app:isSwitch="true"
app:name="@string/profile_msgrev_opt" />
<RelativeLayout
android:id="@+id/layout_fold"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white" >
<View
android:id="@+id/fold_top_line"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/line"/>
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/fold_group_chat"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
android:layout_below="@id/fold_top_line"
android:layout_marginLeft="20dp"
app:isSwitch="true"
app:name="@string/fold_this_group_chat" />
<View
android:id="@+id/left_line"
android:layout_width="10dp"
android:layout_height="2px"
android:layout_marginLeft="20dp"
android:layout_centerVertical="true"
android:background="@color/dark_line"/>
<View
android:layout_below="@id/fold_group_chat"
android:id="@+id/fold_bottom_line"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/line"/>
</RelativeLayout>
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/chat_to_top_switch"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
app:isSwitch="true"
app:name="@string/chat_to_top" />
<com.tencent.qcloud.tuicore.component.LineControllerView
android:id="@+id/chat_background"
android:layout_width="match_parent"
android:layout_height="@dimen/group_profile_item_height"
app:canNav="true"
app:name="@string/profile_chat_background"
tools:visibility="visible" />
<TextView
android:id="@+id/group_clear_msg_button"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="#ffffff"
android:gravity="center"
android:textSize="16.32sp"
android:textColor="?attr/core_error_tip_color"
tools:visibility="visible" />
<TextView
android:id="@+id/group_change_owner_button"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="0.6dp"
android:background="#ffffff"
android:gravity="center"
android:text="@string/group_transfer_group_owner"
android:textColor="?attr/core_error_tip_color"
android:textSize="16.32sp"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/group_dissolve_button"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="0.6dp"
android:textSize="16.32sp"
android:background="#ffffff"
android:gravity="center"
android:textColor="?attr/core_error_tip_color"
tools:visibility="visible" />
</LinearLayout>
</ScrollView>
</LinearLayout>
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="58dp"
android:background="@color/white"
android:orientation="horizontal">
<com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView
android:id="@+id/group_manager_face"
android:layout_width="38.4dp"
android:layout_height="38.4dp"
android:layout_gravity="center"
android:layout_marginLeft="15.36dp"
android:layout_marginRight="11.52dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/group_manage_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_vertical"
android:singleLine="true"
android:ellipsize="end"
android:layout_weight="1"
android:lineHeight="23.04sp"
android:textSize="17.28sp" />
<View
android:id="@+id/view_line"
android:layout_width="match_parent"
android:layout_height="0.55dp"
android:background="#D9D9D9" />
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/white"
app:cardUseCompatPadding="true"
app:cardElevation="8dp">
<TextView
android:id="@+id/pop_text"
android:textSize="15sp"
android:gravity="center"
android:textColor="#888888"
android:layout_margin="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.cardview.widget.CardView>
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/page_margin"
android:paddingRight="@dimen/page_margin">
<com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView
android:id="@+id/group_apply_member_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:scaleType="fitCenter"
android:background="?attr/core_default_user_icon" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/group_apply_member_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:textColor="@color/text_color_black" />
<TextView
android:id="@+id/group_apply_reason"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
android:textColor="@color/text_color_gray" />
</LinearLayout>
<Button
android:id="@+id/group_apply_accept"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_marginRight="10dp"
android:background="@color/bg_positive_btn"
android:onClick="startConversation"
android:text="@string/accept"
android:textColor="#fff" />
<Button
android:id="@+id/group_apply_refuse"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_marginRight="10dp"
android:background="@color/bg_negative_btn"
android:onClick="startConversation"
android:text="@string/refuse"
android:textColor="#fb6155" />
</LinearLayout>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView
android:id="@+id/group_member_icon"
android:layout_width="@dimen/group_profile_member_item_width"
android:layout_height="@dimen/group_profile_member_item_width"
android:scaleType="centerCrop"
android:background="?attr/core_default_user_icon" />
<TextView
android:id="@+id/group_member_name"
android:layout_width="@dimen/group_profile_member_item_width"
android:layout_height="wrap_content"
android:layout_marginBottom="9.6dp"
android:layout_marginTop="7.68dp"
android:gravity="center"
android:lines="1"
android:maxEms="3"
android:ellipsize="end"
android:textSize="@dimen/group_profile_member_item_name_size"
android:textColor="@color/group_profile_member_name_text_color" />
</LinearLayout>
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.tencent.qcloud.tuicore.component.TitleBarLayout
android:id="@+id/group_member_title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/page_title_height" />
<!-- 搜索 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/group_all_members"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp" />
<androidx.cardview.widget.CardView
android:id="@+id/select_area"
android:visibility="gone"
tools:visibility="visible"
app:cardElevation="8dp"
app:cardBackgroundColor="@color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/selected_list"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/confirm_button"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginLeft="12dp"
android:background="@drawable/group_confirm_button_bg"
android:paddingLeft="12dp"
android:paddingTop="4dp"
android:paddingRight="12dp"
android:paddingBottom="4dp"
android:text="@string/sure"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="58.48dp"
android:background="@color/white"
android:orientation="horizontal">
<CheckBox
android:id="@+id/group_member_check_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:button="@null"
android:background="@drawable/group_checkbox_selector"
android:layout_gravity="center"
android:gravity="center"
android:clickable="false"
android:focusable="false"
android:visibility="gone" />
<com.tencent.qcloud.tuicore.component.gatherimage.ShadeImageView
android:id="@+id/group_member_icon"
android:layout_width="38.4dp"
android:layout_height="38.4dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="15.36dp"
android:layout_marginRight="11.52dp"
android:scaleType="centerCrop" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/group_member_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:layout_weight="1"
android:lines="1"
android:textColor="#ff111111"
android:textSize="17.28sp" />
<View
android:id="@+id/view_line"
android:layout_width="match_parent"
android:layout_height="0.55dp"
android:background="#D9D9D9" />
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00FFFFFF"
android:paddingBottom="8dp"
android:paddingRight="12dp"
android:clickable="true">
<com.tencent.qcloud.tuicore.component.RoundCornerImageView
android:id="@+id/ivAvatar"
android:layout_width="38.4dp"
android:layout_height="38.4dp"
app:corner_radius="3.2dp"
android:scaleType="centerCrop"
android:clickable="false"
android:focusable="false" />
</LinearLayout>
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/status_bar_color"
android:orientation="vertical">
<com.tencent.qcloud.tuikit.tuigroup.classicui.view.GroupMemberLayout
android:id="@+id/group_member_grid_layout"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/limit_tips"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:paddingBottom="36dp"
android:paddingTop="12dp"
android:background="#F6F6F6"
android:textColor="#999999"
android:textSize="12sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:visibility="visible"
tools:text="123"
android:visibility="gone"/>
</LinearLayout>

Some files were not shown because too many files have changed in this diff Show More