fix(emergency): 完善应急就医群聊功能—急救员邀请+图标显示+头像兜底

- TUICallingViewManager 启用 initInviteUserFunction,急救员通话中显示右上角 + 号邀请按钮
- InputActionSetting 新增 firstAid 字段,setter 同步写入 SP 供跨模块读取
- createEmergencySetting 支持 firstAid 参数,急救员进入群聊时传入 true
- TUIGroupChatFragment 右侧抽屉图标仅在 firstAid 为 true 时显示
- GlideEngine 新增 loadImageByDefault 兜底加载方法
- GroupMemberAdapter 头像加载使用兜底图标,修复空 URL 显示异常
- GroupMemberAdapter 修复 administrator 群组的成员过滤逻辑

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
zhanglei
2026-08-04 19:58:25 +08:00
co-authored by Claude Opus 4.7
parent f61d8c90c9
commit adfa40313a
8 changed files with 101 additions and 60 deletions
@@ -30,9 +30,11 @@ object IMInputActionSettingUtils {
/** /**
* 应急求助IM功能配置 * 应急求助IM功能配置
* @param firstAid 是否为急救员
*/ */
fun createEmergencySetting(): InputActionSetting { fun createEmergencySetting(firstAid: Boolean = false): InputActionSetting {
var inputActionSetting = InputActionSetting() var inputActionSetting = InputActionSetting()
inputActionSetting.packageName = BuildConfig.APPLICATION_ID
inputActionSetting.isDisableAudioCall = true inputActionSetting.isDisableAudioCall = true
inputActionSetting.isDisableVideoCall = false inputActionSetting.isDisableVideoCall = false
inputActionSetting.isDisableArchives = true inputActionSetting.isDisableArchives = true
@@ -41,7 +43,7 @@ object IMInputActionSettingUtils {
inputActionSetting.isDisableFinishName = true inputActionSetting.isDisableFinishName = true
inputActionSetting.isDisableEvaluate = true inputActionSetting.isDisableEvaluate = true
inputActionSetting.isDisableFinishSession = true inputActionSetting.isDisableFinishSession = true
inputActionSetting.packageName = BuildConfig.APPLICATION_ID inputActionSetting.isFirstAid = firstAid
InputActionSetting.setsInstance(inputActionSetting) InputActionSetting.setsInstance(inputActionSetting)
return inputActionSetting return inputActionSetting
} }
@@ -262,7 +262,7 @@ class WorkbenchFragment :
} else if (result.records.size == 1) { } else if (result.records.size == 1) {
mViewModel.getActualGroupMemberList(result.records[0].sessionId) { groupMemberBeans -> mViewModel.getActualGroupMemberList(result.records[0].sessionId) { groupMemberBeans ->
val setting = IMInputActionSettingUtils.createEmergencySetting() val setting = IMInputActionSettingUtils.createEmergencySetting(true)
requireContext().startGroupChat( requireContext().startGroupChat(
result.records[0].sessionId, result.records[0].sessionId,
getString(R.string.title_paramedic_group), getString(R.string.title_paramedic_group),
@@ -273,7 +273,7 @@ class WorkbenchFragment :
} else { } else {
showChatListDialog(result.records!!) { groupInfo -> showChatListDialog(result.records!!) { groupInfo ->
mViewModel.getActualGroupMemberList(groupInfo.sessionId) { groupMemberBeans -> mViewModel.getActualGroupMemberList(groupInfo.sessionId) { groupMemberBeans ->
val setting = IMInputActionSettingUtils.createEmergencySetting() val setting = IMInputActionSettingUtils.createEmergencySetting(true)
requireContext().startGroupChat( requireContext().startGroupChat(
groupInfo.sessionId, groupInfo.sessionId,
getString(R.string.title_paramedic_group), getString(R.string.title_paramedic_group),
@@ -16,6 +16,7 @@ import com.tencent.qcloud.tuicore.TUIConstants;
import com.tencent.qcloud.tuicore.TUICore; import com.tencent.qcloud.tuicore.TUICore;
import com.tencent.qcloud.tuicore.TUILogin; import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.ITUINotification; import com.tencent.qcloud.tuicore.interfaces.ITUINotification;
import com.tencent.qcloud.tuicore.util.SPUtils;
import com.tencent.qcloud.tuicore.interfaces.ITUIService; import com.tencent.qcloud.tuicore.interfaces.ITUIService;
import com.tencent.qcloud.tuicore.util.ToastUtil; import com.tencent.qcloud.tuicore.util.ToastUtil;
import com.tencent.qcloud.tuikit.TUICommonDefine; import com.tencent.qcloud.tuikit.TUICommonDefine;
@@ -728,53 +729,58 @@ public class TUICallingViewManager implements ITUINotification {
} }
private void initInviteUserFunction() { private void initInviteUserFunction() {
// ITUIService service = TUICore.getService(TUIConstants.TUIGroup.SERVICE_NAME); boolean firstAid = SPUtils.getInstance().getBoolean("key_first_aid", false);
// boolean enableInviteUser = (service != null); if (!firstAid) {
// return;
// if (enableInviteUser && mBaseCallView != null) { }
// Button inviteUserBtn = new Button(mContext);
// TUICallDefine.MediaType mediaType = TUICallingStatusManager.sharedInstance(mContext).getMediaType(); ITUIService service = TUICore.getService(TUIConstants.TUIGroup.SERVICE_NAME);
// int resId = TUICallDefine.MediaType.Video.equals(mediaType) boolean enableInviteUser = (service != null);
// ? R.drawable.tuicalling_ic_add_user_white : R.drawable.tuicalling_ic_add_user_black;
// inviteUserBtn.setBackgroundResource(resId); if (enableInviteUser && mBaseCallView != null) {
// inviteUserBtn.setOnClickListener(new View.OnClickListener() { Button inviteUserBtn = new Button(mContext);
// @Override TUICallDefine.MediaType mediaType = TUICallingStatusManager.sharedInstance(mContext).getMediaType();
// public void onClick(View v) { int resId = TUICallDefine.MediaType.Video.equals(mediaType)
// String groupId = TUICallingStatusManager.sharedInstance(mContext).getGroupId(); ? R.drawable.tuicalling_ic_add_user_white : R.drawable.tuicalling_ic_add_user_black;
// if (TextUtils.isEmpty(groupId)) { inviteUserBtn.setBackgroundResource(resId);
// ToastUtil.toastShortMessage(mContext.getString(R.string.tuicalling_groupid_is_empty)); inviteUserBtn.setOnClickListener(new View.OnClickListener() {
// return; @Override
// } public void onClick(View v) {
// String groupId = TUICallingStatusManager.sharedInstance(mContext).getGroupId();
// TUICallDefine.Status status = TUICallingStatusManager.sharedInstance(mContext).getCallStatus(); if (TextUtils.isEmpty(groupId)) {
// TUICallDefine.Role role = TUICallingStatusManager.sharedInstance(mContext).getCallRole(); ToastUtil.toastShortMessage(mContext.getString(R.string.tuicalling_groupid_is_empty));
// if (TUICallDefine.Role.Called.equals(role) && !TUICallDefine.Status.Accept.equals(status)) { return;
// ToastUtil.toastShortMessage(mContext.getString(R.string.tuicalling_status_is_not_accept)); }
// return;
// } TUICallDefine.Status status = TUICallingStatusManager.sharedInstance(mContext).getCallStatus();
// TUICallDefine.Role role = TUICallingStatusManager.sharedInstance(mContext).getCallRole();
// ArrayList<String> list = new ArrayList<>(); if (TUICallDefine.Role.Called.equals(role) && !TUICallDefine.Status.Accept.equals(status)) {
// list.add(mInviter.userId); ToastUtil.toastShortMessage(mContext.getString(R.string.tuicalling_status_is_not_accept));
// for (CallingUserModel model : mInviteeList) { return;
// if (model != null && !TextUtils.isEmpty(model.userId) && !list.contains(model.userId)) { }
// list.add(model.userId);
// } ArrayList<String> list = new ArrayList<>();
// } list.add(mInviter.userId);
// if (!list.contains(TUILogin.getLoginUser())) { for (CallingUserModel model : mInviteeList) {
// list.add(TUILogin.getLoginUser()); if (model != null && !TextUtils.isEmpty(model.userId) && !list.contains(model.userId)) {
// } list.add(model.userId);
// }
// TUILog.i(TAG, "initInviteUserFunction, groupId: " + groupId + " ,list: " + list); }
// if (!list.contains(TUILogin.getLoginUser())) {
// Bundle bundle = new Bundle(); list.add(TUILogin.getLoginUser());
// bundle.putString(TUIConstants.TUIGroup.GROUP_ID, groupId); }
// bundle.putString(TUIConstants.TUIGroup.USER_DATA, Constants.TUICALLKIT);
// bundle.putStringArrayList(TUIConstants.TUIGroup.SELECTED_LIST, list); TUILog.i(TAG, "initInviteUserFunction, groupId: " + groupId + " ,list: " + list);
// TUICore.startActivity("GroupMemberActivity", bundle);
// } Bundle bundle = new Bundle();
// }); bundle.putString(TUIConstants.TUIGroup.GROUP_ID, groupId);
// mBaseCallView.enableAddUserView(inviteUserBtn); bundle.putString(TUIConstants.TUIGroup.USER_DATA, Constants.TUICALLKIT);
// } bundle.putStringArrayList(TUIConstants.TUIGroup.SELECTED_LIST, list);
TUICore.startActivity("GroupMemberActivity", bundle);
}
});
mBaseCallView.enableAddUserView(inviteUserBtn);
}
} }
private void inviteUsersToGroupCall(List<String> userIdList) { private void inviteUsersToGroupCall(List<String> userIdList) {
@@ -159,14 +159,16 @@ public class TUIGroupChatFragment extends TUIBaseChatFragment {
} }
}); });
titleBar.getRightGroup().setVisibility(View.VISIBLE); if (inputActionSetting.isFirstAid()) {
titleBar.getRightTitle().setVisibility(View.GONE); titleBar.getRightGroup().setVisibility(View.VISIBLE);
titleBar.getRightIcon().setVisibility(View.VISIBLE); titleBar.getRightTitle().setVisibility(View.GONE);
titleBar.getRightIcon().setImageResource(R.drawable.chat_title_bar_more_menu_lively); titleBar.getRightIcon().setVisibility(View.VISIBLE);
titleBar.getRightIcon().setImageResource(R.drawable.chat_title_bar_more_menu_lively);
// 应用缓存的 OnGroupTipsListener,解决 Activity 中提前设置 listener 的时序问题 // 应用缓存的 OnGroupTipsListener,解决 Activity 中提前设置 listener 的时序问题
if (cachedGroupTipsListener != null && chatView != null) { if (cachedGroupTipsListener != null && chatView != null) {
chatView.setOnGroupTipsListener(cachedGroupTipsListener); chatView.setOnGroupTipsListener(cachedGroupTipsListener);
}
} }
} }
@@ -2,6 +2,8 @@ package com.tencent.qcloud.tuikit.tuichat.classicui.setting;
import java.io.Serializable; import java.io.Serializable;
import com.tencent.qcloud.tuicore.util.SPUtils;
public class InputActionSetting implements Serializable { public class InputActionSetting implements Serializable {
private static InputActionSetting sInstance; private static InputActionSetting sInstance;
@@ -31,6 +33,7 @@ public class InputActionSetting implements Serializable {
public String packageName=""; public String packageName="";
public String CurrentResourceHost=""; public String CurrentResourceHost="";
public boolean disableEvaluate = false; public boolean disableEvaluate = false;
public boolean firstAid = false;
public String getCurrentResourceHost() { public String getCurrentResourceHost() {
return CurrentResourceHost == null ? "" : CurrentResourceHost; return CurrentResourceHost == null ? "" : CurrentResourceHost;
@@ -128,6 +131,16 @@ public class InputActionSetting implements Serializable {
this.disableFinishName = disableFinishName; this.disableFinishName = disableFinishName;
} }
public boolean isFirstAid() {
return firstAid;
}
public void setFirstAid(boolean firstAid) {
this.firstAid = firstAid;
// 同步写入 SP,供 tuicallkit 跨模块读取(控制右上角 + 号是否显示)
SPUtils.getInstance().put("key_first_aid", firstAid);
}
public InputActionSetting copy(){ public InputActionSetting copy(){
InputActionSetting inputActionSetting = new InputActionSetting(); InputActionSetting inputActionSetting = new InputActionSetting();
inputActionSetting.setDisableArchives(disableArchives); inputActionSetting.setDisableArchives(disableArchives);
@@ -138,6 +151,7 @@ public class InputActionSetting implements Serializable {
inputActionSetting.setDisableMedicalExaminationReport(disableMedicalExaminationReport); inputActionSetting.setDisableMedicalExaminationReport(disableMedicalExaminationReport);
inputActionSetting.setDisableFinishSession(disableFinishSession); inputActionSetting.setDisableFinishSession(disableFinishSession);
inputActionSetting.setDisableFinishName(disableFinishName); inputActionSetting.setDisableFinishName(disableFinishName);
inputActionSetting.setFirstAid(firstAid);
return inputActionSetting; return inputActionSetting;
} }
} }
@@ -3,6 +3,7 @@ package com.tencent.qcloud.tuicore.component.imageEngine.impl;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
@@ -54,6 +55,17 @@ public class GlideEngine {
.into(imageView); .into(imageView);
} }
public static void loadImageByDefault(ImageView imageView, String filePath) {
if (TextUtils.isEmpty(filePath)) {
imageView.setImageResource(R.drawable.core_default_user_icon);
return;
}
Glide.with(TUILogin.getAppContext())
.load(filePath)
.error(R.drawable.core_default_user_icon)
.apply(new RequestOptions())
.into(imageView);
}
public static void clear(ImageView imageView) { public static void clear(ImageView imageView) {
Glide.with(TUILogin.getAppContext()).clear(imageView); Glide.with(TUILogin.getAppContext()).clear(imageView);
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -86,7 +86,12 @@ public class GroupMemberAdapter extends RecyclerView.Adapter<GroupMemberAdapter.
@Override @Override
public void onBindViewHolder(@NonNull GroupMemberViewHodler holder, int position) { public void onBindViewHolder(@NonNull GroupMemberViewHodler holder, int position) {
final GroupMemberInfo info = mGroupMembers.get(position); final GroupMemberInfo info = mGroupMembers.get(position);
GlideEngine.loadImage(holder.memberIcon, info.getIconUrl()); if (TextUtils.isEmpty(info.getIconUrl())) {
holder.memberIcon.setImageResource(R.drawable.core_default_user_icon);
} else {
GlideEngine.loadImageByDefault(holder.memberIcon, info.getIconUrl());
}
if (!TextUtils.isEmpty(info.getNameCard())) { if (!TextUtils.isEmpty(info.getNameCard())) {
holder.memberName.setText(info.getNameCard()); holder.memberName.setText(info.getNameCard());
} else { } else {
@@ -208,7 +213,7 @@ public class GroupMemberAdapter extends RecyclerView.Adapter<GroupMemberAdapter.
mGroupMembers.addAll(groupInfo.getMemberDetails()); mGroupMembers.addAll(groupInfo.getMemberDetails());
} else { } else {
for (GroupMemberInfo groupMemberInfo : groupInfo.getMemberDetails()) { for (GroupMemberInfo groupMemberInfo : groupInfo.getMemberDetails()) {
if (excludeList.contains(groupMemberInfo.getAccount())) { if (excludeList.contains(groupMemberInfo.getAccount())&&!groupInfo.getId().equals("administrator")) {
continue; continue;
} }
mGroupMembers.add(groupMemberInfo); mGroupMembers.add(groupMemberInfo);