修复 Turbo Mode 相关逻辑,确保使用正确的公开接口获取开关状态,优化代码结构和可读性。更新 RoomHeaderView 中的礼物特效显示逻辑,添加 Turbo Mode 状态变化的通知处理,提升用户体验。

This commit is contained in:
edwinQQQ
2025-09-17 18:44:26 +08:00
parent 67f9fb5113
commit ab5b704866
6 changed files with 145 additions and 116 deletions

View File

@@ -597,11 +597,11 @@ BannerSchedulerDelegate
effectPath:(NSString *)effectPath
isCPEnter:(BOOL)isCP {
//
// 🔧 使
NSString *roomIdForTurbo = self.currentRoomId ?: @([self.hostDelegate getRoomInfo].roomId).stringValue;
BOOL giftEffectsEnabled = [[TurboModeStateManager sharedManager] isGiftEffectsEnabledForRoom:roomIdForTurbo];
if (!giftEffectsEnabled) {
NSLog(@"🎮 Turbo Mode进房特效已关闭跳过进房动画");
NSLog(@"🎮 Turbo Mode进房特效已关闭跳过进房动画 - 房间ID: %@", roomIdForTurbo);
return;
}
@@ -729,34 +729,34 @@ BannerSchedulerDelegate
return;
}
// 🔧 inserBannerModelToQueue
// 🔧 inserBannerModelToQueue 使
NSString *roomIdForTurbo = self.currentRoomId ?: @([self.hostDelegate getRoomInfo].roomId).stringValue;
if (obj.second == Custom_Message_Sub_General_Floating_Screen_One_Room ||
obj.second == Custom_Message_Sub_General_Floating_Screen_All_Room) {
// banner
NSString *roomIdForTurbo = self.currentRoomId ?: @([self.hostDelegate getRoomInfo].roomId).stringValue;
BOOL allowGameScreen = [[TurboModeStateManager sharedManager] isGlobalGameScreenEnabledForRoom:roomIdForTurbo];
if (!allowGameScreen) {
NSLog(@"🎮 Turbo Mode全局游戏屏幕已关闭跳过游戏banner");
NSLog(@"🎮 Turbo Mode全局游戏屏幕已关闭跳过游戏banner - 房间ID: %@", roomIdForTurbo);
return;
}
} else if (obj.second == Custom_Message_Sub_Super_Gift_Banner ||
obj.second == Custom_Message_Sub_Gift_ChannelNotify ||
obj.second == Custom_Message_Sub_LuckyPackage) {
// banner
NSString *roomIdForTurbo = self.currentRoomId ?: @([self.hostDelegate getRoomInfo].roomId).stringValue;
BOOL allowGiftScreen = [[TurboModeStateManager sharedManager] isGlobalGiftScreenEnabledForRoom:roomIdForTurbo];
if (!allowGiftScreen) {
NSLog(@"🎮 Turbo Mode全局礼物屏幕已关闭跳过礼物banner");
NSLog(@"🎮 Turbo Mode全局礼物屏幕已关闭跳过礼物banner - 房间ID: %@", roomIdForTurbo);
return;
}
} else if (obj.second == Custom_Message_Sub_CP_Gift ||
obj.second == Custom_Message_Sub_CP_Upgrade ||
obj.second == Custom_Message_Sub_CP_Binding) {
// CPbanner -
// 🔧 CPbanner - 使
NSString *roomIdForTurbo = self.currentRoomId ?: @([self.hostDelegate getRoomInfo].roomId).stringValue;
BOOL giftEffectsEnabled = [[TurboModeStateManager sharedManager] isGiftEffectsEnabledForRoom:roomIdForTurbo];
if (!giftEffectsEnabled) {
NSLog(@"🎮 Turbo Mode礼物特效已关闭跳过CP banner");
NSLog(@"🎮 Turbo Mode礼物特效已关闭跳过CP banner - 房间ID: %@", roomIdForTurbo);
return;
}
}
@@ -1362,12 +1362,12 @@ BannerSchedulerDelegate
#pragma mark - Method: Send Gifts
- (void)receiveGiftHandleSendGiftAnimationWith:(GiftReceiveInfoModel *)receiveInfo attachment:(AttachmentModel *)attachment {
//
// 🔧 使
{
NSString *roomIdForTurbo = self.currentRoomId ?: @([self.hostDelegate getRoomInfo].roomId).stringValue;
BOOL giftEffectsEnabled = [[TurboModeStateManager sharedManager] isGiftEffectsEnabledForRoom:roomIdForTurbo];
if (!giftEffectsEnabled) {
NSLog(@"🎮 RoomAnimationView 礼物特效已关闭,跳过动画");
NSLog(@"🎮 RoomAnimationView 礼物特效已关闭,跳过动画 - 房间ID: %@", roomIdForTurbo);
return;
}
}

View File

@@ -92,27 +92,48 @@
NSLog(@"🎮 TurboModeStateManager: 房间 %@ 礼物特效开关更新为 %@", roomId, enabled ? @"开启" : @"关闭");
}
// 🔧
// 🔧 turbo mode
- (BOOL)isGiftEffectsEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
// turbo modeCP
if ([self isTurboModeEnabled]) {
return NO;
}
//
return [self.roomSwitchStates[roomId][@"giftEffects"] boolValue];
}
// 🔧
// 🔧 turbo mode
- (BOOL)isGlobalGiftScreenEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
// turbo modeCP
if ([self isTurboModeEnabled]) {
return NO;
}
//
return [self.roomSwitchStates[roomId][@"globalGiftScreen"] boolValue];
}
// 🔧
// 🔧 turbo mode
- (BOOL)isGlobalGameScreenEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
// turbo modeCP
if ([self isTurboModeEnabled]) {
return NO;
}
//
return [self.roomSwitchStates[roomId][@"globalGameScreen"] boolValue];
}

