diff --git a/app/src/main/java/com/learntodroid/simplealarmclock/data/Alarm.java b/app/src/main/java/com/learntodroid/simplealarmclock/data/Alarm.java index 5dcd8e0..2812ec8 100644 --- a/app/src/main/java/com/learntodroid/simplealarmclock/data/Alarm.java +++ b/app/src/main/java/com/learntodroid/simplealarmclock/data/Alarm.java @@ -4,6 +4,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.util.Log; import android.widget.Toast; @@ -149,16 +150,14 @@ public void schedule(Context context) { e.printStackTrace(); } Toast.makeText(context, toastText, Toast.LENGTH_LONG).show(); - - alarmManager.setExact( - AlarmManager.RTC_WAKEUP, - calendar.getTimeInMillis(), - alarmPendingIntent - ); + setAlarm(alarmManager, calendar.getTimeInMillis(), alarmPendingIntent); } else { String toastText = String.format("Recurring Alarm %s scheduled for %s at %02d:%02d", title, getRecurringDaysText(), hour, minute, alarmId); Toast.makeText(context, toastText, Toast.LENGTH_LONG).show(); + // todo - code changes required to move away from setRepeating(...) as it does not fire + // when device is dozed, need to use set exact and reschedule the alarm daily after it + // fires, potential updates to AlarmService, AlarmBroadcastReceiver and RingActivity required final long RUN_DAILY = 24 * 60 * 60 * 1000; alarmManager.setRepeating( AlarmManager.RTC_WAKEUP, @@ -171,6 +170,16 @@ public void schedule(Context context) { this.started = true; } + public void setAlarm(AlarmManager alarmManager, long alarmTime, PendingIntent alarmPendingIntent) { + if (Build.VERSION.SDK_INT >= 23) { + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTime, alarmPendingIntent); + } else if (Build.VERSION.SDK_INT >= 19) { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmTime, alarmPendingIntent); + } else { + alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, alarmPendingIntent); + } + } + public void cancelAlarm(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmBroadcastReceiver.class);