/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.locale; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.activity.ShortcutActivity; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.reminders.Notifications; import com.todoroo.astrid.utility.Constants; /** * Receiver is activated when Locale conditions are triggered * * @author timsu * */ public class LocaleReceiver extends BroadcastReceiver { /** * Create a preference key for storing / retrieving last interval time * @param filterTitle * @param interval * @return */ private String makePreferenceKey(String filterTitle, int interval) { return "LOCALE:" + filterTitle + interval; //$NON-NLS-1$ } @SuppressWarnings("nls") @Override /** Called when the system is started up */ public void onReceive(Context context, Intent intent) { ContextManager.setContext(context); try { if (com.twofortyfouram.Intent.ACTION_FIRE_SETTING.equals(intent.getAction())) { if(!PluginServices.getAddOnService().hasLocalePlugin()) return; final Bundle forwardedBundle = intent.getBundleExtra(com.twofortyfouram.Intent.EXTRA_BUNDLE); final String title = forwardedBundle.getString(LocaleEditAlerts.KEY_FILTER_TITLE); final String sql = forwardedBundle.getString(LocaleEditAlerts.KEY_SQL); final String values = forwardedBundle.getString(LocaleEditAlerts.KEY_VALUES); final int interval = forwardedBundle.getInt(LocaleEditAlerts.KEY_INTERVAL, 24*3600); if(TextUtils.isEmpty(title) || TextUtils.isEmpty(sql) || sql.contains("--") || sql.contains(";") || interval == 0) return; // check if we've already made a notification recently String preferenceKey = makePreferenceKey(title, interval); long lastNotifyTime = Preferences.getLong(preferenceKey, 0); if(DateUtilities.now() - lastNotifyTime < interval * 1000L) { Log.i("astrid-locale-rx", title + ": Too soon, need " + (interval - (DateUtilities.now() - lastNotifyTime)/1000) + " more seconds"); return; } // find out if we have active tasks with this tag DependencyInjectionService.getInstance().inject(this); Filter filter = new Filter(title, title, sql, null); TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered( sql, null, Task.ID); try { if(cursor.getCount() == 0) return; if(values != null) filter.valuesForNewTasks = AndroidUtilities.contentValuesFromSerializedString(values); Resources r = context.getResources(); String reminder = r.getString(R.string.locale_notification). replace("$NUM", r.getQuantityString(R.plurals.Ntasks, cursor.getCount(), cursor.getCount())). replace("$FILTER", title); // show a reminder String notificationTitle = r.getString(R.string.locale_edit_alerts_title); Intent notifyIntent = ShortcutActivity.createIntent(filter); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Notifications.showNotification(Constants.NOTIFICATION_LOCALE, notifyIntent, 0, notificationTitle, reminder, 1); Preferences.setLong(preferenceKey, DateUtilities.now()); } finally { cursor.close(); } } } catch (Exception e) { Log.i("astrid-locale-rx", "Error receiving intent", e); } } }