TF-3341 Enable web socket for mobile

This commit is contained in:
DatDang
2024-12-17 14:59:00 +07:00
committed by Dat H. Pham
parent 4a024699e2
commit ea58e3297b
6 changed files with 43 additions and 64 deletions
@@ -59,17 +59,9 @@ class FcmMessageController extends PushBaseController {
super.initialize(accountId: accountId, session: session);
_listenTokenStream();
_listenForegroundMessageStream();
_listenBackgroundMessageStream();
}
void _listenForegroundMessageStream() {
FcmService.instance.foregroundMessageStreamController
?.stream
.debounceTime(const Duration(milliseconds: FcmUtils.durationMessageComing))
.listen(_handleForegroundMessageAction);
}
void _listenBackgroundMessageStream() {
FcmService.instance.backgroundMessageStreamController
?.stream
@@ -84,21 +76,6 @@ class FcmMessageController extends PushBaseController {
.listen(FcmTokenController.instance.onFcmTokenChanged);
}
void _handleForegroundMessageAction(Map<String, dynamic> payloadData) {
log('FcmMessageController::_handleForegroundMessageAction():payloadData: $payloadData | accountId: $accountId');
if (accountId != null && session?.username != null) {
final stateChange = FcmUtils.instance.convertFirebaseDataMessageToStateChange(payloadData);
final mapTypeState = stateChange.getMapTypeState(accountId!);
mappingTypeStateToAction(
mapTypeState,
accountId!,
emailChangeListener: EmailChangeListener.instance,
mailboxChangeListener: MailboxChangeListener.instance,
session!.username,
session: session);
}
}
void _handleBackgroundMessageAction(Map<String, dynamic> payloadData) async {
log('FcmMessageController::_handleBackgroundMessageAction():payloadData: $payloadData');
final stateChange = FcmUtils.instance.convertFirebaseDataMessageToStateChange(payloadData);
@@ -43,6 +43,8 @@ abstract class PushBaseController {
this.session = session;
}
void onClose() {}
void mappingTypeStateToAction(
Map<String, dynamic> mapTypeState,
AccountId accountId,
@@ -4,7 +4,9 @@ import 'dart:convert';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart';
import 'package:fcm/model/type_name.dart';
import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/push/state_change.dart';
@@ -33,13 +35,12 @@ class WebSocketController extends PushBaseController {
WebSocketChannel? _webSocketChannel;
Timer? _webSocketPingTimer;
StreamSubscription? _webSocketSubscription;
AppLifecycleListener? _appLifecycleListener;
@override
void handleFailureViewState(Failure failure) {
logError('WebSocketController::handleFailureViewState():Failure $failure');
_webSocketSubscription?.cancel();
_webSocketChannel = null;
_webSocketPingTimer?.cancel();
_cleanUpWebSocketResources();
if (failure is WebSocketConnectionFailed) {
_handleWebSocketConnectionRetry();
}
@@ -64,6 +65,31 @@ class WebSocketController extends PushBaseController {
super.initialize(accountId: accountId, session: session);
_connectWebSocket(accountId, session);
if (PlatformInfo.isMobile) {
_listenToAppLifeCycle(accountId, session);
}
}
@override
void onClose() {
_cleanUpWebSocketResources();
_appLifecycleListener?.dispose();
_appLifecycleListener = null;
super.onClose();
}
void _listenToAppLifeCycle(AccountId? accountId, Session? session) {
_appLifecycleListener ??= AppLifecycleListener(
onStateChange: (appLifecycleState) {
switch (appLifecycleState) {
case AppLifecycleState.resumed:
_connectWebSocket(accountId, session);
break;
default:
_cleanUpWebSocketResources();
}
},
);
}
void _connectWebSocket(AccountId? accountId, Session? session) {
@@ -74,9 +100,16 @@ class WebSocketController extends PushBaseController {
consumeState(_connectWebSocketInteractor!.execute(session, accountId));
}
void _cleanUpWebSocketResources() {
_webSocketSubscription?.cancel();
_webSocketChannel = null;
_webSocketPingTimer?.cancel();
}
void _handleWebSocketConnectionSuccess(WebSocketConnectionSuccess success) {
log('WebSocketController::_handleWebSocketConnectionSuccess(): $success');
_cleanUpWebSocketResources();
_retryRemained = 3;
_webSocketChannel = success.webSocketChannel;
_enableWebSocketPush();
@@ -87,9 +120,7 @@ class WebSocketController extends PushBaseController {
}
void _handleWebSocketConnectionRetry() {
_webSocketSubscription?.cancel();
_webSocketChannel = null;
_webSocketPingTimer?.cancel();
_cleanUpWebSocketResources();
if (_retryRemained > 0) {
_retryRemained--;
_connectWebSocket(accountId, session);