# UserInfoActivity 个人信息页面逻辑分析 ## 📋 页面概述 **文件位置**: `uikit/src/main/java/cn/wildfire/chat/kit/user/UserInfoActivity.java` **布局文件**: `uikit/src/main/res/layout/fragment_container_activity.xml` **页面类型**: Activity(继承自 WfcBaseActivity) **主要功能**: 显示和操作其他用户或自己的个人信息 --- ## 🎯 核心功能模块 ### 1. 页面初始化 (`afterViews()`) #### 1.1 数据获取 ```java Intent intent = getIntent(); userInfo = intent.getParcelableExtra("userInfo"); // 用户信息对象 String groupId = intent.getStringExtra("groupId"); // 群组ID(可选) groupMemberSource = intent.getParcelableExtra("groupMemberSource"); // 群成员来源(可选) friendSource = intent.getParcelableExtra("friendSource"); // 好友来源(可选) ``` #### 1.2 Fragment加载 ```java // 如果userInfo为空,直接关闭页面 if (userInfo == null) { finish(); } else { // 使用UserInfoFragment显示用户信息详情 getSupportFragmentManager().beginTransaction() .replace(R.id.containerFrameLayout, UserInfoFragment.newInstance(userInfo, groupId, groupMemberSource, friendSource)) .commit(); } ``` #### 1.3 状态栏设置 ```java setTitleBackgroundResource(R.color.white, false); // 白色状态栏,深色图标 ``` --- ### 2. 页面显示逻辑(根据来源类型) #### 2.1 来源类型判断 (`userInfo.sourceType`) **情况1:个人信息页面 (`sourceType == 1`)** ```java if (userInfo.sourceType == 1) { setToolBarTitle("个人信息"); // 设置标题为"个人信息" showUserMoreInfo(false); // 隐藏"更多"按钮 } ``` - **场景**:用户查看自己的个人信息 - **特点**:不显示"更多"操作按钮,标题为"个人信息" **情况2:其他用户页面 (`sourceType != 1`)** ```java else { // 显示"更多"按钮(右上角) setMenuVisible(R.mipmap.icon_user_info_more, new View.OnClickListener() { @Override public void onClick(View view) { // 显示操作对话框 showMainUserInfoDialog(); } }); // 根据好友关系显示/隐藏更多信息 ContactViewModel contactViewModel = ViewModelProviders.of(this).get(ContactViewModel.class); if (contactViewModel.isFriend(userInfo.uid)) { showUserMoreInfo(true); // 是好友,显示更多信息 } else { showUserMoreInfo(false); // 不是好友,隐藏更多信息 } } ``` - **场景**:查看其他用户信息 - **特点**:显示"更多"按钮,根据好友关系显示/隐藏更多信息 --- ### 3. 操作对话框 (`MainUserInfoDialog`) #### 3.1 对话框显示 点击右上角"更多"按钮时,显示 `MainUserInfoDialog` 对话框,包含以下操作选项: | 操作选项 | ID | 功能说明 | |---------|-----|---------| | 删除好友 | `tv_dia_delete` | 删除好友关系 | | 添加好友 | `tv_dia_addFriend` | 发送好友申请 | | 加入黑名单 | `tv_dia_addBlacklist` | 将用户加入黑名单 | | 移除黑名单 | `tv_dia_removeBlacklist` | 将用户从黑名单移除 | | 设置备注 | `tv_dia_setAlias` | 设置好友备注名 | | 修改名字 | `tv_dia_setName` | 修改用户名字 | | 加入收藏 | `tv_dia_setFav` | 将用户加入收藏 | | 移除收藏 | `tv_dia_removeFav` | 将用户从收藏移除 | | 取消 | `tv_dia_cancel` | 关闭对话框 | #### 3.2 选项显示逻辑 (`initDialogView()`) **判断规则1:是否为自己** ```java if (ChatManager.Instance().getUserId().equals(userInfo.uid)) { // 是自己:隐藏所有操作选项(除了取消) itemAddBlacklist.setVisibility(View.GONE); itemAddFriend.setVisibility(View.GONE); itemDelete.setVisibility(View.GONE); itemRemoveBlacklist.setVisibility(View.GONE); itemSetAlias.setVisibility(View.GONE); itemSetName.setVisibility(View.GONE); itemSetFav.setVisibility(View.GONE); itemRemoveFav.setVisibility(View.GONE); } ``` **判断规则2:是否为好友** ```java if (contactViewModel.isFriend(userInfo.uid)) { // 是好友:显示"删除好友",隐藏"添加好友"和"设置备注" itemAddFriend.setVisibility(View.GONE); // 隐藏:已经是好友 itemDelete.setVisibility(View.VISIBLE); // 显示:可以删除好友 itemSetAlias.setVisibility(View.GONE); // 隐藏:设置备注(注释掉,可能是Bug) } else { // 不是好友:显示"添加好友",隐藏"删除好友" itemAddFriend.setVisibility(View.VISIBLE); // 显示:可以添加好友 itemDelete.setVisibility(View.GONE); // 隐藏:还不是好友 } ``` **判断规则3:是否在黑名单** ```java if (contactViewModel.isBlacklisted(userInfo.uid)) { // 在黑名单:显示"移除黑名单",隐藏"加入黑名单" itemAddBlacklist.setVisibility(View.GONE); itemRemoveBlacklist.setVisibility(View.VISIBLE); } else { // 不在黑名单:显示"加入黑名单",隐藏"移除黑名单" itemAddBlacklist.setVisibility(View.VISIBLE); itemRemoveBlacklist.setVisibility(View.GONE); } ``` **判断规则4:是否已收藏** ```java if (contactViewModel.isFav(userInfo.uid)) { // 已收藏:显示"移除收藏",隐藏"加入收藏" itemSetFav.setVisibility(View.GONE); itemRemoveFav.setVisibility(View.VISIBLE); } else { // 未收藏:显示"加入收藏",隐藏"移除收藏" itemSetFav.setVisibility(View.VISIBLE); itemRemoveFav.setVisibility(View.GONE); } ``` **判断规则5:用户类型** ```java if (userInfo.type != 0) { // 非普通用户(可能是系统用户、机器人等):隐藏黑名单相关选项 itemRemoveBlacklist.setVisibility(View.GONE); itemAddBlacklist.setVisibility(View.GONE); } ``` --- ### 4. 操作功能实现 (`onClick()`) #### 4.1 删除好友 (`tv_dia_delete`) ```java // 步骤1:调用服务器接口删除关注关系 AppService.Instance().deleteFollow(userInfo.uid, new SimpleCallback() { @Override public void onUiSuccess(Object o) { // 步骤2:本地删除好友关系 contactViewModel.deleteFriend(userInfo.uid).observe(...) { if (booleanOperateResult.isSuccess()) { // 步骤3:跳转到主页面 Intent intent = new Intent(getPackageName() + ".main"); startActivity(intent); // 步骤4:清除会话和消息 Conversation conversation = new Conversation( Conversation.ConversationType.Single, userInfo.uid, 0); ChatManager.Instance().clearUnreadStatus(conversation); ChatManager.Instance().removeConversation(conversation, true); // 步骤5:删除好友 ChatManager.Instance().deleteFriend(userInfo.uid, new GeneralCallback() { @Override public void onSuccess() { LogUtil.d(LogUtil.TAG, "删除好友成功"); } @Override public void onFail(int errorCode) { LogUtil.e(LogUtil.TAG, "删除好友失败,错误码: " + errorCode); } }); } }; } }); ``` **操作流程**: 1. 调用服务器接口 `deleteFollow()` 删除关注关系 2. 本地删除好友关系(通过 `ContactViewModel`) 3. 跳转到主页面 4. 清除会话未读状态 5. 移除会话和消息 6. 删除好友(通过 `ChatManager`) #### 4.2 添加好友 (`tv_dia_addFriend`) ```java Intent intent = new Intent(this, InviteFriendActivity.class); intent.putExtra("userInfo", userInfo); startActivity(intent); ``` - 跳转到 `InviteFriendActivity`(好友申请页面) #### 4.3 加入/移除黑名单 ```java // 加入黑名单 contactViewModel.setBlacklist(userInfo.uid, true).observe(...); // 移除黑名单 contactViewModel.setBlacklist(userInfo.uid, false).observe(...); ``` #### 4.4 设置备注 (`tv_dia_setAlias`) ```java Intent intent = new Intent(this, SetAliasActivity.class); intent.putExtra("userId", userInfo.uid); startActivity(intent); ``` - 跳转到 `SetAliasActivity`(设置备注页面) #### 4.5 修改名字 (`tv_dia_setName`) ```java Intent intent = new Intent(this, SetNameActivity.class); intent.putExtra("userInfo", userInfo); startActivity(intent); ``` - 跳转到 `SetNameActivity`(修改名字页面) #### 4.6 加入/移除收藏 ```java // 加入收藏 contactViewModel.setFav(userInfo.uid, true).observe(...); // 移除收藏 contactViewModel.setFav(userInfo.uid, false).observe(...); ``` --- ## 🔄 完整业务流程 ### 场景1:查看自己的信息 ``` 打开UserInfoActivity(sourceType == 1) ↓ 设置标题为"个人信息" ↓ 隐藏"更多"按钮 ↓ 显示UserInfoFragment(自己的信息) ``` ### 场景2:查看其他用户信息(不是好友) ``` 打开UserInfoActivity(sourceType != 1) ↓ 显示"更多"按钮 ↓ 隐藏更多信息(showUserMoreInfo(false)) ↓ 点击"更多"按钮 ↓ 显示MainUserInfoDialog ↓ 显示选项: - 添加好友 ✅ - 加入黑名单 ✅(如果不在黑名单) - 加入收藏 ✅(如果未收藏) ``` ### 场景3:查看好友信息 ``` 打开UserInfoActivity(sourceType != 1 && 是好友) ↓ 显示"更多"按钮 ↓ 显示更多信息(showUserMoreInfo(true)) ↓ 点击"更多"按钮 ↓ 显示MainUserInfoDialog ↓ 显示选项: - 删除好友 ✅ - 移除黑名单 ✅(如果在黑名单) - 移除收藏 ✅(如果已收藏) - 设置备注 ✅(已注释,可能是Bug) - 修改名字 ✅ ``` --- ## 📊 数据结构 ### Intent传递参数 ```java Intent { "userInfo": UserInfo, // 必填,用户信息对象 "groupId": String, // 可选,群组ID "groupMemberSource": GroupMemberSource, // 可选,群成员来源 "friendSource": FriendSource // 可选,好友来源 } ``` ### UserInfo关键字段 ```java UserInfo { String uid; // 用户ID int sourceType; // 来源类型(1=个人信息,其他=其他用户) int type; // 用户类型(0=普通用户) String name; // 用户名字 String displayName; // 显示名称 // ... 其他字段 } ``` --- ## 🛠️ 技术要点 ### 1. Fragment容器模式 - 使用 `fragment_container_activity.xml` 作为容器 - 通过 `UserInfoFragment` 显示具体的用户信息内容 - 便于代码复用和维护 ### 2. ViewModel观察者模式 - 使用 `ContactViewModel` 管理好友关系 - 使用 `LiveData` 观察操作结果 - 自动更新UI状态 ### 3. 对话框动态显示 - 根据用户关系和状态动态控制选项显示/隐藏 - 使用 `MainUserInfoDialog` 统一管理操作选项 ### 4. 操作流程 - **删除好友**:服务器接口 → 本地删除 → 清除会话 → 跳转主页 - **其他操作**:直接调用 `ContactViewModel` 方法,使用 `LiveData` 观察结果 --- ## ⚠️ 注意事项 1. **来源类型判断**: - `sourceType == 1`:查看自己的信息,不显示操作选项 - `sourceType != 1`:查看其他用户,根据关系显示不同选项 2. **用户类型判断**: - `userInfo.type == 0`:普通用户,显示所有选项 - `userInfo.type != 0`:系统用户/机器人等,隐藏黑名单选项 3. **好友关系判断**: - 是好友:显示"删除好友",隐藏"添加好友" - 不是好友:显示"添加好友",隐藏"删除好友" 4. **黑名单状态**: - 在黑名单:显示"移除黑名单",隐藏"加入黑名单" - 不在黑名单:显示"加入黑名单",隐藏"移除黑名单" 5. **收藏状态**: - 已收藏:显示"移除收藏",隐藏"加入收藏" - 未收藏:显示"加入收藏",隐藏"移除收藏" 6. **删除好友流程**: - 需要同时调用服务器接口和本地删除 - 需要清除会话和消息 - 删除成功后跳转到主页面 --- ## 🔍 相关文件 - **Fragment**:`UserInfoFragment` - 显示用户信息详情 - **对话框**:`MainUserInfoDialog` - 操作选项对话框 - **ViewModel**:`ContactViewModel` - 好友关系管理 - **相关页面**: - `InviteFriendActivity` - 添加好友页面 - `SetAliasActivity` - 设置备注页面 - `SetNameActivity` - 修改名字页面 --- ## 📝 代码关键位置 ### 页面初始化(第45-89行) ```java @Override protected void afterViews() { // 获取Intent参数 // 加载UserInfoFragment // 根据来源类型设置UI } ``` ### 对话框初始化(第91-173行) ```java private void initDialogView(View viewRoot) { // 根据用户关系和状态动态控制选项显示/隐藏 } ``` ### 操作处理(第175-330行) ```java @Override public void onClick(View view) { // 处理各种操作:删除好友、添加好友、黑名单、备注、名字、收藏等 } ``` --- ## 🐛 潜在问题 1. **设置备注功能**(第126行): ```java itemSetAlias.setEnabled(false); itemSetAlias.setVisibility(View.GONE); ``` 注释显示"设置备注"被禁用了,但在 `onClick()` 中仍有处理逻辑,可能是Bug或未完成的功能。 2. **删除好友流程**: 删除好友时需要调用多个接口和清除多个数据,流程较复杂,需要确保所有步骤都成功执行。