Files
zhini_im/UserInfoActivity个人信息页面逻辑分析.txt
rw0067680 c01808ac21 first commit
Change-Id: Ib7c2ab10a2562044fcaf9879388a6cbc1db6ac61
2025-12-23 10:00:49 +08:00

445 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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查看自己的信息
```
打开UserInfoActivitysourceType == 1
设置标题为"个人信息"
隐藏"更多"按钮
显示UserInfoFragment自己的信息
```
### 场景2查看其他用户信息不是好友
```
打开UserInfoActivitysourceType != 1
显示"更多"按钮
隐藏更多信息showUserMoreInfo(false)
点击"更多"按钮
显示MainUserInfoDialog
显示选项:
- 添加好友 ✅
- 加入黑名单 ✅(如果不在黑名单)
- 加入收藏 ✅(如果未收藏)
```
### 场景3查看好友信息
```
打开UserInfoActivitysourceType != 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. **删除好友流程**
删除好友时需要调用多个接口和清除多个数据,流程较复杂,需要确保所有步骤都成功执行。