keep动画重播问题
This commit is contained in:
parent
faaeeded32
commit
8be5c4c334
@ -499,6 +499,7 @@ class RealTimeCommunicationManager extends ChangeNotifier {
|
|||||||
_roomEntryEffectTimer = null;
|
_roomEntryEffectTimer = null;
|
||||||
_roomRocketLaunchAnimationTimer?.cancel();
|
_roomRocketLaunchAnimationTimer?.cancel();
|
||||||
_roomRocketLaunchAnimationTimer = null;
|
_roomRocketLaunchAnimationTimer = null;
|
||||||
|
SmartDialog.dismiss(tag: _roomRocketPagLaunchDialogTag);
|
||||||
_releaseRoomRocketLaunchTopAvatarNotifier();
|
_releaseRoomRocketLaunchTopAvatarNotifier();
|
||||||
_roomRocketGiftRefreshTimer?.cancel();
|
_roomRocketGiftRefreshTimer?.cancel();
|
||||||
_roomRocketGiftRefreshTimer = null;
|
_roomRocketGiftRefreshTimer = null;
|
||||||
@ -3768,6 +3769,7 @@ class RealTimeCommunicationManager extends ChangeNotifier {
|
|||||||
_roomEntryEffectTimer = null;
|
_roomEntryEffectTimer = null;
|
||||||
_roomRocketLaunchAnimationTimer?.cancel();
|
_roomRocketLaunchAnimationTimer?.cancel();
|
||||||
_roomRocketLaunchAnimationTimer = null;
|
_roomRocketLaunchAnimationTimer = null;
|
||||||
|
SmartDialog.dismiss(tag: _roomRocketPagLaunchDialogTag);
|
||||||
_releaseRoomRocketLaunchTopAvatarNotifier();
|
_releaseRoomRocketLaunchTopAvatarNotifier();
|
||||||
_roomRocketGiftRefreshTimer?.cancel();
|
_roomRocketGiftRefreshTimer?.cancel();
|
||||||
_roomRocketGiftRefreshTimer = null;
|
_roomRocketGiftRefreshTimer = null;
|
||||||
|
|||||||
@ -136,6 +136,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
static const int _roomRocketRewardPendingTtlMs = 120000;
|
static const int _roomRocketRewardPendingTtlMs = 120000;
|
||||||
static const int _roomRocketRewardProbeTtlMs = 120000;
|
static const int _roomRocketRewardProbeTtlMs = 120000;
|
||||||
static const int _roomRocketLaunchCountdownRetainMs = 10000;
|
static const int _roomRocketLaunchCountdownRetainMs = 10000;
|
||||||
|
static const int _roomRocketLaunchEffectConsumedTtlMs = 120000;
|
||||||
static const Duration _createRoomGroupTimeout = Duration(seconds: 12);
|
static const Duration _createRoomGroupTimeout = Duration(seconds: 12);
|
||||||
static const List<Duration> _roomRocketRewardPopupRetryDelays = [
|
static const List<Duration> _roomRocketRewardPopupRetryDelays = [
|
||||||
Duration(milliseconds: 700),
|
Duration(milliseconds: 700),
|
||||||
@ -269,6 +270,8 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
final _pendingRoomRocketCountdownLaunches =
|
final _pendingRoomRocketCountdownLaunches =
|
||||||
<String, RoomRocketLaunchBroadcastMessage>{};
|
<String, RoomRocketLaunchBroadcastMessage>{};
|
||||||
final Map<String, Timer> _roomRocketLaunchEffectTimers = <String, Timer>{};
|
final Map<String, Timer> _roomRocketLaunchEffectTimers = <String, Timer>{};
|
||||||
|
final Map<String, int> _consumedRoomRocketLaunchEffectTimes = <String, int>{};
|
||||||
|
final Set<String> _hiddenCurrentRoomRocketLaunchKeys = <String>{};
|
||||||
Timer? _roomRocketRewardPopupRetryTimer;
|
Timer? _roomRocketRewardPopupRetryTimer;
|
||||||
Timer? _roomRocketRoomReadyRewardRetryTimer;
|
Timer? _roomRocketRoomReadyRewardRetryTimer;
|
||||||
int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken;
|
int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken;
|
||||||
@ -2020,8 +2023,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
publishRegionBroadcast: true,
|
publishRegionBroadcast: true,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
_rememberRoomRocketLaunchCountdown(launch);
|
_rememberRoomRocketLaunchCountdown(
|
||||||
_markRoomRocketRewardProbe(launch.roomId);
|
launch,
|
||||||
|
suppressReplayAfterDue: true,
|
||||||
|
);
|
||||||
_publishRoomRocketRegionBroadcastIfNeeded(launch);
|
_publishRoomRocketRegionBroadcastIfNeeded(launch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2038,8 +2043,6 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
if (!launch.isValid) {
|
if (!launch.isValid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_rememberRoomRocketLaunchCountdown(launch);
|
|
||||||
|
|
||||||
var isCurrentRoom = false;
|
var isCurrentRoom = false;
|
||||||
var isCurrentVisibleRoom = false;
|
var isCurrentVisibleRoom = false;
|
||||||
final currentContext = context;
|
final currentContext = context;
|
||||||
@ -2060,11 +2063,19 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
rtcProvider: rtcProvider,
|
rtcProvider: rtcProvider,
|
||||||
launch: launch,
|
launch: launch,
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
_rememberRoomRocketLaunchCountdown(
|
||||||
|
launch,
|
||||||
|
suppressReplayAfterDue: true,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isCurrentVisibleRoom) {
|
if (!isCurrentRoom) {
|
||||||
|
_rememberRoomRocketLaunchCountdown(launch);
|
||||||
|
}
|
||||||
|
if (!isCurrentVisibleRoom && !isCurrentRoom) {
|
||||||
_markRoomRocketRewardProbe(launch.roomId);
|
_markRoomRocketRewardProbe(launch.roomId);
|
||||||
}
|
}
|
||||||
if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) {
|
if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) {
|
||||||
@ -2141,10 +2152,13 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
final resumedLaunch = _resumeRoomRocketLaunchForCurrentRoom(
|
final resumedLaunch = _resumeRoomRocketLaunchForCurrentRoom(
|
||||||
normalizedRoomId,
|
normalizedRoomId,
|
||||||
);
|
);
|
||||||
if (pending == null && !hasProbe) {
|
final pendingAfterResume = _pendingRoomRocketRewardPopups[normalizedRoomId];
|
||||||
|
final hasProbeAfterResume =
|
||||||
|
_recentRoomRocketRewardProbeTimes[normalizedRoomId] != null;
|
||||||
|
if (pendingAfterResume == null && !hasProbeAfterResume) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!resumedLaunch && pending == null && attempt == 0) {
|
if (!resumedLaunch && pendingAfterResume == null && attempt == 0) {
|
||||||
_scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt);
|
_scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2156,7 +2170,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
_showRoomRocketRewardPopupDialog(
|
_showRoomRocketRewardPopupDialog(
|
||||||
normalizedRoomId,
|
normalizedRoomId,
|
||||||
initialRoomRecords:
|
initialRoomRecords:
|
||||||
pending?.initialRoomRecords ??
|
pendingAfterResume?.initialRoomRecords ??
|
||||||
const <SCRoomRocketRewardRecordRes>[],
|
const <SCRoomRocketRewardRecordRes>[],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -2223,15 +2237,18 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
void _clearRoomRocketRewardFallbackState() {
|
void _clearRoomRocketRewardFallbackState() {
|
||||||
_pendingRoomRocketRewardPopups.clear();
|
_pendingRoomRocketRewardPopups.clear();
|
||||||
_recentRoomRocketRewardProbeTimes.clear();
|
_recentRoomRocketRewardProbeTimes.clear();
|
||||||
|
_consumedRoomRocketLaunchEffectTimes.clear();
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.clear();
|
||||||
_roomRocketRoomReadyRewardRetryTimer?.cancel();
|
_roomRocketRoomReadyRewardRetryTimer?.cancel();
|
||||||
_roomRocketRoomReadyRewardRetryTimer = null;
|
_roomRocketRoomReadyRewardRetryTimer = null;
|
||||||
_clearRoomRocketLaunchCountdownState();
|
_clearRoomRocketLaunchCountdownState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _rememberRoomRocketLaunchCountdown(
|
void _rememberRoomRocketLaunchCountdown(
|
||||||
RoomRocketLaunchBroadcastMessage launch,
|
RoomRocketLaunchBroadcastMessage launch, {
|
||||||
) {
|
bool suppressReplayAfterDue = false,
|
||||||
if (!launch.isValid) {
|
}) {
|
||||||
|
if (!launch.isValid || _hasConsumedRoomRocketLaunchEffect(launch)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final now = DateTime.now().millisecondsSinceEpoch;
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
@ -2245,12 +2262,15 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
_roomRocketLaunchCountdownDueTimes[key] = dueAt;
|
_roomRocketLaunchCountdownDueTimes[key] = dueAt;
|
||||||
_roomRocketLaunchCountdownKeysByRoom[launch.roomId] = key;
|
_roomRocketLaunchCountdownKeysByRoom[launch.roomId] = key;
|
||||||
_pendingRoomRocketCountdownLaunches[launch.roomId] = launch;
|
_pendingRoomRocketCountdownLaunches[launch.roomId] = launch;
|
||||||
|
if (suppressReplayAfterDue) {
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.add(key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _scheduleRoomRocketLaunchEffectsAfterCountdown(
|
void _scheduleRoomRocketLaunchEffectsAfterCountdown(
|
||||||
RoomRocketLaunchBroadcastMessage launch,
|
RoomRocketLaunchBroadcastMessage launch,
|
||||||
) {
|
) {
|
||||||
if (!launch.isValid) {
|
if (!launch.isValid || _hasConsumedRoomRocketLaunchEffect(launch)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_rememberRoomRocketLaunchCountdown(launch);
|
_rememberRoomRocketLaunchCountdown(launch);
|
||||||
@ -2278,14 +2298,18 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
void _playRoomRocketLaunchEffectsAndReward(
|
void _playRoomRocketLaunchEffectsAndReward(
|
||||||
RoomRocketLaunchBroadcastMessage launch,
|
RoomRocketLaunchBroadcastMessage launch,
|
||||||
) {
|
) {
|
||||||
|
if (_hasConsumedRoomRocketLaunchEffect(launch)) {
|
||||||
|
_clearRoomRocketLaunchCountdownForRoom(launch.roomId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
_clearRoomRocketLaunchCountdownForRoom(launch.roomId);
|
_clearRoomRocketLaunchCountdownForRoom(launch.roomId);
|
||||||
if (!_isCurrentVisibleVoiceRoom(launch.roomId)) {
|
if (!_isCurrentVisibleVoiceRoom(launch.roomId)) {
|
||||||
_markRoomRocketRewardProbe(launch.roomId);
|
_consumeRoomRocketLaunchWithoutEffects(launch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final currentContext = context;
|
final currentContext = context;
|
||||||
if (currentContext == null || !currentContext.mounted) {
|
if (currentContext == null || !currentContext.mounted) {
|
||||||
_markRoomRocketRewardProbe(launch.roomId);
|
_consumeRoomRocketLaunchWithoutEffects(launch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final rtcProvider = Provider.of<RealTimeCommunicationManager>(
|
final rtcProvider = Provider.of<RealTimeCommunicationManager>(
|
||||||
@ -2297,6 +2321,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
_recentRoomRocketRewardProbeTimes.containsKey(launch.roomId);
|
_recentRoomRocketRewardProbeTimes.containsKey(launch.roomId);
|
||||||
final pending = _pendingRoomRocketRewardPopups.remove(launch.roomId);
|
final pending = _pendingRoomRocketRewardPopups.remove(launch.roomId);
|
||||||
_recentRoomRocketRewardProbeTimes.remove(launch.roomId);
|
_recentRoomRocketRewardProbeTimes.remove(launch.roomId);
|
||||||
|
_markRoomRocketLaunchEffectConsumed(launch);
|
||||||
rtcProvider.handleRoomRocketLaunchBroadcast(launch);
|
rtcProvider.handleRoomRocketLaunchBroadcast(launch);
|
||||||
if (shouldFetchReward) {
|
if (shouldFetchReward) {
|
||||||
unawaited(
|
unawaited(
|
||||||
@ -2316,6 +2341,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
if (launch == null || !_isCurrentVisibleVoiceRoom(normalizedRoomId)) {
|
if (launch == null || !_isCurrentVisibleVoiceRoom(normalizedRoomId)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (_hasConsumedRoomRocketLaunchEffect(launch)) {
|
||||||
|
_clearRoomRocketLaunchCountdownForRoom(normalizedRoomId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
final currentContext = context;
|
final currentContext = context;
|
||||||
if (currentContext == null || !currentContext.mounted) {
|
if (currentContext == null || !currentContext.mounted) {
|
||||||
return false;
|
return false;
|
||||||
@ -2325,7 +2354,9 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
listen: false,
|
listen: false,
|
||||||
);
|
);
|
||||||
final remaining = _roomRocketLaunchCountdownRemaining(normalizedRoomId);
|
final remaining = _roomRocketLaunchCountdownRemaining(normalizedRoomId);
|
||||||
|
final launchKey = _roomRocketLaunchCountdownKey(launch);
|
||||||
if (remaining > Duration.zero) {
|
if (remaining > Duration.zero) {
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.remove(launchKey);
|
||||||
_addRoomRocketLaunchNoticeIfNeeded(
|
_addRoomRocketLaunchNoticeIfNeeded(
|
||||||
rtcProvider: rtcProvider,
|
rtcProvider: rtcProvider,
|
||||||
launch: launch,
|
launch: launch,
|
||||||
@ -2333,6 +2364,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
);
|
);
|
||||||
_scheduleRoomRocketLaunchEffectsAfterCountdown(launch);
|
_scheduleRoomRocketLaunchEffectsAfterCountdown(launch);
|
||||||
} else {
|
} else {
|
||||||
|
if (_hiddenCurrentRoomRocketLaunchKeys.remove(launchKey)) {
|
||||||
|
_consumeRoomRocketLaunchWithoutEffects(launch);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
_playRoomRocketLaunchEffectsAndReward(launch);
|
_playRoomRocketLaunchEffectsAndReward(launch);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -2399,6 +2434,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
_roomRocketLaunchCountdownDueTimes.clear();
|
_roomRocketLaunchCountdownDueTimes.clear();
|
||||||
_roomRocketLaunchCountdownKeysByRoom.clear();
|
_roomRocketLaunchCountdownKeysByRoom.clear();
|
||||||
_pendingRoomRocketCountdownLaunches.clear();
|
_pendingRoomRocketCountdownLaunches.clear();
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.clear();
|
||||||
for (final timer in _roomRocketLaunchEffectTimers.values) {
|
for (final timer in _roomRocketLaunchEffectTimers.values) {
|
||||||
timer.cancel();
|
timer.cancel();
|
||||||
}
|
}
|
||||||
@ -2411,10 +2447,51 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
if (key != null) {
|
if (key != null) {
|
||||||
_roomRocketLaunchCountdownDueTimes.remove(key);
|
_roomRocketLaunchCountdownDueTimes.remove(key);
|
||||||
_roomRocketLaunchEffectTimers.remove(key)?.cancel();
|
_roomRocketLaunchEffectTimers.remove(key)?.cancel();
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.remove(key);
|
||||||
}
|
}
|
||||||
_pendingRoomRocketCountdownLaunches.remove(normalizedRoomId);
|
_pendingRoomRocketCountdownLaunches.remove(normalizedRoomId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _hasConsumedRoomRocketLaunchEffect(
|
||||||
|
RoomRocketLaunchBroadcastMessage launch,
|
||||||
|
) {
|
||||||
|
final key = _roomRocketLaunchCountdownKey(launch);
|
||||||
|
if (key.isEmpty) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
_pruneConsumedRoomRocketLaunchEffects(
|
||||||
|
DateTime.now().millisecondsSinceEpoch,
|
||||||
|
);
|
||||||
|
return _consumedRoomRocketLaunchEffectTimes.containsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _markRoomRocketLaunchEffectConsumed(
|
||||||
|
RoomRocketLaunchBroadcastMessage launch,
|
||||||
|
) {
|
||||||
|
final key = _roomRocketLaunchCountdownKey(launch);
|
||||||
|
if (key.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_consumedRoomRocketLaunchEffectTimes[key] =
|
||||||
|
DateTime.now().millisecondsSinceEpoch;
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _consumeRoomRocketLaunchWithoutEffects(
|
||||||
|
RoomRocketLaunchBroadcastMessage launch,
|
||||||
|
) {
|
||||||
|
_clearRoomRocketLaunchCountdownForRoom(launch.roomId);
|
||||||
|
_pendingRoomRocketRewardPopups.remove(launch.roomId);
|
||||||
|
_recentRoomRocketRewardProbeTimes.remove(launch.roomId);
|
||||||
|
_markRoomRocketLaunchEffectConsumed(launch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _pruneConsumedRoomRocketLaunchEffects(int now) {
|
||||||
|
_consumedRoomRocketLaunchEffectTimes.removeWhere(
|
||||||
|
(_, timestamp) => now - timestamp > _roomRocketLaunchEffectConsumedTtlMs,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
void _handleCurrentVisibleRoomRocketLaunch({
|
void _handleCurrentVisibleRoomRocketLaunch({
|
||||||
required RealTimeCommunicationManager rtcProvider,
|
required RealTimeCommunicationManager rtcProvider,
|
||||||
required RoomRocketLaunchBroadcastMessage launch,
|
required RoomRocketLaunchBroadcastMessage launch,
|
||||||
@ -2965,6 +3042,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
_recentRoomRocketLaunchLooseTimes.removeWhere(
|
_recentRoomRocketLaunchLooseTimes.removeWhere(
|
||||||
(_, timestamp) => now - timestamp > _roomRocketLaunchLooseRecentTtlMs,
|
(_, timestamp) => now - timestamp > _roomRocketLaunchLooseRecentTtlMs,
|
||||||
);
|
);
|
||||||
|
_pruneConsumedRoomRocketLaunchEffects(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _roomRocketLaunchNoticeKeyForValues({
|
String _roomRocketLaunchNoticeKeyForValues({
|
||||||
@ -4006,6 +4084,8 @@ class RealTimeMessagingManager extends ChangeNotifier {
|
|||||||
_recentRoomRocketLaunchTimes.clear();
|
_recentRoomRocketLaunchTimes.clear();
|
||||||
_recentRoomRocketLaunchLooseTimes.clear();
|
_recentRoomRocketLaunchLooseTimes.clear();
|
||||||
_recentRoomRocketRegionBroadcastTimes.clear();
|
_recentRoomRocketRegionBroadcastTimes.clear();
|
||||||
|
_consumedRoomRocketLaunchEffectTimes.clear();
|
||||||
|
_hiddenCurrentRoomRocketLaunchKeys.clear();
|
||||||
_roomRocketRewardPopupRetryTimer?.cancel();
|
_roomRocketRewardPopupRetryTimer?.cancel();
|
||||||
_roomRocketRewardPopupRetryTimer = null;
|
_roomRocketRewardPopupRetryTimer = null;
|
||||||
onNewMessageListenerGroupMap.forEach((k, v) {
|
onNewMessageListenerGroupMap.forEach((k, v) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user