package com.example.cuida.utils; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import com.example.cuida.services.AlarmReceiver; public class AlarmScheduler { public static void scheduleAlarm(Context context, long timeInMillis, String title, String message, int requestCode) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); if (alarmManager == null) return; Intent intent = new Intent(context, AlarmReceiver.class); intent.putExtra("EXTRA_TITLE", title); intent.putExtra("EXTRA_MESSAGE", message); intent.putExtra("EXTRA_NOTIFICATION_ID", requestCode); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (alarmManager.canScheduleExactAlarms()) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } else { // Fallback to inexact alarm if exact permission is revoked alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } else { alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } } catch (SecurityException e) { // Android 14+ requires explicit consent for SCHEDULE_EXACT_ALARM except for // clocks/calendars // Fallback when security exception is raised alarmManager.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); } } public static void cancelAlarm(Context context, int requestCode) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); if (alarmManager == null) return; Intent intent = new Intent(context, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); alarmManager.cancel(pendingIntent); pendingIntent.cancel(); } }