130 lines
4.1 KiB
Dart
130 lines
4.1 KiB
Dart
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,
|
|
);
|
|
}
|
|
}
|