WIP: callPageV2 #52
@ -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()};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user