From 54f6c7c185340095bb108cc5e438a2cd2516ff37 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Tue, 10 Jan 2023 14:32:39 +0300 Subject: [PATCH] Pushing after Testing on Panel --- assets/images/undraw_connected_world_wuay.png | Bin 0 -> 16393 bytes ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Podfile | 2 +- ios/Podfile.lock | 24 ++- ios/Runner.xcodeproj/project.pbxproj | 6 +- ios/Runner/Info.plist | 2 + lib/core/api.dart | 88 +++++---- lib/home/home_screen.dart | 168 +++++++++++------- lib/utils/call_by_voice.dart | 22 +-- lib/utils/signalR_utils.dart | 3 +- 10 files changed, 192 insertions(+), 125 deletions(-) create mode 100644 assets/images/undraw_connected_world_wuay.png diff --git a/assets/images/undraw_connected_world_wuay.png b/assets/images/undraw_connected_world_wuay.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8eb47d399bded5428dcf4b5359119270de8231 GIT binary patch literal 16393 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 L{^P1gHgEqwD0&0? literal 0 HcmV?d00001 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 8d4492f..9625e10 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/ios/Podfile b/ios/Podfile index 1e8c3c9..88359b2 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0cb89ab..305bc17 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,29 +1,47 @@ PODS: + - audio_session (0.0.1): + - Flutter - connectivity (0.0.1): - Flutter - Reachability - Flutter (1.0.0) + - just_audio (0.0.1): + - Flutter + - path_provider_ios (0.0.1): + - Flutter - Reachability (3.2) DEPENDENCIES: + - audio_session (from `.symlinks/plugins/audio_session/ios`) - connectivity (from `.symlinks/plugins/connectivity/ios`) - Flutter (from `Flutter`) + - just_audio (from `.symlinks/plugins/just_audio/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) SPEC REPOS: trunk: - Reachability EXTERNAL SOURCES: + audio_session: + :path: ".symlinks/plugins/audio_session/ios" connectivity: :path: ".symlinks/plugins/connectivity/ios" Flutter: :path: Flutter + just_audio: + :path: ".symlinks/plugins/just_audio/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" SPEC CHECKSUMS: + audio_session: 4f3e461722055d21515cf3261b64c973c062f345 connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 -PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c +PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 7046dae..6364bea 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -340,7 +340,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -418,7 +418,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -467,7 +467,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 81eb537..256543f 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -43,5 +43,7 @@ UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone + diff --git a/lib/core/api.dart b/lib/core/api.dart index 8f747ae..4f9c756 100644 --- a/lib/core/api.dart +++ b/lib/core/api.dart @@ -1,47 +1,57 @@ - import 'package:flutter/cupertino.dart'; import 'package:queuing_system/core/base/base_app_client.dart'; import 'package:queuing_system/core/response_model/patient_call.dart'; const _getCallRequestInfoByClinicInfo = "/GetCallRequestInfoByClinincInfo"; -const _call_UpdateNotIsQueueRecordByIDAsync = "/Call_UpdateNotIsQueueRecordByIDAsync"; - -class API{ - - static GetCallRequestInfoByClinincInfo(String deviceIp, {@required Function(List, List) onSuccess, @required Function(dynamic) onFailure}) async{ - final body = { "IPAdress" : deviceIp }; - BaseAppClient.post(_getCallRequestInfoByClinicInfo, body: body, onSuccess: (response, status){ - if(status == 200){ - final calledByNurse = (response["CalledByNurse"] as List).map((j) => Tickets.fromJson(j)).toList(); - final clinicCurrentPatient = (response["ClinicCurrentPatient"] as List).map((j) => Tickets.fromJson(j)).toList(); - onSuccess(calledByNurse, clinicCurrentPatient); - }else{ - onFailure(response); - } - }, onFailure: (error, status) => onFailure(error)); +const _call_UpdateNotIsQueueRecordByIDAsync = "/Call_UpdateNotIsQueueRecordByID"; + +class API { + static GetCallRequestInfoByClinincInfo(String deviceIp, {@required Function(List) onSuccess, @required Function(dynamic) onFailure}) async { + final body = {"IPAdress": deviceIp}; + BaseAppClient.post(_getCallRequestInfoByClinicInfo, + body: body, + onSuccess: (response, status) { + if (status == 200) { + var calledByNurse = (response["CalledByNurse"] as List).map((j) => Tickets.fromJson(j)).toList(); + final patients = (response["ClinicCurrentPatient"] as List).map((j) => Tickets.fromJson(j)).toList(); + calledByNurse.addAll(patients); + + calledByNurse.sort((a, b) => a.callNo.compareTo(b.callNo)); + + // final clinicCurrentPatient = (response["ClinicCurrentPatient"] as List).map((j) => Tickets.fromJson(j)).toList(); + onSuccess(calledByNurse); + } else { + onFailure(response); + } + }, + onFailure: (error, status) => onFailure(error)); } - // static Call_UpdateNotIsQueueRecordByIDAsync(String deviceIp, {@required List tickets, @required Function(List) onSuccess, @required Function(dynamic) onFailure}) async{ - // if(tickets.isEmpty) { - // return; - // } - // - // List _ticketsUpdated = []; - // - // for (var ticket in tickets) { - // final body = { "CallID" : ticket.callNo}; - // await BaseAppClient.post(_call_UpdateNotIsQueueRecordByIDAsync, body: body, onSuccess: (response, status){ - // if(status == 200){ - // ticket.call_updated = true; - // _ticketsUpdated.add(ticket); - // } - // }, onFailure: (error, status) => onFailure(error)); - // } - // - // if(_ticketsUpdated.isNotEmpty) { - // onSuccess(_ticketsUpdated); - // }else{ - // onFailure(false); - // } - // } + static Call_UpdateNotIsQueueRecordByIDAsync(String deviceIp, {@required List tickets, @required Function(List) onSuccess, @required Function(dynamic) onFailure}) async { + if (tickets.isEmpty) { + return; + } + + List _ticketsUpdated = []; + + for (var ticket in tickets) { + final body = {"CallID": ticket.callNo}; + await BaseAppClient.post(_call_UpdateNotIsQueueRecordByIDAsync, + body: body, + onSuccess: (response, status) { + print("response: $response"); + if (status == 200) { + ticket.call_updated = true; + _ticketsUpdated.add(ticket); + } + }, + onFailure: (error, status) => onFailure(error)); + } + + if (_ticketsUpdated.isNotEmpty) { + onSuccess(_ticketsUpdated); + } else { + onFailure(false); + } + } } diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index db9ea26..2ccf9f6 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -4,6 +4,7 @@ import 'package:connectivity/connectivity.dart'; import 'package:flutter/material.dart'; import 'package:queuing_system/core/api.dart'; import 'package:queuing_system/core/base/app_scaffold_widget.dart'; +import 'package:queuing_system/core/config/config.dart'; import 'package:queuing_system/core/config/size_config.dart'; import 'package:queuing_system/core/response_model/patient_call.dart'; import 'package:queuing_system/header/app_header.dart'; @@ -14,7 +15,10 @@ import 'package:queuing_system/utils/signalR_utils.dart'; import 'package:queuing_system/utils/utils.dart'; import 'package:queuing_system/widget/data_display/app_texts_widget.dart'; -var DEVICE_IP = "10.10.14.11"; // Testing IP +var DEVICE_IP = "10.10.14.11"; // Testing IP +// var DEVICE_IP = "10.10.14.11"; // Testing IP +// var DEVICE_IP = "10.10.15.11"; + // var DEVICE_IP = "10.70.249.21"; // (Make sure by Haroon before use it) Production IP class MyHomePage extends StatefulWidget { @@ -30,31 +34,25 @@ class _MyHomePageState extends State { List waitings = []; List currents = []; + bool isLoading = false; + @override void dispose() { super.dispose(); } - @override void initState() { listenNetworkConnectivity(); - if (!signalRHelper.getConnectionState()) { - signalRHelper.startSignalRConnection( - DEVICE_IP, - onUpdateAvailable: onUpdateAvailable, - onConnect: onConnect, - onConnecting: onConnecting, - onDisconnect: onDisconnect - ); + signalRHelper.startSignalRConnection(DEVICE_IP, onUpdateAvailable: onUpdateAvailable, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect); } - - super.initState(); } + TextEditingController controller = TextEditingController(); + @override Widget build(BuildContext context) { return AppScaffold( @@ -66,48 +64,91 @@ class _MyHomePageState extends State { width: double.infinity, child: Row( crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const SizedBox(width: 20), - AppText( - "Powered By", - fontSize: SizeConfig.getWidthMultiplier() * 2.6, - fontFamily: 'Poppins-Medium.ttf', + Row( + children: [ + const SizedBox(width: 20), + AppText( + "Powered By", + fontSize: SizeConfig.getWidthMultiplier() * 2.6, + fontFamily: 'Poppins-Medium.ttf', + ), + const SizedBox(width: 20), + Image.asset( + "assets/images/cloud_logo.png", + height: SizeConfig.getHeightMultiplier() * 4, + ), + ], ), - const SizedBox(width: 20), - Image.asset( - "assets/images/cloud_logo.png", - height: SizeConfig.getHeightMultiplier() * 4, + Row( + children: [ + const SizedBox(width: 60), + SizedBox( + width: 200, + child: TextField( + controller: controller, + )), + const SizedBox(width: 30), + isLoading + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: onUpdateIPPressed, + child: const Text( + "Update IP", + style: TextStyle(color: Colors.white), + ), + style: ElevatedButton.styleFrom(backgroundColor: AppGlobal.appRedColor), + ), + const SizedBox(width: 30), + Text("IP: $DEVICE_IP", style: const TextStyle(fontWeight: FontWeight.w600)), + const SizedBox(width: 20), + ], ), - const SizedBox(width: 20), ], ), ), ); } - Widget content(){ + onUpdateIPPressed() async { + if (controller.text.isNotEmpty) { + isLoading = true; + setState(() {}); + DEVICE_IP = controller.text; + + await signalRHelper.connection.stop(); + if (!signalRHelper.getConnectionState()) { + await signalRHelper.startSignalRConnection(DEVICE_IP, onUpdateAvailable: onUpdateAvailable, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect); + } + + controller.clear(); + waitings.clear(); + isLoading = false; + setState(() {}); + } + } + + Widget content() { // waitings = waitings.sublist(0,3); voiceCall(); - if(waitings.isEmpty) { + if (waitings.isEmpty) { // No Patient in Queue return noPatientInQueue(); - - }else if(waitings.length > 4){ + } else if (waitings.length > 4) { // Return Content With Side List return priorityTicketsWithSideList(waitings); - - }else{ + } else { // Return Content In Center Aligned return priorityTickets(waitings); - } } - CallByVoice voiceCaller; - voiceCall() async{ - if(waitings.isNotEmpty && voiceCaller == null){ + + voiceCall() async { + if (waitings.isNotEmpty && voiceCaller == null) { final postVoice = waitings.first.getCallType().audio('en'); voiceCaller = CallByVoice(waitings.first.callNo.toString(), preVoice: 'ticket_number.mp3', postVoice: postVoice, lang: 'en'); await voiceCaller.start(); @@ -115,54 +156,47 @@ class _MyHomePageState extends State { } } - onUpdateAvailable(data) async{ - API.GetCallRequestInfoByClinincInfo( - DEVICE_IP, - onSuccess: (waitingCalls, currentInClinic){ - - setState(() { - waitings = waitingCalls; - currents = currentInClinic; - }); - - log("\n\n"); - log("--------------------"); - log("Current: $currentInClinic"); - log("Waiting: $waitingCalls"); - log("--------------------"); - log("\n\n"); - - updateTickets(); - - }, onFailure: (error){ - - }); + onUpdateAvailable(data) async { + API.GetCallRequestInfoByClinincInfo(DEVICE_IP, onSuccess: (waitingCalls) { + setState(() { + waitings = waitingCalls; + // currents = currentInClinic; + }); + + log("\n\n"); + log("--------------------"); + // log("Current: $currentInClinic"); + log("Waiting: $waitingCalls"); + log("--------------------"); + log("\n\n"); + + updateTickets(); + }, onFailure: (error) {}); } - - updateTickets(){ - // List _ticketsToUpdate = waitings.where((t) => t.call_updated == false); - // API.Call_UpdateNotIsQueueRecordByIDAsync(DEVICE_IP, tickets: _ticketsToUpdate, onSuccess: (tickets_updated){ - // print("[${tickets_updated.length}] Tickets Updated: $tickets_updated"); - // }, onFailure: (e){ - // - // }); + updateTickets() { + List _ticketsToUpdate = waitings.where((t) => t.call_updated == false).toList(); + API.Call_UpdateNotIsQueueRecordByIDAsync(DEVICE_IP, tickets: _ticketsToUpdate, onSuccess: (tickets_updated) { + print("[${tickets_updated.length}] Tickets Updated: $tickets_updated"); + }, onFailure: (e) { + print("API UPDate Tickets Failed with : ${e.toString()}"); + }); } - - onConnect(){ + onConnect() { log("SignalR: onConnect"); } - onDisconnect(exception){ + onDisconnect(exception) { log("SignalR: onDisconnect"); + signalRHelper.startSignalRConnection(DEVICE_IP, onUpdateAvailable: onUpdateAvailable, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect); } - onConnecting(){ + onConnecting() { log("SignalR: onConnecting"); } - listenNetworkConnectivity() async{ + listenNetworkConnectivity() async { Connectivity().onConnectivityChanged.listen((event) { switch (event) { case ConnectivityResult.wifi: diff --git a/lib/utils/call_by_voice.dart b/lib/utils/call_by_voice.dart index 044c1c7..d58ec61 100644 --- a/lib/utils/call_by_voice.dart +++ b/lib/utils/call_by_voice.dart @@ -1,9 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:just_audio/just_audio.dart'; -import 'package:queuing_system/utils/call_type.dart'; - -class CallByVoice{ +class CallByVoice { final String lang; final String preVoice; final String ticketNo; @@ -12,19 +10,19 @@ class CallByVoice{ CallByVoice(this.ticketNo, {this.lang = 'en', @required this.preVoice, @required this.postVoice}); final _player = AudioPlayer(); - start() async{ + start() async { // Create Pre Voice Players - if(preVoice != null && preVoice.isNotEmpty) { + if (preVoice != null && preVoice.isNotEmpty) { await _player.setAsset('assets/voice_$lang/$preVoice'); await _player.play(); } // Create Ticket Number Voice Players final characters = ticketNo.characters.toList(); - for(int i = 0; i< characters.length; i++){ + for (int i = 0; i < characters.length; i++) { final no = characters[i]; - if(no.isNotEmpty){ + if (no.isNotEmpty) { await Future.delayed(const Duration(milliseconds: 200)); await _player.stop(); @@ -33,9 +31,8 @@ class CallByVoice{ } } - // Create Post Voice Players - if(postVoice != null && postVoice.isNotEmpty) { + if (postVoice != null && postVoice.isNotEmpty) { await Future.delayed(const Duration(milliseconds: 1000)); await _player.stop(); @@ -45,4 +42,9 @@ class CallByVoice{ _player.dispose(); } -} \ No newline at end of file + + stop() async { + await _player.stop(); + } + +} diff --git a/lib/utils/signalR_utils.dart b/lib/utils/signalR_utils.dart index eb7ebcc..505feb1 100644 --- a/lib/utils/signalR_utils.dart +++ b/lib/utils/signalR_utils.dart @@ -25,7 +25,8 @@ class SignalRHelper{ startSignalRConnection(String deviceIp, {@required Function(dynamic) onUpdateAvailable, @required VoidCallback onConnect, @required Function(dynamic) onDisconnect, @required VoidCallback onConnecting}) async { // Hardcoded IP For Testing - deviceIp = "10.10.14.11"; + // deviceIp = "10.10.14.11"; + print("Connecting Signal R with: $deviceIp"); final url = hubBaseURL+"?IPAddress=$deviceIp"; connection = HubConnectionBuilder()