|
|
|
@ -85,6 +85,11 @@ class CallManager extends ChangeNotifier {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
log('🔧 [CallManager] Initializing...', name: 'CallManager');
|
|
|
|
log('🔧 [CallManager] Initializing...', name: 'CallManager');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CRITICAL FIX: Cache credentials for background call handling
|
|
|
|
|
|
|
|
_cachedUserId = userId;
|
|
|
|
|
|
|
|
_cachedAuthToken = authToken;
|
|
|
|
|
|
|
|
_cachedEmployeeNumber = employeeNumber;
|
|
|
|
|
|
|
|
|
|
|
|
// CRITICAL FIX: Don't re-initialize if already initialized with same USER credentials
|
|
|
|
// CRITICAL FIX: Don't re-initialize if already initialized with same USER credentials
|
|
|
|
// conversationId can change (different chats) - that's OK, just update it
|
|
|
|
// conversationId can change (different chats) - that's OK, just update it
|
|
|
|
// Only re-initialize if USER changes (userId, authToken, employeeNumber)
|
|
|
|
// Only re-initialize if USER changes (userId, authToken, employeeNumber)
|
|
|
|
@ -380,46 +385,60 @@ class CallManager extends ChangeNotifier {
|
|
|
|
log(' Video: $isVideoCall', name: 'CallManager');
|
|
|
|
log(' Video: $isVideoCall', name: 'CallManager');
|
|
|
|
|
|
|
|
|
|
|
|
// CRITICAL FIX: Auto-initialize CallManager if not already initialized
|
|
|
|
// CRITICAL FIX: Auto-initialize CallManager if not already initialized
|
|
|
|
|
|
|
|
// This handles the case when app is in background and context is null
|
|
|
|
if (_userId == null || _authToken == null) {
|
|
|
|
if (_userId == null || _authToken == null) {
|
|
|
|
log('⚠️ [INCOMING] CallManager not initialized - attempting auto-initialization...', name: 'CallManager');
|
|
|
|
log('⚠️ [INCOMING] CallManager not initialized - attempting auto-initialization...', name: 'CallManager');
|
|
|
|
|
|
|
|
|
|
|
|
// Try to get credentials from ChatProvider
|
|
|
|
// CRITICAL FIX: Try cached credentials first (for background calls)
|
|
|
|
try {
|
|
|
|
if (_cachedUserId != null && _cachedAuthToken != null && _cachedEmployeeNumber != null) {
|
|
|
|
final chatProvider = Provider.of<ChatProvider>(navigatorKey.currentContext!, listen: false);
|
|
|
|
log('🔧 [INCOMING] Using cached credentials (app in background)', name: 'CallManager');
|
|
|
|
final chatLoginResponse = chatProvider.chatLoginResponse;
|
|
|
|
log(' Cached User ID: $_cachedUserId', name: 'CallManager');
|
|
|
|
final sender = chatProvider.sender; // Get sender for employee number
|
|
|
|
log(' Cached Employee Number: $_cachedEmployeeNumber', name: 'CallManager');
|
|
|
|
|
|
|
|
|
|
|
|
if (chatLoginResponse != null) {
|
|
|
|
await initialize(
|
|
|
|
log('🔧 [INCOMING] Found credentials in ChatProvider', name: 'CallManager');
|
|
|
|
userId: _cachedUserId!,
|
|
|
|
log(' User ID: ${chatLoginResponse.userId}', name: 'CallManager');
|
|
|
|
authToken: _cachedAuthToken!,
|
|
|
|
log(' Employee Number: ${sender?.employeeNumber ?? "NOT AVAILABLE"}', name: 'CallManager');
|
|
|
|
conversationId: extraData?['conversationId'] as String?,
|
|
|
|
|
|
|
|
moduleId: extraData?['moduleId'] as String?,
|
|
|
|
await initialize(
|
|
|
|
referenceId: extraData?['referenceId'] as String?,
|
|
|
|
userId: chatLoginResponse.userId.toString(),
|
|
|
|
employeeNumber: _cachedEmployeeNumber,
|
|
|
|
authToken: chatLoginResponse.token ?? '',
|
|
|
|
);
|
|
|
|
conversationId: extraData?['conversationId'] as String?,
|
|
|
|
|
|
|
|
moduleId: extraData?['moduleId'] as String?,
|
|
|
|
log('✅ [INCOMING] Auto-initialization successful (from cache)', name: 'CallManager');
|
|
|
|
referenceId: extraData?['referenceId'] as String?,
|
|
|
|
}
|
|
|
|
employeeNumber: sender?.employeeNumber, // Get from sender participant
|
|
|
|
// Try to get credentials from ChatProvider (app in foreground)
|
|
|
|
);
|
|
|
|
else if (navigatorKey.currentContext != null) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
log('✅ [INCOMING] Auto-initialization successful', name: 'CallManager');
|
|
|
|
final chatProvider = Provider.of<ChatProvider>(navigatorKey.currentContext!, listen: false);
|
|
|
|
} else {
|
|
|
|
final chatLoginResponse = chatProvider.chatLoginResponse;
|
|
|
|
log('❌ [INCOMING] No credentials available in ChatProvider', name: 'CallManager');
|
|
|
|
final sender = chatProvider.sender; // Get sender for employee number
|
|
|
|
// Show error to user
|
|
|
|
|
|
|
|
final context = navigatorKey.currentContext;
|
|
|
|
if (chatLoginResponse != null) {
|
|
|
|
if (context != null) {
|
|
|
|
log('🔧 [INCOMING] Found credentials in ChatProvider', name: 'CallManager');
|
|
|
|
CallErrorHandler.showGenericError(context, 'Unable to receive call. Please login to chat first.');
|
|
|
|
log(' User ID: ${chatLoginResponse.userId}', name: 'CallManager');
|
|
|
|
|
|
|
|
log(' Employee Number: ${sender?.employeeNumber ?? "NOT AVAILABLE"}', name: 'CallManager');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await initialize(
|
|
|
|
|
|
|
|
userId: chatLoginResponse.userId.toString(),
|
|
|
|
|
|
|
|
authToken: chatLoginResponse.token ?? '',
|
|
|
|
|
|
|
|
conversationId: extraData?['conversationId'] as String?,
|
|
|
|
|
|
|
|
moduleId: extraData?['moduleId'] as String?,
|
|
|
|
|
|
|
|
referenceId: extraData?['referenceId'] as String?,
|
|
|
|
|
|
|
|
employeeNumber: sender?.employeeNumber, // Get from sender participant
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log('✅ [INCOMING] Auto-initialization successful (from ChatProvider)', name: 'CallManager');
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
log('❌ [INCOMING] No credentials available', name: 'CallManager');
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
log('❌ [INCOMING] Auto-initialization failed: $e', name: 'CallManager');
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
} else {
|
|
|
|
log('❌ [INCOMING] Auto-initialization failed: $e', name: 'CallManager');
|
|
|
|
log('❌ [INCOMING] No cached credentials and no context available', name: 'CallManager');
|
|
|
|
// Show error to user
|
|
|
|
log(' This means user never logged into chat in this session', name: 'CallManager');
|
|
|
|
final context = navigatorKey.currentContext;
|
|
|
|
|
|
|
|
if (context != null) {
|
|
|
|
|
|
|
|
CallErrorHandler.showGenericError(context, 'Unable to receive call. Please open chat first.');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -871,10 +890,10 @@ class CallManager extends ChangeNotifier {
|
|
|
|
log('🎵 [WEBRTC] Initializing for audio call', name: 'CallManager');
|
|
|
|
log('🎵 [WEBRTC] Initializing for audio call', name: 'CallManager');
|
|
|
|
await _webrtcService!.initializeForAudioCall();
|
|
|
|
await _webrtcService!.initializeForAudioCall();
|
|
|
|
|
|
|
|
|
|
|
|
// CRITICAL FIX: Speaker is enabled by default in WebRTC service
|
|
|
|
// CRITICAL FIX: Speaker is OFF by default in WebRTC service (earpiece mode)
|
|
|
|
// Update the CallManager state to reflect this
|
|
|
|
// Update the CallManager state to reflect this
|
|
|
|
_isSpeakerOn = true;
|
|
|
|
_isSpeakerOn = false;
|
|
|
|
log('✅ [WEBRTC] Speaker state synchronized: ON', name: 'CallManager');
|
|
|
|
log('✅ [WEBRTC] Speaker state synchronized: OFF (earpiece mode)', name: 'CallManager');
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
log('📹 [WEBRTC] Initializing for video call', name: 'CallManager');
|
|
|
|
log('📹 [WEBRTC] Initializing for video call', name: 'CallManager');
|
|
|
|
|