package be.digitalia.fosdem.alarms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import be.digitalia.fosdem.activities.SettingsActivity;
import be.digitalia.fosdem.db.DatabaseManager;
import be.digitalia.fosdem.services.AlarmIntentService;
/**
* This class monitors bookmarks and preferences changes to dispatch alarm update work to AlarmIntentService.
*
* @author Christophe Beyls
*
*/
public class FosdemAlarmManager implements OnSharedPreferenceChangeListener {
private static FosdemAlarmManager instance;
private final Context context;
private boolean isEnabled;
private final BroadcastReceiver scheduleRefreshedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// When the schedule DB is updated, update the alarms too
startUpdateAlarms();
}
};
private final BroadcastReceiver bookmarksReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Dispatch the Bookmark broadcasts to the service
Intent serviceIntent = new Intent(context, AlarmIntentService.class);
serviceIntent.setAction(intent.getAction());
serviceIntent.putExtras(intent.getExtras());
context.startService(serviceIntent);
}
};
public static void init(Context context) {
if (instance == null) {
instance = new FosdemAlarmManager(context);
}
}
public static FosdemAlarmManager getInstance() {
return instance;
}
private FosdemAlarmManager(Context context) {
this.context = context;
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
isEnabled = sharedPreferences.getBoolean(SettingsActivity.KEY_PREF_NOTIFICATIONS_ENABLED, false);
if (isEnabled) {
registerReceivers();
}
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
public boolean isEnabled() {
return isEnabled;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (SettingsActivity.KEY_PREF_NOTIFICATIONS_ENABLED.equals(key)) {
isEnabled = sharedPreferences.getBoolean(SettingsActivity.KEY_PREF_NOTIFICATIONS_ENABLED, false);
if (isEnabled) {
registerReceivers();
startUpdateAlarms();
} else {
unregisterReceivers();
startDisableAlarms();
}
} else if (SettingsActivity.KEY_PREF_NOTIFICATIONS_DELAY.equals(key)) {
startUpdateAlarms();
}
}
private void registerReceivers() {
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
lbm.registerReceiver(scheduleRefreshedReceiver, new IntentFilter(DatabaseManager.ACTION_SCHEDULE_REFRESHED));
IntentFilter filter = new IntentFilter();
filter.addAction(DatabaseManager.ACTION_ADD_BOOKMARK);
filter.addAction(DatabaseManager.ACTION_REMOVE_BOOKMARKS);
lbm.registerReceiver(bookmarksReceiver, filter);
}
private void unregisterReceivers() {
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
lbm.unregisterReceiver(scheduleRefreshedReceiver);
lbm.unregisterReceiver(bookmarksReceiver);
}
void startUpdateAlarms() {
Intent serviceIntent = new Intent(context, AlarmIntentService.class);
serviceIntent.setAction(AlarmIntentService.ACTION_UPDATE_ALARMS);
context.startService(serviceIntent);
}
private void startDisableAlarms() {
Intent serviceIntent = new Intent(context, AlarmIntentService.class);
serviceIntent.setAction(AlarmIntentService.ACTION_DISABLE_ALARMS);
context.startService(serviceIntent);
}
}