package io.github.droidkaigi.confsched.util; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import org.parceler.Parcels; import java.util.concurrent.TimeUnit; import io.github.droidkaigi.confsched.model.Session; import io.github.droidkaigi.confsched.receiver.SessionScheduleReceiver; public class AlarmUtil { private static final long REMIND_DURATION_MINUTES_FOR_START = TimeUnit.MINUTES.toMillis(5); public static void handleSessionAlarm(Context context, Session session) { if (session.checked) { registerSessionAlarm(context, session); } else { unregisterSessionAlarm(context, session); } } public static void registerSessionAlarm(Context context, Session session) { if (!session.shouldNotify(REMIND_DURATION_MINUTES_FOR_START)) { return; } PendingIntent sender = buildSessionAlarmSender(context, session); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); long triggerAtMillis = calculateStartNotifyTime(session, context); alarmManager.set(AlarmManager.RTC, triggerAtMillis, sender); } public static void unregisterSessionAlarm(Context context, Session session) { PendingIntent sender = buildSessionAlarmSender(context, session); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } private static PendingIntent buildSessionAlarmSender(Context context, Session session) { Intent intent = new Intent(context, SessionScheduleReceiver.class); intent.putExtra(Session.class.getSimpleName(), Parcels.wrap(session)); return PendingIntent.getBroadcast(context, session.id, intent, PendingIntent.FLAG_UPDATE_CURRENT); } private static long calculateStartNotifyTime(Session session, Context context) { return session.getDisplaySTime(context).getTime() - REMIND_DURATION_MINUTES_FOR_START; } }