import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../features/call/call_page.dart'; class CallService { static const MethodChannel _channel = MethodChannel('call_service'); static String? currentPhoneNumber; // Add a GlobalKey for Navigator static final GlobalKey navigatorKey = GlobalKey(); CallService() { _channel.setMethodCallHandler((call) async { final context = navigatorKey.currentContext; if (context == null) return; switch (call.method) { case "callAdded": final phoneNumber = call.arguments["callId"] as String; // tel:1234567890 final state = call.arguments["state"] as String; currentPhoneNumber = phoneNumber.replaceFirst('tel:', ''); // Extract number if (state == "dialing" || state == "active") { Navigator.push( context, MaterialPageRoute( builder: (context) => CallPage( displayName: currentPhoneNumber!, // Replace with contact lookup if available phoneNumber: currentPhoneNumber!, thumbnail: null, ), ), ); } break; case "callStateChanged": final state = call.arguments["state"] as String; if (state == "disconnected" || state == "disconnecting") { Navigator.pop(context); } else if (state == "active") { // Ensure CallPage is shown if not already if (Navigator.canPop(context) && ModalRoute.of(context)?.settings.name != '/call') { Navigator.push( context, MaterialPageRoute( builder: (context) => CallPage( displayName: currentPhoneNumber!, phoneNumber: currentPhoneNumber!, thumbnail: null, ), ), ); } } break; case "callEnded": case "callRemoved": Navigator.pop(context); currentPhoneNumber = null; break; } }); } Future makeGsmCall( BuildContext context, { required String phoneNumber, String? displayName, Uint8List? thumbnail, }) async { try { currentPhoneNumber = phoneNumber; final result = await _channel.invokeMethod('makeGsmCall', {"phoneNumber": phoneNumber}); if (result["status"] == "calling") { // CallPage will be shown via MyInCallService callback } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Failed to initiate call")), ); } } catch (e) { print("Error making call: $e"); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Error making call: $e")), ); rethrow; } } Future hangUpCall(BuildContext context) async { try { final result = await _channel.invokeMethod('hangUpCall'); if (result["status"] == "ended") { // Navigator.pop will be handled by MyInCallService callback } } catch (e) { print("Error hanging up call: $e"); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Error hanging up call: $e")), ); rethrow; } } }