package com.sunlightlabs.android.congress.notifications; import java.util.Calendar; import java.util.Date; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import com.sunlightlabs.android.congress.NotificationSettings; import com.sunlightlabs.android.congress.utils.Utils; /** * The service must be stopped from the same context from which it was started. * That's why we send a broadcast every time we need to perform a start/stop * action on the service, to use the same context (in which the receiver is * running) * */ public class OnServiceActionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Utils.START_NOTIFICATION_SERVICE)) scheduleNotifications(context); else if (action.equals(Utils.STOP_NOTIFICATION_SERVICE)) stopNotifications(context); } private static PendingIntent getPendingIntent(Context context) { Intent intent = new Intent(context, OnAlarmReceiver.class); intent.setAction(Utils.START_NOTIFICATION_SERVICE); return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); } private static void scheduleNotifications(Context context) { int interval = Integer.parseInt(Utils.getStringPreference(context, NotificationSettings.KEY_NOTIFY_INTERVAL, NotificationSettings.DEFAULT_NOTIFY_INTERVAL)); Log.d(Utils.TAG, "OnServiceActionReceiver: Schedule notifications to repeat in " + interval + " minutes."); Calendar c = Calendar.getInstance(); c.setTime(new Date()); // set time to now c.add(Calendar.MINUTE, interval); interval *= 60000; // convert to milliseconds AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // if the interval is 15 minutes or tighter, use inexact alarms to conserve on battery if (interval <= (15 * 60000)) am.setInexactRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), interval, getPendingIntent(context)); else am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), interval, getPendingIntent(context)); } private static void stopNotifications(Context context) { Log.d(Utils.TAG, "OnServiceActionReceiver: Stop notifications."); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.cancel(getPendingIntent(context)); } }