import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:url_launcher/url_launcher.dart'; import '../call/call.dart'; class CompositionPage extends StatefulWidget { const CompositionPage({super.key}); @override _CompositionPageState createState() => _CompositionPageState(); } class _CompositionPageState extends State { String dialedNumber = ""; List _allContacts = []; List _filteredContacts = []; @override void initState() { super.initState(); _fetchContacts(); } Future _fetchContacts() async { if (await FlutterContacts.requestPermission()) { _allContacts = await FlutterContacts.getContacts(withProperties: true); _filteredContacts = _allContacts; setState(() {}); } } void _filterContacts() { setState(() { _filteredContacts = _allContacts.where((contact) { final phoneMatch = contact.phones.any((phone) => phone.number.replaceAll(RegExp(r'\D'), '').contains(dialedNumber)); final nameMatch = contact.displayName .toLowerCase() .contains(dialedNumber.toLowerCase()); return phoneMatch || nameMatch; }).toList(); }); } void _onCallPress(String phoneNumber) async { final uri = Uri(scheme: 'tel', path: phoneNumber); if (await canLaunchUrl(uri)) { // Launch the system dialer in the background launchUrl(uri); // Navigate to your custom call page Navigator.push( context, MaterialPageRoute( builder: (context) => CallPage(phoneNumber: phoneNumber), ), ); } else { print('Could not launch $uri'); } } // Function to send an SMS void _onTextPress(String phoneNumber) async { final uri = Uri(scheme: 'sms', path: phoneNumber); if (await canLaunchUrl(uri)) { // Launch the SMS app with the given phone number launchUrl(uri); } else { print('Could not launch SMS to $phoneNumber'); } } void _onNumberPress(String number) { setState(() { dialedNumber += number; _filterContacts(); }); } void _onDeletePress() { setState(() { if (dialedNumber.isNotEmpty) { dialedNumber = dialedNumber.substring(0, dialedNumber.length - 1); _filterContacts(); } }); } void _onClearPress() { setState(() { dialedNumber = ""; _filteredContacts = _allContacts; }); } // Placeholder function for adding contact void addContact(String number) { // This function is empty for now } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.black, body: Stack( children: [ Column( children: [ // Top half: Display contacts matching dialed number Expanded( flex: 2, child: Container( padding: const EdgeInsets.only( top: 42.0, left: 16.0, right: 16.0, bottom: 16.0), color: Colors.black, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: ListView( children: _filteredContacts.isNotEmpty ? _filteredContacts.map((contact) { return ListTile( title: Text( contact.displayName, style: const TextStyle(color: Colors.white), ), subtitle: contact.phones.isNotEmpty ? Text( contact.phones.first.number, style: const TextStyle( color: Colors.grey), ) : null, trailing: Row( mainAxisSize: MainAxisSize.min, children: [ // Call button IconButton( icon: Icon(Icons.phone, color: Colors.green[300], size: 20), onPressed: () { final phoneNumber = contact .phones.isNotEmpty ? contact.phones.first.number : null; if (phoneNumber != null) { _onCallPress(phoneNumber); } else { print( '${contact.displayName} has no phone number.'); } }, ), // Text button IconButton( icon: Icon(Icons.message, color: Colors.blue[300], size: 20), onPressed: () { final phoneNumber = contact .phones.isNotEmpty ? contact.phones.first.number : null; if (phoneNumber != null) { _onTextPress(phoneNumber); // Text functionality } else { print( '${contact.displayName} has no phone number.'); } }, ), ], ), onTap: () { // Handle contact selection if needed }, ); }).toList() : [ Center( child: Text('No contacts found', style: TextStyle(color: Colors.white))) ], ), ), ], ), ), ), // Bottom half: Dialpad and Dialed number display with erase button Expanded( flex: 2, child: Container( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ // Display dialed number with erase button Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Align( alignment: Alignment.center, child: Text( dialedNumber, style: const TextStyle( fontSize: 24, color: Colors.white), overflow: TextOverflow.ellipsis, ), ), ), IconButton( onPressed: _onClearPress, icon: const Icon(Icons.backspace, color: Colors.white), ), ], ), const SizedBox(height: 10), // Dialpad Expanded( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ _buildDialButton('1'), _buildDialButton('2'), _buildDialButton('3'), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ _buildDialButton('4'), _buildDialButton('5'), _buildDialButton('6'), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ _buildDialButton('7'), _buildDialButton('8'), _buildDialButton('9'), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ _buildDialButton('*'), _buildDialButton('0'), _buildDialButton('#'), ], ), ], ), ), ), ], ), ), ), // Add Contact Button with empty function call Padding( padding: const EdgeInsets.only(bottom: 20.0), child: FloatingActionButton( backgroundColor: Colors.blue, onPressed: () { addContact(dialedNumber); }, child: const Icon(Icons.person_add, color: Colors.white), ), ), ], ), // Top Row with Back Arrow Positioned( top: 40.0, left: 16.0, child: IconButton( icon: const Icon(Icons.arrow_back, color: Colors.white), onPressed: () { Navigator.pop(context); }, ), ), ], ), ); } Widget _buildDialButton(String number) { return ElevatedButton( onPressed: () => _onNumberPress(number), style: ElevatedButton.styleFrom( backgroundColor: Colors.black, shape: const CircleBorder(), padding: const EdgeInsets.all(16), ), child: Text( number, style: const TextStyle( fontSize: 24, color: Colors.white, ), ), ); } }