import 'package:flutter/material.dart'; import 'package:posyandu/screens/splash.dart'; // Import splash screen import 'package:posyandu/screens/auth/login_screen.dart'; import 'package:posyandu/screens/dashboard/dashboard_screen.dart'; import 'package:posyandu/screens/dashboard/profile_screen.dart'; import 'package:posyandu/services/notification_service.dart'; import 'package:posyandu/services/jadwal_service.dart'; import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart'; import 'package:posyandu/services/anak_service.dart'; import 'dart:isolate'; import 'dart:ui'; // ID untuk alarm background check jadwal const int notificationCheckAlarmId = 0; // Port untuk komunikasi antar isolate final ReceivePort port = ReceivePort(); // Fungsi yang dijalankan di background isolate @pragma('vm:entry-point') void backgroundNotificationCheck() async { // Komunikasi dengan main isolate jika perlu SendPort? uiSendPort = IsolateNameServer.lookupPortByName('notification_isolate'); print('Running background notification check at ${DateTime.now()}'); // Inisialisasi layanan notifikasi final notificationService = NotificationService(); await notificationService.init(); // Inisialisasi layanan jadwal final jadwalService = JadwalService(); try { // Dapatkan timestamp terakhir cek jadwal final lastChecked = await jadwalService.getLastCheckTime(); // Dapatkan semua data anak (dalam kasus aplikasi multi-anak) final anakService = AnakService(); final anakList = await anakService.getAnakList(); if (anakList.isEmpty) { print('Tidak ada data anak untuk diperiksa jadwalnya'); return; } // Cek jadwal baru untuk semua anak for (final anak in anakList) { final anakId = anak['id']; // Dapatkan jadwal baru dari API yang ditambahkan sejak pengecekan terakhir final newJadwalList = await jadwalService.getNewJadwal(anakId, lastChecked); if (newJadwalList.isNotEmpty) { print('${newJadwalList.length} jadwal baru ditemukan untuk anak dengan ID $anakId'); // Tampilkan notifikasi untuk setiap jadwal baru for (final jadwal in newJadwalList) { await notificationService.showNewJadwalNotification(jadwal); } // Jadwalkan notifikasi untuk jadwal baru await notificationService.scheduleAllUpcomingNotifications(newJadwalList); } } // Simpan waktu pengecekan terakhir await jadwalService.saveLastCheckTime(); // Kirim pesan ke UI thread jika port tersedia if (uiSendPort != null) { uiSendPort.send('notification_check_completed'); } } catch (e) { print('Error in background notification check: $e'); } } void main() async { // Pastikan binding Flutter diinisialisasi sebelum memanggil method native WidgetsFlutterBinding.ensureInitialized(); // Inisialisasi layanan notifikasi final notificationService = NotificationService(); await notificationService.init(); // Inisialisasi Android Alarm Manager await AndroidAlarmManager.initialize(); // Daftarkan port untuk komunikasi antar isolate IsolateNameServer.registerPortWithName(port.sendPort, 'notification_isolate'); // Set up listener untuk port port.listen((message) { print('Received message from background task: $message'); }); // Jadwalkan pengecekan notifikasi background setiap 15 menit await AndroidAlarmManager.periodic( const Duration(minutes: 15), notificationCheckAlarmId, backgroundNotificationCheck, exact: true, wakeup: true, rescheduleOnReboot: true, ); runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Posyandu', theme: ThemeData( primarySwatch: Colors.blue, ), initialRoute: '/', // Tambahkan ini untuk menentukan route awal routes: { '/': (context) => SplashScreen(), '/login': (context) => LoginScreen(), '/dashboard': (context) => DashboardScreen(), '/profile': (context) => ProfileScreen(), }, debugShowCheckedModeBanner: false, ); } }