初始代码
This commit is contained in:
@@ -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>
|
||||
+60
@@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
+429
@@ -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();
|
||||
}
|
||||
}
|
||||
+92
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+271
@@ -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;
|
||||
}
|
||||
}
|
||||
+129
@@ -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;
|
||||
}
|
||||
}
|
||||
+85
@@ -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;
|
||||
}
|
||||
}
|
||||
+239
@@ -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; false,messages 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();
|
||||
}
|
||||
}
|
||||
+49
@@ -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;
|
||||
}
|
||||
}
|
||||
+12
@@ -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;
|
||||
}
|
||||
+97
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+161
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+230
@@ -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();
|
||||
}
|
||||
}
|
||||
+167
@@ -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());
|
||||
}
|
||||
}
|
||||
+71
@@ -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();
|
||||
}
|
||||
}
|
||||
+458
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+241
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+127
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+40
@@ -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();
|
||||
}
|
||||
}
|
||||
+89
@@ -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();
|
||||
}
|
||||
}
|
||||
+197
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+162
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+300
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+89
@@ -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();
|
||||
}
|
||||
}
|
||||
+109
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+270
@@ -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);
|
||||
}
|
||||
}
|
||||
+93
@@ -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();
|
||||
}
|
||||
}
|
||||
+333
@@ -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);
|
||||
}
|
||||
}
|
||||
+228
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+86
@@ -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");
|
||||
}
|
||||
}
|
||||
+45
@@ -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();
|
||||
}
|
||||
}
|
||||
+220
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+65
@@ -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) {}
|
||||
}
|
||||
+177
@@ -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);
|
||||
}
|
||||
}
|
||||
+70
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+169
@@ -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;
|
||||
}
|
||||
}
|
||||
+113
@@ -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);
|
||||
}
|
||||
}
|
||||
+226
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+146
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+278
@@ -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();
|
||||
}
|
||||
}
|
||||
+155
@@ -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;
|
||||
}
|
||||
}
|
||||
+33
@@ -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;
|
||||
}
|
||||
}
|
||||
+20
@@ -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();
|
||||
}
|
||||
+28
@@ -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);
|
||||
}
|
||||
+114
@@ -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;
|
||||
}
|
||||
}
|
||||
+340
@@ -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();
|
||||
}
|
||||
}
|
||||
+10
@@ -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();
|
||||
}
|
||||
+220
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+23
@@ -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;
|
||||
}
|
||||
}
|
||||
+169
@@ -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;
|
||||
}
|
||||
}
|
||||
+169
@@ -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;
|
||||
}
|
||||
}
|
||||
+69
@@ -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() {}
|
||||
}
|
||||
+7
@@ -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) {}
|
||||
}
|
||||
+7
@@ -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);
|
||||
}
|
||||
+11
@@ -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) {}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package com.tencent.qcloud.tuikit.tuicontact.interfaces;
|
||||
|
||||
public interface IAddMoreActivity {
|
||||
String getString(int resId);
|
||||
|
||||
void finish();
|
||||
}
|
||||
+20
@@ -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);
|
||||
}
|
||||
+7
@@ -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);
|
||||
}
|
||||
+17
@@ -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;
|
||||
}
|
||||
}
|
||||
+8
@@ -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);
|
||||
}
|
||||
+10
@@ -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);
|
||||
}
|
||||
+15
@@ -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) {}
|
||||
}
|
||||
+9
@@ -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);
|
||||
}
|
||||
+158
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+115
@@ -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();
|
||||
}
|
||||
}
|
||||
+8
@@ -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();
|
||||
}
|
||||
+236
@@ -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();
|
||||
}
|
||||
}
|
||||
+227
@@ -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();
|
||||
}
|
||||
}
|
||||
+64
@@ -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();
|
||||
}
|
||||
}
|
||||
+487
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+122
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+33
@@ -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);
|
||||
}
|
||||
}
|
||||
+79
@@ -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();
|
||||
}
|
||||
}
|
||||
+214
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+190
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+288
@@ -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);
|
||||
}
|
||||
}
|
||||
+110
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+91
@@ -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();
|
||||
}
|
||||
}
|
||||
+77
@@ -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();
|
||||
}
|
||||
}
|
||||
+222
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+245
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+90
@@ -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();
|
||||
}
|
||||
}
|
||||
+51
@@ -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);
|
||||
}
|
||||
}
|
||||
+276
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+163
@@ -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) {}
|
||||
}
|
||||
+178
@@ -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);
|
||||
}
|
||||
}
|
||||
+116
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+171
@@ -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;
|
||||
}
|
||||
}
|
||||
+115
@@ -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);
|
||||
}
|
||||
}
|
||||
+149
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+223
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+316
@@ -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) {}
|
||||
}
|
||||
}
|
||||
+163
@@ -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;
|
||||
}
|
||||
}
|
||||
+155
@@ -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;
|
||||
}
|
||||
}
|
||||
+540
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+523
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
+185
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
+77
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+469
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+210
@@ -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
Reference in New Issue
Block a user