From 6e5234ec079889c023fa462cfc05f15937561a95 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Mon, 2 Sep 2024 12:05:26 +0300 Subject: [PATCH] streamed installed with adb --- lib/core/api.dart | 2 +- lib/core/base/base_app_client.dart | 45 +++++------ .../response_models/prayers_widget_model.dart | 26 ++---- lib/home/app_provider.dart | 79 +++++++++---------- lib/main.dart | 11 ++- lib/utils/signalR_utils.dart | 18 +++-- pubspec.yaml | 5 +- 7 files changed, 95 insertions(+), 91 deletions(-) diff --git a/lib/core/api.dart b/lib/core/api.dart index c7a66fc..6c54639 100644 --- a/lib/core/api.dart +++ b/lib/core/api.dart @@ -121,7 +121,7 @@ class API { await BaseAppClient.post(_weatherForecastGetBy5Days, body: body, onSuccess: (response, status) { - if (status == 200 && response["data"] != null) { + if (status == 200 && response["data"] != null && response["data"].isNotEmpty) { weathersWidgetModel = (response["data"] as List).map((e) => WeathersWidgetModel.fromJson(e)).toList().first; } }, diff --git a/lib/core/base/base_app_client.dart b/lib/core/base/base_app_client.dart index 9186227..b14ee46 100644 --- a/lib/core/base/base_app_client.dart +++ b/lib/core/base/base_app_client.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:http/http.dart' as http; import 'package:queuing_system/core/config/config.dart'; +import 'package:queuing_system/main.dart'; import 'package:queuing_system/utils/Utils.dart'; class BaseAppClient { @@ -12,30 +13,30 @@ class BaseAppClient { url = "$BASE_URL/api/PatientCall" + endPoint; // try { - log("URL : $url"); - log("Body : ${json.encode(body)}"); - if (await Utils.checkConnection()) { - final response = await http.post(Uri.parse(url), body: json.encode(body), headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }); - final int statusCode = response.statusCode; - if (statusCode < 200 || statusCode >= 400) { - if (onFailure != null) { - onFailure(Utils.generateContactAdminMsg(), statusCode); - } - } else { - log("Response: ${response.body.toString()}"); - var parsed = json.decode(response.body.toString()); - if (onSuccess != null) { - onSuccess(parsed, statusCode); - } + logger.i("URL : $url"); + logger.i("Body : ${json.encode(body)}"); + if (await Utils.checkConnection()) { + final response = await http.post(Uri.parse(url), body: json.encode(body), headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }); + final int statusCode = response.statusCode; + if (statusCode < 200 || statusCode >= 400) { + if (onFailure != null) { + onFailure(Utils.generateContactAdminMsg(), statusCode); } } else { - if (onFailure != null) { - onFailure('Please Check The Internet Connection', -1); + logger.i("Response: ${response.body.toString()}"); + var parsed = json.decode(response.body.toString()); + if (onSuccess != null) { + onSuccess(parsed, statusCode); } } + } else { + if (onFailure != null) { + onFailure('Please Check The Internet Connection', -1); + } + } // } catch (e) { // if (onFailure != null) { // onFailure(e.toString(), -1); @@ -51,8 +52,8 @@ class BaseAppClient { try { // String token = await sharedPref.getString(TOKEN); - log("URL GET: $url"); - log("Body GET: ${json.encode(body)}"); + logger.i("URL GET: $url"); + logger.i("Body GET: ${json.encode(body)}"); if (await Utils.checkConnection()) { final response = await http.get(Uri.parse(url), headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}); final int statusCode = response.statusCode; diff --git a/lib/core/response_models/prayers_widget_model.dart b/lib/core/response_models/prayers_widget_model.dart index 84f8a70..c643745 100644 --- a/lib/core/response_models/prayers_widget_model.dart +++ b/lib/core/response_models/prayers_widget_model.dart @@ -19,7 +19,7 @@ class PrayersWidgetModel { PrayersWidgetModel.fromJson(Map json) { fajr = dateTimeConversion(json['dateFor'], json['fajr']); sunrise = json['sunrise']; - dhuhr = dateTimeConversion(json['dateFor'], json['dhuhr']); + dhuhr = dateTimeConversion(json['dateFor'], getDhuhrData(json), isForDhuhr: true); asr = dateTimeConversion(json['dateFor'], json['asr']); sunset = json['sunset']; maghrib = dateTimeConversion(json['dateFor'], json['maghrib']); @@ -31,25 +31,15 @@ class PrayersWidgetModel { dateFor = json['dateFor']; } - static dateTimeConversion(String date, String time) { - return DateFormat('DD MMM yyyy hh:mm').parse("$date $time").millisecondsSinceEpoch; + static String getDhuhrData(dynamic json) { + return (json['dhuhr'] as String).contains('PM') ? json['dhuhr'] : json['dhuhr'] + ' PM'; } - Map toJson() { - final Map data = {}; - data['fajr'] = fajr; - data['sunrise'] = sunrise; - data['dhuhr'] = dhuhr; - data['asr'] = asr; - data['sunset'] = sunset; - data['maghrib'] = maghrib; - data['isha'] = isha; - data['imsak'] = imsak; - data['midnight'] = midnight; - data['firstthird'] = firstthird; - data['lastthird'] = lastthird; - data['dateFor'] = dateFor; - return data; + static dateTimeConversion(String date, String time, {bool isForDhuhr = false}) { + if (isForDhuhr) { + return DateFormat('DD MMM yyyy hh:mm a').parse("$date $time").millisecondsSinceEpoch; + } + return DateFormat('DD MMM yyyy hh:mm').parse("$date $time").millisecondsSinceEpoch; } @override diff --git a/lib/home/app_provider.dart b/lib/home/app_provider.dart index e3d33ae..b8c6e51 100644 --- a/lib/home/app_provider.dart +++ b/lib/home/app_provider.dart @@ -14,6 +14,7 @@ import 'package:queuing_system/core/response_models/prayers_widget_model.dart'; import 'package:queuing_system/core/response_models/rss_feed_model.dart'; import 'package:queuing_system/core/response_models/weathers_widget_model.dart'; import 'package:queuing_system/core/response_models/widgets_config_model.dart'; +import 'package:queuing_system/main.dart'; import 'package:queuing_system/utils/call_by_voice.dart'; import 'package:queuing_system/utils/call_type.dart'; import 'package:queuing_system/utils/signalR_utils.dart'; @@ -57,8 +58,8 @@ class AppProvider extends ChangeNotifier { } Future onVoiceCompleted() async { - log("My Value is in setCompletionHandler: $isVoiceActualCompletedGlobally"); - log("isQueuePatients.length in setCompletionHandler: ${isQueuePatients.length}"); + logger.i("My Value is in setCompletionHandler: $isVoiceActualCompletedGlobally"); + logger.i("isQueuePatients.length in setCompletionHandler: ${isQueuePatients.length}"); if (!isVoiceActualCompletedGlobally) { return; } @@ -86,13 +87,13 @@ class AppProvider extends ChangeNotifier { ); } - log("here logg: ${isQueuePatients.length}"); + logger.i("here logger.ig: ${isQueuePatients.length}"); if (isQueuePatients.isEmpty) { isCallingInProgress = false; } if (isApiCallNeeded && isQueuePatients.isEmpty) { - log("Setting isCallingInProgress : $isCallingInProgress"); + logger.i("Setting isCallingInProgress : $isCallingInProgress"); Timer(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec), () async { await callPatientsAPI(); isApiCallNeeded = false; @@ -134,7 +135,7 @@ class AppProvider extends ChangeNotifier { Future getInfoWidgetsConfigurationsFromServer() async { WidgetsConfigModel? widgetsConfigModel = await API.getWidgetConfigsFromServer(currentDeviceIp, onFailure: (error) { - log("Api call failed with this error: ${error.toString()}"); + logger.i("Api call failed with this error: ${error.toString()}"); }); if (widgetsConfigModel != null) currentWidgetsConfigModel = widgetsConfigModel; @@ -146,7 +147,7 @@ class AppProvider extends ChangeNotifier { Future getWeatherDetailsFromServer() async { WeathersWidgetModel? weathersWidgetModel = await API.getWeatherDetailsFromServer( (currentWidgetsConfigModel!.cityKey ?? "").toString(), - onFailure: (error) => log("Api call failed with this error: ${error.toString()}"), + onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}"), ); if (weathersWidgetModel != null) { @@ -159,7 +160,7 @@ class AppProvider extends ChangeNotifier { void getNextPrayerToShow() { final current = DateTime.now(); - log("Checking Namaz time Locally at ${current.toString()} and ${current.timeZoneName} "); + logger.i("Checking Namaz time Locally at ${current.toString()} and ${current.timeZoneName} "); if (DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!).isAfter(current)) { final namazTime = DateFormat('hh:mm a').format(DateTime.fromMillisecondsSinceEpoch(currentPrayersWidgetModel.fajr!)); @@ -197,13 +198,11 @@ class AppProvider extends ChangeNotifier { Future getPrayerDetailsFromServer() async { PrayersWidgetModel? prayersWidgetModel = await API.getPrayerDetailsFromServer( - latitude: currentWidgetsConfigModel!.projectLatitude ?? 0, - longitude: currentWidgetsConfigModel!.projectLongitude ?? 0, - onFailure: (error) => log("Api call failed with this error: ${error.toString()}")); + latitude: currentWidgetsConfigModel!.projectLatitude ?? 0, longitude: currentWidgetsConfigModel!.projectLongitude ?? 0, onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}")); if (prayersWidgetModel != null) { currentPrayersWidgetModel = prayersWidgetModel; - log("I got this data from Prayers: ${prayersWidgetModel.toString()}"); + logger.i("I got this data from Prayers: ${prayersWidgetModel.toString()}"); getNextPrayerToShow(); notifyListeners(); } @@ -212,11 +211,11 @@ class AppProvider extends ChangeNotifier { RssFeedModel currentRssFeedModel = RssFeedModel(); Future getRssFeedDetailsFromServer() async { - RssFeedModel? rssFeedModel = await API.getRssFeedDetailsFromServer(languageId: 0, onFailure: (error) => log("Api call failed with this error: ${error.toString()}")); + RssFeedModel? rssFeedModel = await API.getRssFeedDetailsFromServer(languageId: 0, onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}")); if (rssFeedModel != null) { currentRssFeedModel = rssFeedModel; - log("I got this data from RssFeed: ${currentRssFeedModel.rssFeed}"); + logger.i("I got this data from RssFeed: ${currentRssFeedModel.rssFeed}"); notifyListeners(); } } @@ -259,7 +258,7 @@ class AppProvider extends ChangeNotifier { counter++; - log("counterValue: $counter"); + logger.i("counterValue: $counter"); if (counter == 60 && currentWidgetsConfigModel!.isRssFeedReq!) { await getRssFeedDetailsFromServer(); @@ -299,7 +298,7 @@ class AppProvider extends ChangeNotifier { } Future callPatientsAPI() async { - log("calling callPatientsAPI"); + logger.i("calling callPatientsAPI"); patientTickets.clear(); API.getCallRequestInfoByClinicInfo(currentDeviceIp, onSuccess: (waitingCalls, isQueuePatientsCalls, callConfigs) async { @@ -321,13 +320,13 @@ class AppProvider extends ChangeNotifier { updatePatientTicket(patientTickets.first); } }, - onFailure: (error) => log("Api call failed with this error: ${error.toString()}")); + onFailure: (error) => logger.i("Api call failed with this error: ${error.toString()}")); } onPingReceived(data) async { - log("A new Ping Received when isQueuePatients: ${isQueuePatients.length}"); - log("isCallingInProgress from onPingReceived: $isCallingInProgress"); - log("isApiCallNeeded: $isApiCallNeeded"); + logger.i("A new Ping Received when isQueuePatients: ${isQueuePatients.length}"); + logger.i("isCallingInProgress from onPingReceived: $isCallingInProgress"); + logger.i("isApiCallNeeded: $isApiCallNeeded"); if (patientTickets.isNotEmpty) { if (isCallingInProgress) { isApiCallNeeded = true; @@ -372,16 +371,16 @@ class AppProvider extends ChangeNotifier { // } voiceCallPatientTicket(PatientTicketModel patientTicket, String calledFrom) async { - log("voiceCallPatientTicket calledFrom : $calledFrom"); + logger.i("voiceCallPatientTicket calledFrom : $calledFrom"); currentPatient = patientTicket; isCallingInProgress = true; - log("Setting isCallingInProgress : $isCallingInProgress"); + logger.i("Setting isCallingInProgress : $isCallingInProgress"); - log("isVoiceReq: ${patientTicket.isVoiceReq}"); - log("voiceCaller: ${voiceCaller == null}"); - log("isQueue: ${patientTicket.isQueue}"); - log("isToneReq: ${patientTicket.isToneReq}"); + logger.i("isVoiceReq: ${patientTicket.isVoiceReq}"); + logger.i("voiceCaller: ${voiceCaller == null}"); + logger.i("isQueue: ${patientTicket.isQueue}"); + logger.i("isToneReq: ${patientTicket.isToneReq}"); if (patientTicket.isToneReq && !patientTicket.isQueue) { audioPlayer.setAsset("assets/tones/call_tone.mp3"); @@ -390,7 +389,7 @@ class AppProvider extends ChangeNotifier { } if (patientTicket.isVoiceReq && voiceCaller == null && !patientTicket.isQueue) { - log("patientTicket.voiceLanguage: ${patientTicket.voiceLanguage}"); + logger.i("patientTicket.voiceLanguage: ${patientTicket.voiceLanguage}"); final postVoice = getCallTypeText(patientTicket); voiceCaller = CallByVoice( preVoice: patientTicket.ticketNoText, @@ -402,11 +401,11 @@ class AppProvider extends ChangeNotifier { await voiceCaller!.startCalling(patientTicket.queueNo.trim().toString() != patientTicket.callNoStr.trim().toString()).whenComplete(() { voiceCaller = null; onVoiceCompleted(); - log("Completed Calling!! ${isQueuePatients.length}"); + logger.i("Completed Calling!! ${isQueuePatients.length}"); }); } else { isCallingInProgress = false; - log("Setting isCallingInProgress : $isCallingInProgress"); + logger.i("Setting isCallingInProgress : $isCallingInProgress"); if (isApiCallNeeded) { Timer(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec), () async { await callPatientsAPI(); @@ -419,7 +418,7 @@ class AppProvider extends ChangeNotifier { Future listenAudioPlayerEvents() async { audioPlayer.playerStateStream.listen((playerState) async { if (playerState.processingState == ProcessingState.completed) { - log("Tone Completed"); + logger.i("Tone Completed"); if (currentPatient.isVoiceReq) { isCallingInProgress = true; @@ -429,7 +428,7 @@ class AppProvider extends ChangeNotifier { if (isQueuePatients.isNotEmpty) { isCallingInProgress = true; - log("isQueuePatients.length 1: ${isQueuePatients.length}"); + logger.i("isQueuePatients.length 1: ${isQueuePatients.length}"); // for (int i = 0; i < length; i++) { await Future.delayed(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec)).whenComplete(() async { PatientTicketModel temp = PatientTicketModel(); @@ -445,7 +444,7 @@ class AppProvider extends ChangeNotifier { patientTickets.add(temp); } notifyListeners(); - log("isQueuePatients.length 2: ${isQueuePatients.length}"); + logger.i("isQueuePatients.length 2: ${isQueuePatients.length}"); if (isQueuePatients.isNotEmpty) { await voiceCallPatientTicket(patientTickets.first, "listenAudioPlayerEvents"); @@ -458,7 +457,7 @@ class AppProvider extends ChangeNotifier { isCallingInProgress = false; } if (isApiCallNeeded && isQueuePatients.isEmpty) { - log("Setting isCallingInProgress : $isCallingInProgress"); + logger.i("Setting isCallingInProgress : $isCallingInProgress"); Timer(Duration(seconds: patientCallConfigurations.concurrentCallDelaySec), () async { await callPatientsAPI(); isApiCallNeeded = false; @@ -472,9 +471,9 @@ class AppProvider extends ChangeNotifier { // if (patientTickets.isNotEmpty) { // List _ticketsToUpdate = patientTickets.where((t) => t.callUpdated == false).toList(); // API.callUpdateNotIsQueueRecordByIDAsync(currentDeviceIp, ticket: _ticketsToUpdate.first, onSuccess: (ticketsUpdated) { - // log("[${ticketsUpdated.length}] Tickets Updated: $ticketsUpdated"); + // logger.i("[${ticketsUpdated.length}] Tickets Updated: $ticketsUpdated"); // }, onFailure: (e) { - // log(" Tickets Update Failed with : ${e.toString()}"); + // logger.i(" Tickets Update Failed with : ${e.toString()}"); // }); // } // } @@ -482,24 +481,24 @@ class AppProvider extends ChangeNotifier { updatePatientTicket(PatientTicketModel patientTicket) { if (!patientTicket.isQueue) { API.callUpdateNotIsQueueRecordByIDAsync(currentDeviceIp, ticket: patientTicket, onSuccess: (ticketsUpdated) { - log("[${patientTicket.callNoStr}] Ticket Updated: $ticketsUpdated"); + logger.i("[${patientTicket.callNoStr}] Ticket Updated: $ticketsUpdated"); }, onFailure: (e) { - log(" Tickets Update ${patientTicket.callNoStr} Failed with Error : ${e.toString()}"); + logger.i(" Tickets Update ${patientTicket.callNoStr} Failed with Error : ${e.toString()}"); }); } } onConnect() { - log("SignalR: onConnect"); + logger.i("SignalR: onConnect"); } onDisconnect(exception) { - log("SignalR: onDisconnect"); - signalRHelper.startSignalRConnection(currentDeviceIp, onUpdateAvailable: onPingReceived, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect); + logger.i("SignalR: onDisconnect"); + signalRHelper.startSignalRConnection(currentDeviceIp, onUpdateAvailable: onPingReceived, onConnect: onConnect, onConnecting: onConnecting, onDisconnect: onDisconnect,); } onConnecting() { - log("SignalR: onConnecting"); + logger.i("SignalR: onConnecting"); } listenNetworkConnectivity() async { diff --git a/lib/main.dart b/lib/main.dart index 9b3b1c6..f24b04b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,14 +3,21 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:logger/logger.dart'; import 'package:provider/provider.dart'; import 'package:queuing_system/core/api.dart'; import 'package:queuing_system/home/app_provider.dart'; import 'package:wakelock/wakelock.dart'; - import 'core/config/size_config.dart'; import 'home/home_screen.dart'; -// import 'home/home_screen_bkp.dart'; + +Logger logger = Logger( + level: Level.debug, + printer: PrettyPrinter( + printEmojis: false, + colors: true, + printTime: false, + )); void main() { //TODO: WE HAVE TO UPDATE THIS BEFORE GOING LIVE. diff --git a/lib/utils/signalR_utils.dart b/lib/utils/signalR_utils.dart index 6ee1d20..3ebd26e 100644 --- a/lib/utils/signalR_utils.dart +++ b/lib/utils/signalR_utils.dart @@ -1,9 +1,9 @@ import 'dart:developer'; import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:http/io_client.dart'; import 'package:queuing_system/core/config/config.dart'; +import 'package:queuing_system/main.dart'; import 'package:signalr_core/signalr_core.dart'; /* @@ -26,10 +26,14 @@ class SignalRHelper { // "https://VCallApi.hmg.com/WebRTCHub?source=mobile&username=2001273"; HubConnection? connection; - startSignalRConnection(String deviceIp, - {required Function(dynamic) onUpdateAvailable, required VoidCallback onConnect, required Function(dynamic) onDisconnect, required VoidCallback onConnecting}) async { - log("Connecting Signal R with: $deviceIp"); - + startSignalRConnection( + String deviceIp, { + required Function(dynamic) onUpdateAvailable, + required VoidCallback onConnect, + required Function(dynamic) onDisconnect, + required VoidCallback onConnecting, + }) async { + logger.i("Connecting Signal R with: $deviceIp"); final url = hubBaseURL + "?IPAddress=$deviceIp"; // final url = hubBaseURL; connection = HubConnectionBuilder() @@ -40,12 +44,14 @@ class SignalRHelper { // transport: HttpTransportType.webSockets, logging: (level, message) => log(message), )) + .withAutomaticReconnect() .build(); connection!.serverTimeoutInMilliseconds = 120000; connection!.onclose(onDisconnect); connection!.onreconnecting((exception) => onConnecting()); connection!.onreconnected((connectionId) => onConnect()); + connection!.onreconnected((connectionId) => onConnect()); connection!.on('addChatMessage', (message) => onUpdateAvailable(message)); @@ -58,7 +64,7 @@ class SignalRHelper { bool getConnectionState() { if (connection == null) return false; - log("connectionState: ${connection!.state}"); + logger.i("connectionState: ${connection!.state}"); if (connection!.state == HubConnectionState.connected || connection!.state == HubConnectionState.connecting) return true; if (connection!.state == HubConnectionState.disconnected || connection!.state == HubConnectionState.disconnecting) return false; return false; diff --git a/pubspec.yaml b/pubspec.yaml index b609e8f..385f42a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,14 +40,15 @@ dependencies: http: ^0.13.0 blinking_text: ^1.0.2 just_audio: 0.9.31 -# flutter_tts: 3.6.3 - flutter_tts: ^4.0.2 + flutter_tts: 3.6.3 +# flutter_tts: ^4.0.2 wakelock: ^0.6.2 shared_preferences: ^2.2.1 #signalr core signalr_core: ^1.1.1 intl: ^0.18.1 marquee: ^2.2.3 + logger: ^2.4.0