package com.wigwamlabs.veckify; import android.content.Context; import android.content.Intent; import android.util.Pair; import com.wigwamlabs.veckify.db.AlarmEntry; import com.wigwamlabs.veckify.db.AlarmsCursor; import com.wigwamlabs.veckify.db.DataDatabaseAdapter; public class BroadcastReceiver extends android.content.BroadcastReceiver { public static final String ACTION_ALARM = "com.wigwamlabs.veckify.BroadcastReceiver.ALARM"; public static final String EXTRA_EVENT_TIME_MS = "eventtime"; public static final String EXTRA_ALARM_ID = "alarmid"; public static final String EXTRA_PLAYLIST_LINK = "playlist_link"; private static final int MAX_TIME_SINCE_SCHEDULED_MS = 5 * 60 * 1000; @Override public void onReceive(Context context, Intent intent) { if (intent != null) { final String action = intent.getAction(); final AlarmUtils alarmUtils = new AlarmUtils(context); final Application application = (Application) context.getApplicationContext(); final DataDatabaseAdapter db = application.getDb(); if (ACTION_ALARM.equals(action)) { final long eventTimeMs = intent.getLongExtra(EXTRA_EVENT_TIME_MS, 0); final long alarmId = intent.getLongExtra(EXTRA_ALARM_ID, 0); final long timeSinceEventMs = System.currentTimeMillis() - eventTimeMs; Debug.logAlarmScheduling("Received alarm broadcast " + timeSinceEventMs / 1000 + "s after scheduled"); if (timeSinceEventMs < MAX_TIME_SINCE_SCHEDULED_MS) { startAlarm(context, db, alarmId); } else { Debug.logAlarmScheduling("Skipping alarm since too long since scheduled"); } rescheduleAlarm(context, alarmUtils, db); } else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { Debug.logAlarmScheduling("Device booted"); rescheduleAlarm(context, alarmUtils, db); } else if (Intent.ACTION_TIME_CHANGED.equals(action)) { Debug.logAlarmScheduling("Time changed"); rescheduleAlarm(context, alarmUtils, db); } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { Debug.logAlarmScheduling("Timezone changed"); // need to reschedule since alarm is scheduled in UTC rescheduleAlarm(context, alarmUtils, db); } } } private void rescheduleAlarm(Context context, AlarmUtils alarmUtils, DataDatabaseAdapter db) { final AlarmsCursor alarm = AlarmsCursor.getAllAlarmsCursor(db); alarmUtils.reschedule(context, alarm); alarm.close(); } private void startAlarm(Context context, DataDatabaseAdapter db, long alarmId) { final AlarmsCursor alarm = AlarmsCursor.getAlarmCursor(db, alarmId); if (alarm.moveToFirst()) { final Pair<Intent, Intent> intents = alarm.createIntents(context); context.startService(intents.first); context.startActivity(intents.second); } alarm.close(); final AlarmEntry entry = new AlarmEntry(); entry.setEnabled(false); entry.setOneoffTimeMs(0); entry.updateExpiredOneoffAlarms(db); } }