群聊修改

This commit is contained in:
guozhen
2024-12-25 11:09:23 +08:00
committed by xuhuixiang
parent 675f68d00c
commit 16b58830cb
40 changed files with 1579 additions and 159 deletions

View File

@@ -47,11 +47,11 @@ android {
applicationId = "com.dskj.rbchat"
minSdk = 24
targetSdk = 34
versionCode = 193
versionName = "1.9.3"
versionCode = 192
versionName = "1.9.2"
multiDexEnabled = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
//manifestPlaceholders["IMAPPKEY"] = "c38c8bbebf7d12992d2a361bfceb6c6f" //正式
manifestPlaceholders["IMAPPKEY"] = "c38c8bbebf7d12992d2a361bfceb6c6f" //正式
// manifestPlaceholders["IMAPPKEY"] = "4cb6b0998f9e7af9d7673963e429959a" //测试
manifestPlaceholders["JPUSH_PKGNAME"] = "com.dskj.rbchat"
@@ -62,25 +62,10 @@ android {
abiFilters += listOf("armeabi-v7a", "arm64-v8a")
}
}
// flavorDimensions += "version"
// productFlavors {
//
// create("timeGo") {
// applicationId = "";
// versionNameSuffix = ""
// }
//
// create("mm") {
// applicationId = "";
// versionNameSuffix = "-mm"
// }
//
//
// }
buildTypes {
getByName("release") {
isMinifyEnabled = true
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
@@ -88,7 +73,6 @@ android {
signingConfig = signingConfigs.getByName("release")
isDebuggable = false;
// buildConfigField(
// "String",
// "HTTPS_BASE_URL",
@@ -277,6 +261,4 @@ dependencies {
// implementation("com.esotericsoftware.spine:spine-libgdx:4.1.00")
// implementation("com.esotericsoftware:spine-runtimes:+")
implementation("com.airbnb.android:lottie:6.0.0") // lottie json动画
}

View File

@@ -484,6 +484,14 @@
android:screenOrientation="portrait"
android:theme="@style/TransTheme"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".imkit.team.TeamManagerActivity"
android:exported="true"
android:screenOrientation="portrait" />
<activity
android:name=".imkit.team.TeamAddManagerActivity"
android:exported="true"
android:screenOrientation="portrait" />
<activity
android:name=".imkit.team.TeamInvitedJoinActivity"
android:exported="true"

View File

@@ -59,6 +59,7 @@ public class ContactGroupSettingActivity extends FunBaseSelectorDataActivity imp
FunContactSelectorSettingActivityBinding binding;
protected FunContactMembersAdapter membersAdapter;
protected boolean isChecked = true;
protected boolean isAllow = true;
protected ArrayList<String> listkey;
protected ArrayList<String> listname;
protected ArrayList<String> listavat;
@@ -142,6 +143,10 @@ public class ContactGroupSettingActivity extends FunBaseSelectorDataActivity imp
binding.rbSelector.setChecked(isChecked);
}
);
binding.swichAllow.setOnClickListener(v -> {
isAllow = !isAllow;
binding.swichAllow.setChecked(isAllow);
});
LinearLayoutManager layoutManager =
new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false);
binding.rvMembers.setLayoutManager(layoutManager);
@@ -288,6 +293,7 @@ public class ContactGroupSettingActivity extends FunBaseSelectorDataActivity imp
result.putExtra(KEY_TEAM_NAME, TextUtils.isEmpty(groupname) ? binding.editGroupname.getHint().toString() : groupname);
result.putExtra(KEY_TEAM_ICON, groupHeadUrl);
result.putExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, isChecked);
result.putExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_ALLOW_ADDFRIENDS, isAllow);
setResult(RESULT_OK, result);
finish();
}).setActionTextColor(getResources().getColor(R.color.color_6877fe));

View File

