初始代码

This commit is contained in:
2025-09-03 18:52:07 +08:00
parent 2d21a47e87
commit 6e3e30efa5
3249 changed files with 239147 additions and 0 deletions
@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<!-- **************** Classic UI Activity Start **************** -->
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.AddMoreActivity"
android:screenOrientation="portrait" />
<activity
android:name=".classicui.pages.AddMoreDetailActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.NewFriendActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.BlackListActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupListActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.StartC2CChatActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.StartGroupChatActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.ForwardSelectGroupActivity"
android:launchMode="singleInstance"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.StartGroupMemberSelectActivity"
android:launchMode="singleInstance"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.CreateGroupActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupTypeSelectActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.SetGroupManagerActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupMemberActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.ManageGroupActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupApplyManagerActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupApplyDetailActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.classicui.pages.NewFriendApplicationDetailActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<!-- **************** Classic UI Activity End **************** -->
<!-- **************** Minimalist UI Activity Start **************** -->
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.NewFriendApplicationMinimalistActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.NewFriendApplicationDetailMinimalistActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.BlackListMinimalistActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupListMinimalistActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.StartC2CChatMinimalistActivity"
android:screenOrientation="portrait"
android:theme="@style/ContactTransparentPopActivityStyle" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.StartGroupChatMinimalistActivity"
android:screenOrientation="portrait"
android:theme="@style/ContactTransparentPopActivityStyle"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.StartGroupMemberSelectMinimalistActivity"
android:launchMode="singleInstance"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.CreateGroupMinimalistActivity"
android:screenOrientation="portrait"
android:theme="@style/ContactTransparentPopActivityStyle" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupTypeSelectMinimalistActivity"
android:screenOrientation="portrait"
android:theme="@style/ContactTransparentPopActivityStyle" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupMemberMinimalistActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.ManageGroupMinimalistActivity"
android:screenOrientation="portrait" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupApplyManagerMinimalistActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<activity
android:name="com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupApplyDetailMinimalistActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
<!-- **************** Minimalist UI Activity End **************** -->
</application>
</manifest>
@@ -0,0 +1,60 @@
package com.tencent.qcloud.tuikit.tuicontact;
import com.tencent.imsdk.v2.V2TIMGroupAtInfo;
public class TUIContactConstants {
public static final String FORWARD_SELECT_CONVERSATION_KEY = "forward_select_conversation_key";
public static final int FORWARD_SELECT_MEMBERS_CODE = 102;
public static final int FORWARD_CREATE_GROUP_CODE = 103;
public static final String FORWARD_CREATE_NEW_CHAT = "forward_create_new_chat";
public static final String IM_PRODUCT_DOC_URL = "https://cloud.tencent.com/product/im";
public static final String IM_PRODUCT_DOC_URL_EN = "https://www.tencentcloud.com/products/im?lang=en&pg=";
/**
* 1: Just a text message with a link
* 2: The video calling version supported by iOS is no longer compatible
* 3: unreleased version
* 4: Android/iOS/Web interoperable version for video call
*/
public static final int JSON_VERSION_4 = 4;
public static int version = JSON_VERSION_4;
public static final String GROUP_PROFILE_BEAN = "groupProfileBean";
public static final String GROUP_FACE_URL = "https://im.sdk.qcloud.com/download/tuikit-resource/group-avatar/group_avatar_%s.png";
public static final int GROUP_FACE_COUNT = 24;
public static class Selection {
public static final String SELECT_ALL = V2TIMGroupAtInfo.AT_ALL_TAG;
public static final String CONTENT = "content";
public static final String TYPE = "type";
public static final String GROUP_TYPE = "groupType";
public static final String TITLE = "title";
public static final String LIST = "list";
public static final String LIMIT = "limit";
public static final String USER_ID_SELECT = "user_id_select";
public static final String USER_NAMECARD_SELECT = "user_namecard_select";
}
public static class GroupType {
public static final String TYPE = "type";
public static final String GROUP = "isGroup";
public static final int PRIVATE = 0;
public static final int PUBLIC = 1;
public static final int CHAT_ROOM = 2;
public static final int COMMUNITY = 3;
public static final String TYPE_PUBLIC = "Public";
public static final String TYPE_MEETING = "Meeting";
public static final String TYPE_WORK = "Work";
public static final String TYPE_COMMUNITY = "Community";
}
public static final class Group {
public static final String GROUP_ID = "group_id";
public static final String GROUP_INFO = "groupInfo";
public static final String MEMBER_APPLY = "apply";
}
}
@@ -0,0 +1,429 @@
package com.tencent.qcloud.tuikit.tuicontact;
import android.content.Context;
import com.google.auto.service.AutoService;
import com.tencent.imsdk.v2.V2TIMFriendApplication;
import com.tencent.imsdk.v2.V2TIMFriendInfo;
import com.tencent.imsdk.v2.V2TIMFriendshipListener;
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.imsdk.v2.V2TIMSDKListener;
import com.tencent.imsdk.v2.V2TIMUserStatus;
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.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuicore.annotations.TUIInitializerDependency;
import com.tencent.qcloud.tuicore.annotations.TUIInitializerID;
import com.tencent.qcloud.tuicore.interfaces.ITUINotification;
import com.tencent.qcloud.tuicore.interfaces.ITUIService;
import com.tencent.qcloud.tuicore.interfaces.TUIInitializer;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.ContactEventListener;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.GroupEventListener;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
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;
@AutoService(TUIInitializer.class)
@TUIInitializerDependency("TIMCommon")
@TUIInitializerID("TUIContact")
public class TUIContactService implements TUIInitializer, ITUIService, ITUINotification {
public static final String TAG = TUIContactService.class.getSimpleName();
private static TUIContactService instance;
public static TUIContactService getInstance() {
return instance;
}
private final List<WeakReference<ContactEventListener>> contactEventListenerList = new ArrayList<>();
private final List<WeakReference<GroupEventListener>> groupEventListenerList = new ArrayList<>();
@Override
public void init(Context context) {
instance = this;
initTheme();
initService();
initEvent();
initIMListener();
}
@Override
public Object onCall(String method, Map<String, Object> param) {
return null;
}
private void initService() {
TUICore.registerService(TUIConstants.TUIContact.SERVICE_NAME, this);
}
private void initEvent() {
TUICore.registerEvent(TUIConstants.TUIContact.EVENT_FRIEND_INFO_CHANGED, TUIConstants.TUIContact.EVENT_SUB_KEY_FRIEND_REMARK_CHANGED, this);
}
@Override
public void onNotifyEvent(String key, String subKey, Map<String, Object> param) {
if (key.equals(TUIConstants.TUIContact.EVENT_FRIEND_INFO_CHANGED)) {
if (subKey.equals(TUIConstants.TUIContact.EVENT_SUB_KEY_FRIEND_REMARK_CHANGED)) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
if (param == null || param.isEmpty()) {
return;
}
String id = (String) param.get(TUIConstants.TUIContact.FRIEND_ID);
String remark = (String) param.get(TUIConstants.TUIContact.FRIEND_REMARK);
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendRemarkChanged(id, remark);
}
}
}
}
private void initIMListener() {
V2TIMManager.getFriendshipManager().addFriendListener(new V2TIMFriendshipListener() {
@Override
public void onFriendApplicationListAdded(List<V2TIMFriendApplication> applicationList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
List<FriendApplicationBean> friendApplicationBeanList = new ArrayList<>();
for (V2TIMFriendApplication v2TIMFriendApplication : applicationList) {
FriendApplicationBean friendApplicationBean = new FriendApplicationBean();
friendApplicationBean.convertFromTimFriendApplication(v2TIMFriendApplication);
friendApplicationBeanList.add(friendApplicationBean);
}
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendApplicationListAdded(friendApplicationBeanList);
}
}
@Override
public void onFriendApplicationListDeleted(List<String> userIDList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendApplicationListDeleted(userIDList);
}
}
@Override
public void onFriendApplicationListRead() {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendApplicationListRead();
}
}
@Override
public void onFriendListAdded(List<V2TIMFriendInfo> users) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMFriendInfo v2TIMFriendInfo : users) {
ContactItemBean contactItemBean = new ContactItemBean();
contactItemBean.setFriend(true);
contactItemBean.covertTIMFriend(v2TIMFriendInfo);
contactItemBeanList.add(contactItemBean);
}
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendListAdded(contactItemBeanList);
}
}
@Override
public void onFriendListDeleted(List<String> userList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendListDeleted(userList);
}
HashMap<String, Object> bundle = new HashMap<>();
bundle.put(TUIConstants.TUIContact.FRIEND_ID_LIST, new ArrayList<>(userList));
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_FRIEND_STATE_CHANGED, TUIConstants.TUIContact.EVENT_SUB_KEY_FRIEND_DELETE, bundle);
}
@Override
public void onBlackListAdd(List<V2TIMFriendInfo> infoList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMFriendInfo v2TIMFriendInfo : infoList) {
ContactItemBean contactItemBean = new ContactItemBean();
contactItemBean.covertTIMFriend(v2TIMFriendInfo);
contactItemBeanList.add(contactItemBean);
}
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onBlackListAdd(contactItemBeanList);
}
}
@Override
public void onBlackListDeleted(List<String> userList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onBlackListDeleted(userList);
}
}
@Override
public void onFriendInfoChanged(List<V2TIMFriendInfo> infoList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMFriendInfo v2TIMFriendInfo : infoList) {
ContactItemBean contactItemBean = new ContactItemBean();
contactItemBean.setFriend(true);
contactItemBean.covertTIMFriend(v2TIMFriendInfo);
contactItemBeanList.add(contactItemBean);
}
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onFriendInfoChanged(contactItemBeanList);
}
}
});
V2TIMSDKListener v2TIMSDKListener = new V2TIMSDKListener() {
@Override
public void onUserStatusChanged(List<V2TIMUserStatus> userStatusList) {
List<ContactEventListener> contactEventListenerList = getInstance().getContactEventListenerList();
for (ContactEventListener contactEventListener : contactEventListenerList) {
contactEventListener.onUserStatusChanged(userStatusList);
}
}
};
V2TIMManager.getInstance().addIMSDKListener(v2TIMSDKListener);
V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {
@Override
public void onAllGroupMembersMuted(String groupID, boolean isMute) {
super.onAllGroupMembersMuted(groupID, isMute);
}
@Override
public void onMemberEnter(String groupID, List<V2TIMGroupMemberInfo> memberList) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.GROUP_ID, groupID);
ArrayList<String> userIds = new ArrayList<>();
for (V2TIMGroupMemberInfo memberInfo : memberList) {
userIds.add(memberInfo.getUserID());
}
param.put(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST, userIds);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_JOIN_GROUP, param);
List<GroupEventListener> groupEventListeners = getGroupEventListenerList();
for (GroupEventListener groupEventListener : groupEventListeners) {
groupEventListener.onGroupMemberCountChanged(groupID);
}
}
@Override
public void onMemberLeave(String groupID, V2TIMGroupMemberInfo member) {
super.onMemberLeave(groupID, member);
List<GroupEventListener> groupEventListeners = getGroupEventListenerList();
for (GroupEventListener groupEventListener : groupEventListeners) {
groupEventListener.onGroupMemberCountChanged(groupID);
}
}
@Override
public void onMemberInvited(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.GROUP_ID, groupID);
ArrayList<String> userIds = new ArrayList<>();
for (V2TIMGroupMemberInfo memberInfo : memberList) {
userIds.add(memberInfo.getUserID());
}
param.put(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST, userIds);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_INVITED_GROUP, param);
List<GroupEventListener> groupEventListeners = getGroupEventListenerList();
for (GroupEventListener groupEventListener : groupEventListeners) {
groupEventListener.onGroupMemberCountChanged(groupID);
}
}
@Override
public void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.GROUP_ID, groupID);
ArrayList<String> userIds = new ArrayList<>();
for (V2TIMGroupMemberInfo memberInfo : memberList) {
userIds.add(memberInfo.getUserID());
}
param.put(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST, userIds);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_MEMBER_KICKED_GROUP, param);
if (userIds.contains(TUILogin.getLoginUser())) {
ContactUtils.toastGroupEvent(ContactUtils.GROUP_EVENT_TIP_KICKED, groupID);
}
List<GroupEventListener> groupEventListeners = getGroupEventListenerList();
for (GroupEventListener groupEventListener : groupEventListeners) {
groupEventListener.onGroupMemberCountChanged(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.TUIContact.GROUP_ID, groupID);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_GROUP_DISMISS, param);
ContactUtils.toastGroupEvent(ContactUtils.GROUP_EVENT_TIP_DISBANDED, groupID);
}
@Override
public void onGroupRecycled(String groupID, V2TIMGroupMemberInfo opUser) {
HashMap<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.GROUP_ID, groupID);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.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.TUIContact.GROUP_ID, groupID);
for (V2TIMGroupChangeInfo changeInfo : changeInfos) {
if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_NAME) {
param.put(TUIConstants.TUIContact.GROUP_NAME, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_FACE_URL) {
param.put(TUIConstants.TUIContact.GROUP_FACE_URL, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER) {
param.put(TUIConstants.TUIContact.GROUP_OWNER, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_NOTIFICATION) {
param.put(TUIConstants.TUIContact.GROUP_NOTIFICATION, changeInfo.getValue());
} else if (changeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_INTRODUCTION) {
param.put(TUIConstants.TUIContact.GROUP_INTRODUCTION, changeInfo.getValue());
} else {
return;
}
}
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_GROUP_INFO_CHANGED, param);
}
@Override
public void onReceiveJoinApplication(String groupID, V2TIMGroupMemberInfo member, String opReason) {
TUICore.notifyEvent(TUIConstants.TUIContact.Event.GroupApplication.KEY_GROUP_APPLICATION,
TUIConstants.TUIContact.Event.GroupApplication.SUB_KEY_GROUP_APPLICATION_NUM_CHANGED, null);
}
@Override
public void onApplicationProcessed(String groupID, V2TIMGroupMemberInfo opUser, boolean isAgreeJoin, String opReason) {
TUICore.notifyEvent(TUIConstants.TUIContact.Event.GroupApplication.KEY_GROUP_APPLICATION,
TUIConstants.TUIContact.Event.GroupApplication.SUB_KEY_GROUP_APPLICATION_NUM_CHANGED, null);
}
@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.TUIContact.GROUP_ID, groupID);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.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 List<ContactEventListener> getContactEventListenerList() {
List<ContactEventListener> contactEventListeners = new ArrayList<>();
Iterator<WeakReference<ContactEventListener>> iterator = contactEventListenerList.iterator();
while (iterator.hasNext()) {
WeakReference<ContactEventListener> weakReference = iterator.next();
if (weakReference.get() == null) {
iterator.remove();
continue;
}
contactEventListeners.add(weakReference.get());
}
return contactEventListeners;
}
public void addContactEventListener(ContactEventListener contactEventListener) {
WeakReference<ContactEventListener> reference = new WeakReference<>(contactEventListener);
Iterator<WeakReference<ContactEventListener>> iterator = contactEventListenerList.iterator();
while (iterator.hasNext()) {
WeakReference<ContactEventListener> weakReference = iterator.next();
if (weakReference.get() == null) {
iterator.remove();
continue;
}
if (weakReference.get() == contactEventListener) {
return;
}
}
contactEventListenerList.add(reference);
}
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;
}
private void initTheme() {
TUIThemeManager.addLightTheme(R.style.TUIContactLightTheme);
TUIThemeManager.addLivelyTheme(R.style.TUIContactLivelyTheme);
TUIThemeManager.addSeriousTheme(R.style.TUIContactSeriousTheme);
}
public static Context getAppContext() {
return ServiceInitializer.getAppContext();
}
}
@@ -0,0 +1,92 @@
package com.tencent.qcloud.tuikit.tuicontact.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;
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;
}
/**
* Get the chat type, C2C is a single chat, Group is a group chat
*
* @return
*/
public int getType() {
return type;
}
/**
* 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 unique ID
*
* @return
*/
public String getId() {
return id;
}
/**
* Set chat unique ID
*
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* Get the group type
*/
public String getGroupType() {
return groupType;
}
/**
* Set the group type
*/
public void setGroupType(String groupType) {
this.groupType = groupType;
}
}
@@ -0,0 +1,271 @@
package com.tencent.qcloud.tuikit.tuicontact.bean;
import android.text.TextUtils;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMFriendInfo;
import com.tencent.imsdk.v2.V2TIMGroupInfo;
import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo;
import com.tencent.imsdk.v2.V2TIMUserStatus;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionEventListener;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.bean.BaseIndexPinyinBean;
public class ContactItemBean extends BaseIndexPinyinBean implements Comparable<ContactItemBean> {
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;
public static final int ITEM_BEAN_TYPE_CONTACT = 1;
public static final int ITEM_BEAN_TYPE_CONTROLLER = 2;
public static final String INDEX_STRING_TOP = "";
private String id;
private boolean isTop;
private boolean isSelected;
private boolean isBlackList;
private String remark;
private String nickName;
private String nameCard;
private String avatarUrl;
private String signature;
private boolean isGroup;
private String groupType;
private boolean isFriend = false;
private boolean isEnable = true;
private int statusType = V2TIMUserStatus.V2TIM_USER_STATUS_UNKNOWN;
private int itemBeanType = ITEM_BEAN_TYPE_CONTACT;
private int avatarResID;
private int weight;
private TUIExtensionEventListener extensionListener;
private int unreadCount;
public ContactItemBean() {}
public ContactItemBean(String id) {
this.id = id;
}
public String getId() {
return id;
}
public ContactItemBean setId(String id) {
this.id = id;
return this;
}
public ContactItemBean setItemBeanType(int itemBeanType) {
this.itemBeanType = itemBeanType;
return this;
}
public int getItemBeanType() {
return itemBeanType;
}
public boolean isTop() {
return isTop;
}
public ContactItemBean setTop(boolean top) {
isTop = top;
return this;
}
@Override
public String getTarget() {
return getDisplayName();
}
@Override
public boolean isNeedToPinyin() {
return !isTop;
}
@Override
public boolean isShowSuspension() {
return !isTop;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
public boolean isEnable() {
return isEnable;
}
public void setEnable(boolean enable) {
isEnable = enable;
}
public boolean isBlackList() {
return isBlackList;
}
public void setBlackList(boolean blacklist) {
isBlackList = blacklist;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public ContactItemBean covertTIMFriend(V2TIMFriendInfo friendInfo) {
if (friendInfo == null) {
return this;
}
setId(friendInfo.getUserID());
setNickName(friendInfo.getUserProfile().getNickName());
setAvatarUrl(friendInfo.getUserProfile().getFaceUrl());
setSignature(friendInfo.getUserProfile().getSelfSignature());
setRemark(friendInfo.getFriendRemark());
return this;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public void setNameCard(String nameCard) {
this.nameCard = nameCard;
}
public String getNameCard() {
return nameCard;
}
public boolean isGroup() {
return isGroup;
}
public void setGroup(boolean group) {
isGroup = group;
}
public String getGroupType() {
return groupType;
}
public void setGroupType(String groupType) {
this.groupType = groupType;
}
public boolean isFriend() {
return isFriend;
}
public void setFriend(boolean friend) {
isFriend = friend;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
public int getStatusType() {
return statusType;
}
public void setStatusType(int statusType) {
this.statusType = statusType;
}
public int getAvatarResID() {
return avatarResID;
}
public void setAvatarResID(int avatarResID) {
this.avatarResID = avatarResID;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public TUIExtensionEventListener getExtensionListener() {
return extensionListener;
}
public void setExtensionListener(TUIExtensionEventListener extensionListener) {
this.extensionListener = extensionListener;
}
public ContactItemBean covertTIMGroupBaseInfo(V2TIMGroupInfo group) {
if (group == null) {
return this;
}
setId(group.getGroupID());
setRemark(group.getGroupName());
setAvatarUrl(group.getFaceUrl());
setGroup(true);
setGroupType(group.getGroupType());
return this;
}
public ContactItemBean covertTIMGroupMemberFullInfo(V2TIMGroupMemberFullInfo member) {
if (member == null) {
return this;
}
setId(member.getUserID());
setNameCard(member.getNameCard());
setRemark(member.getFriendRemark());
setNickName(member.getNickName());
setAvatarUrl(member.getFaceUrl());
setGroup(false);
return this;
}
public String getDisplayName() {
if (!TextUtils.isEmpty(nameCard)) {
return nameCard;
} else if (!TextUtils.isEmpty(remark)) {
return remark;
} else if (!TextUtils.isEmpty(nickName)) {
return nickName;
} else {
return id;
}
}
@Override
public int compareTo(ContactItemBean contactItemBean) {
return contactItemBean.getWeight() - this.weight;
}
public void setUnreadCount(int unreadCount) {
this.unreadCount = unreadCount;
}
public int getUnreadCount() {
return unreadCount;
}
}
@@ -0,0 +1,129 @@
package com.tencent.qcloud.tuikit.tuicontact.bean;
import com.tencent.imsdk.BaseConstants;
import com.tencent.imsdk.v2.V2TIMFriendApplication;
import java.io.Serializable;
public class FriendApplicationBean implements Serializable {
/**
* ## Friend request received by me
*/
public static final int FRIEND_APPLICATION_COME_IN = V2TIMFriendApplication.V2TIM_FRIEND_APPLICATION_COME_IN;
/**
* ## Friend request sent by me
*/
public static final int FRIEND_APPLICATION_SEND_OUT = V2TIMFriendApplication.V2TIM_FRIEND_APPLICATION_SEND_OUT;
/**
* ## Friend requests received and sent by me. Valid only during pulling
*/
public static final int FRIEND_APPLICATION_BOTH = V2TIMFriendApplication.V2TIM_FRIEND_APPLICATION_BOTH;
/**
* ## Accept the friend request (build a one-way friend relationship)
*/
public static final int FRIEND_ACCEPT_AGREE = V2TIMFriendApplication.V2TIM_FRIEND_ACCEPT_AGREE;
/**
* ## Accept the friend request and add the peer party as a friend (build a two-way friend relationship)
*/
public static final int FRIEND_ACCEPT_AGREE_AND_ADD = V2TIMFriendApplication.V2TIM_FRIEND_ACCEPT_AGREE_AND_ADD;
public static final int ERR_SUCC = BaseConstants.ERR_SUCC;
public static final int ERR_SVR_FRIENDSHIP_INVALID_PARAMETERS = BaseConstants.ERR_SVR_FRIENDSHIP_INVALID_PARAMETERS;
public static final int ERR_SVR_FRIENDSHIP_COUNT_LIMIT = BaseConstants.ERR_SVR_FRIENDSHIP_COUNT_LIMIT;
public static final int ERR_SVR_FRIENDSHIP_ALREADY_FRIENDS = BaseConstants.ERR_SVR_FRIENDSHIP_ALREADY_FRIENDS;
public static final int ERR_SVR_FRIENDSHIP_PEER_FRIEND_LIMIT = BaseConstants.ERR_SVR_FRIENDSHIP_PEER_FRIEND_LIMIT;
public static final int ERR_SVR_FRIENDSHIP_IN_SELF_BLACKLIST = BaseConstants.ERR_SVR_FRIENDSHIP_IN_SELF_BLACKLIST;
public static final int ERR_SVR_FRIENDSHIP_ALLOW_TYPE_DENY_ANY = BaseConstants.ERR_SVR_FRIENDSHIP_ALLOW_TYPE_DENY_ANY;
public static final int ERR_SVR_FRIENDSHIP_IN_PEER_BLACKLIST = BaseConstants.ERR_SVR_FRIENDSHIP_IN_PEER_BLACKLIST;
public static final int ERR_SVR_FRIENDSHIP_ALLOW_TYPE_NEED_CONFIRM = BaseConstants.ERR_SVR_FRIENDSHIP_ALLOW_TYPE_NEED_CONFIRM;
private String userId;
private String nickName;
private String addWording;
private int addType;
private String faceUrl;
private V2TIMFriendApplication friendApplication;
private boolean isAccept = false;
public FriendApplicationBean() {}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getAddWording() {
return addWording;
}
public void setAddWording(String addWording) {
this.addWording = addWording;
}
public int getAddType() {
return addType;
}
public void setAddType(int addType) {
this.addType = addType;
}
public void setAccept(boolean accept) {
isAccept = accept;
}
public boolean isAccept() {
return isAccept;
}
public void setFriendApplication(V2TIMFriendApplication friendApplication) {
this.friendApplication = friendApplication;
}
public void setFaceUrl(String faceUrl) {
this.faceUrl = faceUrl;
}
public String getFaceUrl() {
return faceUrl;
}
public V2TIMFriendApplication getFriendApplication() {
return friendApplication;
}
public String getDisplayName() {
if (nickName != null && !nickName.isEmpty()) {
return nickName;
}
return userId;
}
public FriendApplicationBean convertFromTimFriendApplication(V2TIMFriendApplication v2TIMFriendApplication) {
if (v2TIMFriendApplication == null) {
return this;
}
setAddType(v2TIMFriendApplication.getType());
setNickName(v2TIMFriendApplication.getNickname());
setAddWording(v2TIMFriendApplication.getAddWording());
setUserId(v2TIMFriendApplication.getUserID());
setFriendApplication(v2TIMFriendApplication);
setFaceUrl(v2TIMFriendApplication.getFaceUrl());
return this;
}
}
@@ -0,0 +1,85 @@
package com.tencent.qcloud.tuikit.tuicontact.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 String getFromUserFaceUrl() {
if (timGroupApplication != null) {
return timGroupApplication.getFromUserFaceUrl();
}
return null;
}
public String getFromUserID() {
if (timGroupApplication != null) {
return timGroupApplication.getFromUser();
}
return null;
}
public String getAddWording() {
if (timGroupApplication != null) {
return timGroupApplication.getRequestMsg();
}
return null;
}
public String getGroupID() {
if (timGroupApplication != null) {
return timGroupApplication.getGroupID();
}
return null;
}
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,239 @@
package com.tencent.qcloud.tuikit.tuicontact.bean;
import android.text.TextUtils;
import com.tencent.imsdk.BaseConstants;
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 int ERR_SVR_GROUP_ALLREADY_MEMBER = BaseConstants.ERR_SVR_GROUP_ALLREADY_MEMBER;
public static final int ERR_SVR_GROUP_PERMISSION_DENY = BaseConstants.ERR_SVR_GROUP_PERMISSION_DENY;
public static final int ERR_SVR_GROUP_NOT_FOUND = BaseConstants.ERR_SVR_GROUP_NOT_FOUND;
public static final int ERR_SVR_GROUP_FULL_MEMBER_COUNT = BaseConstants.ERR_SVR_GROUP_FULL_MEMBER_COUNT;
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 String GROUP_TYPE_ROOM = "Room";
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;
public static final int GROUP_MEMBER_ROLE_MEMBER = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_MEMBER;
public static final int GROUP_MEMBER_ROLE_OWNER = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_OWNER;
public static final int GROUP_MEMBER_ROLE_ADMIN = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN;
private String groupType;
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 boolean communitySupportTopic = false;
private List<Object> iconUrlList = new ArrayList<>();
private int selfRole;
private int groupMemberCount = 0;
private long mNextSeq = 0;
private boolean isAllMuted;
public GroupInfo() {
setType(V2TIMConversation.V2TIM_GROUP);
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
/**
*
* 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;
}
/**
* 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 boolean isCommunitySupportTopic() {
return communitySupportTopic;
}
public void setCommunitySupportTopic(boolean communitySupportTopic) {
this.communitySupportTopic = communitySupportTopic;
}
public void setIconUrlList(List<Object> iconUrlList) {
this.iconUrlList = iconUrlList;
}
public boolean isOwner() {
return selfRole == V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_OWNER;
}
public void setNextSeq(long nextSeq) {
mNextSeq = nextSeq;
}
public void setInviteType(Integer value) {
}
public boolean isAllMuted() {
return false;
}
public boolean isCanManagerGroup() {
return false;
}
public CharSequence getNotice() {
return null;
}
public long getNextSeq() {
return mNextSeq;
}
public void setTopChat(boolean isSetTop) {
}
public void setFolded(boolean b) {
}
public int getInviteType() {
return 1;
}
public int getSelfRole() {
return selfRole;
}
public void setSelfRole(int selfRole) {
this.selfRole = selfRole;
}
public void setGroupMemberCount(int groupMemberCount) {
this.groupMemberCount = groupMemberCount;
}
public int getGroupMemberCount() {
return groupMemberCount;
}
public void covertTIMGroupDetailInfo(V2TIMGroupInfoResult result) {
setChatName(result.getGroupInfo().getGroupName());
setGroupName(result.getGroupInfo().getGroupName());
setId(result.getGroupInfo().getGroupID());
setNotice(result.getGroupInfo().getNotification());
setGroupMemberCount(result.getGroupInfo().getMemberCount());
setGroupType(result.getGroupInfo().getGroupType());
owner = result.getGroupInfo().getOwner();
setJoinType(result.getGroupInfo().getGroupAddOpt());
setInviteType(result.getGroupInfo().getGroupApproveOpt());
setMessageReceiveOption(result.getGroupInfo().getRecvOpt() == V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE ? true : false);
setFaceUrl(result.getGroupInfo().getFaceUrl());
selfRole = result.getGroupInfo().getRole();
isAllMuted = result.getGroupInfo().isAllMuted();
}
}
@@ -0,0 +1,49 @@
package com.tencent.qcloud.tuikit.tuicontact.bean;
import com.tencent.imsdk.v2.V2TIMGroupMemberFullInfo;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import java.io.Serializable;
public class GroupMemberInfo extends UserBean implements Serializable {
private long muteUtil = 0;
private int role = 0;
private boolean isSelected = false;
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
this.isSelected = selected;
}
public void setMuteUtil(long muteUtil) {
this.muteUtil = muteUtil;
}
public long getMuteUtil() {
return muteUtil;
}
public void setRole(int role) {
this.role = role;
}
public int getRole() {
return role;
}
public GroupMemberInfo covertTIMGroupMemberInfo(V2TIMGroupMemberFullInfo info) {
if (info instanceof V2TIMGroupMemberFullInfo) {
V2TIMGroupMemberFullInfo v2TIMGroupMemberFullInfo = info;
setRole(v2TIMGroupMemberFullInfo.getRole());
}
setUserId(info.getUserID());
setNameCard(info.getNameCard());
setFaceUrl(info.getFaceUrl());
setNickName(info.getNickName());
return this;
}
}
@@ -0,0 +1,12 @@
package com.tencent.qcloud.tuikit.tuicontact.bean;
public class MessageCustom {
public static final String BUSINESS_ID_GROUP_CREATE = "group_create";
public int version = 0;
public String businessID;
public String opUser;
public String content;
public String data;
public int cmd = -1;
}
@@ -0,0 +1,97 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui;
import static com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants.GROUP_PROFILE_BEAN;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import androidx.activity.result.ActivityResultCaller;
import com.google.auto.service.AutoService;
import com.tencent.qcloud.tuicore.ServiceInitializer;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.annotations.TUIInitializerDependency;
import com.tencent.qcloud.tuicore.annotations.TUIInitializerID;
import com.tencent.qcloud.tuicore.interfaces.ITUIExtension;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionEventListener;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionInfo;
import com.tencent.qcloud.tuicore.interfaces.TUIInitializer;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.ManageGroupActivity;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@AutoService(TUIInitializer.class)
@TUIInitializerID("TUIContactClassicUIExtensionObserver")
@TUIInitializerDependency("TUIContact")
public class ClassicUIExtensionObserver implements TUIInitializer, ITUIExtension {
@Override
public void init(Context context) {
TUICore.registerExtension(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.EXTENSION_ID, this);
TUICore.registerExtension(TUIConstants.TUIChat.Extension.GroupProfileMemberListExtension.EXTENSION_ID, this);
TUICore.registerExtension(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.EXTENSION_ID, this);
}
@Override
public List<TUIExtensionInfo> onGetExtension(String extensionID, Map<String, Object> param) {
if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.EXTENSION_ID)) {
GroupProfileBean groupProfileBean =
(GroupProfileBean) param.get(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.GROUP_PROFILE_BEAN);
int viewType = (int) param.get(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.VIEW_TYPE);
if (viewType != TUIConstants.TUIChat.VIEW_TYPE_MINIMALIST && groupProfileBean.canManage()) {
TUIExtensionInfo extensionInfo = new TUIExtensionInfo();
extensionInfo.setText(getAppContext().getString(R.string.group_manager));
extensionInfo.setExtensionListener(new TUIExtensionEventListener() {
@Override
public void onClicked(Map<String, Object> param) {
Intent intent = new Intent(getAppContext(), ManageGroupActivity.class);
intent.putExtra(GROUP_PROFILE_BEAN, groupProfileBean);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getAppContext().startActivity(intent);
}
});
return Collections.singletonList(extensionInfo);
}
} else if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.EXTENSION_ID)) {
GroupProfileBean groupProfileBean = (GroupProfileBean) param.get(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.GROUP_PROFILE_BEAN);
ActivityResultCaller caller = (ActivityResultCaller) param.get(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.CALLER);
int viewType = (int) param.get(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.VIEW_TYPE);
if (viewType != TUIConstants.TUIChat.VIEW_TYPE_MINIMALIST && groupProfileBean.isOwner()) {
TUIExtensionInfo extensionInfo = new TUIExtensionInfo();
extensionInfo.setText(getAppContext().getString(R.string.group_transfer_group_owner));
extensionInfo.setExtensionListener(new TUIExtensionEventListener() {
@Override
public void onClicked(Map<String, Object> param) {
GroupMemberGridProxy proxy = new GroupMemberGridProxy();
proxy.transferGroupOwner(caller, groupProfileBean);
}
});
return Collections.singletonList(extensionInfo);
}
}
return null;
}
@Override
public boolean onRaiseExtension(String extensionID, View parentView, Map<String, Object> param) {
if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.GroupProfileMemberListExtension.EXTENSION_ID)) {
int viewType = (int) param.get(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.VIEW_TYPE);
if (viewType == TUIConstants.TUIChat.VIEW_TYPE_MINIMALIST) {
return false;
}
GroupProfileBean groupProfileBean = (GroupProfileBean) param.get(TUIConstants.TUIChat.Extension.GroupProfileMemberListExtension.GROUP_PROFILE_BEAN);
GroupMemberGridProxy proxy = new GroupMemberGridProxy();
proxy.raiseExtension(parentView, groupProfileBean);
}
return true;
}
public static Context getAppContext() {
return ServiceInitializer.getAppContext();
}
}
@@ -0,0 +1,161 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultCaller;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupMemberActivity;
import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.StartGroupMemberSelectActivity;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.GroupMemberGridAdapter;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.GroupMemberListener;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupMemberPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberGridProxy {
private static final String TAG = "GroupMemberGridProxy";
private static final int COLUMN_NUM = 5;
private final GroupMemberPresenter groupMemberPresenter = new GroupMemberPresenter();
public void raiseExtension(View parentView, GroupProfileBean groupProfileBean) {
RecyclerView recyclerView = new RecyclerView(parentView.getContext());
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
recyclerView.setLayoutParams(layoutParams);
GridLayoutManager layoutManager = new GridLayoutManager(parentView.getContext(), COLUMN_NUM);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setBackgroundResource(com.tencent.qcloud.tuikit.timcommon.R.color.white);
recyclerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
groupMemberPresenter.registerListener();
}
@Override
public void onViewDetachedFromWindow(View v) {
groupMemberPresenter.unregisterListener();
}
});
GroupMemberGridAdapter adapter = new GroupMemberGridAdapter();
adapter.setGroupProfileBean(groupProfileBean);
recyclerView.setAdapter(adapter);
((ViewGroup) parentView).addView(recyclerView);
groupMemberPresenter.setGroupID(groupProfileBean.getGroupID());
groupMemberPresenter.setGroupMemberListener(new GroupMemberListener() {
@Override
public void onGroupMemberLoaded(List<GroupMemberInfo> groupMemberBeanList) {
if (!groupMemberBeanList.isEmpty()) {
parentView.setVisibility(View.VISIBLE);
}
adapter.setGroupMembers(groupMemberBeanList);
}
});
adapter.setGroupMemberGridListener(groupMemberBean -> {
FragmentActivity activity = (FragmentActivity) parentView.getContext();
if (groupMemberBean == adapter.addItem) {
addGroupMember(activity, groupProfileBean);
} else if (groupMemberBean == adapter.removeItem) {
removeGroupMember(activity, groupProfileBean);
} else {
openDetails(groupMemberBean);
}
});
groupMemberPresenter.loadGroupMemberList();
}
private void addGroupMember(FragmentActivity activity, GroupProfileBean groupProfileBean) {
groupMemberPresenter.getFriendListInGroup(groupProfileBean.getGroupID(), new TUIValueCallback<List<UserBean>>() {
@Override
public void onSuccess(List<UserBean> userBeans) {
addGroupMember(activity, groupProfileBean.getGroupID(), userBeans);
}
@Override
public void onError(int errorCode, String errorMessage) {
TUIContactLog.e(TAG, "add group member error, errorCode: " + errorCode + ", errorMessage: " + errorMessage);
addGroupMember(activity, groupProfileBean.getGroupID(), null);
}
});
}
private void addGroupMember(ActivityResultCaller caller, String groupID, List<UserBean> friendsInGroup) {
Bundle param = new Bundle();
param.putString(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID, groupID);
param.putBoolean(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
if (friendsInGroup != null) {
for (UserBean userBean : friendsInGroup) {
selectedList.add(userBean.getUserId());
}
}
param.putStringArrayList(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECTED_LIST, selectedList);
TUICore.startActivityForResult(caller, StartGroupMemberSelectActivity.class, param, new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result != null && result.getData() != null) {
List<String> friends = (List<String>) result.getData().getSerializableExtra(TUIContactConstants.Selection.LIST);
groupMemberPresenter.inviteGroupMembers(groupID, friends);
}
}
});
}
private void removeGroupMember(FragmentActivity activity, GroupProfileBean groupProfileBean) {
Bundle param = new Bundle();
param.putString(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID, groupProfileBean.getGroupID());
param.putBoolean(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FOR_CALL, true);
TUICore.startActivityForResult(activity, StartGroupMemberSelectActivity.class, param, result -> {
if (result.getData() != null) {
List<String> groupMembers = (List<String>) result.getData().getSerializableExtra(TUIContactConstants.Selection.LIST);
groupMemberPresenter.removeGroupMembers(groupProfileBean.getGroupID(), groupMembers);
}
});
}
private void openDetails(GroupMemberInfo groupMemberBean) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, groupMemberBean.getUserId());
TUICore.startActivity("FriendProfileActivity", bundle);
}
public void transferGroupOwner(ActivityResultCaller caller, GroupProfileBean groupProfileBean) {
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(TUILogin.getLoginUser());
Bundle param = new Bundle();
param.putBoolean(TUIConstants.TUIContact.IS_SELECT_MODE, true);
param.putString(TUIConstants.TUIContact.GROUP_ID, groupProfileBean.getGroupID());
param.putInt(TUIConstants.TUIContact.LIMIT, 1);
param.putStringArrayList(TUIConstants.TUIContact.EXCLUDE_LIST, excludeList);
param.putString(TUIConstants.TUIContact.TITLE, TUIContactService.getAppContext().getResources().getString(R.string.group_transfer_group_owner));
TUICore.startActivityForResult(caller, GroupMemberActivity.class, param, result -> {
if (result.getData() != null) {
List<String> selectedList = result.getData().getStringArrayListExtra(TUIContactConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
String newOwnerId = selectedList.get(0);
groupMemberPresenter.transferGroupOwner(groupProfileBean.getGroupID(), newOwnerId);
}
}
});
}
}
@@ -0,0 +1,230 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IAddMoreActivity;
import com.tencent.qcloud.tuikit.tuicontact.presenter.AddMorePresenter;
public class AddMoreActivity extends BaseLightActivity implements IAddMoreActivity {
private static final String TAG = AddMoreActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private EditText searchEdit;
private TextView idLabel;
private TextView notFoundTip;
private TextView searchBtn;
private View detailArea;
private ImageView faceImgView;
private TextView idTextView;
private TextView groupTypeView;
private TextView groupTypeTagView;
private TextView nickNameView;
private boolean mIsGroup;
private AddMorePresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_add_activity);
if (getIntent() != null) {
mIsGroup = getIntent().getExtras().getBoolean(TUIContactConstants.GroupType.GROUP);
}
presenter = new AddMorePresenter();
faceImgView = findViewById(R.id.friend_icon);
idTextView = findViewById(R.id.friend_account);
groupTypeView = findViewById(R.id.group_type);
nickNameView = findViewById(R.id.friend_nick_name);
groupTypeTagView = findViewById(R.id.group_type_tag);
mTitleBar = findViewById(R.id.add_friend_titlebar);
mTitleBar.setTitle(
mIsGroup ? getResources().getString(R.string.add_group) : getResources().getString(R.string.add_friend), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mTitleBar.getRightGroup().setVisibility(View.GONE);
searchEdit = findViewById(R.id.search_edit);
if (mIsGroup) {
searchEdit.setHint(R.string.hint_search_group_id);
}
idLabel = findViewById(R.id.id_label);
notFoundTip = findViewById(R.id.not_found_tip);
searchBtn = findViewById(R.id.search_button);
detailArea = findViewById(R.id.friend_detail_area);
searchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
notFoundTip.setVisibility(View.GONE);
String id = searchEdit.getText().toString();
if (mIsGroup) {
presenter.getGroupInfo(id, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
setGroupDetail(data);
detailArea.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AddMoreActivity.this, AddMoreDetailActivity.class);
intent.putExtra(TUIConstants.TUIContact.CONTENT, data);
startActivity(intent);
}
});
}
@Override
public void onError(String module, int errCode, String errMsg) {
setNotFound(true);
}
});
return;
}
presenter.getUserInfo(id, new TUIValueCallback<ContactItemBean>() {
@Override
public void onSuccess(ContactItemBean data) {
setFriendDetail(data.getAvatarUrl(), data.getId(), data.getNickName());
detailArea.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// if (data.isFriend()) {
// ClassicUIUtils.showContactDetails(data.getId());
// } else {
// Intent intent = new Intent(AddMoreActivity.this, AddMoreDetailActivity.class);
// intent.putExtra(TUIConstants.TUIContact.CONTENT, data);
// startActivity(intent);
// }
// Intent intent = new Intent(getContext(), TUIC2CChatActivity.class);
// intent.putExtra(TUIConstants.TUIChat.CHAT_TYPE, V2TIMConversation.V2TIM_C2C);
// intent.putExtra(TUIConstants.TUIChat.CHAT_ID, friendProfileBean.getUserId());
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// getContext().startActivity(intent);
Bundle bundle = new Bundle();
bundle.putInt(TUIConstants.TUIChat.CHAT_TYPE, V2TIMConversation.V2TIM_C2C);
bundle.putString(TUIConstants.TUIChat.CHAT_ID, data.getId());
// bundle.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUICore.startActivity("TUIC2CChatActivity", bundle);
}
});
}
@Override
public void onError(int errCode, String errMsg) {
setNotFound(false);
}
});
}
});
if (!mIsGroup) {
idLabel.setText(getString(R.string.contact_my_user_id, TUILogin.getLoginUser()));
}
searchEdit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
idLabel.setVisibility(View.GONE);
}
}
});
searchEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if (TextUtils.isEmpty(searchEdit.getText())) {
detailArea.setVisibility(View.GONE);
notFoundTip.setVisibility(View.GONE);
}
}
});
}
private void setGroupDetail(GroupInfo groupInfo) {
int radius = getResources().getDimensionPixelSize(R.dimen.contact_profile_face_radius);
GlideEngine.loadUserIcon(faceImgView, groupInfo.getFaceUrl(), TUIUtil.getDefaultGroupIconResIDByGroupType(this, groupInfo.getGroupType()), radius);
idTextView.setText(groupInfo.getId());
nickNameView.setText(groupInfo.getGroupName());
groupTypeTagView.setVisibility(View.VISIBLE);
groupTypeView.setVisibility(View.VISIBLE);
groupTypeView.setText(groupInfo.getGroupType());
detailArea.setVisibility(View.VISIBLE);
}
private void setFriendDetail(String faceUrl, String id, String nickName) {
int radius = getResources().getDimensionPixelSize(R.dimen.contact_profile_face_radius);
GlideEngine.loadUserIcon(faceImgView, faceUrl, radius);
idTextView.setText(id);
if (TextUtils.isEmpty(nickName)) {
nickNameView.setText(id);
} else {
nickNameView.setText(nickName);
}
groupTypeTagView.setVisibility(View.GONE);
groupTypeView.setVisibility(View.GONE);
detailArea.setVisibility(View.VISIBLE);
}
private void setNotFound(boolean isGroup) {
detailArea.setVisibility(View.GONE);
if (isGroup) {
notFoundTip.setText(getString(R.string.contact_no_such_group));
} else {
notFoundTip.setText(getString(R.string.contact_no_such_user));
}
notFoundTip.setVisibility(View.VISIBLE);
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,167 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Pair;
import android.view.Gravity;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.LineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.PopupInputCard;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.presenter.AddMorePresenter;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.presenter.FriendProfilePresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
public class AddMoreDetailActivity extends BaseLightActivity {
private static final String TAG = "AddMoreDetailActivity";
private TitleBarLayout mTitleBar;
private ImageView mHeadImageView;
private TextView mNickNameView;
private TextView mIDView;
private TextView mSignatureView;
private TextView mSignatureTag;
private View remarksArea;
private LineControllerView addFriendRemarkLv;
private TextView addSendBtn;
private View verifyArea;
private EditText addWordingEditText;
private FriendProfilePresenter presenter = new FriendProfilePresenter();
private AddMorePresenter addMorePresenter = new AddMorePresenter();
private Object data;
private String userID;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_add_more_detail_activity);
mHeadImageView = findViewById(R.id.friend_icon);
mNickNameView = findViewById(R.id.friend_nick_name);
mIDView = findViewById(R.id.friend_account);
mSignatureView = findViewById(R.id.friend_signature);
mSignatureTag = findViewById(R.id.friend_signature_tag);
remarksArea = findViewById(R.id.remarks_area);
addSendBtn = findViewById(R.id.add_send_btn);
verifyArea = findViewById(R.id.verify_area);
addWordingEditText = findViewById(R.id.add_wording_edit);
addFriendRemarkLv = findViewById(R.id.friend_remark_lv);
mTitleBar = findViewById(R.id.add_more_detail_title_bar);
mTitleBar.getRightGroup().setVisibility(View.GONE);
Intent intent = getIntent();
data = intent.getSerializableExtra(TUIConstants.TUIContact.CONTENT);
userID = intent.getStringExtra(TUIConstants.TUIContact.USER_ID);
if (data instanceof GroupInfo) {
setGroupDetail((GroupInfo) data);
remarksArea.setVisibility(View.GONE);
mTitleBar.setTitle(getResources().getString(R.string.add_group), ITitleBarLayout.Position.MIDDLE);
} else if (data instanceof ContactItemBean) {
setFriendDetail((ContactItemBean) data);
mTitleBar.setTitle(getResources().getString(R.string.add_friend), ITitleBarLayout.Position.MIDDLE);
} else if (!TextUtils.isEmpty(userID)) {
mTitleBar.setTitle(getResources().getString(R.string.add_friend), ITitleBarLayout.Position.MIDDLE);
addMorePresenter.getUserInfo(userID, new TUIValueCallback<ContactItemBean>() {
@Override
public void onSuccess(ContactItemBean object) {
setFriendDetail(object);
}
@Override
public void onError(int errorCode, String errorMessage) {
TUIContactLog.e(TAG, "get user info failed, userId: " + data);
}
});
}
setOnClickListener();
}
private void setOnClickListener() {
addFriendRemarkLv.setOnClickListener(v -> {
PopupInputCard popupInputCard = new PopupInputCard(AddMoreDetailActivity.this);
popupInputCard.setContent(addFriendRemarkLv.getContent());
popupInputCard.setTitle(getResources().getString(R.string.contact_friend_remark));
popupInputCard.setOnPositive((result -> addFriendRemarkLv.setContent(result)));
popupInputCard.show(addFriendRemarkLv, Gravity.BOTTOM);
});
addSendBtn.setOnClickListener(v -> {
String addWording = addWordingEditText.getText().toString();
if (data instanceof GroupInfo) {
presenter.joinGroup(((GroupInfo) data).getId(), addWording, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
ToastUtil.toastShortMessage(getString(R.string.success));
finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(getString(R.string.contact_add_failed) + " " + errMsg);
}
});
} else if (data instanceof ContactItemBean || !TextUtils.isEmpty(userID)) {
String remark = addFriendRemarkLv.getContent();
String friendID = userID;
if (data instanceof ContactItemBean) {
friendID = ((ContactItemBean) data).getId();
}
presenter.addFriend(friendID, addWording, remark, new IUIKitCallback<Pair<Integer, String>>() {
@Override
public void onSuccess(Pair<Integer, String> data) {
ToastUtil.toastShortMessage(data.second);
finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(getString(R.string.contact_add_failed));
}
});
}
});
}
private void setGroupDetail(GroupInfo groupInfo) {
int radius = ScreenUtil.dip2px(35);
GlideEngine.loadUserIcon(mHeadImageView, groupInfo.getFaceUrl(), TUIUtil.getDefaultGroupIconResIDByGroupType(this, groupInfo.getGroupType()), radius);
mIDView.setText(groupInfo.getId());
mNickNameView.setText(groupInfo.getGroupName());
mSignatureTag.setText(getString(R.string.contact_group_type_tag));
mSignatureView.setText(groupInfo.getGroupType());
}
private void setFriendDetail(ContactItemBean bean) {
int radius = ScreenUtil.dip2px(35);
GlideEngine.loadUserIcon(mHeadImageView, bean.getAvatarUrl(), radius);
mIDView.setText(bean.getId());
mNickNameView.setText(bean.getDisplayName());
mSignatureView.setText(bean.getSignature());
}
}
@@ -0,0 +1,71 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.classicui.ClassicUIExtensionObserver;
import com.tencent.qcloud.tuikit.tuicontact.classicui.util.ClassicUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
public class BlackListActivity extends BaseLightActivity {
private TitleBarLayout mTitleBar;
private ContactListView mListView;
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_blacklist_activity);
init();
}
private void init() {
mTitleBar = findViewById(R.id.black_list_titlebar);
mTitleBar.setTitle(getResources().getString(R.string.blacklist), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mTitleBar.getRightGroup().setVisibility(View.GONE);
mListView = findViewById(R.id.black_list);
mListView.setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
ClassicUIUtils.showContactDetails(contact.getId());
}
});
}
@Override
protected void onResume() {
super.onResume();
loadDataSource();
}
public void loadDataSource() {
presenter = new ContactPresenter();
mListView.setPresenter(presenter);
mListView.setNotFoundTip(getString(R.string.contact_no_block_list));
presenter.setContactListView(mListView);
presenter.setBlackListListener();
mListView.loadDataSource(ContactListView.DataSource.BLACK_LIST);
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,458 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.LineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.PopupInputCard;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.activities.ImageSelectActivity;
import com.tencent.qcloud.tuikit.timcommon.component.activities.ImageSelectMinimalistActivity;
import com.tencent.qcloud.tuikit.timcommon.component.dialog.TUIKitDialog;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.SynthesizedImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ImageUtil;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ChatInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.util.ClassicUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.List;
public class CreateGroupActivity extends BaseLightActivity implements View.OnClickListener {
private static final String TAG = CreateGroupActivity.class.getSimpleName();
private static final int CHOOSE_AVATAR_REQUEST_CODE = 1;
private static final int CHOOSE_GROUP_TYPE_REQUEST_CODE = 2;
private TitleBarLayout titleBarLayout;
private SynthesizedImageView groupAvatar;
private LineControllerView groupNameLv;
private LineControllerView groupIdLv;
private LineControllerView groupTypeLv;
private View groupAvatarLayout;
private TextView confirmButton;
private TextView groupTypeContentView;
private TextView groupTypeContentUrlView;
private String groupName;
private String groupId;
private String groupType = V2TIMManager.GROUP_TYPE_WORK;
private String groupAvatarUrl;
private List<Object> groupAvatarUrlList;
private int joinTypeIndex;
private String groupAvatarImageId = "";
private ArrayList<GroupMemberInfo> mGroupMembers = new ArrayList<>();
private boolean mCreating;
private ContactPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_create_group_layout);
titleBarLayout = findViewById(R.id.create_group_bar);
groupNameLv = findViewById(R.id.group_name_layout);
groupIdLv = findViewById(R.id.group_id_layout);
groupTypeLv = findViewById(R.id.group_type_layout);
groupAvatarLayout = findViewById(R.id.group_avatar_layout);
groupAvatar = findViewById(R.id.group_avatar);
confirmButton = findViewById(R.id.confirm_button);
groupTypeContentView = findViewById(R.id.group_type_text);
groupTypeContentUrlView = findViewById(R.id.group_type_text_url);
initData();
setupViews();
}
private void initData() {
Intent intent = getIntent();
if (intent == null) {
TUIContactLog.e(TAG, "intent is null");
return;
}
Bundle bundle = intent.getExtras();
if (bundle == null) {
TUIContactLog.e(TAG, "bundle is null");
return;
}
mGroupMembers = (ArrayList<GroupMemberInfo>) bundle.getSerializable(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST);
if (mGroupMembers == null || mGroupMembers.size() <= 1) {
TUIContactLog.e(TAG, "mGroupMemberIcons <= 1");
}
int num = mGroupMembers.size();
if (num > 9) {
num = 9;
}
for (int i = 0; i < num; i++) {
groupAvatarImageId += mGroupMembers.get(i).getUserId();
}
groupName = bundle.getString(TUIConstants.TUIContact.GROUP_NAME);
groupNameLv.setContent(groupName);
groupTypeLv.setContent(groupType);
if (TUIConfig.isEnableGroupGridAvatar()) {
groupAvatarUrlList = fillGroupGridAvatar();
groupAvatar.setImageId(groupAvatarImageId);
groupAvatar.displayImage(groupAvatarUrlList).load(groupAvatarImageId);
groupAvatarUrl = null;
}
joinTypeIndex = bundle.getInt(TUIConstants.TUIContact.JOIN_TYPE_INDEX, 2);
}
private void setupViews() {
titleBarLayout.getRightIcon().setVisibility(View.GONE);
titleBarLayout.setTitle(getString(R.string.create_group_chat), ITitleBarLayout.Position.MIDDLE);
titleBarLayout.setOnLeftClickListener(this);
int radius = getResources().getDimensionPixelSize(R.dimen.contact_profile_face_radius);
groupAvatar.setRadius(radius);
groupAvatar.setOnClickListener(this);
groupAvatarLayout.setOnClickListener(this);
groupNameLv.setOnClickListener(this);
groupIdLv.setOnClickListener(this);
groupTypeLv.setOnClickListener(this);
groupAvatarLayout.setOnClickListener(this);
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createGroupChat();
}
});
presenter = new ContactPresenter();
initGroupTypeContentView();
}
private void initGroupTypeContentView() {
switch (groupType) {
case V2TIMManager.GROUP_TYPE_WORK:
groupTypeContentView.setText(getString(R.string.group_work_content));
break;
case V2TIMManager.GROUP_TYPE_PUBLIC:
groupTypeContentView.setText(getString(R.string.group_public_des));
break;
case V2TIMManager.GROUP_TYPE_MEETING:
groupTypeContentView.setText(getString(R.string.group_meeting_des));
break;
case V2TIMManager.GROUP_TYPE_COMMUNITY:
groupTypeContentView.setText(getString(R.string.group_commnity_des));
break;
default:
groupTypeContentView.setText(getString(R.string.group_work_content));
break;
}
String groupTypeContent = getResources().getString(R.string.group_type_content_title);
String urlContent = getResources().getString(R.string.group_type_content_url);
int urlContentIndex = groupTypeContent.lastIndexOf(urlContent);
final int foregroundColor;
int currentTheme = TUIThemeManager.getInstance().getCurrentTheme();
if (currentTheme == TUIThemeManager.THEME_LIVELY) {
foregroundColor = getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_primary_color_lively);
} else if (currentTheme == TUIThemeManager.THEME_SERIOUS) {
foregroundColor = getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_primary_color_serious);
} else {
foregroundColor = getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_primary_color_light);
}
SpannableString spannedString = new SpannableString(groupTypeContent);
ForegroundColorSpan colorSpan = new ForegroundColorSpan(foregroundColor);
spannedString.setSpan(colorSpan, urlContentIndex, urlContentIndex + urlContent.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
openWebUrl(TUIContactConstants.IM_PRODUCT_DOC_URL);
} else {
openWebUrl(TUIContactConstants.IM_PRODUCT_DOC_URL_EN);
}
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannedString.setSpan(clickableSpan, urlContentIndex, urlContentIndex + urlContent.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
groupTypeContentUrlView.setText(spannedString);
groupTypeContentUrlView.setMovementMethod(LinkMovementMethod.getInstance());
}
@Override
public void onClick(View v) {
if (v == groupAvatar || v == groupAvatarLayout) {
ArrayList<ImageSelectActivity.ImageBean> faceList = new ArrayList<>();
if (TUIConfig.isEnableGroupGridAvatar()) {
ImageSelectActivity.ImageBean imageBean = new ImageSelectActivity.ImageBean();
imageBean.setGroupGridAvatar(fillGroupGridAvatar());
imageBean.setImageId(groupAvatarImageId);
faceList.add(imageBean);
}
for (int i = 0; i < TUIContactConstants.GROUP_FACE_COUNT; i++) {
ImageSelectActivity.ImageBean imageBean = new ImageSelectActivity.ImageBean();
imageBean.setThumbnailUri(String.format(TUIContactConstants.GROUP_FACE_URL, (i + 1) + ""));
faceList.add(imageBean);
}
Intent intent = new Intent(CreateGroupActivity.this, ImageSelectActivity.class);
intent.putExtra(ImageSelectActivity.TITLE, getString(R.string.group_choose_avatar));
intent.putExtra(ImageSelectActivity.SPAN_COUNT, 4);
intent.putExtra(ImageSelectActivity.PLACEHOLDER, com.tencent.qcloud.tuikit.timcommon.R.drawable.core_default_user_icon_light);
int itemWidth = (int) (ScreenUtil.getScreenWidth(this) * 0.2f);
intent.putExtra(ImageSelectMinimalistActivity.ITEM_WIDTH, itemWidth);
intent.putExtra(ImageSelectMinimalistActivity.ITEM_HEIGHT, itemWidth);
intent.putExtra(ImageSelectActivity.DATA, faceList);
intent.putExtra(ImageSelectActivity.SELECTED, faceList.get(0));
startActivityForResult(intent, CHOOSE_AVATAR_REQUEST_CODE);
} else if (v == groupNameLv) {
PopupInputCard popupInputCard = new PopupInputCard(this);
popupInputCard.setContent(groupNameLv.getContent().toString());
popupInputCard.setTitle(getResources().getString(R.string.modify_group_name));
popupInputCard.setMaxLimit(30);
popupInputCard.setOnPositive(new PopupInputCard.OnClickListener() {
@Override
public void onClick(String result) {
if (!TextUtils.isEmpty(result)) {
groupName = result;
groupNameLv.setContent(groupName);
} else {
ToastUtil.toastLongMessage(getResources().getString(R.string.group_name_edit_null_tips));
}
}
});
popupInputCard.setTextExceedListener(new PopupInputCard.OnTextExceedListener() {
@Override
public void onTextExceedMax() {
ToastUtil.toastLongMessage(getResources().getString(R.string.group_name_edit_exceed_tips));
}
});
popupInputCard.show(groupNameLv, Gravity.BOTTOM);
} else if (v == groupIdLv) {
PopupInputCard popupInputCard = new PopupInputCard(this);
popupInputCard.setContent(groupIdLv.getContent().toString());
popupInputCard.setTitle(getResources().getString(R.string.modify_group_id));
popupInputCard.setMaxLimit(48);
popupInputCard.setOnPositive(new PopupInputCard.OnClickListener() {
@Override
public void onClick(String result) {
if (TextUtils.equals(groupType, V2TIMManager.GROUP_TYPE_COMMUNITY)) {
if (!TextUtils.isEmpty(result) && result.startsWith("@TGS#_") == false) {
ToastUtil.toastLongMessage(getResources().getString(R.string.community_id_edit_format_tips));
groupIdLv.setContent("");
groupId = "";
return;
}
} else {
if (!TextUtils.isEmpty(result) && result.startsWith("@TGS#")) {
ToastUtil.toastLongMessage(getResources().getString(R.string.group_id_edit_format_tips));
groupIdLv.setContent("");
groupId = "";
return;
}
}
groupIdLv.setContent(result);
groupId = result;
}
});
popupInputCard.setTextExceedListener(new PopupInputCard.OnTextExceedListener() {
@Override
public void onTextExceedMax() {
ToastUtil.toastLongMessage(getResources().getString(R.string.group_id_edit_exceed_tips));
}
});
popupInputCard.show(groupIdLv, Gravity.BOTTOM);
} else if (v == groupTypeLv) {
Intent intent = new Intent(this, GroupTypeSelectActivity.class);
startActivityForResult(intent, CHOOSE_GROUP_TYPE_REQUEST_CODE);
} else if (v == titleBarLayout.getLeftGroup()) {
finish();
}
}
private List<Object> fillGroupGridAvatar() {
final List<Object> urlList = new ArrayList<>();
String savedIcon = ImageUtil.getGroupConversationAvatar(groupAvatarImageId);
if (TextUtils.isEmpty(savedIcon)) {
int faceSize = Math.min(mGroupMembers.size(), 9);
for (int i = 0; i < faceSize; i++) {
String iconUrl = mGroupMembers.get(i).getFaceUrl();
urlList.add(TextUtils.isEmpty(iconUrl) ? TUIConfig.getDefaultAvatarImage() : iconUrl);
}
} else {
urlList.add(savedIcon);
}
return urlList;
}
private void createGroupChat() {
if (mCreating) {
return;
}
final GroupInfo groupInfo = new GroupInfo();
groupInfo.setChatName(groupName);
groupInfo.setGroupName(groupName);
groupInfo.setMemberDetails(mGroupMembers);
groupInfo.setGroupType(groupType);
groupInfo.setJoinType(joinTypeIndex);
groupInfo.setCommunitySupportTopic(false);
groupInfo.setFaceUrl(groupAvatarUrl);
groupInfo.setId(groupId);
mCreating = true;
presenter.createGroupChat(groupInfo, new IUIKitCallback<String>() {
@Override
public void onSuccess(String data) {
ClassicUIUtils.startChatActivity(data, ChatInfo.TYPE_GROUP, groupInfo.getGroupName(), groupInfo.getGroupType());
finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
mCreating = false;
if (errCode == TUIConstants.BuyingFeature.ERR_SDK_INTERFACE_NOT_SUPPORT || errCode == 11000) {
showNotSupportDialog();
}
ToastUtil.toastLongMessage("createGroupChat fail:" + errCode + "=" + errMsg);
}
});
}
private void showNotSupportDialog() {
String string = getResources().getString(R.string.contact_im_flagship_edition_update_tip, getString(R.string.contact_community));
String buyingGuidelines = getResources().getString(R.string.contact_buying_guidelines);
int buyingGuidelinesIndex = string.lastIndexOf(buyingGuidelines);
final int foregroundColor = getResources().getColor(TUIThemeManager.getAttrResId(this, com.tencent.qcloud.tuicore.R.attr.core_primary_color));
SpannableString spannedString = new SpannableString(string);
ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(foregroundColor);
spannedString.setSpan(colorSpan2, buyingGuidelinesIndex, buyingGuidelinesIndex + buyingGuidelines.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
ClickableSpan clickableSpan2 = new ClickableSpan() {
@Override
public void onClick(View view) {
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
openWebUrl(TUIConstants.BuyingFeature.BUYING_PRICE_DESC);
} else {
openWebUrl(TUIConstants.BuyingFeature.BUYING_PRICE_DESC_EN);
}
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannedString.setSpan(clickableSpan2, buyingGuidelinesIndex, buyingGuidelinesIndex + buyingGuidelines.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
TUIKitDialog.TUIIMUpdateDialog.getInstance()
.createDialog(this)
.setMovementMethod(LinkMovementMethod.getInstance())
.setShowOnlyDebug(true)
.setCancelable(true)
.setCancelOutside(true)
.setTitle(spannedString)
.setDialogWidth(0.75f)
.setDialogFeatureName(TUIConstants.BuyingFeature.BUYING_FEATURE_COMMUNITY)
.setPositiveButton(getString(R.string.contact_no_more_reminders),
new View.OnClickListener() {
@Override
public void onClick(View v) {
TUIKitDialog.TUIIMUpdateDialog.getInstance().dismiss();
TUIKitDialog.TUIIMUpdateDialog.getInstance().setNeverShow(true);
}
})
.setNegativeButton(getString(R.string.contact_i_know),
new View.OnClickListener() {
@Override
public void onClick(View v) {
TUIKitDialog.TUIIMUpdateDialog.getInstance().dismiss();
}
})
.show();
}
private void openWebUrl(String url) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri contentUrl = Uri.parse(url);
intent.setData(contentUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
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;
}
List<Object> faceUrl = imageBean.getGroupGridAvatar();
if (faceUrl != null && !faceUrl.isEmpty()) {
groupAvatar.setImageId(groupAvatarImageId);
groupAvatar.displayImage(faceUrl).load(groupAvatarImageId);
groupAvatarUrlList = faceUrl;
groupAvatarUrl = null;
} else {
groupAvatarUrl = imageBean.getThumbnailUri();
GlideEngine.loadImage(groupAvatar, groupAvatarUrl);
}
}
} else if (requestCode == CHOOSE_GROUP_TYPE_REQUEST_CODE) {
if (data != null) {
String type = data.getStringExtra(TUIContactConstants.Selection.TYPE);
if (TextUtils.isEmpty(type)) {
TUIContactLog.e(TAG, "onActivityResult type is null");
return;
}
groupType = type;
groupTypeLv.setContent(type);
initGroupTypeContentView();
}
}
}
}
@@ -0,0 +1,241 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.component.LineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.activities.SelectionActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ForwardContactSelectorAdapter;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ForwardSelectGroupActivity extends BaseLightActivity {
private static final String TAG = ForwardSelectGroupActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mContactListView;
private LineControllerView mJoinType;
private ArrayList<GroupMemberInfo> mMembers = new ArrayList<>();
private int mJoinTypeIndex = 2;
private ArrayList<String> mJoinTypes = new ArrayList<>();
private boolean mCreating;
private boolean isCreateNewChat = true;
private RecyclerView mForwardSelectlistView;
private ForwardContactSelectorAdapter mAdapter;
private List<String> mSelectConversationIcons = new ArrayList<>();
private RelativeLayout mForwardSelectlistViewLayout;
private TextView mSureView;
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_forward_select_group_contact);
init();
}
private void init() {
Intent intent = getIntent();
if (intent != null) {
isCreateNewChat = intent.getBooleanExtra(TUIContactConstants.FORWARD_CREATE_NEW_CHAT, false);
}
mTitleBar = findViewById(R.id.group_create_title_bar);
mTitleBar.getRightGroup().setVisibility(View.GONE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mJoinType = findViewById(R.id.group_type_join);
mJoinType.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showJoinTypePickerView();
}
});
mJoinType.setCanNav(true);
mJoinType.setContent("Public");
mJoinType.setVisibility(View.GONE);
mContactListView = findViewById(R.id.group_create_member_list);
presenter = new ContactPresenter();
mContactListView.setPresenter(presenter);
presenter.setFriendListListener();
presenter.setContactListView(mContactListView);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
if (selected) {
GroupMemberInfo memberInfo = new GroupMemberInfo();
memberInfo.setUserId(contact.getId());
memberInfo.setFaceUrl(contact.getAvatarUrl());
mMembers.add(memberInfo);
} else {
for (int i = mMembers.size() - 1; i >= 0; i--) {
if (mMembers.get(i).getUserId().equals(contact.getId())) {
mMembers.remove(i);
}
}
}
refreshSelectConversations();
}
});
setGroupType(TUIContactConstants.GroupType.PUBLIC);
mForwardSelectlistViewLayout = findViewById(R.id.forward_contact_select_list_layout);
mForwardSelectlistViewLayout.setVisibility(View.VISIBLE);
mForwardSelectlistView = findViewById(R.id.forward_contact_select_list);
mForwardSelectlistView.setLayoutManager(new CustomLinearLayoutManager(this, CustomLinearLayoutManager.HORIZONTAL, false));
mAdapter = new ForwardContactSelectorAdapter(this);
mForwardSelectlistView.setAdapter(mAdapter);
mSureView = findViewById(R.id.btn_msg_ok);
mSureView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isCreateNewChat) {
createGroupChat();
} else {
Intent intent = new Intent();
HashMap<String, String> conversationMap = new HashMap<>();
if (mMembers != null && mMembers.size() != 0) {
for (int i = 0; i < mMembers.size(); i++) {
conversationMap.put(mMembers.get(i).getUserId(), mMembers.get(i).getFaceUrl());
}
}
intent.putExtra(TUIContactConstants.FORWARD_SELECT_CONVERSATION_KEY, conversationMap);
setResult(TUIContactConstants.FORWARD_SELECT_MEMBERS_CODE, intent);
finish();
}
}
});
refreshSelectConversations();
}
private void refreshSelectConversations() {
mSelectConversationIcons.clear();
if (mMembers != null && mMembers.size() != 0) {
for (int i = 0; i < mMembers.size(); i++) {
mSelectConversationIcons.add(mMembers.get(i).getFaceUrl());
}
}
mAdapter.setDataSource(mSelectConversationIcons);
if (mSelectConversationIcons == null || mSelectConversationIcons.size() == 0) {
mSureView.setText(getString(com.tencent.qcloud.tuicore.R.string.sure));
mSureView.setVisibility(View.GONE);
mForwardSelectlistViewLayout.setVisibility(View.GONE);
} else {
mForwardSelectlistViewLayout.setVisibility(View.VISIBLE);
mSureView.setVisibility(View.VISIBLE);
mSureView.setText(getString(com.tencent.qcloud.tuicore.R.string.sure) + "(" + mSelectConversationIcons.size() + ")");
}
}
public void setGroupType(int type) {
mTitleBar.setTitle(getResources().getString(R.string.contact_title), ITitleBarLayout.Position.MIDDLE);
mJoinType.setVisibility(View.GONE);
}
private void showJoinTypePickerView() {
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, mJoinTypeIndex);
SelectionActivity.startListSelection(this, bundle, new SelectionActivity.OnResultReturnListener() {
@Override
public void onReturn(Object text) {
mJoinType.setContent(mJoinTypes.get((Integer) text));
mJoinTypeIndex = (Integer) text;
}
});
}
private void createGroupChat() {
if (mCreating || mMembers.isEmpty()) {
return;
}
if (mMembers.size() == 1) {
Intent intent = new Intent();
HashMap<String, Boolean> conversationMap = new HashMap<>();
conversationMap.put(mMembers.get(0).getUserId(), false);
intent.putExtra(TUIContactConstants.FORWARD_SELECT_CONVERSATION_KEY, conversationMap);
setResult(TUIContactConstants.FORWARD_CREATE_GROUP_CODE, intent);
finish();
return;
}
GroupMemberInfo memberInfo = new GroupMemberInfo();
memberInfo.setUserId(ContactUtils.getLoginUser());
mMembers.add(memberInfo);
final GroupInfo groupInfo = new GroupInfo();
String groupName = ContactUtils.getLoginUser();
for (int i = 1; i < mMembers.size(); i++) {
groupName = groupName + "" + mMembers.get(i).getUserId();
}
if (groupName.length() > 20) {
groupName = groupName.substring(0, 17) + "...";
}
groupInfo.setChatName(groupName);
groupInfo.setGroupName(groupName);
groupInfo.setMemberDetails(mMembers);
groupInfo.setGroupType(TUIContactConstants.GroupType.TYPE_PUBLIC);
groupInfo.setJoinType(0);
mCreating = true;
presenter.createGroupChat(groupInfo, new IUIKitCallback<String>() {
@Override
public void onSuccess(String data) {
Intent intent = new Intent();
HashMap<String, Boolean> conversationMap = new HashMap<>();
conversationMap.put(data, true);
intent.putExtra(TUIContactConstants.FORWARD_SELECT_CONVERSATION_KEY, conversationMap);
setResult(TUIContactConstants.FORWARD_CREATE_GROUP_CODE, intent);
finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
mCreating = false;
ToastUtil.toastLongMessage("createGroupChat fail:" + errCode + "=" + errMsg);
}
});
}
}
@@ -0,0 +1,127 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupApplyPresenter;
public class GroupApplyDetailActivity extends BaseLightActivity implements IGroupApplyLayout {
private TitleBarLayout mTitleBar;
private GroupApplyPresenter presenter;
private ShadeImageView avatarView;
private TextView userNameTv;
private TextView userIDTv;
private TextView addWordingTv;
private TextView agreeButton;
private TextView rejectButton;
private TextView resultButton;
private GroupApplyInfo groupApplyInfo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_new_group_apply_detail_activity);
Intent intent = getIntent();
if (intent != null) {
groupApplyInfo = (GroupApplyInfo) intent.getSerializableExtra(TUIContactConstants.Group.MEMBER_APPLY);
presenter = new GroupApplyPresenter(this);
init();
}
}
private void init() {
mTitleBar = findViewById(R.id.new_apply_detail_title_bar);
mTitleBar.setTitle(getResources().getString(R.string.group_group_application_detail_title), ITitleBarLayout.Position.MIDDLE);
mTitleBar.getRightIcon().setVisibility(View.GONE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
avatarView = findViewById(R.id.avatar);
avatarView.setRadius(ScreenUtil.dip2px(4));
GlideEngine.loadImage(avatarView, groupApplyInfo.getFromUserFaceUrl());
userNameTv = findViewById(R.id.user_name);
if (TextUtils.isEmpty(groupApplyInfo.getFromUserNickName())) {
userNameTv.setText(groupApplyInfo.getFromUserID());
} else {
userNameTv.setText(groupApplyInfo.getFromUserNickName());
}
userIDTv = findViewById(R.id.user_id);
userIDTv.setText(groupApplyInfo.getFromUserID());
addWordingTv = findViewById(R.id.validation_message);
addWordingTv.setText(groupApplyInfo.getAddWording());
agreeButton = findViewById(R.id.agree);
rejectButton = findViewById(R.id.reject);
resultButton = findViewById(R.id.result_tv);
agreeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.acceptApply(groupApplyInfo, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
agreeButton.setVisibility(View.GONE);
rejectButton.setVisibility(View.GONE);
resultButton.setVisibility(View.VISIBLE);
groupApplyInfo.setStatus(GroupApplyInfo.APPLIED);
Intent intent = new Intent();
intent.putExtra(TUIContactConstants.Group.MEMBER_APPLY, groupApplyInfo);
setResult(RESULT_OK, intent);
}
@Override
public void onError(String module, int errCode, String errMsg) {
super.onError(module, errCode, errMsg);
}
});
}
});
rejectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.refuseApply(groupApplyInfo, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
agreeButton.setVisibility(View.GONE);
rejectButton.setVisibility(View.GONE);
resultButton.setVisibility(View.VISIBLE);
resultButton.setText(getResources().getString(R.string.refused));
resultButton.setTextColor(getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_error_tip_color_light));
groupApplyInfo.setStatus(GroupApplyInfo.REFUSED);
Intent intent = new Intent();
intent.putExtra(TUIContactConstants.Group.MEMBER_APPLY, groupApplyInfo);
setResult(RESULT_OK, intent);
}
@Override
public void onError(String module, int errCode, String errMsg) {
super.onError(module, errCode, errMsg);
}
});
}
});
}
}
@@ -0,0 +1,40 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.GroupApplyManagerLayout;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupApplyPresenter;
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(TUIContactConstants.Group.GROUP_ID);
GroupInfo groupInfo = new GroupInfo();
groupInfo.setId(groupId);
mManagerLayout.setDataSource(groupInfo);
}
@Override
public void onResume() {
super.onResume();
}
}
@@ -0,0 +1,89 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.classicui.util.ClassicUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
public class GroupListActivity extends BaseLightActivity {
private static final String TAG = GroupListActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mListView;
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_group_list_activity);
init();
}
@Override
public void onResume() {
super.onResume();
loadDataSource();
}
private void init() {
mTitleBar = findViewById(R.id.group_list_titlebar);
mTitleBar.setTitle(getResources().getString(R.string.group), ITitleBarLayout.Position.LEFT);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mTitleBar.setTitle(getResources().getString(R.string.add_group), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightIcon().setVisibility(View.GONE);
mTitleBar.setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(GroupListActivity.this, AddMoreActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("isGroup", true);
startActivity(intent);
}
});
mListView = findViewById(R.id.group_list);
mListView.setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
String chatName = contact.getId();
if (!TextUtils.isEmpty(contact.getRemark())) {
chatName = contact.getRemark();
} else if (!TextUtils.isEmpty(contact.getNickName())) {
chatName = contact.getNickName();
}
ClassicUIUtils.startChatActivity(contact.getId(), ContactItemBean.TYPE_GROUP, chatName, contact.getGroupType());
}
});
}
public void loadDataSource() {
presenter = new ContactPresenter();
presenter.setFriendListListener();
mListView.setIsGroupList(true);
mListView.setPresenter(presenter);
mListView.setNotFoundTip(getString(R.string.contact_no_group));
presenter.setContactListView(mListView);
mListView.loadDataSource(ContactListView.DataSource.GROUP_LIST);
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,197 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.GroupMemberLayout;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupInfoPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupMemberActivity extends BaseLightActivity {
private static final String TAG = "GroupMemberActivity";
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.TUIContact.GROUP_ID);
isSelectMode = intent.getBooleanExtra(TUIConstants.TUIContact.IS_SELECT_MODE, true);
excludeList = intent.getStringArrayListExtra(TUIConstants.TUIContact.EXCLUDE_LIST);
alreadySelectedList = intent.getStringArrayListExtra(TUIConstants.TUIContact.SELECTED_LIST);
userData = intent.getStringExtra(TUIConstants.TUIContact.USER_DATA);
mMemberLayout.setSelectMode(isSelectMode);
String title = intent.getStringExtra(TUIConstants.TUIContact.TITLE);
mMemberLayout.setTitle(title);
mMemberLayout.setExcludeList(excludeList);
mMemberLayout.setAlreadySelectedList(alreadySelectedList);
presenter = new GroupInfoPresenter(mMemberLayout);
mMemberLayout.setPresenter(presenter);
int filter = intent.getIntExtra(TUIConstants.TUIContact.FILTER, GroupInfo.GROUP_MEMBER_FILTER_ALL);
presenter.loadGroupInfo(groupID, filter);
mMemberLayout.getTitleBar().setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
int limit = getIntent().getIntExtra(TUIConstants.TUIContact.LIMIT, Integer.MAX_VALUE);
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.TUIContact.LIST, members);
setResult(0, result);
Map<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.LIST, members);
param.put(TUIConstants.TUIContact.USER_DATA, userData);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_GROUP_MEMBER_SELECTED, param);
finish();
}
@Override
public void forwardAddMember(GroupInfo info) {
presenter.getFriendListInGroup(info.getId(), new TUIValueCallback<List<UserBean>>() {
@Override
public void onSuccess(List<UserBean> userBeans) {
addGroupMember(info.getId(), userBeans);
}
@Override
public void onError(int errorCode, String errorMessage) {
TUIContactLog.e(TAG, "add group member error, errorCode: " + errorCode + ", errorMessage: " + errorMessage);
addGroupMember(info.getId(), null);
}
});
}
@Override
public void forwardDeleteMember(GroupInfo info) {
deleteGroupMember(info.getId());
}
});
}
private void deleteGroupMember(String groupID) {
Bundle param = new Bundle();
param.putString(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID, groupID);
param.putBoolean(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FOR_CALL, true);
TUICore.startActivityForResult(GroupMemberActivity.this, "StartGroupMemberSelectActivity", param, new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result != null && result.getData() != null) {
List<String> friends = (List<String>) result.getData().getSerializableExtra(TUIContactConstants.Selection.LIST);
deleteGroupMembers(friends);
}
}
});
}
private void addGroupMember(String groupID, List<UserBean> friendsInGroup) {
Bundle param = new Bundle();
param.putString(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID, groupID);
param.putBoolean(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
if (friendsInGroup != null) {
for (UserBean userBean : friendsInGroup) {
selectedList.add(userBean.getUserId());
}
}
param.putStringArrayList(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECTED_LIST, selectedList);
TUICore.startActivityForResult(GroupMemberActivity.this, "StartGroupMemberSelectActivity", param, new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result != null && result.getData() != null) {
List<String> friends = (List<String>) result.getData().getSerializableExtra(TUIContactConstants.Selection.LIST);
inviteGroupMembers(friends);
}
}
});
}
private void deleteGroupMembers(List<String> friends) {
if (friends != null && !friends.isEmpty()) {
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.isEmpty()) {
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(TUIContactService.getAppContext().getString(R.string.invite_suc));
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIContactService.getAppContext().getString(R.string.invite_fail) + errCode + "=" + errMsg);
}
});
}
}
}
}
@@ -0,0 +1,162 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class GroupTypeSelectActivity extends BaseLightActivity implements View.OnClickListener {
private static final String TAG = GroupTypeSelectActivity.class.getSimpleName();
private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView.Adapter mAdapter;
private List<String> mDatas = new ArrayList<>();
private TitleBarLayout titleBarLayout;
private TextView viewProductBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_group_type_select_layout);
initData();
initView();
}
private void initView() {
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mAdapter = new MyAdapter(mDatas);
mRecyclerView = findViewById(R.id.recycler);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
titleBarLayout = findViewById(R.id.create_group_bar);
titleBarLayout.getRightIcon().setVisibility(View.GONE);
titleBarLayout.setTitle(getString(R.string.group_type_select_text), ITitleBarLayout.Position.MIDDLE);
titleBarLayout.setOnLeftClickListener(this);
viewProductBtn = findViewById(R.id.view_product_doc_btn);
viewProductBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String url = "";
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
url = TUIContactConstants.IM_PRODUCT_DOC_URL;
} else {
url = TUIContactConstants.IM_PRODUCT_DOC_URL_EN;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri contentUrl = Uri.parse(url);
intent.setData(contentUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
}
private void initData() {
String[] array = getResources().getStringArray(R.array.group_type);
mDatas.addAll(Arrays.asList(array));
}
@Override
public void onClick(View view) {
if (view == titleBarLayout.getLeftGroup()) {
finish();
}
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> mDatas;
public MyAdapter(List<String> datas) {
this.mDatas = datas;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_group_type_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String type = this.mDatas.get(position);
holder.imageView.setImageResource(TUIUtil.getDefaultGroupIconResIDByGroupType(getApplicationContext(), type));
switch (type) {
case V2TIMManager.GROUP_TYPE_WORK:
holder.textView.setText(getString(R.string.group_work_type));
holder.subTextView.setText(getString(R.string.group_work_content));
break;
case V2TIMManager.GROUP_TYPE_PUBLIC:
holder.textView.setText(getString(R.string.group_public_type));
holder.subTextView.setText(getString(R.string.group_public_des));
break;
case V2TIMManager.GROUP_TYPE_MEETING:
holder.textView.setText(getString(R.string.group_meeting_type));
holder.subTextView.setText(getString(R.string.group_meeting_des));
break;
case V2TIMManager.GROUP_TYPE_COMMUNITY:
holder.textView.setText(getString(R.string.group_commnity_type));
holder.subTextView.setText(getString(R.string.group_commnity_des));
break;
default:
holder.textView.setText(getString(R.string.group_work_type));
holder.subTextView.setText(getString(R.string.group_work_content));
break;
}
holder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra(TUIContactConstants.Selection.TYPE, type);
setResult(0, intent);
finish();
}
});
}
@Override
public int getItemCount() {
return this.mDatas == null ? 0 : this.mDatas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
View rootView;
RelativeLayout itemLayout;
ImageView imageView;
TextView textView;
TextView subTextView;
public ViewHolder(View itemView) {
super(itemView);
rootView = itemView;
itemLayout = itemView.findViewById(R.id.item_layout);
imageView = itemView.findViewById(R.id.group_type_icon);
textView = itemView.findViewById(R.id.group_type_text);
subTextView = itemView.findViewById(R.id.group_type_content);
}
}
}
}
@@ -0,0 +1,300 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import static com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants.GROUP_PROFILE_BEAN;
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.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.component.LineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.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 GroupProfileBean groupProfileBean;
@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);
Intent intent = getIntent();
groupProfileBean = (GroupProfileBean) intent.getSerializableExtra(GROUP_PROFILE_BEAN);
//
muteAllView.setChecked(groupProfileBean.isAllMuted());
if (groupProfileBean.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(groupProfileBean.getGroupID(), 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(groupProfileBean.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(groupProfileBean.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(TUIContactConstants.Group.GROUP_INFO, groupProfileBean);
startActivity(intent);
}
});
addMuteMemberView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.equals(groupProfileBean.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(groupProfileBean.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.TUIContact.IS_SELECT_MODE, true);
intent.putExtra(TUIConstants.TUIContact.FILTER, GroupInfo.GROUP_MEMBER_FILTER_COMMON);
if (mutedMemberAdapter.getGroupMemberInfoList() != null) {
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : mutedMemberAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getUserId());
}
intent.putExtra(TUIConstants.TUIContact.SELECTED_LIST, selectedList);
}
intent.putExtra(TUIConstants.TUIContact.GROUP_ID, groupProfileBean.getGroupID());
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(groupProfileBean.getGroupID(), memberInfo.getUserId(), 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() / 2;
int popHeight = ScreenUtil.dip2px(45) * 3;
if (y + popHeight + view.getY() + view.getHeight() > mutedList.getBottom()) {
y = y - popHeight;
}
popupWindow.showAsDropDown(view, x, y, Gravity.CENTER);
}
});
}
private void loadMutedMember() {
presenter.loadMutedMembers(groupProfileBean.getGroupID(), 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(TUIContactConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.muteGroupMember(groupProfileBean.getGroupID(), 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 = groupMemberInfo.getDisplayName();
holder.managerName.setText(displayName);
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getFaceUrl());
}
@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);
}
}
}
}
@@ -0,0 +1,89 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.NewFriendListAdapter;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.INewFriendActivity;
import com.tencent.qcloud.tuikit.tuicontact.presenter.NewFriendPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.List;
public class NewFriendActivity extends BaseLightActivity implements INewFriendActivity {
private static final String TAG = NewFriendActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ListView mNewFriendLv;
private NewFriendListAdapter mAdapter;
private TextView notFoundTip;
private NewFriendPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_new_friend_activity);
init();
}
@Override
protected void onResume() {
super.onResume();
initPendency();
}
private void init() {
mTitleBar = findViewById(R.id.new_friend_titlebar);
mTitleBar.setTitle(getResources().getString(R.string.new_friend), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mTitleBar.getRightIcon().setVisibility(View.GONE);
presenter = new NewFriendPresenter();
presenter.setFriendActivity(this);
presenter.setFriendApplicationRead(new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {}
@Override
public void onError(String module, int errCode, String errMsg) {}
});
mNewFriendLv = findViewById(R.id.new_friend_list);
notFoundTip = findViewById(R.id.not_found_tip);
}
private void initPendency() {
presenter.loadFriendApplicationList();
}
@Override
public void onDataSourceChanged(List<FriendApplicationBean> dataSource) {
TUIContactLog.i(TAG, "getFriendApplicationList success");
if (dataSource == null || dataSource.isEmpty()) {
notFoundTip.setVisibility(View.VISIBLE);
} else {
notFoundTip.setVisibility(View.GONE);
}
mNewFriendLv.setVisibility(View.VISIBLE);
mAdapter = new NewFriendListAdapter(NewFriendActivity.this, R.layout.contact_new_friend_item, dataSource);
mAdapter.setPresenter(presenter);
mNewFriendLv.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,109 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.interfaces.TUICallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.presenter.NewFriendApplicationPresenter;
public class NewFriendApplicationDetailActivity extends BaseLightActivity {
private static final String TAG = "NewFriendApplicationDetailActivity";
private TitleBarLayout mTitleBar;
private ImageView mHeadImageView;
private TextView mNickNameView;
private TextView mIDView;
private TextView acceptFriendBtn;
private TextView refuseFriendBtn;
private TextView resultBtn;
private TextView friendApplicationAddWording;
private NewFriendApplicationPresenter presenter = new NewFriendApplicationPresenter();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_new_friend_application_detail_layout);
mHeadImageView = findViewById(R.id.friend_icon);
mNickNameView = findViewById(R.id.friend_nick_name);
mIDView = findViewById(R.id.friend_account);
resultBtn = findViewById(R.id.result_button);
acceptFriendBtn = findViewById(R.id.accept_friend_send_btn);
refuseFriendBtn = findViewById(R.id.refuse_friend_send_btn);
friendApplicationAddWording = findViewById(R.id.friend_application_add_wording);
mTitleBar = findViewById(R.id.new_friend_application_detail_title_bar);
mTitleBar.setTitle(getResources().getString(R.string.profile_detail), ITitleBarLayout.Position.MIDDLE);
mTitleBar.getRightGroup().setVisibility(View.GONE);
Intent intent = getIntent();
FriendApplicationBean applicationBean = (FriendApplicationBean) intent.getSerializableExtra(TUIConstants.TUIContact.CONTENT);
setApplicationBean(applicationBean);
}
void setApplicationBean(FriendApplicationBean applicationBean) {
int radius = ScreenUtil.dip2px(4.6f);
GlideEngine.loadUserIcon(mHeadImageView, applicationBean.getFaceUrl(), radius);
mTitleBar.setTitle(getResources().getString(R.string.profile_detail), ITitleBarLayout.Position.MIDDLE);
mNickNameView.setText(applicationBean.getDisplayName());
mIDView.setText(applicationBean.getUserId());
friendApplicationAddWording.setText(applicationBean.getAddWording());
acceptFriendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.acceptFriendApplication(applicationBean, new TUICallback() {
@Override
public void onSuccess() {
acceptFriendBtn.setVisibility(View.GONE);
refuseFriendBtn.setVisibility(View.GONE);
resultBtn.setVisibility(View.VISIBLE);
resultBtn.setText(R.string.accepted);
finish();
}
@Override
public void onError(int errorCode, String errorMessage) {
ToastUtil.toastShortMessage(errorMessage);
}
});
}
});
refuseFriendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.refuseFriendApplication(applicationBean, new TUICallback() {
@Override
public void onSuccess() {
acceptFriendBtn.setVisibility(View.GONE);
refuseFriendBtn.setVisibility(View.GONE);
resultBtn.setVisibility(View.VISIBLE);
resultBtn.setText(R.string.refused);
finish();
}
@Override
public void onError(int errorCode, String errorMessage) {
ToastUtil.toastShortMessage(errorMessage);
}
});
}
});
}
}
@@ -0,0 +1,270 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
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.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupManagerPresenter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class SetGroupManagerActivity extends BaseLightActivity {
private TitleBarLayout titleBarLayout;
private TextView managerCountLabel;
private GroupManagerPresenter presenter;
private GroupProfileBean profileBean;
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);
profileBean = (GroupProfileBean) getIntent().getSerializableExtra(TUIContactConstants.Group.GROUP_INFO);
presenter = new GroupManagerPresenter();
setClickListener();
loadGroupManager();
loadGroupOwner();
}
private void loadGroupManager() {
presenter.loadGroupManager(profileBean.getGroupID(), new IUIKitCallback<List<GroupMemberInfo>>() {
@Override
public void onSuccess(List<GroupMemberInfo> data) {
if (data != null) {
managerCountLabel.setText(String.format(Locale.US, 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(profileBean.getGroupID(), new IUIKitCallback<GroupMemberInfo>() {
@Override
public void onSuccess(GroupMemberInfo data) {
ownerID = data.getUserId();
String faceUrl = data.getFaceUrl();
String displayName = data.getDisplayName();
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.TUIContact.IS_SELECT_MODE, true);
ArrayList<String> selectedList = new ArrayList<>();
if (managerAdapter.getGroupMemberInfoList() != null) {
for (GroupMemberInfo memberInfo : managerAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getUserId());
}
intent.putExtra(TUIConstants.TUIContact.SELECTED_LIST, selectedList);
}
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(ownerID);
intent.putExtra(TUIConstants.TUIContact.EXCLUDE_LIST, excludeList);
intent.putExtra(TUIConstants.TUIContact.GROUP_ID, profileBean.getGroupID());
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(profileBean.getGroupID(), memberInfo.getUserId(), 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() / 2;
int popHeight = ScreenUtil.dip2px(45) * 3;
if (y + popHeight + view.getY() + view.getHeight() > managerList.getBottom()) {
y = y - popHeight;
}
popupWindow.showAsDropDown(view, x, y, Gravity.CENTER);
}
});
}
@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(TUIContactConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.setGroupManager(profileBean.getGroupID(), 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;
}
});
holder.managerName.setText(groupMemberInfo.getDisplayName());
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getFaceUrl());
}
@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);
}
}
}
interface OnItemLongClickListener {
void onClick(View view, GroupMemberInfo groupMemberInfo, int position);
}
}
@@ -0,0 +1,93 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.classicui.util.ClassicUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.util.ArrayList;
import java.util.List;
public class StartC2CChatActivity extends BaseLightActivity {
private static final String TAG = StartC2CChatActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mContactListView;
private ContactItemBean mSelectedItem;
private List<ContactItemBean> mContacts = new ArrayList<>();
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_popup_start_c2c_chat_activity);
mTitleBar = findViewById(R.id.start_c2c_chat_title);
mTitleBar.setTitle(getResources().getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightIcon().setVisibility(View.GONE);
mTitleBar.setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startConversation();
}
});
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mContactListView = findViewById(R.id.contact_list_view);
mContactListView.setSingleSelectMode(true);
presenter = new ContactPresenter();
presenter.setFriendListListener();
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
if (selected) {
if (mSelectedItem != contact) {
if (mSelectedItem != null) {
mSelectedItem.setSelected(false);
}
mSelectedItem = contact;
}
} else {
if (mSelectedItem == contact) {
mSelectedItem.setSelected(false);
}
}
}
});
}
public void startConversation() {
if (mSelectedItem == null || !mSelectedItem.isSelected()) {
ToastUtil.toastLongMessage(getString(R.string.select_chat));
return;
}
String chatName = mSelectedItem.getId();
if (!TextUtils.isEmpty(mSelectedItem.getRemark())) {
chatName = mSelectedItem.getRemark();
} else if (!TextUtils.isEmpty(mSelectedItem.getNickName())) {
chatName = mSelectedItem.getNickName();
}
ClassicUIUtils.startChatActivity(mSelectedItem.getId(), ContactItemBean.TYPE_C2C, chatName, "");
finish();
}
}
@@ -0,0 +1,333 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.LineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.activities.SelectionActivity;
import com.tencent.qcloud.tuikit.timcommon.component.dialog.TUIKitDialog;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ChatInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.util.ClassicUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import java.util.ArrayList;
import java.util.Arrays;
public class StartGroupChatActivity extends BaseLightActivity {
private static final String TAG = StartGroupChatActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mContactListView;
private LineControllerView mJoinType;
private ArrayList<GroupMemberInfo> mMembers = new ArrayList<>();
private int mGroupType = -1;
private boolean communitySupportTopic = false;
private int mJoinTypeIndex = 2;
private ArrayList<String> mJoinTypes = new ArrayList<>();
private ArrayList<String> mGroupTypeValue = new ArrayList<>();
private boolean mCreating;
private RecyclerView selectedList;
private StartGroupMemberSelectActivity.SelectedAdapter selectedListAdapter;
private TextView confirmButton;
private ContactPresenter presenter;
private GroupMemberInfo selfInfo;
private int limit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_popup_start_group_chat_activity);
selfInfo = new GroupMemberInfo();
selfInfo.setUserId(ContactUtils.getLoginUser());
selfInfo.setNickName(TUIConfig.getSelfNickName());
init();
}
private void init() {
limit = getIntent().getIntExtra(TUIContactConstants.Selection.LIMIT, Integer.MAX_VALUE);
String[] array = getResources().getStringArray(R.array.group_type);
mGroupTypeValue.addAll(Arrays.asList(array));
array = getResources().getStringArray(R.array.group_join_type);
mJoinTypes.addAll(Arrays.asList(array));
mTitleBar = findViewById(R.id.group_create_title_bar);
mTitleBar.setTitle(getResources().getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightIcon().setVisibility(View.GONE);
mTitleBar.setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toCreateGroupChat();
}
});
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mJoinType = findViewById(R.id.group_type_join);
mJoinType.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showJoinTypePickerView();
}
});
mJoinType.setCanNav(true);
mJoinType.setContent(mJoinTypes.get(2));
mContactListView = findViewById(R.id.group_create_member_list);
confirmButton = findViewById(R.id.confirm_button);
selectedList = findViewById(R.id.selected_list);
selectedListAdapter = new StartGroupMemberSelectActivity.SelectedAdapter();
selectedList.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
selectedList.setAdapter(selectedListAdapter);
presenter = new ContactPresenter();
presenter.setFriendListListener();
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
ArrayList<String> alreadySelectedList = new ArrayList<>();
alreadySelectedList.add(TUILogin.getLoginUser());
mContactListView.setAlreadySelectedList(alreadySelectedList);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
if (selected) {
GroupMemberInfo memberInfo = new GroupMemberInfo();
memberInfo.setUserId(contact.getId());
memberInfo.setNickName(contact.getNickName());
memberInfo.setFaceUrl(contact.getAvatarUrl());
mMembers.add(memberInfo);
} else {
for (int i = mMembers.size() - 1; i >= 0; i--) {
if (mMembers.get(i).getUserId().equals(contact.getId())) {
mMembers.remove(i);
}
}
}
selectedListAdapter.setMembers(mMembers);
selectedListAdapter.notifyDataSetChanged();
if (mMembers.size() > 0) {
confirmButton.setAlpha(1f);
confirmButton.setEnabled(true);
} else {
confirmButton.setAlpha(0.5f);
confirmButton.setEnabled(false);
}
}
});
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toCreateGroupChat();
}
});
confirmButton.setAlpha(0.5f);
confirmButton.setEnabled(false);
Intent intent = getIntent();
communitySupportTopic = intent.getBooleanExtra(TUIConstants.TUIContact.COMMUNITY_SUPPORT_TOPIC_KEY, false);
setGroupType(intent.getIntExtra(TUIConstants.TUIContact.GROUP_TYPE_KEY, TUIContactConstants.GroupType.PRIVATE));
}
public void setGroupType(int type) {
mGroupType = type;
switch (type) {
case TUIContactConstants.GroupType.PUBLIC:
mTitleBar.setTitle(getResources().getString(R.string.create_group_chat), ITitleBarLayout.Position.MIDDLE);
break;
case TUIContactConstants.GroupType.CHAT_ROOM:
mTitleBar.setTitle(getResources().getString(R.string.create_chat_room), ITitleBarLayout.Position.MIDDLE);
break;
case TUIContactConstants.GroupType.COMMUNITY:
mTitleBar.setTitle(getResources().getString(R.string.create_community), ITitleBarLayout.Position.MIDDLE);
break;
case TUIContactConstants.GroupType.PRIVATE:
default:
mTitleBar.setTitle(getResources().getString(R.string.create_private_group), ITitleBarLayout.Position.MIDDLE);
break;
}
}
private void showJoinTypePickerView() {
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, mJoinTypeIndex);
SelectionActivity.startListSelection(this, bundle, new SelectionActivity.OnResultReturnListener() {
@Override
public void onReturn(Object text) {
mJoinType.setContent(mJoinTypes.get((Integer) text));
mJoinTypeIndex = (Integer) text;
}
});
}
private void toCreateGroupChat() {
mMembers.add(0, selfInfo);
if (mMembers.size() == 1) {
ToastUtil.toastLongMessage(getResources().getString(R.string.tips_empty_group_member));
return;
}
String groupName = selfInfo.getDisplayName();
for (int i = 1; i < mMembers.size(); i++) {
groupName = groupName + "" + mMembers.get(i).getDisplayName();
}
if (groupName.length() >= 10) {
groupName = groupName.substring(0, 7) + "..";
}
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIContact.GROUP_NAME, groupName);
bundle.putInt(TUIConstants.TUIContact.JOIN_TYPE_INDEX, mJoinTypeIndex);
bundle.putSerializable(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST, mMembers);
TUICore.startActivity("CreateGroupActivity", bundle);
finish();
}
private void createGroupChat() {
if (mCreating) {
return;
}
mMembers.add(0, selfInfo);
if (mGroupType < 3 && mMembers.size() == 1) {
ToastUtil.toastLongMessage(getResources().getString(R.string.tips_empty_group_member));
return;
}
if (mGroupType > 0 && mJoinTypeIndex == -1) {
ToastUtil.toastLongMessage(getResources().getString(R.string.tips_empty_group_type));
return;
}
if (mGroupType == 0) {
mJoinTypeIndex = -1;
}
final GroupInfo groupInfo = new GroupInfo();
String groupName = selfInfo.getDisplayName();
for (int i = 1; i < mMembers.size(); i++) {
groupName = groupName + "" + mMembers.get(i).getDisplayName();
}
if (groupName.length() >= 10) {
groupName = groupName.substring(0, 7) + "..";
}
groupInfo.setChatName(groupName);
groupInfo.setGroupName(groupName);
groupInfo.setMemberDetails(mMembers);
groupInfo.setGroupType(mGroupTypeValue.get(mGroupType));
groupInfo.setJoinType(mJoinTypeIndex);
groupInfo.setCommunitySupportTopic(communitySupportTopic);
mCreating = true;
presenter.createGroupChat(groupInfo, new IUIKitCallback<String>() {
@Override
public void onSuccess(String data) {
if (!communitySupportTopic) {
ClassicUIUtils.startChatActivity(data, ChatInfo.TYPE_GROUP, groupInfo.getGroupName(), groupInfo.getGroupType());
}
finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
mCreating = false;
mMembers.remove(selfInfo);
if (errCode == TUIConstants.BuyingFeature.ERR_SDK_INTERFACE_NOT_SUPPORT || errCode == 11000) {
showNotSupportDialog();
}
ToastUtil.toastLongMessage("createGroupChat fail:" + errCode + "=" + errMsg);
}
});
}
private void showNotSupportDialog() {
String string = getResources().getString(R.string.contact_im_flagship_edition_update_tip, getString(R.string.contact_community));
String buyingGuidelines = getResources().getString(R.string.contact_buying_guidelines);
int buyingGuidelinesIndex = string.lastIndexOf(buyingGuidelines);
final int foregroundColor = getResources().getColor(TUIThemeManager.getAttrResId(this, com.tencent.qcloud.tuicore.R.attr.core_primary_color));
SpannableString spannedString = new SpannableString(string);
ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(foregroundColor);
spannedString.setSpan(colorSpan2, buyingGuidelinesIndex, buyingGuidelinesIndex + buyingGuidelines.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
ClickableSpan clickableSpan2 = new ClickableSpan() {
@Override
public void onClick(View view) {
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
openWebUrl(TUIConstants.BuyingFeature.BUYING_PRICE_DESC);
} else {
openWebUrl(TUIConstants.BuyingFeature.BUYING_PRICE_DESC_EN);
}
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannedString.setSpan(clickableSpan2, buyingGuidelinesIndex, buyingGuidelinesIndex + buyingGuidelines.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
TUIKitDialog.TUIIMUpdateDialog.getInstance()
.createDialog(this)
.setMovementMethod(LinkMovementMethod.getInstance())
.setShowOnlyDebug(true)
.setCancelable(true)
.setCancelOutside(true)
.setTitle(spannedString)
.setDialogWidth(0.75f)
.setDialogFeatureName(TUIConstants.BuyingFeature.BUYING_FEATURE_COMMUNITY)
.setPositiveButton(getString(R.string.contact_no_more_reminders),
new View.OnClickListener() {
@Override
public void onClick(View v) {
TUIKitDialog.TUIIMUpdateDialog.getInstance().dismiss();
TUIKitDialog.TUIIMUpdateDialog.getInstance().setNeverShow(true);
}
})
.setNegativeButton(getString(R.string.contact_i_know),
new View.OnClickListener() {
@Override
public void onClick(View v) {
TUIKitDialog.TUIIMUpdateDialog.getInstance().dismiss();
}
})
.show();
}
private void openWebUrl(String url) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri contentUrl = Uri.parse(url);
intent.setData(contentUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
@@ -0,0 +1,228 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
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 android.widget.ImageView;
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.TUIConstants;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
public class StartGroupMemberSelectActivity extends BaseLightActivity {
private static final String TAG = StartGroupMemberSelectActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mContactListView;
private ArrayList<GroupMemberInfo> mMembers = new ArrayList<>();
private ArrayList<String> alreadySelectedList;
private RecyclerView selectedList;
private SelectedAdapter selectedListAdapter;
private TextView confirmButton;
private ContactPresenter presenter;
private int limit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_popup_start_group_select_activity);
init();
}
private ArrayList<String> getMembersDisplayName() {
if (mMembers.isEmpty()) {
return new ArrayList<>();
}
ArrayList<String> nameCards = new ArrayList<>();
for (int i = 0; i < mMembers.size(); i++) {
nameCards.add(mMembers.get(i).getDisplayName());
}
return nameCards;
}
private ArrayList<String> getMembersUserId() {
if (mMembers.isEmpty()) {
return new ArrayList<>();
}
ArrayList<String> userIds = new ArrayList<>();
for (int i = 0; i < mMembers.size(); i++) {
userIds.add(mMembers.get(i).getUserId());
}
return userIds;
}
private void init() {
mMembers.clear();
limit = getIntent().getIntExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.MEMBER_LIMIT, Integer.MAX_VALUE);
alreadySelectedList = getIntent().getStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECTED_LIST);
mTitleBar = findViewById(R.id.group_create_title_bar);
mTitleBar.setTitle(getResources().getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
mTitleBar.getRightIcon().setVisibility(View.GONE);
mTitleBar.setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmAndFinish();
}
});
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
confirmButton = findViewById(R.id.confirm_button);
selectedList = findViewById(R.id.selected_list);
selectedListAdapter = new SelectedAdapter();
selectedList.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
selectedList.setAdapter(selectedListAdapter);
mContactListView = findViewById(R.id.group_create_member_list);
mContactListView.setAlreadySelectedList(alreadySelectedList);
presenter = new ContactPresenter();
presenter.setFriendListListener();
boolean isSelectForCall = getIntent().getBooleanExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FOR_CALL, false);
presenter.setIsForCall(isSelectForCall);
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
String groupId = getIntent().getStringExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID);
mContactListView.setGroupId(groupId);
boolean isSelectFriends = getIntent().getBooleanExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FRIENDS, false);
if (isSelectFriends) {
mTitleBar.setTitle(getString(R.string.add_group_member), TitleBarLayout.Position.MIDDLE);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
} else {
mContactListView.loadDataSource(ContactListView.DataSource.GROUP_MEMBER_LIST);
}
if (!isSelectForCall && !isSelectFriends) {
mContactListView.setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
if (position == 0) {
mMembers.clear();
Intent i = new Intent();
i.putStringArrayListExtra(
TUIContactConstants.Selection.USER_NAMECARD_SELECT, new ArrayList<String>(Arrays.asList(getString(R.string.at_all))));
i.putStringArrayListExtra(
TUIContactConstants.Selection.USER_ID_SELECT, new ArrayList<String>(Arrays.asList(TUIContactConstants.Selection.SELECT_ALL)));
setResult(3, i);
finish();
}
}
});
}
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
if (selected) {
GroupMemberInfo memberInfo = new GroupMemberInfo();
memberInfo.setUserId(contact.getId());
memberInfo.setFaceUrl(contact.getAvatarUrl());
memberInfo.setNameCard(contact.getNameCard());
memberInfo.setFriendRemark(contact.getRemark());
memberInfo.setNickName(contact.getNickName());
mMembers.add(memberInfo);
} else {
for (int i = mMembers.size() - 1; i >= 0; i--) {
if (mMembers.get(i).getUserId().equals(contact.getId())) {
mMembers.remove(i);
}
}
}
selectedListAdapter.setMembers(mMembers);
selectedListAdapter.notifyDataSetChanged();
}
});
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmAndFinish();
}
});
}
private void confirmAndFinish() {
if (mMembers.size() > limit) {
String overLimitTip = String.format(Locale.US, getString(R.string.contact_over_limit_tip), limit);
ToastUtil.toastShortMessage(overLimitTip);
return;
}
Intent i = new Intent();
List<String> friendIdList = new ArrayList<>();
for (GroupMemberInfo memberInfo : mMembers) {
friendIdList.add(memberInfo.getUserId());
}
i.putExtra(TUIContactConstants.Selection.LIST, (Serializable) friendIdList);
i.putExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.DATA_LIST, (Serializable) friendIdList);
i.putStringArrayListExtra(TUIContactConstants.Selection.USER_NAMECARD_SELECT, getMembersDisplayName());
i.putStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.USER_NAME_CARD_SELECT, getMembersDisplayName());
i.putStringArrayListExtra(TUIContactConstants.Selection.USER_ID_SELECT, getMembersUserId());
i.putStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.USER_ID_SELECT, getMembersUserId());
i.putExtras(getIntent());
setResult(3, i);
finish();
}
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.contact_forward_contact_selector_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull StartGroupMemberSelectActivity.SelectedAdapter.SelectedViewHolder holder, int position) {
GlideEngine.loadImage(holder.userIconView, mMembers.get(position).getFaceUrl());
}
@Override
public int getItemCount() {
if (mMembers == null) {
return 0;
}
return mMembers.size();
}
public class SelectedViewHolder extends RecyclerView.ViewHolder {
public ImageView userIconView;
public SelectedViewHolder(@NonNull View itemView) {
super(itemView);
userIconView = itemView.findViewById(R.id.ivAvatar);
}
}
}
}
@@ -0,0 +1,86 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.classicui.ClassicUIExtensionObserver;
import com.tencent.qcloud.tuikit.tuicontact.classicui.util.ClassicUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactLayout;
import com.tencent.qcloud.tuikit.tuicontact.classicui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.HashMap;
import java.util.Map;
public class TUIContactFragment extends Fragment {
private static final String TAG = TUIContactFragment.class.getSimpleName();
private ContactLayout mContactLayout;
private ContactPresenter presenter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View baseView = inflater.inflate(R.layout.contact_fragment, container, false);
initViews(baseView);
return baseView;
}
private void initViews(View view) {
mContactLayout = view.findViewById(R.id.contact_layout);
presenter = new ContactPresenter();
presenter.setFriendListListener();
mContactLayout.setPresenter(presenter);
mContactLayout.initDefault();
mContactLayout.getContactListView().setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
if (position == 0) {
Intent intent = new Intent(TUIContactService.getAppContext(), NewFriendActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUIContactService.getAppContext().startActivity(intent);
} else if (position == 1) {
Intent intent = new Intent(TUIContactService.getAppContext(), GroupListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUIContactService.getAppContext().startActivity(intent);
} else if (position == 2) {
Intent intent = new Intent(TUIContactService.getAppContext(), BlackListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUIContactService.getAppContext().startActivity(intent);
} else {
if (contact.isTop() && contact.getExtensionListener() != null) {
Map<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.CONTEXT, getActivity());
contact.getExtensionListener().onClicked(param);
} else {
ClassicUIUtils.showContactDetails(contact.getId());
}
}
}
});
}
public void reloadData() {
if (mContactLayout != null) {
mContactLayout.reloadData();
}
}
@Override
public void onResume() {
super.onResume();
TUIContactLog.i(TAG, "onResume");
}
}
@@ -0,0 +1,45 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.util;
import android.os.Bundle;
import android.text.TextUtils;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
public class ClassicUIUtils {
public static boolean isC2CChat(int chatType) {
return chatType == V2TIMConversation.V2TIM_C2C;
}
public static boolean isGroupChat(int chatType) {
return chatType == V2TIMConversation.V2TIM_GROUP;
}
public static void startChatActivity(String chatId, int chatType, String chatName, String groupType) {
if (TextUtils.isEmpty(chatId)) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, chatId);
bundle.putString(TUIConstants.TUIChat.CHAT_NAME, chatName);
bundle.putInt(TUIConstants.TUIChat.CHAT_TYPE, chatType);
if (isC2CChat(chatType)) {
TUICore.startActivity(TUIConstants.TUIChat.C2C_CHAT_ACTIVITY_NAME, bundle);
} else if (isGroupChat(chatType)) {
bundle.putString(TUIConstants.TUIChat.GROUP_TYPE, groupType);
TUICore.startActivity(TUIConstants.TUIChat.GROUP_CHAT_ACTIVITY_NAME, bundle);
}
}
public static void showContactDetails(String userID) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, userID);
TUICore.startActivity("FriendProfileActivity", bundle);
}
public static String getLoginUser() {
return V2TIMManager.getInstance().getLoginUser();
}
}
@@ -0,0 +1,220 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.imsdk.v2.V2TIMUserStatus;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.config.classicui.TUIContactConfigClassic;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.util.ArrayList;
import java.util.List;
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {
protected List<ContactItemBean> mData;
private ContactListView.OnSelectChangedListener mOnSelectChangedListener;
private ContactListView.OnItemClickListener mOnClickListener;
private int mPreSelectedPosition;
private boolean isSingleSelectMode;
private ContactPresenter presenter;
private boolean isGroupList = false;
private int dataSourceType = ContactListView.DataSource.UNKNOWN;
private ArrayList<String> alreadySelectedList;
public ContactAdapter(List<ContactItemBean> data) {
this.mData = data;
}
public void setPresenter(ContactPresenter presenter) {
this.presenter = presenter;
}
public void setIsGroupList(boolean groupList) {
isGroupList = groupList;
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
this.alreadySelectedList = alreadySelectedList;
}
@Override
public ContactAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ContactAdapter.ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_selecable_adapter_item, parent, false));
}
@Override
public void onBindViewHolder(final ContactAdapter.ViewHolder holder, final int position) {
final ContactItemBean contactBean = mData.get(position);
holder.tvName.setText(contactBean.getDisplayName());
if (mOnSelectChangedListener != null) {
holder.ccSelect.setVisibility(View.VISIBLE);
holder.ccSelect.setChecked(contactBean.isSelected());
}
holder.content.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!contactBean.isEnable()) {
return;
}
holder.ccSelect.setChecked(!holder.ccSelect.isChecked());
if (mOnSelectChangedListener != null) {
mOnSelectChangedListener.onSelectChanged(getItem(position), holder.ccSelect.isChecked());
}
contactBean.setSelected(holder.ccSelect.isChecked());
if (mOnClickListener != null) {
mOnClickListener.onItemClick(position, contactBean);
}
if (isSingleSelectMode && position != mPreSelectedPosition && contactBean.isSelected()) {
mData.get(mPreSelectedPosition).setSelected(false);
notifyItemChanged(mPreSelectedPosition);
}
mPreSelectedPosition = position;
}
});
holder.unreadText.setVisibility(View.GONE);
holder.userStatusView.setVisibility(View.GONE);
int radius = ScreenUtil.dip2px(4.6f);
if (TUIContactConfigClassic.getContactAvatarRadius() != TUIContactConfigClassic.UNDEFINED) {
radius = TUIContactConfigClassic.getContactAvatarRadius();
}
holder.avatar.setRadius(radius);
if (presenter.newContacts == contactBean) {
holder.avatar.setImageResource(TUIThemeManager.getAttrResId(holder.itemView.getContext(), R.attr.contact_new_friend_icon));
holder.unreadText.setText(contactBean.getUnreadCount() + "");
if (contactBean.getUnreadCount() > 0) {
holder.unreadText.setVisibility(View.VISIBLE);
} else {
holder.unreadText.setVisibility(View.GONE);
}
} else if (presenter.groupChats == contactBean) {
holder.avatar.setImageResource(TUIThemeManager.getAttrResId(holder.itemView.getContext(), R.attr.contact_group_list_icon));
} else if (presenter.blackList == contactBean) {
holder.avatar.setImageResource(TUIThemeManager.getAttrResId(holder.itemView.getContext(), R.attr.contact_black_list_icon));
} else {
if (contactBean.isTop() && contactBean.getExtensionListener() != null) {
holder.avatar.setImageResource(contactBean.getAvatarResID());
} else {
if (isGroupList) {
int defaultIconResId = TUIUtil.getDefaultGroupIconResIDByGroupType(holder.itemView.getContext(), contactBean.getGroupType());
GlideEngine.loadUserIcon(holder.avatar, contactBean.getAvatarUrl(), defaultIconResId, radius);
} else {
GlideEngine.loadUserIcon(holder.avatar, contactBean.getAvatarUrl(), radius);
}
if (dataSourceType == ContactListView.DataSource.CONTACT_LIST && TUIContactConfigClassic.isShowUserOnlineStatusIcon()) {
holder.userStatusView.setVisibility(View.VISIBLE);
if (contactBean.getStatusType() == V2TIMUserStatus.V2TIM_USER_STATUS_ONLINE) {
holder.userStatusView.setBackgroundResource(
TUIThemeManager.getAttrResId(TUIContactService.getAppContext(), com.tencent.qcloud.tuikit.timcommon.R.attr.user_status_online));
} else {
holder.userStatusView.setBackgroundResource(
TUIThemeManager.getAttrResId(TUIContactService.getAppContext(), com.tencent.qcloud.tuikit.timcommon.R.attr.user_status_offline));
}
} else {
holder.userStatusView.setVisibility(View.GONE);
}
}
}
setAlreadySelected(holder, contactBean);
}
private void setAlreadySelected(ContactAdapter.ViewHolder holder, ContactItemBean contactItemBean) {
if (alreadySelectedList != null && alreadySelectedList.contains(contactItemBean.getId())) {
holder.ccSelect.setChecked(true);
holder.itemView.setEnabled(false);
holder.ccSelect.setEnabled(false);
} else {
holder.itemView.setEnabled(true);
holder.ccSelect.setEnabled(true);
holder.ccSelect.setSelected(contactItemBean.isSelected());
}
}
@Override
public void onViewRecycled(ContactAdapter.ViewHolder holder) {
if (holder != null) {
GlideEngine.clear(holder.avatar);
holder.avatar.setImageResource(0);
}
super.onViewRecycled(holder);
}
private ContactItemBean getItem(int position) {
if (position < mData.size()) {
return mData.get(position);
}
return null;
}
@Override
public int getItemCount() {
return mData != null ? mData.size() : 0;
}
public void setDataSource(List<ContactItemBean> datas) {
this.mData = datas;
notifyDataSetChanged();
}
public void onDataChanged(ContactItemBean data) {
int index = mData.indexOf(data);
if (index != -1) {
notifyItemChanged(index);
}
}
public void setSingleSelectMode(boolean mode) {
isSingleSelectMode = mode;
}
public void setOnSelectChangedListener(ContactListView.OnSelectChangedListener selectListener) {
mOnSelectChangedListener = selectListener;
}
public void setOnItemClickListener(ContactListView.OnItemClickListener listener) {
mOnClickListener = listener;
}
public void setDataSourceType(int dataSourceType) {
this.dataSourceType = dataSourceType;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvName;
TextView unreadText;
ShadeImageView avatar;
CheckBox ccSelect;
View content;
View line;
View userStatusView;
public ViewHolder(View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tvCity);
unreadText = itemView.findViewById(R.id.conversation_unread);
unreadText.setVisibility(View.GONE);
avatar = itemView.findViewById(R.id.ivAvatar);
ccSelect = itemView.findViewById(R.id.contact_check_box);
content = itemView.findViewById(R.id.selectable_contact_item);
line = itemView.findViewById(R.id.view_line);
userStatusView = itemView.findViewById(R.id.user_status);
}
}
}
@@ -0,0 +1,65 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ILayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
public class ContactLayout extends LinearLayout implements ILayout {
private static final String TAG = ContactLayout.class.getSimpleName();
private ContactListView mContactListView;
private ContactPresenter presenter;
public ContactLayout(Context context) {
super(context);
init();
}
public ContactLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public ContactLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void setPresenter(ContactPresenter presenter) {
this.presenter = presenter;
}
private void init() {
inflate(getContext(), R.layout.contact_contact_list_layout, this);
mContactListView = findViewById(R.id.contact_listview);
}
public void initDefault() {
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
presenter.setIsClassicStyle(true);
mContactListView.loadDataSource(ContactListView.DataSource.CONTACT_LIST);
}
public void reloadData() {
mContactListView.reloadContactList();
}
public ContactListView getContactListView() {
return mContactListView;
}
@Override
public TitleBarLayout getTitleBar() {
return null;
}
@Override
public void setParentLayout(Object parent) {}
}
@@ -0,0 +1,177 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.widget.IndexBar;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.suspension.SuspensionDecoration;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.util.ArrayList;
import java.util.List;
public class ContactListView extends LinearLayout implements IContactListView {
private static final String TAG = ContactListView.class.getSimpleName();
private RecyclerView mRv;
private ContactAdapter mAdapter;
private CustomLinearLayoutManager mManager;
private List<ContactItemBean> mData = new ArrayList<>();
private SuspensionDecoration mDecoration;
private ProgressBar mContactLoadingBar;
private String groupId;
private boolean isGroupList = false;
private TextView notFoundTip;
private IndexBar mIndexBar;
private TextView mTvSideBarHint;
private ContactPresenter presenter;
public ContactListView(Context context) {
super(context);
init();
}
public ContactListView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public ContactListView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void setPresenter(ContactPresenter presenter) {
this.presenter = presenter;
if (mAdapter != null) {
mAdapter.setPresenter(presenter);
mAdapter.setIsGroupList(isGroupList);
}
}
public void setIsGroupList(boolean isGroupList) {
this.isGroupList = isGroupList;
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
mAdapter.setAlreadySelectedList(alreadySelectedList);
}
private void init() {
inflate(getContext(), R.layout.contact_list, this);
mRv = findViewById(R.id.contact_member_list);
notFoundTip = findViewById(R.id.not_found_tip);
mManager = new CustomLinearLayoutManager(getContext());
mRv.setLayoutManager(mManager);
mAdapter = new ContactAdapter(mData);
mRv.setAdapter(mAdapter);
mRv.addItemDecoration(mDecoration = new SuspensionDecoration(getContext(), mData));
mRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (lastCompletelyVisibleItemPosition == layoutManager.getItemCount() - 1) {
if (presenter.getNextSeq() > 0) {
presenter.loadGroupMemberList(groupId);
}
}
}
});
mTvSideBarHint = findViewById(R.id.contact_tvSideBarHint);
mIndexBar = findViewById(R.id.contact_indexBar);
mIndexBar.setPressedShowTextView(mTvSideBarHint).setNeedRealIndex(false).setLayoutManager(mManager);
mContactLoadingBar = findViewById(R.id.contact_loading_bar);
}
public ContactAdapter getAdapter() {
return mAdapter;
}
public void setNotFoundTip(String text) {
notFoundTip.setText(text);
}
@Override
public void onDataSourceChanged(List<ContactItemBean> data) {
if (data == null || data.isEmpty()) {
if (!TextUtils.isEmpty(notFoundTip.getText())) {
notFoundTip.setVisibility(VISIBLE);
}
} else {
notFoundTip.setVisibility(GONE);
}
mContactLoadingBar.setVisibility(GONE);
this.mData = data;
mAdapter.setDataSource(mData);
mIndexBar.setSourceDatas(mData).invalidate();
mDecoration.setDatas(mData);
}
public void setSingleSelectMode(boolean mode) {
mAdapter.setSingleSelectMode(mode);
}
public void setOnSelectChangeListener(OnSelectChangedListener selectChangeListener) {
mAdapter.setOnSelectChangedListener(selectChangeListener);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mAdapter.setOnItemClickListener(listener);
}
public void loadDataSource(int dataSource) {
if (presenter == null) {
return;
}
if (mAdapter != null) {
mAdapter.setDataSourceType(dataSource);
}
mContactLoadingBar.setVisibility(VISIBLE);
if (dataSource == ContactListView.DataSource.GROUP_MEMBER_LIST) {
presenter.loadGroupMemberList(groupId);
} else {
presenter.loadDataSource(dataSource);
}
}
public void reloadContactList() {
if (presenter != null) {
presenter.reloadContactList();
}
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
@Override
public void onDataChanged(ContactItemBean contactItemBean) {
if (mAdapter != null) {
mAdapter.onDataChanged(contactItemBean);
}
}
public interface OnSelectChangedListener {
void onSelectChanged(ContactItemBean contact, boolean selected);
}
public interface OnItemClickListener {
void onItemClick(int position, ContactItemBean contact);
}
}
@@ -0,0 +1,70 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.tuicontact.R;
import java.util.List;
public class ForwardContactSelectorAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<String> list;
private RecyclerView mRecycleView;
public ForwardContactSelectorAdapter(Context context) {
this.context = context;
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mRecycleView = recyclerView;
}
@Override
public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ContactViewHolder(LayoutInflater.from(context).inflate(R.layout.contact_forward_contact_selector_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ContactViewHolder viewHolder = (ContactViewHolder) holder;
if (viewHolder != null) {
if (!TextUtils.isEmpty(list.get(position))) {
GlideEngine.loadImage(viewHolder.userIconView, list.get(position));
}
}
}
public void setDataSource(List<String> provider) {
if (provider == null) {
if (list != null) {
list.clear();
}
} else {
list = provider;
}
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
class ContactViewHolder extends RecyclerView.ViewHolder {
public ImageView userIconView;
public ContactViewHolder(View itemView) {
super(itemView);
userIconView = itemView.findViewById(R.id.ivAvatar);
}
}
}
@@ -0,0 +1,169 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
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.imsdk.v2.V2TIMGroupApplication;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.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();
}
@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();
}
if (info.getGroupApplication().getApplicationType() == V2TIMGroupApplication.V2TIM_GROUP_INVITE_APPLICATION_NEED_APPROVED_BY_ADMIN) {
holder.memberName.setText(info.getGroupApplication().getFromUser());
holder.reason.setText(view.getResources().getString(R.string.invite) + " " + info.getGroupApplication().getToUser());
} else {
if (TextUtils.isEmpty(info.getFromUserNickName())) {
holder.memberName.setText(info.getFromUserID());
} else {
holder.memberName.setText(info.getFromUserNickName());
}
holder.reason.setText(info.getAddWording());
}
GlideEngine.loadUserIcon(holder.memberIcon, info.getFromUserFaceUrl(), ScreenUtil.dip2px(4));
if (info.getStatus() == GroupApplyInfo.UNHANDLED) {
holder.accept.setVisibility(View.VISIBLE);
holder.accept.setText(R.string.accept);
holder.accept.setBackground(TUIContactService.getAppContext().getResources().getDrawable(R.drawable.group_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(TUIContactService.getAppContext().getResources().getDrawable(R.drawable.group_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(TUIContactService.getAppContext().getResources().getDrawable(R.drawable.group_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(TUIContactService.getAppContext().getResources().getDrawable(R.drawable.group_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, null);
}
public void refuseApply(final int position, final GroupApplyInfo item) {
if (presenter == null) {
return;
}
presenter.refuseApply(item, null);
}
public interface OnItemClickListener {
void onItemClick(GroupApplyInfo info);
}
private class MyViewHolder {
private ImageView memberIcon;
private TextView memberName;
private TextView reason;
private TextView accept;
private TextView refuse;
}
}
@@ -0,0 +1,113 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import static android.app.Activity.RESULT_OK;
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.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultCaller;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupApplyDetailActivity;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupApplyPresenter;
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.putSerializable(TUIContactConstants.Group.MEMBER_APPLY, info);
TUICore.startActivityForResult(
(ActivityResultCaller) getContext(), GroupApplyDetailActivity.class, bundle, new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() != RESULT_OK || result.getData() == null) {
return;
}
GroupApplyInfo info = (GroupApplyInfo) result.getData().getSerializableExtra(TUIContactConstants.Group.MEMBER_APPLY);
if (info == null) {
return;
}
updateItemData(info);
}
});
}
});
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 void updateItemData(GroupApplyInfo info) {
mAdapter.updateItemData(info);
}
public void onDataSetChanged() {
mAdapter.notifyDataSetChanged();
}
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,226 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.os.Bundle;
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.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.PopWindowUtil;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.ThreadUtils;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuicontact.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.getFaceUrl());
holder.memberName.setText(info.getDisplayName());
if (isSelectMode) {
holder.checkBox.setVisibility(View.VISIBLE);
holder.checkBox.setChecked(info.isSelected());
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.getUserId());
selectedGroupMemberInfos.add(info);
} else {
info.setSelected(false);
selectedMember.remove(info.getUserId());
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.setPaddingRelative(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(TUIContactService.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.getUserId());
TUICore.startActivity("FriendProfileActivity", bundle);
}
});
}
setAlreadySelected(holder, info);
}
private void setAlreadySelected(GroupMemberViewHodler holder, GroupMemberInfo memberInfo) {
if (alreadySelectedList != null && alreadySelectedList.contains(memberInfo.getUserId())) {
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.getUserId())) {
continue;
}
mGroupMembers.add(groupMemberInfo);
}
}
ThreadUtils.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,146 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.graphics.Matrix;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.imsdk.v2.V2TIMGroupInfo;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.GroupMemberGridListener;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberGridAdapter extends RecyclerView.Adapter<GroupMemberGridAdapter.MyViewHolder> {
private static final int OWNER_PRIVATE_MAX_LIMIT = 8;
private static final int OWNER_PUBLIC_MAX_LIMIT = 9;
private static final int OWNER_CHATROOM_MAX_LIMIT = 9;
private static final int OWNER_COMMUNITY_MAX_LIMIT = 8;
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 final List<GroupMemberInfo> groupMembers = new ArrayList<>();
private GroupMemberGridListener groupMemberGridListener;
private GroupProfileBean groupProfileBean;
public GroupMemberInfo addItem = new GroupMemberInfo();
public GroupMemberInfo removeItem = new GroupMemberInfo();
public void setGroupMemberGridListener(GroupMemberGridListener groupMemberGridListener) {
this.groupMemberGridListener = groupMemberGridListener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_member_item_layout, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
final GroupMemberInfo groupMemberInfo = getItem(position);
GlideEngine.loadImage(holder.memberIcon, groupMemberInfo.getFaceUrl());
holder.memberName.setText(groupMemberInfo.getDisplayName());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (groupMemberGridListener != null) {
groupMemberGridListener.onGroupMemberClicked(groupMemberInfo);
}
}
});
holder.memberIcon.setBackground(null);
holder.memberIcon.setPaddingRelative(0, 0, 0, 0);
int controlPadding = ScreenUtil.dip2px(15);
if (groupMemberInfo == addItem) {
holder.memberIcon.setImageResource(R.drawable.add_group_member);
holder.memberIcon.setPaddingRelative(controlPadding, controlPadding, controlPadding, controlPadding);
holder.memberIcon.setBackgroundResource(R.drawable.bottom_action_border);
} else if (groupMemberInfo == removeItem) {
holder.memberIcon.setImageResource(R.drawable.del_group_member);
holder.memberIcon.setPaddingRelative(controlPadding, controlPadding, controlPadding, controlPadding);
holder.memberIcon.setBackgroundResource(R.drawable.bottom_action_border);
}
}
public GroupMemberInfo getItem(int i) {
return groupMembers.get(i);
}
@Override
public int getItemCount() {
return groupMembers.size();
}
public void setGroupProfileBean(GroupProfileBean groupProfileBean) {
this.groupProfileBean = groupProfileBean;
}
public void setGroupMembers(List<GroupMemberInfo> members) {
groupMembers.clear();
int shootMemberCount = 0;
if (TextUtils.equals(groupProfileBean.getGroupType(), TUIConstants.GroupType.TYPE_PRIVATE)
|| TextUtils.equals(groupProfileBean.getGroupType(), TUIConstants.GroupType.TYPE_WORK)) {
if (groupProfileBean.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(groupProfileBean.getGroupType(), TUIConstants.GroupType.TYPE_PUBLIC)) {
if (groupProfileBean.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(groupProfileBean.getGroupType(), TUIConstants.GroupType.TYPE_CHAT_ROOM)
|| TextUtils.equals(groupProfileBean.getGroupType(), TUIConstants.GroupType.TYPE_MEETING)) {
if (groupProfileBean.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(groupProfileBean.getGroupType(), TUIConstants.GroupType.TYPE_COMMUNITY)) {
if (groupProfileBean.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++) {
groupMembers.add(members.get(i));
}
if (groupProfileBean.getApproveOpt() != V2TIMGroupInfo.V2TIM_GROUP_ADD_FORBID) {
groupMembers.add(addItem);
}
if (groupProfileBean.canManage()) {
groupMembers.add(removeItem);
}
notifyDataSetChanged();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
private final ImageView memberIcon;
private final TextView memberName;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
memberIcon = itemView.findViewById(R.id.group_member_icon);
memberName = itemView.findViewById(R.id.group_member_name);
}
}
}
@@ -0,0 +1,278 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
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.tuikit.timcommon.component.BottomSelectSheet;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberLayout extends LinearLayout implements IGroupMemberLayout {
private TitleBarLayout mTitleBar;
private GroupMemberAdapter mAdapter;
private IGroupMemberListener groupMemberListener;
private GroupInfo mGroupInfo;
private RecyclerView recyclerView;
private boolean isSelectMode;
private String title;
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.getGroupMemberCount() + ")", 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) {
onGroupMemberListChanged(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) {
mAdapter.setExcludeList(excludeList);
}
public void setAlreadySelectedList(ArrayList<String> 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;
}
@Override
public void onGroupInfoChanged(GroupInfo groupInfo) {}
@Override
public void onGroupMemberListChanged(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.getGroupMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
}
private void buildPopMenu() {
if (mGroupInfo == null) {
return;
}
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);
}
BottomSelectSheet sheet = new BottomSelectSheet(getContext());
sheet.setSelectList(stringList);
sheet.setOnClickListener(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).getFaceUrl());
}
@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 = itemView.findViewById(R.id.ivAvatar);
}
}
}
public interface OnSelectChangedListener {
void onSelectChanged();
}
}
@@ -0,0 +1,155 @@
package com.tencent.qcloud.tuikit.tuicontact.classicui.widget;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.NewFriendApplicationDetailActivity;
import com.tencent.qcloud.tuikit.tuicontact.presenter.NewFriendPresenter;
import java.util.List;
public class NewFriendListAdapter extends ArrayAdapter<FriendApplicationBean> {
private static final String TAG = NewFriendListAdapter.class.getSimpleName();
private int mResourceId;
private View mView;
private ViewHolder mViewHolder;
private NewFriendPresenter presenter;
/**
* Constructor
*
* @param context The current context.
* @param resource The resource ID for a layout ic_chat_input_file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
public NewFriendListAdapter(Context context, int resource, List<FriendApplicationBean> objects) {
super(context, resource, objects);
mResourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final FriendApplicationBean data = getItem(position);
if (convertView != null) {
mView = convertView;
mViewHolder = (ViewHolder) mView.getTag();
} else {
mView = LayoutInflater.from(getContext()).inflate(mResourceId, null);
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), NewFriendApplicationDetailActivity.class);
intent.putExtra(TUIConstants.TUIContact.CONTENT, data);
getContext().startActivity(intent);
}
});
mViewHolder = new ViewHolder();
mViewHolder.avatar = mView.findViewById(R.id.avatar);
mViewHolder.name = mView.findViewById(R.id.name);
mViewHolder.des = mView.findViewById(R.id.description);
mViewHolder.agree = mView.findViewById(R.id.agree);
mViewHolder.reject = mView.findViewById(R.id.reject);
mViewHolder.result = mView.findViewById(R.id.result_tv);
mView.setTag(mViewHolder);
}
Resources res = getContext().getResources();
int radius = mView.getResources().getDimensionPixelSize(R.dimen.contact_profile_face_radius);
GlideEngine.loadUserIcon(mViewHolder.avatar, data.getFaceUrl(), radius);
mViewHolder.name.setText(TextUtils.isEmpty(data.getNickName()) ? data.getUserId() : data.getNickName());
mViewHolder.des.setText(data.getAddWording());
switch (data.getAddType()) {
case FriendApplicationBean.FRIEND_APPLICATION_COME_IN:
mViewHolder.agree.setText(res.getString(R.string.request_agree));
mViewHolder.agree.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doResponse(data, true);
}
});
mViewHolder.reject.setText(res.getString(R.string.refuse));
mViewHolder.reject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doResponse(data, false);
}
});
if (data.isAccept()) {
mViewHolder.agree.setVisibility(View.GONE);
mViewHolder.reject.setVisibility(View.GONE);
mViewHolder.result.setVisibility(View.VISIBLE);
}
break;
case FriendApplicationBean.FRIEND_APPLICATION_BOTH:
mViewHolder.agree.setText(res.getString(R.string.request_accepted));
break;
default:
break;
}
return mView;
}
private void doResponse(FriendApplicationBean bean, boolean isAccept) {
if (presenter != null) {
if (isAccept) {
presenter.acceptFriendApplication(bean, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
bean.setAccept(true);
refreshList();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage("Error code = " + errCode + ", desc = " + errMsg);
}
});
} else {
presenter.refuseFriendApplication(bean, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage("Error code = " + errCode + ", desc = " + errMsg);
}
});
}
}
}
private void refreshList() {
notifyDataSetChanged();
}
public void setPresenter(NewFriendPresenter presenter) {
this.presenter = presenter;
}
public class ViewHolder {
ImageView avatar;
TextView name;
TextView des;
TextView agree;
TextView reject;
TextView result;
}
}
@@ -0,0 +1,33 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.bean;
import android.text.TextUtils;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.suspension.ISuspensionInterface;
import java.io.Serializable;
public abstract class BaseIndexBean implements ISuspensionInterface, Serializable {
private String baseIndexTag;
public String getBaseIndexTag() {
return baseIndexTag;
}
public BaseIndexBean setBaseIndexTag(String baseIndexTag) {
this.baseIndexTag = baseIndexTag;
return this;
}
@Override
public String getSuspensionTag() {
if (TextUtils.isEmpty(baseIndexTag)) {
return "";
}
return baseIndexTag;
}
@Override
public boolean isShowSuspension() {
return true;
}
}
@@ -0,0 +1,20 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.bean;
public abstract class BaseIndexPinyinBean extends BaseIndexBean {
private String baseIndexPinyin;
public String getBaseIndexPinyin() {
return baseIndexPinyin;
}
public BaseIndexPinyinBean setBaseIndexPinyin(String baseIndexPinyin) {
this.baseIndexPinyin = baseIndexPinyin;
return this;
}
public boolean isNeedToPinyin() {
return true;
}
public abstract String getTarget();
}
@@ -0,0 +1,28 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.helper;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.bean.BaseIndexPinyinBean;
import java.util.List;
/**
* Introduction: Data-related helper classes for IndexBar
* 1 Convert Chinese to Pinyin
* 2 filling indexTag
* 3 Sort source data
* 4 According to the sorted source data -> source data of indexBar
*/
public interface IIndexBarDataHelper {
// Chinese to Pinyin
IIndexBarDataHelper convert(List<? extends BaseIndexPinyinBean> data);
// Pinyin to tag
IIndexBarDataHelper fillInexTag(List<? extends BaseIndexPinyinBean> data);
// Sort source data
IIndexBarDataHelper sortSourceDatas(List<? extends BaseIndexPinyinBean> datas);
// sort source data of indexBar, call after the method of sortSourceDatas
IIndexBarDataHelper getSortedIndexDatas(List<? extends BaseIndexPinyinBean> sourceDatas, List<String> datas);
}
@@ -0,0 +1,114 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.helper;
import android.text.TextUtils;
import com.github.promeg.pinyinhelper.Pinyin;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.bean.BaseIndexPinyinBean;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class IndexBarDataHelperImpl implements IIndexBarDataHelper {
@Override
public IIndexBarDataHelper convert(List<? extends BaseIndexPinyinBean> datas) {
if (null == datas || datas.isEmpty()) {
return this;
}
int size = datas.size();
for (int i = 0; i < size; i++) {
BaseIndexPinyinBean indexPinyinBean = datas.get(i);
StringBuilder pySb = new StringBuilder();
if (indexPinyinBean.isNeedToPinyin()) {
String target = indexPinyinBean.getTarget();
// Traverse each char of target to get its full pinyin
if (target == null) {
continue;
}
for (int i1 = 0; i1 < target.length(); i1++) {
// Convert char to Pinyin using TinyPinyin
// If char is Chinese characters, return uppercase pinyin. If c is not a Chinese character, return String.valueOf(c)
pySb.append(Pinyin.toPinyin(target.charAt(i1)).toUpperCase());
}
indexPinyinBean.setBaseIndexPinyin(pySb.toString());
} else {
// pySb.append(indexPinyinBean.getBaseIndexPinyin());
}
}
return this;
}
@Override
public IIndexBarDataHelper fillInexTag(List<? extends BaseIndexPinyinBean> datas) {
if (null == datas || datas.isEmpty()) {
return this;
}
int size = datas.size();
for (int i = 0; i < size; i++) {
BaseIndexPinyinBean indexPinyinBean = datas.get(i);
if (indexPinyinBean.isNeedToPinyin()) {
if (TextUtils.isEmpty(indexPinyinBean.getBaseIndexPinyin())) {
indexPinyinBean.setBaseIndexTag("#");
continue;
}
String tagString = indexPinyinBean.getBaseIndexPinyin().substring(0, 1);
if (tagString.matches("[A-Z]")) {
indexPinyinBean.setBaseIndexTag(tagString);
} else {
indexPinyinBean.setBaseIndexTag("#");
}
}
}
return this;
}
@Override
public IIndexBarDataHelper sortSourceDatas(List<? extends BaseIndexPinyinBean> datas) {
if (null == datas || datas.isEmpty()) {
return this;
}
convert(datas);
fillInexTag(datas);
Collections.sort(datas, new Comparator<BaseIndexPinyinBean>() {
@Override
public int compare(BaseIndexPinyinBean lhs, BaseIndexPinyinBean rhs) {
if (lhs.getBaseIndexPinyin() == null && rhs.getBaseIndexPinyin() == null) {
return 0;
} else if (lhs.getBaseIndexPinyin() == null && rhs.getBaseIndexPinyin() != null) {
return -1;
} else if (lhs.getBaseIndexPinyin() != null && rhs.getBaseIndexPinyin() == null) {
return 1;
}
if (!lhs.isNeedToPinyin()) {
return 0;
} else if (!rhs.isNeedToPinyin()) {
return 0;
} else if (lhs.getBaseIndexTag().equals("#") && !rhs.getBaseIndexTag().equals("#")) {
return 1;
} else if (!lhs.getBaseIndexTag().equals("#") && rhs.getBaseIndexTag().equals("#")) {
return -1;
} else {
return lhs.getBaseIndexPinyin().compareTo(rhs.getBaseIndexPinyin());
}
}
});
return this;
}
@Override
public IIndexBarDataHelper getSortedIndexDatas(List<? extends BaseIndexPinyinBean> sourceDatas, List<String> indexDatas) {
if (null == sourceDatas || sourceDatas.isEmpty()) {
return this;
}
int size = sourceDatas.size();
String baseIndexTag;
for (int i = 0; i < size; i++) {
baseIndexTag = sourceDatas.get(i).getBaseIndexTag();
if (!indexDatas.contains(baseIndexTag)) {
indexDatas.add(baseIndexTag);
}
}
return this;
}
}
@@ -0,0 +1,340 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import com.tencent.qcloud.tuikit.timcommon.R;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.bean.BaseIndexPinyinBean;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.helper.IIndexBarDataHelper;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.helper.IndexBarDataHelperImpl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class IndexBar extends View {
private static final String TAG = IndexBar.class.getSimpleName();
public static String[] INDEX_STRING = {
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#"};
// Whether the index data source needs to be generated based on the actual data
private boolean isNeedRealIndex;
private List<String> mIndexDatas;
private int mWidth;
private int mHeight;
private int mGapHeight;
private Paint mPaint;
// background color when finger is pressed
private int mPressedBackground;
private IIndexBarDataHelper mDataHelper;
private TextView mPressedShowTextView;
private boolean isSourceDatasAlreadySorted;
private List<? extends BaseIndexPinyinBean> mSourceDatas;
private CustomLinearLayoutManager mLayoutManager;
private int mHeaderViewCount = 0;
private OnIndexPressedListener mOnIndexPressedListener;
public IndexBar(Context context) {
this(context, null);
}
public IndexBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public IndexBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
public int getHeaderViewCount() {
return mHeaderViewCount;
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
int textSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics());
mPressedBackground = Color.BLACK;
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.IndexBar, defStyleAttr, 0);
int n = typedArray.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = typedArray.getIndex(i);
if (attr == R.styleable.IndexBar_indexBarTextSize) {
textSize = typedArray.getDimensionPixelSize(attr, textSize);
} else if (attr == R.styleable.IndexBar_indexBarPressBackground) {
mPressedBackground = typedArray.getColor(attr, mPressedBackground);
}
}
typedArray.recycle();
initIndexDatas();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setTextSize(textSize);
mPaint.setColor(0xff888888);
setOnIndexPressedListener(new OnIndexPressedListener() {
@Override
public void onIndexPressed(int index, String text) {
if (mPressedShowTextView != null) {
mPressedShowTextView.setVisibility(View.VISIBLE);
mPressedShowTextView.setText(text);
}
if (mLayoutManager != null) {
int position = getPosByTag(text);
if (position != -1) {
mLayoutManager.scrollToPositionWithOffset(position, 0);
}
}
}
@Override
public void onMotionEventEnd() {
if (mPressedShowTextView != null) {
mPressedShowTextView.setVisibility(View.GONE);
}
}
});
mDataHelper = new IndexBarDataHelperImpl();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measureWidth = 0;
int measureHeight = 0;
Rect indexBounds = new Rect();
String index;
for (int i = 0; i < mIndexDatas.size(); i++) {
index = mIndexDatas.get(i);
mPaint.getTextBounds(index, 0, index.length(), indexBounds);
measureWidth = Math.max(indexBounds.width(), measureWidth);
measureHeight = Math.max(indexBounds.height(), measureHeight);
}
int wMode = MeasureSpec.getMode(widthMeasureSpec);
measureHeight *= mIndexDatas.size();
int wSize = MeasureSpec.getSize(widthMeasureSpec);
switch (wMode) {
case MeasureSpec.EXACTLY:
measureWidth = wSize;
break;
case MeasureSpec.AT_MOST:
measureWidth = Math.min(measureWidth, wSize);
break;
case MeasureSpec.UNSPECIFIED:
break;
default:
break;
}
int hMode = MeasureSpec.getMode(heightMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
switch (hMode) {
case MeasureSpec.EXACTLY:
measureHeight = hSize;
break;
case MeasureSpec.AT_MOST:
measureHeight = Math.min(measureHeight, hSize);
break;
case MeasureSpec.UNSPECIFIED:
break;
default:
break;
}
setMeasuredDimension(measureWidth, measureHeight);
}
@Override
protected void onDraw(Canvas canvas) {
int t = getPaddingTop();
String index;
for (int i = 0; i < mIndexDatas.size(); i++) {
index = mIndexDatas.get(i);
// Get the FontMetrics of the brush, used to calculate the baseLine. Because the y coordinate of drawText represents the position of the baseLine of
// the drawn text
Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
// Calculate the baseLine value centered vertically in the index area of each grid
int baseline = (int) ((mGapHeight - fontMetrics.bottom - fontMetrics.top) / 2);
// Call drawText to center the drawing index
canvas.drawText(index, mWidth / 2 - mPaint.measureText(index) / 2, t + mGapHeight * i + baseline, mPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
setBackgroundColor(mPressedBackground);
onTouchMove(event);
break;
case MotionEvent.ACTION_MOVE:
onTouchMove(event);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
default:
setBackgroundResource(android.R.color.transparent);
if (null != mOnIndexPressedListener) {
mOnIndexPressedListener.onMotionEventEnd();
}
break;
}
return true;
}
private void onTouchMove(MotionEvent event) {
float y = event.getY();
// Determine which area the landing point is in by calculating:
int pressI = (int) ((y - getPaddingTop()) / mGapHeight);
// Boundary processing (when the finger moves, it may have moved out of the boundary to prevent crossing the boundary)
if (pressI < 0) {
pressI = 0;
} else if (pressI >= mIndexDatas.size()) {
pressI = mIndexDatas.size() - 1;
}
if (null != mOnIndexPressedListener && pressI > -1 && pressI < mIndexDatas.size()) {
mOnIndexPressedListener.onIndexPressed(pressI, mIndexDatas.get(pressI));
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
if (null == mIndexDatas || mIndexDatas.isEmpty()) {
return;
}
computeGapHeight();
}
public OnIndexPressedListener getOnIndexPressedListener() {
return mOnIndexPressedListener;
}
public void setOnIndexPressedListener(OnIndexPressedListener mOnIndexPressedListener) {
this.mOnIndexPressedListener = mOnIndexPressedListener;
}
/**
* Displays the TextView of the currently pressed index
*
* @return
*/
public IndexBar setPressedShowTextView(TextView mPressedShowTextView) {
this.mPressedShowTextView = mPressedShowTextView;
return this;
}
public IndexBar setLayoutManager(CustomLinearLayoutManager mLayoutManager) {
this.mLayoutManager = mLayoutManager;
return this;
}
/**
* Be sure to call before setting the data source {@link #setSourceDatas(List)}
*
* @param needRealIndex
* @return
*/
public IndexBar setNeedRealIndex(boolean needRealIndex) {
isNeedRealIndex = needRealIndex;
initIndexDatas();
return this;
}
private void initIndexDatas() {
if (isNeedRealIndex) {
mIndexDatas = new ArrayList<>();
} else {
mIndexDatas = Arrays.asList(INDEX_STRING);
}
}
public IndexBar setSourceDatas(List<? extends BaseIndexPinyinBean> mSourceDatas) {
this.mSourceDatas = mSourceDatas;
initSourceDatas();
return this;
}
/**
* Initialize the original data source and take out the index data source
*
* @return
*/
private void initSourceDatas() {
if (null == mSourceDatas || mSourceDatas.isEmpty()) {
return;
}
if (!isSourceDatasAlreadySorted) {
mDataHelper.sortSourceDatas(mSourceDatas);
} else {
mDataHelper.convert(mSourceDatas);
mDataHelper.fillInexTag(mSourceDatas);
}
if (isNeedRealIndex) {
mDataHelper.getSortedIndexDatas(mSourceDatas, mIndexDatas);
computeGapHeight();
}
// sortData();
}
/**
* Called when:
* 1 change in data source
* 2 When the control size changes
* Calculate gapHeight
*/
private void computeGapHeight() {
mGapHeight = (mHeight - getPaddingTop() - getPaddingBottom()) / mIndexDatas.size();
}
private int getPosByTag(String tag) {
if (null == mSourceDatas || mSourceDatas.isEmpty()) {
return -1;
}
if (TextUtils.isEmpty(tag)) {
return -1;
}
for (int i = 0; i < mSourceDatas.size(); i++) {
if (tag.equals(mSourceDatas.get(i).getBaseIndexTag())) {
return i + getHeaderViewCount();
}
}
return -1;
}
public interface OnIndexPressedListener {
void onIndexPressed(int index, String text);
void onMotionEventEnd();
}
}
@@ -0,0 +1,10 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.suspension;
public interface ISuspensionInterface {
// Whether to display the hover title
boolean isShowSuspension();
// hover title
String getSuspensionTag();
}
@@ -0,0 +1,220 @@
package com.tencent.qcloud.tuikit.tuicontact.component.indexlib.suspension;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.TypedValue;
import android.view.View;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuikit.timcommon.util.LayoutUtil;
import java.util.List;
public class SuspensionDecoration extends RecyclerView.ItemDecoration {
private static final String TAG = SuspensionDecoration.class.getSimpleName();
private static int COLOR_TITLE_BG = Color.parseColor("#FFF2F3F5");
private static int COLOR_TITLE_BOTTOM_LINE = Color.parseColor("#FFCACACA");
private static int COLOR_TITLE_FONT = Color.parseColor("#FF888888");
private int mTitleFontSize;
private List<? extends ISuspensionInterface> mDatas;
private Paint mPaint;
private Rect mBounds;
private int mTitleHeight;
private boolean isShowLine = true;
private int mHeaderViewCount = 0;
public SuspensionDecoration(Context context, List<? extends ISuspensionInterface> datas) {
super();
mDatas = datas;
mPaint = new Paint();
mBounds = new Rect();
mTitleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 33f, context.getResources().getDisplayMetrics());
mTitleFontSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 13f, context.getResources().getDisplayMetrics());
mPaint.setTextSize(mTitleFontSize);
mPaint.setAntiAlias(true);
}
public SuspensionDecoration setTitleHeight(int mTitleHeight) {
this.mTitleHeight = mTitleHeight;
return this;
}
public SuspensionDecoration setShowLine(boolean isShowLine) {
this.isShowLine = isShowLine;
return this;
}
public SuspensionDecoration setColorTitleBg(int colorTitleBg) {
COLOR_TITLE_BG = colorTitleBg;
return this;
}
public SuspensionDecoration setColorTitleFont(int colorTitleFont) {
COLOR_TITLE_FONT = colorTitleFont;
return this;
}
public SuspensionDecoration setTitleFontSize(int mTitleFontSize) {
mPaint.setTextSize(mTitleFontSize);
return this;
}
public SuspensionDecoration setDatas(List<? extends ISuspensionInterface> mDatas) {
this.mDatas = mDatas;
return this;
}
public int getHeaderViewCount() {
return mHeaderViewCount;
}
public SuspensionDecoration setHeaderViewCount(int headerViewCount) {
mHeaderViewCount = headerViewCount;
return this;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int position = params.getViewLayoutPosition();
position -= getHeaderViewCount();
if (mDatas == null || mDatas.isEmpty() || position > mDatas.size() - 1 || position < 0 || !mDatas.get(position).isShowSuspension()) {
continue;
}
if (position > -1) {
if (position == 0) {
drawTitleArea(c, left, right, child, params, position);
} else {
if (null != mDatas.get(position).getSuspensionTag()
&& !mDatas.get(position).getSuspensionTag().equals(mDatas.get(position - 1).getSuspensionTag())) {
drawTitleArea(c, left, right, child, params, position);
} else {
// none
}
}
}
}
}
/**
* How to draw the background and text of the Title area
*
* @param c
* @param left
* @param right
* @param child
* @param params
* @param position
*/
private void drawTitleArea(Canvas c, int left, int right, View child, RecyclerView.LayoutParams params,
int position) {
mPaint.setColor(COLOR_TITLE_BG);
c.drawRect(left, child.getTop() - params.topMargin - mTitleHeight, right, child.getTop() - params.topMargin, mPaint);
if (isShowLine) {
mPaint.setColor(COLOR_TITLE_BOTTOM_LINE);
c.drawRect(left, child.getTop() - params.topMargin - 1, right, child.getTop() - params.topMargin, mPaint);
}
mPaint.setColor(COLOR_TITLE_FONT);
mPaint.getTextBounds(mDatas.get(position).getSuspensionTag(), 0, mDatas.get(position).getSuspensionTag().length(), mBounds);
int x = child.getPaddingLeft() + 61;
int y = child.getTop() - params.topMargin - (mTitleHeight / 2 - mBounds.height() / 2);
if (LayoutUtil.isRTL()) {
x = child.getWidth() - child.getPaddingRight() - mBounds.width() - 61;
}
c.drawText(mDatas.get(position).getSuspensionTag(), x, y, mPaint);
}
@Override public void onDrawOver(Canvas c, final RecyclerView parent, RecyclerView.State state) {
int pos = ((LinearLayoutManager) (parent.getLayoutManager())).findFirstVisibleItemPosition();
pos -= getHeaderViewCount();
if (mDatas == null || mDatas.isEmpty() || pos > mDatas.size() - 1 || pos < 0 || !mDatas.get(pos).isShowSuspension()) {
return;
}
String tag = mDatas.get(pos).getSuspensionTag();
// View child = parent.getChildAt(pos);
View child = parent.findViewHolderForLayoutPosition(pos + getHeaderViewCount()).itemView;
boolean flag = false;
if ((pos + 1) < mDatas.size()) {
if (null != tag && !tag.equals(mDatas.get(pos + 1).getSuspensionTag())) {
// The tag of the current first visible item is not equal to the tag of the next item, indicating that the floating View is about to be
// switched.
// TUIKitLog.d(TAG, "onDrawOver() called with: c = [" + child.getTop());
if (child.getHeight() + child.getTop() < mTitleHeight) {
// When the remaining height of the first visible item on the screen is less than the height of the title area, we should also start to do
// the "swap animation" of the floating Title
c.save();
flag = true;
// parent.getRight() - parent.getPaddingRight(), parent.getPaddingTop() + child.getHeight() + child.getTop());
// Similar to Ele.me ordering, the hover head of the product list switches the "animation effect"
// When sliding up, move the canvas up (y is a negative number), so the Rect and Text drawn by the canvas are moved up, and there is a kind
// of "animation" feeling of switching
c.translate(0, child.getHeight() + child.getTop() - mTitleHeight);
}
}
}
mPaint.setColor(COLOR_TITLE_BG);
c.drawRect(
parent.getPaddingLeft(), parent.getPaddingTop(), parent.getRight() - parent.getPaddingRight(), parent.getPaddingTop() + mTitleHeight, mPaint);
mPaint.setColor(COLOR_TITLE_FONT);
mPaint.getTextBounds(tag, 0, tag.length(), mBounds);
int x = child.getPaddingLeft() + 61;
int y = parent.getPaddingTop() + mTitleHeight - (mTitleHeight / 2 - mBounds.height() / 2);
if (LayoutUtil.isRTL()) {
x = child.getWidth() - child.getPaddingRight() - mBounds.width() - 61;
}
c.drawText(tag, x, y, mPaint);
if (flag) {
c.restore();
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
position -= getHeaderViewCount();
if (mDatas == null || mDatas.isEmpty() || position > mDatas.size() - 1) {
return;
}
if (position > -1) {
ISuspensionInterface titleCategoryInterface = mDatas.get(position);
if (titleCategoryInterface.isShowSuspension()) {
if (position == 0) {
outRect.set(0, mTitleHeight, 0, 0);
} else {
if (null != titleCategoryInterface.getSuspensionTag()
&& !titleCategoryInterface.getSuspensionTag().equals(mDatas.get(position - 1).getSuspensionTag())) {
outRect.set(0, mTitleHeight, 0, 0);
}
}
}
}
}
}
@@ -0,0 +1,23 @@
package com.tencent.qcloud.tuikit.tuicontact.config;
public class TUIContactConfig {
public static final String TAG = TUIContactConfig.class.getSimpleName();
private static TUIContactConfig instance;
private boolean isShowUserStatus;
public static TUIContactConfig getInstance() {
if (instance == null) {
instance = new TUIContactConfig();
}
return instance;
}
public boolean isShowUserStatus() {
return isShowUserStatus;
}
public void setShowUserStatus(boolean showUserStatus) {
isShowUserStatus = showUserStatus;
}
}
@@ -0,0 +1,169 @@
package com.tencent.qcloud.tuikit.tuicontact.config.classicui;
import androidx.annotation.IntDef;
import com.tencent.qcloud.tuikit.tuicontact.config.TUIContactConfig;
public class TUIContactConfigClassic {
private TUIContactConfigClassic() {}
private static final class TUIContactConfigClassicHolder {
private static final TUIContactConfigClassic INSTANCE = new TUIContactConfigClassic();
}
private static TUIContactConfigClassic getInstance() {
return TUIContactConfigClassicHolder.INSTANCE;
}
public static final int UNDEFINED = -1;
public static final int ALIAS = 1;
public static final int MUTE_AND_PIN = 2;
public static final int BACKGROUND = 3;
public static final int BLOCK = 4;
public static final int CLEAR_CHAT_HISTORY = 5;
public static final int DELETE = 6;
public static final int ADD_FRIEND = 7;
@IntDef({ALIAS, MUTE_AND_PIN, BACKGROUND, BLOCK, CLEAR_CHAT_HISTORY, DELETE, ADD_FRIEND})
private @interface Items {}
private boolean showAlias = true;
private boolean showMuteAndPin = true;
private boolean showBackground = true;
private boolean showBlock = true;
private boolean showClearChatHistory = true;
private boolean showDelete = true;
private boolean showAddFriend = true;
private int contactListAvatarRadius = UNDEFINED;
/**
* Hide items in contact config interface.
* @param items
*/
public static void hideItemsInContactConfig(@Items int... items) {
for (int itemType : items) {
switch (itemType) {
case ALIAS: {
getInstance().showAlias = false;
break;
}
case MUTE_AND_PIN: {
getInstance().showMuteAndPin = false;
break;
}
case BACKGROUND: {
getInstance().showBackground = false;
break;
}
case BLOCK: {
getInstance().showBlock = false;
break;
}
case CLEAR_CHAT_HISTORY: {
getInstance().showClearChatHistory = false;
break;
}
case DELETE: {
getInstance().showDelete = false;
break;
}
case ADD_FRIEND: {
getInstance().showAddFriend = false;
break;
}
default: {
break;
}
}
}
}
/**
* Get whether to show alias setting.
* @return
*/
public static boolean isShowAlias() {
return getInstance().showAlias;
}
/**
* Get whether to show mute and pin setting.
* @return
*/
public static boolean isShowMuteAndPin() {
return getInstance().showMuteAndPin;
}
/**
* Get whether to show the chat background setting.
* @return
*/
public static boolean isShowBackground() {
return getInstance().showBackground;
}
/**
* Get whether to show block setting.
* @return
*/
public static boolean isShowBlock() {
return getInstance().showBlock;
}
/**
* Get whether to show clear chat history button.
* @return
*/
public static boolean isShowClearChatHistory() {
return getInstance().showClearChatHistory;
}
/**
* Get whether to show delete button.
* @return
*/
public static boolean isShowDelete() {
return getInstance().showDelete;
}
/**
* Get whether to show add friend button.
* @return
*/
public static boolean isShowAddFriend() {
return getInstance().showAddFriend;
}
/**
* Set whether to show user online status icon.
* @param showUserOnlineStatusIcon
*/
public static void setShowUserOnlineStatusIcon(boolean showUserOnlineStatusIcon) {
TUIContactConfig.getInstance().setShowUserStatus(showUserOnlineStatusIcon);
}
/**
* Get whether to show user online status icon.
* @return
*/
public static boolean isShowUserOnlineStatusIcon() {
return TUIContactConfig.getInstance().isShowUserStatus();
}
/**
* Set the radius of the avatar in the contact list.
* @param avatarRadius
*/
public static void setContactListAvatarRadius(int avatarRadius) {
getInstance().contactListAvatarRadius = avatarRadius;
}
/**
* Get the radius of the avatar in the contact list.
* @return
*/
public static int getContactAvatarRadius() {
return getInstance().contactListAvatarRadius;
}
}
@@ -0,0 +1,169 @@
package com.tencent.qcloud.tuikit.tuicontact.config.minimalistui;
import androidx.annotation.IntDef;
import com.tencent.qcloud.tuikit.tuicontact.config.TUIContactConfig;
public class TUIContactConfigMinimalist {
private TUIContactConfigMinimalist() {}
private static final class TUIContactConfigMinimalistHolder {
private static final TUIContactConfigMinimalist INSTANCE = new TUIContactConfigMinimalist();
}
private static TUIContactConfigMinimalist getInstance() {
return TUIContactConfigMinimalistHolder.INSTANCE;
}
public static final int UNDEFINED = -1;
public static final int ALIAS = 1;
public static final int MUTE_AND_PIN = 2;
public static final int BACKGROUND = 3;
public static final int BLOCK = 4;
public static final int CLEAR_CHAT_HISTORY = 5;
public static final int DELETE = 6;
public static final int ADD_FRIEND = 7;
@IntDef({ALIAS, MUTE_AND_PIN, BACKGROUND, BLOCK, CLEAR_CHAT_HISTORY, DELETE, ADD_FRIEND})
private @interface Items {}
private boolean showAlias = true;
private boolean showMuteAndPin = true;
private boolean showBackground = true;
private boolean showBlock = true;
private boolean showClearChatHistory = true;
private boolean showDelete = true;
private boolean showAddFriend = true;
private int contactListAvatarRadius = UNDEFINED;
/**
* Hide items in contact config interface.
* @param items
*/
public static void hideItemsInContactConfig(@Items int... items) {
for (int itemType : items) {
switch (itemType) {
case ALIAS: {
getInstance().showAlias = false;
break;
}
case MUTE_AND_PIN: {
getInstance().showMuteAndPin = false;
break;
}
case BACKGROUND: {
getInstance().showBackground = false;
break;
}
case BLOCK: {
getInstance().showBlock = false;
break;
}
case CLEAR_CHAT_HISTORY: {
getInstance().showClearChatHistory = false;
break;
}
case DELETE: {
getInstance().showDelete = false;
break;
}
case ADD_FRIEND: {
getInstance().showAddFriend = false;
break;
}
default: {
break;
}
}
}
}
/**
* Get whether to show alias setting.
* @return
*/
public static boolean isShowAlias() {
return getInstance().showAlias;
}
/**
* Get whether to show mute and pin setting.
* @return
*/
public static boolean isShowMuteAndPin() {
return getInstance().showMuteAndPin;
}
/**
* Get whether to show the chat background setting.
* @return
*/
public static boolean isShowBackground() {
return getInstance().showBackground;
}
/**
* Get whether to show block setting.
* @return
*/
public static boolean isShowBlock() {
return getInstance().showBlock;
}
/**
* Get whether to show clear chat history button.
* @return
*/
public static boolean isShowClearChatHistory() {
return getInstance().showClearChatHistory;
}
/**
* Get whether to show delete button.
* @return
*/
public static boolean isShowDelete() {
return getInstance().showDelete;
}
/**
* Get whether to show add friend button.
* @return
*/
public static boolean isShowAddFriend() {
return getInstance().showAddFriend;
}
/**
* Set whether to show user online status icon.
* @param showUserOnlineStatusIcon
*/
public static void setShowUserOnlineStatusIcon(boolean showUserOnlineStatusIcon) {
TUIContactConfig.getInstance().setShowUserStatus(showUserOnlineStatusIcon);
}
/**
* Get whether to show user online status icon.
* @return
*/
public static boolean isShowUserOnlineStatusIcon() {
return TUIContactConfig.getInstance().isShowUserStatus();
}
/**
* Set the radius of the avatar in the contact list.
* @param avatarRadius
*/
public static void setContactListAvatarRadius(int avatarRadius) {
getInstance().contactListAvatarRadius = avatarRadius;
}
/**
* Get the radius of the avatar in the contact list.
* @return
*/
public static int getContactAvatarRadius() {
return getInstance().contactListAvatarRadius;
}
}
@@ -0,0 +1,69 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.imsdk.v2.V2TIMUserStatus;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import java.util.List;
public abstract class ContactEventListener {
/**
* New friend request notification. You will receive this callback in the following cases:
* 1. You send a friend request to others.
* 2. You receive a friend request from others.
*/
public void onFriendApplicationListAdded(List<FriendApplicationBean> applicationList) {}
/**
* Friend request deletion notification. You will receive this callback in the following cases:
* 1. You call deleteFriendApplication to proactively delete a friend request.
* 2. You call refuseFriendApplication to reject a friend request.
* 3. You call acceptFriendApplication to accept a friend request and the acceptance type is V2TIM_FRIEND_ACCEPT_AGREE.
* 4. Your friend request is rejected by others.
*/
public void onFriendApplicationListDeleted(List<String> userIDList) {}
/**
* Friend request read notification. When you call setFriendApplicationRead to set the friend request list as read, you will receive this callback (mainly
* used for multi-device synchronization).
*/
public void onFriendApplicationListRead() {}
/**
* New friend notification
*/
public void onFriendListAdded(List<ContactItemBean> users) {}
/**
* Friend deletion notification. You will receive this callback in the following cases:
* 1. You delete a friend (received for one-way or two-way friend deletion).
* 2. You are deleted by a friend (received for two-way friend deletion).
*/
public void onFriendListDeleted(List<String> userList) {}
/**
* New blocklist notification
*/
public void onBlackListAdd(List<ContactItemBean> infoList) {}
/**
* Blocklist deletion notification
*/
public void onBlackListDeleted(List<String> userList) {}
/**
* Friend profile update notification
*/
public void onFriendInfoChanged(List<ContactItemBean> infoList) {}
/**
* Friend Remark update notification
*/
public void onFriendRemarkChanged(String id, String remark) {}
/**
* User status update notification
*/
public void onUserStatusChanged(List<V2TIMUserStatus> userStatusList){}
public void refreshUserStatusFragmentUI() {}
}
@@ -0,0 +1,7 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
public abstract class GroupEventListener {
public void onGroupInfoChanged(String groupID) {}
public void onGroupMemberCountChanged(String groupID) {}
}
@@ -0,0 +1,7 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
public interface GroupMemberGridListener {
void onGroupMemberClicked(GroupMemberInfo groupMemberBean);
}
@@ -0,0 +1,11 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import java.util.List;
public interface GroupMemberListener {
default void onGroupMemberLoaded(List<GroupMemberInfo> groupMemberBeanList) {}
}
@@ -0,0 +1,7 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
public interface IAddMoreActivity {
String getString(int resId);
void finish();
}
@@ -0,0 +1,20 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import java.util.List;
public interface IContactListView {
class DataSource {
public static final int UNKNOWN = -1;
public static final int FRIEND_LIST = 1;
public static final int BLACK_LIST = 2;
public static final int GROUP_LIST = 3;
public static final int CONTACT_LIST = 4;
public static final int GROUP_MEMBER_LIST = 5;
}
void onDataSourceChanged(List<ContactItemBean> contactItemBeanList);
void onDataChanged(ContactItemBean contactItemBean);
}
@@ -0,0 +1,7 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
public interface IFriendProfileLayout {
void onDataSourceChanged(ContactItemBean bean);
}
@@ -0,0 +1,17 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import android.content.Context;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import java.util.List;
public interface IGroupApplyLayout {
default void onGroupApplyInfoListChanged(List<GroupApplyInfo> dataSource) {}
default void onDataSetChanged() {}
default Context getContext() {
return null;
}
}
@@ -0,0 +1,8 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
public interface IGroupMemberChangedCallback {
void onMemberRemoved(GroupMemberInfo memberInfo);
}
@@ -0,0 +1,10 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ILayout;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
public interface IGroupMemberLayout extends ILayout {
void onGroupInfoChanged(GroupInfo dataSource);
void onGroupMemberListChanged(GroupInfo dataSource);
}
@@ -0,0 +1,15 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import java.util.ArrayList;
public interface IGroupMemberListener {
default void forwardAddMember(GroupInfo info) {}
default void forwardDeleteMember(GroupInfo info) {}
default void setSelectedMember(ArrayList<String> members) {}
}
@@ -0,0 +1,9 @@
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import java.util.List;
public interface INewFriendActivity {
void onDataSourceChanged(List<FriendApplicationBean> beanList);
}
@@ -0,0 +1,158 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.activity.result.ActivityResultCaller;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.imsdk.v2.V2TIMGroupInfo;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import com.tencent.qcloud.tuikit.timcommon.component.MinimalistLineControllerView;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.GroupMemberActivity;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.GroupMemberListener;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupMemberMinimalistActivity;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.StartGroupMemberSelectMinimalistActivity;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.GroupInfoAdapter;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupMemberPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.List;
public class GroupMemberListProxy {
private static final String TAG = "GroupMemberListProxy";
private final GroupMemberPresenter groupMemberPresenter = new GroupMemberPresenter();
private MinimalistLineControllerView addMemberButton;
public void raiseExtension(View parentView, GroupProfileBean groupProfileBean) {
View view = LayoutInflater.from(parentView.getContext()).inflate(R.layout.contact_minimalist_group_member_list, null);
addMemberButton = view.findViewById(R.id.add_group_members);
addMemberButton.setNameColor(0xFF0365F9);
addMemberButton.setBackgroundColor(0xF0F9F9F9);
RecyclerView recyclerView = view.findViewById(R.id.group_members);
LinearLayoutManager layoutManager = new LinearLayoutManager(parentView.getContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setBackgroundResource(com.tencent.qcloud.tuikit.timcommon.R.color.white);
recyclerView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
groupMemberPresenter.registerListener();
}
@Override
public void onViewDetachedFromWindow(View v) {
groupMemberPresenter.unregisterListener();
}
});
GroupInfoAdapter adapter = new GroupInfoAdapter();
adapter.setGroupProfileBean(groupProfileBean);
recyclerView.setAdapter(adapter);
((ViewGroup) parentView).addView(view);
groupMemberPresenter.setGroupID(groupProfileBean.getGroupID());
groupMemberPresenter.setGroupMemberListener(new GroupMemberListener() {
@Override
public void onGroupMemberLoaded(List<GroupMemberInfo> groupMemberBeanList) {
if (!groupMemberBeanList.isEmpty()) {
parentView.setVisibility(View.VISIBLE);
}
setAddMemberButtonVisibility(groupProfileBean);
adapter.setMemberList(groupMemberBeanList);
}
});
adapter.setGroupMemberGridListener(this::openDetails);
addMemberButton.setOnClickListener(v -> {
FragmentActivity activity = (FragmentActivity) parentView.getContext();
addGroupMember(activity, groupProfileBean);
});
groupMemberPresenter.loadGroupMemberList();
}
private void setAddMemberButtonVisibility(GroupProfileBean groupProfileBean) {
if (groupProfileBean.getApproveOpt() != V2TIMGroupInfo.V2TIM_GROUP_ADD_FORBID) {
addMemberButton.setVisibility(View.VISIBLE);
} else {
addMemberButton.setVisibility(View.GONE);
}
}
private void addGroupMember(FragmentActivity activity, GroupProfileBean groupProfileBean) {
groupMemberPresenter.getFriendListInGroup(groupProfileBean.getGroupID(), new TUIValueCallback<List<UserBean>>() {
@Override
public void onSuccess(List<UserBean> userBeans) {
addGroupMember(activity, groupProfileBean.getGroupID(), userBeans);
}
@Override
public void onError(int errorCode, String errorMessage) {
TUIContactLog.e(TAG, "add group member error, errorCode: " + errorCode + ", errorMessage: " + errorMessage);
addGroupMember(activity, groupProfileBean.getGroupID(), null);
}
});
}
private void addGroupMember(ActivityResultCaller caller, String groupID, List<UserBean> friendsInGroup) {
Bundle param = new Bundle();
param.putString(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID, groupID);
param.putBoolean(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FRIENDS, true);
ArrayList<String> selectedList = new ArrayList<>();
if (friendsInGroup != null) {
for (UserBean userBean : friendsInGroup) {
selectedList.add(userBean.getUserId());
}
}
param.putStringArrayList(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECTED_LIST, selectedList);
TUICore.startActivityForResult(caller, StartGroupMemberSelectMinimalistActivity.class, param, result -> {
if (result != null && result.getData() != null) {
List<String> friends = (List<String>) result.getData().getSerializableExtra(TUIContactConstants.Selection.LIST);
groupMemberPresenter.inviteGroupMembers(groupID, friends);
}
});
}
private void openDetails(GroupMemberInfo groupMemberBean) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, groupMemberBean.getUserId());
TUICore.startActivity("FriendProfileMinimalistActivity", bundle);
}
public void transferGroupOwner(ActivityResultCaller caller, GroupProfileBean groupProfileBean) {
ArrayList<String> excludeList = new ArrayList<>();
excludeList.add(TUILogin.getLoginUser());
Bundle param = new Bundle();
param.putBoolean(TUIConstants.TUIContact.IS_SELECT_MODE, true);
param.putString(TUIConstants.TUIContact.GROUP_ID, groupProfileBean.getGroupID());
param.putInt(TUIConstants.TUIContact.LIMIT, 1);
param.putStringArrayList(TUIConstants.TUIContact.EXCLUDE_LIST, excludeList);
param.putString(TUIConstants.TUIContact.TITLE, TUIContactService.getAppContext().getResources().getString(R.string.group_transfer_group_owner));
TUICore.startActivityForResult(caller, GroupMemberMinimalistActivity.class, param, result -> {
if (result.getData() != null) {
List<String> selectedList = result.getData().getStringArrayListExtra(TUIContactConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
String newOwnerId = selectedList.get(0);
groupMemberPresenter.transferGroupOwner(groupProfileBean.getGroupID(), newOwnerId);
}
}
});
}
}
@@ -0,0 +1,115 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui;
import static com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants.GROUP_PROFILE_BEAN;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.activity.result.ActivityResultCaller;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import com.google.auto.service.AutoService;
import com.tencent.qcloud.tuicore.ServiceInitializer;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.annotations.TUIInitializerDependency;
import com.tencent.qcloud.tuicore.annotations.TUIInitializerID;
import com.tencent.qcloud.tuicore.interfaces.ITUIExtension;
import com.tencent.qcloud.tuicore.interfaces.ITUIService;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionEventListener;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionInfo;
import com.tencent.qcloud.tuicore.interfaces.TUIInitializer;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.AddMoreDetailMinimalistDialogFragment;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.ManageGroupMinimalistActivity;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@AutoService(TUIInitializer.class)
@TUIInitializerID("TUIContactMinimalistUIExtensionObserver")
@TUIInitializerDependency("TUIContact")
public class MinimalistUIExtensionObserver implements TUIInitializer, ITUIExtension, ITUIService {
@Override
public void init(Context context) {
TUICore.registerExtension(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.EXTENSION_ID, this);
TUICore.registerExtension(TUIConstants.TUIChat.Extension.GroupProfileMemberListExtension.EXTENSION_ID, this);
TUICore.registerExtension(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.EXTENSION_ID, this);
TUICore.registerService(TUIConstants.TUIContact.MINIMALIST_SERVICE_NAME, this);
}
@Override
public Object onCall(String method, Map<String, Object> param) {
if (TextUtils.equals(method, TUIConstants.TUIContact.Method.AddFriend.METHOD_NAME)) {
String userID = (String) param.get(TUIConstants.TUIContact.Method.AddFriend.USER_ID);
FragmentActivity activity = (FragmentActivity) param.get(TUIConstants.TUIContact.Method.AddFriend.ACTIVITY);
AddMoreDetailMinimalistDialogFragment dialogFragment = new AddMoreDetailMinimalistDialogFragment();
dialogFragment.setUserID(userID);
dialogFragment.show(activity.getSupportFragmentManager(), "AddMoreDetailMinimalistDialogFragment");
}
return null;
}
@Override
public List<TUIExtensionInfo> onGetExtension(String extensionID, Map<String, Object> param) {
if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.EXTENSION_ID)) {
GroupProfileBean groupProfileBean =
(GroupProfileBean) param.get(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.GROUP_PROFILE_BEAN);
int viewType = (int) param.get(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.VIEW_TYPE);
if (viewType != TUIConstants.TUIChat.VIEW_TYPE_CLASSIC && groupProfileBean.canManage()) {
TUIExtensionInfo extensionInfo = new TUIExtensionInfo();
extensionInfo.setText(getAppContext().getString(R.string.group_manager));
extensionInfo.setExtensionListener(new TUIExtensionEventListener() {
@Override
public void onClicked(Map<String, Object> param) {
Intent intent = new Intent(getAppContext(), ManageGroupMinimalistActivity.class);
intent.putExtra(GROUP_PROFILE_BEAN, groupProfileBean);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getAppContext().startActivity(intent);
}
});
return Collections.singletonList(extensionInfo);
}
} else if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.EXTENSION_ID)) {
GroupProfileBean groupProfileBean = (GroupProfileBean) param.get(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.GROUP_PROFILE_BEAN);
int viewType = (int) param.get(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.VIEW_TYPE);
ActivityResultCaller caller = (ActivityResultCaller) param.get(TUIConstants.TUIChat.Extension.GroupProfileBottomItemExtension.CALLER);
if (viewType != TUIConstants.TUIChat.VIEW_TYPE_CLASSIC && groupProfileBean.isOwner()) {
TUIExtensionInfo extensionInfo = new TUIExtensionInfo();
extensionInfo.setText(getAppContext().getString(R.string.group_transfer_group_owner));
extensionInfo.setExtensionListener(new TUIExtensionEventListener() {
@Override
public void onClicked(Map<String, Object> param) {
GroupMemberListProxy proxy = new GroupMemberListProxy();
proxy.transferGroupOwner(caller, groupProfileBean);
}
});
return Collections.singletonList(extensionInfo);
}
}
return null;
}
@Override
public boolean onRaiseExtension(String extensionID, View parentView, Map<String, Object> param) {
if (TextUtils.equals(extensionID, TUIConstants.TUIChat.Extension.GroupProfileMemberListExtension.EXTENSION_ID)) {
int viewType = (int) param.get(TUIConstants.TUIChat.Extension.GroupProfileSettingsItemExtension.VIEW_TYPE);
if (viewType == TUIConstants.TUIChat.VIEW_TYPE_CLASSIC) {
return false;
}
GroupProfileBean groupProfileBean = (GroupProfileBean) param.get(TUIConstants.TUIChat.Extension.GroupProfileMemberListExtension.GROUP_PROFILE_BEAN);
GroupMemberListProxy proxy = new GroupMemberListProxy();
proxy.raiseExtension(parentView, groupProfileBean);
}
return true;
}
public static Context getAppContext() {
return ServiceInitializer.getAppContext();
}
}
@@ -0,0 +1,8 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.interfaces;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ILayout;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
public interface IContactLayout extends ILayout {
ContactListView getContactListView();
}
@@ -0,0 +1,236 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Pair;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUICallback;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.MinimalistLineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.PopupInputCard;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IAddMoreActivity;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactToast;
import com.tencent.qcloud.tuikit.tuicontact.presenter.AddMorePresenter;
import com.tencent.qcloud.tuikit.tuicontact.presenter.FriendProfilePresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
public class AddMoreDetailMinimalistDialogFragment extends DialogFragment implements IAddMoreActivity {
private static final String TAG = "AddMoreDetailMinimalist";
private BottomSheetDialog dialog;
private View detailArea;
private ShadeImageView faceImgView;
private TextView idTextView;
private TextView groupTypeView;
private TextView groupTypeTagView;
private TextView nickNameView;
private TextView cancelButton;
private EditText validationEdit;
private View validationArea;
private View remarksArea;
private MinimalistLineControllerView remarkController;
private TextView sendButton;
private TUICallback addMoreCallback;
private Object data;
private String userID;
private FriendProfilePresenter presenter;
private AddMorePresenter addMorePresenter = new AddMorePresenter();
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
dialog = new BottomSheetDialog(getContext(), R.style.ContactPopActivityStyle);
dialog.setCanceledOnTouchOutside(true);
BottomSheetBehavior<FrameLayout> bottomSheetBehavior = dialog.getBehavior();
bottomSheetBehavior.setFitToContents(false);
bottomSheetBehavior.setSkipCollapsed(true);
bottomSheetBehavior.setExpandedOffset(ScreenUtil.dip2px(24));
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
return dialog;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.contact_minimalist_add_friend_group_detail_layout, container);
presenter = new FriendProfilePresenter();
faceImgView = view.findViewById(R.id.friend_icon);
idTextView = view.findViewById(R.id.friend_account);
groupTypeView = view.findViewById(R.id.group_type);
nickNameView = view.findViewById(R.id.friend_nick_name);
groupTypeTagView = view.findViewById(R.id.group_type_tag);
validationEdit = view.findViewById(R.id.validation_message_input);
validationArea = view.findViewById(R.id.validation_message_area);
sendButton = view.findViewById(R.id.send_button);
cancelButton = view.findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
detailArea = view.findViewById(R.id.friend_detail_area);
remarksArea = view.findViewById(R.id.remark_area);
remarkController = view.findViewById(R.id.remarks_controller);
remarkController.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupInputCard popupInputCard = new PopupInputCard((Activity) getContext());
popupInputCard.setContent(remarkController.getContent());
popupInputCard.setTitle(getResources().getString(R.string.profile_remark_edit));
String description = getResources().getString(R.string.contact_modify_remark_rule);
popupInputCard.setDescription(description);
popupInputCard.setOnPositive((result -> {
remarkController.setContent(result);
}));
popupInputCard.show(remarkController, Gravity.BOTTOM);
}
});
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String addWording = validationEdit.getText().toString();
if (data instanceof GroupInfo) {
presenter.joinGroup(((GroupInfo) data).getId(), addWording, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
ToastUtil.toastShortMessage(getContext().getString(R.string.success));
dismiss();
TUICallback.onSuccess(addMoreCallback);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage(getContext().getString(R.string.contact_add_failed) + " " + errMsg);
TUICallback.onError(addMoreCallback, errCode, errMsg);
}
});
} else if (data instanceof ContactItemBean || !TextUtils.isEmpty(userID)) {
String friendID = userID;
if (data instanceof ContactItemBean) {
friendID = ((ContactItemBean) data).getId();
}
String remark = remarkController.getContent();
presenter.addFriend(friendID, addWording, remark, new IUIKitCallback<Pair<Integer, String>>() {
@Override
public void onSuccess(Pair<Integer, String> data) {
int toastIconType = ContactToast.TOAST_ICON_NEGATIVE;
if (data.first == FriendApplicationBean.ERR_SVR_FRIENDSHIP_ALLOW_TYPE_NEED_CONFIRM
|| data.first == FriendApplicationBean.ERR_SUCC) {
toastIconType = ContactToast.TOAST_ICON_POSITIVE;
}
ContactToast.showToast(getContext(), data.second, toastIconType);
dismiss();
TUICallback.onSuccess(addMoreCallback);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ContactToast.showToast(getContext(), getContext().getString(R.string.contact_add_failed), ContactToast.TOAST_ICON_NEGATIVE);
TUICallback.onError(addMoreCallback, errCode, errMsg);
}
});
}
}
});
if (data instanceof GroupInfo) {
setGroupDetail((GroupInfo) data);
remarksArea.setVisibility(View.GONE);
} else if (data instanceof ContactItemBean) {
setFriendDetail(((ContactItemBean) data).getAvatarUrl(), ((ContactItemBean) data).getId(), ((ContactItemBean) data).getNickName());
} else if (!TextUtils.isEmpty(userID)) {
addMorePresenter.getUserInfo(userID, new TUIValueCallback<ContactItemBean>() {
@Override
public void onSuccess(ContactItemBean object) {
setFriendDetail(object.getAvatarUrl(), object.getId(), object.getNickName());
}
@Override
public void onError(int errorCode, String errorMessage) {
TUIContactLog.e(TAG, "getUserInfo onError: " + errorMessage);
}
});
}
String nickName = TUIConfig.getSelfNickName();
if (TextUtils.isEmpty(nickName)) {
nickName = TUILogin.getLoginUser();
}
validationEdit.setText(getString(R.string.contact_add_friend_default_validation, nickName));
return view;
}
private void setGroupDetail(GroupInfo groupInfo) {
int radius = ScreenUtil.dip2px(35);
GlideEngine.loadUserIcon(
faceImgView, groupInfo.getFaceUrl(), TUIUtil.getDefaultGroupIconResIDByGroupType(getContext(), groupInfo.getGroupType()), radius);
idTextView.setText(groupInfo.getId());
nickNameView.setText(groupInfo.getGroupName());
groupTypeTagView.setVisibility(View.VISIBLE);
groupTypeView.setVisibility(View.VISIBLE);
groupTypeView.setText(groupInfo.getGroupType());
detailArea.setVisibility(View.VISIBLE);
}
private void setFriendDetail(String faceUrl, String id, String nickName) {
int radius = ScreenUtil.dip2px(35);
GlideEngine.loadUserIcon(faceImgView, faceUrl, radius);
idTextView.setText(id);
if (TextUtils.isEmpty(nickName)) {
nickNameView.setText(id);
} else {
nickNameView.setText(nickName);
}
groupTypeTagView.setVisibility(View.GONE);
groupTypeView.setVisibility(View.GONE);
detailArea.setVisibility(View.VISIBLE);
}
public void setData(Object data) {
this.data = data;
}
public void setUserID(String userID) {
this.userID = userID;
}
@Override
public void finish() {
dismiss();
}
}
@@ -0,0 +1,227 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.DialogFragment;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IAddMoreActivity;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.MinimalistUIExtensionObserver;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.util.MinimalistUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.presenter.AddMorePresenter;
public class AddMoreMinimalistDialogFragment extends DialogFragment implements IAddMoreActivity {
private BottomSheetDialog dialog;
private EditText searchEdit;
private TextView idLabel;
private View notFoundTip;
private TextView searchBtn;
private TextView titleTv;
private View detailArea;
private ShadeImageView faceImgView;
private TextView idTextView;
private TextView groupTypeView;
private TextView groupTypeTagView;
private TextView nickNameView;
private TextView cancelButton;
private boolean isGroup;
private AddMorePresenter presenter;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
dialog = new BottomSheetDialog(getContext(), R.style.ContactPopActivityStyle);
dialog.setCanceledOnTouchOutside(true);
BottomSheetBehavior<FrameLayout> bottomSheetBehavior = dialog.getBehavior();
bottomSheetBehavior.setFitToContents(false);
bottomSheetBehavior.setSkipCollapsed(true);
bottomSheetBehavior.setExpandedOffset(ScreenUtil.dip2px(24));
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
return dialog;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.contact_minimalist_add_friend_group_layout, container);
presenter = new AddMorePresenter();
faceImgView = view.findViewById(R.id.friend_icon);
titleTv = view.findViewById(R.id.title_tv);
idTextView = view.findViewById(R.id.friend_account);
groupTypeView = view.findViewById(R.id.group_type);
nickNameView = view.findViewById(R.id.friend_nick_name);
groupTypeTagView = view.findViewById(R.id.group_type_tag);
searchEdit = view.findViewById(R.id.search_edit);
if (isGroup) {
searchEdit.setHint(R.string.hint_search_group_id);
titleTv.setText(getString(R.string.add_group));
}
cancelButton = view.findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
idLabel = view.findViewById(R.id.id_label);
notFoundTip = view.findViewById(R.id.not_found_tip);
searchBtn = view.findViewById(R.id.search_button);
detailArea = view.findViewById(R.id.friend_detail_area);
searchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
notFoundTip.setVisibility(View.GONE);
String id = searchEdit.getText().toString();
if (isGroup) {
presenter.getGroupInfo(id, new IUIKitCallback<GroupInfo>() {
@Override
public void onSuccess(GroupInfo data) {
setGroupDetail(data);
detailArea.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AddMoreDetailMinimalistDialogFragment detailDialog = new AddMoreDetailMinimalistDialogFragment();
detailDialog.setData(data);
detailDialog.show(((AppCompatActivity) getContext()).getSupportFragmentManager(), "AddMoreDetail");
}
});
}
@Override
public void onError(String module, int errCode, String errMsg) {
setNotFound();
}
});
return;
}
presenter.getUserInfo(id, new TUIValueCallback<ContactItemBean>() {
@Override
public void onSuccess(ContactItemBean data) {
setFriendDetail(data.getAvatarUrl(), data.getId(), data.getNickName());
detailArea.setOnClickListener(v1 -> {
if (data.isFriend()) {
MinimalistUIUtils.showContactDetails(data.getId());
} else {
AddMoreDetailMinimalistDialogFragment detailDialog = new AddMoreDetailMinimalistDialogFragment();
detailDialog.setData(data);
detailDialog.show(((AppCompatActivity) getContext()).getSupportFragmentManager(), "AddMoreDetail");
}
});
}
@Override
public void onError(int errCode, String errMsg) {
setNotFound();
}
});
}
});
if (!isGroup) {
idLabel.setText(getString(R.string.contact_my_user_id, TUILogin.getLoginUser()));
}
searchEdit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
idLabel.setVisibility(View.GONE);
}
}
});
searchEdit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if (TextUtils.isEmpty(searchEdit.getText())) {
detailArea.setVisibility(View.GONE);
notFoundTip.setVisibility(View.GONE);
}
}
});
return view;
}
public void setIsGroup(boolean isGroup) {
this.isGroup = isGroup;
}
private void setGroupDetail(GroupInfo groupInfo) {
int radius = ScreenUtil.dip2px(28);
faceImgView.setRadius(radius);
GlideEngine.loadUserIcon(
faceImgView, groupInfo.getFaceUrl(), TUIUtil.getDefaultGroupIconResIDByGroupType(getContext(), groupInfo.getGroupType()), radius);
idTextView.setText(groupInfo.getId());
nickNameView.setText(groupInfo.getGroupName());
groupTypeTagView.setVisibility(View.VISIBLE);
groupTypeView.setVisibility(View.VISIBLE);
groupTypeView.setText(groupInfo.getGroupType());
detailArea.setVisibility(View.VISIBLE);
}
private void setFriendDetail(String faceUrl, String id, String nickName) {
int radius = ScreenUtil.dip2px(28);
faceImgView.setRadius(radius);
GlideEngine.loadUserIcon(faceImgView, faceUrl, radius);
idTextView.setText(id);
if (TextUtils.isEmpty(nickName)) {
nickNameView.setText(id);
} else {
nickNameView.setText(nickName);
}
groupTypeTagView.setVisibility(View.GONE);
groupTypeView.setVisibility(View.GONE);
detailArea.setVisibility(View.VISIBLE);
}
private void setNotFound() {
detailArea.setVisibility(View.GONE);
notFoundTip.setVisibility(View.VISIBLE);
}
@Override
public void finish() {
dismiss();
}
}
@@ -0,0 +1,64 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.MinimalistUIExtensionObserver;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.util.MinimalistUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
public class BlackListMinimalistActivity extends BaseMinimalistLightActivity {
private TitleBarLayout mTitleBar;
private ContactListView mListView;
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.minimalist_contact_blacklist_activity);
init();
}
private void init() {
mTitleBar = findViewById(R.id.black_list_titlebar);
mTitleBar.setTitle(getResources().getString(R.string.blacklist), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mTitleBar.getRightGroup().setVisibility(View.GONE);
mListView = findViewById(R.id.black_list);
mListView.setOnItemClickListener((position, contact) -> MinimalistUIUtils.showContactDetails(contact.getId()));
}
@Override
protected void onResume() {
super.onResume();
loadDataSource();
}
public void loadDataSource() {
presenter = new ContactPresenter();
mListView.setPresenter(presenter);
mListView.setNotFoundTip(getString(R.string.contact_no_block_list));
presenter.setContactListView(mListView);
presenter.setBlackListListener();
mListView.loadDataSource(ContactListView.DataSource.BLACK_LIST);
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,487 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.MinimalistLineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.activities.ImageSelectMinimalistActivity;
import com.tencent.qcloud.tuikit.timcommon.component.dialog.TUIKitDialog;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ImageUtil;
import com.tencent.qcloud.tuikit.timcommon.util.LayoutUtil;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ChatInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.util.MinimalistUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.List;
public class CreateGroupMinimalistActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = CreateGroupMinimalistActivity.class.getSimpleName();
private EditText groupNameEdit;
private EditText groupIdEdit;
private MinimalistLineControllerView groupTypeLv;
private TextView createButton;
private TextView cancelButton;
private TextView groupTypeContentView;
private RecyclerView groupAvatarList;
private RecyclerView groupMemberList;
private StartGroupChatMinimalistActivity.GroupMemberSelectedAdapter groupMemberSelectedAdapter;
private ImageSelectMinimalistActivity.ImageGridAdapter groupAvatarSelectAdapter;
private String groupName;
private String groupType = TUIContactConstants.GroupType.TYPE_WORK;
private String groupAvatarUrl;
private ArrayList<Object> groupAvatarUrlList = new ArrayList<>();
private int joinTypeIndex;
private String groupAvatarImageId = "";
private ArrayList<GroupMemberInfo> mGroupMembers = new ArrayList<>();
private boolean mCreating;
private ActivityResultLauncher<String> groupTypeLauncher;
private ContactPresenter presenter;
public static class GroupTypeResultContract extends ActivityResultContract<String, String> {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, String type) {
Intent intent = new Intent(context, GroupTypeSelectMinimalistActivity.class);
intent.putExtra(TUIContactConstants.Selection.GROUP_TYPE, type);
return intent;
}
@Override
public String parseResult(int i, @Nullable Intent data) {
if (data != null) {
String type = data.getStringExtra(TUIContactConstants.Selection.TYPE);
if (TextUtils.isEmpty(type)) {
TUIContactLog.e(TAG, "onActivityResult type is null");
return null;
} else {
return type;
}
}
return null;
}
}
private ActivityResultCallback<String> groupTypeSelectedCallback = new ActivityResultCallback<String>() {
@Override
public void onActivityResult(String type) {
if (!TextUtils.isEmpty(type)) {
groupType = type;
groupTypeLv.setContent(type);
initGroupTypeContentView();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
groupTypeLauncher = registerForActivityResult(new GroupTypeResultContract(), groupTypeSelectedCallback);
setContentView(R.layout.contact_minimalist_create_group_layout);
groupNameEdit = findViewById(R.id.group_name_edit);
groupIdEdit = findViewById(R.id.group_id_edit);
groupTypeLv = findViewById(R.id.group_type_layout);
createButton = findViewById(R.id.create_button);
cancelButton = findViewById(R.id.cancel_button);
groupTypeContentView = findViewById(R.id.group_type_text);
groupAvatarList = findViewById(R.id.group_avatar_list);
groupMemberList = findViewById(R.id.selected_list);
initData();
setupViews();
}
private void initData() {
Intent intent = getIntent();
if (intent == null) {
TUIContactLog.e(TAG, "intent is null");
return;
}
Bundle bundle = intent.getExtras();
if (bundle == null) {
TUIContactLog.e(TAG, "bundle is null");
return;
}
mGroupMembers = (ArrayList<GroupMemberInfo>) bundle.getSerializable(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST);
if (mGroupMembers == null || mGroupMembers.size() <= 1) {
TUIContactLog.e(TAG, "mGroupMemberIcons <= 1");
}
generateImageID();
groupName = bundle.getString(TUIConstants.TUIContact.GROUP_NAME);
groupNameEdit.setText(groupName);
groupTypeLv.setContent(groupType);
if (TUIConfig.isEnableGroupGridAvatar()) {
groupAvatarUrlList.clear();
groupAvatarUrlList.addAll(fillGroupGridAvatar());
groupAvatarUrl = null;
}
joinTypeIndex = bundle.getInt(TUIConstants.TUIContact.JOIN_TYPE_INDEX, 2);
}
private void generateImageID() {
groupAvatarImageId = System.currentTimeMillis() + "";
}
private void setupViews() {
groupTypeLv.setOnClickListener(this);
cancelButton.setOnClickListener(this);
createButton.setOnClickListener(this);
presenter = new ContactPresenter();
initGroupTypeContentView();
initAvatarList();
initSelectedMemberList();
}
private void initGroupTypeContentView() {
switch (groupType) {
case TUIContactConstants.GroupType.TYPE_WORK:
groupTypeContentView.setText(getString(R.string.group_work_content));
break;
case TUIContactConstants.GroupType.TYPE_PUBLIC:
groupTypeContentView.setText(getString(R.string.group_public_des));
break;
case TUIContactConstants.GroupType.TYPE_MEETING:
groupTypeContentView.setText(getString(R.string.group_meeting_des));
break;
case TUIContactConstants.GroupType.TYPE_COMMUNITY:
groupTypeContentView.setText(getString(R.string.group_commnity_des));
break;
default:
break;
}
String groupTypeContent = getResources().getString(R.string.group_type_content_title);
String urlContent = getResources().getString(R.string.group_type_content_url);
int urlContentIndex = groupTypeContent.lastIndexOf(urlContent);
final int foregroundColor;
int currentTheme = TUIThemeManager.getInstance().getCurrentTheme();
if (currentTheme == TUIThemeManager.THEME_LIVELY) {
foregroundColor = getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_primary_color_lively);
} else if (currentTheme == TUIThemeManager.THEME_SERIOUS) {
foregroundColor = getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_primary_color_serious);
} else {
foregroundColor = getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_primary_color_light);
}
SpannableString spannedString = new SpannableString(groupTypeContent);
ForegroundColorSpan colorSpan = new ForegroundColorSpan(foregroundColor);
spannedString.setSpan(colorSpan, urlContentIndex, urlContentIndex + urlContent.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
openWebUrl(TUIContactConstants.IM_PRODUCT_DOC_URL);
} else {
openWebUrl(TUIContactConstants.IM_PRODUCT_DOC_URL_EN);
}
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannedString.setSpan(clickableSpan, urlContentIndex, urlContentIndex + urlContent.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
groupTypeContentView.append(spannedString);
groupTypeContentView.setMovementMethod(LinkMovementMethod.getInstance());
}
private void initAvatarList() {
int columnCount = 2;
groupAvatarList.setLayoutManager(new GridLayoutManager(this, columnCount, RecyclerView.HORIZONTAL, false));
int leftRightSpace = ScreenUtil.dip2px(23);
groupAvatarList.addItemDecoration(new GridDecoration(leftRightSpace, ScreenUtil.dip2px(20)));
groupAvatarList.setItemAnimator(null);
SimpleItemAnimator animator = (SimpleItemAnimator) groupAvatarList.getItemAnimator();
if (animator != null) {
animator.setSupportsChangeAnimations(false);
}
groupAvatarSelectAdapter = new ImageSelectMinimalistActivity.ImageGridAdapter();
ArrayList<ImageSelectMinimalistActivity.ImageBean> faceList = new ArrayList<>();
if (TUIConfig.isEnableGroupGridAvatar()) {
ImageSelectMinimalistActivity.ImageBean imageBean = new ImageSelectMinimalistActivity.ImageBean();
imageBean.setGroupGridAvatar(fillGroupGridAvatar());
imageBean.setImageId(groupAvatarImageId);
faceList.add(imageBean);
}
for (int i = 0; i < TUIContactConstants.GROUP_FACE_COUNT; i++) {
ImageSelectMinimalistActivity.ImageBean imageBean = new ImageSelectMinimalistActivity.ImageBean();
imageBean.setThumbnailUri(String.format(TUIContactConstants.GROUP_FACE_URL, (i + 1) + ""));
faceList.add(imageBean);
}
groupAvatarSelectAdapter.setItemHeight(ScreenUtil.dip2px(50));
groupAvatarSelectAdapter.setItemWidth(ScreenUtil.dip2px(50));
groupAvatarSelectAdapter.setSelected(faceList.get(0));
groupAvatarSelectAdapter.setData(faceList);
groupAvatarSelectAdapter.setOnItemClickListener(new ImageSelectMinimalistActivity.OnItemClickListener() {
@Override
public void onClick(ImageSelectMinimalistActivity.ImageBean imageBean) {
List<Object> faceUrlList = imageBean.getGroupGridAvatar();
if (faceUrlList != null && !faceUrlList.isEmpty()) {
groupAvatarUrlList.clear();
groupAvatarUrlList.addAll(faceUrlList);
groupAvatarUrl = null;
} else {
groupAvatarUrl = imageBean.getThumbnailUri();
}
groupAvatarSelectAdapter.setSelected(imageBean);
}
});
groupAvatarList.setAdapter(groupAvatarSelectAdapter);
}
private void initSelectedMemberList() {
groupMemberList.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
groupMemberList.setItemAnimator(null);
SimpleItemAnimator animator = (SimpleItemAnimator) groupMemberList.getItemAnimator();
if (animator != null) {
animator.setSupportsChangeAnimations(false);
}
groupMemberSelectedAdapter = new StartGroupChatMinimalistActivity.GroupMemberSelectedAdapter();
groupMemberSelectedAdapter.setMembers(mGroupMembers);
groupMemberSelectedAdapter.setSelectedMemberClickedListener(new StartGroupChatMinimalistActivity.OnSelectedMemberClickedListener() {
@Override
public void onRemove(GroupMemberInfo groupMemberInfo) {
groupMemberSelectedAdapter.notifyItemRemoved(mGroupMembers.indexOf(groupMemberInfo));
mGroupMembers.remove(groupMemberInfo);
ImageSelectMinimalistActivity.ImageBean imageBean = groupAvatarSelectAdapter.getDataByPosition(0);
if (imageBean != null) {
generateImageID();
List<Object> avatarList = fillGroupGridAvatar();
imageBean.setImageId(groupAvatarImageId);
imageBean.setGroupGridAvatar(avatarList);
groupAvatarSelectAdapter.notifyItemChanged(0);
groupAvatarUrlList.clear();
groupAvatarUrlList.addAll(avatarList);
}
}
});
groupMemberList.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
outRect.bottom = ScreenUtil.dip2px(10);
}
});
groupMemberList.setAdapter(groupMemberSelectedAdapter);
}
@Override
public void onClick(View v) {
if (v == groupTypeLv) {
groupTypeLauncher.launch(groupType);
} else if (v == cancelButton) {
finish();
} else if (v == createButton) {
createGroupChat();
}
}
private List<Object> fillGroupGridAvatar() {
final List<Object> urlList = new ArrayList<>();
String savedIcon = ImageUtil.getGroupConversationAvatar(groupAvatarImageId);
if (TextUtils.isEmpty(savedIcon)) {
int faceSize = Math.min(mGroupMembers.size(), 9);
urlList.add(TUIConfig.getSelfFaceUrl());
for (int i = 0; i < faceSize; i++) {
String iconUrl = mGroupMembers.get(i).getFaceUrl();
urlList.add(TextUtils.isEmpty(iconUrl) ? TUIConfig.getDefaultAvatarImage() : iconUrl);
}
} else {
urlList.add(savedIcon);
}
return urlList;
}
private void createGroupChat() {
if (mCreating) {
return;
}
groupName = groupNameEdit.getText().toString();
final GroupInfo groupInfo = new GroupInfo();
groupInfo.setChatName(groupName);
groupInfo.setGroupName(groupName);
groupInfo.setMemberDetails(mGroupMembers);
groupInfo.setGroupType(groupType);
groupInfo.setJoinType(joinTypeIndex);
groupInfo.setCommunitySupportTopic(false);
groupInfo.setFaceUrl(groupAvatarUrl);
groupInfo.setIconUrlList(groupAvatarUrlList);
String groupId = groupIdEdit.getText().toString();
if (TextUtils.equals(groupType, V2TIMManager.GROUP_TYPE_COMMUNITY)) {
if (!TextUtils.isEmpty(groupId) && !groupId.startsWith("@TGS#_")) {
ToastUtil.toastLongMessage(getResources().getString(R.string.community_id_edit_format_tips));
return;
}
} else {
if (!TextUtils.isEmpty(groupId) && groupId.startsWith("@TGS#")) {
ToastUtil.toastLongMessage(getResources().getString(R.string.group_id_edit_format_tips));
return;
}
}
if (!TextUtils.isEmpty(groupId) && groupId.length() > 48) {
ToastUtil.toastLongMessage(getResources().getString(R.string.group_id_edit_exceed_tips));
return;
}
if (!TextUtils.isEmpty(groupId)) {
groupInfo.setId(groupId);
} else {
groupInfo.setId("");
}
mCreating = true;
presenter.createGroupChat(groupInfo, new IUIKitCallback<String>() {
@Override
public void onSuccess(String data) {
MinimalistUIUtils.startChatActivity(data, ChatInfo.TYPE_GROUP, groupInfo.getGroupName(), groupAvatarUrl, groupAvatarUrlList);
finish();
}
@Override
public void onError(String module, int errCode, String errMsg) {
mCreating = false;
if (errCode == TUIConstants.BuyingFeature.ERR_SDK_INTERFACE_NOT_SUPPORT || errCode == 11000) {
showNotSupportDialog();
}
ToastUtil.toastLongMessage("createGroupChat fail:" + errCode + "=" + errMsg);
}
});
}
private void showNotSupportDialog() {
String string = getResources().getString(R.string.contact_im_flagship_edition_update_tip, getString(R.string.contact_community));
String buyingGuidelines = getResources().getString(R.string.contact_buying_guidelines);
int buyingGuidelinesIndex = string.lastIndexOf(buyingGuidelines);
final int foregroundColor = getResources().getColor(TUIThemeManager.getAttrResId(this, com.tencent.qcloud.tuicore.R.attr.core_primary_color));
SpannableString spannedString = new SpannableString(string);
ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(foregroundColor);
spannedString.setSpan(colorSpan2, buyingGuidelinesIndex, buyingGuidelinesIndex + buyingGuidelines.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
ClickableSpan clickableSpan2 = new ClickableSpan() {
@Override
public void onClick(View view) {
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
openWebUrl(TUIConstants.BuyingFeature.BUYING_PRICE_DESC);
} else {
openWebUrl(TUIConstants.BuyingFeature.BUYING_PRICE_DESC_EN);
}
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannedString.setSpan(clickableSpan2, buyingGuidelinesIndex, buyingGuidelinesIndex + buyingGuidelines.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
TUIKitDialog.TUIIMUpdateDialog.getInstance()
.createDialog(this)
.setMovementMethod(LinkMovementMethod.getInstance())
.setShowOnlyDebug(true)
.setCancelable(true)
.setCancelOutside(true)
.setTitle(spannedString)
.setDialogWidth(0.75f)
.setDialogFeatureName(TUIConstants.BuyingFeature.BUYING_FEATURE_COMMUNITY)
.setPositiveButton(getString(R.string.contact_no_more_reminders),
new View.OnClickListener() {
@Override
public void onClick(View v) {
TUIKitDialog.TUIIMUpdateDialog.getInstance().dismiss();
TUIKitDialog.TUIIMUpdateDialog.getInstance().setNeverShow(true);
}
})
.setNegativeButton(getString(R.string.contact_i_know),
new View.OnClickListener() {
@Override
public void onClick(View v) {
TUIKitDialog.TUIIMUpdateDialog.getInstance().dismiss();
}
})
.show();
}
private void openWebUrl(String url) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri contentUrl = Uri.parse(url);
intent.setData(contentUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
/**
* add spacing
*/
public static class GridDecoration extends RecyclerView.ItemDecoration {
private final int leftRightSpace; // vertical spacing
private final int topBottomSpace; // horizontal spacing
public GridDecoration(int leftRightSpace, int topBottomSpace) {
this.leftRightSpace = leftRightSpace;
this.topBottomSpace = topBottomSpace;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (LayoutUtil.isRTL()) {
outRect.left = leftRightSpace;
} else {
outRect.right = leftRightSpace;
}
outRect.bottom = topBottomSpace;
}
}
}
@@ -0,0 +1,122 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupApplyPresenter;
public class GroupApplyDetailMinimalistActivity extends BaseMinimalistLightActivity implements IGroupApplyLayout {
private static final String TAG = GroupApplyDetailMinimalistActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private GroupApplyPresenter presenter;
private ShadeImageView avatarView;
private TextView userNameTv;
private TextView userIDTv;
private TextView addWordingTv;
private TextView agreeButton;
private TextView rejectButton;
private TextView resultButton;
private GroupApplyInfo groupApplyInfo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_minimalist_new_group_apply_detail_activity);
Intent intent = getIntent();
if (intent != null) {
groupApplyInfo = (GroupApplyInfo) intent.getSerializableExtra(TUIContactConstants.Group.MEMBER_APPLY);
presenter = new GroupApplyPresenter(this);
init();
}
}
private void init() {
mTitleBar = findViewById(R.id.new_apply_detail_title_bar);
mTitleBar.setTitle(getResources().getString(R.string.group_group_application_detail_title), ITitleBarLayout.Position.MIDDLE);
mTitleBar.getRightIcon().setVisibility(View.GONE);
avatarView = findViewById(R.id.avatar);
avatarView.setRadius(ScreenUtil.dip2px(25));
GlideEngine.loadImage(avatarView, groupApplyInfo.getFromUserFaceUrl());
userNameTv = findViewById(R.id.user_name);
if (TextUtils.isEmpty(groupApplyInfo.getFromUserNickName())) {
userNameTv.setText(groupApplyInfo.getFromUserID());
} else {
userNameTv.setText(groupApplyInfo.getFromUserNickName());
}
userIDTv = findViewById(R.id.user_id);
userIDTv.setText(groupApplyInfo.getFromUserID());
addWordingTv = findViewById(R.id.validation_message);
addWordingTv.setText(groupApplyInfo.getAddWording());
agreeButton = findViewById(R.id.agree);
rejectButton = findViewById(R.id.reject);
resultButton = findViewById(R.id.result_tv);
agreeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.acceptApply(groupApplyInfo, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
agreeButton.setVisibility(View.GONE);
rejectButton.setVisibility(View.GONE);
resultButton.setVisibility(View.VISIBLE);
groupApplyInfo.setStatus(GroupApplyInfo.APPLIED);
Intent intent = new Intent();
intent.putExtra(TUIContactConstants.Group.MEMBER_APPLY, groupApplyInfo);
setResult(RESULT_OK, intent);
}
@Override
public void onError(String module, int errCode, String errMsg) {
super.onError(module, errCode, errMsg);
}
});
}
});
rejectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.refuseApply(groupApplyInfo, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
agreeButton.setVisibility(View.GONE);
rejectButton.setVisibility(View.GONE);
resultButton.setVisibility(View.VISIBLE);
resultButton.setText(getResources().getString(R.string.refused));
resultButton.setTextColor(0xFFFF584C);
groupApplyInfo.setStatus(GroupApplyInfo.REFUSED);
Intent intent = new Intent();
intent.putExtra(TUIContactConstants.Group.MEMBER_APPLY, groupApplyInfo);
setResult(RESULT_OK, intent);
}
@Override
public void onError(String module, int errCode, String errMsg) {
super.onError(module, errCode, errMsg);
}
});
}
});
}
}
@@ -0,0 +1,33 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.os.Bundle;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.GroupApplyManagerLayout;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupApplyPresenter;
public class GroupApplyManagerMinimalistActivity extends BaseMinimalistLightActivity {
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(TUIContactConstants.Group.GROUP_ID);
GroupInfo groupInfo = new GroupInfo();
groupInfo.setId(groupId);
mManagerLayout.setDataSource(groupInfo);
}
}
@@ -0,0 +1,79 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.util.MinimalistUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
public class GroupListMinimalistActivity extends BaseMinimalistLightActivity {
private static final String TAG = GroupListMinimalistActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mListView;
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.minimalist_group_list_activity);
init();
}
@Override
public void onResume() {
super.onResume();
loadDataSource();
}
private void init() {
mTitleBar = findViewById(R.id.group_list_titlebar);
mTitleBar.setTitle(getResources().getString(R.string.group), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mListView = findViewById(R.id.group_list);
mListView.setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
String chatName = contact.getId();
if (!TextUtils.isEmpty(contact.getRemark())) {
chatName = contact.getRemark();
} else if (!TextUtils.isEmpty(contact.getNickName())) {
chatName = contact.getNickName();
}
MinimalistUIUtils.startChatActivity(contact.getId(), ContactItemBean.TYPE_GROUP, chatName, contact.getAvatarUrl(), null);
}
});
}
public void loadDataSource() {
presenter = new ContactPresenter();
presenter.setFriendListListener();
mListView.setIsGroupList(true);
mListView.setPresenter(presenter);
mListView.setNotFoundTip(getString(R.string.contact_no_group));
presenter.setContactListView(mListView);
mListView.loadDataSource(ContactListView.DataSource.GROUP_LIST);
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,214 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
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.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.GroupMemberLayout;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupMemberMinimalistActivity extends BaseMinimalistLightActivity {
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.TUIContact.GROUP_ID);
isSelectMode = intent.getBooleanExtra(TUIConstants.TUIContact.IS_SELECT_MODE, true);
excludeList = intent.getStringArrayListExtra(TUIConstants.TUIContact.EXCLUDE_LIST);
alreadySelectedList = intent.getStringArrayListExtra(TUIConstants.TUIContact.SELECTED_LIST);
userData = intent.getStringExtra(TUIConstants.TUIContact.USER_DATA);
mMemberLayout.setSelectMode(isSelectMode);
String title = intent.getStringExtra(TUIConstants.TUIContact.TITLE);
mMemberLayout.setTitle(title);
mMemberLayout.setExcludeList(excludeList);
mMemberLayout.setAlreadySelectedList(alreadySelectedList);
presenter = new GroupInfoPresenter(mMemberLayout);
mMemberLayout.setPresenter(presenter);
int filter = intent.getIntExtra(TUIConstants.TUIContact.FILTER, GroupInfo.GROUP_MEMBER_FILTER_ALL);
presenter.loadGroupInfo(groupID, filter);
mMemberLayout.getTitleBar().setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
int limit = getIntent().getIntExtra(TUIConstants.TUIContact.LIMIT, Integer.MAX_VALUE);
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.TUIContact.LIST, members);
setResult(0, result);
Map<String, Object> param = new HashMap<>();
param.put(TUIConstants.TUIContact.LIST, members);
param.put(TUIConstants.TUIContact.USER_DATA, userData);
TUICore.notifyEvent(TUIConstants.TUIContact.EVENT_GROUP, TUIConstants.TUIContact.EVENT_SUB_KEY_GROUP_MEMBER_SELECTED, param);
finish();
}
});
mMemberLayout.setOnGroupMemberClickListener(new GroupMemberLayout.OnGroupMemberClickListener() {
@Override
public void onShowInfo(GroupMemberInfo groupMemberInfo) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, groupMemberInfo.getUserId());
TUICore.startActivity("FriendProfileMinimalistActivity", bundle);
}
@Override
public void onAdminRoleChanged(GroupMemberInfo groupMemberInfo) {
if (!presenter.isAdmin(groupMemberInfo.getRole())) {
presenter.setGroupManager(groupID, groupMemberInfo.getUserId(), new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
ToastUtil.toastLongMessage(getString(com.tencent.qcloud.tuikit.timcommon.R.string.setting_success));
GroupMemberMinimalistActivity.this.onAdminRoleChanged(groupMemberInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(
getString(com.tencent.qcloud.tuikit.timcommon.R.string.setting_fail) + ", errCode = " + errCode + ", errMsg = " + errMsg);
}
});
} else {
presenter.setGroupMemberRole(groupID, groupMemberInfo.getUserId(), new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
GroupMemberMinimalistActivity.this.onAdminRoleChanged(groupMemberInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(
getString(com.tencent.qcloud.tuikit.timcommon.R.string.setting_fail) + ", errCode = " + errCode + ", errMsg = " + errMsg);
}
});
}
}
@Override
public void onDelete(GroupMemberInfo groupMemberInfo) {
presenter.deleteGroupMembers(groupID, Collections.singletonList(groupMemberInfo.getUserId()), new IUIKitCallback<List<String>>() {
@Override
public void onSuccess(List<String> data) {
ToastUtil.toastLongMessage(getString(R.string.remove_tip_suc));
onMemberDeleted(data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(getString(R.string.remove_fail_tip) + ", errCode = " + errCode + ", errMsg = " + errMsg);
}
});
}
});
}
private void onMemberDeleted(List<String> memberIDs) {
mMemberLayout.deleteMember(memberIDs);
}
private void onAdminRoleChanged(GroupMemberInfo groupMemberInfo) {
if (presenter.isAdmin(groupMemberInfo.getRole())) {
groupMemberInfo.setRole(GroupInfo.GROUP_MEMBER_ROLE_MEMBER);
} else {
groupMemberInfo.setRole(GroupInfo.GROUP_MEMBER_ROLE_ADMIN);
}
mMemberLayout.memberChanged(groupMemberInfo);
}
@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(TUIContactConstants.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(TUIContactService.getAppContext().getString(R.string.invite_suc));
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastLongMessage(TUIContactService.getAppContext().getString(R.string.invite_fail) + errCode + "=" + errMsg);
}
});
}
}
}
}
@@ -0,0 +1,190 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class GroupTypeSelectMinimalistActivity extends AppCompatActivity {
private static final String TAG = GroupTypeSelectMinimalistActivity.class.getSimpleName();
private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView.Adapter mAdapter;
private TextView cancelButton;
private TextView confirmButton;
private List<String> mDatas = new ArrayList<>();
private TextView groupTypeTextView;
private String groupType;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_minimalist_group_type_select_layout);
initData();
initView();
}
private void initView() {
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mAdapter = new MyAdapter(mDatas);
cancelButton = findViewById(R.id.cancel_button);
confirmButton = findViewById(R.id.confirm_button);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult();
}
});
groupTypeTextView = findViewById(R.id.group_type_text);
groupTypeTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String url = "";
if (TextUtils.equals(TUIThemeManager.getInstance().getCurrentLanguage(), "zh")) {
url = TUIContactConstants.IM_PRODUCT_DOC_URL;
} else {
url = TUIContactConstants.IM_PRODUCT_DOC_URL_EN;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri contentUrl = Uri.parse(url);
intent.setData(contentUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
}
private void initData() {
String[] array = getResources().getStringArray(R.array.group_type);
mDatas.addAll(Arrays.asList(array));
groupType = mDatas.get(0);
Intent intent = getIntent();
String groupTypeTemp = intent.getStringExtra(TUIContactConstants.Selection.GROUP_TYPE);
if (!TextUtils.isEmpty(groupTypeTemp)) {
groupType = groupTypeTemp;
}
}
private void setResult() {
Intent intent = new Intent();
intent.putExtra(TUIContactConstants.Selection.TYPE, groupType);
setResult(0, intent);
finish();
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> mDatas;
public MyAdapter(List<String> datas) {
this.mDatas = datas;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_minimalist_group_type_item, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String type = this.mDatas.get(position);
switch (type) {
case TUIContactConstants.GroupType.TYPE_WORK:
holder.textView.setText(getString(R.string.group_work_type));
holder.subTextView.setText(getString(R.string.group_work_content));
break;
case TUIContactConstants.GroupType.TYPE_PUBLIC:
holder.textView.setText(getString(R.string.group_public_type));
holder.subTextView.setText(getString(R.string.group_public_des));
break;
case TUIContactConstants.GroupType.TYPE_MEETING:
holder.textView.setText(getString(R.string.group_meeting_type));
holder.subTextView.setText(getString(R.string.group_meeting_des));
break;
case TUIContactConstants.GroupType.TYPE_COMMUNITY:
holder.textView.setText(getString(R.string.group_commnity_type));
holder.subTextView.setText(getString(R.string.group_commnity_des));
break;
default:
break;
}
if (TextUtils.equals(groupType, type)) {
holder.showSelected();
} else {
holder.hideSelected();
}
holder.rootView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
groupType = type;
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return this.mDatas == null ? 0 : this.mDatas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
View rootView;
TextView textView;
TextView subTextView;
View selectedBorder;
View notSelectedBorder;
View selectedIcon;
public ViewHolder(View itemView) {
super(itemView);
rootView = itemView;
selectedIcon = itemView.findViewById(R.id.checked_icon);
selectedBorder = itemView.findViewById(R.id.selected_border);
notSelectedBorder = itemView.findViewById(R.id.not_selected_border);
textView = itemView.findViewById(R.id.group_type_text);
subTextView = itemView.findViewById(R.id.group_type_content);
}
public void showSelected() {
selectedBorder.setVisibility(View.VISIBLE);
notSelectedBorder.setVisibility(View.GONE);
selectedIcon.setVisibility(View.VISIBLE);
}
public void hideSelected() {
selectedBorder.setVisibility(View.GONE);
notSelectedBorder.setVisibility(View.VISIBLE);
selectedIcon.setVisibility(View.GONE);
}
}
}
}
@@ -0,0 +1,288 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import static com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants.GROUP_PROFILE_BEAN;
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.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.component.MinimalistLineControllerView;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupManagerPresenter;
import java.util.ArrayList;
import java.util.List;
public class ManageGroupMinimalistActivity extends BaseMinimalistLightActivity {
private TitleBarLayout titleBarLayout;
private MinimalistLineControllerView muteAllView;
private View addMuteMemberView;
private RecyclerView mutedList;
private MutedMemberAdapter mutedMemberAdapter;
private GroupManagerPresenter presenter;
private GroupProfileBean profileBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.group_minimalist_manager);
presenter = new GroupManagerPresenter();
titleBarLayout = findViewById(R.id.group_manage_title_bar);
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);
profileBean = (GroupProfileBean) getIntent().getSerializableExtra(GROUP_PROFILE_BEAN);
muteAllView.setChecked(profileBean.isAllMuted());
if (profileBean.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(profileBean.getGroupID(), 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);
}
});
}
});
addMuteMemberView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.equals(profileBean.getGroupType(), GroupInfo.GROUP_TYPE_AVCHATROOM)
|| TextUtils.equals(profileBean.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.TUIContact.IS_SELECT_MODE, true);
intent.putExtra(TUIConstants.TUIContact.FILTER, GroupInfo.GROUP_MEMBER_FILTER_COMMON);
if (mutedMemberAdapter.getGroupMemberInfoList() != null) {
ArrayList<String> selectedList = new ArrayList<>();
for (GroupMemberInfo memberInfo : mutedMemberAdapter.getGroupMemberInfoList()) {
selectedList.add(memberInfo.getUserId());
}
intent.putExtra(TUIConstants.TUIContact.SELECTED_LIST, selectedList);
}
intent.putExtra(TUIConstants.TUIContact.GROUP_ID, profileBean.getGroupID());
startActivityForResult(intent, 1);
}
});
mutedMemberAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public void onClick(View view, GroupMemberInfo memberInfo) {
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(profileBean.getGroupID(), memberInfo.getUserId(), 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(profileBean.getGroupID(), 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(TUIContactConstants.Selection.LIST);
if (selectedList != null && !selectedList.isEmpty()) {
for (String userId : selectedList) {
presenter.muteGroupMember(profileBean.getGroupID(), 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 OnItemLongClickListener onItemLongClickListener;
public void setOnItemLongClickListener(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_minimalist_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);
}
return false;
}
});
holder.managerName.setText(groupMemberInfo.getDisplayName());
GlideEngine.loadUserIcon(holder.faceIcon, groupMemberInfo.getFaceUrl());
}
@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(25));
managerName = itemView.findViewById(R.id.group_manage_name);
}
}
}
interface OnItemLongClickListener {
void onClick(View view, GroupMemberInfo groupMemberInfo);
}
}
@@ -0,0 +1,110 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.presenter.NewFriendPresenter;
public class NewFriendApplicationDetailMinimalistActivity extends BaseMinimalistLightActivity {
private static final String TAG = NewFriendApplicationDetailMinimalistActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private NewFriendPresenter presenter;
private FriendApplicationBean applicationBean;
private ShadeImageView avatarView;
private TextView userNameTv;
private TextView userIDTv;
private TextView addWordingTv;
private TextView agreeButton;
private TextView rejectButton;
private TextView resultButton;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_minimalist_new_friend_application_detail_activity);
applicationBean = (FriendApplicationBean) getIntent().getSerializableExtra(TUIConstants.TUIContact.CONTENT);
init();
}
private void init() {
mTitleBar = findViewById(R.id.new_friend_detail_title_bar);
mTitleBar.setTitle(getResources().getString(R.string.contact_friend_application_detail_title), ITitleBarLayout.Position.MIDDLE);
mTitleBar.getRightIcon().setVisibility(View.GONE);
avatarView = findViewById(R.id.avatar);
avatarView.setRadius(ScreenUtil.dip2px(25));
GlideEngine.loadImage(avatarView, applicationBean.getFaceUrl());
userNameTv = findViewById(R.id.user_name);
if (TextUtils.isEmpty(applicationBean.getNickName())) {
userNameTv.setText(applicationBean.getUserId());
} else {
userNameTv.setText(applicationBean.getNickName());
}
userIDTv = findViewById(R.id.user_id);
userIDTv.setText(applicationBean.getUserId());
addWordingTv = findViewById(R.id.validation_message);
addWordingTv.setText(applicationBean.getAddWording());
agreeButton = findViewById(R.id.agree);
rejectButton = findViewById(R.id.reject);
resultButton = findViewById(R.id.result_tv);
presenter = new NewFriendPresenter();
agreeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.acceptFriendApplication(applicationBean, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
agreeButton.setVisibility(View.GONE);
rejectButton.setVisibility(View.GONE);
resultButton.setVisibility(View.VISIBLE);
}
@Override
public void onError(String module, int errCode, String errMsg) {
super.onError(module, errCode, errMsg);
}
});
}
});
rejectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.refuseFriendApplication(applicationBean, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
agreeButton.setVisibility(View.GONE);
rejectButton.setVisibility(View.GONE);
resultButton.setVisibility(View.VISIBLE);
resultButton.setText(getResources().getString(R.string.refused));
resultButton.setTextColor(0xFFFF584C);
}
@Override
public void onError(String module, int errCode, String errMsg) {
super.onError(module, errCode, errMsg);
}
});
}
});
}
}
@@ -0,0 +1,91 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.INewFriendActivity;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.NewFriendListAdapter;
import com.tencent.qcloud.tuikit.tuicontact.presenter.NewFriendPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.List;
public class NewFriendApplicationMinimalistActivity extends BaseMinimalistLightActivity implements INewFriendActivity {
private static final String TAG = NewFriendApplicationMinimalistActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ListView mNewFriendLv;
private NewFriendListAdapter mAdapter;
private TextView notFoundTip;
private NewFriendPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_minimalist_new_friend_activity);
init();
}
@Override
protected void onResume() {
super.onResume();
initPendency();
}
private void init() {
mTitleBar = findViewById(R.id.new_friend_titlebar);
mTitleBar.setTitle(getResources().getString(R.string.contact_new_application_title, 0), ITitleBarLayout.Position.MIDDLE);
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mTitleBar.getRightIcon().setVisibility(View.GONE);
presenter = new NewFriendPresenter();
presenter.setFriendActivity(this);
presenter.setFriendApplicationRead(new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {}
@Override
public void onError(String module, int errCode, String errMsg) {}
});
mNewFriendLv = findViewById(R.id.new_friend_list);
notFoundTip = findViewById(R.id.not_found_tip);
}
private void initPendency() {
presenter.loadFriendApplicationList();
}
@Override
public void onDataSourceChanged(List<FriendApplicationBean> dataSource) {
TUIContactLog.i(TAG, "getFriendApplicationList success");
if (dataSource == null || dataSource.isEmpty()) {
notFoundTip.setVisibility(View.VISIBLE);
mTitleBar.setTitle(getResources().getString(R.string.contact_no_new_friend_application), ITitleBarLayout.Position.MIDDLE);
} else {
mTitleBar.setTitle(getResources().getString(R.string.contact_new_application_title, dataSource.size()), ITitleBarLayout.Position.MIDDLE);
notFoundTip.setVisibility(View.GONE);
}
mNewFriendLv.setVisibility(View.VISIBLE);
mAdapter = new NewFriendListAdapter(NewFriendApplicationMinimalistActivity.this, R.layout.contact_minimalist_new_friend_application_item, dataSource);
mAdapter.setPresenter(presenter);
mNewFriendLv.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
@Override
public void finish() {
super.finish();
}
}
@@ -0,0 +1,77 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.util.MinimalistUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
public class StartC2CChatMinimalistActivity extends AppCompatActivity {
private static final String TAG = StartC2CChatMinimalistActivity.class.getSimpleName();
private TextView cancelButton;
private View createGroupButton;
private ContactListView mContactListView;
private ContactPresenter presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.minimalist_popup_start_c2c_chat_activity);
cancelButton = findViewById(R.id.cancel_button);
mContactListView = findViewById(R.id.contact_list_view);
mContactListView.setSingleSelectMode(true);
createGroupButton = findViewById(R.id.create_group_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
createGroupButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(StartC2CChatMinimalistActivity.this, StartGroupChatMinimalistActivity.class);
startActivity(intent);
finish();
}
});
presenter = new ContactPresenter();
presenter.setFriendListListener();
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
startConversation(contact);
}
});
}
public void startConversation(ContactItemBean selectedItem) {
if (selectedItem == null) {
ToastUtil.toastLongMessage(getString(R.string.select_chat));
return;
}
String chatName = selectedItem.getId();
if (!TextUtils.isEmpty(selectedItem.getRemark())) {
chatName = selectedItem.getRemark();
} else if (!TextUtils.isEmpty(selectedItem.getNickName())) {
chatName = selectedItem.getNickName();
}
MinimalistUIUtils.startChatActivity(selectedItem.getId(), ContactItemBean.TYPE_C2C, chatName, selectedItem.getAvatarUrl(), null);
finish();
}
}
@@ -0,0 +1,222 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.RoundCornerImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactAdapter;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class StartGroupChatMinimalistActivity extends AppCompatActivity {
private static final String TAG = StartGroupChatMinimalistActivity.class.getSimpleName();
private TextView cancelButton;
private TextView nextButton;
private ContactListView mContactListView;
private ArrayList<GroupMemberInfo> mMembers = new ArrayList<>();
private int mJoinTypeIndex = 2;
private ArrayList<String> mJoinTypes = new ArrayList<>();
private ArrayList<String> mGroupTypeValue = new ArrayList<>();
private RecyclerView selectedList;
private GroupMemberSelectedAdapter selectedListAdapter;
private ContactPresenter presenter;
private GroupMemberInfo selfInfo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.minimalist_popup_start_group_chat_activity);
selfInfo = new GroupMemberInfo();
selfInfo.setUserId(ContactUtils.getLoginUser());
selfInfo.setNickName(TUIConfig.getSelfNickName());
init();
}
private void init() {
String[] array = getResources().getStringArray(R.array.group_type);
mGroupTypeValue.addAll(Arrays.asList(array));
array = getResources().getStringArray(R.array.group_join_type);
mJoinTypes.addAll(Arrays.asList(array));
cancelButton = findViewById(R.id.cancel_button);
nextButton = findViewById(R.id.next_button);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toCreateGroupChat();
}
});
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mContactListView = findViewById(R.id.group_create_member_list);
selectedList = findViewById(R.id.selected_list);
selectedListAdapter = new GroupMemberSelectedAdapter();
selectedList.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
selectedList.setAdapter(selectedListAdapter);
presenter = new ContactPresenter();
presenter.setFriendListListener();
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
selectedList.setVisibility(View.GONE);
selectedListAdapter.setSelectedMemberClickedListener(new OnSelectedMemberClickedListener() {
@Override
public void onRemove(GroupMemberInfo groupMemberInfo) {
ContactAdapter adapter = mContactListView.getAdapter();
adapter.setSelected(groupMemberInfo.getUserId(), false);
}
});
ArrayList<String> alreadySelectedList = new ArrayList<>();
alreadySelectedList.add(TUILogin.getLoginUser());
mContactListView.setAlreadySelectedList(alreadySelectedList);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
if (selected) {
GroupMemberInfo memberInfo = new GroupMemberInfo();
memberInfo.setUserId(contact.getId());
memberInfo.setNickName(contact.getNickName());
memberInfo.setFaceUrl(contact.getAvatarUrl());
mMembers.add(memberInfo);
selectedListAdapter.setMembers(mMembers);
selectedListAdapter.notifyItemInserted(mMembers.indexOf(memberInfo));
} else {
for (int i = mMembers.size() - 1; i >= 0; i--) {
if (mMembers.get(i).getUserId().equals(contact.getId())) {
selectedListAdapter.notifyItemRemoved(i);
mMembers.remove(i);
selectedListAdapter.setMembers(mMembers);
break;
}
}
}
if (mMembers.size() > 0) {
nextButton.setAlpha(1f);
nextButton.setEnabled(true);
selectedList.setVisibility(View.VISIBLE);
} else {
nextButton.setAlpha(0.5f);
nextButton.setEnabled(false);
selectedList.setVisibility(View.GONE);
}
}
});
nextButton.setAlpha(0.5f);
nextButton.setEnabled(false);
}
private void toCreateGroupChat() {
if (mMembers.isEmpty()) {
ToastUtil.toastLongMessage(getResources().getString(R.string.tips_empty_group_member));
return;
}
String groupName = selfInfo.getDisplayName();
for (int i = 1; i < mMembers.size(); i++) {
groupName = groupName + "" + mMembers.get(i).getDisplayName();
}
if (groupName.length() >= 10) {
groupName = groupName.substring(0, 7) + "..";
}
Intent intent = new Intent(this, CreateGroupMinimalistActivity.class);
intent.putExtra(TUIConstants.TUIContact.GROUP_NAME, groupName);
intent.putExtra(TUIConstants.TUIContact.JOIN_TYPE_INDEX, mJoinTypeIndex);
intent.putExtra(TUIConstants.TUIContact.GROUP_MEMBER_ID_LIST, mMembers);
startActivity(intent);
finish();
}
public interface OnSelectedMemberClickedListener {
void onRemove(GroupMemberInfo groupMemberInfo);
}
public static class GroupMemberSelectedAdapter extends RecyclerView.Adapter<GroupMemberSelectedAdapter.GroupMemberSelectedViewHolder> {
private List<GroupMemberInfo> mMembers;
private OnSelectedMemberClickedListener selectedMemberClickedListener;
public void setMembers(List<GroupMemberInfo> mMembers) {
this.mMembers = mMembers;
}
public void setSelectedMemberClickedListener(OnSelectedMemberClickedListener selectedMemberClickedListener) {
this.selectedMemberClickedListener = selectedMemberClickedListener;
}
@NonNull
@Override
public GroupMemberSelectedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new GroupMemberSelectedViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_create_group_list_selected_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull GroupMemberSelectedViewHolder holder, int position) {
GroupMemberInfo groupMemberInfo = mMembers.get(position);
GlideEngine.loadImage(holder.userIconView, groupMemberInfo.getFaceUrl());
holder.userNameTv.setText(groupMemberInfo.getDisplayName());
holder.removeIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedMemberClickedListener != null) {
selectedMemberClickedListener.onRemove(groupMemberInfo);
}
}
});
}
@Override
public int getItemCount() {
if (mMembers == null) {
return 0;
}
return mMembers.size();
}
public static class GroupMemberSelectedViewHolder extends RecyclerView.ViewHolder {
public RoundCornerImageView userIconView;
public ImageView removeIcon;
public TextView userNameTv;
public GroupMemberSelectedViewHolder(@NonNull View itemView) {
super(itemView);
userIconView = itemView.findViewById(R.id.ivAvatar);
removeIcon = itemView.findViewById(R.id.remove_icon);
userNameTv = itemView.findViewById(R.id.user_name_tv);
userIconView.setRadius(ScreenUtil.dip2px(25));
}
}
}
}
@@ -0,0 +1,245 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
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 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.TUIConstants;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.RoundCornerImageView;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.activities.BaseMinimalistLightActivity;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
public class StartGroupMemberSelectMinimalistActivity extends BaseMinimalistLightActivity {
private static final String TAG = StartGroupMemberSelectMinimalistActivity.class.getSimpleName();
private TitleBarLayout mTitleBar;
private ContactListView mContactListView;
private ArrayList<GroupMemberInfo> mMembers = new ArrayList<>();
private ArrayList<String> alreadySelectedList;
private RecyclerView selectedList;
private SelectedAdapter selectedListAdapter;
private TextView confirmButton;
private ContactPresenter presenter;
private int limit;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_minimalist_start_group_select_activity);
init();
}
private ArrayList<String> getMembersDisplayName() {
if (mMembers.isEmpty()) {
return new ArrayList<>();
}
ArrayList<String> nameCards = new ArrayList<>();
for (int i = 0; i < mMembers.size(); i++) {
nameCards.add(mMembers.get(i).getDisplayName());
}
return nameCards;
}
private ArrayList<String> getMembersUserId() {
if (mMembers.isEmpty()) {
return new ArrayList<>();
}
ArrayList<String> userIds = new ArrayList<>();
for (int i = 0; i < mMembers.size(); i++) {
userIds.add(mMembers.get(i).getUserId());
}
return userIds;
}
private void init() {
mMembers.clear();
String groupId = getIntent().getStringExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.GROUP_ID);
if (TextUtils.isEmpty(groupId)) {
groupId = getIntent().getStringExtra(TUIConstants.TUIContact.GROUP_ID);
}
String title = getIntent().getStringExtra(TUIContactConstants.Selection.TITLE);
if (TextUtils.isEmpty(title)) {
title = getIntent().getStringExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.PAGE_TITLE);
}
limit = getIntent().getIntExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.MEMBER_LIMIT, Integer.MAX_VALUE);
alreadySelectedList = getIntent().getStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECTED_LIST);
mTitleBar = findViewById(R.id.group_create_title_bar);
mTitleBar.setTitle(getResources().getString(com.tencent.qcloud.tuicore.R.string.sure), ITitleBarLayout.Position.RIGHT);
if (!TextUtils.isEmpty(title)) {
mTitleBar.setTitle(title, ITitleBarLayout.Position.MIDDLE);
}
mTitleBar.getRightIcon().setVisibility(View.GONE);
mTitleBar.setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmAndFinish();
}
});
mTitleBar.setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
confirmButton = findViewById(R.id.confirm_button);
selectedList = findViewById(R.id.selected_list);
selectedListAdapter = new SelectedAdapter();
selectedList.setLayoutManager(new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false));
selectedList.setAdapter(selectedListAdapter);
mContactListView = findViewById(R.id.group_create_member_list);
mContactListView.setAlreadySelectedList(alreadySelectedList);
presenter = new ContactPresenter();
presenter.setFriendListListener();
boolean isSelectForCall = getIntent().getBooleanExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FOR_CALL, false);
presenter.setIsForCall(isSelectForCall);
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
mContactListView.setGroupId(groupId);
boolean isSelectFriends = getIntent().getBooleanExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.SELECT_FRIENDS, false);
if (isSelectFriends) {
mTitleBar.setTitle(getString(R.string.add_group_member), TitleBarLayout.Position.MIDDLE);
mContactListView.loadDataSource(ContactListView.DataSource.FRIEND_LIST);
} else {
mContactListView.loadDataSource(ContactListView.DataSource.GROUP_MEMBER_LIST);
}
if (!isSelectForCall && !isSelectFriends) {
mContactListView.setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
if (position == 0) {
mMembers.clear();
Intent i = new Intent();
i.putStringArrayListExtra(
TUIContactConstants.Selection.USER_NAMECARD_SELECT, new ArrayList<String>(Arrays.asList(getString(R.string.at_all))));
i.putStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.USER_NAME_CARD_SELECT,
new ArrayList<String>(Arrays.asList(getString(R.string.at_all))));
i.putStringArrayListExtra(
TUIContactConstants.Selection.USER_ID_SELECT, new ArrayList<String>(Arrays.asList(TUIContactConstants.Selection.SELECT_ALL)));
i.putStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.USER_ID_SELECT,
new ArrayList<String>(Arrays.asList(TUIContactConstants.Selection.SELECT_ALL)));
setResult(3, i);
finish();
}
}
});
}
mContactListView.setOnSelectChangeListener(new ContactListView.OnSelectChangedListener() {
@Override
public void onSelectChanged(ContactItemBean contact, boolean selected) {
if (selected) {
GroupMemberInfo memberInfo = new GroupMemberInfo();
memberInfo.setUserId(contact.getId());
memberInfo.setFaceUrl(contact.getAvatarUrl());
memberInfo.setNameCard(contact.getNameCard());
memberInfo.setFriendRemark(contact.getRemark());
memberInfo.setNickName(contact.getNickName());
mMembers.add(memberInfo);
} else {
for (int i = mMembers.size() - 1; i >= 0; i--) {
if (mMembers.get(i).getUserId().equals(contact.getId())) {
mMembers.remove(i);
}
}
}
selectedListAdapter.setMembers(mMembers);
selectedListAdapter.notifyDataSetChanged();
}
});
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
confirmAndFinish();
}
});
}
private void confirmAndFinish() {
if (mMembers.size() > limit) {
String overLimitTip = String.format(Locale.US, getString(R.string.contact_over_limit_tip), limit);
ToastUtil.toastShortMessage(overLimitTip);
return;
}
Intent i = new Intent();
List<String> friendIdList = new ArrayList<>();
for (GroupMemberInfo memberInfo : mMembers) {
friendIdList.add(memberInfo.getUserId());
}
i.putExtra(TUIContactConstants.Selection.LIST, (Serializable) friendIdList);
i.putExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.DATA_LIST, (Serializable) friendIdList);
i.putStringArrayListExtra(TUIContactConstants.Selection.USER_NAMECARD_SELECT, getMembersDisplayName());
i.putStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.USER_NAME_CARD_SELECT, getMembersDisplayName());
i.putStringArrayListExtra(TUIContactConstants.Selection.USER_ID_SELECT, getMembersUserId());
i.putStringArrayListExtra(TUIConstants.TUIContact.StartActivity.GroupMemberSelect.USER_ID_SELECT, getMembersUserId());
i.putExtras(getIntent());
setResult(3, i);
finish();
}
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.contact_forward_contact_selector_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull SelectedViewHolder holder, int position) {
GlideEngine.loadImage(holder.userIconView, mMembers.get(position).getFaceUrl());
}
@Override
public int getItemCount() {
if (mMembers == null) {
return 0;
}
return mMembers.size();
}
public class SelectedViewHolder extends RecyclerView.ViewHolder {
public RoundCornerImageView userIconView;
public SelectedViewHolder(@NonNull View itemView) {
super(itemView);
userIconView = itemView.findViewById(R.id.ivAvatar);
userIconView.setRadius(ScreenUtil.dip2px(20));
}
}
}
}
@@ -0,0 +1,90 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.MinimalistUIExtensionObserver;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.util.MinimalistUIUtils;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactLayout;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget.ContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
public class TUIContactMinimalistFragment extends Fragment {
private static final String TAG = TUIContactMinimalistFragment.class.getSimpleName();
private ContactLayout mContactLayout;
private ContactPresenter presenter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View baseView = inflater.inflate(R.layout.minimalist_contact_fragment, container, false);
initViews(baseView);
return baseView;
}
private void initViews(View view) {
mContactLayout = view.findViewById(R.id.contact_layout);
presenter = new ContactPresenter();
presenter.setFriendListListener();
mContactLayout.setPresenter(presenter);
mContactLayout.initDefault();
mContactLayout.setOnClickListener(new OnClickListener() {
@Override
public void finishActivity() {
getActivity().finish();
}
});
mContactLayout.getContactListView().setOnItemClickListener(new ContactListView.OnItemClickListener() {
@Override
public void onItemClick(int position, ContactItemBean contact) {
if (position == 0) {
Intent intent = new Intent(TUIContactService.getAppContext(), NewFriendApplicationMinimalistActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUIContactService.getAppContext().startActivity(intent);
} else if (position == 1) {
Intent intent = new Intent(TUIContactService.getAppContext(), GroupListMinimalistActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUIContactService.getAppContext().startActivity(intent);
} else if (position == 2) {
Intent intent = new Intent(TUIContactService.getAppContext(), BlackListMinimalistActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TUIContactService.getAppContext().startActivity(intent);
} else {
MinimalistUIUtils.showContactDetails(contact.getId());
}
}
});
}
public void reloadData() {
if (mContactLayout != null) {
mContactLayout.reloadData();
}
}
@Override
public void onResume() {
super.onResume();
TUIContactLog.i(TAG, "onResume");
mContactLayout.initUI();
}
public interface OnClickListener {
void finishActivity();
}
}
@@ -0,0 +1,51 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.util;
import android.os.Bundle;
import android.text.TextUtils;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import java.util.ArrayList;
public class MinimalistUIUtils {
public static boolean isC2CChat(int chatType) {
return chatType == V2TIMConversation.V2TIM_C2C;
}
public static boolean isGroupChat(int chatType) {
return chatType == V2TIMConversation.V2TIM_GROUP;
}
public static void startChatActivity(String chatId, int chatType, String chatName, String faceUrl, ArrayList<Object> faceIconList) {
if (TextUtils.isEmpty(chatId)) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, chatId);
bundle.putString(TUIConstants.TUIChat.CHAT_NAME, chatName);
bundle.putInt(TUIConstants.TUIChat.CHAT_TYPE, chatType);
bundle.putString(TUIConstants.TUIChat.FACE_URL, faceUrl);
if (isGroupChat(chatType)) {
if (!TextUtils.isEmpty(faceUrl)) {
ArrayList<Object> realList = new ArrayList<>();
realList.add(faceUrl);
bundle.putSerializable(TUIConstants.TUIChat.FACE_URL_LIST, realList);
} else {
bundle.putSerializable(TUIConstants.TUIChat.FACE_URL_LIST, faceIconList);
}
}
if (isGroupChat(chatType)) {
TUICore.startActivity("TUIGroupChatMinimalistActivity", bundle);
} else {
TUICore.startActivity("TUIC2CChatMinimalistActivity", bundle);
}
}
public static void showContactDetails(String userID) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TUIChat.CHAT_ID, userID);
TUICore.startActivity("FriendProfileMinimalistActivity", bundle);
}
}
@@ -0,0 +1,276 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.graphics.drawable.Drawable;
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.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.imsdk.v2.V2TIMUserStatus;
import com.tencent.qcloud.tuicore.TUIThemeManager;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.TUIUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.config.TUIContactConfig;
import com.tencent.qcloud.tuikit.tuicontact.config.minimalistui.TUIContactConfigMinimalist;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.util.ArrayList;
import java.util.List;
public class ContactAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
protected List<ContactItemBean> mData;
private ContactListView.OnSelectChangedListener mOnSelectChangedListener;
private ContactListView.OnItemClickListener mOnClickListener;
private boolean isSingleSelectMode;
private ContactPresenter presenter;
private boolean isGroupList = false;
private int dataSourceType = ContactListView.DataSource.UNKNOWN;
private ArrayList<String> alreadySelectedList;
public ContactAdapter(List<ContactItemBean> data) {
this.mData = data;
}
public void setPresenter(ContactPresenter presenter) {
this.presenter = presenter;
}
public void setIsGroupList(boolean groupList) {
isGroupList = groupList;
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
this.alreadySelectedList = alreadySelectedList;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ContactItemBean.ITEM_BEAN_TYPE_CONTACT) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_minimalist_selecable_adapter_item, parent, false);
return new ContactItemViewHolder(view);
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_minimalist_controller_item_layout, parent, false);
return new ContactControllerViewHolder(view);
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {
final ContactItemBean contactBean = mData.get(position);
if (viewHolder instanceof ContactItemViewHolder) {
ContactItemViewHolder itemViewHolder = (ContactItemViewHolder) viewHolder;
itemViewHolder.tvName.setText(contactBean.getDisplayName());
if (!isSingleSelectMode && mOnSelectChangedListener != null) {
itemViewHolder.ccSelect.setVisibility(View.VISIBLE);
itemViewHolder.ccSelect.setChecked(contactBean.isSelected());
}
itemViewHolder.content.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!contactBean.isEnable()) {
return;
}
itemViewHolder.ccSelect.setChecked(!itemViewHolder.ccSelect.isChecked());
if (mOnSelectChangedListener != null) {
mOnSelectChangedListener.onSelectChanged(getItem(position), itemViewHolder.ccSelect.isChecked());
}
contactBean.setSelected(itemViewHolder.ccSelect.isChecked());
if (mOnClickListener != null) {
mOnClickListener.onItemClick(position, contactBean);
}
}
});
itemViewHolder.unreadText.setVisibility(View.GONE);
itemViewHolder.userStatusView.setVisibility(View.GONE);
int radius = ScreenUtil.dip2px(20);
if (TUIContactConfigMinimalist.getContactAvatarRadius() != TUIContactConfigMinimalist.UNDEFINED) {
radius = TUIContactConfigMinimalist.getContactAvatarRadius();
}
itemViewHolder.avatar.setRadius(radius);
if (isGroupList) {
int defaultIconResId = TUIUtil.getDefaultGroupIconResIDByGroupType(itemViewHolder.itemView.getContext(), contactBean.getGroupType());
GlideEngine.loadUserIcon(itemViewHolder.avatar, contactBean.getAvatarUrl(), defaultIconResId, radius);
} else {
GlideEngine.loadUserIcon(itemViewHolder.avatar, contactBean.getAvatarUrl(), radius);
}
if (dataSourceType == ContactListView.DataSource.CONTACT_LIST && TUIContactConfigMinimalist.isShowUserOnlineStatusIcon()) {
itemViewHolder.userStatusView.setVisibility(View.VISIBLE);
if (contactBean.getStatusType() == V2TIMUserStatus.V2TIM_USER_STATUS_ONLINE) {
itemViewHolder.userStatusView.setBackgroundResource(
TUIThemeManager.getAttrResId(TUIContactService.getAppContext(), com.tencent.qcloud.tuikit.timcommon.R.attr.user_status_online));
} else {
itemViewHolder.userStatusView.setBackgroundResource(
TUIThemeManager.getAttrResId(TUIContactService.getAppContext(), com.tencent.qcloud.tuikit.timcommon.R.attr.user_status_offline));
}
} else {
itemViewHolder.userStatusView.setVisibility(View.GONE);
}
setAlreadySelected(itemViewHolder, contactBean);
} else {
ContactControllerViewHolder controllerViewHolder = (ContactControllerViewHolder) viewHolder;
String newFriendString = TUIContactService.getAppContext().getResources().getString(R.string.new_friend);
String myGroupString = TUIContactService.getAppContext().getResources().getString(R.string.group);
String blokeListString = TUIContactService.getAppContext().getResources().getString(R.string.blacklist);
if (presenter.newContacts == contactBean) {
controllerViewHolder.controllerName.setText(newFriendString);
controllerViewHolder.unreadText.setText(contactBean.getUnreadCount() + "");
if (contactBean.getUnreadCount() > 0) {
controllerViewHolder.unreadText.setVisibility(View.VISIBLE);
} else {
controllerViewHolder.unreadText.setVisibility(View.GONE);
}
} else if (TextUtils.equals(myGroupString, contactBean.getId())) {
controllerViewHolder.controllerName.setText(myGroupString);
controllerViewHolder.unreadText.setVisibility(View.GONE);
} else if (TextUtils.equals(blokeListString, contactBean.getId())) {
controllerViewHolder.controllerName.setText(blokeListString);
controllerViewHolder.unreadText.setVisibility(View.GONE);
}
controllerViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnClickListener != null) {
mOnClickListener.onItemClick(position, contactBean);
}
}
});
}
}
public void setSelected(String userID, boolean isSelected) {
ContactItemBean contact = null;
for (ContactItemBean item : mData) {
if (TextUtils.equals(item.getId(), userID)) {
contact = item;
break;
}
}
if (contact == null) {
return;
}
contact.setSelected(isSelected);
if (mOnSelectChangedListener != null) {
mOnSelectChangedListener.onSelectChanged(contact, isSelected);
}
notifyDataSetChanged();
}
private void setAlreadySelected(ContactItemViewHolder holder, ContactItemBean contactItemBean) {
if (alreadySelectedList != null && alreadySelectedList.contains(contactItemBean.getId())) {
holder.ccSelect.setChecked(true);
holder.itemView.setEnabled(false);
holder.ccSelect.setEnabled(false);
} else {
holder.itemView.setEnabled(true);
holder.ccSelect.setEnabled(true);
holder.ccSelect.setSelected(contactItemBean.isSelected());
}
}
@Override
public int getItemViewType(int position) {
final ContactItemBean contactBean = mData.get(position);
return contactBean.getItemBeanType();
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
if (holder instanceof ContactItemViewHolder) {
GlideEngine.clear(((ContactItemViewHolder) holder).avatar);
((ContactItemViewHolder) holder).avatar.setImageResource(0);
}
super.onViewRecycled(holder);
}
private ContactItemBean getItem(int position) {
if (position < mData.size()) {
return mData.get(position);
}
return null;
}
@Override
public int getItemCount() {
return mData != null ? mData.size() : 0;
}
public void setDataSource(List<ContactItemBean> datas) {
this.mData = datas;
notifyDataSetChanged();
}
public void setSingleSelectMode(boolean mode) {
isSingleSelectMode = mode;
}
public void setOnSelectChangedListener(ContactListView.OnSelectChangedListener selectListener) {
mOnSelectChangedListener = selectListener;
}
public void setOnItemClickListener(ContactListView.OnItemClickListener listener) {
mOnClickListener = listener;
}
public void setDataSourceType(int dataSourceType) {
this.dataSourceType = dataSourceType;
}
public void onDataChanged(ContactItemBean data) {
int index = mData.indexOf(data);
if (index != -1) {
notifyItemChanged(index);
}
}
public static class ContactItemViewHolder extends RecyclerView.ViewHolder {
TextView tvName;
TextView unreadText;
ShadeImageView avatar;
CheckBox ccSelect;
View content;
View userStatusView;
public ContactItemViewHolder(View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tvCity);
unreadText = itemView.findViewById(R.id.conversation_unread);
unreadText.setVisibility(View.GONE);
avatar = itemView.findViewById(R.id.ivAvatar);
ccSelect = itemView.findViewById(R.id.contact_check_box);
content = itemView.findViewById(R.id.selectable_contact_item);
userStatusView = itemView.findViewById(R.id.user_status);
avatar.setRadius(ScreenUtil.dip2px(20));
}
}
public static class ContactControllerViewHolder extends RecyclerView.ViewHolder {
TextView controllerName;
TextView unreadText;
ImageView arrow;
public ContactControllerViewHolder(View itemView) {
super(itemView);
controllerName = itemView.findViewById(R.id.controller_name);
unreadText = itemView.findViewById(R.id.unread_count);
arrow = itemView.findViewById(R.id.arrow_icon);
Drawable arrowDrawable = arrow.getBackground();
if (arrowDrawable != null) {
arrowDrawable.setAutoMirrored(true);
}
unreadText.setVisibility(View.GONE);
}
}
}
@@ -0,0 +1,163 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.action.PopActionClickListener;
import com.tencent.qcloud.tuikit.timcommon.component.action.PopMenuAction;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.interfaces.IContactLayout;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.AddMoreMinimalistDialogFragment;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.TUIContactMinimalistFragment;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.util.ArrayList;
import java.util.List;
public class ContactLayout extends LinearLayout implements IContactLayout {
private static final String TAG = ContactLayout.class.getSimpleName();
private ContactListView mContactListView;
private View createNewButton;
private Menu menu;
private ImageView homeView;
private TextView titleView;
private TextView rtCubeTitleView;
private TUIContactMinimalistFragment.OnClickListener mClickListener = null;
private ContactPresenter presenter;
public ContactLayout(Context context) {
super(context);
init();
}
public ContactLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public ContactLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void setPresenter(ContactPresenter presenter) {
this.presenter = presenter;
}
private void init() {
inflate(getContext(), R.layout.minimalist_contact_layout, this);
mContactListView = findViewById(R.id.contact_listview);
createNewButton = findViewById(R.id.create_new_button);
homeView = findViewById(R.id.home_rtcube);
titleView = findViewById(R.id.title);
rtCubeTitleView = findViewById(R.id.title_rtcube);
initContactMenu();
createNewButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (menu != null && !menu.isShowing()) {
menu.show();
}
}
});
}
public void setOnClickListener(TUIContactMinimalistFragment.OnClickListener listener) {
mClickListener = listener;
}
public void initUI() {
if (TUIConfig.getTUIHostType() != TUIConfig.TUI_HOST_TYPE_RTCUBE) {
homeView.setVisibility(GONE);
titleView.setVisibility(VISIBLE);
rtCubeTitleView.setVisibility(GONE);
} else {
homeView.setVisibility(VISIBLE);
titleView.setVisibility(GONE);
rtCubeTitleView.setVisibility(VISIBLE);
homeView.setBackgroundResource(com.tencent.qcloud.tuikit.timcommon.R.drawable.common_title_bar_home_icon);
homeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putString(TUIConstants.TIMAppKit.BACK_TO_RTCUBE_DEMO_TYPE_KEY, TUIConstants.TIMAppKit.BACK_TO_RTCUBE_DEMO_TYPE_IM);
TUICore.startActivity("TRTCMainActivity", bundle);
if (mClickListener != null) {
mClickListener.finishActivity();
}
}
});
}
}
private void initContactMenu() {
menu = new Menu((Activity) getContext(), createNewButton);
PopActionClickListener popActionClickListener = new PopActionClickListener() {
@Override
public void onActionClick(int index, Object data) {
PopMenuAction action = (PopMenuAction) data;
boolean isGroup = false;
if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.add_friend))) {
isGroup = false;
}
if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.add_group))) {
isGroup = true;
}
AddMoreMinimalistDialogFragment addFragment = new AddMoreMinimalistDialogFragment();
addFragment.setIsGroup(isGroup);
addFragment.show(((AppCompatActivity) getContext()).getSupportFragmentManager(), "AddMoreDialog");
menu.hide();
}
};
PopMenuAction action = new PopMenuAction();
action.setActionName(getResources().getString(R.string.add_friend));
action.setIconResId(R.drawable.contact_add_friend);
action.setActionClickListener(popActionClickListener);
List<PopMenuAction> menuActionList = new ArrayList<>(2);
menuActionList.add(action);
action = new PopMenuAction();
action.setActionName(getResources().getString(R.string.add_group));
action.setIconResId(R.drawable.contact_add_group);
action.setActionClickListener(popActionClickListener);
menuActionList.add(action);
menu.setMenuAction(menuActionList);
}
public void initDefault() {
mContactListView.setPresenter(presenter);
presenter.setContactListView(mContactListView);
mContactListView.loadDataSource(ContactListView.DataSource.CONTACT_LIST);
}
public void reloadData() {
mContactListView.loadDataSource(ContactListView.DataSource.CONTACT_LIST);
}
@Override
public ContactListView getContactListView() {
return mContactListView;
}
@Override
public TitleBarLayout getTitleBar() {
return null;
}
@Override
public void setParentLayout(Object parent) {}
}
@@ -0,0 +1,178 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.indexbar.widget.IndexBar;
import com.tencent.qcloud.tuikit.tuicontact.component.indexlib.suspension.SuspensionDecoration;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IContactListView;
import com.tencent.qcloud.tuikit.tuicontact.presenter.ContactPresenter;
import java.util.ArrayList;
import java.util.List;
public class ContactListView extends LinearLayout implements IContactListView {
private static final String TAG = ContactListView.class.getSimpleName();
private RecyclerView mRv;
private ContactAdapter mAdapter;
private CustomLinearLayoutManager mManager;
private List<ContactItemBean> mData = new ArrayList<>();
private SuspensionDecoration mDecoration;
private ProgressBar mContactLoadingBar;
private String groupId;
private boolean isGroupList = false;
private TextView notFoundTip;
private IndexBar mIndexBar;
private TextView mTvSideBarHint;
private ContactPresenter presenter;
public ContactListView(Context context) {
super(context);
init();
}
public ContactListView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public ContactListView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void setPresenter(ContactPresenter presenter) {
this.presenter = presenter;
if (mAdapter != null) {
mAdapter.setPresenter(presenter);
mAdapter.setIsGroupList(isGroupList);
}
}
public void setIsGroupList(boolean isGroupList) {
this.isGroupList = isGroupList;
}
public void setAlreadySelectedList(ArrayList<String> alreadySelectedList) {
mAdapter.setAlreadySelectedList(alreadySelectedList);
}
private void init() {
inflate(getContext(), R.layout.minimalist_contact_list, this);
mRv = findViewById(R.id.contact_member_list);
notFoundTip = findViewById(R.id.not_found_tip);
mManager = new CustomLinearLayoutManager(getContext());
mRv.setLayoutManager(mManager);
mAdapter = new ContactAdapter(mData);
mRv.setAdapter(mAdapter);
mDecoration = new SuspensionDecoration(getContext(), mData);
mDecoration.setColorTitleBg(Color.WHITE);
mDecoration.setColorTitleFont(Color.BLACK);
mDecoration.setTitleHeight(ScreenUtil.dip2px(44));
mDecoration.setShowLine(false);
mRv.addItemDecoration(mDecoration);
mRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (lastCompletelyVisibleItemPosition == layoutManager.getItemCount() - 1) {
if (presenter.getNextSeq() > 0) {
presenter.loadGroupMemberList(groupId);
}
}
}
});
mTvSideBarHint = findViewById(R.id.contact_tvSideBarHint);
mIndexBar = findViewById(R.id.contact_indexBar);
mIndexBar.setPressedShowTextView(mTvSideBarHint).setNeedRealIndex(false).setLayoutManager(mManager);
mContactLoadingBar = findViewById(R.id.contact_loading_bar);
}
public ContactAdapter getAdapter() {
return mAdapter;
}
public void setNotFoundTip(String text) {
notFoundTip.setText(text);
}
@Override
public void onDataSourceChanged(List<ContactItemBean> data) {
if (data == null || data.isEmpty()) {
if (!TextUtils.isEmpty(notFoundTip.getText())) {
notFoundTip.setVisibility(VISIBLE);
}
} else {
notFoundTip.setVisibility(GONE);
}
mContactLoadingBar.setVisibility(GONE);
this.mData = data;
mAdapter.setDataSource(mData);
mIndexBar.setSourceDatas(mData).invalidate();
mDecoration.setDatas(mData);
}
@Override
public void onDataChanged(ContactItemBean contactItemBean) {
if (mAdapter != null) {
mAdapter.onDataChanged(contactItemBean);
}
}
public void setSingleSelectMode(boolean mode) {
mAdapter.setSingleSelectMode(mode);
}
public void setOnSelectChangeListener(OnSelectChangedListener selectChangeListener) {
mAdapter.setOnSelectChangedListener(selectChangeListener);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mAdapter.setOnItemClickListener(listener);
}
public void loadDataSource(int dataSource) {
if (presenter == null) {
return;
}
if (mAdapter != null) {
mAdapter.setDataSourceType(dataSource);
}
mContactLoadingBar.setVisibility(VISIBLE);
if (dataSource == DataSource.GROUP_MEMBER_LIST) {
presenter.loadGroupMemberList(groupId);
} else {
presenter.loadDataSource(dataSource);
}
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public interface OnSelectChangedListener {
void onSelectChanged(ContactItemBean contact, boolean selected);
}
public interface OnItemClickListener {
void onItemClick(int position, ContactItemBean contact);
}
}
@@ -0,0 +1,116 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.fragment.app.FragmentManager;
import com.tencent.qcloud.tuikit.tuicontact.R;
public class ContactToast {
public static final int TOAST_ICON_NONE = 0;
public static final int TOAST_ICON_POSITIVE = 1;
public static final int TOAST_ICON_NEGATIVE = 2;
private final Handler handler;
private ToastFragment toast;
private static class ContactToastHolder {
private static final ContactToast instance = new ContactToast();
}
private static ContactToast getInstance() {
return ContactToastHolder.instance;
}
private ContactToast() {
handler = new Handler(Looper.getMainLooper());
}
public static void showToast(Context context, String toastContent) {
showToast(context, toastContent, true, TOAST_ICON_NONE);
}
public static void showToast(Context context, String toastContent, int iconType) {
showToast(context, toastContent, true, iconType);
}
public static void showToast(Context context, String toastContent, boolean isShortTime, int iconType) {
long time = 3000;
if (isShortTime) {
time = 1500;
}
getInstance().showToast(context, toastContent, time, iconType);
}
private void showToast(Context context, String toastContent, long time, int iconType) {
if (context instanceof AppCompatActivity) {
if (toast != null) {
dismiss();
}
toast = new ToastFragment();
toast.iconType = iconType;
toast.text = toastContent;
FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();
toast.show(fragmentManager, "ContactToast");
handler.postDelayed(new Runnable() {
@Override
public void run() {
dismiss();
}
}, time);
}
}
private void dismiss() {
if (toast != null) {
toast.dismiss();
toast = null;
}
handler.removeCallbacksAndMessages(null);
}
public static class ToastFragment extends AppCompatDialogFragment {
int iconType = TOAST_ICON_NONE;
String text;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
Window window = dialog.getWindow();
window.setBackgroundDrawableResource(R.drawable.contact_custom_toast_border);
return dialog;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.contact_custom_toast_layout, container);
TextView textView = view.findViewById(R.id.text_tv);
ImageView iconView = view.findViewById(R.id.icon_iv);
textView.setText(text);
if (iconType == TOAST_ICON_POSITIVE) {
iconView.setBackgroundResource(R.drawable.contact_toast_postive_icon);
} else if (iconType == TOAST_ICON_NEGATIVE) {
iconView.setBackgroundResource(R.drawable.contact_toast_negative_icon);
} else {
iconView.setVisibility(View.GONE);
}
return view;
}
}
}
@@ -0,0 +1,171 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.tencent.imsdk.v2.V2TIMGroupApplication;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.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();
}
@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) {
ApplyViewHolder holder;
final GroupApplyInfo info = getItem(i);
if (view == null) {
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.group_minimalist_new_group_application_item, 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 ApplyViewHolder();
holder.memberIcon = view.findViewById(R.id.avatar);
holder.memberName = view.findViewById(R.id.name);
holder.reason = view.findViewById(R.id.description);
holder.accept = view.findViewById(R.id.agree);
holder.refuse = view.findViewById(R.id.reject);
holder.resultTv = view.findViewById(R.id.result_tv);
view.setTag(holder);
} else {
holder = (ApplyViewHolder) view.getTag();
}
if (info.getGroupApplication().getApplicationType() == V2TIMGroupApplication.V2TIM_GROUP_INVITE_APPLICATION_NEED_APPROVED_BY_ADMIN) {
holder.memberName.setText(info.getGroupApplication().getFromUser());
holder.reason.setText(view.getResources().getString(R.string.invite) + " " + info.getGroupApplication().getToUser());
} else {
if (TextUtils.isEmpty(info.getFromUserNickName())) {
holder.memberName.setText(info.getFromUserID());
} else {
holder.memberName.setText(info.getFromUserNickName());
}
holder.reason.setText(info.getAddWording());
}
int radius = ScreenUtil.dip2px(25);
holder.memberIcon.setRadius(radius);
GlideEngine.loadUserIcon(holder.memberIcon, info.getFromUserFaceUrl(), radius);
if (info.getStatus() == GroupApplyInfo.UNHANDLED) {
holder.accept.setVisibility(View.VISIBLE);
holder.accept.setText(R.string.accept);
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.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
refuseApply(i, info);
}
});
} else if (info.getStatus() == GroupApplyInfo.APPLIED) {
holder.accept.setClickable(false);
holder.resultTv.setText(R.string.accepted);
holder.resultTv.setVisibility(View.VISIBLE);
holder.accept.setVisibility(View.GONE);
holder.refuse.setVisibility(View.GONE);
} else if (info.getStatus() == GroupApplyInfo.REFUSED) {
holder.refuse.setClickable(false);
holder.resultTv.setVisibility(View.VISIBLE);
holder.resultTv.setText(R.string.refused);
holder.accept.setVisibility(View.GONE);
holder.refuse.setVisibility(View.GONE);
}
return view;
}
public void setOnItemClickListener(OnItemClickListener l) {
mOnItemClickListener = l;
}
public void updateItemData(GroupApplyInfo info) {
for (GroupApplyInfo item : mGroupMembers) {
if (TextUtils.equals(item.getGroupApplication().getFromUser(), info.getGroupApplication().getFromUser())
&& TextUtils.equals(item.getGroupID(), info.getGroupID())) {
item.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, null);
}
public void refuseApply(final int position, final GroupApplyInfo item) {
if (presenter == null) {
return;
}
presenter.refuseApply(item, null);
}
public interface OnItemClickListener {
void onItemClick(GroupApplyInfo info);
}
private static class ApplyViewHolder {
private ShadeImageView memberIcon;
private TextView memberName;
private TextView reason;
private TextView accept;
private TextView refuse;
private TextView resultTv;
}
}
@@ -0,0 +1,115 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import static android.app.Activity.RESULT_OK;
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.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultCaller;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuikit.timcommon.component.MinimalistTitleBar;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupApplyLayout;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.GroupApplyDetailMinimalistActivity;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupApplyPresenter;
import java.util.List;
public class GroupApplyManagerLayout extends LinearLayout implements IGroupApplyLayout {
private MinimalistTitleBar 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_minimalist_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.putSerializable(TUIContactConstants.Group.MEMBER_APPLY, info);
TUICore.startActivityForResult(
(ActivityResultCaller) getContext(), GroupApplyDetailMinimalistActivity.class, bundle, new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() != RESULT_OK || result.getData() == null) {
return;
}
GroupApplyInfo info = (GroupApplyInfo) result.getData().getSerializableExtra(TUIContactConstants.Group.MEMBER_APPLY);
if (info == null) {
return;
}
updateItemData(info);
}
});
}
});
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 void updateItemData(GroupApplyInfo info) {
mAdapter.updateItemData(info);
}
public void onDataSetChanged() {
mAdapter.notifyDataSetChanged();
}
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,149 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.content.res.Resources;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuicore.TUIConfig;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuikit.timcommon.bean.GroupProfileBean;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.GroupMemberGridListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class GroupInfoAdapter extends RecyclerView.Adapter<GroupInfoAdapter.GroupInfoMembersHolder> {
private List<GroupMemberInfo> groupMemberBeans = new ArrayList<>();
private GroupMemberGridListener groupMemberGridListener;
private GroupProfileBean groupProfileBean;
public void setGroupProfileBean(GroupProfileBean groupProfileBean) {
this.groupProfileBean = groupProfileBean;
}
public GroupMemberInfo getItem(int i) {
return groupMemberBeans.get(i);
}
@NonNull
@Override
public GroupInfoMembersHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_info_member_item_layout, parent, false);
return new GroupInfoMembersHolder(view);
}
@Override
public void onBindViewHolder(@NonNull GroupInfoMembersHolder holder, int position) {
final GroupMemberInfo groupMemberBean = getItem(position);
GlideEngine.loadImage(holder.memberIcon, groupMemberBean.getFaceUrl());
if (isSelf(groupMemberBean.getUserId())) {
holder.memberName.setText(holder.itemView.getResources().getString(R.string.group_you));
holder.rightArrow.setVisibility(View.GONE);
holder.roleName.setText(getRoleString(holder.itemView.getResources(), groupMemberBean.getRole()));
holder.itemView.setOnClickListener(null);
} else {
holder.memberName.setText(groupMemberBean.getDisplayName());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (groupMemberGridListener != null) {
groupMemberGridListener.onGroupMemberClicked(groupMemberBean);
}
}
});
}
holder.memberIcon.setBackground(null);
holder.memberIcon.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
@Override
public int getItemCount() {
return groupMemberBeans.size();
}
public void setGroupMemberGridListener(GroupMemberGridListener groupMemberGridListener) {
this.groupMemberGridListener = groupMemberGridListener;
}
public void setMemberList(List<GroupMemberInfo> members) {
groupMemberBeans.clear();
if (members == null || members.isEmpty()) {
return;
} else {
boolean containSelf = false;
for (GroupMemberInfo memberInfo : members) {
if (isSelf(memberInfo.getUserId())) {
containSelf = true;
break;
}
}
if (!containSelf) {
GroupMemberInfo selfInfo = new GroupMemberInfo();
selfInfo.setUserId(TUILogin.getLoginUser());
selfInfo.setFaceUrl(TUIConfig.getSelfFaceUrl());
selfInfo.setRole(groupProfileBean.getRoleInGroup());
members.add(selfInfo);
}
Collections.sort(members, new Comparator<GroupMemberInfo>() {
@Override
public int compare(GroupMemberInfo o1, GroupMemberInfo o2) {
if (isSelf(o1.getUserId())) {
return -1;
} else if (isSelf(o2.getUserId())) {
return 1;
}
return 0;
}
});
if (members.size() <= 3) {
groupMemberBeans.addAll(members);
} else {
groupMemberBeans.addAll(members.subList(0, 3));
}
}
notifyDataSetChanged();
}
public String getRoleString(Resources resources, int memberType) {
if (groupProfileBean.isOwner()) {
return resources.getString(R.string.group_owner_label);
} else if (groupProfileBean.isAdmin()) {
return resources.getString(R.string.group_manager_label);
} else {
return resources.getString(R.string.group_member_label);
}
}
public boolean isSelf(String userId) {
return TextUtils.equals(TUILogin.getLoginUser(), userId);
}
public static class GroupInfoMembersHolder extends RecyclerView.ViewHolder {
private final ShadeImageView memberIcon;
private final TextView memberName;
private final TextView roleName;
private final ImageView rightArrow;
public GroupInfoMembersHolder(@NonNull View itemView) {
super(itemView);
memberIcon = itemView.findViewById(R.id.group_member_icon);
memberIcon.setRadius(ScreenUtil.dip2px(24));
memberName = itemView.findViewById(R.id.group_member_name);
roleName = itemView.findViewById(R.id.role_text);
rightArrow = itemView.findViewById(R.id.rightArrow);
}
}
}
@@ -0,0 +1,223 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.timcommon.util.ThreadUtils;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuicontact.presenter.GroupInfoPresenter;
import java.util.ArrayList;
import java.util.Iterator;
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;
private GroupMemberLayout.OnGroupMemberClickListener onGroupMemberClickListener;
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;
}
public void setOnGroupMemberClickListener(GroupMemberLayout.OnGroupMemberClickListener onGroupMemberClickListener) {
this.onGroupMemberClickListener = onGroupMemberClickListener;
}
@NonNull
@Override
public GroupMemberViewHodler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_minimalist_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.getFaceUrl());
holder.memberName.setText(info.getDisplayName());
if (isSelectMode) {
holder.checkBox.setVisibility(View.VISIBLE);
holder.checkBox.setChecked(info.isSelected());
holder.arrowRight.setVisibility(View.GONE);
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.getUserId());
selectedGroupMemberInfos.add(info);
} else {
info.setSelected(false);
selectedMember.remove(info.getUserId());
selectedGroupMemberInfos.remove(info);
}
if (onSelectChangedListener != null) {
onSelectChangedListener.onSelectChanged();
}
}
});
holder.memberRoleTv.setVisibility(View.GONE);
} else {
if (presenter.isSelf(info.getUserId())) {
holder.itemView.setOnClickListener(null);
holder.arrowRight.setVisibility(View.GONE);
} else {
holder.arrowRight.setVisibility(View.VISIBLE);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onGroupMemberClickListener != null) {
onGroupMemberClickListener.onClick(info);
}
}
});
}
if (presenter.isOwner(info.getRole())) {
holder.memberRoleTv.setVisibility(View.VISIBLE);
holder.memberRoleTv.setText(holder.itemView.getResources().getString(R.string.group_owner_label));
} else if (presenter.isAdmin(info.getRole())) {
holder.memberRoleTv.setVisibility(View.VISIBLE);
holder.memberRoleTv.setText(holder.itemView.getResources().getString(R.string.group_manager_label));
} else {
holder.memberRoleTv.setVisibility(View.GONE);
}
}
setAlreadySelected(holder, info);
}
private void setAlreadySelected(GroupMemberViewHodler holder, GroupMemberInfo memberInfo) {
if (alreadySelectedList != null && alreadySelectedList.contains(memberInfo.getUserId())) {
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.getUserId())) {
continue;
}
mGroupMembers.add(groupMemberInfo);
}
}
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}
public void deleteMember(List<String> members) {
if (members == null || members.isEmpty()) {
return;
}
Iterator<GroupMemberInfo> iterator = mGroupMembers.listIterator();
while (iterator.hasNext()) {
if (members.contains(iterator.next().getUserId())) {
iterator.remove();
}
}
notifyDataSetChanged();
}
public void memberChanged(GroupMemberInfo groupMemberInfo) {
int index = mGroupMembers.indexOf(groupMemberInfo);
if (index != -1) {
notifyItemChanged(index);
}
}
protected class GroupMemberViewHodler extends RecyclerView.ViewHolder {
private ShadeImageView memberIcon;
private TextView memberName;
private TextView memberRoleTv;
private CheckBox checkBox;
private View arrowRight;
public GroupMemberViewHodler(@NonNull View itemView) {
super(itemView);
arrowRight = itemView.findViewById(R.id.rightArrow);
arrowRight.getBackground().setAutoMirrored(true);
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);
memberRoleTv = itemView.findViewById(R.id.member_role_tv);
}
}
}
@@ -0,0 +1,316 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
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.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.tuikit.timcommon.component.BottomSelectSheet;
import com.tencent.qcloud.tuikit.timcommon.component.CustomLinearLayoutManager;
import com.tencent.qcloud.tuikit.timcommon.component.RoundCornerImageView;
import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.ITitleBarLayout;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberChangedCallback;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberLayout;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IGroupMemberListener;
import com.tencent.qcloud.tuikit.tuicontact.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 OnGroupMemberClickListener onGroupMemberClickListener;
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_minimalist_member_layout, this);
mTitleBar = findViewById(R.id.group_member_title_bar);
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.getGroupMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
});
mAdapter.setOnGroupMemberClickListener(new OnGroupMemberClickListener() {
@Override
public void onClick(GroupMemberInfo groupMemberInfo) {
buildPopMenu(groupMemberInfo);
}
});
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) {
onGroupMemberListChanged(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 deleteMember(List<String> members) {
mAdapter.deleteMember(members);
}
public void memberChanged(GroupMemberInfo groupMemberInfo) {
mAdapter.memberChanged(groupMemberInfo);
}
public void onGroupInfoChanged(GroupInfo groupInfo) {}
@Override
public void onGroupMemberListChanged(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.getGroupMemberCount() + ")", TitleBarLayout.Position.MIDDLE);
}
}
}
private void buildPopMenu(GroupMemberInfo groupMemberInfo) {
if (mGroupInfo == null) {
return;
}
List<String> stringList = new ArrayList<>();
String showInfo = getResources().getString(R.string.group_member_info);
String setAdminRole = getResources().getString(R.string.group_set_admin);
String removeMember = getResources().getString(R.string.group_delete);
stringList.add(showInfo);
if (presenter.isAdmin(groupMemberInfo.getRole())) {
setAdminRole = getResources().getString(R.string.group_remove_manager_label);
}
if (mGroupInfo.isOwner()) {
stringList.add(setAdminRole);
stringList.add(removeMember);
}
BottomSelectSheet sheet = new BottomSelectSheet(getContext());
sheet.setSelectList(stringList);
sheet.setOnClickListener(new BottomSelectSheet.BottomSelectSheetOnClickListener() {
@Override
public void onSheetClick(int index) {
if (onGroupMemberClickListener == null) {
return;
}
if (index == 0) {
onGroupMemberClickListener.onShowInfo(groupMemberInfo);
} else if (index == 1) {
onGroupMemberClickListener.onAdminRoleChanged(groupMemberInfo);
} else if (index == 2) {
onGroupMemberClickListener.onDelete(groupMemberInfo);
}
}
});
sheet.show();
}
public void setGroupMemberListener(IGroupMemberListener listener) {
this.groupMemberListener = listener;
}
public void setOnGroupMemberClickListener(OnGroupMemberClickListener onGroupMemberClickListener) {
this.onGroupMemberClickListener = onGroupMemberClickListener;
}
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).getFaceUrl());
}
@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();
}
public abstract static class OnGroupMemberClickListener {
public void onClick(GroupMemberInfo groupMemberInfo) {}
public void onShowInfo(GroupMemberInfo groupMemberInfo) {}
public void onAdminRoleChanged(GroupMemberInfo groupMemberInfo) {}
public void onDelete(GroupMemberInfo groupMemberInfo) {}
}
}
@@ -0,0 +1,163 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.PopupWindow;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.tencent.qcloud.tuikit.timcommon.R;
import com.tencent.qcloud.tuikit.timcommon.component.action.PopMenuAction;
import com.tencent.qcloud.tuikit.timcommon.component.action.PopMenuAdapter;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import java.util.ArrayList;
import java.util.List;
public class Menu {
private static final int SHADOW_WIDTH = 10;
private static final int Y_OFFSET = 4;
private ListView mMenuList;
private PopMenuAdapter mMenuAdapter;
private PopupWindow mMenuWindow;
private List<PopMenuAction> mActions = new ArrayList<>();
private Activity mActivity;
private View mAttachView;
public Menu(Activity activity, View attach) {
mActivity = activity;
mAttachView = attach;
}
public void setMenuAction(List<PopMenuAction> menuActions) {
mActions.clear();
mActions.addAll(menuActions);
}
public boolean isShowing() {
if (mMenuWindow == null) {
return false;
}
return mMenuWindow.isShowing();
}
public void hide() {
mMenuWindow.dismiss();
}
public void show() {
if (mActions == null || mActions.size() == 0) {
return;
}
mMenuWindow = new PopupWindow(mActivity);
mMenuWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
mMenuWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mMenuWindow.setBackgroundDrawable(new ColorDrawable());
mMenuAdapter = new PopMenuAdapter();
mMenuAdapter.setDataSource(mActions);
View menuView = LayoutInflater.from(mActivity).inflate(R.layout.core_pop_menu, null);
menuView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
mMenuWindow.setContentView(menuView);
mMenuList = menuView.findViewById(R.id.menu_pop_list);
mMenuList.setAdapter(mMenuAdapter);
mMenuList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
PopMenuAction action = (PopMenuAction) mMenuAdapter.getItem(position);
if (action != null && action.getActionClickListener() != null) {
action.getActionClickListener().onActionClick(position, mActions.get(position));
}
}
});
int paddingLeftRight = ScreenUtil.dip2px(15.0f);
int paddingTopBottom = ScreenUtil.dip2px(12.0f);
int itemWidth = mActivity.getResources().getDimensionPixelSize(R.dimen.core_pop_menu_item_width);
int itemHeight = mActivity.getResources().getDimensionPixelSize(R.dimen.core_pop_menu_item_height);
mMenuWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int[] location = new int[2];
mAttachView.getLocationOnScreen(location);
int rowCount = mActions.size();
int indicatorHeight = mActivity.getResources().getDimensionPixelOffset(R.dimen.core_pop_menu_indicator_height);
int popWidth = itemWidth + paddingLeftRight * 2 - SHADOW_WIDTH;
int popHeight = itemHeight * rowCount + paddingTopBottom * 2 - SHADOW_WIDTH;
float anchorWidth = mAttachView.getWidth();
float indicatorX = anchorWidth / 2 + indicatorHeight;
int screenWidth = ScreenUtil.getScreenWidth(mActivity);
int x = location[0] - indicatorHeight;
int y;
float xOffset = anchorWidth / 2;
// If it is on the right, the x-coordinate of the small arrow and the x-position of the pop-up window will change
if (location[0] * 2 + anchorWidth > screenWidth) {
indicatorX = popWidth - anchorWidth / 2 - xOffset;
x = (int) (location[0] + anchorWidth - popWidth + xOffset);
}
float anchorHeight = mAttachView.getHeight();
y = (int) (location[1] + anchorHeight) + Y_OFFSET;
popHeight = popHeight - indicatorHeight;
Drawable backgroundDrawable = getBackgroundDrawable(popWidth, popHeight, indicatorX, indicatorHeight, 16);
menuView.setBackground(backgroundDrawable);
mMenuWindow.setFocusable(true);
mMenuWindow.setTouchable(true);
mMenuWindow.setOutsideTouchable(true);
mMenuWindow.showAtLocation(mAttachView, Gravity.NO_GRAVITY, x, y);
}
/**
* Draw a popup background with small triangles
*/
public Drawable getBackgroundDrawable(final float widthPixel, final float heightPixel, float indicatorX, float indicatorHeight, float radius) {
int borderWidth = SHADOW_WIDTH;
Path path = new Path();
Drawable drawable = new Drawable() {
@Override
public void draw(@NonNull Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
paint.setShadowLayer(borderWidth, 0, 0, 0xFFAAAAAA);
path.addRoundRect(new RectF(borderWidth, indicatorHeight + borderWidth, widthPixel - borderWidth, heightPixel + indicatorHeight - borderWidth),
radius, radius, Path.Direction.CW);
path.moveTo(indicatorX - indicatorHeight, indicatorHeight + borderWidth);
path.lineTo(indicatorX, borderWidth);
path.lineTo(indicatorX + indicatorHeight, indicatorHeight + borderWidth);
path.close();
canvas.drawPath(path, paint);
}
@Override
public void setAlpha(int alpha) {}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
};
return drawable;
}
}
@@ -0,0 +1,155 @@
package com.tencent.qcloud.tuikit.tuicontact.minimalistui.widget;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.gatherimage.ShadeImageView;
import com.tencent.qcloud.tuikit.timcommon.component.impl.GlideEngine;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ScreenUtil;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.NewFriendApplicationDetailMinimalistActivity;
import com.tencent.qcloud.tuikit.tuicontact.presenter.NewFriendPresenter;
import java.util.List;
public class NewFriendListAdapter extends ArrayAdapter<FriendApplicationBean> {
private static final String TAG = NewFriendListAdapter.class.getSimpleName();
private int mResourceId;
private View mView;
private ViewHolder mViewHolder;
private NewFriendPresenter presenter;
/**
* Constructor
*
* @param context The current context.
* @param resource The resource ID for a layout ic_chat_input_file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
public NewFriendListAdapter(Context context, int resource, List<FriendApplicationBean> objects) {
super(context, resource, objects);
mResourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final FriendApplicationBean data = getItem(position);
if (convertView != null) {
mView = convertView;
mViewHolder = (ViewHolder) mView.getTag();
} else {
mView = LayoutInflater.from(getContext()).inflate(mResourceId, null);
mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), NewFriendApplicationDetailMinimalistActivity.class);
intent.putExtra(TUIConstants.TUIContact.CONTENT, data);
getContext().startActivity(intent);
}
});
mViewHolder = new ViewHolder();
mViewHolder.avatar = mView.findViewById(R.id.avatar);
mViewHolder.name = mView.findViewById(R.id.name);
mViewHolder.des = mView.findViewById(R.id.description);
mViewHolder.agree = mView.findViewById(R.id.agree);
mViewHolder.reject = mView.findViewById(R.id.reject);
mViewHolder.result = mView.findViewById(R.id.result_tv);
mView.setTag(mViewHolder);
}
Resources res = getContext().getResources();
int radius = ScreenUtil.dip2px(25);
mViewHolder.avatar.setRadius(radius);
GlideEngine.loadUserIcon(mViewHolder.avatar, data.getFaceUrl(), radius);
mViewHolder.name.setText(TextUtils.isEmpty(data.getNickName()) ? data.getUserId() : data.getNickName());
mViewHolder.des.setText(data.getAddWording());
switch (data.getAddType()) {
case FriendApplicationBean.FRIEND_APPLICATION_COME_IN:
mViewHolder.agree.setText(res.getString(R.string.request_agree));
mViewHolder.agree.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doResponse(data, true);
}
});
mViewHolder.reject.setText(res.getString(R.string.refuse));
mViewHolder.reject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doResponse(data, false);
}
});
if (data.isAccept()) {
mViewHolder.agree.setVisibility(View.GONE);
mViewHolder.reject.setVisibility(View.GONE);
mViewHolder.result.setVisibility(View.VISIBLE);
}
break;
case FriendApplicationBean.FRIEND_APPLICATION_BOTH:
mViewHolder.agree.setText(res.getString(R.string.request_accepted));
break;
default:
break;
}
return mView;
}
private void doResponse(FriendApplicationBean bean, boolean isAccept) {
if (presenter != null) {
if (isAccept) {
presenter.acceptFriendApplication(bean, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
bean.setAccept(true);
refreshList();
}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage("Error code = " + errCode + ", desc = " + errMsg);
}
});
} else {
presenter.refuseFriendApplication(bean, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {}
@Override
public void onError(String module, int errCode, String errMsg) {
ToastUtil.toastShortMessage("Error code = " + errCode + ", desc = " + errMsg);
}
});
}
}
}
private void refreshList() {
notifyDataSetChanged();
}
public void setPresenter(NewFriendPresenter presenter) {
this.presenter = presenter;
}
public class ViewHolder {
ShadeImageView avatar;
TextView name;
TextView des;
TextView agree;
TextView reject;
TextView result;
}
}
@@ -0,0 +1,540 @@
package com.tencent.qcloud.tuikit.tuicontact.model;
import android.text.TextUtils;
import android.util.Pair;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMCreateGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMFriendAddApplication;
import com.tencent.imsdk.v2.V2TIMFriendApplication;
import com.tencent.imsdk.v2.V2TIMFriendApplicationResult;
import com.tencent.imsdk.v2.V2TIMFriendInfo;
import com.tencent.imsdk.v2.V2TIMFriendOperationResult;
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.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMReceiveMessageOptInfo;
import com.tencent.imsdk.v2.V2TIMSendCallback;
import com.tencent.imsdk.v2.V2TIMUserFullInfo;
import com.tencent.imsdk.v2.V2TIMUserStatus;
import com.tencent.imsdk.v2.V2TIMValueCallback;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ErrorMessageConverter;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.BuildConfig;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.ThreadUtils;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.config.TUIContactConfig;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ContactProvider {
private static final String TAG = ContactProvider.class.getSimpleName();
private long mNextSeq = 0;
public void loadFriendListDataAsync(IUIKitCallback<List<ContactItemBean>> callback) {
TUIContactLog.i(TAG, "loadFriendListDataAsync");
ThreadUtils.execute(new Runnable() {
@Override
public void run() {
// The amount of data during the stress test is relatively large, and the query takes a long time, so a new thread is used here to process
V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "loadFriendListDataAsync err code:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
TUIContactLog.i(TAG, "loadFriendListDataAsync->getFriendList:" + v2TIMFriendInfos.size());
for (V2TIMFriendInfo timFriendInfo : v2TIMFriendInfos) {
ContactItemBean info = new ContactItemBean();
info.setFriend(true);
info.covertTIMFriend(timFriendInfo);
contactItemBeanList.add(info);
}
ContactUtils.callbackOnSuccess(callback, contactItemBeanList);
}
});
}
});
}
public void loadBlackListData(IUIKitCallback<List<ContactItemBean>> callback) {
TUIContactLog.i(TAG, "loadBlackListData");
V2TIMManager.getFriendshipManager().getBlackList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "getBlackList err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
TUIContactLog.i(TAG, "getBlackList success: " + v2TIMFriendInfos.size());
if (v2TIMFriendInfos.size() == 0) {
TUIContactLog.i(TAG, "getBlackList success but no data");
}
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMFriendInfo timFriendInfo : v2TIMFriendInfos) {
ContactItemBean info = new ContactItemBean();
info.covertTIMFriend(timFriendInfo).setBlackList(true);
contactItemBeanList.add(info);
}
ContactUtils.callbackOnSuccess(callback, contactItemBeanList);
}
});
}
public void loadGroupListData(IUIKitCallback<List<ContactItemBean>> callback) {
TUIContactLog.i(TAG, "loadGroupListData");
V2TIMManager.getGroupManager().getJoinedGroupList(new V2TIMValueCallback<List<V2TIMGroupInfo>>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "getGroupList err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(List<V2TIMGroupInfo> v2TIMGroupInfos) {
TUIContactLog.i(TAG, "getGroupList success: " + v2TIMGroupInfos.size());
if (v2TIMGroupInfos.size() == 0) {
TUIContactLog.i(TAG, "getGroupList success but no data");
}
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMGroupInfo info : v2TIMGroupInfos) {
ContactItemBean bean = new ContactItemBean();
contactItemBeanList.add(bean.covertTIMGroupBaseInfo(info));
}
ContactUtils.callbackOnSuccess(callback, contactItemBeanList);
}
});
}
public long getNextSeq() {
return mNextSeq;
}
public void setNextSeq(long nextSeq) {
this.mNextSeq = nextSeq;
}
public void loadGroupMembers(String groupId, IUIKitCallback<List<ContactItemBean>> callback) {
V2TIMManager.getGroupManager().getGroupMemberList(
groupId, V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL, mNextSeq, new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, TAG, code, desc);
TUIContactLog.e(TAG, "loadGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
List<V2TIMGroupMemberFullInfo> members = new ArrayList<>();
for (int i = 0; i < v2TIMGroupMemberInfoResult.getMemberInfoList().size(); i++) {
if (v2TIMGroupMemberInfoResult.getMemberInfoList().get(i).getUserID().equals(V2TIMManager.getInstance().getLoginUser())) {
continue;
}
members.add(v2TIMGroupMemberInfoResult.getMemberInfoList().get(i));
}
mNextSeq = v2TIMGroupMemberInfoResult.getNextSeq();
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMGroupMemberFullInfo info : members) {
ContactItemBean bean = new ContactItemBean();
contactItemBeanList.add(bean.covertTIMGroupMemberFullInfo(info));
}
ContactUtils.callbackOnSuccess(callback, contactItemBeanList);
}
});
}
public void addFriend(String userId, String addWording, String remark, IUIKitCallback<Pair<Integer, String>> callback) {
V2TIMFriendAddApplication v2TIMFriendAddApplication = new V2TIMFriendAddApplication(userId);
v2TIMFriendAddApplication.setAddWording(addWording);
v2TIMFriendAddApplication.setAddSource("android");
v2TIMFriendAddApplication.setFriendRemark(remark);
V2TIMManager.getFriendshipManager().addFriend(v2TIMFriendAddApplication, new V2TIMValueCallback<V2TIMFriendOperationResult>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "addFriend err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(V2TIMFriendOperationResult v2TIMFriendOperationResult) {
TUIContactLog.i(TAG, "addFriend success");
ContactUtils.callbackOnSuccess(callback, new Pair<>(v2TIMFriendOperationResult.getResultCode(), v2TIMFriendOperationResult.getResultInfo()));
}
});
}
public void joinGroup(String groupId, String addWording, IUIKitCallback<Void> callback) {
V2TIMManager.getInstance().joinGroup(groupId, addWording, new V2TIMCallback() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "addGroup err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess() {
TUIContactLog.i(TAG, "addGroup success");
ContactUtils.callbackOnSuccess(callback, null);
}
});
}
public void loadFriendApplicationList(IUIKitCallback<List<FriendApplicationBean>> callback) {
V2TIMManager.getFriendshipManager().getFriendApplicationList(new V2TIMValueCallback<V2TIMFriendApplicationResult>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "loadFriendApplicationList err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(V2TIMFriendApplicationResult v2TIMFriendApplicationResult) {
List<FriendApplicationBean> applicationBeanList = new ArrayList<>();
for (V2TIMFriendApplication application : v2TIMFriendApplicationResult.getFriendApplicationList()) {
FriendApplicationBean bean = new FriendApplicationBean();
bean.convertFromTimFriendApplication(application);
applicationBeanList.add(bean);
}
ContactUtils.callbackOnSuccess(callback, applicationBeanList);
}
});
}
public void getFriendApplicationListUnreadCount(IUIKitCallback<Integer> callback) {
V2TIMManager.getFriendshipManager().getFriendApplicationList(new V2TIMValueCallback<V2TIMFriendApplicationResult>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "getFriendApplicationListUnreadCount err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(V2TIMFriendApplicationResult v2TIMFriendApplicationResult) {
ContactUtils.callbackOnSuccess(callback, v2TIMFriendApplicationResult.getUnreadCount());
}
});
}
private void acceptFriendApplication(V2TIMFriendApplication friendApplication, int responseType, IUIKitCallback<Void> callback) {
V2TIMManager.getFriendshipManager().acceptFriendApplication(friendApplication, responseType, new V2TIMValueCallback<V2TIMFriendOperationResult>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "acceptFriend err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(V2TIMFriendOperationResult v2TIMFriendOperationResult) {
TUIContactLog.i(TAG, "acceptFriend success");
ContactUtils.callbackOnSuccess(callback, null);
}
});
}
public void acceptFriendApplication(FriendApplicationBean bean, int responseType, IUIKitCallback<Void> callback) {
V2TIMFriendApplication friendApplication = bean.getFriendApplication();
acceptFriendApplication(friendApplication, responseType, callback);
}
public void getC2CReceiveMessageOpt(List<String> userIdList, IUIKitCallback<Boolean> callback) {
V2TIMManager.getMessageManager().getC2CReceiveMessageOpt(userIdList, new V2TIMValueCallback<List<V2TIMReceiveMessageOptInfo>>() {
@Override
public void onSuccess(List<V2TIMReceiveMessageOptInfo> v2TIMReceiveMessageOptInfos) {
if (v2TIMReceiveMessageOptInfos == null || v2TIMReceiveMessageOptInfos.isEmpty()) {
TUIContactLog.d(TAG, "getC2CReceiveMessageOpt null");
ContactUtils.callbackOnError(callback, TAG, -1, "getC2CReceiveMessageOpt null");
return;
}
V2TIMReceiveMessageOptInfo v2TIMReceiveMessageOptInfo = v2TIMReceiveMessageOptInfos.get(0);
int option = v2TIMReceiveMessageOptInfo.getC2CReceiveMessageOpt();
TUIContactLog.d(TAG, "getC2CReceiveMessageOpt option = " + option);
ContactUtils.callbackOnSuccess(callback, option == V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE);
}
@Override
public void onError(int code, String desc) {
TUIContactLog.d(TAG, "getC2CReceiveMessageOpt onError code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
});
}
public void setC2CReceiveMessageOpt(List<String> userIdList, boolean isReceiveMessage, IUIKitCallback<Void> callback) {
int option;
if (isReceiveMessage) {
option = V2TIMMessage.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE;
} else {
option = V2TIMMessage.V2TIM_RECEIVE_MESSAGE;
}
V2TIMManager.getMessageManager().setC2CReceiveMessageOpt(userIdList, option, new V2TIMCallback() {
@Override
public void onSuccess() {
TUIContactLog.d(TAG, "setC2CReceiveMessageOpt onSuccess");
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIContactLog.d(TAG, "setC2CReceiveMessageOpt onError code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
});
}
public void getGroupInfo(List<String> groupIds, IUIKitCallback<List<GroupInfo>> callback) {
V2TIMManager.getGroupManager().getGroupsInfo(groupIds, new V2TIMValueCallback<List<V2TIMGroupInfoResult>>() {
@Override
public void onSuccess(List<V2TIMGroupInfoResult> v2TIMGroupInfoResults) {
List<GroupInfo> groupInfos = new ArrayList<>();
for (V2TIMGroupInfoResult result : v2TIMGroupInfoResults) {
if (result.getResultCode() != 0) {
ContactUtils.callbackOnError(callback, result.getResultCode(), result.getResultMessage());
return;
}
GroupInfo groupInfo = new GroupInfo();
groupInfo.setId(result.getGroupInfo().getGroupID());
groupInfo.setFaceUrl(result.getGroupInfo().getFaceUrl());
groupInfo.setGroupName(result.getGroupInfo().getGroupName());
groupInfo.setGroupMemberCount(result.getGroupInfo().getMemberCount());
groupInfo.setGroupType(result.getGroupInfo().getGroupType());
groupInfos.add(groupInfo);
}
ContactUtils.callbackOnSuccess(callback, groupInfos);
}
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, code, desc);
}
});
}
public void getUserInfo(List<String> userIdList, TUIValueCallback<List<ContactItemBean>> callback) {
V2TIMManager.getInstance().getUsersInfo(userIdList, new V2TIMValueCallback<List<V2TIMUserFullInfo>>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "loadUserProfile err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
TUIValueCallback.onError(callback, code, desc);
}
@Override
public void onSuccess(List<V2TIMUserFullInfo> v2TIMUserFullInfos) {
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
for (V2TIMUserFullInfo userFullInfo : v2TIMUserFullInfos) {
ContactItemBean contactItemBean = new ContactItemBean();
contactItemBean.setNickName(userFullInfo.getNickName());
contactItemBean.setId(userFullInfo.getUserID());
contactItemBean.setAvatarUrl(userFullInfo.getFaceUrl());
contactItemBean.setSignature(userFullInfo.getSelfSignature());
contactItemBeanList.add(contactItemBean);
}
TUIValueCallback.onSuccess(callback, contactItemBeanList);
}
});
}
public void isInBlackList(String id, IUIKitCallback<Boolean> callback) {
V2TIMManager.getFriendshipManager().getBlackList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "getBlackList err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
if (v2TIMFriendInfos != null && v2TIMFriendInfos.size() > 0) {
for (V2TIMFriendInfo friendInfo : v2TIMFriendInfos) {
if (TextUtils.equals(friendInfo.getUserID(), id)) {
ContactUtils.callbackOnSuccess(callback, true);
return;
}
}
}
ContactUtils.callbackOnSuccess(callback, false);
}
});
}
public void isFriend(String id, ContactItemBean bean, TUIValueCallback<Boolean> callback) {
V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "getFriendList err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
TUIValueCallback.onError(callback, code, desc);
}
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
if (v2TIMFriendInfos != null && v2TIMFriendInfos.size() > 0) {
for (V2TIMFriendInfo friendInfo : v2TIMFriendInfos) {
if (TextUtils.equals(friendInfo.getUserID(), id)) {
bean.setFriend(true);
bean.setRemark(friendInfo.getFriendRemark());
bean.setAvatarUrl(friendInfo.getUserProfile().getFaceUrl());
TUIValueCallback.onSuccess(callback, true);
return;
}
}
}
TUIValueCallback.onSuccess(callback, false);
}
});
}
public void refuseFriendApplication(FriendApplicationBean friendApplication, IUIKitCallback<Void> callback) {
V2TIMFriendApplication v2TIMFriendApplication = friendApplication.getFriendApplication();
if (v2TIMFriendApplication == null) {
ContactUtils.callbackOnError(callback, "refuseFriendApplication", -1, "V2TIMFriendApplication is null");
return;
}
V2TIMManager.getFriendshipManager().refuseFriendApplication(v2TIMFriendApplication, new V2TIMValueCallback<V2TIMFriendOperationResult>() {
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "accept err code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
ToastUtil.toastShortMessage("Error code = " + code + ", desc = " + ErrorMessageConverter.convertIMError(code, desc));
}
@Override
public void onSuccess(V2TIMFriendOperationResult v2TIMFriendOperationResult) {
TUIContactLog.i(TAG, "refuse success");
ContactUtils.callbackOnSuccess(callback, null);
}
});
}
public void createGroupChat(GroupInfo groupInfo, IUIKitCallback<String> callback) {
V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();
v2TIMGroupInfo.setGroupType(groupInfo.getGroupType());
v2TIMGroupInfo.setGroupName(groupInfo.getGroupName());
v2TIMGroupInfo.setGroupAddOpt(groupInfo.getJoinType());
v2TIMGroupInfo.setGroupID(groupInfo.getId());
v2TIMGroupInfo.setFaceUrl(groupInfo.getFaceUrl());
if (TextUtils.equals(v2TIMGroupInfo.getGroupType(), V2TIMManager.GROUP_TYPE_COMMUNITY)) {
v2TIMGroupInfo.setSupportTopic(groupInfo.isCommunitySupportTopic());
}
List<V2TIMCreateGroupMemberInfo> v2TIMCreateGroupMemberInfoList = new ArrayList<>();
for (int i = 0; i < groupInfo.getMemberDetails().size(); i++) {
GroupMemberInfo groupMemberInfo = groupInfo.getMemberDetails().get(i);
V2TIMCreateGroupMemberInfo v2TIMCreateGroupMemberInfo = new V2TIMCreateGroupMemberInfo();
v2TIMCreateGroupMemberInfo.setUserID(groupMemberInfo.getUserId());
v2TIMCreateGroupMemberInfoList.add(v2TIMCreateGroupMemberInfo);
}
V2TIMManager.getGroupManager().createGroup(v2TIMGroupInfo, v2TIMCreateGroupMemberInfoList, new V2TIMValueCallback<String>() {
@Override
public void onSuccess(String s) {
ContactUtils.callbackOnSuccess(callback, s);
}
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, code, desc);
}
});
}
public void sendGroupTipsMessage(String groupId, String message, IUIKitCallback<String> callback) {
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(message.getBytes());
V2TIMManager.getMessageManager().sendMessage(
v2TIMMessage, null, groupId, V2TIMMessage.V2TIM_PRIORITY_DEFAULT, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {}
@Override
public void onError(int code, String desc) {
TUIContactLog.i(TAG, "sendTipsMessage error , code : " + code + " desc : " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, TAG, code, desc);
}
@Override
public void onSuccess(V2TIMMessage v2TIMMessage) {
TUIContactLog.i(TAG, "sendTipsMessage onSuccess");
ContactUtils.callbackOnSuccess(callback, groupId);
}
});
}
public void setFriendApplicationRead(IUIKitCallback<Void> callback) {
V2TIMManager.getFriendshipManager().setFriendApplicationRead(new V2TIMCallback() {
@Override
public void onSuccess() {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, code, desc);
}
});
}
public void loadContactUserStatus(List<ContactItemBean> dataSource, IUIKitCallback<Void> callback) {
if (dataSource == null || dataSource.size() == 0) {
TUIContactLog.d(TAG, "loadContactUserStatus datasource is null");
ContactUtils.callbackOnError(callback, -1, "data list is empty");
return;
}
HashMap<String, ContactItemBean> dataSourceMap = new HashMap<>();
List<String> userList = new ArrayList<>();
for (ContactItemBean itemBean : dataSource) {
if (TextUtils.equals(TUIContactService.getAppContext().getResources().getString(R.string.new_friend), itemBean.getId())
|| TextUtils.equals(TUIContactService.getAppContext().getResources().getString(R.string.blacklist), itemBean.getId())
|| TextUtils.equals(TUIContactService.getAppContext().getResources().getString(R.string.group), itemBean.getId())) {
continue;
}
userList.add(itemBean.getId());
dataSourceMap.put(itemBean.getId(), itemBean);
}
V2TIMManager.getInstance().getUserStatus(userList, new V2TIMValueCallback<List<V2TIMUserStatus>>() {
@Override
public void onSuccess(List<V2TIMUserStatus> v2TIMUserStatuses) {
TUIContactLog.i(TAG, "getUserStatus success");
for (V2TIMUserStatus item : v2TIMUserStatuses) {
ContactItemBean bean = dataSourceMap.get(item.getUserID());
if (bean != null) {
bean.setStatusType(item.getStatusType());
}
}
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "getUserStatus error code = " + code + ",des = " + desc);
ContactUtils.callbackOnError(callback, code, desc);
if (code == TUIConstants.BuyingFeature.ERR_SDK_INTERFACE_NOT_SUPPORT && TUIContactConfig.getInstance().isShowUserStatus()
&& BuildConfig.DEBUG) {
ToastUtil.toastLongMessage(desc);
}
}
});
}
}
@@ -0,0 +1,523 @@
package com.tencent.qcloud.tuikit.tuicontact.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.V2TIMFriendInfo;
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.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ErrorMessageConverter;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupApplyInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GroupInfoProvider {
private static final String TAG = GroupInfoProvider.class.getSimpleName();
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);
ContactUtils.callbackOnSuccess(callBack, groupInfo);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIContactLog.e(TAG, "loadGroupPublicInfo failed, code: " + errCode + "|desc: " + ErrorMessageConverter.convertIMError(errCode, errMsg));
if (callBack != null) {
callBack.onError(module, errCode, ErrorMessageConverter.convertIMError(errCode, errMsg));
}
}
});
}
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) {
TUIContactLog.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);
TUIContactLog.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);
}
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 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) {
TUIContactLog.e(TAG, "loadGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.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.getUserId(), existsMemberInfo.getUserId())) {
iterator.remove();
break;
}
}
}
memberInfoList.addAll(members);
groupInfo.setNextSeq(v2TIMGroupMemberInfoResult.getNextSeq());
ContactUtils.callbackOnSuccess(callBack, groupInfo);
}
});
}
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) {
TUIContactLog.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(TUIContactService.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) {
TUIContactLog.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 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) {
TUIContactLog.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) {
TUIContactLog.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) {
TUIContactLog.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) {
TUIContactLog.e(TAG, "refuseApply failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callBack, TAG, code, desc);
}
@Override
public void onSuccess() {
ContactUtils.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.getUserId(), V2TIMManager.getInstance().getLoginUser())) {
return memberInfo;
}
}
return null;
}
public boolean isAdmin(int memberType) {
return memberType == V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN;
}
public boolean isOwner(int memberType) {
return memberType == V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_OWNER;
}
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) {
TUIContactLog.e(TAG, "muteAll failed, code:" + code + "|desc:" + ErrorMessageConverter.convertIMError(code, desc));
ContactUtils.callbackOnError(callback, code, desc);
}
@Override
public void onSuccess() {
ContactUtils.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) {
ContactUtils.callbackOnSuccess(callback, managerList);
} else {
loadGroupManagers(groupId, loadNextSeq, this);
}
}
@Override
public void onError(int code, String desc) {
ContactUtils.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);
}
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) {
ContactUtils.callbackOnSuccess(callback, managerList);
} else {
loadGroupMembers(groupId, loadNextSeq, this);
}
}
@Override
public void onError(int code, String desc) {
ContactUtils.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();
if (list.isEmpty()) {
ContactUtils.callbackOnError(callback, -1, "Group member list is empty");
return;
}
GroupMemberInfo member = new GroupMemberInfo();
member.covertTIMGroupMemberInfo(list.get(0));
ContactUtils.callbackOnSuccess(callback, member);
}
@Override
public void onError(int code, String desc) {
ContactUtils.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() {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
ContactUtils.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() {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, code, desc);
}
});
}
public void setGroupManagerRole(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() {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, code, desc);
}
});
}
public void setGroupMemberRole(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() {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
ContactUtils.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() {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(int code, String desc) {
ContactUtils.callbackOnError(callback, code, desc);
}
});
}
public void getFriendList(TUIValueCallback<List<UserBean>> callback) {
V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
List<UserBean> userBeans = new ArrayList<>();
for (V2TIMFriendInfo v2TIMFriendInfo : v2TIMFriendInfos) {
UserBean reactUserBean = new UserBean();
reactUserBean.setUserId(v2TIMFriendInfo.getUserID());
reactUserBean.setFriendRemark(v2TIMFriendInfo.getFriendRemark());
reactUserBean.setFaceUrl(v2TIMFriendInfo.getUserProfile().getFaceUrl());
if (v2TIMFriendInfo.getUserProfile() != null) {
reactUserBean.setNickName(v2TIMFriendInfo.getUserProfile().getNickName());
}
userBeans.add(reactUserBean);
}
TUIValueCallback.onSuccess(callback, userBeans);
}
@Override
public void onError(int code, String desc) {
TUIValueCallback.onError(callback, code, desc);
}
});
}
public void getGroupMembersInfo(String groupID, List<String> userIDs, TUIValueCallback<List<UserBean>> callback) {
V2TIMManager.getGroupManager().getGroupMembersInfo(groupID, userIDs, new V2TIMValueCallback<List<V2TIMGroupMemberFullInfo>>() {
@Override
public void onSuccess(List<V2TIMGroupMemberFullInfo> v2TIMGroupMemberFullInfos) {
List<UserBean> userBeans = new ArrayList<>();
for (V2TIMGroupMemberFullInfo v2TIMGroupMemberFullInfo : v2TIMGroupMemberFullInfos) {
UserBean reactUserBean = new UserBean();
reactUserBean.setUserId(v2TIMGroupMemberFullInfo.getUserID());
reactUserBean.setFriendRemark(v2TIMGroupMemberFullInfo.getFriendRemark());
reactUserBean.setFaceUrl(v2TIMGroupMemberFullInfo.getFaceUrl());
if (v2TIMGroupMemberFullInfo.getNickName() != null) {
reactUserBean.setNickName(v2TIMGroupMemberFullInfo.getNickName());
}
userBeans.add(reactUserBean);
}
TUIValueCallback.onSuccess(callback, userBeans);
}
@Override
public void onError(int code, String desc) {
TUIValueCallback.onError(callback, code, desc);
}
});
}
}
@@ -0,0 +1,185 @@
package com.tencent.qcloud.tuikit.tuicontact.model;
import android.util.Pair;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMFriendCheckResult;
import com.tencent.imsdk.v2.V2TIMFriendInfo;
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.V2TIMValueCallback;
import com.tencent.qcloud.tuicore.interfaces.TUICallback;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ErrorMessageConverter;
import com.tencent.qcloud.tuikit.timcommon.bean.UserBean;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupMemberInfo;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupMemberProvider {
private static final String TAG = "GroupProvider";
public void loadGroupMembers(String groupID, int filter, long nextSeq, final TUIValueCallback<Pair<List<GroupMemberInfo>, Long>> callBack) {
V2TIMManager.getGroupManager().getGroupMemberList(groupID, filter, nextSeq, new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
List<GroupMemberInfo> members = new ArrayList<>();
for (V2TIMGroupMemberFullInfo fullInfo : v2TIMGroupMemberInfoResult.getMemberInfoList()) {
GroupMemberInfo member = new GroupMemberInfo();
member.setUserId(fullInfo.getUserID());
member.setNameCard(fullInfo.getNameCard());
member.setFriendRemark(fullInfo.getFriendRemark());
member.setNickName(fullInfo.getNickName());
member.setFaceUrl(fullInfo.getFaceUrl());
member.setMuteUtil(fullInfo.getMuteUntil());
member.setRole(fullInfo.getRole());
members.add(member);
}
Pair<List<GroupMemberInfo>, Long> result = new Pair<>(members, v2TIMGroupMemberInfoResult.getNextSeq());
TUIValueCallback.onSuccess(callBack, result);
}
@Override
public void onError(int code, String desc) {
TUIValueCallback.onError(callBack, code, desc);
}
});
}
public void getFriendList(TUIValueCallback<List<UserBean>> callback) {
V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
List<UserBean> userBeans = new ArrayList<>();
for (V2TIMFriendInfo v2TIMFriendInfo : v2TIMFriendInfos) {
UserBean reactUserBean = new UserBean();
reactUserBean.setUserId(v2TIMFriendInfo.getUserID());
reactUserBean.setFriendRemark(v2TIMFriendInfo.getFriendRemark());
reactUserBean.setFaceUrl(v2TIMFriendInfo.getUserProfile().getFaceUrl());
if (v2TIMFriendInfo.getUserProfile() != null) {
reactUserBean.setNickName(v2TIMFriendInfo.getUserProfile().getNickName());
}
userBeans.add(reactUserBean);
}
TUIValueCallback.onSuccess(callback, userBeans);
}
@Override
public void onError(int code, String desc) {
TUIValueCallback.onError(callback, code, desc);
}
});
}
public void getGroupMembersInfo(String groupID, List<String> userIDs, TUIValueCallback<List<UserBean>> callback) {
V2TIMManager.getGroupManager().getGroupMembersInfo(groupID, userIDs, new V2TIMValueCallback<List<V2TIMGroupMemberFullInfo>>() {
@Override
public void onSuccess(List<V2TIMGroupMemberFullInfo> v2TIMGroupMemberFullInfos) {
List<UserBean> userBeans = new ArrayList<>();
for (V2TIMGroupMemberFullInfo v2TIMGroupMemberFullInfo : v2TIMGroupMemberFullInfos) {
UserBean reactUserBean = new UserBean();
reactUserBean.setUserId(v2TIMGroupMemberFullInfo.getUserID());
reactUserBean.setFriendRemark(v2TIMGroupMemberFullInfo.getFriendRemark());
reactUserBean.setFaceUrl(v2TIMGroupMemberFullInfo.getFaceUrl());
if (v2TIMGroupMemberFullInfo.getNickName() != null) {
reactUserBean.setNickName(v2TIMGroupMemberFullInfo.getNickName());
}
userBeans.add(reactUserBean);
}
TUIValueCallback.onSuccess(callback, userBeans);
}
@Override
public void onError(int code, String desc) {
TUIValueCallback.onError(callback, code, desc);
}
});
}
public void inviteGroupMembers(String groupID, List<String> addMembers, final TUIValueCallback callBack) {
if (addMembers == null || addMembers.size() == 0) {
return;
}
V2TIMManager.getGroupManager().inviteUserToGroup(groupID, addMembers, new V2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() {
@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(TUIContactService.getAppContext().getString(R.string.request_wait));
return;
}
if (res.getResult() > 0) {
adds.add(res.getMemberID());
}
}
}
}
@Override
public void onError(int code, String desc) {
TUIContactLog.e(TAG, "addGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
TUIValueCallback.onError(callBack, code, ErrorMessageConverter.convertIMError(code, desc));
}
});
}
public void removeGroupMembers(String groupId, List<String> members, final TUIValueCallback<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) {
TUIContactLog.e(TAG, "removeGroupMembers failed, code: " + code + "|desc: " + ErrorMessageConverter.convertIMError(code, desc));
TUIValueCallback.onError(callBack, 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());
}
}
TUIValueCallback.onSuccess(callBack, dels);
}
});
}
public void transferGroupOwner(String groupId, String userId, TUICallback callback) {
V2TIMManager.getGroupManager().transferGroupOwner(groupId, userId, new V2TIMCallback() {
@Override
public void onSuccess() {
TUICallback.onSuccess(callback);
}
@Override
public void onError(int code, String desc) {
TUICallback.onError(callback, code, desc);
}
});
}
}
@@ -0,0 +1,77 @@
package com.tencent.qcloud.tuikit.tuicontact.presenter;
import android.text.TextUtils;
import android.util.Pair;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IAddMoreActivity;
import com.tencent.qcloud.tuikit.tuicontact.model.ContactProvider;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import java.util.ArrayList;
import java.util.List;
public class AddMorePresenter {
private static final String TAG = AddMorePresenter.class.getSimpleName();
private ContactProvider provider;
public AddMorePresenter() {
provider = new ContactProvider();
}
public void getUserInfo(String userId, TUIValueCallback<ContactItemBean> callback) {
List<String> userIdList = new ArrayList<>();
userIdList.add(userId);
provider.getUserInfo(userIdList, new TUIValueCallback<List<ContactItemBean>>() {
@Override
public void onSuccess(List<ContactItemBean> data) {
ContactItemBean itemBean = data.get(0);
provider.isFriend(userId, itemBean, new TUIValueCallback<Boolean>() {
@Override
public void onSuccess(Boolean data) {
TUIValueCallback.onSuccess(callback, itemBean);
}
@Override
public void onError(int errCode, String errMsg) {
TUIValueCallback.onSuccess(callback, itemBean);
}
});
TUIValueCallback.onSuccess(callback, itemBean);
}
@Override
public void onError(int errCode, String errMsg) {
TUIValueCallback.onError(callback, errCode, errMsg);
}
});
}
public void getGroupInfo(String groupId, IUIKitCallback<GroupInfo> callback) {
if (TextUtils.isEmpty(groupId)) {
return;
}
List<String> groupIds = new ArrayList<>();
groupIds.add(groupId);
provider.getGroupInfo(groupIds, new IUIKitCallback<List<GroupInfo>>() {
@Override
public void onSuccess(List<GroupInfo> data) {
if (data == null || data.isEmpty()) {
return;
}
ContactUtils.callbackOnSuccess(callback, data.get(0));
}
@Override
public void onError(String module, int errCode, String errMsg) {
ContactUtils.callbackOnError(callback, errCode, errMsg);
}
});
}
}
@@ -0,0 +1,469 @@
package com.tencent.qcloud.tuikit.tuicontact.presenter;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.tencent.imsdk.v2.V2TIMUserStatus;
import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionEventListener;
import com.tencent.qcloud.tuicore.interfaces.TUIExtensionInfo;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.timcommon.util.TIMCommonUtil;
import com.tencent.qcloud.tuikit.timcommon.util.ThreadUtils;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.bean.MessageCustom;
import com.tencent.qcloud.tuikit.tuicontact.config.TUIContactConfig;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.ContactEventListener;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IContactListView;
import com.tencent.qcloud.tuikit.tuicontact.model.ContactProvider;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class ContactPresenter {
private static final String TAG = ContactPresenter.class.getSimpleName();
private final ContactProvider provider;
private IContactListView contactListView;
private final List<ContactItemBean> dataSource = new ArrayList<>();
// Strong references avoid GC
private ContactEventListener friendListListener;
private ContactEventListener blackListListener;
private IUIKitCallback<Void> getUserStatusCallback;
private boolean isClassicStyle;
private boolean isSelectForCall = false;
public ContactItemBean newContacts;
public ContactItemBean groupChats;
public ContactItemBean blackList;
public ContactPresenter() {
initDefaultContactItemBean();
provider = new ContactProvider();
provider.setNextSeq(0);
}
private void initDefaultContactItemBean() {
newContacts = new ContactItemBean(TUIContactService.getAppContext().getResources().getString(R.string.new_friend))
.setItemBeanType(ContactItemBean.ITEM_BEAN_TYPE_CONTROLLER)
.setTop(true);
newContacts.setBaseIndexTag(ContactItemBean.INDEX_STRING_TOP);
groupChats = new ContactItemBean(TUIContactService.getAppContext().getResources().getString(R.string.group))
.setItemBeanType(ContactItemBean.ITEM_BEAN_TYPE_CONTROLLER)
.setTop(true);
groupChats.setBaseIndexTag(ContactItemBean.INDEX_STRING_TOP);
blackList = new ContactItemBean(TUIContactService.getAppContext().getResources().getString(R.string.blacklist))
.setItemBeanType(ContactItemBean.ITEM_BEAN_TYPE_CONTROLLER)
.setTop(true);
blackList.setBaseIndexTag(ContactItemBean.INDEX_STRING_TOP);
}
public void setContactListView(IContactListView contactListView) {
this.contactListView = contactListView;
}
public void setIsClassicStyle(boolean isClassicStyle) {
this.isClassicStyle = isClassicStyle;
}
public void setFriendListListener() {
friendListListener = new ContactEventListener() {
@Override
public void onFriendListAdded(List<ContactItemBean> users) {
onDataListAdd(users);
}
@Override
public void onFriendListDeleted(List<String> userList) {
onDataListDeleted(userList);
}
@Override
public void onFriendInfoChanged(List<ContactItemBean> infoList) {
ContactPresenter.this.onFriendInfoChanged(infoList);
}
@Override
public void onFriendRemarkChanged(String id, String remark) {
ContactPresenter.this.onFriendRemarkChanged(id, remark);
}
@Override
public void onFriendApplicationListAdded(List<FriendApplicationBean> applicationList) {
ContactPresenter.this.getFriendApplicationUnReadCount();
}
@Override
public void onFriendApplicationListDeleted(List<String> userIDList) {
ContactPresenter.this.getFriendApplicationUnReadCount();
}
@Override
public void onFriendApplicationListRead() {
ContactPresenter.this.getFriendApplicationUnReadCount();
}
@Override
public void onUserStatusChanged(List<V2TIMUserStatus> userStatusList) {
ContactPresenter.this.onUserStatusChanged(userStatusList);
}
@Override
public void refreshUserStatusFragmentUI() {
ContactPresenter.this.notifyDataSourceChanged();
}
};
TUIContactService.getInstance().addContactEventListener(friendListListener);
}
public void setBlackListListener() {
blackListListener = new ContactEventListener() {
@Override
public void onBlackListAdd(List<ContactItemBean> infoList) {
onDataListAdd(infoList);
}
@Override
public void onBlackListDeleted(List<String> userList) {
onDataListDeleted(userList);
}
};
TUIContactService.getInstance().addContactEventListener(blackListListener);
}
public void setIsForCall(boolean isSelectForCall) {
this.isSelectForCall = isSelectForCall;
}
public void loadDataSource(int dataSourceType) {
IUIKitCallback<List<ContactItemBean>> callback = new IUIKitCallback<List<ContactItemBean>>() {
@Override
public void onSuccess(List<ContactItemBean> data) {
TUIContactLog.i(TAG, "load data source success , loadType = " + dataSourceType);
if (dataSourceType == IContactListView.DataSource.FRIEND_LIST) {
filterContactBeanList(data);
}
onDataLoaded(data, dataSourceType);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIContactLog.e(TAG,
"load data source error , loadType = " + dataSourceType + " "
+ "errCode = " + errCode + " errMsg = " + errMsg);
onDataLoaded(new ArrayList<>(), dataSourceType);
}
};
dataSource.clear();
switch (dataSourceType) {
case IContactListView.DataSource.FRIEND_LIST:
provider.loadFriendListDataAsync(callback);
break;
case IContactListView.DataSource.BLACK_LIST:
provider.loadBlackListData(callback);
break;
case IContactListView.DataSource.GROUP_LIST:
provider.loadGroupListData(callback);
break;
case IContactListView.DataSource.CONTACT_LIST:
dataSource.add(newContacts);
dataSource.add(groupChats);
dataSource.add(blackList);
dataSource.addAll(getExtensionControllerMoreList());
provider.loadFriendListDataAsync(callback);
getFriendApplicationUnReadCount();
break;
default:
break;
}
}
private void filterContactBeanList(List<ContactItemBean> data) {
Iterator<ContactItemBean> iterator = data.iterator();
while (iterator.hasNext()) {
ContactItemBean loadedBean = iterator.next();
if (TIMCommonUtil.isChatbot(loadedBean.getId())) {
iterator.remove();
}
}
}
public void reloadContactList() {
loadDataSource(IContactListView.DataSource.CONTACT_LIST);
}
private List<ContactItemBean> getExtensionControllerMoreList() {
List<ContactItemBean> contactItemBeanList = new ArrayList<>();
if (!isClassicStyle) {
return contactItemBeanList;
}
List<TUIExtensionInfo> extensionInfoList = TUICore.getExtensionList(TUIConstants.TUIContact.Extension.ContactItem.CLASSIC_EXTENSION_ID, null);
for (TUIExtensionInfo extensionInfo : extensionInfoList) {
if (extensionInfo != null) {
String name = extensionInfo.getText();
int iconResID = (int) extensionInfo.getIcon();
int weight = extensionInfo.getWeight();
TUIExtensionEventListener listener = extensionInfo.getExtensionListener();
ContactItemBean contactItemBean = new ContactItemBean(name);
contactItemBean.setItemBeanType(ContactItemBean.ITEM_BEAN_TYPE_CONTROLLER);
contactItemBean.setBaseIndexTag(ContactItemBean.INDEX_STRING_TOP);
contactItemBean.setTop(true);
contactItemBean.setAvatarResID(iconResID);
contactItemBean.setWeight(weight);
contactItemBean.setExtensionListener(listener);
contactItemBeanList.add(contactItemBean);
}
}
if (contactItemBeanList.size() > 0) {
Collections.sort(contactItemBeanList);
}
return contactItemBeanList;
}
public long getNextSeq() {
return provider == null ? 0 : provider.getNextSeq();
}
public void loadGroupMemberList(String groupId) {
if (!isSelectForCall && getNextSeq() == 0) {
dataSource.add((ContactItemBean) new ContactItemBean(TUIContactService.getAppContext().getResources().getString(R.string.at_all))
.setTop(true)
.setBaseIndexTag(ContactItemBean.INDEX_STRING_TOP));
}
provider.loadGroupMembers(groupId, new IUIKitCallback<List<ContactItemBean>>() {
@Override
public void onSuccess(List<ContactItemBean> data) {
TUIContactLog.i(TAG, "load data source success , loadType = " + IContactListView.DataSource.GROUP_MEMBER_LIST);
onDataLoaded(data, IContactListView.DataSource.GROUP_MEMBER_LIST);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIContactLog.e(TAG,
"load data source error , loadType = " + IContactListView.DataSource.GROUP_MEMBER_LIST + " "
+ "errCode = " + errCode + " errMsg = " + errMsg);
onDataLoaded(new ArrayList<>(), IContactListView.DataSource.GROUP_MEMBER_LIST);
}
});
}
private void onDataLoaded(List<ContactItemBean> loadedData, int dataSourceType) {
Iterator<ContactItemBean> iterator = loadedData.iterator();
while (iterator.hasNext()) {
ContactItemBean loadedBean = iterator.next();
for (int i = 0; i < dataSource.size(); i++) {
ContactItemBean cacheBean = dataSource.get(i);
if (cacheBean.getId().equals(loadedBean.getId())) {
dataSource.set(i, loadedBean);
iterator.remove();
break;
}
}
}
dataSource.addAll(loadedData);
notifyDataSourceChanged();
if (dataSourceType != IContactListView.DataSource.GROUP_LIST) {
loadContactUserStatus(dataSource);
}
}
private void loadContactUserStatus(List<ContactItemBean> loadedData) {
getUserStatusCallback = new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void result) {
TUIContactLog.i(TAG, "loadContactUserStatus success");
notifyDataSourceChanged();
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIContactLog.e(TAG, "loadContactUserStatus error code = " + errCode + ",des = " + errMsg);
}
};
GetUserStatusHelper.GetUserStatusTask task = new GetUserStatusHelper.GetUserStatusTask();
task.setLoadedData(loadedData);
task.setCallback(getUserStatusCallback);
GetUserStatusHelper.enqueue(task);
}
private void notifyDataSourceChanged() {
if (contactListView != null) {
contactListView.onDataSourceChanged(dataSource);
}
}
private void onDataListDeleted(List<String> userList) {
Iterator<ContactItemBean> userIterator = dataSource.iterator();
while (userIterator.hasNext()) {
ContactItemBean contactItemBean = userIterator.next();
for (String id : userList) {
if (TextUtils.equals(id, contactItemBean.getId())) {
userIterator.remove();
}
}
}
notifyDataSourceChanged();
}
public void onUserStatusChanged(List<V2TIMUserStatus> userStatusList) {
if (!TUIContactConfig.getInstance().isShowUserStatus()) {
return;
}
HashMap<String, ContactItemBean> dataSourceMap = new HashMap<>();
for (ContactItemBean itemBean : dataSource) {
dataSourceMap.put(itemBean.getId(), itemBean);
}
boolean isrefresh = false;
for (V2TIMUserStatus timUserStatus : userStatusList) {
String userid = timUserStatus.getUserID();
ContactItemBean bean = dataSourceMap.get(userid);
if (bean != null && bean.getStatusType() != timUserStatus.getStatusType()) {
isrefresh = true;
bean.setStatusType(timUserStatus.getStatusType());
}
}
if (isrefresh) {
notifyDataSourceChanged();
}
}
private void onDataListAdd(List<ContactItemBean> users) {
List<ContactItemBean> addUserList = new ArrayList<>(users);
Iterator<ContactItemBean> beanIterator = addUserList.iterator();
while (beanIterator.hasNext()) {
ContactItemBean contactItemBean = beanIterator.next();
for (ContactItemBean dataItemBean : dataSource) {
if (TextUtils.equals(contactItemBean.getId(), dataItemBean.getId())) {
beanIterator.remove();
}
}
}
dataSource.addAll(addUserList);
notifyDataSourceChanged();
loadContactUserStatus(addUserList);
}
public void createGroupChat(GroupInfo groupInfo, IUIKitCallback<String> callback) {
provider.createGroupChat(groupInfo, new IUIKitCallback<String>() {
@Override
public void onSuccess(String groupId) {
groupInfo.setId(groupId);
MessageCustom messageCustom = new MessageCustom();
messageCustom.version = TUIContactConstants.version;
messageCustom.businessID = MessageCustom.BUSINESS_ID_GROUP_CREATE;
messageCustom.opUser = TUILogin.getLoginUser();
messageCustom.content = TUIContactService.getAppContext().getString(R.string.create_group);
messageCustom.cmd = TextUtils.equals(groupInfo.getGroupType(), TUIContactConstants.GroupType.TYPE_COMMUNITY) ? 1 : 0;
Gson gson = new Gson();
String data = gson.toJson(messageCustom);
ThreadUtils.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
sendGroupTipsMessage(groupId, data, new IUIKitCallback<String>() {
@Override
public void onSuccess(String result) {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
ContactUtils.callbackOnSuccess(callback, result);
}
});
}
@Override
public void onError(String module, int errCode, String errMsg) {
ThreadUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
ContactUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
});
}
});
}
@Override
public void onError(String module, int errCode, String errMsg) {
ContactUtils.callbackOnError(callback, module, errCode, errMsg);
}
});
}
public void onFriendInfoChanged(List<ContactItemBean> infoList) {
for (ContactItemBean changedItem : infoList) {
for (int i = 0; i < dataSource.size(); i++) {
if (TextUtils.equals(dataSource.get(i).getId(), changedItem.getId())) {
if (changedItem.getStatusType() == V2TIMUserStatus.V2TIM_USER_STATUS_UNKNOWN) {
changedItem.setStatusType(dataSource.get(i).getStatusType());
}
dataSource.set(i, changedItem);
break;
}
}
}
notifyDataSourceChanged();
}
public void onFriendRemarkChanged(String id, String remark) {
loadDataSource(IContactListView.DataSource.CONTACT_LIST);
}
public void getFriendApplicationUnReadCount() {
provider.getFriendApplicationListUnreadCount(new IUIKitCallback<Integer>() {
@Override
public void onSuccess(Integer data) {
if (newContacts.getUnreadCount() != data) {
newContacts.setUnreadCount(data);
notifyDataChanged(newContacts);
}
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIContactLog.e(TAG, "getFriendApplicationUnreadCount failed, errCode = " + errCode + ",des = " + errMsg);
}
});
}
public void sendGroupTipsMessage(String groupId, String messageData, IUIKitCallback<String> callback) {
provider.sendGroupTipsMessage(groupId, messageData, callback);
}
private void notifyDataChanged(ContactItemBean contactItemBean) {
if (contactListView != null) {
contactListView.onDataChanged(contactItemBean);
}
}
}
@@ -0,0 +1,210 @@
package com.tencent.qcloud.tuikit.tuicontact.presenter;
import android.text.TextUtils;
import android.util.Pair;
import com.tencent.qcloud.tuicore.interfaces.TUIValueCallback;
import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
import com.tencent.qcloud.tuikit.tuicontact.R;
import com.tencent.qcloud.tuikit.tuicontact.TUIContactService;
import com.tencent.qcloud.tuikit.tuicontact.bean.ContactItemBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.FriendApplicationBean;
import com.tencent.qcloud.tuikit.tuicontact.bean.GroupInfo;
import com.tencent.qcloud.tuikit.tuicontact.interfaces.IFriendProfileLayout;
import com.tencent.qcloud.tuikit.tuicontact.model.ContactProvider;
import com.tencent.qcloud.tuikit.tuicontact.util.ContactUtils;
import com.tencent.qcloud.tuikit.tuicontact.util.TUIContactLog;
import java.util.ArrayList;
import java.util.List;
public class FriendProfilePresenter {
private static final String TAG = FriendProfilePresenter.class.getSimpleName();
private final ContactProvider provider;
private IFriendProfileLayout friendProfileLayout;
public FriendProfilePresenter() {
provider = new ContactProvider();
}
public void setFriendProfileLayout(IFriendProfileLayout friendProfileLayout) {
this.friendProfileLayout = friendProfileLayout;
}
public void getC2CReceiveMessageOpt(List<String> userIdList, IUIKitCallback<Boolean> callback) {
provider.getC2CReceiveMessageOpt(userIdList, new IUIKitCallback<Boolean>() {
@Override
public void onSuccess(Boolean data) {
ContactUtils.callbackOnSuccess(callback, data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
ContactUtils.callbackOnError(callback, TAG, errCode, errMsg);
}
});
}
public void setC2CReceiveMessageOpt(List<String> userIdList, boolean isReceiveMessage) {
provider.setC2CReceiveMessageOpt(userIdList, isReceiveMessage, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {}
@Override
public void onError(String module, int errCode, String errMsg) {}
});
}
public void getUsersInfo(String id, ContactItemBean bean) {
ArrayList<String> list = new ArrayList<>();
list.add(id);
provider.getUserInfo(list, new TUIValueCallback<List<ContactItemBean>>() {
@Override
public void onSuccess(List<ContactItemBean> data) {
if (data == null || data.size() != 1) {
return;
}
ContactItemBean user = data.get(0);
bean.setNickName(user.getNickName());
bean.setId(user.getId());
bean.setAvatarUrl(user.getAvatarUrl());
bean.setSignature(user.getSignature());
refreshDataSource(bean);
}
@Override
public void onError(int errCode, String errMsg) {
ToastUtil.toastShortMessage("getUsersInfo error , code = " + errCode + ", desc = " + errMsg);
}
});
isInBlackList(id, new IUIKitCallback<Boolean>() {
@Override
public void onSuccess(Boolean data) {
bean.setBlackList(data);
refreshDataSource(bean);
}
@Override
public void onError(String module, int errCode, String errMsg) {
refreshDataSource(bean);
}
});
isFriend(id, bean, new TUIValueCallback<Boolean>() {
@Override
public void onSuccess(Boolean data) {
bean.setFriend(data);
refreshDataSource(bean);
}
@Override
public void onError(int errCode, String errMsg) {
refreshDataSource(bean);
}
});
}
private void refreshDataSource(ContactItemBean bean) {
if (friendProfileLayout != null) {
friendProfileLayout.onDataSourceChanged(bean);
}
}
public void isInBlackList(String id, IUIKitCallback<Boolean> callback) {
provider.isInBlackList(id, new IUIKitCallback<Boolean>() {
@Override
public void onSuccess(Boolean data) {
ContactUtils.callbackOnSuccess(callback, data);
}
@Override
public void onError(String module, int errCode, String errMsg) {
TUIContactLog.e(TAG, "isInBlackList err code = " + errCode + ", desc = " + errMsg);
ContactUtils.callbackOnError(callback, errCode, errMsg);
}
});
}
public void isFriend(String id, ContactItemBean bean, TUIValueCallback<Boolean> callback) {
provider.isFriend(id, bean, callback);
}
public void addFriend(String userId, String addWord, String remark, IUIKitCallback<Pair<Integer, String>> callback) {
provider.addFriend(userId, addWord, remark, new IUIKitCallback<Pair<Integer, String>>() {
@Override
public void onSuccess(Pair<Integer, String> data) {
int code = data.first;
String result = "";
switch (code) {
case FriendApplicationBean.ERR_SUCC:
result = TUIContactService.getAppContext().getString(R.string.success);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_INVALID_PARAMETERS:
if (TextUtils.equals(data.second, "Err_SNS_FriendAdd_Friend_Exist")) {
result = TUIContactService.getAppContext().getString(R.string.have_be_friend);
break;
}
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_COUNT_LIMIT:
result = TUIContactService.getAppContext().getString(R.string.friend_limit);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_PEER_FRIEND_LIMIT:
result = TUIContactService.getAppContext().getString(R.string.other_friend_limit);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_IN_SELF_BLACKLIST:
result = TUIContactService.getAppContext().getString(R.string.in_blacklist);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_ALLOW_TYPE_DENY_ANY:
result = TUIContactService.getAppContext().getString(R.string.forbid_add_friend);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_IN_PEER_BLACKLIST:
result = TUIContactService.getAppContext().getString(R.string.set_in_blacklist);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_ALLOW_TYPE_NEED_CONFIRM:
result = TUIContactService.getAppContext().getString(R.string.wait_agree_friend);
break;
case FriendApplicationBean.ERR_SVR_FRIENDSHIP_ALREADY_FRIENDS:
result = TUIContactService.getAppContext().getString(R.string.have_be_friend);
break;
default:
result = TUIContactService.getAppContext().getString(R.string.other_friend_limit);
ToastUtil.toastLongMessage(data.first + " " + data.second);
break;
}
ContactUtils.callbackOnSuccess(callback, new Pair<>(code, result));
}
@Override
public void onError(String module, int errCode, String errMsg) {
ContactUtils.callbackOnError(callback, errCode, errMsg);
}
});
}
public void joinGroup(String groupId, String addWord, IUIKitCallback<Void> callback) {
provider.joinGroup(groupId, addWord, new IUIKitCallback<Void>() {
@Override
public void onSuccess(Void data) {
ContactUtils.callbackOnSuccess(callback, null);
}
@Override
public void onError(String module, int errCode, String errMsg) {
String msg = errMsg;
if (errCode == GroupInfo.ERR_SVR_GROUP_PERMISSION_DENY) {
msg = TUIContactService.getAppContext().getString(R.string.add_group_permission_deny);
} else if (errCode == GroupInfo.ERR_SVR_GROUP_ALLREADY_MEMBER) {
msg = TUIContactService.getAppContext().getString(R.string.add_group_allready_member);
} else if (errCode == GroupInfo.ERR_SVR_GROUP_NOT_FOUND) {
msg = TUIContactService.getAppContext().getString(R.string.add_group_not_found);
} else if (errCode == GroupInfo.ERR_SVR_GROUP_FULL_MEMBER_COUNT) {
msg = TUIContactService.getAppContext().getString(R.string.add_group_full_member);
}
ContactUtils.callbackOnError(callback, errCode, msg);
}
});
}
}

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