Files
zhini_im/UserInfoActivity个人信息页面逻辑分析.txt

445 lines
13 KiB
Plaintext
Raw Normal View History

# 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. **删除好友流程**
删除好友时需要调用多个接口和清除多个数据,流程较复杂,需要确保所有步骤都成功执行。