diff --git a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt index 9a384b3..4aa324d 100644 --- a/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/hmg_qline/hmg_qline/MainActivity.kt @@ -17,32 +17,6 @@ import java.io.File class MainActivity : FlutterActivity() { private val CHANNEL = "com.example.hmg_qline/foreground" - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - // Keep screen on at all times (AC-powered kiosk display) - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) - window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) - window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD) - - // Disable sleep/screensaver for kiosk mode - window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) - - // Log if app was restarted - if (intent.getBooleanExtra("restarted", false)) { - Log.d("MainActivity", "App restarted successfully") - } - - // Log if launched from boot - if (intent.getBooleanExtra("launched_from_boot", false)) { - Log.d("MainActivity", "App launched from boot") - // Give system time to settle after boot - Thread.sleep(2000) - } - - Log.d("MainActivity", "MainActivity created - Kiosk display mode active") - } companion object { private const val TAG = "MainActivity" @@ -349,6 +323,15 @@ class MainActivity : FlutterActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // Keep screen on at all times (AC-powered kiosk display) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) + window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) + window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD) + + // Disable sleep/screensaver for kiosk mode + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) + // Log if app was restarted if (intent.getBooleanExtra("restarted", false)) { Log.d(TAG, "App restarted successfully") @@ -361,6 +344,8 @@ class MainActivity : FlutterActivity() { Thread.sleep(2000) } + Log.d(TAG, "MainActivity created - Kiosk display mode active") + // Schedule daily restart alarm at 00:15 (12:15 AM) // This ensures the alarm is always set when app starts initializeRestartAlarm() diff --git a/lib/constants/app_constants.dart b/lib/constants/app_constants.dart index 1cc3874..93d7740 100644 --- a/lib/constants/app_constants.dart +++ b/lib/constants/app_constants.dart @@ -8,7 +8,7 @@ bool useTestIP = false; bool isNeedToBreakVoiceForArabic = true; bool isSpeechCompleted = true; -bool isAndroid14 = true; +bool isAndroid14 = false; class AppStrings { static String timeRemainingText = "Time Remaining"; @@ -174,7 +174,15 @@ class AppConstants { // Maximum log file size in bytes before rotation/clearing. Default 2 MB. static int maxLogFileSizeBytes = 2 * 1024 * 1024; - // Takhasusi Main Branch IPs - These devices use getTurnsByOrientationForOlderVersions() + // Project IDs for different branches + static const int projectIdTakhasusiMain = 16; + static const int projectIdSuwaidi = 17; + static const int projectIdKhobar = 60; + static const int projectIdTakhasusiWomen = 140; + + // Deprecated: IP-based detection - now using projectID from server + // Kept for backward compatibility reference only + @Deprecated('Use projectID-based detection instead') static const List takhasusiMainBranchIps = [ '10.70.194.87', '10.70.6.139', @@ -268,13 +276,7 @@ class MockJsonRepo { id: 189805, patientID: 4292695, queueNo: 'W-T-4', - laBQGroupID: null, - queueNo: 'FMC W-T-4', - counterBatchNo: null, - calledBy: null, - calledOn: null, - servedOn: null, - patientName: null, + laBQGroupID: 0, mobileNo: '0598544522', patientEmail: 'munira.ali@hotmail.com', preferredLang: 2, diff --git a/lib/main.dart b/lib/main.dart index 8c08bb6..08be82e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,12 +53,16 @@ class MyApp extends StatelessWidget { log("Constraints: maxWidth=${constraints.maxWidth}, maxHeight=${constraints.maxHeight}"); log("Is Portrait (OrientationBuilder): ${orientation == Orientation.portrait}"); log("Is Landscape (OrientationBuilder): ${orientation == Orientation.landscape}"); + log("Device Pixel Ratio: ${MediaQuery.of(context).devicePixelRatio}"); + log("Physical Size: width=${constraints.maxWidth * MediaQuery.of(context).devicePixelRatio}, height=${constraints.maxHeight * MediaQuery.of(context).devicePixelRatio}"); + log("SizeConfig - realWidth: ${SizeConfig.realScreenWidth}, realHeight: ${SizeConfig.realScreenHeight}"); + log("SizeConfig - isPortrait: ${SizeConfig.isPortrait}, screenWidth: ${SizeConfig.screenWidth}, screenHeight: ${SizeConfig.screenHeight}"); log("====================================="); SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); - if (!isAndroid14) { - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - } + // if (!isAndroid14) { + // SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + // } return MultiProvider( providers: [ ChangeNotifierProvider( diff --git a/lib/models/global_config_model.dart b/lib/models/global_config_model.dart index 2a9f8f7..728d924 100644 --- a/lib/models/global_config_model.dart +++ b/lib/models/global_config_model.dart @@ -82,8 +82,6 @@ class GlobalConfigurationsModel { List? kioskLanguageConfigList; bool isFromTakhasusiMain = false; - bool globalClinicPrefixReq = false; - bool clinicPrefixReq = true; String vitalSignTextEng = "Vital Sign"; String doctorTextEng = "Doctor"; @@ -186,8 +184,6 @@ class GlobalConfigurationsModel { this.kioskQueueList, this.kioskLanguageConfigList, this.isFromTakhasusiMain = false, - this.globalClinicPrefixReq = false, - this.clinicPrefixReq = true, this.vitalSignTextEng = "Vital Sign", this.doctorTextEng = "Doctor", this.procedureTextEng = "Procedure", @@ -287,8 +283,7 @@ class GlobalConfigurationsModel { kioskQueueList = []; } if (json['kioskConfig'] != null) { - kioskLanguageConfigList = - List.from(json['kioskConfig'].map((kioskQueueJson) => KioskLanguageConfigModel.fromJson(kioskQueueJson))); + kioskLanguageConfigList = List.from(json['kioskConfig'].map((kioskQueueJson) => KioskLanguageConfigModel.fromJson(kioskQueueJson))); } else { kioskLanguageConfigList = []; } diff --git a/lib/services/text_to_speech_service.dart b/lib/services/text_to_speech_service.dart index 302e821..497e309 100644 --- a/lib/services/text_to_speech_service.dart +++ b/lib/services/text_to_speech_service.dart @@ -82,9 +82,7 @@ class TextToSpeechServiceImp implements TextToSpeechService { postVoice = ticket.ticketModel!.postVoiceText; } String roomNo = ''; - if (globalConfigurationsModel.qTypeEnum != QTypeEnum.appointment && - ticket.ticketModel!.roomNo != null && - ticket.ticketModel!.roomNo!.isNotEmpty) { + if (globalConfigurationsModel.qTypeEnum != QTypeEnum.appointment && ticket.ticketModel!.roomNo.isNotEmpty) { roomNo = ".. ${ticket.ticketModel!.roomNo.toString()}"; } @@ -92,7 +90,7 @@ class TextToSpeechServiceImp implements TextToSpeechService { preVoice = '$preVoice..'; } - String ticketNo = ticket.ticketModel!.queueNo!.trim().toString(); + String ticketNo = ticket.ticketModel!.queueNo.trim().toString(); log("areLanguagesInstalled: ${await textToSpeechInstance.areLanguagesInstalled(["en-US", "ar-SA"])}"); log("lang: $langEnum"); diff --git a/lib/view_models/queuing_view_model.dart b/lib/view_models/queuing_view_model.dart index 9ec5e82..1bd1ad3 100644 --- a/lib/view_models/queuing_view_model.dart +++ b/lib/view_models/queuing_view_model.dart @@ -215,7 +215,8 @@ class QueuingViewModel extends ChangeNotifier { callTypeEnum: ticketData.callTypeEnum, ); } else { - screenConfigViewModel.acknowledgeTicket(ticketQueueID: ticketData.id ?? 0, + screenConfigViewModel.acknowledgeTicket( + ticketQueueID: ticketData.id ?? 0, ipAddress: screenConfigViewModel.currentScreenIP, ); } diff --git a/lib/view_models/screen_config_view_model.dart b/lib/view_models/screen_config_view_model.dart index ae134b9..e08cc8f 100644 --- a/lib/view_models/screen_config_view_model.dart +++ b/lib/view_models/screen_config_view_model.dart @@ -180,23 +180,23 @@ class ScreenConfigViewModel extends ChangeNotifier { } void updateGlobalConfigurationsModel({required var value, bool needNotify = false, bool shouldUpdateNextPrayer = false}) { - // Ensure the incoming value is the GlobalConfigurationsModel and set the Takhasusi flag based on current IP + // Ensure the incoming value is the GlobalConfigurationsModel and set the Takhasusi flag based on projectID if (value is GlobalConfigurationsModel) { - // IPs that belong to Takhasusi main - using AppConstants + // Use projectID-based detection (projectID = 16 for Takhasusi Main) try { - value.isFromTakhasusiMain = AppConstants.takhasusiMainBranchIps.contains(currentScreenIP); + value.isFromTakhasusiMain = value.projectID == AppConstants.projectIdTakhasusiMain; // Debug logging for Takhasusi Main detection - log("=== TAKHASUSI MAIN CHECK ==="); + log("=== TAKHASUSI MAIN CHECK (ProjectID-based) ==="); log("Current Screen IP: $currentScreenIP"); - log("Is Takhasusi Main: ${value.isFromTakhasusiMain}"); - log("Takhasusi Main IPs count: ${AppConstants.takhasusiMainBranchIps.length}"); + log("Project ID: ${value.projectID}"); + log("Is Takhasusi Main (projectID == 16): ${value.isFromTakhasusiMain}"); if (value.isFromTakhasusiMain) { log("✅ This device will use getTurnsByOrientationForOlderVersions()"); } else { - log("✅ This device will use getTurnsByOrientation()"); + log("✅ This device will use getTurnsByOrientationForNewVersions()"); } - log("============================"); + log("=========================================="); } catch (_) { value.isFromTakhasusiMain = false; } diff --git a/lib/views/main_queue_screen/components/priority_tickets.dart b/lib/views/main_queue_screen/components/priority_tickets.dart index d1c06bf..5cca44b 100644 --- a/lib/views/main_queue_screen/components/priority_tickets.dart +++ b/lib/views/main_queue_screen/components/priority_tickets.dart @@ -58,14 +58,14 @@ class PriorityTickets extends StatelessWidget { return [_buildPrimaryTicket(context, tickets[0], isFullWidth: true)]; case 2: return [ - Expanded(child: _buildPrimaryTicket(context, tickets[0], isHalf: true)), + Expanded(child: _buildPrimaryTicket(context, tickets[0], isFullWidth: true)), globalConfigurationsModel.isFromTakhasusiMain ? SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.2) : SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.5), Expanded(child: _buildSecondaryTicket(context, tickets[1], isHalf: true)), ]; case 3: case 4: return [ - Expanded(child: _buildPrimaryTicket(context, tickets[0], isHalf: true)), + Expanded(child: _buildPrimaryTicket(context, tickets[0], isFullWidth: true)), globalConfigurationsModel.isFromTakhasusiMain ? SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.2) : SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.5), Expanded(child: _buildOtherTicketsRow(context, noOfTicketsToSkipFromStart: 1, isHalf: true)), ]; @@ -108,8 +108,6 @@ class PriorityTickets extends StatelessWidget { roomNo: ticket.ticketModel?.roomNo ?? '', roomText: _getRoomText(), roomTextAr: _getRoomTextAr(), - callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.vitalSign, - isClinicAdded: false, callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.none, textDirection: globalConfigurationsModel.textDirection, screenTypeEnum: globalConfigurationsModel.screenTypeEnum, @@ -117,30 +115,32 @@ class PriorityTickets extends StatelessWidget { globalConfigurationsModel: globalConfigurationsModel, ); - if (isHalf) { + log("isFullWidth: ${isFullWidth} and _buildPrimaryTicket"); + + if (isFullWidth) { return Center( child: ConstrainedBox( constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width * 0.7, // 60% of screen width - minHeight: SizeConfig.getHeightMultiplier() * 2.2, // Minimum height + maxWidth: MediaQuery.of(context).size.width * 0.6, // 60% of screen width + minHeight: SizeConfig.getHeightMultiplier() * 2, // Minimum height ), child: Transform.scale( - scale: _getTicketScale(), + scale: _getTicketScale() + 0.2, child: primaryCallingCard, ), ), ); } - if (isFullWidth) { + if (isHalf) { return Center( child: ConstrainedBox( constraints: BoxConstraints( maxWidth: MediaQuery.of(context).size.width * 0.6, // 60% of screen width - minHeight: SizeConfig.getHeightMultiplier() * 2, // Minimum height + minHeight: SizeConfig.getHeightMultiplier() * 2.2, // Minimum height ), child: Transform.scale( - scale: _getTicketScale() + 0.2, + scale: _getTicketScale(), child: primaryCallingCard, ), ), @@ -158,9 +158,7 @@ class PriorityTickets extends StatelessWidget { roomNo: ticket.ticketModel?.roomNo ?? '', roomText: _getRoomText(), roomTextAr: _getRoomTextAr(), - isClinicAdded: false, callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.none, - callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.vitalSign, textDirection: globalConfigurationsModel.textDirection, screenTypeEnum: globalConfigurationsModel.screenTypeEnum, langTypeEnum: globalConfigurationsModel.screenLanguageEnum, @@ -198,7 +196,7 @@ class PriorityTickets extends StatelessWidget { return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 1.5 : globalConfigurationsModel.isFromTakhasusiMain - ? 0.9 + ? 0.7 : 1.2; } diff --git a/lib/views/main_queue_screen/components/ticket_item_normal_card.dart b/lib/views/main_queue_screen/components/ticket_item_normal_card.dart index 231316f..3ea0b4b 100644 --- a/lib/views/main_queue_screen/components/ticket_item_normal_card.dart +++ b/lib/views/main_queue_screen/components/ticket_item_normal_card.dart @@ -70,7 +70,7 @@ class QueueItemNormalCard extends StatelessWidget { child: Center( child: AppText( ticketNo, - fontSize: shouldReduceSize(ticketNo) ? SizeConfig.getWidthMultiplier() * 2.5 : SizeConfig.getWidthMultiplier() * 5, + fontSize: shouldReduceSize(ticketNo) ? SizeConfig.getWidthMultiplier() * 2.8 : SizeConfig.getWidthMultiplier() * 5, letterSpacing: -1, fontHeight: 0.5, color: AppColors.greyTextColor, diff --git a/lib/views/main_queue_screen/main_queue_screen.dart b/lib/views/main_queue_screen/main_queue_screen.dart index e1dcf8c..89608d8 100644 --- a/lib/views/main_queue_screen/main_queue_screen.dart +++ b/lib/views/main_queue_screen/main_queue_screen.dart @@ -189,8 +189,8 @@ class _MainQueueScreenState extends State { return Selector( selector: (context, screenConfigViewModel) => screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum, builder: (BuildContext context, ScreenOrientationEnum screenOrientationEnum, Widget? child) { - //TODO: For Testing Only + //TODO: For Testing Only log("=== ROTATEDBOX DEBUG ==="); log("ScreenOrientationEnum: $screenOrientationEnum"); log("isFromTakhasusiMain: ${globalConfigurationsModel.isFromTakhasusiMain}");