From 20d8c9643f25a806f22f37d5cf27547a5d0dc2f0 Mon Sep 17 00:00:00 2001 From: Florian Griffon Date: Tue, 8 Apr 2025 21:39:39 +0300 Subject: [PATCH] feat: fetch contact in makeGsmCall to show it in call --- dialer/lib/services/call_service.dart | 51 ++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/dialer/lib/services/call_service.dart b/dialer/lib/services/call_service.dart index d42326e..c7e41a6 100644 --- a/dialer/lib/services/call_service.dart +++ b/dialer/lib/services/call_service.dart @@ -1,12 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../features/call/call_page.dart'; -import '../features/call/incoming_call_page.dart'; // Import the new page +import '../features/call/incoming_call_page.dart'; +import '../services/contact_service.dart'; // Import your ContactService class CallService { static const MethodChannel _channel = MethodChannel('call_service'); static String? currentPhoneNumber; + static String? currentDisplayName; // Store display name + static Uint8List? currentThumbnail; // Store thumbnail static bool _isCallPageVisible = false; + final ContactService _contactService = ContactService(); // Instantiate ContactService static final GlobalKey navigatorKey = GlobalKey(); @@ -24,6 +28,8 @@ class CallService { final phoneNumber = call.arguments["callId"] as String; final state = call.arguments["state"] as String; currentPhoneNumber = phoneNumber.replaceFirst('tel:', ''); + // Fetch contact info using ContactService if not already set + await _fetchContactInfo(currentPhoneNumber!); print('CallService: Call added, number: $currentPhoneNumber, state: $state'); if (state == "ringing") { _navigateToIncomingCallPage(context); @@ -47,11 +53,40 @@ class CallService { print('CallService: Call ended/removed'); _closeCallPage(context); currentPhoneNumber = null; + currentDisplayName = null; + currentThumbnail = null; break; } }); } + Future _fetchContactInfo(String phoneNumber) async { + if (currentDisplayName != null && currentThumbnail != null) return; // Already set + try { + final contacts = await _contactService.fetchContacts(); // Use ContactService + for (var contact in contacts) { + for (var phone in contact.phones) { + if (_normalizePhoneNumber(phone.number) == _normalizePhoneNumber(phoneNumber)) { + currentDisplayName = contact.displayName; + currentThumbnail = contact.thumbnail; + return; + } + } + } + // If no match found, use phone number as fallback + currentDisplayName ??= phoneNumber; + currentThumbnail ??= null; + } catch (e) { + print('CallService: Error fetching contact info: $e'); + currentDisplayName = phoneNumber; + currentThumbnail = null; + } + } + + String _normalizePhoneNumber(String number) { + return number.replaceAll(RegExp(r'[\s\-\(\)]'), ''); + } + void _navigateToCallPage(BuildContext context) { if (_isCallPageVisible && ModalRoute.of(context)?.settings.name == '/call') { print('CallService: CallPage already visible, skipping navigation'); @@ -63,9 +98,9 @@ class CallService { MaterialPageRoute( settings: const RouteSettings(name: '/call'), builder: (context) => CallPage( - displayName: currentPhoneNumber!, + displayName: currentDisplayName ?? currentPhoneNumber!, phoneNumber: currentPhoneNumber!, - thumbnail: null, + thumbnail: currentThumbnail, ), ), ).then((_) { @@ -85,9 +120,9 @@ class CallService { MaterialPageRoute( settings: const RouteSettings(name: '/incoming_call'), builder: (context) => IncomingCallPage( - displayName: currentPhoneNumber!, + displayName: currentDisplayName ?? currentPhoneNumber!, phoneNumber: currentPhoneNumber!, - thumbnail: null, + thumbnail: currentThumbnail, ), ), ).then((_) { @@ -116,6 +151,8 @@ class CallService { }) async { try { currentPhoneNumber = phoneNumber; + currentDisplayName = displayName ?? phoneNumber; // Use provided or fetch later + currentThumbnail = thumbnail; // Use provided or fetch later print('CallService: Making GSM call to $phoneNumber'); final result = await _channel.invokeMethod('makeGsmCall', {"phoneNumber": phoneNumber}); print('CallService: makeGsmCall result: $result'); @@ -123,7 +160,11 @@ class CallService { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Failed to initiate call")), ); + return; } + // Fetch contact info if not provided + await _fetchContactInfo(phoneNumber); + _navigateToCallPage(context); // Navigate immediately after call initiation } catch (e) { print("CallService: Error making call: $e"); ScaffoldMessenger.of(context).showSnackBar(