@@ -3,7 +3,6 @@ package com.dskj.rbchat.contact;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
@@ -36,11 +35,8 @@ import com.dskj.rbchat.adapter.CommonAdapter;
import com.dskj.rbchat.adapter.ViewHolder;
import com.dskj.rbchat.databinding.ActivityUserInfoBinding;
import com.dskj.rbchat.dialog.ActionConfirmDialog;
import com.dskj.rbchat.main.MainActivity;
import com.dskj.rbchat.main.mine.EditFriendUserInfoActivity;
import com.dskj.rbchat.main.mine.EditUserInfoActivity;
import com.dskj.rbchat.main.mine.photo.AddPhotoActivity;
import com.dskj.rbchat.main.mine.photo.UserPhotoDetailsActivity;
import com.dskj.rbchat.main.mine.photo.UserPhotoListActivity;
import com.dskj.rbchat.model.AlbumBean;
import com.dskj.rbchat.model.ListBeanResult;
@@ -62,7 +58,6 @@ import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils;
import com.netease.yunxin.kit.chatkit.ui.common.RxBus;
import com.netease.yunxin.kit.chatkit.ui.model.ChatBlackEvent;
import com.netease.yunxin.kit.chatkit.ui.model.ChatDeleteEvent;
import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent;
import com.netease.yunxin.kit.common.ui.activities.BaseActivity;
import com.netease.yunxin.kit.common.ui.utils.ToastX;
import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus;
@@ -80,9 +75,9 @@ import com.netease.yunxin.kit.corekit.im.provider.FetchCallback;
import com.netease.yunxin.kit.corekit.im.repo.CommonRepo;
import com.netease.yunxin.kit.corekit.im.utils.RouterConstant;
import com.netease.yunxin.kit.corekit.route.XKitRouter;
import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -93,12 +88,16 @@ import io.reactivex.schedulers.Schedulers;
public class UserInfoActivity extends BaseActivity {
private ActivityUserInfoBinding viewBinding;
protected UserInfoViewModel viewModel;
protected TeamSettingViewModel teammodel;
protected ContactUserInfoBean userInfoData;
protected String accId;
private ActivityResultLauncher<Intent> launcher;
protected BlackListViewModel blackListViewModel;
private String alias = "";
private String teamId = "";
private int isAllowAdd = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -588,7 +587,10 @@ public class UserInfoActivity extends BaseActivity {
viewBinding.moreIv.setVisibility(View.GONE);
viewBinding.starIv.setVisibility(View.GONE);
viewBinding.friendLy.setVisibility(View.GONE);
if (isAllowAdd == 1) {
viewBinding.addFriendsTv.setVisibility(View.VISIBLE);
}
finish();
RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER);
@@ -599,7 +601,9 @@ public class UserInfoActivity extends BaseActivity {
viewBinding.moreIv.setVisibility(View.GONE);
viewBinding.starIv.setVisibility(View.GONE);
viewBinding.friendLy.setVisibility(View.GONE);
if (isAllowAdd == 1) {
viewBinding.addFriendsTv.setVisibility(View.VISIBLE);
}
finish();
RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER);
@@ -665,6 +669,30 @@ public class UserInfoActivity extends BaseActivity {
finish();
}
}
//群设置了不允许互加好友
// teamId = getIntent().getStringExtra("teamId");
// if (!TextUtils.isEmpty(teamId)) {
// teammodel = new TeamSettingViewModel();
// teammodel.getTeamWithMemberData().observe(this, teamResultInfo -> {
// if (teamResultInfo.getValue() == null || !teamResultInfo.getSuccess()) {
// return;
// }
// Team teaminfo = teamResultInfo.getValue().getTeam();
// String extension = teaminfo.getExtension();
// if (!TextUtils.isEmpty(extension)) {
// TeamExtensionBean extensionBean = GsonUtils.getObjFromJSON(extension, TeamExtensionBean.class);
// if (extensionBean != null) {
// isAllowAdd = extensionBean.getAllowAddFriends();
// }
// if (isAllowAdd == 0) {
// viewBinding.addFriendsTv.setVisibility(View.GONE);
// }
//
// }
// });
// teammodel.requestTeamData(teamId);
// }
IMApplication.schemeUserId = null;
if (accId.equals(IMKitClient.account()) || ContactRepo.isFriend(accId)) { //是好友或者是自己 可以修改备注
@@ -845,7 +873,7 @@ public class UserInfoActivity extends BaseActivity {
viewBinding.moreIv.setVisibility(View.VISIBLE);
viewBinding.starIv.setVisibility(View.VISIBLE);
} else {
if (!userInfoData.isBlack) {
if (!userInfoData.isBlack && isAllowAdd == 1) {
viewBinding.addFriendsTv.setVisibility(View.VISIBLE);
}
}

View File

@@ -106,25 +106,20 @@ public class FunContactSelectorActivity extends BaseContactSelectorActivity {
super.updateView();
if (type == 1) { //转发 这ui 修改的....
rvSelected.setVisibility(View.GONE);
contactListView.showSelector(false);
lastContactView.showSelector(false);
loveContactView.showSelector(false);
searchContactView.showSelector(false);
LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) contactListView.getLayoutParams();
LinearLayout.LayoutParams params2 = (LinearLayout.LayoutParams) lastContactView.getLayoutParams();
LinearLayout.LayoutParams params3 = (LinearLayout.LayoutParams) loveContactView.getLayoutParams();
LinearLayout.LayoutParams params4 = (LinearLayout.LayoutParams) searchContactView.getLayoutParams();
params1.setMarginStart(SizeUtils.dp2px(15));
params2.setMarginStart(SizeUtils.dp2px(15));
params3.setMarginStart(SizeUtils.dp2px(15));
params4.setMarginStart(SizeUtils.dp2px(15));
contactListView.setLayoutParams(params1);
lastContactView.setLayoutParams(params2);
loveContactView.setLayoutParams(params3);
searchContactView.setLayoutParams(params4);
updateListView(contactListView);
updateListView(lastContactView);
updateListView(loveContactView);
updateListView(searchContactView);
}
}
public void updateListView(ContactListView contactListView) {
contactListView.showSelector(false);
LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) contactListView.getLayoutParams();
params1.setMarginStart(SizeUtils.dp2px(15));
contactListView.setLayoutParams(params1);
}
public void setViewHolderFactory(ContactListView contactView) {
contactView
.getDecoration()
@@ -169,6 +164,7 @@ public class FunContactSelectorActivity extends BaseContactSelectorActivity {
.withParam(KEY_TEAM_NAME, data.getStringExtra(KEY_TEAM_NAME))
.withParam(KEY_TEAM_ICON, data.getStringExtra(KEY_TEAM_ICON))
.withParam(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, data.getBooleanExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, true))
.withParam(ContactConstant.REQUEST_FUN_CREATE_GROUP_ALLOW_ADDFRIENDS, data.getBooleanExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_ALLOW_ADDFRIENDS, true))
.navigate(
res -> {
if (res.getSuccess() && res.getValue() instanceof CreateTeamResult) {

View File

@@ -418,6 +418,7 @@ public abstract class BaseTeamQrSettingActivity extends BaseActivity implements
.withParam(KEY_TEAM_NAME, data.getStringExtra(KEY_TEAM_NAME))
.withParam(KEY_TEAM_ICON, data.getStringExtra(KEY_TEAM_ICON))
.withParam(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, data.getBooleanExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, true))
.withParam(ContactConstant.REQUEST_FUN_CREATE_GROUP_ALLOW_ADDFRIENDS, data.getBooleanExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_ALLOW_ADDFRIENDS, true))
.navigate(
res -> {
if (res.getSuccess() && res.getValue() instanceof CreateTeamResult) {

View File

@@ -0,0 +1,394 @@
package com.dskj.rbchat.imkit.team;
import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ID;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatRadioButton;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.dskj.rbchat.R;
import com.dskj.rbchat.adapter.CommonAdapter;
import com.dskj.rbchat.adapter.ViewHolder;
import com.dskj.rbchat.base.LllChatBaseActivity;
import com.dskj.rbchat.databinding.ActivityTeamaddmanagerBinding;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.team.TeamService;
import com.netease.nimlib.sdk.team.model.TeamMember;
import com.netease.yunxin.kit.chatkit.repo.ContactRepo;
import com.netease.yunxin.kit.common.ui.utils.ToastX;
import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView;
import com.netease.yunxin.kit.common.utils.NetworkUtils;
import com.netease.yunxin.kit.contactkit.ui.databinding.FunContactSelectorActivityLayoutBinding;
import com.netease.yunxin.kit.contactkit.ui.fun.contact.FunContactDefaultFactory;
import com.netease.yunxin.kit.contactkit.ui.view.ContactListView;
import com.netease.yunxin.kit.corekit.im.IMKitClient;
import com.netease.yunxin.kit.corekit.im.model.UserInfo;
import com.netease.yunxin.kit.corekit.im.utils.RouterConstant;
import com.netease.yunxin.kit.corekit.route.XKitRouter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 添加管理員
*/
public class TeamAddManagerActivity extends LllChatBaseActivity {
@Override
public int initNavigationBarColor() {
return getColor(R.color.color_fffafa);
}
@Override
public int initStatusBarColor() {
return getColor(R.color.color_titlebar);
}
protected ActivityTeamaddmanagerBinding binding;
protected RecyclerView searchContactView; //搜索
protected RecyclerView allTeamContactView; //群好友
protected RecyclerView rvSelected; //已選擇
protected CommonAdapter selectedAdapter;
protected CommonAdapter searchAdapter;
protected CommonAdapter allMemberAdapter;
private List<UserInfo> listMembers = new ArrayList<>();
private List<UserInfo> listSearch = new ArrayList<>();
public static final String LISTMEMBERS = "listTeamMembers";
public static final String HASSELECTOR = "hasSelector"; //只能添加个数
public static final String BUNDLE = "bundle";
private List<UserInfo> userInfos;
private List<UserInfo> selectorPosition = new ArrayList<>();
private String teamId = "";
private int hasAdd;
public static void launch(Context context, String teamId, List<UserInfo> userInfos, int hasSelector, @NonNull ActivityResultLauncher<Intent> launcher) {
Intent intent = new Intent(context, TeamAddManagerActivity.class);
Bundle bundle = new Bundle();
bundle.putString(KEY_TEAM_ID, teamId);
bundle.putInt(HASSELECTOR, hasSelector);
bundle.putSerializable(LISTMEMBERS, (Serializable) userInfos);
intent.putExtra(BUNDLE, bundle);
launcher.launch(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityTeamaddmanagerBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Bundle args = getIntent().getBundleExtra(BUNDLE);
if (args == null) {
finish();
return;
}
userInfos = (List<UserInfo>) args.getSerializable(LISTMEMBERS);
teamId = args.getString(KEY_TEAM_ID);
hasAdd = args.getInt(HASSELECTOR);
listMembers.addAll(userInfos);
searchContactView = binding.recyclerSearchlistView;
rvSelected = binding.rvSelected;
allTeamContactView = binding.recyclerMember;
binding.title
.setOnBackIconClickListener(v -> onBackPressed())
.setTitle(R.string.str_teammanager_add_title)
.setActionText(String.format(getString(R.string.str_teammanager_title_right), selectorPosition.size()))
.setActionTextColor(getResources().getColor(com.netease.yunxin.kit.contactkit.ui.R.color.color_6877fe))
.setActionListener(
v -> {
if (!NetworkUtils.isConnected()) {
Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show();
return;
}
if (selectorPosition.size() > 0) {
List<String> accountId = new ArrayList<>();
for (UserInfo userInfo : selectorPosition) {
accountId.add(userInfo.getAccount());
}
addManager(accountId);
}else{
ToastX.showShortToast(R.string.str_teammanager_add_not_toast);
}
});
binding.title.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
binding.editSelectorFriends.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
String search = textView.getEditableText().toString();
//搜索好友
List<UserInfo> listSearchResult = searchName(search);
listSearch.clear();
listSearch.addAll(listSearchResult);
binding.layoutSearchlist.setVisibility(View.VISIBLE);
binding.layoutTeammemberlist.setVisibility(View.GONE);
searchAdapter.notifyDataSetChanged();
}
return false;
}
});
binding.editSelectorFriends.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 editable) {
if (TextUtils.isEmpty(editable.toString())) {
binding.icCleanEdit.setVisibility(View.GONE);
binding.layoutSearchlist.setVisibility(View.GONE);
binding.layoutTeammemberlist.setVisibility(View.VISIBLE);
listSearch.clear();
searchAdapter.notifyDataSetChanged();
} else {
binding.icCleanEdit.setVisibility(View.VISIBLE);
}
}
});
binding.icCleanEdit.setOnClickListener(view -> binding.editSelectorFriends.setText(""));
initRecyclerView();
}
public List<UserInfo> searchName(String key) {
List<UserInfo> listSearch = new ArrayList<>();
List<UserInfo> result = new ArrayList<>();
result.addAll(listMembers);
for (UserInfo userInfo : result) {
String name = getAlias(userInfo);
if (name.contains(key)) {
listSearch.add(userInfo);
}
}
return listSearch;
}
public String getAlias(UserInfo userInfo) {
String name = userInfo.getName();
if (ContactRepo.isFriend(userInfo.getAccount())) {
String alias = ContactRepo.getFriend(userInfo.getAccount()).getAlias();
return TextUtils.isEmpty(alias) ? name : alias;
}
return name;
}
public void addManager(List<String> accountList) {
NIMClient.getService(TeamService.class).addManagers(teamId, accountList).setCallback(new RequestCallback<List<TeamMember>>() {
@Override
public void onSuccess(List<TeamMember> members) {
// 撤销群管理员成功
ToastX.showShortToast(getString(R.string.str_teammanager_add_succ_toast));
Intent intent = new Intent();
intent.putExtra("managerlist", (Serializable) selectorPosition);
setResult(RESULT_OK, intent);
finish();
}
@Override
public void onFailed(int code) {
// 撤销群管理员失败
ToastX.showShortToast(getString(R.string.str_teammanager_delete_error));
}
@Override
public void onException(Throwable exception) {
// 错误
ToastX.showShortToast(getString(R.string.str_teammanager_delete_error));
}
});
}
public void initRecyclerView() {
LinearLayoutManager layoutManager =
new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false);
rvSelected.setLayoutManager(layoutManager);
selectedAdapter = new CommonAdapter<>(this, com.netease.yunxin.kit.contactkit.ui.R.layout.fun_friend_selected_view_holder, selectorPosition) {
@Override
public void convert(ViewHolder holder, UserInfo user, int index) {
ContactAvatarView contactAvatarView = holder.getView(com.netease.yunxin.kit.contactkit.ui.R.id.avatar_view);
TextView tvName = holder.getView(com.netease.yunxin.kit.contactkit.ui.R.id.tv_name);
String name = user.getName();
if (ContactRepo.isFriend(user.getAccount())) {
String alias = ContactRepo.getFriend(user.getAccount()).getAlias();
if (!TextUtils.isEmpty(alias)) {
name = alias;
}
}
tvName.setText(name);
if (TextUtils.isEmpty(user.getAvatar())) {
contactAvatarView.setData(R.mipmap.default_head_img, user.getName(), 0);
} else {
contactAvatarView.setData(user.getAvatar(), user.getName());
}
holder.getView(com.netease.yunxin.kit.contactkit.ui.R.id.root_view).setOnClickListener(v -> {
selectorPosition.remove(selectorPosition.indexOf(user));
notifyDataSetChanged();
allMemberAdapter.notifyDataSetChanged();
searchAdapter.notifyDataSetChanged();
updateTitleView();
});
}
};
rvSelected.setAdapter(selectedAdapter);
allTeamContactView.setLayoutManager(new LinearLayoutManager(this));
allMemberAdapter = new CommonAdapter<>(this, R.layout.item_team_members_selector, listMembers) {
@Override
public void convert(ViewHolder holder, UserInfo user, int index) {
ContactAvatarView contactAvatarView = holder.getView(R.id.avatar_view);
TextView tvName = holder.getView(R.id.tv_name);
AppCompatRadioButton radioButton = holder.getView(R.id.rb_selector);
String name = user.getName();
if (ContactRepo.isFriend(user.getAccount())) {
String alias = ContactRepo.getFriend(user.getAccount()).getAlias();
if (!TextUtils.isEmpty(alias)) {
name = alias;
}
}
tvName.setText(name);
if (TextUtils.isEmpty(user.getAvatar())) {
contactAvatarView.setData(R.mipmap.default_head_img, user.getName(), 0);
} else {
contactAvatarView.setData(user.getAvatar(), user.getName());
}
contactAvatarView.setOnClickListener(v -> {
startUserInfoActivity(user);
});
radioButton.setChecked(isSelector(user));
holder.getView(R.id.root_view).setOnClickListener(v -> {
if (!radioButton.isChecked() && selectorPosition.size() == hasAdd) {
ToastX.showShortToast(getResources().getString(R.string.str_teammanager_add_faile_toast));
return;
}
radioButton.setChecked(!radioButton.isChecked());
if (radioButton.isChecked()) {
selectorPosition.add(user);
} else {
selectorPosition.remove(selectorPosition.indexOf(user));
}
selectedAdapter.notifyDataSetChanged();
updateTitleView();
});
}
};
allTeamContactView.setAdapter(allMemberAdapter);
searchContactView.setLayoutManager(new LinearLayoutManager(this));
searchAdapter = new CommonAdapter<>(this, R.layout.item_team_members_selector, listSearch) {
@Override
public void convert(ViewHolder holder, UserInfo user, int index) {
ContactAvatarView contactAvatarView = holder.getView(R.id.avatar_view);
TextView tvName = holder.getView(R.id.tv_name);
AppCompatRadioButton radioButton = holder.getView(R.id.rb_selector);
String name = user.getName();
if (ContactRepo.isFriend(user.getAccount())) {
String alias = ContactRepo.getFriend(user.getAccount()).getAlias();
if (!TextUtils.isEmpty(alias)) {
name = alias;
}
}
tvName.setText(name);
if (TextUtils.isEmpty(user.getAvatar())) {
contactAvatarView.setData(R.mipmap.default_head_img, user.getName(), 0);
} else {
contactAvatarView.setData(user.getAvatar(), user.getName());
}
contactAvatarView.setOnClickListener(v -> {
startUserInfoActivity(user);
});
radioButton.setChecked(isSelector(user));
holder.getView(R.id.root_view).setOnClickListener(v -> {
if (!radioButton.isChecked() && selectorPosition.size() == hasAdd) {
ToastX.showShortToast(getResources().getString(R.string.str_teammanager_add_faile_toast));
return;
}
radioButton.setChecked(!radioButton.isChecked());
if (radioButton.isChecked()) {
selectorPosition.add(user);
} else {
selectorPosition.remove(selectorPosition.indexOf(user));
}
searchAdapter.notifyDataSetChanged();
selectedAdapter.notifyDataSetChanged();
allMemberAdapter.notifyDataSetChanged();
updateTitleView();
});
}
};
searchContactView.setAdapter(searchAdapter);
}
private void startUserInfoActivity(UserInfo user) {
XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
.withContext(TeamAddManagerActivity.this)
.withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account())
.withParam("userId", user.getAccount())
.withParam("isGroup", true)
.navigate();
}
protected void updateTitleView() {
binding.title.setActionText(String.format(getString(R.string.str_teammanager_title_right), selectorPosition.size()));
}
protected boolean isSelector(UserInfo index) {
for (UserInfo userInfo : selectorPosition) {
if (index == userInfo) {
return true;
}
}
return false;
}
}

View File

