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