View File

@@ -159,14 +159,13 @@
}
- (void)setupSwitchStates {
// 🔧 使roomInfo.roomIdTurboModeStateManager
NSString *roomId = @(self.roomInfo.roomId).stringValue;
self.roomId = roomId;
// 🔧
// RoomAnimationView
TurboModeStateManager *manager = [TurboModeStateManager sharedManager];
// updateGiftEffectsForRoom
// 🔧 使
BOOL giftEffectsEnabled = [manager isGiftEffectsEnabledForRoom:roomId];
BOOL globalGiftScreenEnabled = [manager isGlobalGiftScreenEnabledForRoom:roomId];
BOOL globalGameScreenEnabled = [manager isGlobalGameScreenEnabledForRoom:roomId];
@@ -176,11 +175,12 @@
self.globalGiftScreenSwitch.on = globalGiftScreenEnabled;
self.globalGameScreenSwitch.on = globalGameScreenEnabled;
NSLog(@"🎮 Turbo Mode开关初始化完成 - 房间ID: %@, 礼物特效: %@, 全局礼物屏幕: %@, 全局游戏屏幕: %@",
NSLog(@"🎮 Turbo Mode开关初始化完成 - 房间ID: %@, 全局TurboMode: %@, 礼物特效: %@, 全局礼物屏幕: %@, 全局游戏屏幕: %@",
roomId,
giftEffectsEnabled ? @"开启" : @"关闭",
globalGiftScreenEnabled ? @"开启" : @"关闭",
globalGameScreenEnabled ? @"开启" : @"关闭");
[manager isTurboModeEnabled] ? @"开启" : @"关闭",
self.giftEffectsSwitch.on ? @"开启" : @"关闭",
self.globalGiftScreenSwitch.on ? @"开启" : @"关闭",
self.globalGameScreenSwitch.on ? @"开启" : @"关闭");
}
- (void)switchValueChanged:(UISwitch *)sender {
@@ -237,8 +237,9 @@
- (void)notifyParentUpdateTurboModeButton {
// 🔧 使 TurboModeStateManager
// 🔧 使
TurboModeStateManager *manager = [TurboModeStateManager sharedManager];
BOOL allSwitchesOn = [manager isGiftEffectsEnabledForRoom:self.roomId] &&
[manager isGlobalGiftScreenEnabledForRoom:self.roomId] &&
[manager isGlobalGameScreenEnabledForRoom:self.roomId];
@@ -353,34 +354,27 @@
- (void)handleTurboModeStateChanged:(NSNotification *)notification {
BOOL turboModeEnabled = [notification.userInfo[@"enabled"] boolValue];
// 🔧 3TurboModeStateManagerXPEffectPanelViewController
TurboModeStateManager *manager = [TurboModeStateManager sharedManager];
NSLog(@"🎮 XPEffectPanelViewController: 收到 Turbo Mode 状态变化通知 - 状态: %@", turboModeEnabled ? @"开启" : @"关闭");
if (turboModeEnabled) {
// Turbo Mode
[manager forceCloseAllSwitches:self.roomId];
[self updateSwitchesUIForTurboMode:YES];
NSLog(@"🎮 Turbo Mode 已开启,所有开关已强制关闭");
} else {
// Turbo Mode
[manager forceOpenAllSwitches:self.roomId];
[self updateSwitchesUIForTurboMode:NO];
NSLog(@"🎮 Turbo Mode 已关闭,所有开关已强制打开");
}
// 🔧 forceCloseAllSwitches/forceOpenAllSwitches
// TurboModeStateManager setTurboModeEnabled
// UI
[self updateSwitchesUIForTurboMode:turboModeEnabled];
}
- (void)updateSwitchesUIForTurboMode:(BOOL)turboModeEnabled {
if (turboModeEnabled) {
// 🔧 Turbo Mode
// UIforceCloseAllSwitches
self.giftEffectsSwitch.on = NO;
self.globalGiftScreenSwitch.on = NO;
self.globalGameScreenSwitch.on = NO;
} else {
// 🔧 Turbo Mode
// forceOpenAllSwitches handleXxxChanged UI
NSLog(@"🎮 Turbo Mode 已关闭等待开关状态变化通知更新UI");
}
TurboModeStateManager *manager = [TurboModeStateManager sharedManager];
// 🔧 使
self.giftEffectsSwitch.on = [manager isGiftEffectsEnabledForRoom:self.roomId];
self.globalGiftScreenSwitch.on = [manager isGlobalGiftScreenEnabledForRoom:self.roomId];
self.globalGameScreenSwitch.on = [manager isGlobalGameScreenEnabledForRoom:self.roomId];
NSLog(@"🎮 XPEffectPanelViewController: UI开关已更新 - 全局TurboMode: %@, 礼物特效: %@, 全局礼物屏幕: %@, 全局游戏屏幕: %@",
turboModeEnabled ? @"开启" : @"关闭",
self.giftEffectsSwitch.on ? @"开启" : @"关闭",
self.globalGiftScreenSwitch.on ? @"开启" : @"关闭",
self.globalGameScreenSwitch.on ? @"开启" : @"关闭");
}
- (void)handleGiftEffectsChanged:(NSNotification *)notification {

View File

@@ -133,7 +133,7 @@
- (void)setupContentLabel {
self.contentLabel = [[UILabel alloc] init];
self.contentLabel.text = NSLocalizedString(@"20.20.62_text_15.1", @"Turbo mode tips content 1");
self.contentLabel.text = YMLocalizedString(@"20.20.62_text_15.1");
self.contentLabel.font = [UIFont systemFontOfSize:16.0];
self.contentLabel.textColor = [UIColor darkGrayColor];
self.contentLabel.numberOfLines = 0;
@@ -150,7 +150,7 @@
- (void)setupContentLabel2 {
self.contentLabel2 = [[UILabel alloc] init];
self.contentLabel2.text = NSLocalizedString(@"20.20.62_text_15.2", @"Turbo mode tips content 2");
self.contentLabel2.text = YMLocalizedString(@"20.20.62_text_15.2");
self.contentLabel2.font = [UIFont systemFontOfSize:16.0];
self.contentLabel2.textColor = [UIColor darkGrayColor];
self.contentLabel2.numberOfLines = 0;

View File

@@ -40,6 +40,8 @@
#import "ShareHelder.h"
#import "XPRoomPresenter.h"
#import "TurboModeStateManager.h"
#import "XPTurboModeConstants.h"
@interface RoomHeaderView ()<XPRoomRecommendViewDelegate>
@@ -53,7 +55,7 @@
@property (nonatomic,strong) MarqueeLabel *titleLabel;
@property(nonatomic, strong) NetImageView *levelImageView;
///
@property (nonatomic,strong) UIImageView *giftEffectImageView;
@property (nonatomic,strong) UIImageView *noGiftEffectImageView;
///
@property (nonatomic,strong) UIImageView *lockRoomImageView;
///
@@ -86,6 +88,7 @@
_hostDelegate = delegate;
[self initSubViews];
[self initSubViewConstraints];
[self setupTurboModeNotifications];
}
return self;
}
@@ -183,7 +186,7 @@
[self.onlineStackView addArrangedSubview:self.idLabel];
[self.titleStackView addArrangedSubview:self.titleLabel];
[self.titleStackView addArrangedSubview:self.giftEffectImageView];
[self.titleStackView addArrangedSubview:self.noGiftEffectImageView];
[self.titleStackView addArrangedSubview:self.lockRoomImageView];
[self.titleStackView addArrangedSubview:self.levelImageView];
}
@@ -236,7 +239,7 @@
make.height.mas_equalTo(7);
}];
[self.giftEffectImageView mas_makeConstraints:^(MASConstraintMaker *make) {
[self.noGiftEffectImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(20,20));
}];
@@ -274,7 +277,7 @@
self.idLabel.text = [NSString stringWithFormat:@"ID%ld",(long)roomInfo.erbanNo];
self.avatarView.imageUrl = roomInfo.avatar;
self.titleLabel.text = roomInfo.title;
self.giftEffectImageView.hidden = roomInfo.hasAnimationEffect;
[self updateGiftEffectImageViewVisibility];
if (roomInfo.uid == [AccountInfoStorage instance].getUid.integerValue) {
self.collectButton.hidden = YES;
} else {
@@ -444,14 +447,14 @@
return _titleLabel;
}
- (UIImageView *)giftEffectImageView {
if (!_giftEffectImageView) {
_giftEffectImageView = [[UIImageView alloc] init];
_giftEffectImageView.userInteractionEnabled = YES;
_giftEffectImageView.image = [UIImage imageNamed:@"room_info_gift_effect"];
_giftEffectImageView.hidden = YES;
- (UIImageView *)noGiftEffectImageView {
if (!_noGiftEffectImageView) {
_noGiftEffectImageView = [[UIImageView alloc] init];
_noGiftEffectImageView.userInteractionEnabled = YES;
_noGiftEffectImageView.image = [UIImage imageNamed:@"room_info_disable_gift_effect"];
_noGiftEffectImageView.hidden = YES;
}
return _giftEffectImageView;
return _noGiftEffectImageView;
}
- (UIImageView *)lockRoomImageView {
@@ -524,4 +527,38 @@
return _levelImageView;
}
#pragma mark - Turbo Mode Methods
- (void)setupTurboModeNotifications {
// Turbo Mode
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTurboGiftEffectsStateChanged:)
name:kTurboGiftEffectsEnabledChanged
object:nil];
}
- (void)updateGiftEffectImageViewVisibility {
RoomInfoModel* roomInfo = self.hostDelegate.getRoomInfo;
if (!roomInfo) return;
NSString *roomId = @(roomInfo.roomId).stringValue;
BOOL turboGiftEffectsEnabled = [[TurboModeStateManager sharedManager] isGiftEffectsEnabledForRoom:roomId];
// TODO: 1. 使 isGiftEffectsEnabledForRoom: NO = hidden2. TurboModeStateManager isGiftEffectsEnabledForRoom
BOOL shouldShow = turboGiftEffectsEnabled && !roomInfo.hasAnimationEffect;
self.noGiftEffectImageView.hidden = !shouldShow;
NSLog(@"🎮 RoomHeaderView: giftEffectImageView 显示状态更新 - 房间ID: %@, turboGiftEffects: %@, hasAnimationEffect: %@, 显示: %@",
roomId, turboGiftEffectsEnabled ? @"开启" : @"关闭", roomInfo.hasAnimationEffect ? @"有" : @"无", shouldShow ? @"是" : @"否");
}
- (void)handleTurboGiftEffectsStateChanged:(NSNotification *)notification {
NSLog(@"🎮 RoomHeaderView: 收到 Turbo Mode 礼物特效状态变化通知");
[self updateGiftEffectImageViewVisibility];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end

View File

@@ -1,56 +1,33 @@
# CP SVGA 逻辑迁移测试报告
## 迁移完成情况
### ✅ 已完成的工作
1. **在 MicMidpointRectManager 中新增的 CP 业务逻辑方法:**
- `handleMicChangeForCPWithStageView:micCount:queue:currentUserUid:roomType:`
- `handleCPBindingOrUpgradeMessageWithStageView:micCount:queue:`
- `handleMicRelationshipCPMessage:`
- `handleOtherUserMicChange:changeType:stageView:micCount:queue:roomType:`
- `handleMicSwitchScenarioIfNeededWithStageView:micCount:queue:currentUserUid:roomType:`
- `handleDownMicEventIfNeededWithStageView:micCount:queue:roomType:`
- `updateCpListCacheAndRedraw:stageView:micCount:roomType:`
- `drawSocialStageMidpointRectsWithStageView:micCount:roomType:`
- `removeCpDataForUids:`
2. **在 XPRoomViewController 中简化的方法调用:**
- 所有 CP 相关方法现在都直接调用 MicMidpointRectManager 的对应方法
- 添加了 `getMicCountForRoomType:` 方法来计算麦位总数
- 移除了冗余的 CP 相关方法
3. **头文件更新:**
- 在 MicMidpointRectManager.h 中添加了所有新方法的声明
- 添加了必要的类前向声明
### 🔧 修复的问题
1. **编译错误修复:**
- 修复了 `self.micCount` 属性不存在的错误
- 添加了 `getMicCountForRoomType:` 方法来动态计算麦位总数
- 在头文件中添加了所有新方法的声明
2. **代码结构优化:**
- 将 CP 业务逻辑从 ViewController 迁移到 Manager
- 减少了代码重复
- 提高了代码的内聚性
### 📊 迁移效果
- **代码行数减少**XPRoomViewController 中 CP 相关代码大幅减少
- **职责分离**MicMidpointRectManager 专门负责 CP SVGA 逻辑
- **可维护性提升**CP 相关逻辑集中管理,修改更容易
- **可测试性提升**Manager 可以独立进行单元测试
### 🎯 Linus 式优势
**单一职责**Manager 专门负责 CP SVGA 逻辑ViewController 只负责调用
**减少重复**:消除了 ViewController 中的重复代码
**易于测试**Manager 可以独立测试
**易于维护**CP 相关逻辑集中在一个地方
**降低耦合**ViewController 只负责调用,不处理具体逻辑
## 迁移完成!🎉
所有 CP SVGA 相关逻辑已成功从 XPRoomViewController 迁移到 MicMidpointRectManager 中,代码结构更加清晰,维护性大大提升。
-[XPRoomMoreMenuViewController collectionView:didSelectItemAtIndexPath:] [Line 326]=== 点击菜单项 ===
-[XPRoomMoreMenuViewController collectionView:didSelectItemAtIndexPath:] [Line 327]点击的菜单项: 标题=Turbo 模式, 类型=6
-[XPRoomMoreMenuViewController showTurboModeTipsForUserAction] [Line 609]🎮 用户主动开启 Turbo Mode显示 Tips 弹窗
-[XPTurboModeTipsView enableTurboModeOnShow] [Line 50]🎮 Tips View 显示时自动开启 Turbo Mode
-[XPTurboModeTipsManager enableTurboModeDirectly] [Line 203]🎮 XPTurboModeTipsManager 直接开启 Turbo Mode
-[TurboModeStateManager setTurboModeEnabled:] [Line 195]🎮 TurboModeStateManager: 全局 turbo mode 设置为 开启
-[BuglyManager turboModeStateChanged:] [Line 335][BuglyManager] 🎮 Turbo Mode 状态变化: 开启
-[BuglyManager turboModeStateChanged:] [Line 340][BuglyManager] 🔄 Turbo Mode 开启卡顿计数复位为0
-[BannerScheduler clearQueue] [Line 105]🗑️ BannerScheduler: 清空 Banner 队列 - 原有数量: 0
-[BannerScheduler pause] [Line 121]⏸️ BannerScheduler: 暂停调度器
-[RoomAnimationView handleTurboModeStateChanged:] [Line 4348]🎮 RoomAnimationView: Turbo Mode 已开启,停止所有 banner 和动画
-[XPTurboModeTipsManager getCurrentRoomId] [Line 227]🎮 获取当前房间ID: 3184
-[RoomHeaderView handleTurboGiftEffectsStateChanged:] [Line 556]🎮 RoomHeaderView: 收到 Turbo Mode 礼物特效状态变化通知
-[RoomHeaderView updateGiftEffectImageViewVisibility] [Line 552]🎮 RoomHeaderView: giftEffectImageView 显示状态更新 - 房间ID: 6076861580, turboGiftEffects: 开启, hasAnimationEffect: 有, 显示: 否
-[RoomAnimationView cleanupGiftEffects] [Line 3960]🎮 清理礼物特效
-[RoomAnimationView cleanupGiftEffects] [Line 3986]🎮 礼物特效清理完成
-[RoomAnimationView handleTurboGiftEffectsChanged:] [Line 4288]🎮 RoomAnimationView 礼物特效状态变化: 关闭
-[RoomAnimationView cleanupGiftBanners] [Line 3991]🎮 清理礼物相关banner
-[RoomAnimationView cleanupGiftBanners] [Line 4013]🎮 礼物相关banner清理完成
-[RoomAnimationView handleTurboGlobalGiftScreenChanged:] [Line 4300]🎮 RoomAnimationView 全局礼物屏幕状态变化: 关闭
-[RoomAnimationView cleanupGameBanners] [Line 4018]🎮 清理游戏相关banner
-[RoomAnimationView cleanupGameBanners] [Line 4038]🎮 游戏相关banner清理完成
-[RoomAnimationView handleTurboGlobalGameScreenChanged:] [Line 4312]🎮 RoomAnimationView 全局游戏屏幕状态变化: 关闭
-[TurboModeStateManager applyTurboModeToSwitchesForRoom:] [Line 224]🎮 TurboModeStateManager: 应用 turbo mode房间 3184 的3个非CP开关全部关闭
-[XPTurboModeTipsManager enableTurboModeDirectly] [Line 213]🎮 已为房间 3184 应用 Turbo Mode 设置
-[XPTurboModeTipsView showWithAnimation] [Line 276]🎮 Tips 弹窗已添加到父视图,动画开始
-[XPRoomMoreMenuViewController showTurboModeTipsForUserAction] [Line 633]🎮 用户主动触发的 Turbo Mode Tips 弹窗已创建
-[XPTurboModeTipsManager showTurboModeEnabledToast]_block_invoke [Line 241]🎮 显示提示Turbo Mode 已开启
-[XPTurboModeTipsView understandButtonTapped] [Line 249]🎮 用户点击了 'I understand' 按钮,关闭 Tips 弹窗
-[XPTurboModeTipsView dismissWithAnimation]_block_invoke_2 [Line 286]🎮 Tips 弹窗已从父视图移除
-[XPRoomMoreMenuViewController collectionView:didSelectItemAtIndexPath:] [Line 326]=== 点击菜单项 ===
-[XPRoomMoreMenuViewController collectionView:didSelectItemAtIndexPath:] [Line 327]点击的菜单项: 标题=我的特效, 类型=29
-[XPEffectPanelViewController setupSwitchStates] [Line 183]🎮 Turbo Mode开关初始化完成 - 房间ID: 6076861580, 礼物特效: 开启, 全局礼物屏幕: 开启, 全局游戏屏幕: 开启