/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.repeats; import java.text.DateFormatSymbols; import java.text.ParseException; import java.util.List; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import com.google.ical.values.Frequency; import com.google.ical.values.RRule; import com.google.ical.values.WeekdayNum; import com.timsu.astrid.R; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.data.Task; /** * Exposes Task Detail for repeats, i.e. "Repeats every 2 days" * * @author Tim Su <tim@todoroo.com> * */ public class RepeatDetailExposer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // get tags associated with this task long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1); if(taskId == -1) return; String taskDetail = getTaskDetails(context, taskId); if(taskDetail == null) return; // transmit Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, RepeatsPlugin.IDENTIFIER); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, taskDetail); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); } public String getTaskDetails(Context context, long id) { Task task = PluginServices.getTaskService().fetchById(id, Task.RECURRENCE); if(task == null) return null; Resources r = context.getResources(); String recurrence = task.sanitizedRecurrence(); if(recurrence != null && recurrence.length() > 0) { RRule rrule; try { rrule = new RRule(recurrence); } catch (ParseException e) { System.err.println(e.toString()); return null; } String interval = getIntervalFor(r, rrule); interval = "<b>" + interval + "</b>"; //$NON-NLS-1$//$NON-NLS-2$ List<WeekdayNum> byDay = rrule.getByDay(); if(rrule.getFreq() == Frequency.WEEKLY || byDay.size() != 7) { if(byDay.size() > 0) { StringBuilder byDayString = new StringBuilder(); DateFormatSymbols dfs = new DateFormatSymbols(); String[] weekdays = dfs.getShortWeekdays(); for(int i = 0; i < byDay.size(); i++) { byDayString.append(weekdays[byDay.get(i).wday.javaDayNum]); if(i < byDay.size() - 1) byDayString.append(", "); //$NON-NLS-1$ } interval = r.getString(R.string.repeat_detail_byday).replace("$I", //$NON-NLS-1$ interval).replace("$D", byDayString); //$NON-NLS-1$ } } String detail; if(task.repeatAfterCompletion()) detail = context.getString(R.string.repeat_detail_completion, interval); else detail = context.getString(R.string.repeat_detail_duedate, interval); return "<img src='silk_date'/> " + detail; //$NON-NLS-1$ } return null; } private String getIntervalFor(Resources r, RRule rrule) { int plural; switch(rrule.getFreq()) { case MINUTELY: plural = R.plurals.DUt_minutes; break; case HOURLY: plural = R.plurals.DUt_hours; break; case DAILY: plural = R.plurals.DUt_days; break; case WEEKLY: plural = R.plurals.DUt_weeks; break; case MONTHLY: plural = R.plurals.DUt_months; break; case YEARLY: plural = R.plurals.DUt_years; break; default: // not designed to be used, only a fail-safe return rrule.getInterval() + "-" + rrule.getFreq().name(); //$NON-NLS-1$ } return r.getQuantityString(plural, rrule.getInterval(), rrule.getInterval()); } public String getPluginIdentifier() { return RepeatsPlugin.IDENTIFIER; } }