@@ -0,0 +1,291 @@
// Copyright (c) 2022 NetEase, Inc. All rights reserved.
// Use of this source code is governed by a MIT license that can be
// found in the LICENSE file.
package com.dskj.rbchat.imkit.team;
import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ID;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.dskj.rbchat.R;
import com.dskj.rbchat.adapter.CommonAdapter;
import com.dskj.rbchat.adapter.ViewHolder;
import com.dskj.rbchat.base.LllChatBaseActivity;
import com.dskj.rbchat.databinding.ActivityTeamManagerBinding;
import com.dskj.rbchat.databinding.ActivityTeamMembersBinding;
import com.dskj.rbchat.dialog.ActionConfirmDialog;
import com.dskj.rbchat.imkit.team.adapter.TeamMembersAdapter;
import com.dskj.rbchat.network.Api;
import com.dskj.rbchat.network.BaseObserver;
import com.dskj.rbchat.network.Result;
import com.dskj.rbchat.utils.LogUtils;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.team.TeamService;
import com.netease.nimlib.sdk.team.constant.TeamMemberType;
import com.netease.nimlib.sdk.team.model.TeamMember;
import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam;
import com.netease.yunxin.kit.chatkit.repo.ContactRepo;
import com.netease.yunxin.kit.common.ui.activities.BaseActivity;
import com.netease.yunxin.kit.common.ui.utils.ToastX;
import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView;
import com.netease.yunxin.kit.common.utils.NetworkUtils;
import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean;
import com.netease.yunxin.kit.corekit.im.IMKitClient;
import com.netease.yunxin.kit.corekit.im.model.UserInfo;
import com.netease.yunxin.kit.corekit.im.utils.RouterConstant;
import com.netease.yunxin.kit.corekit.route.XKitRouter;
import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 群管理员 (获取群成员,找出管理员)
*/
public class TeamManagerActivity extends LllChatBaseActivity {
public final TeamSettingViewModel teammodel = new TeamSettingViewModel();
private String teamId;
private String avaterurl;
// public static void launch(Context context, String teamId, @NonNull ActivityResultLauncher<Intent> launcher) {
// Intent intent = new Intent(context, TeamManagerActivity.class);
// intent.putExtra(KEY_TEAM_ID, teamId);
// launcher.launch(intent);
// }
ActivityTeamManagerBinding binding;
private List<UserInfo> listManager = new ArrayList<>();
private List<UserInfo> listTeamMembers = new ArrayList<>();
private CommonAdapter managerAdapter;
private ActivityResultLauncher launcher;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityTeamManagerBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
teamId = getIntent().getStringExtra(KEY_TEAM_ID);
launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
List<UserInfo> managers = (List<UserInfo>) result.getData().getSerializableExtra("managerlist"); //选了管理员,更新普通用户列表 更新当前管理员列表
listManager.addAll(managers);
updateManagerTextView();
binding.title.getRightTextView().setText(String.format(getString(R.string.str_teammanager_title_right), listManager.size()));
new Thread(new Runnable() {
@Override
public void run() {
for (UserInfo userInfoWithTeam : listManager) {
for (int i = 0; i < listTeamMembers.size(); i++) {
if (userInfoWithTeam.getAccount().equals(listTeamMembers.get(i).getAccount())) {
listTeamMembers.remove(i);
}
}
}
}
}).start();
}
});
if (NetworkUtils.isConnected()) {
showLoading();
//重新获取群成员
teammodel.getUserInfoData().observe(this, listResultInfo -> {
if (listResultInfo.getSuccess()) {
listManager.clear();
listTeamMembers.clear();
List<UserInfoWithTeam> listmember = listResultInfo.getValue();
setDataView(listmember);
dismissLoading();
}
});
teammodel.requestTeamMembers(teamId);
}
UserInfo userInfo = IMKitClient.getUserInfo();
avaterurl = userInfo.getAvatar();
if (TextUtils.isEmpty(avaterurl)) {
binding.avatarView.setData(R.mipmap.default_head_img, userInfo.getName(), 0);
} else {
binding.avatarView.setData(avaterurl, userInfo.getName());
}
binding.avatarView.setOnClickListener(v -> {
startUserInfoActivity(userInfo.getAccount());
});
binding.tvName.setText(userInfo.getName() + "");
binding.title.setOnBackIconClickListener(view -> finish());
binding.title.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
binding.title.setActionTextColor(getResources().getColor(com.netease.yunxin.kit.contactkit.ui.R.color.color_6877fe));
binding.title.setActionListener(v -> {
if (listManager.size() < 5) {
//添加管理員
TeamAddManagerActivity.launch(this, teamId, listTeamMembers, 5 - listManager.size(), launcher);
} else {
ToastX.showShortToast(R.string.str_teammanager_add_faile_toast);
}
});
binding.recyclerviewManager.setLayoutManager(new LinearLayoutManager(this));
managerAdapter = new CommonAdapter<>(this, R.layout.item_team_manager, listManager) {
@Override
public void convert(ViewHolder holder, UserInfo user, int index) {
ContactAvatarView contactAvatarView = holder.getView(R.id.item_avatar);
TextView tvName = holder.getView(R.id.item_username);
View line = holder.getView(R.id.item_line);
String name = user.getName();
if (ContactRepo.isFriend(user.getAccount())) {
String alias = ContactRepo.getFriend(user.getAccount()).getAlias();
if (!TextUtils.isEmpty(alias)) {
name = alias;
}
}
tvName.setText(name);
if (TextUtils.isEmpty(user.getAvatar())) {
contactAvatarView.setData(R.mipmap.default_head_img, user.getName(), 0);
} else {
contactAvatarView.setData(user.getAvatar(), user.getName());
}
contactAvatarView.setOnClickListener(v -> {
startUserInfoActivity(user.getAccount());
});
line.setVisibility(View.VISIBLE);
if (index == listManager.size() - 1) {
line.setVisibility(View.GONE);
}
holder.getView(R.id.iv_delete).setOnClickListener(v -> {
showDeleteDialog(index, user.getName(), user.getAccount());
});
}
};
binding.recyclerviewManager.setAdapter(managerAdapter);
}
public void showDeleteDialog(int position, String name, String account) {
ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, String.format(getString(R.string.str_teammanager_dialog_title), name),
getString(R.string.str_teammanager_dialog_cancel),
getString(com.netease.yunxin.kit.chatkit.ui.R.string.chat_dialog_sure));
actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() {
@Override
public void toSumbit() {
List<String> listaccount = new ArrayList<>();
listaccount.add(account);
removeManager(position, listaccount);
}
@Override
public void toCancel() {
}
});
actionConfirmDialog.show();
}
public void removeManager(int position, List<String> accountList) {
NIMClient.getService(TeamService.class).removeManagers(teamId, accountList).setCallback(new RequestCallback<List<TeamMember>>() {
@Override
public void onSuccess(List<TeamMember> members) {
// 撤销群管理员成功
ToastX.showShortToast(getString(R.string.str_teammanager_delete_succ));
listTeamMembers.add(0, listManager.get(position));
listManager.remove(position);
updateManagerTextView();
}
@Override
public void onFailed(int code) {
// 撤销群管理员失败
ToastX.showShortToast(getString(R.string.str_teammanager_delete_error));
}
@Override
public void onException(Throwable exception) {
// 错误
ToastX.showShortToast(getString(R.string.str_teammanager_delete_error));
}
});
}
//设置展示View
public void setDataView(List<UserInfoWithTeam> listmember) {
for (UserInfoWithTeam userInfoWithTeam :
listmember) {
TeamMemberType type = userInfoWithTeam.getTeamInfo().getType();
if (type == TeamMemberType.Manager) {
listManager.add(userInfoWithTeam.getUserInfo());
} else if (type == TeamMemberType.Normal) {
listTeamMembers.add(userInfoWithTeam.getUserInfo());
}
}
updateManagerTextView();
}
public void updateManagerTextView() {
if (listManager.size() > 0) {
binding.layoutManagerempty.setVisibility(View.GONE);
binding.recyclerviewManager.setVisibility(View.VISIBLE);
binding.tvTitlemanager.setText(getString(R.string.teamsetting_other_teammanager) + " (" + listManager.size() + "/5" + ")");
} else {
binding.tvTitlemanager.setText(getString(R.string.teamsetting_other_teammanager));
binding.layoutManagerempty.setVisibility(View.VISIBLE);
binding.recyclerviewManager.setVisibility(View.GONE);
}
binding.title.getRightTextView().setText(String.format(getString(R.string.str_teammanager_title_right), listManager.size()));
managerAdapter.setDates(listManager);
}
@Override
public int initNavigationBarColor() {
return getColor(R.color.color_fffafa);
}
@Override
public int initStatusBarColor() {
return getColor(R.color.color_titlebar);
}
public void startUserInfoActivity(String userid) {
XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
.withContext(TeamManagerActivity.this)
.withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account())
.withParam("userId", userid)
.withParam("isGroup", true)
.navigate();
}
}

View File

