|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
|
|
|
import 'dart:async';
|
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
|
|
@ -11,6 +12,8 @@ import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:flutter_callkit_incoming/entities/call_event.dart';
|
|
|
|
import 'package:flutter_callkit_incoming/entities/call_event.dart';
|
|
|
|
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
|
|
|
|
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
|
|
|
|
|
|
|
|
import 'package:flutter_ios_voip_kit/call_state_type.dart';
|
|
|
|
|
|
|
|
import 'package:flutter_ios_voip_kit/flutter_ios_voip_kit.dart';
|
|
|
|
|
|
|
|
|
|
|
|
// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
|
|
|
|
// import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
|
|
|
|
import 'package:mohem_flutter_app/api/login_api_client.dart';
|
|
|
|
import 'package:mohem_flutter_app/api/login_api_client.dart';
|
|
|
|
@ -25,8 +28,6 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
|
|
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
|
|
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
|
|
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
|
|
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
|
|
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
|
|
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
|
|
|
import 'package:mohem_flutter_app/main.dart';
|
|
|
|
|
|
|
|
import 'package:mohem_flutter_app/models/chat/incoming_call_model.dart';
|
|
|
|
|
|
|
|
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
|
|
|
|
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
|
|
|
|
@ -48,7 +49,7 @@ class LoginScreen extends StatefulWidget {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class _LoginScreenState extends State<LoginScreen> {
|
|
|
|
class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
|
|
|
|
TextEditingController username = TextEditingController();
|
|
|
|
TextEditingController username = TextEditingController();
|
|
|
|
TextEditingController password = TextEditingController();
|
|
|
|
TextEditingController password = TextEditingController();
|
|
|
|
|
|
|
|
|
|
|
|
@ -69,6 +70,9 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
|
|
|
|
|
|
|
|
|
// late HmsApiAvailability hmsApiAvailability;
|
|
|
|
// late HmsApiAvailability hmsApiAvailability;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final voIPKit = FlutterIOSVoIPKit.instance;
|
|
|
|
|
|
|
|
late Timer timeOutTimer;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
super.initState();
|
|
|
|
@ -78,6 +82,67 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
|
// checkDeviceSafety();
|
|
|
|
// checkDeviceSafety();
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
callListeners();
|
|
|
|
callListeners();
|
|
|
|
|
|
|
|
WidgetsBinding.instance.addObserver(this);
|
|
|
|
|
|
|
|
setupVoIPCallBacks();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _timeOut({
|
|
|
|
|
|
|
|
int seconds = 15,
|
|
|
|
|
|
|
|
}) async {
|
|
|
|
|
|
|
|
timeOutTimer = Timer(Duration(seconds: seconds), () async {
|
|
|
|
|
|
|
|
print('🎈 example: timeOut');
|
|
|
|
|
|
|
|
var incomingCallerName = await voIPKit.getIncomingCallerName();
|
|
|
|
|
|
|
|
voIPKit.unansweredIncomingCall(
|
|
|
|
|
|
|
|
skipLocalNotification: false,
|
|
|
|
|
|
|
|
missedCallTitle: '📞 Missed call',
|
|
|
|
|
|
|
|
missedCallBody: 'There was a call from $incomingCallerName',
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setupVoIPCallBacks() {
|
|
|
|
|
|
|
|
if (Platform.isIOS) {
|
|
|
|
|
|
|
|
voIPKit.getVoIPToken().then((value) {
|
|
|
|
|
|
|
|
print('🎈 example: getVoIPToken: $value');
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
voIPKit.onDidUpdatePushToken = (String token) {
|
|
|
|
|
|
|
|
print('🎈 example: onDidUpdatePushToken: $token');
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
voIPKit.onDidReceiveIncomingPush = (
|
|
|
|
|
|
|
|
Map<String, dynamic> payload,
|
|
|
|
|
|
|
|
) async {
|
|
|
|
|
|
|
|
print('🎈 example: onDidReceiveIncomingPush $payload');
|
|
|
|
|
|
|
|
_timeOut();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
voIPKit.onDidRejectIncomingCall = (
|
|
|
|
|
|
|
|
String uuid,
|
|
|
|
|
|
|
|
String callerId,
|
|
|
|
|
|
|
|
) async {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
var logText = "did reject call $callerId";
|
|
|
|
|
|
|
|
} catch (err) {}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
voIPKit.onDidAcceptIncomingCall = (
|
|
|
|
|
|
|
|
String uuid,
|
|
|
|
|
|
|
|
String callerId,
|
|
|
|
|
|
|
|
) async {
|
|
|
|
|
|
|
|
var callerID = "did accept call $callerId";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
debugPrint(callerID);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await voIPKit.acceptIncomingCall(callerState: CallStateType.calling);
|
|
|
|
|
|
|
|
await voIPKit.callConnected();
|
|
|
|
|
|
|
|
Future.delayed(const Duration(milliseconds: 2500), () {
|
|
|
|
|
|
|
|
voIPKit.endCall().then((value) async {});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
timeOutTimer.cancel();
|
|
|
|
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// void checkDeviceSafety() async {
|
|
|
|
// void checkDeviceSafety() async {
|
|
|
|
@ -119,7 +184,7 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
|
case Event.ACTION_CALL_ENDED:
|
|
|
|
case Event.ACTION_CALL_ENDED:
|
|
|
|
Utils.saveStringFromPrefs("isIncomingCall", "false");
|
|
|
|
Utils.saveStringFromPrefs("isIncomingCall", "false");
|
|
|
|
Utils.saveStringFromPrefs("inComingCallData", "null");
|
|
|
|
Utils.saveStringFromPrefs("inComingCallData", "null");
|
|
|
|
FlutterCallkitIncoming.endAllCalls();
|
|
|
|
FlutterCallkitIncoming.endAllCalls();
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case Event.ACTION_CALL_TIMEOUT:
|
|
|
|
case Event.ACTION_CALL_TIMEOUT:
|
|
|
|
Utils.saveStringFromPrefs("isIncomingCall", "false");
|
|
|
|
Utils.saveStringFromPrefs("isIncomingCall", "false");
|
|
|
|
@ -137,17 +202,16 @@ class _LoginScreenState extends State<LoginScreen> {
|
|
|
|
if (calls.isNotEmpty) {
|
|
|
|
if (calls.isNotEmpty) {
|
|
|
|
Utils.hideLoading(context);
|
|
|
|
Utils.hideLoading(context);
|
|
|
|
var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage());
|
|
|
|
var pageRoute = MaterialPageRoute(builder: (context) => StartCallPage());
|
|
|
|
Navigator.push(context, pageRoute).whenComplete((){
|
|
|
|
Navigator.push(context, pageRoute).whenComplete(() {
|
|
|
|
checkFirebaseToken();
|
|
|
|
checkFirebaseToken();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}else{
|
|
|
|
} else {
|
|
|
|
FlutterCallkitIncoming.endAllCalls();
|
|
|
|
FlutterCallkitIncoming.endAllCalls();
|
|
|
|
Utils.showToast("Something wen't wrong");
|
|
|
|
Utils.showToast("Something wen't wrong");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
void dispose() {
|
|
|
|
super.dispose();
|
|
|
|
super.dispose();
|
|
|
|
|