NIM_E31222534/Androidnya/lib/main.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,
);
}
}