package de.geeksfactory.opacclient.reminder; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.commonsware.cwac.wakeful.WakefulIntentService; import org.joda.time.Minutes; public class SyncAccountAlarmListener implements WakefulIntentService.AlarmListener { public static final String PREF_SYNC_INTERVAL = "sync_interval"; public static final String PREF_SYNC_SERVICE = "notification_service"; private boolean onePeriodBeforeStart = false; /** * @return a SyncAccountAlarmListener that will wait for one period before the first scheduled * alarm. Used for re-scheduling alarms from {@link SyncAccountService}. */ public static SyncAccountAlarmListener withOnePeriodBeforeStart() { SyncAccountAlarmListener listener = new SyncAccountAlarmListener(); listener.onePeriodBeforeStart = true; return listener; } @Override public void scheduleAlarms(AlarmManager am, PendingIntent pi, Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); long interval = prefs.getLong(PREF_SYNC_INTERVAL, AlarmManager.INTERVAL_HALF_DAY); long firstStart; if (onePeriodBeforeStart) { // Re-scheduled from SyncAccountService: Wait one period before the first alarm. firstStart = System.currentTimeMillis() + interval; } else { // After reboot/app install/force close: Wait only 10 minutes before the first alarm firstStart = System.currentTimeMillis() + Minutes.minutes(10).toStandardDuration().getMillis(); } am.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstStart, interval, pi); } @Override public void sendWakefulWork(Context context) { WakefulIntentService.sendWakefulWork(context, SyncAccountService.class); } @Override public long getMaxAge() { return (long) (AlarmManager.INTERVAL_HALF_DAY * 1.25); } }