@@ -4,10 +4,7 @@
package com.dskj.rbchat.imkit.team;
import static com.dskj.rbchat.utils.GsonUtils.gson;
import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ID;
import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_NAME;
import static com.netease.yunxin.kit.teamkit.ui.utils.NetworkUtilsWrapper.handleNetworkBrokenResult;
import android.content.Context;
import android.content.Intent;
@@ -24,68 +21,32 @@ import android.view.inputmethod.EditorInfo;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.dskj.rbchat.R;
import com.dskj.rbchat.base.LllChatBaseActivity;
import com.dskj.rbchat.databinding.ActivityTeamMembersBinding;
import com.dskj.rbchat.dialog.ActionConfirmDialog;
import com.dskj.rbchat.imkit.team.adapter.TeamMembersAdapter;
import com.dskj.rbchat.model.AdBean;
import com.dskj.rbchat.model.UsersExistBean;
import com.dskj.rbchat.network.Api;
import com.dskj.rbchat.network.BaseObserver;
import com.dskj.rbchat.network.Result;
import com.dskj.rbchat.utils.GsonUtils;
import com.dskj.rbchat.utils.LogUtils;
import com.dskj.rbchat.utils.ShareDateUtils;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.netease.nimlib.sdk.team.constant.TeamMemberType;
import com.netease.nimlib.sdk.team.constant.TeamMessageNotifyTypeEnum;
import com.netease.nimlib.sdk.team.model.Team;
import com.netease.nimlib.sdk.team.model.TeamMember;
import com.netease.yunxin.kit.alog.ALog;
import com.netease.yunxin.kit.chatkit.model.ConversationInfo;
import com.netease.yunxin.kit.chatkit.model.TeamWithCurrentMember;
import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam;
import com.netease.yunxin.kit.chatkit.repo.ContactRepo;
import com.netease.yunxin.kit.chatkit.ui.page.LocationPageActivity;
import com.netease.yunxin.kit.chatkit.ui.page.viewmodel.ChatBaseViewModel;
import com.netease.yunxin.kit.chatkit.ui.page.viewmodel.ChatTeamViewModel;
import com.netease.yunxin.kit.chatkit.ui.model.TeamExtensionBean;
import com.netease.yunxin.kit.common.ui.utils.ToastX;
import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus;
import com.netease.yunxin.kit.common.utils.NetworkUtils;
import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel;
import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactMembersAdapter;
import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactSelectorDialog;
import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean;
import com.netease.yunxin.kit.contactkit.ui.search.SearchViewModel;
import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean;
import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel;
import com.netease.yunxin.kit.corekit.im.IMKitClient;
import com.netease.yunxin.kit.corekit.im.model.FriendInfo;
import com.netease.yunxin.kit.corekit.im.model.UserInfo;
import com.netease.yunxin.kit.corekit.im.utils.RouterConstant;
import com.netease.yunxin.kit.corekit.model.ResultInfo;
import com.netease.yunxin.kit.corekit.route.XKitRouter;
import com.netease.yunxin.kit.teamkit.ui.normal.adapter.TeamMemberListAdapter;
import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -100,6 +61,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
public static final String ISMANAGER = "isManager";
public static final String LISTUSERINFOS = "listUserInfos";
public static final String TEAMINFO = "teamInfo";
public static final String TYPE = "type";
public static final String QUITE = "quite";
public static final String TEAMQR = "teamQr";
@@ -108,14 +70,16 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
public boolean isRefresh = false; //是否刷新设置页
public boolean teamQr = true;
public List<UserInfo> listSearch = new ArrayList<>();
public int isAllowAdd = 1;
public static void launch(Context context, boolean isManager, boolean isShowTeamQR, String teamId, List<UserInfo> userInfos, @NonNull ActivityResultLauncher<Intent> launcher) {
public static void launch(Context context, int isManager, boolean isShowTeamQR, String teamId, List<UserInfo> userInfos, Team team, @NonNull ActivityResultLauncher<Intent> launcher) {
Intent intent = new Intent(context, TeamMembersListActivity.class);
intent.putExtra(ISMANAGER, isManager);
intent.putExtra(TYPE, 0);
intent.putExtra(TEAMQR, isShowTeamQR);
intent.putExtra(KEY_TEAM_ID, teamId);
intent.putExtra(LISTUSERINFOS, (Serializable) userInfos);
intent.putExtra(TEAMINFO, (Serializable) team);
launcher.launch(intent);
}
@@ -130,21 +94,37 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
ActivityTeamMembersBinding binding;
private boolean isManager;
private int isManager = 0; // 1 群主 2 管理员
private Team teamInfo;
private String teamOwnerId; //群主id;
private TeamMembersAdapter membersAdapter;
private TeamExtensionBean extensionBean;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setNavigationBarColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_white));
isManager = getIntent().getBooleanExtra(ISMANAGER, false);
isManager = getIntent().getIntExtra(ISMANAGER, 0);
teamInfo = (Team) getIntent().getSerializableExtra(TEAMINFO);
type = getIntent().getIntExtra(TYPE, 0);
quite = getIntent().getIntExtra(QUITE, 0);
List<UserInfo> list = (List<UserInfo>) getIntent().getSerializableExtra(LISTUSERINFOS);
teamQr = getIntent().getBooleanExtra(TEAMQR, true);
if (teamInfo != null) {
teamOwnerId = teamInfo.getCreator();
if (!TextUtils.isEmpty(teamInfo.getExtension())) {
extensionBean = GsonUtils.getObjFromJSON(teamInfo.getExtension(), TeamExtensionBean.class);
if (extensionBean == null) {
extensionBean = new TeamExtensionBean(Integer.parseInt(teamInfo.getExtension()), 1);
}
} else {
extensionBean = new TeamExtensionBean(1, 1);
}
isAllowAdd = extensionBean.getAllowAddFriends();
}
if (list != null && list.size() > 0) {
listmemebers.clear();
listmemebers.addAll(list);
@@ -173,6 +153,22 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
}
initView();
initData();
// teammodel.getTeamWithMemberData().observe(this, teamResultInfo -> {
// if (teamResultInfo.getValue() == null || !teamResultInfo.getSuccess()) {
// return;
// }
// Team teaminfo = teamResultInfo.getValue().getTeam();
// String extension = teaminfo.getExtension();
// if (!TextUtils.isEmpty(extension)) {
// TeamExtensionBean extensionBean = GsonUtils.getObjFromJSON(extension, TeamExtensionBean.class);
// if (extensionBean != null) {
// isAllowAdd = extensionBean.getAllowAddFriends();
// }
//
// }
// });
// teammodel.requestTeamData(teamId);
}
@@ -186,7 +182,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
Map<String, Long> memberMap;
public void getTeamActiveTime() {
if (isManager && type == 0) {
if (isManager != 0 && type == 0) {
Api.getInstance().teamMemberActiveTime(teamId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
@@ -198,7 +194,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
listmemebers.remove(0);
listmemebers = sortListByActivieTime(listmemebers);
listmemebers.add(0, IMKitClient.getUserInfo());
membersAdapter.setData(listmemebers, true, memberMap);
membersAdapter.setData(listmemebers, true, memberMap, teamId);
}
@@ -240,7 +236,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
public void setData() {
if (type == 0) {
listmemebers.add(0, IMKitClient.getUserInfo());
membersAdapter.setData(listmemebers, true, memberMap);
membersAdapter.setData(listmemebers, true, memberMap, teamId);
binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1));
} else { //不能编辑 转让
// UserInfo info = IMKitClient.getUserInfo();
@@ -256,7 +252,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size()));
membersAdapter.setEdit(false);
membersAdapter.setData(listmemebers, false, memberMap);
membersAdapter.setData(listmemebers, false, memberMap, teamId);
}
binding.rvMembers.setAdapter(membersAdapter);
}
@@ -273,7 +269,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
@Override
public void onItemClick(UserInfo item, int position) {
//查看成员详情 普通用户点击头像
startUserInfoActivity(item.getAccount());
startUserInfoActivity(item.getAccount(), teamId);
// deletePosition = position;
// if (!item.getAccount().equals(IMKitClient.account()) && membersAdapter.isEdit()) {
// if (type == 0) {
@@ -339,11 +335,18 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
binding.icCleanEdit.setOnClickListener(view -> binding.editSelectorFriends.setText(""));
}
public void startUserInfoActivity(String userid) {
public void startUserInfoActivity(String userid, String teamId) {
//如果群不允许群内添加好友 当前登录用户不是群主以及userid 也不是群主 直接跳过
if (isAllowAdd == 0 && isManager != 1 && !userid.equals(teamOwnerId)) {
return;
}
XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
.withContext(TeamMembersListActivity.this)
.withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account())
.withParam("userId", userid)
.withParam("teamId", teamId)
.withParam("isGroup", true)
.navigate();
}
@@ -419,7 +422,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
selectorlist.add(userinfo.getUserInfo().getAccount());
listmemebers.add(userinfo.getUserInfo());
}
membersAdapter.setData(listmemebers, true, memberMap);
membersAdapter.setData(listmemebers, true, memberMap, teamId);
isRefresh = true;
binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1));
}
@@ -448,7 +451,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
private void initTitleView() {
if (type == 0) { //右上角编辑,删除
binding.title.setTitle(R.string.teamsetting_members);
if (isManager) {
if (isManager != 0) {
setTitleAction(R.string.teammember_edit, new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -538,7 +541,7 @@ public class TeamMembersListActivity extends BaseTeamQrSettingActivity {
binding.title.setActionText(actionText);
membersAdapter.setEdit(!isEdit);
membersAdapter.getSelectedInt().clear();
membersAdapter.setData(listmember, isEdit, memberMap);
membersAdapter.setData(listmember, isEdit, memberMap, teamId);
}
public void showConfirmDialog(boolean isDelete, String title, List<String> account) {

View File

@@ -26,6 +26,7 @@ import com.dskj.rbchat.R;
import com.dskj.rbchat.dialog.ActionConfirmDialog;
import com.dskj.rbchat.imkit.base.BaseSettingOtherActivity;
import com.dskj.rbchat.model.TeamUpdateEvent;
import com.dskj.rbchat.utils.GsonUtils;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
@@ -33,8 +34,10 @@ import com.netease.nimlib.sdk.team.constant.TeamBeInviteModeEnum;
import com.netease.nimlib.sdk.team.constant.TeamFieldEnum;
import com.netease.nimlib.sdk.team.model.Team;
import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam;
import com.netease.yunxin.kit.chatkit.ui.model.TeamExtensionBean;
import com.netease.yunxin.kit.corekit.event.EventCenter;
import com.netease.yunxin.kit.corekit.im.model.UserInfo;
import com.netease.yunxin.kit.corekit.im.utils.RouterConstant;
import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel;
import java.io.Serializable;
@@ -57,6 +60,7 @@ public class TeamOtherSettingActivity extends BaseSettingOtherActivity {
private ActivityResultLauncher launcher;
public List<UserInfo> listmemebers = new ArrayList<>();
private boolean updateIcon = false;
private TeamExtensionBean extensionBean;
public static void launch(Context context, Team teaminfo, @NonNull ActivityResultLauncher<Intent> launcher) {
Intent intent = new Intent(context, TeamOtherSettingActivity.class);
@@ -165,16 +169,24 @@ public class TeamOtherSettingActivity extends BaseSettingOtherActivity {
team, launcher
);
});
String extension = team.getExtension();
String extension = team.getExtension(); //扩展字段
if (!TextUtils.isEmpty(extension)) {
binding.swichTeamqr.setChecked(team.getExtension().equals("1"));
extensionBean = GsonUtils.getObjFromJSON(extension, TeamExtensionBean.class);
if (extensionBean == null) {
extensionBean = new TeamExtensionBean(Integer.parseInt(extension), 1);
}
binding.swichTeamqr.setChecked(extensionBean.getShowQrCode() == 1);
} else {
extensionBean = new TeamExtensionBean(1, 1);
}
int value = team.getVerifyType().getValue();
binding.swichAddtype.setChecked(team.getTeamBeInviteMode().getValue() == 1);
binding.tvTeamallowaddfriends.setText(extensionBean.getAllowAddFriends() == 1 ? getString(R.string.teamsetting_other_teamallow) : getString(R.string.teamsetting_other_teamallow_not));
Map<TeamFieldEnum, Serializable> map = new HashMap<>();
binding.swichTeamqr.setOnClickListener(view -> {
//onclick check 变更
map.put(TeamFieldEnum.Extension, binding.swichTeamqr.isChecked() ? "1" : "0");
// map.put(TeamFieldEnum.Extension, binding.swichTeamqr.isChecked() ? "1" : "0");
extensionBean.setShowQrCode(binding.swichTeamqr.isChecked() ? 1 : 0);
map.put(TeamFieldEnum.Extension, GsonUtils.beanToJSONString(extensionBean));
teammodel.UpdateTeamFilesExtension(team.getId(), map);
});
@@ -182,6 +194,11 @@ public class TeamOtherSettingActivity extends BaseSettingOtherActivity {
map.put(TeamFieldEnum.BeInviteMode, binding.swichAddtype.isChecked() ? TeamBeInviteModeEnum.NoAuth : TeamBeInviteModeEnum.NeedAuth);
teammodel.UpdateTeamFilesExtension(team.getId(), map);
});
binding.flteammanager.setOnClickListener(v -> {
Intent intent = new Intent(this, TeamManagerActivity.class);
intent.putExtra(RouterConstant.KEY_TEAM_ID, team.getId());
startActivity(intent);
});
}

View File

@@ -44,16 +44,13 @@ import com.netease.nimlib.sdk.team.model.TeamMember;
import com.netease.yunxin.kit.chatkit.model.IMMessageInfo;
import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam;
import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant;
import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils;
import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent;
import com.netease.yunxin.kit.chatkit.ui.model.TeamExtensionBean;
import com.netease.yunxin.kit.corekit.event.EventCenter;
import com.netease.yunxin.kit.corekit.im.model.UserInfo;
import com.netease.yunxin.kit.corekit.im.utils.RouterConstant;
import com.netease.yunxin.kit.corekit.route.XKitRouter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
@@ -126,7 +123,14 @@ public class TeamSettingActivity extends BaseTeamQrSettingActivity {
}
);
binding.tvmember.setOnClickListener(view -> {
TeamMembersListActivity.launch(this, teamMember.getType() == TeamMemberType.Owner, isTeamShow, teamId, listmemebers, launcher);
int manager = 0;
if (teamMember.getType() == TeamMemberType.Owner) {
manager = 1;
}
if (teamMember.getType() == TeamMemberType.Manager) {
manager = 2;
}
TeamMembersListActivity.launch(this, manager, isTeamShow, teamId, listmemebers, teamInfo, launcher);
});
binding.tvinvited.setOnClickListener(view -> showAddFriendsDialog(isTeamShow));
binding.tvexit.setOnClickListener(view -> setQuitTeam());
@@ -292,7 +296,6 @@ public class TeamSettingActivity extends BaseTeamQrSettingActivity {
});
teammodel.getQuitTeamData().observe(this, voidResultInfo -> {
if (voidResultInfo.getSuccess()) {
finish();
@@ -331,8 +334,7 @@ public class TeamSettingActivity extends BaseTeamQrSettingActivity {
}
TeamExtensionBean extensionBean;
protected void refreshUI(Team team) {
teamName = team.getName();
@@ -340,11 +342,21 @@ public class TeamSettingActivity extends BaseTeamQrSettingActivity {
binding.tvTitle.setText(String.format("%s(%d)", teamName, teamNumber));
setNotifyUI(teamInfo.getMessageNotifyType() == TeamMessageNotifyTypeEnum.All);
setSettingUI(teamMember.getType() == TeamMemberType.Owner);
if (!TextUtils.isEmpty(teamInfo.getExtension()) && teamInfo.getExtension().equals("0")) {
isTeamShow = false;
} else {
isTeamShow = true;
//为了兼容老版本
if (!TextUtils.isEmpty(teamInfo.getExtension())) {
extensionBean = GsonUtils.getObjFromJSON(teamInfo.getExtension(), TeamExtensionBean.class);
if (extensionBean == null) {
extensionBean = new TeamExtensionBean(Integer.parseInt(teamInfo.getExtension()), 1);
}
} else {
extensionBean = new TeamExtensionBean(1, 1);
}
isTeamShow = (extensionBean.getShowQrCode() == 1);
// if (!TextUtils.isEmpty(teamInfo.getExtension()) && teamInfo.getExtension().equals("0")) {
// isTeamShow = false;
// } else {
// isTeamShow = true;
// }
}
// public void setExtension() {

View File

@@ -19,6 +19,10 @@ import androidx.viewbinding.ViewBinding;
import com.dskj.rbchat.R;
import com.dskj.rbchat.databinding.TeamMembersViewHolderBinding;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.team.TeamService;
import com.netease.nimlib.sdk.team.constant.TeamMemberType;
import com.netease.nimlib.sdk.team.model.TeamMember;
import com.netease.yunxin.kit.chatkit.repo.ContactRepo;
import com.netease.yunxin.kit.chatkit.ui.normal.factory.ChatVieHolderFactory;
import com.netease.yunxin.kit.common.ui.utils.AvatarColor;
@@ -47,6 +51,7 @@ public class TeamMembersAdapter extends RecyclerView.Adapter<TeamMembersAdapter.
private int selectpostion = -1;
private Map<String, Long> mapTime;
private List<Integer> selectedInt = new ArrayList<>(); //多选position
private String teamId;
public TeamMembersAdapter(Context context, int type) {
members = new ArrayList<>();
@@ -60,12 +65,13 @@ public class TeamMembersAdapter extends RecyclerView.Adapter<TeamMembersAdapter.
this.itemClickListener = itemClickListener;
}
public void setData(List<UserInfo> list, boolean isShow, Map<String, Long> mapActiveTime) {
public void setData(List<UserInfo> list, boolean isShow, Map<String, Long> mapActiveTime, String teamId) {
members.clear();
members.addAll(list);
selectedInt.clear();
isShowInvited = isShow;
mapTime = mapActiveTime;
this.teamId = teamId;
notifyDataSetChanged();
}
@@ -125,14 +131,19 @@ public class TeamMembersAdapter extends RecyclerView.Adapter<TeamMembersAdapter.
holder.binding.tvName.setText(mContext.getResources().getString(R.string.invcode_friend_txt));
holder.binding.tvNameActivetime.setVisibility(View.GONE);
} else {
if (isEdit) {
TeamMember teamMember = NIMClient.getService(TeamService.class).queryTeamMemberBlock(teamId, userInfo.getAccount());
if (teamMember != null && (teamMember.getType() == TeamMemberType.Manager || teamMember.getType() == TeamMemberType.Owner)) {
holder.binding.icDelete.setVisibility(View.GONE);
} else {
holder.binding.icDelete.setVisibility(View.VISIBLE);
}
if (selectedInt.indexOf(position) >= 0) {
holder.binding.icDelete.setBackgroundResource(R.mipmap.dialog_gou_t);
} else {
holder.binding.icDelete.setBackgroundResource(R.mipmap.dialog_gou_ff);
}
holder.binding.icDelete.setVisibility(userInfo.getAccount().equals(IMKitClient.account()) ? View.GONE : View.VISIBLE);
// holder.binding.icDelete.setVisibility(userInfo.getAccount().equals(IMKitClient.account()) ? View.GONE : View.VISIBLE);
} else if (mType == 1) {
if (selectpostion >= 0 && position == selectpostion) {
@@ -182,7 +193,7 @@ public class TeamMembersAdapter extends RecyclerView.Adapter<TeamMembersAdapter.
}
notifyDataSetChanged();
} else {
if (isEdit) {
if (isEdit && holder.binding.icDelete.getVisibility() == View.VISIBLE) {
//管理员删除用户选择
int index = selectedInt.indexOf(position);
if (index >= 0) {

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (c) 2022 NetEase, Inc. All rights reserved.
~ Use of this source code is governed by a MIT license that can be
~ found in the LICENSE file.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_fffafa"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.netease.yunxin.kit.common.ui.widgets.BackTitleBar
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleText="@string/teamsetting_other_teammanager"
app:titleTextColor="@color/color_333333" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:paddingStart="@dimen/dp_15"
android:paddingEnd="@dimen/dp_15">
<TextView
android:id="@+id/tv_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_15"
android:text="@string/team_owner"
android:textColor="@color/color_b8b5be"
android:textSize="@dimen/sp_14" />
<com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView
android:id="@+id/avatar_view"
android:layout_width="@dimen/dimen_45_dp"
android:layout_height="@dimen/dimen_45_dp"
android:layout_below="@+id/tv_tips"
android:layout_marginTop="@dimen/dp_13"
app:avatarCorner="@dimen/dimen_45_dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/avatar_view"
android:layout_alignBottom="@+id/avatar_view"
android:layout_marginStart="@dimen/dp_15"
android:layout_toEndOf="@+id/avatar_view"
android:gravity="center"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp_16" />
<View
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0_5"
android:layout_below="@+id/avatar_view"
android:layout_marginTop="@dimen/dp_10"
android:background="@color/color_ebe8F1" />
<TextView
android:id="@+id/tv_titlemanager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/line"
android:layout_marginTop="@dimen/dp_15"
android:textColor="@color/color_b8b5be"
android:textSize="@dimen/sp_14" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview_manager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_titlemanager"
android:visibility="gone" />
<LinearLayout
android:id="@+id/layout_managerempty"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_125"
android:layout_below="@+id/tv_titlemanager"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:layout_width="@dimen/dp_32"
android:layout_height="@dimen/dp_32"
android:src="@mipmap/ic_teammanager_empty" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_teammanager_not"
android:textColor="@color/color_b8b5be"
android:textSize="@dimen/sp_14" />
</LinearLayout>
</RelativeLayout>
<TextView
android:id="@+id/tvteammembers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_15"
android:lineSpacingExtra="@dimen/dp_5"
android:text="@string/str_teammanager_tips"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_14"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (c) 2022 NetEase, Inc. All rights reserved.
~ Use of this source code is governed by a MIT license that can be
~ found in the LICENSE file.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_selectorroot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<com.netease.yunxin.kit.common.ui.widgets.BackTitleBar
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_1_dp"
android:background="@color/color_f7f7f7" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_40_dp"
android:layout_marginStart="@dimen/dimen_15_dp"
android:layout_marginTop="@dimen/dimen_10_dp"
android:layout_marginEnd="@dimen/dimen_15_dp"
android:background="@drawable/fun_bg_addfriends_verifymsg"
android:orientation="horizontal">
<EditText
android:id="@+id/edit_selector_friends"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.9"
android:background="@null"
android:drawableStart="@drawable/fun_ic_conversation_search"
android:drawablePadding="@dimen/dimen_5_dp"
android:hint="@string/fun_contact_createteam_tips"
android:imeOptions="actionSearch"
android:paddingStart="@dimen/dimen_15_dp"
android:singleLine="true"
android:textColorHint="@color/color_cccccc"
android:textCursorDrawable="@null" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ic_clean_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="0.1"
android:visibility="gone"
app:srcCompat="@drawable/ic_selector_close" />
</LinearLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_selected"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_20_dp"
android:paddingHorizontal="@dimen/dimen_15_dp" />
<!-- 群全部成员-->
<LinearLayout
android:id="@+id/layout_teammemberlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dimen_15_dp"
android:layout_marginTop="@dimen/dimen_20_dp"
android:text="@string/team_member_title"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_14" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_member"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_20_dp"
app:showIndexBar="false"
app:showSelector="true" />
</LinearLayout>
<!--查找结果-->
<LinearLayout
android:id="@+id/layout_searchlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dimen_15_dp"
android:layout_marginTop="@dimen/dimen_20_dp"
android:text="@string/fun_searchresult_txt"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_14"
android:textStyle="bold" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_searchlistView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_10_dp"
app:showIndexBar="false"
app:showSelector="true" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>

View File

@@ -238,6 +238,40 @@
android:background="@color/color_f4f4f4" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_5">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_60"
android:background="@android:color/transparent"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/teamsetting_other_teamaddfriends"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_16" />
<TextView
android:id="@+id/tv_teamallowaddfriends"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:text="@string/teamsetting_other_teamallow"
android:textColor="@color/color_7f7b81"
android:textSize="@dimen/sp_14" />
</FrameLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"
android:layout_marginTop="@dimen/dp_15"
android:background="@color/color_f4f4f4" />
<FrameLayout
android:id="@+id/flcleanhistory"
android:layout_width="match_parent"
@@ -295,6 +329,35 @@
android:src="@drawable/ic_frame_mine_right_arrow" />
</FrameLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"
android:background="@color/color_f4f4f4" />
<FrameLayout
android:id="@+id/flteammanager"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_54">
<TextView
android:id="@+id/tvManager"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginEnd="64dp"
android:gravity="center_vertical"
android:singleLine="true"
android:text="@string/teamsetting_other_teammanager"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp_16" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:src="@drawable/ic_frame_mine_right_arrow" />
</FrameLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white">
<com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView
android:id="@+id/item_avatar"
android:layout_width="@dimen/dimen_45_dp"
android:layout_height="@dimen/dimen_45_dp"
android:layout_marginTop="@dimen/dp_13"
android:layout_marginBottom="@dimen/dp_10"
app:avatarCorner="@dimen/dimen_45_dp"
app:layout_constraintBottom_toTopOf="@+id/item_line"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/item_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_15"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp_16"
app:layout_constraintBottom_toBottomOf="@+id/item_avatar"
app:layout_constraintStart_toEndOf="@+id/item_avatar"
app:layout_constraintTop_toTopOf="@+id/item_avatar" />
<View
android:id="@+id/item_line"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"
android:background="@color/color_ebe8F1"
app:layout_constraintBottom_toBottomOf="parent" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="@dimen/dp_20"
android:layout_height="@dimen/dp_20"
android:src="@mipmap/ic_teammanager_delete"
app:layout_constraintBottom_toBottomOf="@+id/item_avatar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/item_avatar" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/view_normal_selector">
<androidx.appcompat.widget.AppCompatRadioButton
android:id="@+id/rb_selector"
style="@style/FunSelectorRadioBtn"
android:layout_width="@dimen/dimen_18_dp"
android:layout_height="@dimen/dimen_18_dp"
android:layout_marginStart="@dimen/dp_12"
android:clickable="false"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView
android:id="@+id/avatar_view"
android:layout_width="@dimen/dimen_45_dp"
android:layout_height="@dimen/dimen_45_dp"
android:layout_marginLeft="@dimen/dimen_12_dp"
android:layout_marginTop="@dimen/dimen_10_dp"
android:layout_marginBottom="@dimen/dimen_10_dp"
app:avatarCorner="@dimen/dimen_45_dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/rb_selector"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginLeft="0dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen_12_dp"
android:layout_marginRight="@dimen/dimen_10_dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_16"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@+id/avatar_view"
app:layout_constraintLeft_toRightOf="@+id/avatar_view"
app:layout_constraintTop_toTopOf="@+id/avatar_view" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -39,7 +39,6 @@
android:layout_marginEnd="@dimen/dp_15"
android:ellipsize="end"
android:maxLines="1"
android:text="dfff"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_16"
android:textStyle="bold"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -7,7 +7,7 @@
<resources>
<string name="google_map_key">AIzaSyAAXviskUffLY3KfnrKVPlwcj5Ks5ces_8</string>
<string name="app_name">MM</string>
<string name="app_name">淘夢購</string>
<string name="yunxin_name">Netease CommsEase</string>
<string name="yunxin_desc">Stable instant messaging service</string>
@@ -44,7 +44,7 @@
<string name="incoming_call_notify_video">[Video Call]</string>
<string name="mine_collect">Favorites</string>
<string name="mine_about">About MM</string>
<string name="mine_about">About 淘夢購</string>
<string name="mine_setting">Settings</string>
<string name="mine_version">Version</string>
<string name="mine_product">introduce</string>
@@ -322,7 +322,7 @@
<string name="qrcode_scan_activity_not_surpport_qrcontent">Unsupported 2D code content! </string>
<string name="shouquandenglu_txt">Authorized login</string>
<string name="tltdbj_txt">淘樂町 store device login</string>
<string name="seqs_dl_txt">Apply to log in with your MM account</string>
<string name="seqs_dl_txt">Apply to log in with your 淘夢購 account</string>
<string name="ndnc_txt">Your avatar and nickname will be authorized for use</string>
<string name="yunxu_txt">Allow</string>
<string name="jujue_txt">Reject</string>
@@ -332,7 +332,7 @@
<string name="aihistory_clean">Clear</string>
<string name="aihistory_title">Are you sure you want to clear the Q&amp;A history?</string>
<string name="aianswer_txt">Smart Dream answer is being generated, please wait...</string>
<string name="aiintroduct_zh_txt">您好,我是MM團隊研發的智能認知模型,我的名字叫小夢,我可以和人類進行自然交流,解答問題,高效完成各領域的認知智能需求</string>
<string name="aiintroduct_zh_txt">您好,我是淘夢購團隊研發的智能認知模型,我的名字叫小夢,我可以和人類進行自然交流,解答問題,高效完成各領域的認知智能需求</string>
<string name="aiintroduct_en_txt">Hello, I am an intelligent cognitive model developed by TimeGo team. My name is Xiaomeng.
I can naturally communicate with humans, answer questions, and efficiently complete the cognitive intelligence needs in various fields</string>
<string name="aihint_txt">Hey there! I am your new friend Xiao Meng</string>
@@ -347,7 +347,6 @@
<string name="nmhmylg_txt">You guys havent talked yet~</string>
<string name="myltjl_txt">There is no chat record yet~</string>
<string name="to_wallet_send_redpack_txt">Gold coin balance has been deposited, click to view></string>
<string name="to_wallet_send_redpack_txt_lipin">Gift points balance has been credited, click to view></string>
<string name="species_txt">Gold coins</string>
<string name="silver_coins_txt">Silver coins</string>
<string name="gift_redpacket_txt">Gift money</string>
@@ -361,7 +360,6 @@
<string name="danwei_txt">pc</string>
<string name="remarks_hit_txt">Congratulations on getting rich and good luck</string>
<string name="send_in_redenvelope_txt1">Put Cash into the red envelope</string>
<string name="send_in_lipinjifen_txt1">Stuff gift points into the red envelope</string>
<string name="send_in_redtype_txt1">Put gold coins into the red envelope</string>
<string name="no_get_to_back_txt">If not collected within 24 hours, the red envelope quantity will be returned</string>
<string name="zhuanzhangobject_txt">Click to select give away object</string>
@@ -588,7 +586,11 @@
<string name="teamsetting_other_addtype">Automatically add members</string>
<string name="teamsetting_other_addtypedesc">Members are added to the group immediately after receiving the invitation. You can turn off this setting to allow only invited members to join the group. </string>
<string name="teamsetting_other_teamurl">Use the group link QR code to allow users to join this group</string>
<string name="teamsetting_other_teamaddfriends">Allow adding friends within the group</string>
<string name="teamsetting_other_teamallow">Allow</string>
<string name="teamsetting_other_teamallow_not">Not Allow</string>
<string name="teamsetting_other_teamhead">Set avatar</string>
<string name="teamsetting_other_teammanager">Group Administrator</string>
<string name="teamsetting_other_history">Clear chat history</string>
<string name="teamsetting_other_announcement">Group Announcement</string>
<string name="teamsetting_other_announcement_hint">Enter group announcement content</string>
@@ -827,7 +829,7 @@
<string name="zhifushibai_txt1">Overtime unpaid</string>
<string name="zhifushibai_txt2">Payment timeout</string>
<string name="shengyu_time_txt">residue %s</string>
<string name="wangyeban_tmg_txt">WebMM</string>
<string name="wangyeban_tmg_txt">Web淘梦购</string>
<string name="duibiji_txt2">Gift cabinet redemption</string>
<string name="lpgdh_txt">Gift cabinet redemption-</string>
<string name="today_txt">Today Active</string>
@@ -884,7 +886,7 @@
<string name="userphoto_dialog_movetitle">Move to Another Album</string>
<string name="userphoto_dialog_notfriendtitle">This album is set to only be viewable by friends. Please send a friend request to view.</string>
<string name="kefu_selector_title">Please select the question you want to inquire about:</string>
<string name="kefu_select_taomenggou">Questions about MM</string>
<string name="kefu_select_taomenggou">Questions about Taomenggou</string>
<string name="kefu_select_taoleding">Questions about Taoleting</string>
<string name="kefu_select_jifengshangcheng">Questions about the Points Mall</string>
<string name="kefu_select_hezuo">Questions about Cooperative Merchants</string>
@@ -904,5 +906,16 @@
<string name="str_qi">%d Issue</string>
<string name="str_installment_tips">Including service fee NT$ %d</string>
<string name="str_installment_toast">Please select the number of installments</string>
<string name="str_chat_all">Global Chat</string>
<string name="str_teammanager_not">Not set yet, go add it~</string>
<string name="str_teammanager_tips">Only the group owner can set administrators;\nA maximum of 5 administrators can be set;\nGroup administrators can assist the group owner in managing the group chat, with functions such as removing group members and deleting chat messages.</string>
<string name="str_teammanager_dialog_cancel">I\'ll think about it</string>
<string name="str_teammanager_dialog_title">Are you sure to remove %s\'s group administrator role?</string>
<string name="str_teammanager_delete_error">Removal failed</string>
<string name="str_teammanager_delete_succ">Removal successful</string>
<string name="str_teammanager_title_right">Add (%d)</string>
<string name="str_teammanager_add_title">Add Administrator</string>
<string name="str_teammanager_add_faile_toast">A maximum of 5 administrators can be set</string>
<string name="str_teammanager_add_succ_toast">Added successfully</string>
<string name="str_teammanager_add_not_toast">Please select an administrator</string>
</resources>

View File

@@ -7,7 +7,7 @@
<resources>
<string name="google_map_key">AIzaSyAAXviskUffLY3KfnrKVPlwcj5Ks5ces_8</string>
<string name="app_name">MM</string>
<string name="app_name">淘夢購</string>
<string name="yunxin_name">網易雲信</string>
<string name="yunxin_desc">真正穩定的IM 雲端服務</string>
@@ -328,7 +328,7 @@
<string name="aihistory_clean">クリア</string>
<string name="aihistory_title">Q&amp;A履歴をクリアしてもよろしいですか?</string>
<string name="aianswer_txt">スマート ドリームの回答を生成中です。お待​​ちください...</string>
<string name="aiintroduct_zh_txt">您好,我是MM團隊研發的智能認知模型,我的名字叫小夢,我可以和人類進行自然交流,解答問題,高效完成各領域的認知智能需求</string>
<string name="aiintroduct_zh_txt">您好,我是淘夢購團隊研發的智能認知模型,我的名字叫小夢,我可以和人類進行自然交流,解答問題,高效完成各領域的認知智能需求</string>
<string name="aiintroduct_en_txt">Hello, I am an intelligent cognitive model developed by TimeGo team. My name is Xiaomeng.
I can naturally communicate with humans, answer questions, and efficiently complete the cognitive intelligence needs in various fields</string>
<string name="aihint_txt">ちょっと、そこ!私はあなたの新しい友達シャオ・メンです</string>
@@ -344,7 +344,6 @@
<string name="nmhmylg_txt">まだ話していませんね~</string>
<string name="myltjl_txt">まだチャット記録がありません~</string>
<string name="to_wallet_send_redpack_txt">金貨残高が入金されているので、をクリックして確認してください></string>
<string name="to_wallet_send_redpack_txt_lipin">ギフトポイント残高が入金されました。クリックして確認></string>
<string name="species_txt">金貨</string>
<string name="silver_coins_txt">銀貨</string>
<string name="gift_redpacket_txt">贈り物のお金</string>
@@ -358,7 +357,6 @@
<string name="danwei_txt">パソコン</string>
<string name="remarks_hit_txt">お金持ちになり、幸運を祈ります</string>
<string name="send_in_redenvelope_txt1">赤い封筒に金貨を入れます</string>
<string name="send_in_lipinjifen_txt1">ギフトポイントを赤い封筒に詰める</string>
<string name="send_in_redtype_txt1">赤い封筒に金貨を詰める</string>
<string name="no_get_to_back_txt">未受領のお年玉は、24時間以内に返却されます</string>
<string name="zhuanzhangobject_txt">クリックして転送オブジェクトを選択します</string>
@@ -587,7 +585,11 @@
<string name="teamsetting_other_addtype">メンバーに自動的に参加する</string>
<string name="teamsetting_other_addtypedesc">メンバーは、招待を受信するとすぐにグループに追加されます。 この設定をオフにして、招待されたメンバーのみがグループに参加できるようにすることができます。 </string>
<string name="teamsetting_other_teamurl">グループ リンク QR コードを使用して、ユーザーがこのグループに参加できるようにします</string>
<string name="teamsetting_other_teamaddfriends">グループ内で友達追加を許可しますか</string>
<string name="teamsetting_other_teamallow">許可</string>
<string name="teamsetting_other_teamallow_not">許可しない</string>
<string name="teamsetting_other_teamhead">アバターを設定する</string>
<string name="teamsetting_other_teammanager">グループ管理者</string>
<string name="teamsetting_other_history">チャット履歴をクリア</string>
<string name="teamsetting_other_announcement">グループのお知らせ</string>
<string name="teamsetting_other_announcement_hint">グループのお知らせ内容を入力してください</string>
@@ -825,7 +827,7 @@
<string name="zhifushibai_txt1">タイムアウト未払い</string>
<string name="zhifushibai_txt2">支払タイムアウト</string>
<string name="shengyu_time_txt">余剰 %s</string>
<string name="wangyeban_tmg_txt">ホームページ版MM</string>
<string name="wangyeban_tmg_txt">ホームページ版淘夢購</string>
<string name="duibiji_txt2">ギフトボックスの交換</string>
<string name="lpgdh_txt">ギフトボックスの交換-</string>
<string name="today_txt">今日アクティブ</string>
@@ -882,7 +884,7 @@
<string name="userphoto_dialog_movetitle">他のアルバムに移動</string>
<string name="userphoto_dialog_notfriendtitle">このアルバムは友達のみ閲覧可能に設定されています。閲覧するには友達リクエストを送信してください。</string>
<string name="kefu_selector_title">お問い合わせの内容を選択してください:</string>
<string name="kefu_select_taomenggou">MMに関する質問</string>
<string name="kefu_select_taomenggou">淘夢購に関する質問</string>
<string name="kefu_select_taoleding">淘樂町に関する質問</string>
<string name="kefu_select_jifengshangcheng">ポイントモールに関する質問</string>
<string name="kefu_select_hezuo">協力業者に関する質問</string>
@@ -902,5 +904,17 @@
<string name="str_qi">%d期</string>
<string name="str_installment_tips">サービス料込み NT$ %d</string>
<string name="str_installment_toast">分割回数を選択してください</string>
<string name="str_chat_all">世界チャット</string>
<string name="str_teammanager_not">まだ設定されていません。追加してください~</string>
<string name="str_teammanager_tips">グループオーナーのみが管理者を設定できます;\n最大で5人の管理者を設定できます\nグループ管理者は、グループオーナーを補助してグループチャットを管理し、メンバーの削除やチャットメッセージの削除などの機能を持っています。</string>
<string name="str_teammanager_dialog_cancel">もう少し考えます</string>
<string name="str_teammanager_dialog_title">%s のグループ管理者権限を解除してもよろしいですか?</string>
<string name="str_teammanager_delete_error">削除に失敗しました</string>
<string name="str_teammanager_delete_succ">削除が成功しました</string>
<string name="str_teammanager_title_right">追加(%d)</string>
<string name="str_teammanager_add_title">管理者を追加</string>
<string name="str_teammanager_add_faile_toast">管理者は最大5人まで設定できます</string>
<string name="str_teammanager_add_succ_toast">追加に成功しました</string>
<string name="str_teammanager_add_not_toast">管理者を選択してください</string>
</resources>

View File

@@ -579,7 +579,11 @@
<string name="teamsetting_other_addtype">自动添加成员</string>
<string name="teamsetting_other_addtypedesc">成员在收到邀请后立即被添加至群。您可以关闭此设置仅仅允许接收邀请的成员加入群。</string>
<string name="teamsetting_other_teamurl">使用群链接 行动码让用户加入此群</string>
<string name="teamsetting_other_teamaddfriends">是否允许群内添加好友</string>
<string name="teamsetting_other_teamallow">允许</string>
<string name="teamsetting_other_teamallow_not">不允许</string>
<string name="teamsetting_other_teamhead">设置头像</string>
<string name="teamsetting_other_teammanager">群管理员</string>
<string name="teamsetting_other_history">清除聊天记录</string>
<string name="teamsetting_other_announcement">群公告</string>
<string name="teamsetting_other_announcement_hint">输入群公告内容</string>
@@ -893,4 +897,16 @@
<string name="str_qi">%d期</string>
<string name="str_installment_tips">含服务费NT$ %d</string>
<string name="str_installment_toast">请选择分期数</string>
<string name="str_teammanager_not">暂未设定,去添加~</string>
<string name="str_teammanager_tips">只有群主可设置管理员;\n最多可设置5个管理员\n群管理员可协助群主管理群聊拥有移除群成员和删除群聊消息等功能。</string>
<string name="str_teammanager_dialog_cancel">我再想想</string>
<string name="str_teammanager_dialog_title">确定移除 %s 群管理员身份?</string>
<string name="str_teammanager_delete_error">移除失敗</string>
<string name="str_teammanager_delete_succ">移除成功</string>
<string name="str_teammanager_title_right">添加(%d)</string>
<string name="str_teammanager_add_title">添加管理员</string>
<string name="str_teammanager_add_faile_toast">管理员最多可设置5个</string>
<string name="str_teammanager_add_succ_toast">添加成功</string>
<string name="str_teammanager_add_not_toast">请选择管理员</string>
</resources>

View File

@@ -97,6 +97,8 @@
<color name="color_6877fe">#6877FE</color>
<color name="color_ff4040">#FF4040</color>
<color name="color_ffecec">#FFECEC</color>
<color name="color_b8b5be">#B8B5BE</color>
<color name="color_ebe8F1">#EBE8F1</color>

View File

@@ -580,7 +580,12 @@
<string name="teamsetting_other_addtype">自動加入成員</string>
<string name="teamsetting_other_addtypedesc">成員在收到邀請後立即被加入至群組。 您可以關閉此設定僅允許接收邀請的成員加入群組。 </string>
<string name="teamsetting_other_teamurl">使用群組連結 行動碼讓使用者加入此群</string>
<string name="teamsetting_other_teamaddfriends">是否允許群內新增好友</string>
<string name="teamsetting_other_teamallow">允許</string>
<string name="teamsetting_other_teamallow_not">不允許</string>
<string name="teamsetting_other_teamhead">設定頭像</string>
<string name="teamsetting_other_teammanager">群管理員</string>
<string name="teamsetting_other_history">清除聊天記錄</string>
<string name="teamsetting_other_announcement">群公告</string>
<string name="teamsetting_other_announcement_hint">輸入群公告內容</string>
@@ -902,4 +907,16 @@
<string name="str_installment_tips">含服務費NT$ %d</string>
<string name="str_installment_toast">請選擇分期數</string>
<string name="str_teammanager_not">尚未設定,去新增~</string>
<string name="str_teammanager_tips">僅有群主可以設定管理員;\n最多可以設定 5 個管理員;\n群管理員可以協助群主管理群聊擁有移除群成員和刪除群聊訊息等功能。</string>
<string name="str_teammanager_dialog_cancel">我再想想</string>
<string name="str_teammanager_dialog_title">確定移除 %s 群管理員身份?</string>
<string name="str_teammanager_delete_error">移除失敗</string>
<string name="str_teammanager_delete_succ">移除成功</string>
<string name="str_teammanager_title_right">新增(%d)</string>
<string name="str_teammanager_add_title">新增管理員</string>
<string name="str_teammanager_add_faile_toast">管理員最多可設置5個</string>
<string name="str_teammanager_add_succ_toast">添加成功</string>
<string name="str_teammanager_add_not_toast">請選擇管理員</string>
</resources>

View File

@@ -16,7 +16,11 @@ import androidx.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.netease.nim.highavailable.LogUtils;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.team.TeamService;
import com.netease.nimlib.sdk.team.model.Team;
import com.netease.yunxin.kit.chatkit.ui.R;
import com.netease.yunxin.kit.chatkit.ui.common.GsonUtils;
import com.netease.yunxin.kit.chatkit.ui.common.MessageHelper;
@@ -26,6 +30,7 @@ import com.netease.yunxin.kit.chatkit.ui.fun.view.message.viewholder.FunChatBase
import com.netease.yunxin.kit.chatkit.ui.model.BusinessCardBean;
import com.netease.yunxin.kit.chatkit.ui.model.BusinessShareBean;
import com.netease.yunxin.kit.chatkit.ui.model.ChatMessageBean;
import com.netease.yunxin.kit.chatkit.ui.model.TeamExtensionBean;
import com.netease.yunxin.kit.chatkit.ui.view.message.viewholder.ChatBaseMessageViewHolder;
import com.netease.yunxin.kit.common.ui.utils.ToastX;
import com.netease.yunxin.kit.corekit.im.IMKitClient;
@@ -48,6 +53,11 @@ public class ChatBusinessViewHolder extends FunChatBaseMessageViewHolder {
LayoutInflater.from(parent.getContext()), getMessageContainer());
}
private String teamId = "";
private int isAllowAdd = 0;
private String teamOwnerId; //群主id;
private TeamExtensionBean extensionBean;
@SuppressLint("ResourceAsColor")
@Override
public void bindData(ChatMessageBean message, ChatMessageBean lastMessage) {
@@ -57,7 +67,36 @@ public class ChatBusinessViewHolder extends FunChatBaseMessageViewHolder {
BusinessShareBean circleShareBean = GsonUtils.getObjFromJSON(name, BusinessShareBean.class);
Log.i("名片", "名片获取到的数据0" + GsonUtils.beanToJSONString(circleShareBean));
// Log.i("名片","名片获取到的数据2"+message.getMessageData().getMessage().getSessionId());
// if (currentMessage.getMessageData().getMessage().getSessionType() == SessionTypeEnum.Team) {
// teamId = currentMessage.getMessageData().getMessage().getSessionId();
// NIMClient.getService(TeamService.class).searchTeam(teamId).setCallback(new RequestCallback<Team>() {
// @Override
// public void onSuccess(Team result) {
// teamOwnerId = teamInfo.getCreator();
// if (!TextUtils.isEmpty(teamInfo.getExtension())) {
// extensionBean = GsonUtils.getObjFromJSON(teamInfo.getExtension(), TeamExtensionBean.class);
// if (extensionBean == null) {
// extensionBean = new TeamExtensionBean(Integer.parseInt(teamInfo.getExtension()), 1);
// }
// } else {
// extensionBean = new TeamExtensionBean(1, 1);
// }
// isAllowAdd = extensionBean.getAllowAddFriends();
// }
//
// @Override
// public void onFailed(int code) {
//
// }
//
// @Override
// public void onException(Throwable exception) {
//
// }
// });
// } else {
// teamId = "";
// }
if (message.getMessageData().getMessage().getFromAccount().equals(IMKitClient.account())) {
binding.bigLy.setBackgroundResource(R.drawable.fun_message_send_bg);
binding.userNameTv.setTextColor(binding.bigLy.getResources().getColor(R.color.color_white));
@@ -77,12 +116,23 @@ public class ChatBusinessViewHolder extends FunChatBaseMessageViewHolder {
binding.cavIcon.setData(circleShareBean.data.getAvatar(), circleShareBean.data.getName());
}
binding.userNameTv.setText(circleShareBean.data.getName());
binding.bigLy.setOnClickListener(v -> XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
.withContext(binding.bigLy.getContext())
.withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, circleShareBean.data.getAccout())
.withParam("isGroup", currentMessage.getMessageData().getMessage().getSessionType().getValue() != SessionTypeEnum.P2P.getValue())
.withParam("userId", circleShareBean.data.getAccout())
.navigate());
// binding.bigLy.setOnClickListener(v -> {
// //如果是群,且群不允许群内添加好友 当前登录用户不是群主以及userid 也不是群主 直接跳过
// if (!TextUtils.isEmpty(teamId) && isAllowAdd == 0 &&
// !IMKitClient.getUserInfo().getAccount().equals(teamOwnerId) &&
// !circleShareBean.data.getAccout().equals(teamOwnerId)) {
// return;
// }
// XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
// .withContext(binding.bigLy.getContext())
// .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, circleShareBean.data.getAccout())
// .withParam("isGroup", currentMessage.getMessageData().getMessage().getSessionType().getValue() != SessionTypeEnum.P2P.getValue())
// .withParam("userId", circleShareBean.data.getAccout())
// .withParam("teamId", teamId)
// .navigate();
// });
} catch (Exception e) {
e.printStackTrace();
}

View File

@@ -7,9 +7,16 @@ package com.netease.yunxin.kit.chatkit.ui.factory;
import android.text.TextUtils;
import com.netease.nim.highavailable.LogUtils;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.nimlib.sdk.msg.constant.MsgDirectionEnum;
import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum;
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.netease.nimlib.sdk.team.TeamService;
import com.netease.nimlib.sdk.team.constant.TeamMemberType;
import com.netease.nimlib.sdk.team.model.TeamMember;
import com.netease.yunxin.kit.chatkit.ui.ChatMessageType;
import com.netease.yunxin.kit.chatkit.ui.R;
import com.netease.yunxin.kit.chatkit.ui.common.GsonUtils;
@@ -20,6 +27,7 @@ import com.netease.yunxin.kit.chatkit.ui.view.popmenu.IChatPopMenu;
import com.netease.yunxin.kit.chatkit.ui.view.popmenu.IChatPopMenuClickListener;
import com.netease.yunxin.kit.common.ui.utils.ToastX;
import com.netease.yunxin.kit.common.utils.NetworkUtils;
import com.netease.yunxin.kit.corekit.im.IMKitClient;
import com.netease.yunxin.kit.corekit.im.custom.CustomAttachment;
import java.lang.ref.WeakReference;
@@ -56,11 +64,21 @@ public class ChatPopActionFactory {
this.customPopMenu = new WeakReference<>(popMenu);
}
boolean isManager = false;
public List<ChatPopMenuAction> getNormalActions(ChatMessageBean message) {
List<ChatPopMenuAction> actions = new ArrayList<>();
if (message.getMessageData() == null) {
return actions;
}
isManager = false;
IMMessage imMessage = message.getMessageData().getMessage();
if ((imMessage.getSessionType() == SessionTypeEnum.Team || imMessage.getSessionType() == SessionTypeEnum.SUPER_TEAM)) {
TeamMember teamMember = NIMClient.getService(TeamService.class).queryTeamMemberBlock(imMessage.getSessionId(), IMKitClient.account());
if (teamMember != null && (teamMember.getType() == TeamMemberType.Manager || teamMember.getType() == TeamMemberType.Owner)) {
isManager = true;
}
}
if (customPopMenu == null
|| customPopMenu.get() == null
|| customPopMenu.get().showDefaultPopMenu()) {
@@ -93,11 +111,13 @@ public class ChatPopActionFactory {
actions.add(getMultiSelectAction(message));
// actions.add(getCollectionAction(message));
// actions.add(getDeleteAction(message));
if (message.getMessageData().getMessage().getDirect() == MsgDirectionEnum.Out) {
if (imMessage.getDirect() == MsgDirectionEnum.Out || isManager) {
boolean isShowChehui = true;
if (message.getViewType() == MsgTypeEnum.custom.getValue()) {
CustomAttachment attachment =
(CustomAttachment) message.getMessageData().getMessage().getAttachment();
(CustomAttachment) imMessage.getAttachment();
LogUtils.i("自定义消息的类型", "自定义消息的类型:" + GsonUtils.beanToJSONString(attachment));
if (attachment != null) {

View File

@@ -44,12 +44,14 @@ import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant;
import com.netease.yunxin.kit.chatkit.ui.R;
import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils;
import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils;
import com.netease.yunxin.kit.chatkit.ui.common.GsonUtils;
import com.netease.yunxin.kit.chatkit.ui.data.entity.ChatDraftData;
import com.netease.yunxin.kit.chatkit.ui.databinding.FunChatSearchViewHolderBinding;
import com.netease.yunxin.kit.chatkit.ui.fun.view.MessageBottomLayout;
import com.netease.yunxin.kit.chatkit.ui.fun.viewholder.FunSearchMessageViewHolder;
import com.netease.yunxin.kit.chatkit.ui.model.ChatMessageBean;
import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent;
import com.netease.yunxin.kit.chatkit.ui.model.TeamExtensionBean;
import com.netease.yunxin.kit.chatkit.ui.model.UpdateTeamEvent;
import com.netease.yunxin.kit.chatkit.ui.model.ait.AitBlock;
import com.netease.yunxin.kit.chatkit.ui.page.adapter.SearchMessageAdapter;
@@ -82,7 +84,6 @@ import java.util.Map;
public class FunChatTeamFragment extends FunChatFragment {
private static final String TAG = "ChatTeamFragment";
Team teamInfo;
IMMessage anchorMessage;
private boolean showDeleteDialog = false;
Observer<FetchResult<List<IMTeamMessageReceiptInfo>>> teamReceiptObserver;
@@ -169,7 +170,7 @@ public class FunChatTeamFragment extends FunChatFragment {
super.initData(bundle);
}
public TeamExtensionBean extensionBean;
private void refreshView() {
if (teamInfo != null) {
// chatView.getTitleBar().setTitle(teamInfo.getName());
@@ -212,6 +213,17 @@ public class FunChatTeamFragment extends FunChatFragment {
}
//获取是否允许加好友状态
if (!TextUtils.isEmpty(teamInfo.getExtension())) {
extensionBean = GsonUtils.getObjFromJSON(teamInfo.getExtension(), TeamExtensionBean.class);
if (extensionBean == null) {
extensionBean = new TeamExtensionBean(Integer.parseInt(teamInfo.getExtension()), 1);
}
} else {
extensionBean = new TeamExtensionBean(1, 1);
}
isAllowAd = extensionBean.getAllowAddFriends();
}
}

View File

@@ -0,0 +1,32 @@
package com.netease.yunxin.kit.chatkit.ui.model;
/**
* 群聊扩展字段对象
*/
public class TeamExtensionBean {
public TeamExtensionBean(int showQrCode, int allowAddFriends) {
this.showQrCode = showQrCode;
this.allowAddFriends = allowAddFriends;
}
private int showQrCode = 1;
private int allowAddFriends = 1;
public int getShowQrCode() {
return showQrCode;
}
public void setShowQrCode(int showQrCode) {
this.showQrCode = showQrCode;
}
public int getAllowAddFriends() {
return allowAddFriends;
}
public void setAllowAddFriends(int allowAddFriends) {
this.allowAddFriends = allowAddFriends;
}
}

View File

@@ -55,6 +55,7 @@ public interface ApiService {
* 测试环境
*/
//String URL = "https://api-test.letschat2023.com/";
// String URL = "https://8.217.244.135:8001/";
String SUBSTATIONID = "1703655363476242434";

View File

@@ -79,6 +79,7 @@ import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.netease.nimlib.sdk.msg.model.MsgPinOption;
import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum;
import com.netease.nimlib.sdk.msg.model.RecentContact;
import com.netease.nimlib.sdk.team.model.Team;
import com.netease.nimlib.sdk.uinfo.UserService;
import com.netease.nimlib.sdk.uinfo.model.NimUserInfo;
import com.netease.yunxin.kit.alog.ALog;
@@ -278,6 +279,9 @@ public abstract class ChatBaseFragment extends BaseFragment {
public String forwardAction;
public Team teamInfo;
public int isAllowAd = 0;
@Nullable
@Override
public View onCreateView(
@@ -1633,6 +1637,13 @@ public abstract class ChatBaseFragment extends BaseFragment {
|| !delegateListener.onUserIconClick(view, position, messageBean)) {
// Log.i("点击了去用户详情页", "点击了去用户详情页:" + messageBean.getMessageData().getMessage().getFromAccount());
if (!isServices) {
//如果是群,且群不允许群内添加好友 当前登录用户不是群主以及userid 也不是群主 直接跳过
if ((sessionType == SessionTypeEnum.SUPER_TEAM || sessionType == SessionTypeEnum.Team)
&& isAllowAd == 0
&& teamInfo != null && !teamInfo.getCreator().equals(IMKitClient.account())
&& !teamInfo.getCreator().equals(messageBean.getMessageData().getMessage().getFromAccount())) {
return false;
}
XKitRouter.withKey(getUserInfoRoutePath())
.withContext(view.getContext())
.withParam(
@@ -1640,6 +1651,7 @@ public abstract class ChatBaseFragment extends BaseFragment {
messageBean.getMessageData().getMessage().getFromAccount())
.withParam("userId", messageBean.getMessageData().getMessage().getFromAccount())
.withParam("isGroup", (sessionType == SessionTypeEnum.Team || sessionType == SessionTypeEnum.SUPER_TEAM))
.withParam("teamId", (sessionType == SessionTypeEnum.Team || sessionType == SessionTypeEnum.SUPER_TEAM) ? messageBean.getMessageData().getMessage().getSessionId() : "")
.navigate();
}
}
@@ -1944,11 +1956,24 @@ public abstract class ChatBaseFragment extends BaseFragment {
case ChatMessageType.CUSTOM_STICKER_BUSINESS_CARD:
BusinessShareBean businessShareBean = GsonUtils.getObjFromJSON(name, BusinessShareBean.class);
if (businessShareBean != null) {
//如果是群,且群不允许群内添加好友 当前登录用户不是群主以及userid 也不是群主 直接跳过
if ((sessionType == SessionTypeEnum.SUPER_TEAM || sessionType == SessionTypeEnum.Team)
&& isAllowAd == 0
&& teamInfo != null && !teamInfo.getCreator().equals(IMKitClient.account())
&& !teamInfo.getCreator().equals(businessShareBean.data.getAccout())) {
return;
}
XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
.withContext(getActivity())
.withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, businessShareBean.data.getAccout())
.withParam("isGroup", sessionType != SessionTypeEnum.P2P)
.withParam("userId", businessShareBean.data.getAccout())
.navigate();
// XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE)
// .withContext(getActivity())
// .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, businessShareBean.data.getAccout())
// .withParam("userId", businessShareBean.data.getAccout())
// .navigate();
}
break;
case ChatMessageType.CUSTOM_STICKER_TRANSFER_ACCOUNTS:

View File

@@ -58,7 +58,7 @@ public class CustomConfig {
/**
* Color.BLUE
*/
private String confirmText = "确定";
private String confirmText = "quantity";
/**
* Color.BLUE

View File

@@ -13,6 +13,7 @@ public class ContactConstant {
public static final String REQUEST_CONTACT_ALL_FRIENDSBEAN = "allfiends";
public static final String PATH_FUN_CREATE_GROUP_PAGE = "creategroup";
public static final String REQUEST_FUN_CREATE_GROUP_AUTO = "autoinvited";
public static final String REQUEST_FUN_CREATE_GROUP_ALLOW_ADDFRIENDS = "allowaddfriends";
public static class SearchViewType {
public static final int USER = 1;

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
@@ -9,6 +10,8 @@
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:rightTitleText="@string/fun_creategroup_sure"
app:titleText="@string/fun_creategroup_title" />
@@ -27,10 +30,10 @@
android:id="@+id/ic_groupheadtop"
android:layout_width="@dimen/dimen_88_dp"
android:layout_height="@dimen/dimen_88_dp"
app:srcCompat="@mipmap/ic_grouphead_setting"
app:layout_constraintBottom_toBottomOf="@+id/ic_grouphead"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:srcCompat="@mipmap/ic_grouphead_setting" />
<TextView
android:layout_width="wrap_content"
@@ -148,6 +151,30 @@
app:layout_constraintStart_toStartOf="@+id/tvgroup_autojoin"
app:layout_constraintTop_toBottomOf="@+id/tvgroup_autojoin" />
<TextView
android:id="@+id/tvgroup_addFriends"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen_15_dp"
android:layout_marginTop="@dimen/dimen_28_dp"
android:text="@string/fun_creategroup_allowaddfriends"
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_16"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvgroup_autojoin_tips" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swich_allow"
android:layout_width="wrap_content"
android:layout_height="@dimen/dimen_24_dp"
android:layout_marginEnd="@dimen/dimen_15_dp"
android:checked="true"
android:thumb="@drawable/switch_thumb_selector"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvgroup_addFriends"
app:layout_constraintTop_toTopOf="@+id/tvgroup_addFriends"
app:track="@drawable/switch_track_selector" />
<TextView
android:id="@+id/tvgroup_members"
@@ -158,7 +185,7 @@
android:textColor="@color/color_333333"
android:textSize="@dimen/text_size_16"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvgroup_autojoin_tips" />
app:layout_constraintTop_toBottomOf="@+id/tvgroup_addFriends" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_members"

View File

@@ -127,6 +127,7 @@
<string name="fun_creategroup_uploadhead">Upload avatar</string>
<string name="fun_creategroup_autojoin_tips">Users will join the group after receiving the invitation. After turning off this setting, requiring members to join the group requires manual acceptance of the invitation. </string>
<string name="fun_creategroup_autojoin">User automatically joins</string>
<string name="fun_creategroup_allowaddfriends">Allow adding friends within the group</string>
<string name="fun_creategroup_name">Group name</string>
<string name="fun_creategroup_title">Set group file</string>
<string name="fun_creategroup_sure">Create</string>

View File

@@ -128,6 +128,7 @@
<string name="fun_creategroup_uploadhead">アバターをアップロード</string>
<string name="fun_creategroup_autojoin_tips">ユーザーは、招待を受信した後にグループに参加します。この設定をオフにした後、メンバーにグループへの参加を要求するには、招待を手動で承諾する必要があります。 </string>
<string name="fun_creategroup_autojoin">ユーザーは自動的に参加します</string>
<string name="fun_creategroup_allowaddfriends">グループ内で友達追加を許可しますか</string>
<string name="fun_creategroup_name">グループ名</string>
<string name="fun_creategroup_title">グループ ファイルを設定する</string>
<string name="fun_creategroup_sure">作成</string>

View File

@@ -128,6 +128,7 @@
<string name="fun_creategroup_uploadhead">上传头像</string>
<string name="fun_creategroup_autojoin_tips">用户在收到邀请后就会加入群组,关闭此设定后要求成员加入群组需手动接受邀请。</string>
<string name="fun_creategroup_autojoin">用户自动加入</string>
<string name="fun_creategroup_allowaddfriends">是否允许群内添加好友</string>
<string name="fun_creategroup_name">群组名称</string>
<string name="fun_creategroup_title">设定群组档案</string>
<string name="fun_creategroup_sure">建立</string>

View File

@@ -128,6 +128,7 @@
<string name="fun_creategroup_uploadhead">上傳頭像</string>
<string name="fun_creategroup_autojoin_tips">使用者收到邀請後就會加入群組,關閉此設定後要求成員加入群組需手動接受邀請。 </string>
<string name="fun_creategroup_autojoin">使用者自動加入</string>
<string name="fun_creategroup_allowaddfriends">是否允許群內新增好友</string>
<string name="fun_creategroup_name">群組名稱</string>
<string name="fun_creategroup_title">設定群組檔案</string>
<string name="fun_creategroup_sure">建立</string>

View File

@@ -21,6 +21,7 @@ import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.netease.nim.highavailable.LogUtils;
import com.netease.nimlib.sdk.team.constant.TeamBeInviteModeEnum;
import com.netease.nimlib.sdk.team.constant.TeamExtensionUpdateModeEnum;
import com.netease.nimlib.sdk.team.constant.TeamFieldEnum;
@@ -38,9 +39,12 @@ import com.netease.yunxin.kit.corekit.model.ErrorMsg;
import com.netease.yunxin.kit.corekit.model.ResultInfo;
import com.netease.yunxin.kit.corekit.route.XKitRouter;
import com.netease.yunxin.kit.corekit.startup.Initializer;
import com.netease.yunxin.kit.teamkit.ui.custom.TeamConfigManager;
import com.netease.yunxin.kit.teamkit.ui.utils.TeamIconUtils;
import com.netease.yunxin.kit.teamkit.ui.utils.TeamUtils;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
@@ -255,7 +259,21 @@ public class TeamUIService extends ChatService {
fieldMap.put(TeamFieldEnum.BeInviteMode, TeamBeInviteModeEnum.NoAuth); //被邀请人不需要验证
fieldMap.put(TeamFieldEnum.VerifyType, VerifyTypeEnum.Free);//
fieldMap.put(TeamFieldEnum.InviteMode, TeamInviteModeEnum.All); //每个人都可以邀请入群
// fieldMap.put(TeamFieldEnum.Extension, "1"); //控制是否展示行动码与链接
boolean isAllow = true;
if (customParam.containsKey("allowaddfriends")) {
isAllow = (boolean) customParam.get("allowaddfriends");
}
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put(TeamConfigManager.CREATE_TEAM_PARAMS_SHOWQRCODE, 1);
jsonObject.put(TeamConfigManager.CREATE_TEAM_PARAMS_ALLOWADDFRIENDS, isAllow ? 1 : 0);
String jsonstr = jsonObject.toString();
LogUtils.d("json==","jsonstr=="+jsonstr);
fieldMap.put(TeamFieldEnum.Extension, jsonObject.toString()); //控制是否展示行动码与链接 以及 是否允许添加好友
} catch (Exception e) {
fieldMap.put(TeamFieldEnum.Extension, "1"); //控制是否展示行动码与链接
}
if (customParam.get("autoinvited") != null) {
boolean verifyType = (boolean) customParam.get("autoinvited");
fieldMap.put(TeamFieldEnum.BeInviteMode, verifyType ? TeamBeInviteModeEnum.NoAuth : TeamBeInviteModeEnum.NeedAuth);

View File

@@ -5,6 +5,10 @@
package com.netease.yunxin.kit.teamkit.ui.custom;
public class TeamConfigManager {
/** 从其他页面返回群设置页面时,页面中的成员列表是否刷新,默认不刷新 */
/**
* 从其他页面返回群设置页面时,页面中的成员列表是否刷新,默认不刷新
*/
public static boolean REFRESH_MEMBER_DATA_REAL_TIME_FOR_BACK = false;
public static final String CREATE_TEAM_PARAMS_SHOWQRCODE = "showQrCode";
public static final String CREATE_TEAM_PARAMS_ALLOWADDFRIENDS = "allowAddFriends";
}