WIP: callPageV2 #52

Draft
florian wants to merge 16 commits from callPageV2 into dev
Showing only changes of commit 5bb64d98b8 - Show all commits

View File

@ -24,26 +24,24 @@ class CallService {
CallService() { CallService() {
_channel.setMethodCallHandler((call) async { _channel.setMethodCallHandler((call) async {
final eventTime = DateTime.now().millisecondsSinceEpoch; print('CallService: Handling method call: ${call.method}, with args: ${call.arguments}');
final disconnectCause = call.arguments["disconnectCause"] ?? "none";
print('CallService: [${eventTime}ms] Handling method call: ${call.method} with args: ${call.arguments}, disconnectCause: $disconnectCause');
switch (call.method) { switch (call.method) {
case "callAdded": case "callAdded":
final phoneNumber = call.arguments["callId"] as String?; final phoneNumber = call.arguments["callId"] as String?;
final state = call.arguments["state"] as String?; final state = call.arguments["state"] as String?;
if (phoneNumber == null || state == null) { if (phoneNumber == null || state == null) {
print('CallService: [${eventTime}ms] Invalid callAdded args: $call.arguments'); print('CallService: Invalid callAdded args: $call.arguments');
return; return;
} }
final decodedPhoneNumber = Uri.decodeComponent(phoneNumber.replaceFirst('tel:', '')); final decodedPhoneNumber = Uri.decodeComponent(phoneNumber.replaceFirst('tel:', ''));
print('CallService: [${eventTime}ms] Decoded phone number: $decodedPhoneNumber'); print('CallService: Decoded phone number: $decodedPhoneNumber');
if (_activeCallNumber != decodedPhoneNumber) { if (_activeCallNumber != decodedPhoneNumber) {
currentPhoneNumber = decodedPhoneNumber; currentPhoneNumber = decodedPhoneNumber;
if (currentDisplayName == null || currentDisplayName == currentPhoneNumber) { if (currentDisplayName == null || currentDisplayName == currentPhoneNumber) {
await _fetchContactInfo(decodedPhoneNumber); await _fetchContactInfo(decodedPhoneNumber);
} }
} }
print('CallService: [${eventTime}ms] Call added, number: $currentPhoneNumber, displayName: $currentDisplayName, state: $state'); print('CallService: Call added, number: $currentPhoneNumber, displayName: $currentDisplayName, state: $state');
_callStateController.add(state); _callStateController.add(state);
if (state == "ringing") { if (state == "ringing") {
_handleIncomingCall(decodedPhoneNumber); _handleIncomingCall(decodedPhoneNumber);
@ -55,16 +53,13 @@ class CallService {
final state = call.arguments["state"] as String?; final state = call.arguments["state"] as String?;
wasPhoneLocked = call.arguments["wasPhoneLocked"] as bool? ?? false; wasPhoneLocked = call.arguments["wasPhoneLocked"] as bool? ?? false;
if (state == null) { if (state == null) {
print('CallService: [${eventTime}ms] Invalid callStateChanged args: $call.arguments'); print('CallService: Invalid callStateChanged args: $call.arguments');
return; return;
} }
print('CallService: [${eventTime}ms] State changed to $state, wasPhoneLocked: $wasPhoneLocked, disconnectCause: $disconnectCause'); print('CallService: State changed to $state, wasPhoneLocked: $wasPhoneLocked');
_callStateController.add(state); _callStateController.add(state);
if (state == "disconnected" || state == "disconnecting") { if (state == "disconnected" || state == "disconnecting") {
final closeStart = DateTime.now().millisecondsSinceEpoch;
print('CallService: [${closeStart}ms] Initiating closeCallPage for state: $state');
_closeCallPage(); _closeCallPage();
print('CallService: [${DateTime.now().millisecondsSinceEpoch}ms] closeCallPage completed');
if (wasPhoneLocked) { if (wasPhoneLocked) {
await _channel.invokeMethod("callEndedFromFlutter"); await _channel.invokeMethod("callEndedFromFlutter");
} }
@ -81,13 +76,13 @@ class CallService {
await _fetchContactInfo(currentPhoneNumber!); await _fetchContactInfo(currentPhoneNumber!);
} }
} else { } else {
print('CallService: [${eventTime}ms] Skipping fetch, active call: $_activeCallNumber, current: $currentPhoneNumber, displayName: $currentDisplayName'); print('CallService: Skipping fetch, active call: $_activeCallNumber, current: $currentPhoneNumber, displayName: $currentDisplayName');
} }
_navigateToCallPage(); _navigateToCallPage();
} else if (state == "ringing") { } else if (state == "ringing") {
final phoneNumber = call.arguments["callId"] as String?; final phoneNumber = call.arguments["callId"] as String?;
if (phoneNumber == null) { if (phoneNumber == null) {
print('CallService: [${eventTime}ms] Invalid ringing callId: $call.arguments'); print('CallService: Invalid ringing callId: $call.arguments');
return; return;
} }
final decodedPhoneNumber = Uri.decodeComponent(phoneNumber.replaceFirst('tel:', '')); final decodedPhoneNumber = Uri.decodeComponent(phoneNumber.replaceFirst('tel:', ''));
@ -103,12 +98,8 @@ class CallService {
case "callEnded": case "callEnded":
case "callRemoved": case "callRemoved":
wasPhoneLocked = call.arguments["wasPhoneLocked"] as bool? ?? false; wasPhoneLocked = call.arguments["wasPhoneLocked"] as bool? ?? false;
print('CallService: [${eventTime}ms] Call ended/removed, wasPhoneLocked: $wasPhoneLocked, disconnectCause: $disconnectCause'); print('CallService: Call ended/removed, wasPhoneLocked: $wasPhoneLocked');
_callStateController.add("disconnected");
final closeStart = DateTime.now().millisecondsSinceEpoch;
print('CallService: [${closeStart}ms] Initiating closeCallPage for callEnded/callRemoved');
_closeCallPage(); _closeCallPage();
print('CallService: [${DateTime.now().millisecondsSinceEpoch}ms] closeCallPage completed');
if (wasPhoneLocked) { if (wasPhoneLocked) {
await _channel.invokeMethod("callEndedFromFlutter"); await _channel.invokeMethod("callEndedFromFlutter");
} }
@ -121,7 +112,7 @@ class CallService {
final phoneNumber = call.arguments["phoneNumber"] as String?; final phoneNumber = call.arguments["phoneNumber"] as String?;
wasPhoneLocked = call.arguments["wasPhoneLocked"] as bool? ?? false; wasPhoneLocked = call.arguments["wasPhoneLocked"] as bool? ?? false;
if (phoneNumber == null) { if (phoneNumber == null) {
print('CallService: [${eventTime}ms] Invalid incomingCallFromNotification args: $call.arguments'); print('CallService: Invalid incomingCallFromNotification args: $call.arguments');
return; return;
} }
final decodedPhoneNumber = Uri.decodeComponent(phoneNumber); final decodedPhoneNumber = Uri.decodeComponent(phoneNumber);
@ -131,12 +122,12 @@ class CallService {
await _fetchContactInfo(decodedPhoneNumber); await _fetchContactInfo(decodedPhoneNumber);
} }
} }
print('CallService: [${eventTime}ms] Incoming call from notification: $decodedPhoneNumber, displayName: $currentDisplayName, wasPhoneLocked: $wasPhoneLocked'); print('CallService: Incoming call from notification: $decodedPhoneNumber, displayName: $currentDisplayName, wasPhoneLocked: $wasPhoneLocked');
_handleIncomingCall(decodedPhoneNumber); _handleIncomingCall(decodedPhoneNumber);
break; break;
case "audioStateChanged": case "audioStateChanged":
final route = call.arguments["route"] as int?; final route = call.arguments["route"] as int?;
print('CallService: [${eventTime}ms] Audio state changed, route: $route'); print('CallService: Audio state changed, route: $route');
break; break;
} }
}); });
@ -320,18 +311,18 @@ class CallService {
print('CallService: Cannot close page, context is null'); print('CallService: Cannot close page, context is null');
return; return;
} }
final currentRoute = ModalRoute.of(context)?.settings.name ?? 'unknown'; print('CallService: Closing call page, _isCallPageVisible: $_isCallPageVisible');
print('CallService: Closing call page, _isCallPageVisible: $_isCallPageVisible, Current Route: $currentRoute'); if (Navigator.canPop(context)) {
if (_isCallPageVisible && (currentRoute == '/call' || currentRoute == '/incoming_call')) {
print('CallService: Popping call page'); print('CallService: Popping call page');
Navigator.pop(context); Navigator.pop(context);
} else {
print('CallService: No call page to pop, _isCallPageVisible: $_isCallPageVisible, Current Route: $currentRoute');
}
_isCallPageVisible = false; _isCallPageVisible = false;
} else {
print('CallService: No page to pop');
}
_activeCallNumber = null; _activeCallNumber = null;
} }
Future<Map<String, dynamic>> makeGsmCall( Future<Map<String, dynamic>> makeGsmCall(
BuildContext context, { BuildContext context, {
required String phoneNumber, required String phoneNumber,
@ -374,13 +365,7 @@ class CallService {
final result = await _channel.invokeMethod('hangUpCall'); final result = await _channel.invokeMethod('hangUpCall');
print('CallService: hangUpCall result: $result'); print('CallService: hangUpCall result: $result');
final resultMap = Map<String, dynamic>.from(result as Map); final resultMap = Map<String, dynamic>.from(result as Map);
if (resultMap["status"] == "ended") { if (resultMap["status"] != "ended") {
final closeStart = DateTime.now().millisecondsSinceEpoch;
print('CallService: [${closeStart}ms] Initiating closeCallPage for hangUpCall');
_closeCallPage();
print('CallService: [${DateTime.now().millisecondsSinceEpoch}ms] closeCallPage completed');
} else {
print('CallService: Hang up failed, status: ${resultMap["status"]}');
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Failed to end call")), SnackBar(content: Text("Failed to end call")),
); );
@ -391,7 +376,6 @@ class CallService {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Error hanging up call: $e")), SnackBar(content: Text("Error hanging up call: $e")),
); );
_closeCallPage();
return {"status": "error", "message": e.toString()}; return {"status": "error", "message": e.toString()};
} }
} }