merged dummy-conflicts from git

pull/14/head
Arne Jans 16 years ago
commit e5c677412e

Binary file not shown.

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid" package="com.timsu.astrid"
android:versionName="3.0.7" android:versionCode="146" android:versionName="3.1.0" android:versionCode="146"
android:installLocation="auto"> android:installLocation="internalOnly">
<!-- widgets, alarms, and services will break if Astrid is installed on SD card -->
<!-- ================================================== Used Permissions = --> <!-- ================================================== Used Permissions = -->
@ -46,7 +48,7 @@
<!-- ========================================================== Metadata = --> <!-- ========================================================== Metadata = -->
<uses-sdk android:targetSdkVersion="4" <uses-sdk android:targetSdkVersion="8"
android:minSdkVersion="3" /> android:minSdkVersion="3" />
<supports-screens /> <supports-screens />
@ -163,6 +165,15 @@
</intent-filter> </intent-filter>
</activity> </activity>
<!-- alarms -->
<receiver android:name="com.todoroo.astrid.alarms.AlarmTaskRepeatListener">
<intent-filter>
<action android:name="com.todoroo.astrid.TASK_REPEATED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- tags --> <!-- tags -->
<receiver android:name="com.todoroo.astrid.tags.TagsPlugin"> <receiver android:name="com.todoroo.astrid.tags.TagsPlugin">
<intent-filter> <intent-filter>
@ -303,7 +314,11 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name="com.todoroo.astrid.producteev.ProducteevLoginActivity" <activity android:name="com.todoroo.astrid.producteev.ProducteevLoginActivity"
android:theme="@style/Theme" /> android:theme="@style/Theme">
<intent-filter> <!-- temporary -->
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<service android:name="com.todoroo.astrid.producteev.ProducteevBackgroundService"/> <service android:name="com.todoroo.astrid.producteev.ProducteevBackgroundService"/>
<!-- rmilk --> <!-- rmilk -->
@ -316,7 +331,7 @@
<activity android:name="com.todoroo.astrid.rmilk.MilkLoginActivity" <activity android:name="com.todoroo.astrid.rmilk.MilkLoginActivity"
android:theme="@style/Theme" /> android:theme="@style/Theme" />
<activity android:name="com.todoroo.astrid.rmilk.MilkPreferences" <activity android:name="com.todoroo.astrid.rmilk.MilkPreferences"
android:icon="@drawable/ic_menu_rmilk" android:icon="@drawable/ic_menu_refresh"
android:label="@string/rmilk_MPr_header"> android:label="@string/rmilk_MPr_header">
<intent-filter> <intent-filter>
<action android:name="com.todoroo.astrid.TASK_LIST_MENU" /> <action android:name="com.todoroo.astrid.TASK_LIST_MENU" />

@ -52,6 +52,16 @@ public class AstridApiConstants {
*/ */
public static final String EXTRAS_EXTENDED = "extended"; public static final String EXTRAS_EXTENDED = "extended";
/**
* Extras name for old task due date
*/
public static final String EXTRAS_OLD_DUE_DATE= "oldDueDate";
/**
* Extras name for new task due date
*/
public static final String EXTRAS_NEW_DUE_DATE = "newDueDate";
// --- Add-ons API // --- Add-ons API
/** /**
@ -177,10 +187,12 @@ public class AstridApiConstants {
public static final String BROADCAST_EVENT_TASK_COMPLETED = PACKAGE + ".TASK_COMPLETED"; public static final String BROADCAST_EVENT_TASK_COMPLETED = PACKAGE + ".TASK_COMPLETED";
/** /**
* Action name for broadcast intent notifying that task was created * Action name for broadcast intent notifying that task was created from repeating template
* @extra EXTRAS_TASK_ID id of the task * @extra EXTRAS_TASK_ID id of the task
* @extra EXTRAS_OLD_DUE_DATE task old due date (could be 0)
* @extra EXTRAS_NEW_DUE_DATE task new due date (will not be 0)
*/ */
public static final String BROADCAST_EVENT_TASK_CREATED = PACKAGE + ".TASK_CREATED"; public static final String BROADCAST_EVENT_TASK_REPEATED = PACKAGE + ".TASK_REPEATED";
// --- SQL Constants // --- SQL Constants

@ -61,6 +61,11 @@ public class Field extends DBObject<Field> {
return UnaryCriterion.like(this, value); return UnaryCriterion.like(this, value);
} }
public Criterion like(String value, String escape) {
return UnaryCriterion.like(this, value, escape);
}
public <T> Criterion in(final T... value) { public <T> Criterion in(final T... value) {
final Field field = this; final Field field = this;
return new Criterion(Operator.in) { return new Criterion(Operator.in) {

@ -89,14 +89,14 @@ public final class Query {
visitSelectClause(sql); visitSelectClause(sql);
visitFromClause(sql); visitFromClause(sql);
if(queryTemplate == null) {
visitJoinClause(sql); visitJoinClause(sql);
if(queryTemplate == null) {
visitWhereClause(sql); visitWhereClause(sql);
visitGroupByClause(sql); visitGroupByClause(sql);
visitOrderByClause(sql); visitOrderByClause(sql);
visitLimitClause(sql); visitLimitClause(sql);
} else { } else {
if(joins.size() > 0 || groupBies.size() > 0 || orders.size() > 0 || if(groupBies.size() > 0 || orders.size() > 0 ||
havings.size() > 0) havings.size() > 0)
throw new IllegalStateException("Can't have extras AND query template"); //$NON-NLS-1$ throw new IllegalStateException("Can't have extras AND query template"); //$NON-NLS-1$
sql.append(queryTemplate); sql.append(queryTemplate);

@ -89,4 +89,19 @@ public class UnaryCriterion extends Criterion {
} }
}; };
} }
public static Criterion like(Field field, String value, final String escape) {
return new UnaryCriterion(field, Operator.like, value) {
@Override
protected void populateOperator(StringBuilder sb) {
sb.append(SPACE).append(operator).append(SPACE);
}
@SuppressWarnings("nls")
@Override
protected void afterPopulateOperator(StringBuilder sb) {
super.afterPopulateOperator(sb);
sb.append(SPACE).append("ESCAPE").append(" '").append(sanitize(escape)).append("'");
}
};
}
} }

@ -193,11 +193,21 @@ public class AndroidUtilities {
if(string == null) if(string == null)
return null; return null;
String[] pairs = string.split(" "); String[] pairs = string.split("=");
ContentValues result = new ContentValues(); ContentValues result = new ContentValues();
for(String item : pairs) { String key = null;
String[] keyValue = item.split("="); for(int i = 0; i < pairs.length; i++) {
result.put(keyValue[0].trim(), keyValue[1].trim()); String newKey = null;
int lastSpace = pairs[i].lastIndexOf(' ');
if(lastSpace != -1) {
newKey = pairs[i].substring(lastSpace + 1);
pairs[i] = pairs[i].substring(0, lastSpace);
} else {
newKey = pairs[i];
}
if(key != null)
result.put(key.trim(), pairs[i].trim());
key = newKey;
} }
return result; return result;
} }

@ -6,11 +6,13 @@
package com.todoroo.andlib.utility; package com.todoroo.andlib.utility;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.text.format.DateUtils;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
@ -108,100 +110,65 @@ public class DateUtilities {
} }
/** /**
* @return time format (hours and minutes) * @param context android context
*/ * @param date time to format
public static SimpleDateFormat getTimeFormat(Context context) { * @return time, with hours and minutes
String value = getTimeFormatString(context);
return new SimpleDateFormat(value);
}
/**
* @return string used for time formatting
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
private static String getTimeFormatString(Context context) { public static String getTimeString(Context context, Date date) {
String value; String value;
if (is24HourFormat(context)) { if (is24HourFormat(context)) {
value = "H:mm"; value = "H:mm";
} else { } else {
value = "h:mm a"; value = "h:mm a";
} }
return value; return new SimpleDateFormat(value).format(date);
} }
/** /**
* @param context android context * @param context android context
* @return string used for date formatting * @param date date to format
* @return date, with month, day, and year
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
private static String getDateFormatString(Context context) { public static String getDateString(Context context, Date date) {
String month = "'" + DateUtils.getMonthString(date.getMonth() +
Calendar.JANUARY, DateUtils.LENGTH_MEDIUM) + "'";
String value; String value;
// united states, you are special // united states, you are special
if (Locale.US.equals(Locale.getDefault()) if (Locale.US.equals(Locale.getDefault())
|| Locale.CANADA.equals(Locale.getDefault())) || Locale.CANADA.equals(Locale.getDefault()))
value = "MMM d yyyy"; value = month + " d yyyy";
else else
value = "d MMM yyyy"; value = "d " + month + " yyyy";
return value; return new SimpleDateFormat(value).format(date);
}
/**
* @return date format (month, day, year)
*/
@SuppressWarnings("nls")
public static SimpleDateFormat getDateFormat(Context context) {
try {
return new SimpleDateFormat(getDateFormatString(context));
} catch (Exception e) {
return new SimpleDateFormat("d MMM yyyy");
}
} }
/** /**
* @return date format as getDateFormat with weekday * @return date format as getDateFormat with weekday
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public static SimpleDateFormat getDateFormatWithWeekday(Context context) { public static String getDateStringWithWeekday(Context context, Date date) {
try { String weekday = DateUtils.getDayOfWeekString(date.getDay() + Calendar.SUNDAY,
return new SimpleDateFormat("EEEE, " + getDateFormatString(context)); DateUtils.LENGTH_LONG);
} catch (Exception e) { return weekday + ", " + getDateString(context, date);
return new SimpleDateFormat("EEEE, d MMM yyyy");
}
} }
/** /**
* @return date format as getDateFormat with weekday * @return date format as getDateFormat with weekday
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public static SimpleDateFormat getDateWithTimeAndWeekday(Context context) { public static String getDateStringWithTimeAndWeekday(Context context, Date date) {
try { return getDateStringWithWeekday(context, date) + " " + getTimeString(context, date);
return new SimpleDateFormat("EEEE, " + getDateFormatString(context)
+ " " + getTimeFormatString(context));
} catch (Exception e) {
return new SimpleDateFormat("EEEE, d MMM yyyy H:mm");
}
} }
/** /**
* @return date with time at the end * @return date with time at the end
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public static SimpleDateFormat getDateWithTimeFormat(Context context) { public static String getDateStringWithTime(Context context, Date date) {
try { return getDateString(context, date) + " " + getTimeString(context, date);
return new SimpleDateFormat(getDateFormatString(context) + " " +
getTimeFormatString(context));
} catch (Exception e) {
return new SimpleDateFormat("d MMM yyyy H:mm");
} }
}
/**
* @return formatted date (will contain month, day, year)
*/
public static String getFormattedDate(Context context, Date date) {
return getDateFormat(context).format(date);
}
/* ====================================================================== /* ======================================================================
* ============================================================= duration * ============================================================= duration

@ -0,0 +1,42 @@
package com.todoroo.andlib.widget;
import java.util.ArrayList;
import android.app.Activity;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.Prediction;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import com.todoroo.andlib.widget.GestureService.GestureInterface;
public class Api4GestureDetector implements OnGesturePerformedListener {
private final GestureLibrary mLibrary;
private final GestureInterface listener;
public Api4GestureDetector(Activity activity, int view, int gestureLibrary, GestureInterface listener) {
this.listener = listener;
mLibrary = GestureLibraries.fromRawResource(activity, gestureLibrary);
if(mLibrary.load()) {
GestureOverlayView gestures = (GestureOverlayView) activity.findViewById(view);
gestures.addOnGesturePerformedListener(this);
}
}
@Override
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
// We want at least one prediction
if (predictions.size() > 0) {
Prediction prediction = predictions.get(0);
// We want at least some confidence in the result
if (prediction.score > 1.0) {
listener.gesturePerformed(prediction.name);
}
}
}
}

@ -0,0 +1,38 @@
package com.todoroo.andlib.widget;
import android.app.Activity;
import com.todoroo.andlib.utility.AndroidUtilities;
/**
* All API versions-friendly gesture detector. On SDK < 4, nothing happens
* @author Tim Su <tim@todoroo.com>
*
*/
public class GestureService {
public interface GestureInterface {
public void gesturePerformed(String gesture);
}
/**
* Register gesture detector. If android SDK version is not correct,
* a {@link VerifyError} will be throw. Catch this explicitly.
*
* @param activity
* @param view
* @param gestureLibrary
* @param listener
* @throws VerifyError
*/
public static void registerGestureDetector(Activity activity, int view,
int gestureLibrary, GestureInterface listener) throws VerifyError {
if(AndroidUtilities.getSdkVersion() > 3)
new Api4GestureDetector(activity, view, gestureLibrary, listener);
}
}

@ -1,111 +1,34 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.alarms; package com.todoroo.astrid.alarms;
import android.content.ContentValues;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.astrid.model.Metadata;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.model.Task;
/** /**
* Data Model which represents an alarm * Metadata entry for a task alarm
* *
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
@SuppressWarnings("nls") public class Alarm {
public class Alarm extends AbstractModel {
// --- table
public static final Table TABLE = new Table("alarm", Alarm.class);
// --- properties /** metadata key */
public static final String METADATA_KEY = "alarm"; //$NON-NLS-1$
/** ID */ /** time of alarm */
public static final LongProperty ID = new LongProperty( public static final LongProperty TIME = new LongProperty(Metadata.TABLE,
TABLE, ID_PROPERTY_NAME); Metadata.VALUE1.name);
/** Associated Task */ /** alarm type */
public static final LongProperty TASK = new LongProperty( public static final IntegerProperty TYPE = new IntegerProperty(Metadata.TABLE,
TABLE, "task"); Metadata.VALUE2.name);
/** Alarm Time */
public static final LongProperty TIME = new LongProperty(
TABLE, "time");
/** Alarm Type (see constants) */
public static final IntegerProperty TYPE = new IntegerProperty(
TABLE, "type");
/** Alarm Ringtone */
public static final StringProperty RINGTONE = new StringProperty(
TABLE, "ringtone");
/** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(Alarm.class);
// --- constants // --- constants
/** this alarm was already triggered */
public static final int TYPE_TRIGGERED = 0;
/** this alarm is single-shot */ /** this alarm is single-shot */
public static final int TYPE_SINGLE = 1; public static final int TYPE_SINGLE = 1;
/** this alarm repeats itself until turned off */ /** this alarm repeats itself until turned off */
public static final int TYPE_REPEATING = 2; public static final int TYPE_REPEATING = 2;
// --- defaults
/** Default values container */
private static final ContentValues defaultValues = new ContentValues();
static {
defaultValues.put(TYPE.name, TYPE_SINGLE);
defaultValues.put(RINGTONE.name, "");
}
@Override
public ContentValues getDefaultValues() {
return defaultValues;
}
// --- data access boilerplate
public Alarm() {
super();
}
public Alarm(TodorooCursor<Alarm> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<Alarm> cursor) {
super.readPropertiesFromCursor(cursor);
}
@Override
public long getId() {
return getIdHelper(ID);
};
// --- parcelable helpers
private static final Creator<Task> CREATOR = new ModelCreator<Task>(Task.class);
@Override
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
} }

@ -0,0 +1,92 @@
package com.todoroo.astrid.alarms;
import java.util.Date;
import java.util.LinkedHashSet;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.widget.DateControlSet;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
/**
* Control set to manage adding and removing tags
*
* @author Tim Su <tim@todoroo.com>
*
*/
public final class AlarmControlSet implements TaskEditControlSet {
// --- instance variables
private final LinearLayout alertsContainer;
private final Activity activity;
public AlarmControlSet(Activity activity, ViewGroup parent) {
View v = LayoutInflater.from(activity).inflate(R.layout.alarm_control, parent, true);
this.activity = activity;
this.alertsContainer = (LinearLayout) v.findViewById(R.id.alert_container);
v.findViewById(R.id.alarms_add).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
addAlarm(new Date());
}
});
}
@Override
public void readFromTask(Task task) {
alertsContainer.removeAllViews();
TodorooCursor<Metadata> cursor = AlarmService.getInstance().getAlarms(task.getId());
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
addAlarm(new Date(cursor.get(Alarm.TIME)));
} finally {
cursor.close();
}
}
@Override
public void writeToModel(Task task) {
LinkedHashSet<Long> alarms = new LinkedHashSet<Long>();
for(int i = 0; i < alertsContainer.getChildCount(); i++) {
DateControlSet set = (DateControlSet) alertsContainer.getChildAt(i).getTag();
if(set == null)
continue;
Date date = set.getDate();
if(date != null)
alarms.add(set.getDate().getTime());
}
AlarmService.getInstance().synchronizeAlarms(task.getId(), alarms);
}
private boolean addAlarm(Date alert) {
final View alertItem = LayoutInflater.from(activity).inflate(R.layout.alarm_edit_row, null);
alertsContainer.addView(alertItem);
DateControlSet dcs = new DateControlSet(activity, (Button)alertItem.findViewById(R.id.date),
(Button)alertItem.findViewById(R.id.time));
dcs.setDate(alert);
alertItem.setTag(dcs);
ImageButton reminderRemoveButton;
reminderRemoveButton = (ImageButton)alertItem.findViewById(R.id.button1);
reminderRemoveButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
alertsContainer.removeView(alertItem);
}
});
return true;
}
}

@ -0,0 +1,79 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.alarms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.format.DateUtils;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.DetailExposer;
import com.todoroo.astrid.model.Metadata;
/**
* Exposes Task Detail for tags, i.e. "Tags: frogs, animals"
*
* @author Tim Su <tim@todoroo.com>
*
*/
public class AlarmDetailExposer extends BroadcastReceiver implements DetailExposer {
@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;
boolean extended = intent.getBooleanExtra(AstridApiConstants.EXTRAS_EXTENDED, false);
String taskDetail = getTaskDetails(context, taskId, extended);
if(taskDetail == null)
return;
// transmit
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, AlarmService.IDENTIFIER);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, taskDetail);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, extended);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
}
@Override
public String getTaskDetails(Context context, long id, boolean extended) {
if(extended)
return null;
TodorooCursor<Metadata> cursor = AlarmService.getInstance().getAlarms(id);
long nextTime = -1;
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long time = cursor.get(Alarm.TIME);
if(time > DateUtilities.now()) {
nextTime = time;
break;
}
}
if(nextTime == -1)
return null;
CharSequence durationString = DateUtils.getRelativeDateTimeString(context,
nextTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS,
DateUtils.FORMAT_ABBREV_ALL);
return context.getString(R.string.alarm_ADE_detail, durationString);
} finally {
cursor.close();
}
}
@Override
public String getPluginIdentifier() {
return AlarmService.IDENTIFIER;
}
}

@ -1,11 +1,28 @@
package com.todoroo.astrid.alarms; package com.todoroo.astrid.alarms;
import java.util.ArrayList; import java.util.Date;
import java.util.LinkedHashSet;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.reminders.ReminderService;
import com.todoroo.astrid.service.MetadataService;
/** /**
* Provides operations for working with alerts * Provides operations for working with alerts
@ -13,32 +30,31 @@ import com.todoroo.andlib.sql.Query;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
@SuppressWarnings("nls")
public class AlarmService { public class AlarmService {
AlarmDatabase database = new AlarmDatabase(); // --- singleton
GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, database);
/** private static AlarmService instance = null;
* Metadata key for # of alarms
*/
public static final String ALARM_COUNT = "alarms-count";
public AlarmService() { public static synchronized AlarmService getInstance() {
DependencyInjectionService.getInstance().inject(this); if(instance == null)
instance = new AlarmService();
return instance;
} }
// --- data retrieval
public static final String IDENTIFIER = "alarms"; //$NON-NLS-1$
/** /**
* Return alarms for the given task * Return alarms for the given task. PLEASE CLOSE THE CURSOR!
* *
* @param taskId * @param taskId
*/ */
public TodorooCursor<Alarm> getAlarms(long taskId) { public TodorooCursor<Metadata> getAlarms(long taskId) {
database.openForReading(); return PluginServices.getMetadataService().query(Query.select(
Query query = Query.select(Alarm.PROPERTIES).where(Alarm.TASK.eq(taskId)); Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey(
return dao.query(query); taskId, Alarm.METADATA_KEY)).orderBy(Order.asc(Alarm.TIME)));
} }
/** /**
@ -46,14 +62,140 @@ public class AlarmService {
* @param taskId * @param taskId
* @param tags * @param tags
*/ */
public void synchronizeAlarms(long taskId, ArrayList<Alarm> alarms) { public void synchronizeAlarms(long taskId, LinkedHashSet<Long> alarms) {
database.openForWriting(); MetadataService service = PluginServices.getMetadataService();
dao.deleteWhere(Alarm.TASK.eq(taskId));
if(alarmsIdentical(taskId, alarms))
return;
service.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId),
MetadataCriteria.withKey(Alarm.METADATA_KEY)));
Metadata metadata = new Metadata();
metadata.setValue(Metadata.KEY, Alarm.METADATA_KEY);
metadata.setValue(Metadata.TASK, taskId);
for(Long alarm : alarms) {
metadata.clearValue(Metadata.ID);
metadata.setValue(Alarm.TIME, alarm);
metadata.setValue(Alarm.TYPE, Alarm.TYPE_SINGLE);
service.save(metadata);
scheduleAlarm(metadata);
}
}
private boolean alarmsIdentical(long taskId, LinkedHashSet<Long> alarms) {
TodorooCursor<Metadata> cursor = getAlarms(taskId);
try {
if(cursor.getCount() != alarms.size())
return false;
for(Long alarm : alarms) {
cursor.moveToNext();
if(alarm != cursor.get(Alarm.TIME))
return false;
}
} finally {
cursor.close();
}
return true;
}
// --- alarm scheduling
/**
* Gets a listing of all alarms that are active
* @param properties
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/
private TodorooCursor<Metadata> getActiveAlarms() {
return PluginServices.getMetadataService().query(Query.select(Alarm.TIME).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))).
where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(Alarm.METADATA_KEY))));
}
/**
* Gets a listing of alarms by task
* @param properties
* @return todoroo cursor. PLEASE CLOSE THIS CURSOR!
*/
private TodorooCursor<Metadata> getAlarmsForTask(long taskId) {
return PluginServices.getMetadataService().query(Query.select(Alarm.TIME).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))).
where(Criterion.and(TaskCriteria.isActive(),
MetadataCriteria.byTaskAndwithKey(taskId, Alarm.METADATA_KEY))));
}
/**
* Schedules all alarms
*/
public void scheduleAllAlarms() {
TodorooCursor<Metadata> cursor = getActiveAlarms();
try {
Metadata alarm = new Metadata();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
alarm.readFromCursor(cursor);
scheduleAlarm(alarm);
}
} catch (Exception e) {
// suppress
} finally {
cursor.close();
}
}
private static final long NO_ALARM = Long.MAX_VALUE;
/**
* Schedules alarms for a single task
* @param task
*/
public void scheduleAlarms(Task task) {
TodorooCursor<Metadata> cursor = getAlarmsForTask(task.getId());
try {
Metadata alarm = new Metadata();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
alarm.readFromCursor(cursor);
scheduleAlarm(alarm);
}
} catch (Exception e) {
// suppress
} finally {
cursor.close();
}
}
/**
* Schedules alarms for a single task
*
* @param shouldPerformPropertyCheck
* whether to check if task has requisite properties
*/
@SuppressWarnings("nls")
private void scheduleAlarm(Metadata alarm) {
if(alarm == null)
return;
long taskId = alarm.getValue(Metadata.TASK);
int type = ReminderService.TYPE_ALARM;
Context context = ContextManager.getContext();
Intent intent = new Intent(context, Notifications.class);
intent.setType("ALARM" + Long.toString(taskId)); //$NON-NLS-1$
intent.setAction(Integer.toString(type));
intent.putExtra(Notifications.ID_KEY, taskId);
intent.putExtra(Notifications.TYPE_KEY, type);
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, 0);
for(Alarm alarm : alarms) { long time = alarm.getValue(Alarm.TIME);
alarm.setId(Alarm.NO_ID); if(time == 0 || time == NO_ALARM)
alarm.setValue(Alarm.TASK, taskId); am.cancel(pendingIntent);
dao.saveExisting(alarm); else {
Log.e("Astrid", "Alarm (" + taskId + ", " + type +
") set for " + new Date(time));
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
} }
} }
} }

@ -0,0 +1,47 @@
package com.todoroo.astrid.alarms;
import java.util.LinkedHashSet;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.model.Metadata;
public class AlarmTaskRepeatListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
if(taskId == -1)
return;
long oldDueDate = intent.getLongExtra(AstridApiConstants.EXTRAS_OLD_DUE_DATE, 0);
if(oldDueDate == 0)
oldDueDate = DateUtilities.now();
long newDueDate = intent.getLongExtra(AstridApiConstants.EXTRAS_NEW_DUE_DATE, -1);
if(newDueDate <= 0 || newDueDate <= oldDueDate)
return;
TodorooCursor<Metadata> cursor = AlarmService.getInstance().getAlarms(taskId);
try {
if(cursor.getCount() == 0)
return;
Metadata metadata = new Metadata();
LinkedHashSet<Long> alarms = new LinkedHashSet<Long>(cursor.getCount());
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
metadata.readFromCursor(cursor);
alarms.add(metadata.getValue(Alarm.TIME) + (newDueDate - oldDueDate));
}
AlarmService.getInstance().synchronizeAlarms(taskId, alarms);
} finally {
cursor.close();
}
}
}

@ -121,8 +121,8 @@ public class BackupPreferences extends TodorooPreferences {
}); });
} else if(last > 0) { } else if(last > 0) {
status = r.getString(R.string.backup_status_success, status = r.getString(R.string.backup_status_success,
DateUtilities.getDateWithTimeFormat(BackupPreferences.this). DateUtilities.getDateStringWithTime(BackupPreferences.this,
format(new Date(last))); new Date(last)));
statusColor = Color.rgb(0, 100, 0); statusColor = Color.rgb(0, 100, 0);
preference.setOnPreferenceClickListener(null); preference.setOnPreferenceClickListener(null);
} else { } else {

@ -6,6 +6,7 @@ import java.io.IOException;
import org.xmlpull.v1.XmlSerializer; import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
@ -16,8 +17,8 @@ import android.widget.Toast;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
@ -82,6 +83,8 @@ public class TasksXmlExporter {
progressDialog.setCancelable(false); progressDialog.setCancelable(false);
progressDialog.setIndeterminate(false); progressDialog.setIndeterminate(false);
progressDialog.show(); progressDialog.show();
if(context instanceof Activity)
progressDialog.setOwnerActivity((Activity)context);
} }
new Thread(new Runnable() { new Thread(new Runnable() {

@ -2,14 +2,15 @@ package com.todoroo.astrid.backup;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashSet;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
@ -97,6 +98,8 @@ public class TasksXmlImporter {
progressDialog.setCancelable(false); progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true); progressDialog.setIndeterminate(true);
progressDialog.show(); progressDialog.show();
if(context instanceof Activity)
progressDialog.setOwnerActivity((Activity)context);
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
@ -326,7 +329,7 @@ public class TasksXmlImporter {
private String upgradeNotes = null; private String upgradeNotes = null;
private boolean syncOnComplete = false; private boolean syncOnComplete = false;
private final ArrayList<String> tags = new ArrayList<String>(); private final LinkedHashSet<String> tags = new LinkedHashSet<String>();
public Format1TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException { public Format1TaskImporter(XmlPullParser xpp) throws XmlPullParserException, IOException {
this.xpp = xpp; this.xpp = xpp;
@ -496,7 +499,7 @@ public class TasksXmlImporter {
if(preferred != null) { if(preferred != null) {
Date preferredDate = BackupDateUtilities.getDateFromIso8601String(value); Date preferredDate = BackupDateUtilities.getDateFromIso8601String(value);
upgradeNotes = "Goal Deadline: " + upgradeNotes = "Goal Deadline: " +
DateUtilities.getFormattedDate(ContextManager.getContext(), DateUtilities.getDateString(ContextManager.getContext(),
preferredDate); preferredDate);
} }
task.setValue(Task.DUE_DATE, task.setValue(Task.DUE_DATE,

@ -127,12 +127,12 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
// last sync was error // last sync was error
else if(getUtilities().getLastAttemptedSyncDate() != 0) { else if(getUtilities().getLastAttemptedSyncDate() != 0) {
status = r.getString(R.string.rmilk_status_failed, status = r.getString(R.string.rmilk_status_failed,
DateUtilities.getDateWithTimeFormat(SyncProviderPreferences.this). DateUtilities.getDateStringWithTime(SyncProviderPreferences.this,
format(new Date(getUtilities().getLastAttemptedSyncDate()))); new Date(getUtilities().getLastAttemptedSyncDate())));
if(getUtilities().getLastSyncDate() > 0) { if(getUtilities().getLastSyncDate() > 0) {
subtitle = r.getString(R.string.rmilk_status_failed_subtitle, subtitle = r.getString(R.string.rmilk_status_failed_subtitle,
DateUtilities.getDateWithTimeFormat(SyncProviderPreferences.this). DateUtilities.getDateStringWithTime(SyncProviderPreferences.this,
format(new Date(getUtilities().getLastSyncDate()))); new Date(getUtilities().getLastSyncDate())));
} }
statusColor = Color.rgb(100, 0, 0); statusColor = Color.rgb(100, 0, 0);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@ -145,8 +145,8 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
}); });
} else if(getUtilities().getLastSyncDate() > 0) { } else if(getUtilities().getLastSyncDate() > 0) {
status = r.getString(R.string.rmilk_status_success, status = r.getString(R.string.rmilk_status_success,
DateUtilities.getDateWithTimeFormat(SyncProviderPreferences.this). DateUtilities.getDateStringWithTime(SyncProviderPreferences.this,
format(new Date(getUtilities().getLastSyncDate()))); new Date(getUtilities().getLastSyncDate())));
statusColor = Color.rgb(0, 100, 0); statusColor = Color.rgb(0, 100, 0);
} else { } else {
status = r.getString(R.string.rmilk_status_never); status = r.getString(R.string.rmilk_status_never);

@ -14,6 +14,7 @@ import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order; import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.FilterListActivity; import com.todoroo.astrid.activity.FilterListActivity;
@ -22,8 +23,11 @@ import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory; import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.SearchFilter; import com.todoroo.astrid.api.SearchFilter;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.tags.TagService;
/** /**
* Exposes Astrid's built in filters to the {@link FilterListActivity} * Exposes Astrid's built in filters to the {@link FilterListActivity}
@ -86,7 +90,7 @@ public final class CoreFilterExposer extends BroadcastReceiver {
r.getString(R.string.BFE_Alphabetical), r.getString(R.string.BFE_Alphabetical),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())). TaskCriteria.isVisible())).
orderBy(Order.asc(Task.TITLE)), orderBy(Order.asc(Functions.upper(Task.TITLE))),
null); null);
alphabetical.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap(); alphabetical.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_alpha)).getBitmap();
@ -134,8 +138,11 @@ public final class CoreFilterExposer extends BroadcastReceiver {
*/ */
public static Filter buildInboxFilter(Resources r) { public static Filter buildInboxFilter(Resources r) {
Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active_title), Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active_title),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(), new QueryTemplate().where(
TaskCriteria.isVisible())), Criterion.and(TaskCriteria.isActive(), TaskCriteria.isVisible(),
Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(
Criterion.and(MetadataCriteria.withKey(TagService.KEY),
TagService.TAG.like("x_%", "x"))))))), //$NON-NLS-1$ //$NON-NLS-2$
null); null);
inbox.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_home)).getBitmap(); inbox.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_home)).getBitmap();
return inbox; return inbox;

@ -3,9 +3,11 @@ package com.todoroo.astrid.core;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.service.AddOnService; import com.todoroo.astrid.service.AddOnService;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
@ -32,11 +34,18 @@ public final class PluginServices {
@Autowired @Autowired
DialogUtilities dialogUtilities; DialogUtilities dialogUtilities;
@Autowired
DateUtilities dateUtilities;
@Autowired @Autowired
AddOnService addOnService; AddOnService addOnService;
private static PluginServices instance; private static PluginServices instance;
static {
AstridDependencyInjector.initialize();
}
private PluginServices() { private PluginServices() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }
@ -68,4 +77,8 @@ public final class PluginServices {
public static DialogUtilities getDialogUtilities() { public static DialogUtilities getDialogUtilities() {
return getInstance().dialogUtilities; return getInstance().dialogUtilities;
} }
public static DateUtilities getDateUtilities() {
return getInstance().dateUtilities;
}
} }

@ -7,16 +7,18 @@ import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.Spinner;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Spinner;
import android.widget.Toast;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
@ -100,6 +102,9 @@ public class GCalControlSet implements TaskEditControlSet {
cursor.moveToFirst(); cursor.moveToFirst();
intent.putExtra("beginTime", cursor.getLong(0)); intent.putExtra("beginTime", cursor.getLong(0));
intent.putExtra("endTime", cursor.getLong(1)); intent.putExtra("endTime", cursor.getLong(1));
} catch (Exception e) {
Log.e("gcal-error", "Error opening calendar", e); //$NON-NLS-1$ //$NON-NLS-2$
Toast.makeText(activity, R.string.gcal_TEA_error, Toast.LENGTH_LONG);
} finally { } finally {
cursor.close(); cursor.close();
} }
@ -174,8 +179,9 @@ public class GCalControlSet implements TaskEditControlSet {
values.put("dtstart", dueDate - estimatedTime); values.put("dtstart", dueDate - estimatedTime);
values.put("dtend", dueDate); values.put("dtend", dueDate);
} else { } else {
values.put("dtstart", dueDate); // calendar thinks 23:59:59 is next day, move it back
values.put("dtend", dueDate); values.put("dtstart", dueDate - DateUtilities.ONE_DAY + 1000L);
values.put("dtend", dueDate - DateUtilities.ONE_DAY + 1000L);
values.put("allDay", "1"); values.put("allDay", "1");
} }
} else { } else {

@ -16,6 +16,7 @@ import android.widget.Spinner;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.activity.AddOnActivity; import com.todoroo.astrid.activity.AddOnActivity;
import com.todoroo.astrid.adapter.FilterAdapter; import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -96,6 +97,8 @@ public final class LocaleEditAlerts extends ExpandableListActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.locale_edit_alerts); setContentView(R.layout.locale_edit_alerts);
ContextManager.setContext(this);
/* /*
* Locale guarantees that the breadcrumb string will be present, but checking for null anyway makes your Activity more * Locale guarantees that the breadcrumb string will be present, but checking for null anyway makes your Activity more
* robust and re-usable * robust and re-usable

@ -9,7 +9,7 @@ import android.util.Log;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.ShortcutActivity; import com.todoroo.astrid.activity.ShortcutActivity;
@ -17,7 +17,6 @@ import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.reminders.Notifications; import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Preferences; import com.todoroo.astrid.utility.Preferences;
@ -29,9 +28,6 @@ import com.todoroo.astrid.utility.Preferences;
*/ */
public class LocaleReceiver extends BroadcastReceiver { public class LocaleReceiver extends BroadcastReceiver {
@Autowired
private TaskService taskService;
/** /**
* Create a preference key for storing / retrieving last interval time * Create a preference key for storing / retrieving last interval time
* @param filterTitle * @param filterTitle
@ -46,6 +42,8 @@ public class LocaleReceiver extends BroadcastReceiver {
@Override @Override
/** Called when the system is started up */ /** Called when the system is started up */
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
ContextManager.setContext(context);
try { try {
if (com.twofortyfouram.Intent.ACTION_FIRE_SETTING.equals(intent.getAction())) { if (com.twofortyfouram.Intent.ACTION_FIRE_SETTING.equals(intent.getAction())) {
if(!PluginServices.getAddOnService().hasLocalePlugin()) if(!PluginServices.getAddOnService().hasLocalePlugin())
@ -72,7 +70,7 @@ public class LocaleReceiver extends BroadcastReceiver {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
Filter filter = new Filter(title, title, null, null); Filter filter = new Filter(title, title, null, null);
filter.sqlQuery = sql; filter.sqlQuery = sql;
TodorooCursor<Task> cursor = taskService.fetchFiltered(filter, null, Task.ID); TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered(filter, null, Task.ID);
try { try {
if(cursor.getCount() == 0) if(cursor.getCount() == 0)
return; return;

@ -20,23 +20,28 @@
package com.todoroo.astrid.producteev; package com.todoroo.astrid.producteev;
import android.app.Activity; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.text.Editable;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.TextView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.producteev.api.ProducteevInvoker;
import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider;
import com.todoroo.astrid.utility.Preferences;
/** /**
* This activity displays a <code>WebView</code> that allows users to log in to * This activity allows users to sign in or log in to Producteev
* the synchronization provider requested. A callback method determines whether
* their login was successful and therefore whether to dismiss the dialog.
* *
* @author arne.jans * @author arne.jans
* *
@ -46,26 +51,6 @@ public class ProducteevLoginActivity extends Activity {
@Autowired @Autowired
DialogUtilities dialogUtilities; DialogUtilities dialogUtilities;
// --- callback
/** Callback interface */
public interface SyncLoginCallback {
/**
* Verifies whether the user's login attempt was successful. Will be
* called off of the UI thread, use the handler to post messages.
*
* @return error string, or null if sync was successful
*/
public String verifyLogin(Handler handler, String email, String password);
}
protected static SyncLoginCallback callback = null;
/** Sets callback method */
public static void setCallback(SyncLoginCallback newCallback) {
callback = newCallback;
}
// --- ui initialization // --- ui initialization
public ProducteevLoginActivity() { public ProducteevLoginActivity() {
@ -76,70 +61,157 @@ public class ProducteevLoginActivity extends Activity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ContextManager.setContext(this);
setContentView(R.layout.producteev_login_activity); setContentView(R.layout.producteev_login_activity);
setTitle(R.string.producteev_PLA_title);
// terms clicking
findViewById(R.id.terms).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.producteev.com/#terms"))); //$NON-NLS-1$
}
});
final EditText emailEditText = (EditText) findViewById(R.id.Poducteev_EMail_EditText); final TextView errors = (TextView) findViewById(R.id.error);
final EditText passwordEditText = (EditText) findViewById(R.id.Producteev_Password_EditText); final EditText emailEditText = (EditText) findViewById(R.id.email);
Button cancel = (Button) findViewById(R.id.cancel); final EditText passwordEditText = (EditText) findViewById(R.id.password);
Button login = (Button) findViewById(R.id.done); final View newUserLayout = findViewById(R.id.newUserLayout);
login.setOnClickListener(new OnClickListener() { Button signIn = (Button) findViewById(R.id.signIn);
signIn.setOnClickListener(new OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
final Handler handler = new Handler(); errors.setVisibility(View.GONE);
if(newUserLayout.getVisibility() == View.VISIBLE)
if (callback == null) { newUserLayout.setVisibility(View.GONE);
finish(); else {
Editable email = emailEditText.getText();
Editable password = passwordEditText.getText();
if(email.length() == 0 || password.length() == 0) {
errors.setVisibility(View.VISIBLE);
errors.setText(R.string.producteev_PLA_errorEmpty);
return; return;
} }
final String email = emailEditText.getText().toString(); performLogin(email.toString(), password.toString());
final String password = passwordEditText.getText().toString(); }
if (email == null || email.length() == 0) { }
// no email given
Toast.makeText(ProducteevLoginActivity.this, });
R.string.producteev_MLA_email_empty,
Toast.LENGTH_LONG).show();
setResult(RESULT_CANCELED);
finish();
return;
Button createNew = (Button) findViewById(R.id.createNew);
createNew.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
errors.setVisibility(View.GONE);
if(newUserLayout.getVisibility() != View.VISIBLE)
newUserLayout.setVisibility(View.VISIBLE);
else {
Editable email = emailEditText.getText();
Editable password = passwordEditText.getText();
Editable confirmPassword = ((EditText)findViewById(R.id.confirmPassword)).getText();
Editable firstName = ((EditText)findViewById(R.id.firstName)).getText();
Editable lastName = ((EditText)findViewById(R.id.lastName)).getText();
if(email.length() == 0 || password.length() == 0 ||
confirmPassword.length() == 0 || firstName.length() == 0 ||
lastName.length() == 0) {
errors.setVisibility(View.VISIBLE);
errors.setText(R.string.producteev_PLA_errorEmpty);
return;
} }
if (password == null || password.length() == 0) { if(!confirmPassword.toString().equals(password.toString())) {
// no password given errors.setVisibility(View.VISIBLE);
Toast.makeText(ProducteevLoginActivity.this, errors.setText(R.string.producteev_PLA_errorMatch);
R.string.producteev_MLA_password_empty,
Toast.LENGTH_LONG).show();
setResult(RESULT_CANCELED);
finish();
return; return;
}
performSignup(email.toString(), password.toString(),
firstName.toString(), lastName.toString());
}
}
});
} }
new Thread(new Runnable() {
private void performLogin(final String email, final String password) {
final ProgressDialog dialog = dialogUtilities.progressDialog(this,
getString(R.string.DLG_wait));
final TextView errors = (TextView) findViewById(R.id.error);
dialog.show();
new Thread() {
@Override
public void run() { public void run() {
final String result = callback.verifyLogin(handler, ProducteevInvoker invoker = ProducteevSyncProvider.getInvoker();
email, password); final StringBuilder errorMessage = new StringBuilder();
if (result == null) { try {
finish(); invoker.authenticate(email, password);
} else {
// display the error Preferences.setString(R.string.producteev_PPr_email, email);
handler.post(new Runnable() { Preferences.setString(R.string.producteev_PPr_password, password);
ProducteevUtilities.INSTANCE.setToken(invoker.getToken());
synchronize();
} catch (Exception e) {
errorMessage.append(e.getMessage());
} finally {
runOnUiThread(new Runnable() {
public void run() { public void run() {
dialogUtilities.okDialog( dialog.dismiss();
ProducteevLoginActivity.this, if(errorMessage.length() > 0) {
result, null); errors.setVisibility(View.VISIBLE);
errors.setText(errorMessage);
}
} }
}); });
} }
} }
}).start(); }.start();
} }
});
cancel.setOnClickListener(new OnClickListener() { private void performSignup(final String email, final String password,
public void onClick(View v) { final String firstName, final String lastName) {
setResult(RESULT_CANCELED); final ProgressDialog dialog = dialogUtilities.progressDialog(this,
finish(); getString(R.string.DLG_wait));
final TextView errors = (TextView) findViewById(R.id.error);
dialog.show();
new Thread() {
@Override
public void run() {
ProducteevInvoker invoker = ProducteevSyncProvider.getInvoker();
final StringBuilder errorMessage = new StringBuilder();
try {
invoker.usersSignUp(email, firstName, lastName, password, null);
invoker.authenticate(email, password);
Preferences.setString(R.string.producteev_PPr_email, email);
Preferences.setString(R.string.producteev_PPr_password, password);
ProducteevUtilities.INSTANCE.setToken(invoker.getToken());
synchronize();
} catch (Exception e) {
errorMessage.append(e.getMessage());
} finally {
runOnUiThread(new Runnable() {
public void run() {
dialog.dismiss();
if(errorMessage.length() > 0) {
errors.setVisibility(View.VISIBLE);
errors.setText(errorMessage);
}
} }
}); });
} }
}
}.start();
}
/**
* Perform synchronization
*/
protected void synchronize() {
startService(new Intent(ProducteevBackgroundService.SYNC_ACTION, null,
this, ProducteevBackgroundService.class));
finish();
}
} }

@ -1,8 +1,13 @@
package com.todoroo.astrid.producteev; package com.todoroo.astrid.producteev;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.common.SyncProviderPreferences; import com.todoroo.astrid.common.SyncProviderPreferences;
import com.todoroo.astrid.common.SyncProviderUtilities; import com.todoroo.astrid.common.SyncProviderUtilities;
import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider; import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider;
@ -37,5 +42,41 @@ public class ProducteevPreferences extends SyncProviderPreferences {
return ProducteevUtilities.INSTANCE; return ProducteevUtilities.INSTANCE;
} }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListPreference defaultDash = (ListPreference)findPreference(getString(R.string.producteev_PPr_defaultdash_key));
if(ProducteevUtilities.INSTANCE.isLoggedIn()) {
//
}
String[] entries = new String[2];
entries[0] = getString(R.string.producteev_no_dashboard);
entries[1] = getString(R.string.producteev_default_dashboard);
String[] entryValues = new String[2];
entryValues[0] = Integer.toString(ProducteevUtilities.DASHBOARD_NO_SYNC);
entryValues[1] = Integer.toString(ProducteevUtilities.DASHBOARD_DEFAULT);
defaultDash.setEntries(entries);
defaultDash.setEntryValues(entryValues);
}
@Override
public void updatePreferences(Preference preference, Object value) {
super.updatePreferences(preference, value);
final Resources r = getResources();
if (r.getString(R.string.producteev_PPr_defaultdash_key).equals(
preference.getKey())) {
int index = AndroidUtilities.indexOf(((ListPreference)preference).getEntryValues(), (String)value);
if(index == -1)
index = 1;
if(index == 0)
preference.setSummary(R.string.producteev_PPr_defaultdash_summary_none);
else
preference.setSummary(r.getString(
R.string.producteev_PPr_defaultdash_summary,
((ListPreference)preference).getEntries()[index]));
}
}
} }

@ -19,6 +19,12 @@ public class ProducteevUtilities extends SyncProviderUtilities {
public static final ProducteevUtilities INSTANCE = new ProducteevUtilities(); public static final ProducteevUtilities INSTANCE = new ProducteevUtilities();
/** setting for dashboard to not synchronize */
public static final int DASHBOARD_NO_SYNC = -1;
/** setting for dashboard to use default one */
public static final int DASHBOARD_DEFAULT = 0;
@Override @Override
public String getIdentifier() { public String getIdentifier() {
return IDENTIFIER; return IDENTIFIER;

@ -81,6 +81,21 @@ public class ProducteevInvoker {
} }
// --- users
/**
* Sign up as the given user
*/
public JSONObject usersSignUp(String email, String firstName, String lastName, String
password, Long fbUid) throws IOException, ApiServiceException {
return invokeGet("users/signup.json",
"email", email,
"firstname", firstName,
"lastname", lastName,
"password", password,
"fbuid", fbUid);
}
// --- tasks // --- tasks
/** /**

@ -87,7 +87,7 @@ public class ProducteevRestClient implements RestClient {
} }
int statusCode = response.getStatusLine().getStatusCode(); int statusCode = response.getStatusLine().getStatusCode();
if(statusCode != HTTP_OK) { if(statusCode != HTTP_OK || (body != null && body.startsWith("{\"error\":"))) { //$NON-NLS-1$
ApiServiceException error; ApiServiceException error;
try { try {
JSONObject errorObject = new JSONObject(body).getJSONObject("error"); //$NON-NLS-1$ JSONObject errorObject = new JSONObject(body).getJSONObject("error"); //$NON-NLS-1$

@ -73,4 +73,3 @@ public class ProducteevDatabase extends AbstractDatabase {
} }
} }

@ -17,7 +17,6 @@ import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Handler;
import android.text.TextUtils; import android.text.TextUtils;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
@ -38,12 +37,10 @@ import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.producteev.ProducteevLoginActivity; import com.todoroo.astrid.producteev.ProducteevLoginActivity;
import com.todoroo.astrid.producteev.ProducteevPreferences; import com.todoroo.astrid.producteev.ProducteevPreferences;
import com.todoroo.astrid.producteev.ProducteevUtilities; import com.todoroo.astrid.producteev.ProducteevUtilities;
import com.todoroo.astrid.producteev.ProducteevLoginActivity.SyncLoginCallback;
import com.todoroo.astrid.producteev.api.ApiResponseParseException; import com.todoroo.astrid.producteev.api.ApiResponseParseException;
import com.todoroo.astrid.producteev.api.ApiServiceException; import com.todoroo.astrid.producteev.api.ApiServiceException;
import com.todoroo.astrid.producteev.api.ApiUtilities; import com.todoroo.astrid.producteev.api.ApiUtilities;
import com.todoroo.astrid.producteev.api.ProducteevInvoker; import com.todoroo.astrid.producteev.api.ProducteevInvoker;
import com.todoroo.astrid.rmilk.api.ServiceInternalException;
import com.todoroo.astrid.rmilk.data.MilkNote; import com.todoroo.astrid.rmilk.data.MilkNote;
import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
@ -148,10 +145,7 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
try { try {
String authToken = preferences.getToken(); String authToken = preferences.getToken();
invoker = getInvoker();
String z = stripslashes(0, "71o3346pr40o5o4nt4n7t6n287t4op28","2");
String v = stripslashes(2, "9641n76n9s1736q1578q1o1337q19233","4ae");
invoker = new ProducteevInvoker(z, v);
String email = Preferences.getStringValue(R.string.producteev_PPr_email); String email = Preferences.getStringValue(R.string.producteev_PPr_email);
String password = Preferences.getStringValue(R.string.producteev_PPr_password); String password = Preferences.getStringValue(R.string.producteev_PPr_password);
@ -165,24 +159,6 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
// display login-activity // display login-activity
final Context context = ContextManager.getContext(); final Context context = ContextManager.getContext();
Intent intent = new Intent(context, ProducteevLoginActivity.class); Intent intent = new Intent(context, ProducteevLoginActivity.class);
ProducteevLoginActivity.setCallback(new SyncLoginCallback() {
public String verifyLogin(final Handler syncLoginHandler, String em, String pass) {
try {
invoker.authenticate(em, pass);
preferences.setToken(invoker.getToken());
Preferences.setString(R.string.producteev_PPr_email, em);
Preferences.setString(R.string.producteev_PPr_password, pass);
performSync();
return null;
} catch (Exception e) {
// didn't work
exceptionService.reportError("producteev-verify-login", e);
if(e instanceof ServiceInternalException)
e = ((ServiceInternalException)e).getEnclosedException();
return context.getString(R.string.producteev_ioerror, e.getMessage());
}
}
});
if(context instanceof Activity) if(context instanceof Activity)
((Activity)context).startActivityForResult(intent, 0); ((Activity)context).startActivityForResult(intent, 0);
else { else {
@ -204,6 +180,12 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
} }
} }
public static ProducteevInvoker getInvoker() {
String z = stripslashes(0, "71o3346pr40o5o4nt4n7t6n287t4op28","2");
String v = stripslashes(2, "9641n76n9s1736q1578q1o1337q19233","4ae");
return new ProducteevInvoker(z, v);
}
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// ----------------------------------------------------- synchronization! // ----------------------------------------------------- synchronization!
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------

@ -32,10 +32,10 @@ public class Notifications extends BroadcastReceiver {
// --- constants // --- constants
/** task id extra */ /** task id extra */
static final String ID_KEY = "id"; //$NON-NLS-1$ public static final String ID_KEY = "id"; //$NON-NLS-1$
/** notification type extra */ /** notification type extra */
static final String TYPE_KEY = "type"; //$NON-NLS-1$ public static final String TYPE_KEY = "type"; //$NON-NLS-1$
/** preference values */ /** preference values */
public static final int ICON_SET_PINK = 0; public static final int ICON_SET_PINK = 0;
@ -72,15 +72,24 @@ public class Notifications extends BroadcastReceiver {
Resources r = context.getResources(); Resources r = context.getResources();
String reminder; String reminder;
if(type == ReminderService.TYPE_ALARM)
reminder = getRandomReminder(r.getStringArray(R.array.reminders_alarm));
else if(Preferences.getBoolean(R.string.p_rmd_nagging, true)) {
if(type == ReminderService.TYPE_DUE || type == ReminderService.TYPE_OVERDUE) if(type == ReminderService.TYPE_DUE || type == ReminderService.TYPE_OVERDUE)
reminder = getRandomReminder(r.getStringArray(R.array.reminders_due)); reminder = getRandomReminder(r.getStringArray(R.array.reminders_due));
else if(type == ReminderService.TYPE_SNOOZE) else if(type == ReminderService.TYPE_SNOOZE)
reminder = getRandomReminder(r.getStringArray(R.array.reminders_snooze)); reminder = getRandomReminder(r.getStringArray(R.array.reminders_snooze));
else if(Preferences.getBoolean(R.string.p_rmd_nagging, true))
reminder = getRandomReminder(r.getStringArray(R.array.reminders));
else else
reminder = getRandomReminder(r.getStringArray(R.array.reminders));
} else
reminder = ""; //$NON-NLS-1$ reminder = ""; //$NON-NLS-1$
synchronized(Notifications.class) {
if(notificationManager == null)
notificationManager = new AndroidNotificationManager(context);
}
if(!showTaskNotification(id, type, reminder)) { if(!showTaskNotification(id, type, reminder)) {
notificationManager.cancel((int)id); notificationManager.cancel((int)id);
} }

@ -48,13 +48,15 @@ public final class ReminderService {
}; };
/** flag for due date reminder */ /** flag for due date reminder */
static final int TYPE_DUE = 0; public static final int TYPE_DUE = 0;
/** flag for overdue reminder */ /** flag for overdue reminder */
static final int TYPE_OVERDUE = 1; public static final int TYPE_OVERDUE = 1;
/** flag for random reminder */ /** flag for random reminder */
static final int TYPE_RANDOM = 2; public static final int TYPE_RANDOM = 2;
/** flag for a snoozed reminder */ /** flag for a snoozed reminder */
static final int TYPE_SNOOZE = 3; public static final int TYPE_SNOOZE = 3;
/** flag for an alarm reminder */
public static final int TYPE_ALARM = 4;
static final Random random = new Random(); static final Random random = new Random();
@ -179,6 +181,8 @@ public final class ReminderService {
scheduler.createAlarm(task, whenDueDate, TYPE_DUE); scheduler.createAlarm(task, whenDueDate, TYPE_DUE);
else if(whenOverdue != NO_ALARM) else if(whenOverdue != NO_ALARM)
scheduler.createAlarm(task, whenOverdue, TYPE_OVERDUE); scheduler.createAlarm(task, whenOverdue, TYPE_OVERDUE);
else
scheduler.createAlarm(task, 0, 0);
} }
/** /**
@ -291,14 +295,6 @@ public final class ReminderService {
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
public void createAlarm(Task task, long time, int type) { public void createAlarm(Task task, long time, int type) {
if(time == 0 || time == NO_ALARM)
return;
if(time < DateUtilities.now()) {
time = DateUtilities.now() + (long)((0.5f +
4 * random.nextFloat()) * DateUtilities.ONE_HOUR);
}
Context context = ContextManager.getContext(); Context context = ContextManager.getContext();
Intent intent = new Intent(context, Notifications.class); Intent intent = new Intent(context, Notifications.class);
intent.setType(Long.toString(task.getId())); intent.setType(Long.toString(task.getId()));
@ -310,11 +306,20 @@ public final class ReminderService {
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, 0); intent, 0);
if(time == 0 || time == NO_ALARM)
am.cancel(pendingIntent);
else {
if(time < DateUtilities.now()) {
time = DateUtilities.now() + (long)((0.5f +
4 * random.nextFloat()) * DateUtilities.ONE_HOUR);
}
Log.e("Astrid", "Alarm (" + task.getId() + ", " + type + Log.e("Astrid", "Alarm (" + task.getId() + ", " + type +
") set for " + new Date(time)); ") set for " + new Date(time));
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
} }
} }
}
// --- data fetching methods // --- data fetching methods

@ -8,6 +8,7 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.astrid.alarms.AlarmService;
import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.AstridDependencyInjector;
/** /**
@ -33,6 +34,7 @@ public class ReminderStartupReceiver extends BroadcastReceiver {
ContextManager.setContext(context); ContextManager.setContext(context);
try { try {
ReminderService.getInstance().scheduleAllAlarms(); ReminderService.getInstance().scheduleAllAlarms();
AlarmService.getInstance().scheduleAllAlarms();
} catch (Exception e) { } catch (Exception e) {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
exceptionService.reportError("reminder-startup", e); //$NON-NLS-1$ exceptionService.reportError("reminder-startup", e); //$NON-NLS-1$

@ -4,6 +4,7 @@ import java.text.DateFormatSymbols;
import java.text.ParseException; import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
import android.app.Activity; import android.app.Activity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -11,13 +12,13 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.google.ical.values.Frequency; import com.google.ical.values.Frequency;
import com.google.ical.values.RRule; import com.google.ical.values.RRule;
@ -61,10 +62,13 @@ public class RepeatControlSet implements TaskEditControlSet {
private final LinearLayout repeatContainer; private final LinearLayout repeatContainer;
private final LinearLayout daysOfWeekContainer; private final LinearLayout daysOfWeekContainer;
private final CompoundButton[] daysOfWeek = new CompoundButton[7]; private final CompoundButton[] daysOfWeek = new CompoundButton[7];
private Task model;
@Autowired @Autowired
ExceptionService exceptionService; ExceptionService exceptionService;
boolean setInterval = false;
// --- implementation // --- implementation
public RepeatControlSet(final Activity activity, ViewGroup parent) { public RepeatControlSet(final Activity activity, ViewGroup parent) {
@ -111,10 +115,22 @@ public class RepeatControlSet implements TaskEditControlSet {
repeatValueClick(); repeatValueClick();
} }
}); });
interval.setOnItemSelectedListener(new OnItemSelectedListener() { interval.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override @Override
public void onItemSelected(AdapterView<?> parentView, View view, int position, long id) { public void onItemSelected(AdapterView<?> parentView, View view, int position, long id) {
daysOfWeekContainer.setVisibility(position == INTERVAL_WEEKS ? View.VISIBLE : View.GONE); daysOfWeekContainer.setVisibility(position == INTERVAL_WEEKS ? View.VISIBLE : View.GONE);
if(position == INTERVAL_WEEKS) {
Date date;
if(model.getValue(Task.DUE_DATE) == 0)
date = new Date();
else
date = new Date(model.getValue(Task.DUE_DATE));
int dayOfWeek = date.getDay();
for(int i = 0; i < 7; i++)
daysOfWeek[i].setChecked(i == dayOfWeek);
}
} }
@Override @Override
@ -122,6 +138,7 @@ public class RepeatControlSet implements TaskEditControlSet {
// //
} }
}); });
daysOfWeekContainer.setVisibility(View.GONE);
} }
/** Set up the repeat value button */ /** Set up the repeat value button */
@ -156,6 +173,8 @@ public class RepeatControlSet implements TaskEditControlSet {
@Override @Override
public void readFromTask(Task task) { public void readFromTask(Task task) {
model = task;
String recurrence = task.getValue(Task.RECURRENCE); String recurrence = task.getValue(Task.RECURRENCE);
if(recurrence == null) if(recurrence == null)
recurrence = ""; //$NON-NLS-1$ recurrence = ""; //$NON-NLS-1$
@ -172,17 +191,6 @@ public class RepeatControlSet implements TaskEditControlSet {
break; break;
case WEEKLY: { case WEEKLY: {
interval.setSelection(INTERVAL_WEEKS); interval.setSelection(INTERVAL_WEEKS);
// clear all day of week checks, then update them
for(int i = 0; i < 7; i++)
daysOfWeek[i].setChecked(false);
for(WeekdayNum day : rrule.getByDay()) {
for(int i = 0; i < 7; i++)
if(daysOfWeek[i].getTag() == day.wday)
daysOfWeek[i].setChecked(true);
}
break; break;
} }
case MONTHLY: case MONTHLY:
@ -196,6 +204,19 @@ public class RepeatControlSet implements TaskEditControlSet {
exceptionService.reportError("repeat-unhandled-rule", //$NON-NLS-1$ exceptionService.reportError("repeat-unhandled-rule", //$NON-NLS-1$
new Exception("Unhandled rrule frequency: " + recurrence)); //$NON-NLS-1$ new Exception("Unhandled rrule frequency: " + recurrence)); //$NON-NLS-1$
} }
// clear all day of week checks, then update them
for(int i = 0; i < 7; i++)
daysOfWeek[i].setChecked(false);
for(WeekdayNum day : rrule.getByDay()) {
for(int i = 0; i < 7; i++)
if(daysOfWeek[i].getTag() == day.wday)
daysOfWeek[i].setChecked(true);
}
// suppress first call to interval.onItemSelected
setInterval = true;
} catch (ParseException e) { } catch (ParseException e) {
recurrence = ""; //$NON-NLS-1$ recurrence = ""; //$NON-NLS-1$
exceptionService.reportError("repeat-parse-exception", e); //$NON-NLS-1$ exceptionService.reportError("repeat-parse-exception", e); //$NON-NLS-1$
@ -226,6 +247,7 @@ public class RepeatControlSet implements TaskEditControlSet {
break; break;
case INTERVAL_WEEKS: { case INTERVAL_WEEKS: {
rrule.setFreq(Frequency.WEEKLY); rrule.setFreq(Frequency.WEEKLY);
ArrayList<WeekdayNum> days = new ArrayList<WeekdayNum>(); ArrayList<WeekdayNum> days = new ArrayList<WeekdayNum>();
for(int i = 0; i < daysOfWeek.length; i++) for(int i = 0; i < daysOfWeek.length; i++)
if(daysOfWeek[i].isChecked()) if(daysOfWeek[i].isChecked())
@ -239,6 +261,7 @@ public class RepeatControlSet implements TaskEditControlSet {
case INTERVAL_HOURS: case INTERVAL_HOURS:
rrule.setFreq(Frequency.HOURLY); rrule.setFreq(Frequency.HOURLY);
} }
result = rrule.toIcal(); result = rrule.toIcal();
} }
task.setValue(Task.RECURRENCE, result); task.setValue(Task.RECURRENCE, result);

@ -92,8 +92,8 @@ public class RepeatDetailExposer extends BroadcastReceiver implements DetailExpo
} }
interval = "<b>" + interval + "</b>"; //$NON-NLS-1$//$NON-NLS-2$ interval = "<b>" + interval + "</b>"; //$NON-NLS-1$//$NON-NLS-2$
if(rrule.getFreq() == Frequency.WEEKLY) {
List<WeekdayNum> byDay = rrule.getByDay(); List<WeekdayNum> byDay = rrule.getByDay();
if(rrule.getFreq() == Frequency.WEEKLY || byDay.size() != 7) {
if(byDay.size() > 0) { if(byDay.size() > 0) {
StringBuilder byDayString = new StringBuilder(); StringBuilder byDayString = new StringBuilder();
DateFormatSymbols dfs = new DateFormatSymbols(); DateFormatSymbols dfs = new DateFormatSymbols();

@ -1,6 +1,7 @@
package com.todoroo.astrid.repeats; package com.todoroo.astrid.repeats;
import java.text.ParseException; import java.text.ParseException;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
@ -15,37 +16,64 @@ import com.google.ical.values.DateValue;
import com.google.ical.values.DateValueImpl; import com.google.ical.values.DateValueImpl;
import com.google.ical.values.Frequency; import com.google.ical.values.Frequency;
import com.google.ical.values.RRule; import com.google.ical.values.RRule;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService;
public class RepeatTaskCompleteListener extends BroadcastReceiver { public class RepeatTaskCompleteListener extends BroadcastReceiver {
@Autowired
private TaskService taskService;
@Autowired
private ExceptionService exceptionService;
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1); long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
if(taskId == -1) if(taskId == -1)
return; return;
DependencyInjectionService.getInstance().inject(this); Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.RECURRENCE,
Task task = taskService.fetchById(taskId, Task.ID, Task.RECURRENCE,
Task.DUE_DATE, Task.FLAGS, Task.HIDE_UNTIL); Task.DUE_DATE, Task.FLAGS, Task.HIDE_UNTIL);
if(task == null) if(task == null)
return; return;
String recurrence = task.getValue(Task.RECURRENCE); String recurrence = task.getValue(Task.RECURRENCE);
if(recurrence != null && recurrence.length() > 0) { if(recurrence != null && recurrence.length() > 0) {
long newDueDate;
try {
newDueDate = computeNextDueDate(task, recurrence);
if(newDueDate == -1)
return;
} catch (ParseException e) {
PluginServices.getExceptionService().reportError("repeat-parse", e); //$NON-NLS-1$
return;
}
long hideUntil = task.getValue(Task.HIDE_UNTIL);
if(hideUntil > 0 && task.getValue(Task.DUE_DATE) > 0) {
hideUntil += newDueDate - task.getValue(Task.DUE_DATE);
}
// clone to create new task
Task clone = PluginServices.getTaskService().clone(task);
clone.setValue(Task.DUE_DATE, newDueDate);
clone.setValue(Task.HIDE_UNTIL, hideUntil);
clone.setValue(Task.COMPLETION_DATE, 0L);
clone.setValue(Task.TIMER_START, 0L);
clone.setValue(Task.ELAPSED_SECONDS, 0);
PluginServices.getTaskService().save(clone, false);
// clear recurrence from completed task so it can be re-completed
task.setValue(Task.RECURRENCE, ""); //$NON-NLS-1$
PluginServices.getTaskService().save(task, false);
// send a broadcast
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, clone.getId());
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_OLD_DUE_DATE, task.getValue(Task.DUE_DATE));
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_NEW_DUE_DATE, newDueDate);
context.sendOrderedBroadcast(broadcastIntent, null);
}
}
public static long computeNextDueDate(Task task, String recurrence) throws ParseException {
DateValue repeatFrom; DateValue repeatFrom;
Date repeatFromDate = new Date(); Date repeatFromDate = new Date();
@ -66,28 +94,33 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
} }
// invoke the recurrence iterator // invoke the recurrence iterator
try { long newDueDate = -1;
long newDueDate;
RRule rrule = new RRule(recurrence); RRule rrule = new RRule(recurrence);
// handle the iCalendar "byDay" field differently depending on if
// we are weekly or otherwise
if(rrule.getFreq() != Frequency.WEEKLY) {
rrule.setByDay(Collections.EMPTY_LIST);
}
if(rrule.getFreq() == Frequency.HOURLY) { if(rrule.getFreq() == Frequency.HOURLY) {
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME,
repeatFromDate.getTime() + DateUtilities.ONE_HOUR * rrule.getInterval()); repeatFromDate.getTime() + DateUtilities.ONE_HOUR * rrule.getInterval());
} else { } else {
RecurrenceIterator iterator = RecurrenceIteratorFactory.createRecurrenceIterator(rrule, RecurrenceIterator iterator = RecurrenceIteratorFactory.createRecurrenceIterator(rrule,
repeatFrom, TimeZone.getDefault()); repeatFrom, TimeZone.getDefault());
DateValue nextDate; DateValue nextDate = repeatFrom;
if(repeatFrom.compareTo(today) < 0) { if(repeatFrom.compareTo(today) < 0)
iterator.advanceTo(today); iterator.advanceTo(today);
for(int i = 0; i < 10; i++) { // ten tries then we give up
if(!iterator.hasNext()) if(!iterator.hasNext())
return; return -1;
nextDate = iterator.next();
} else {
iterator.advanceTo(repeatFrom);
if(!iterator.hasNext())
return;
nextDate = iterator.next();
nextDate = iterator.next(); nextDate = iterator.next();
}
if(nextDate.compareTo(repeatFrom) == 0)
continue;
if(nextDate instanceof DateTimeValueImpl) { if(nextDate instanceof DateTimeValueImpl) {
DateTimeValueImpl newDateTime = (DateTimeValueImpl)nextDate; DateTimeValueImpl newDateTime = (DateTimeValueImpl)nextDate;
@ -100,22 +133,17 @@ public class RepeatTaskCompleteListener extends BroadcastReceiver {
new Date(nextDate.year() - 1900, nextDate.month() - 1, new Date(nextDate.year() - 1900, nextDate.month() - 1,
nextDate.day()).getTime()); nextDate.day()).getTime());
} }
}
long hideUntil = task.getValue(Task.HIDE_UNTIL); if(newDueDate > DateUtilities.now() && newDueDate != repeatFromDate.getTime())
if(hideUntil > 0 && task.getValue(Task.DUE_DATE) > 0) { break;
hideUntil += newDueDate - task.getValue(Task.DUE_DATE);
}
task = taskService.clone(task);
task.setValue(Task.DUE_DATE, newDueDate);
task.setValue(Task.HIDE_UNTIL, hideUntil);
task.setValue(Task.COMPLETION_DATE, 0L);
taskService.save(task, false);
} catch (ParseException e) {
exceptionService.reportError("recurrence-rule: " + recurrence, e); //$NON-NLS-1$
} }
} }
if(newDueDate == -1)
return -1;
return newDueDate;
} }
} }

@ -114,12 +114,12 @@ public class MilkPreferences extends TodorooPreferences {
// last sync was error // last sync was error
else if(MilkUtilities.getLastAttemptedSyncDate() != 0) { else if(MilkUtilities.getLastAttemptedSyncDate() != 0) {
status = r.getString(R.string.rmilk_status_failed, status = r.getString(R.string.rmilk_status_failed,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this). DateUtilities.getDateStringWithTime(MilkPreferences.this,
format(new Date(MilkUtilities.getLastAttemptedSyncDate()))); new Date(MilkUtilities.getLastAttemptedSyncDate())));
if(MilkUtilities.getLastSyncDate() > 0) { if(MilkUtilities.getLastSyncDate() > 0) {
subtitle = r.getString(R.string.rmilk_status_failed_subtitle, subtitle = r.getString(R.string.rmilk_status_failed_subtitle,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this). DateUtilities.getDateStringWithTime(MilkPreferences.this,
format(new Date(MilkUtilities.getLastSyncDate()))); new Date(MilkUtilities.getLastSyncDate())));
} }
statusColor = Color.rgb(100, 0, 0); statusColor = Color.rgb(100, 0, 0);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@ -132,8 +132,8 @@ public class MilkPreferences extends TodorooPreferences {
}); });
} else if(MilkUtilities.getLastSyncDate() > 0) { } else if(MilkUtilities.getLastSyncDate() > 0) {
status = r.getString(R.string.rmilk_status_success, status = r.getString(R.string.rmilk_status_success,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this). DateUtilities.getDateStringWithTime(MilkPreferences.this,
format(new Date(MilkUtilities.getLastSyncDate()))); new Date(MilkUtilities.getLastSyncDate())));
statusColor = Color.rgb(0, 100, 0); statusColor = Color.rgb(0, 100, 0);
} else { } else {
status = r.getString(R.string.rmilk_status_never); status = r.getString(R.string.rmilk_status_never);

@ -11,12 +11,14 @@ import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory; import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListHeader; import com.todoroo.astrid.api.FilterListHeader;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.tags.TagService.Tag; import com.todoroo.astrid.tags.TagService.Tag;
@ -31,11 +33,11 @@ public class TagFilterExposer extends BroadcastReceiver {
private TagService tagService; private TagService tagService;
@SuppressWarnings("nls") @SuppressWarnings("nls")
private Filter filterFromTag(Context context, Tag tag) { private Filter filterFromTag(Context context, Tag tag, Criterion criterion) {
String listTitle = context.getString(R.string.tag_FEx_tag_w_size). String listTitle = context.getString(R.string.tag_FEx_tag_w_size).
replace("$T", tag.tag).replace("$C", Integer.toString(tag.count)); replace("$T", tag.tag).replace("$C", Integer.toString(tag.count));
String title = context.getString(R.string.tag_FEx_name, tag.tag); String title = context.getString(R.string.tag_FEx_name, tag.tag);
QueryTemplate tagTemplate = tag.queryTemplate(); QueryTemplate tagTemplate = tag.queryTemplate(criterion);
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
contentValues.put(Metadata.KEY.name, TagService.KEY); contentValues.put(Metadata.KEY.name, TagService.KEY);
contentValues.put(TagService.TAG.name, tag.tag); contentValues.put(TagService.TAG.name, tag.tag);
@ -59,7 +61,7 @@ public class TagFilterExposer extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
tagService = TagService.getInstance(); tagService = TagService.getInstance();
Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA); Tag[] tagsByAlpha = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA, TaskCriteria.notDeleted());
// If user does not have any tags, don't show this section at all // If user does not have any tags, don't show this section at all
if(tagsByAlpha.length == 0) if(tagsByAlpha.length == 0)
@ -67,34 +69,47 @@ public class TagFilterExposer extends BroadcastReceiver {
Resources r = context.getResources(); Resources r = context.getResources();
Tag[] tagsBySize = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE);
Filter[] filtersByAlpha = new Filter[tagsByAlpha.length]; Filter[] filtersByAlpha = new Filter[tagsByAlpha.length];
for(int i = 0; i < tagsByAlpha.length; i++) for(int i = 0; i < tagsByAlpha.length; i++)
filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i]); filtersByAlpha[i] = filterFromTag(context, tagsByAlpha[i], TaskCriteria.notDeleted());
Tag[] tagsBySize = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.isActive());
Filter[] filtersBySize = new Filter[tagsBySize.length]; Filter[] filtersBySize = new Filter[tagsBySize.length];
for(int i = 0; i < tagsBySize.length; i++) for(int i = 0; i < tagsBySize.length; i++)
filtersBySize[i] = filterFromTag(context, tagsBySize[i]); filtersBySize[i] = filterFromTag(context, tagsBySize[i], TaskCriteria.isActive());
Tag[] completed = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, TaskCriteria.completed());
Filter[] filtersCompleted = new Filter[completed.length];
for(int i = 0; i < completed.length; i++)
filtersCompleted[i] = filterFromTag(context, completed[i], TaskCriteria.completed());
FilterListHeader tagsHeader = new FilterListHeader(context.getString(R.string.tag_FEx_header)); FilterListHeader tagsHeader = new FilterListHeader(context.getString(R.string.tag_FEx_header));
Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged), Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged),
r.getString(R.string.tag_FEx_untagged), r.getString(R.string.tag_FEx_untagged),
tagService.untaggedTemplate(), tagService.untaggedTemplate(),
null); null);
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap(); untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap();
FilterCategory tagsCategoryBySize = new FilterCategory(context.getString(R.string.tag_FEx_by_size), FilterCategory tagsCategoryBySize = new FilterCategory(context.getString(R.string.tag_FEx_by_size),
filtersBySize); filtersBySize);
tagsCategoryBySize.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap(); tagsCategoryBySize.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap();
FilterCategory tagsCategoryByAlpha = new FilterCategory(context.getString(R.string.tag_FEx_alpha),
FilterCategory tagsCategoryAllByAlpha = new FilterCategory(context.getString(R.string.tag_FEx_alpha),
filtersByAlpha); filtersByAlpha);
tagsCategoryByAlpha.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags2)).getBitmap(); tagsCategoryAllByAlpha.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags1)).getBitmap();
FilterCategory tagsCategoryCompleted = new FilterCategory(context.getString(R.string.tag_FEx_completed),
filtersCompleted);
tagsCategoryCompleted.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_tags2)).getBitmap();
// transmit filter list // transmit filter list
FilterListItem[] list = new FilterListItem[4]; FilterListItem[] list = new FilterListItem[5];
list[0] = tagsHeader; list[0] = tagsHeader;
list[1] = untagged; list[1] = untagged;
list[2] = tagsCategoryBySize; list[2] = tagsCategoryBySize;
list[3] = tagsCategoryByAlpha; list[3] = tagsCategoryCompleted;
list[4] = tagsCategoryAllByAlpha;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS); Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);

@ -1,6 +1,6 @@
package com.todoroo.astrid.tags; package com.todoroo.astrid.tags;
import java.util.ArrayList; import java.util.LinkedHashSet;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.CountProperty; import com.todoroo.andlib.data.Property.CountProperty;
@ -82,11 +82,11 @@ public final class TagService {
* @param tag * @param tag
* @return * @return
*/ */
public QueryTemplate queryTemplate() { public QueryTemplate queryTemplate(Criterion criterion) {
return new QueryTemplate().join(Join.inner(Metadata.TABLE, return new QueryTemplate().join(Join.inner(Metadata.TABLE,
Task.ID.eq(Metadata.TASK))).where(Criterion.and( Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataCriteria.withKey(KEY), TAG.eq(tag), MetadataCriteria.withKey(KEY), TAG.eq(tag),
TaskCriteria.isActive())); criterion));
} }
} }
@ -100,13 +100,14 @@ public final class TagService {
/** /**
* Return all tags ordered by given clause * Return all tags ordered by given clause
* *
* @param taskId * @param order ordering
* @param activeStatus criterion for specifying completed or uncompleted
* @return empty array if no tags, otherwise array * @return empty array if no tags, otherwise array
*/ */
public Tag[] getGroupedTags(Order order) { public Tag[] getGroupedTags(Order order, Criterion activeStatus) {
Query query = Query.select(TAG.as(TAG.name), COUNT). Query query = Query.select(TAG.as(TAG.name), COUNT).
join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))). join(Join.inner(Task.TABLE, Metadata.TASK.eq(Task.ID))).
where(Criterion.and(TaskCriteria.isActive(), MetadataCriteria.withKey(KEY))). where(Criterion.and(activeStatus, MetadataCriteria.withKey(KEY))).
orderBy(order).groupBy(TAG); orderBy(order).groupBy(TAG);
TodorooCursor<Metadata> cursor = metadataDao.query(query); TodorooCursor<Metadata> cursor = metadataDao.query(query);
try { try {
@ -175,7 +176,7 @@ public final class TagService {
* @param taskId * @param taskId
* @param tags * @param tags
*/ */
public void synchronizeTags(long taskId, ArrayList<String> tags) { public void synchronizeTags(long taskId, LinkedHashSet<String> tags) {
metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId), metadataDao.deleteWhere(Criterion.and(MetadataCriteria.byTask(taskId),
MetadataCriteria.withKey(KEY))); MetadataCriteria.withKey(KEY)));

@ -1,12 +1,11 @@
package com.todoroo.astrid.tags; package com.todoroo.astrid.tags;
import java.util.ArrayList; import java.util.LinkedHashSet;
import android.app.Activity; import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView; import android.widget.AutoCompleteTextView;
import android.widget.ImageButton; import android.widget.ImageButton;
@ -15,6 +14,7 @@ import android.widget.TextView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
@ -28,11 +28,6 @@ import com.todoroo.astrid.tags.TagService.Tag;
*/ */
public final class TagsControlSet implements TaskEditControlSet { public final class TagsControlSet implements TaskEditControlSet {
// --- constants
/** Number of tags a task can have */
static final int MAX_TAGS = 5;
// --- instance variables // --- instance variables
private final TagService tagService = TagService.getInstance(); private final TagService tagService = TagService.getInstance();
@ -41,16 +36,15 @@ public final class TagsControlSet implements TaskEditControlSet {
private final Activity activity; private final Activity activity;
public TagsControlSet(Activity activity, int tagsContainer) { public TagsControlSet(Activity activity, int tagsContainer) {
allTags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); allTags = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE, Criterion.all);
this.activity = activity; this.activity = activity;
this.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer); this.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer);
} }
@SuppressWarnings("nls")
@Override @Override
public void readFromTask(Task task) { public void readFromTask(Task task) {
// tags (only configure if not already set) tagsContainer.removeAllViews();
if(tagsContainer.getChildCount() == 0) {
TodorooCursor<Metadata> cursor = tagService.getTags(task.getId()); TodorooCursor<Metadata> cursor = tagService.getTags(task.getId());
try { try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
@ -58,13 +52,17 @@ public final class TagsControlSet implements TaskEditControlSet {
} finally { } finally {
cursor.close(); cursor.close();
} }
addTag(""); if(tagsContainer.getChildCount() == 0)
} addTag(""); //$NON-NLS-1$
} }
@Override @Override
public void writeToModel(Task task) { public void writeToModel(Task task) {
ArrayList<String> tags = new ArrayList<String>(); // this is a case where we're asked to save but the UI was not yet populated
if(tagsContainer.getChildCount() == 0)
return;
LinkedHashSet<String> tags = new LinkedHashSet<String>();
for(int i = 0; i < tagsContainer.getChildCount(); i++) { for(int i = 0; i < tagsContainer.getChildCount(); i++) {
TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1); TextView tagName = (TextView)tagsContainer.getChildAt(i).findViewById(R.id.text1);
@ -78,10 +76,6 @@ public final class TagsControlSet implements TaskEditControlSet {
/** Adds a tag to the tag field */ /** Adds a tag to the tag field */
boolean addTag(String tagName) { boolean addTag(String tagName) {
if (tagsContainer.getChildCount() >= MAX_TAGS) {
return false;
}
LayoutInflater inflater = activity.getLayoutInflater(); LayoutInflater inflater = activity.getLayoutInflater();
final View tagItem = inflater.inflate(R.layout.tag_edit_row, null); final View tagItem = inflater.inflate(R.layout.tag_edit_row, null);
tagsContainer.addView(tagItem); tagsContainer.addView(tagItem);
@ -93,33 +87,40 @@ public final class TagsControlSet implements TaskEditControlSet {
new ArrayAdapter<Tag>(activity, new ArrayAdapter<Tag>(activity,
android.R.layout.simple_dropdown_item_1line, allTags); android.R.layout.simple_dropdown_item_1line, allTags);
textView.setAdapter(tagsAdapter); textView.setAdapter(tagsAdapter);
textView.addTextChangedListener(new TextWatcher() {
@SuppressWarnings("nls") textView.setOnClickListener(new OnClickListener() {
public void onTextChanged(CharSequence s, int start, int before, @Override
int count) { public void onClick(View arg0) {
if(start == 0 && tagsContainer.getChildAt( View lastItem = tagsContainer.getChildAt(tagsContainer.getChildCount()-1);
tagsContainer.getChildCount()-1) == tagItem) { TextView lastText = (TextView) lastItem.findViewById(R.id.text1);
addTag(""); if(lastText.getText().length() != 0) {
addTag(""); //$NON-NLS-1$
} }
} }
});
public void afterTextChanged(Editable s) { /*textView.setOnEditorActionListener(new OnEditorActionListener() {
// @Override
public boolean onEditorAction(TextView arg0, int actionId, KeyEvent arg2) {
if(actionId != EditorInfo.IME_NULL)
return false;
View lastItem = tagsContainer.getChildAt(tagsContainer.getChildCount()-1);
TextView lastText = (TextView) lastItem.findViewById(R.id.text1);
if(lastText.getText().length() != 0) {
addTag(""); //$NON-NLS-1$
} }
return true;
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
//
} }
}); });*/
ImageButton reminderRemoveButton; ImageButton reminderRemoveButton;
reminderRemoveButton = (ImageButton)tagItem.findViewById(R.id.button1); reminderRemoveButton = (ImageButton)tagItem.findViewById(R.id.button1);
reminderRemoveButton.setOnClickListener(new View.OnClickListener() { reminderRemoveButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
if(textView.getText().length() > 0) if(tagsContainer.getChildCount() > 0)
tagsContainer.removeView(tagItem); tagsContainer.removeView(tagItem);
else
textView.setText(""); //$NON-NLS-1$
} }
}); });

@ -10,7 +10,6 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet; import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.ui.TimeDurationControlSet; import com.todoroo.astrid.ui.TimeDurationControlSet;
import com.todoroo.astrid.ui.TimeDurationControlSet.TimeDurationType;
/** /**
* Control Set for managing repeats * Control Set for managing repeats
@ -31,11 +30,11 @@ public class TimerControlSet implements TaskEditControlSet {
LayoutInflater.from(activity).inflate(R.layout.timer_control, parent, true); LayoutInflater.from(activity).inflate(R.layout.timer_control, parent, true);
estimated = new TimeDurationTaskEditControlSet(Task.ESTIMATED_SECONDS, estimated = new TimeDurationTaskEditControlSet(Task.ESTIMATED_SECONDS,
R.id.estimatedDuration, 0, R.string.DLG_hour_minutes, R.id.estimatedDuration, 0, R.string.DLG_hour_minutes
TimeDurationType.HOURS_MINUTES); );
elapsed = new TimeDurationTaskEditControlSet(Task.ELAPSED_SECONDS, R.id.elapsedDuration, elapsed = new TimeDurationTaskEditControlSet(Task.ELAPSED_SECONDS, R.id.elapsedDuration,
0, R.string.DLG_hour_minutes, 0, R.string.DLG_hour_minutes
TimeDurationType.HOURS_MINUTES); );
} }
@Override @Override
@ -62,10 +61,10 @@ public class TimerControlSet implements TaskEditControlSet {
private final IntegerProperty property; private final IntegerProperty property;
public TimeDurationTaskEditControlSet(IntegerProperty property, int timeButtonId, public TimeDurationTaskEditControlSet(IntegerProperty property, int timeButtonId,
int prefixResource, int titleResource, TimeDurationType type) { int prefixResource, int titleResource) {
this.property = property; this.property = property;
this.controlSet = new TimeDurationControlSet(activity, this.controlSet = new TimeDurationControlSet(activity,
timeButtonId, prefixResource, titleResource, type); timeButtonId, prefixResource, titleResource);
} }
@Override @Override

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/alarms_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/alarm_ACS_label"
style="@style/TextAppearance.GEN_EditLabel" />
<LinearLayout android:id="@+id/alert_container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</LinearLayout>
<Button android:id="@+id/alarms_add"
android:text="@string/alarm_ACS_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</merge>

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/date"
android:layout_weight="0.7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button android:id="@+id/time"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageButton android:id="@+id/button1"
style="?android:attr/buttonStyleInset"
android:src="@android:drawable/ic_delete"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginTop="2dip"
android:layout_marginRight="2dip"
android:layout_marginBottom="2dip"
android:gravity="center_vertical"
/>
</LinearLayout>

@ -35,5 +35,11 @@
</LinearLayout> </LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:padding="5dip"
android:background="@android:drawable/divider_horizontal_dark" />
</merge> </merge>

@ -1,32 +1,103 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent"> android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/pdv_body">
<TextView android:layout_width="wrap_content" <ImageView
android:layout_height="wrap_content" style="@style/TextAppearance.GEN_EditLabel" android:layout_width="fill_parent"
android:text="@string/producteev_PPr_header" /> android:layout_height="wrap_content"
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:scaleType="fitCenter"
android:src="@drawable/pdv_logo" />
<LinearLayout android:orientation="horizontal" <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="10dip"
android:textSize="16sp"
android:textColor="#ffffff"
android:text="@string/producteev_PLA_body" />
<TextView android:id="@+id/error"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingBottom="20dip"
android:textColor="#ff0000"
android:textSize="16sp"
android:textStyle="bold"
android:visibility="gone" />
<EditText android:id="@+id/email"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/producteev_PLA_email"
android:contentDescription="E-Mail with which you registered to Producteev-service"
android:inputType="textEmailAddress"/>
<EditText android:id="@+id/password"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:contentDescription="Password for your Producteev account"
android:hint="@string/producteev_PLA_password"
android:inputType="textPassword"/>
<LinearLayout android:id="@+id/newUserLayout"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_height="wrap_content"
android:paddingTop="5dip" android:baselineAligned="false"> android:orientation="vertical"
android:paddingTop="20dip"
android:visibility="gone">
<EditText android:id="@+id/confirmPassword"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/producteev_PLA_confirmPassword"
android:inputType="textPassword"/>
<EditText android:id="@+id/firstName"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/producteev_PLA_firstName"
android:inputType="textPersonName"/>
<EditText android:id="@+id/lastName"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/producteev_PLA_lastName"
android:inputType="textPersonName"/>
<Button android:id="@+id/done" android:layout_width="fill_parent" </LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dip"
android:baselineAligned="false">
<Button android:id="@+id/signIn" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_weight="1" android:layout_height="wrap_content" android:layout_weight="1"
android:text="@string/DLG_done" /> android:text="@string/producteev_PLA_signIn" />
<Button android:id="@+id/cancel" android:layout_width="fill_parent" <Button android:id="@+id/createNew" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_weight="1" android:layout_height="wrap_content" android:layout_weight="1"
android:text="@android:string/cancel" /> android:text="@string/producteev_PLA_createNew" />
</LinearLayout> </LinearLayout>
<EditText android:layout_height="wrap_content"
android:layout_width="fill_parent" android:hint="E-Mail" <TextView android:id="@+id/terms"
android:contentDescription="E-Mail with which you registered to Producteev-service" android:layout_width="fill_parent"
android:id="@+id/Poducteev_EMail_EditText" android:inputType="textEmailAddress"></EditText> android:layout_height="wrap_content"
<EditText android:layout_height="wrap_content" android:gravity="center"
android:id="@+id/Producteev_Password_EditText" android:paddingTop="10dip"
android:contentDescription="Password for your Producteev account" android:textSize="16sp"
android:hint="Password" android:layout_width="fill_parent" android:textColor="#0000ff"
android:inputType="textPassword"></EditText> android:linksClickable="true"
android:text="@string/producteev_PLA_terms" />
</LinearLayout> </LinearLayout>

@ -17,6 +17,12 @@
android:layout_weight="100" android:layout_weight="100"
android:orientation="horizontal"> android:orientation="horizontal">
<!-- importance -->
<View android:id="@+id/importance"
android:layout_width="2dip"
android:layout_height="fill_parent"
android:layout_marginRight="5dip" />
<!-- completion check-box --> <!-- completion check-box -->
<CheckBox android:id="@+id/completeBox" <CheckBox android:id="@+id/completeBox"
android:layout_width="34dip" android:layout_width="34dip"
@ -29,13 +35,12 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="100" android:layout_weight="100"
android:paddingLeft="8dip" android:paddingLeft="8dip"
android:paddingRight="3dip"
android:orientation="vertical"> android:orientation="vertical">
<!-- task name --> <!-- task name -->
<TextView android:id="@+id/title" <TextView android:id="@+id/title"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="fill_parent"
style="@style/TextAppearance.TAd_ItemTitle" style="@style/TextAppearance.TAd_ItemTitle"
android:gravity="center_vertical"/> android:gravity="center_vertical"/>
@ -52,11 +57,6 @@
</LinearLayout> </LinearLayout>
<!-- importance -->
<View android:id="@+id/importance"
android:layout_width="2dip"
android:layout_height="fill_parent" />
</LinearLayout> </LinearLayout>
<TextView android:id="@+id/extendedDetails" <TextView android:id="@+id/extendedDetails"

@ -36,11 +36,15 @@
</LinearLayout> </LinearLayout>
<!-- Body -->
<FrameLayout <android.gesture.GestureOverlayView android:id="@+id/gestures"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="100"> android:layout_weight="100"
android:uncertainGestureColor="#00000000"
android:eventsInterceptionEnabled="true"
android:orientation="vertical">
<!-- No Tasks label --> <!-- No Tasks label -->
<TextView android:id="@android:id/empty" <TextView android:id="@android:id/empty"
@ -57,7 +61,7 @@
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent"/> android:layout_height="fill_parent"/>
</FrameLayout> </android.gesture.GestureOverlayView>
<!-- Footer --> <!-- Footer -->
<LinearLayout <LinearLayout
@ -96,5 +100,4 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/taskListParent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background_gradient"
android:orientation="vertical">
<!-- Header -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal"
android:background="@drawable/edit_header">
<!-- Back Button -->
<ImageView android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"
android:src="@drawable/tango_previous"
android:paddingLeft="5dip"
android:paddingRight="8dip"/>
<!-- List Label -->
<TextView android:id="@+id/listLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="100"
android:singleLine="true"
android:paddingTop="6dip"
android:paddingRight="50dip"
style="@style/TextAppearance.TLA_Header"/>
</LinearLayout>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="100">
<!-- No Tasks label -->
<TextView android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
android:text="@string/TLA_no_items"
style="@style/TextAppearance.TLA_NoItems"/>
<!-- Task List -->
<ListView android:id="@android:id/list"
android:scrollbars="vertical"
android:cacheColorHint="#00000000"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
<!-- Footer -->
<LinearLayout
android:id="@+id/taskListFooter"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal">
<!-- Quick Add Button -->
<ImageButton android:id="@+id/quickAddButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:visibility="gone"
android:src="@drawable/tango_add"
android:scaleType="fitCenter"/>
<!-- Quick Add Task -->
<EditText android:id="@+id/quickAddText"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="100"
android:hint="@string/TLA_quick_add_hint"
android:singleLine="true"
android:autoText="true"
android:capitalize="sentences"/>
<!-- Extended Add Button -->
<ImageButton android:id="@+id/extendedAddButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/tango_edit"
android:scaleType="fitCenter"/>
</LinearLayout>
</LinearLayout>

@ -24,5 +24,11 @@
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:padding="5dip"
android:background="@android:drawable/divider_horizontal_dark" />
</merge> </merge>

Binary file not shown.

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">No s\'ha pogut trobar el següent element:</string> <string name="DLG_error_opening">No s\'ha pogut trobar el següent element:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">No es pot accedir a la carpeta: %s</string> <string name="DLG_error_sdcard">No es pot accedir a la carpeta: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Temps (hores : minuts)</string> <string name="DLG_hour_minutes">Temps (hores : minuts)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Mida de la Llista de Tasques</string> <string name="EPr_fontSize_title">Mida de la Llista de Tasques</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Mida de lletra en la pàgina de llista principal</string> <string name="EPr_fontSize_desc">Mida de lletra en la pàgina de llista principal</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -572,10 +602,7 @@ to the plugin creator for fastest service.
<string name="marketplace_title">Tasques d\'Astrid/Llista de Tasques</string> <string name="marketplace_title">Tasques d\'Astrid/Llista de Tasques</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid és la molt aclamada llista de tasques de codi obert que és prou senzilla com per no posar-se en el seu camí, prou potent com per ajudar a fer coses! Etiquetes, recordatoris, sincronització amb RememberTheMilk, plug-ins regionals i més!</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -696,7 +723,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1150,10 +1177,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiquetes</string> <string name="tag_FEx_header">Etiquetes</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Nemohl jsem nalézt tuto položku:</string> <string name="DLG_error_opening">Nemohl jsem nalézt tuto položku:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Chyba v přístupu k adresáři: %s</string> <string name="DLG_error_sdcard">Chyba v přístupu k adresáři: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Prosím čekejte...</string> <string name="DLG_wait">Prosím čekejte...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Čas (hodin : minut)</string> <string name="DLG_hour_minutes">Čas (hodin : minut)</string>
@ -470,10 +494,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Velikost seznamu úkolů</string> <string name="EPr_fontSize_title">Velikost seznamu úkolů</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Velikost písma na hlavní straně seznamu</string> <string name="EPr_fontSize_desc">Velikost písma na hlavní straně seznamu</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">Výchozí nastavení nového úkolu</string> <string name="EPr_defaults_header">Výchozí nastavení nového úkolu</string>
@ -565,10 +595,7 @@ to the plugin creator for fastest service.
<string name="marketplace_title">Astrid Úkol/Todo Seznam</string> <string name="marketplace_title">Astrid Úkol/Todo Seznam</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid je vysoce oceňovaný open source úkolovník, jednoduše ovladatelný a přesto velice výkonný, aby Vám pomohl mít vše hotovo. Značky, připomenutí, synchronizace s Remember The Milk, lokalizace a další.</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -688,7 +715,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Upozorni mě...</string> <string name="TEA_reminder_label">Upozorni mě...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... když je čas k provedení úkolu</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1137,10 +1164,13 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="tag_FEx_header">Značky</string> <string name="tag_FEx_header">Značky</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">Podle velikosti</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Podle abecedy</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Neoznačené</string> <string name="tag_FEx_untagged">Neoznačené</string>

File diff suppressed because it is too large Load Diff

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarmas</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Añadir una alarma?</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarma %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>¡Alarma!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -13,11 +34,11 @@
<string name="backup_BPr_group_status">Estado</string> <string name="backup_BPr_group_status">Estado</string>
<!-- Backup Status: last backup was a success (%s -> last date). Keep it short! --> <!-- Backup Status: last backup was a success (%s -> last date). Keep it short! -->
<string name="backup_status_success">Latest: %s</string> <string name="backup_status_success">Última copia de seguridad: %s</string>
<!-- Backup Status: last error failed. Keep it short! --> <!-- Backup Status: last error failed. Keep it short! -->
<string name="backup_status_failed">Falló el último backup</string> <string name="backup_status_failed">Falló el último backup</string>
<!-- Backup Status: error subtitle --> <!-- Backup Status: error subtitle -->
<string name="backup_status_failed_subtitle">(tap to show error)</string> <string name="backup_status_failed_subtitle">(toque esto ver los problemas)</string>
<!-- Backup Status: never backed up --> <!-- Backup Status: never backed up -->
<string name="backup_status_never">No respaldar nunca</string> <string name="backup_status_never">No respaldar nunca</string>
@ -32,9 +53,9 @@
<string name="backup_BPr_auto_enabled">El respaldo se hará diariamente</string> <string name="backup_BPr_auto_enabled">El respaldo se hará diariamente</string>
<!-- Preference screen restoring Tasks Help --> <!-- Preference screen restoring Tasks Help -->
<string name="backup_BPr_how_to_restore">How do I restore backups?</string> <string name="backup_BPr_how_to_restore">¿Cómo restaurar las tareas respaldas?</string>
<!-- Preference screen Restoring Tasks Help Dialog Text--> <!-- Preference screen Restoring Tasks Help Dialog Text-->
<string name="backup_BPr_how_to_restore_dialog">You need to add the Astrid Power Pack to manage and restore your backups. As a favor, Astrid also automatically backs up your tasks, just in case.</string> <string name="backup_BPr_how_to_restore_dialog">Tiene que agregar el Astrid Power Pack para gestionar y restaurar copias de seguridad. Como un favor, Astrid también automáticamente copias de seguridad de sus tareas, por si acaso.</string>
<!-- ================================================= BackupActivity == --> <!-- ================================================= BackupActivity == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">No pude encontrar este ítem:</string> <string name="DLG_error_opening">No pude encontrar este ítem:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">No puedo acceder carpeta: %s</string> <string name="DLG_error_sdcard">No puedo acceder carpeta: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -210,13 +231,14 @@
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Espere por favor...</string> <string name="DLG_wait">Espere por favor...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Actualización de su tareas...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Tiempo (horas : minutos)</string> <string name="DLG_hour_minutes">Tiempo (horas : minutos)</string>
<!-- Dialog for Astrid having a critical update --> <!-- Dialog for Astrid having a critical update -->
<string name="DLG_please_update">Astrid should to be updated to the latest <string name="DLG_please_update">Astrid tiene una nueva versión en el mercado. Por favor, actualice antes de continuar, o espere unos pocos segundos.</string>
version in the Android market! Please do that before continuing, or wait a
few seconds.</string>
<!-- Button for going to Market --> <!-- Button for going to Market -->
<string name="DLG_to_market">Ir al mercado</string> <string name="DLG_to_market">Ir al mercado</string>
@ -224,7 +246,7 @@
<!-- =============================================================== UI == --> <!-- =============================================================== UI == -->
<!-- Label for DateButtons with no value --> <!-- Label for DateButtons with no value -->
<string name="WID_dateButtonUnset">Click To Set</string> <string name="WID_dateButtonUnset">Toque para grabar</string>
<!-- String formatter for DateButtons ($D => date, $T => time) --> <!-- String formatter for DateButtons ($D => date, $T => time) -->
<string name="WID_dateButtonLabel">$D $T</string> <string name="WID_dateButtonLabel">$D $T</string>
@ -291,7 +313,7 @@ button: add task & go to the edit page.
<string name="TAd_contextDeleteTask">Borrar Tarea</string> <string name="TAd_contextDeleteTask">Borrar Tarea</string>
<!-- Context Item: undelete task --> <!-- Context Item: undelete task -->
<string name="TAd_contextUndeleteTask">Undelete Task</string> <string name="TAd_contextUndeleteTask">Restaurar la Tarea</string>
<!-- =============================================== FilterListActivity == --> <!-- =============================================== FilterListActivity == -->
@ -320,7 +342,7 @@ button: add task & go to the edit page.
<string name="FLA_search_hint">Buscar tareas</string> <string name="FLA_search_hint">Buscar tareas</string>
<!-- Search Filter name (%s => query) --> <!-- Search Filter name (%s => query) -->
<string name="FLA_search_filter">Matching \'%s\'</string> <string name="FLA_search_filter">Coincider %s</string>
<!-- Help (HTML)--> <!-- Help (HTML)-->
<string name="FLA_help"><![CDATA[ <string name="FLA_help"><![CDATA[
@ -369,13 +391,13 @@ to the plugin creator for fastest service.
<string name="TEA_importance_label">Importancia</string> <string name="TEA_importance_label">Importancia</string>
<!-- Task urgency label --> <!-- Task urgency label -->
<string name="TEA_urgency_label">Deadline</string> <string name="TEA_urgency_label">Fecha límite</string>
<!-- Task urgency specific time checkbox --> <!-- Task urgency specific time checkbox -->
<string name="TEA_urgency_specific_time">Due at specific time?</string> <string name="TEA_urgency_specific_time">debido a una hora específica</string>
<!-- Task urgency specific time title when specific time false --> <!-- Task urgency specific time title when specific time false -->
<string name="TEA_urgency_time_none">No Due Time</string> <string name="TEA_urgency_time_none">No a su debido tiempo</string>
<!-- Task hide until label --> <!-- Task hide until label -->
<string name="TEA_hideUntil_label">Esconder hasta</string> <string name="TEA_hideUntil_label">Esconder hasta</string>
@ -418,28 +440,28 @@ to the plugin creator for fastest service.
<string-array name="TEA_urgency"> <string-array name="TEA_urgency">
<!-- urgency: labels for edit page. item #4 -> auto filled --> <!-- urgency: labels for edit page. item #4 -> auto filled -->
<item>Specific Day/Time</item> <item>Día/Tiempo Específicas</item>
<item>Hoy</item> <item>Hoy</item>
<item>Mañana</item> <item>Mañana</item>
<item>(día anterior)</item> <item>(día anterior)</item>
<item>Próxima semana</item> <item>Próxima semana</item>
<item>No Deadline</item> <item>Ninguna fecha límite</item>
</string-array> </string-array>
<string-array name="TEA_hideUntil"> <string-array name="TEA_hideUntil">
<!-- hideUntil: labels for edit page. --> <!-- hideUntil: labels for edit page. -->
<item>No esconder</item> <item>No esconder</item>
<item>Task is due</item> <item>Tarea se debe</item>
<item>Day before due</item> <item>Día antes de fecha límite</item>
<item>Week before due</item> <item>Semana antes de fecha límite</item>
<item>Día específico</item> <item>Día específico</item>
</string-array> </string-array>
<!-- Add Ons tab when no add-ons found --> <!-- Add Ons tab when no add-ons found -->
<string name="TEA_no_addons">No Add-ons Found!</string> <string name="TEA_no_addons">No componentes adicionales encontrado!</string>
<!-- Add Ons button --> <!-- Add Ons button -->
<string name="TEA_addons_button">Get Some Add-ons</string> <string name="TEA_addons_button">Obtener algunos componentes adicionales.</string>
<!-- ============================================= IntroductionActivity == --> <!-- ============================================= IntroductionActivity == -->
@ -455,7 +477,7 @@ to the plugin creator for fastest service.
<!-- ===================================================== HelpActivity == --> <!-- ===================================================== HelpActivity == -->
<!-- Help: Button to get support from our website --> <!-- Help: Button to get support from our website -->
<string name="HlA_get_support">Get Support</string> <string name="HlA_get_support">Obtener ayuda</string>
<!-- ==================================================== UpdateService == --> <!-- ==================================================== UpdateService == -->
@ -472,27 +494,33 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Tamaño de la lista de tareas</string> <string name="EPr_fontSize_title">Tamaño de la lista de tareas</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Tamaño de la fuente en la pagina de listado principal</string> <string name="EPr_fontSize_desc">Tamaño de la fuente en la pagina de listado principal</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Mostrar notas en la tarea</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Las notas se mostrarán cuando se toca una tarea.</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notas se mostrará siempre.</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">configuración de la tarea inicial</string>
<!-- Preference: Default Urgency Title --> <!-- Preference: Default Urgency Title -->
<string name="EPr_default_urgency_title">Urgencia predeterminada</string> <string name="EPr_default_urgency_title">Urgencia predeterminada</string>
<!-- Preference: Default Urgency Description (%s => setting) --> <!-- Preference: Default Urgency Description (%s => setting) -->
<string name="EPr_default_urgency_desc">Currently Set To: %s</string> <string name="EPr_default_urgency_desc">Configuración actual: %s</string>
<!-- Preference: Default Importance Title --> <!-- Preference: Default Importance Title -->
<string name="EPr_default_importance_title">Importancia predeterminada</string> <string name="EPr_default_importance_title">Importancia predeterminada</string>
<!-- Preference: Default Importance Description (%s => setting) --> <!-- Preference: Default Importance Description (%s => setting) -->
<string name="EPr_default_importance_desc">Currently Set To: %s</string> <string name="EPr_default_importance_desc">Configuración actual: %s</string>
<!-- Preference: Default Hide Until Title --> <!-- Preference: Default Hide Until Title -->
<string name="EPr_default_hideUntil_title">Default Hide Until</string> <string name="EPr_default_hideUntil_title">Ocultar configuración inicial hasta</string>
<!-- Preference: Default Hide Until Description (%s => setting) --> <!-- Preference: Default Hide Until Description (%s => setting) -->
<string name="EPr_default_hideUntil_desc">Currently Set To: %s</string> <string name="EPr_default_hideUntil_desc">Configuración actual: %s</string>
<string-array name="EPr_default_importance"> <string-array name="EPr_default_importance">
<!-- importance: labels for "Task Defaults" preference item. --> <!-- importance: labels for "Task Defaults" preference item. -->
@ -504,7 +532,7 @@ to the plugin creator for fastest service.
<string-array name="EPr_default_urgency"> <string-array name="EPr_default_urgency">
<!-- urgency: labels for "Task Defaults" preference item. --> <!-- urgency: labels for "Task Defaults" preference item. -->
<item>No Deadline</item> <item>Ninguna fecha límite</item>
<item>Hoy</item> <item>Hoy</item>
<item>Mañana</item> <item>Mañana</item>
<item>Pasado mañana</item> <item>Pasado mañana</item>
@ -514,33 +542,33 @@ to the plugin creator for fastest service.
<string-array name="EPr_default_hideUntil"> <string-array name="EPr_default_hideUntil">
<!-- hideUntil: labels for "Task Defaults" preference item. --> <!-- hideUntil: labels for "Task Defaults" preference item. -->
<item>No esconder</item> <item>No esconder</item>
<item>Task is due</item> <item>Tarea se debe</item>
<item>Day before due</item> <item>Día antes de fecha límite</item>
<item>Week before due</item> <item>Semana antes de fecha límite</item>
</string-array> </string-array>
<!-- ==================================================== AddOnActivity == --> <!-- ==================================================== AddOnActivity == -->
<!-- Add Ons Activity Title --> <!-- Add Ons Activity Title -->
<string name="AOA_title">Astrid: Add Ons</string> <string name="AOA_title">Astrid: Componentes Adicionales</string>
<!-- Add-on Activity: author for internal authors --> <!-- Add-on Activity: author for internal authors -->
<string name="AOA_internal_author">Equipo de Astrid</string> <string name="AOA_internal_author">Equipo de Astrid</string>
<!-- Add-on Activity: installed add-ons tab --> <!-- Add-on Activity: installed add-ons tab -->
<string name="AOA_tab_installed">Installed</string> <string name="AOA_tab_installed">Instalado</string>
<!-- Add-on Activity - available add-ons tab --> <!-- Add-on Activity - available add-ons tab -->
<string name="AOA_tab_available">Available</string> <string name="AOA_tab_available">Disponible</string>
<!-- Add-on Activity - free add-ons label --> <!-- Add-on Activity - free add-ons label -->
<string name="AOA_free">Free</string> <string name="AOA_free">Gratuito</string>
<!-- Add-on Activity - menu item to visit add-on website --> <!-- Add-on Activity - menu item to visit add-on website -->
<string name="AOA_visit_website">Visit Website</string> <string name="AOA_visit_website">Visitar sitio web</string>
<!-- Add-on Activity - menu item to visit android market --> <!-- Add-on Activity - menu item to visit android market -->
<string name="AOA_visit_market">Android Market</string> <string name="AOA_visit_market">Tienda Android</string>
<!-- ========================================== SynchronizationProvider == --> <!-- ========================================== SynchronizationProvider == -->
@ -558,11 +586,8 @@ to the plugin creator for fastest service.
<!-- ============================================================= Misc == --> <!-- ============================================================= Misc == -->
<!-- Displayed when task killer found. %s => name of the application --> <!-- Displayed when task killer found. %s => name of the application -->
<string name="task_killer_help"> <string name="task_killer_help">Parece que está usando una app que puede matar procesos (%s)!
It looks like you are using an app that can kill processes (%s)! If you can, Si puede añada Astrid a la lista de exclusión de modo que no sea matada. De otro modo podría no avisarle cuando venza una Tarea.\n</string>
add Astrid to the exclusion list so it doesn\'t get killed. Otherwise,
Astrid might not let you know when your tasks are due.\n
</string>
<!-- Task killer dialog ok button --> <!-- Task killer dialog ok button -->
<string name="task_killer_help_ok">No mataré Astrid!</string> <string name="task_killer_help_ok">No mataré Astrid!</string>
@ -571,10 +596,7 @@ Astrid might not let you know when your tasks are due.\n
<string name="marketplace_title">Astrid lista Tareas/hacer</string> <string name="marketplace_title">Astrid lista Tareas/hacer</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid es la lista muy querido de código abierto todo / administrador de tareas diseñadas para ayudarle a conseguir la materia hecha. Cuenta con recordatorios, etiquetas, sincronización, un widget y mucho más.</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -629,7 +651,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="gcal_TEA_error">¡Ocurrió un error al agregar la tarea al calendario!</string> <string name="gcal_TEA_error">¡Ocurrió un error al agregar la tarea al calendario!</string>
<!-- Label for adding task to calendar --> <!-- Label for adding task to calendar -->
<string name="gcal_TEA_calendar_label">Calendar Integration:</string> <string name="gcal_TEA_calendar_label">Entrar la tarea al calendario</string>
<!-- Label for adding task to calendar --> <!-- Label for adding task to calendar -->
<string name="gcal_TEA_addToCalendar_label">Crear evento de calendario</string> <string name="gcal_TEA_addToCalendar_label">Crear evento de calendario</string>
@ -654,11 +676,10 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Resources for built-in locale plug-in --> <!-- Resources for built-in locale plug-in -->
<!-- Locale Alert Editing Window Title --> <!-- Locale Alert Editing Window Title -->
<string name="locale_edit_alerts_title">Astrid Filter Alert</string> <string name="locale_edit_alerts_title">Astrid alerta de filtro</string>
<!-- Locale Window Help --> <!-- Locale Window Help -->
<string name="locale_edit_intro">Astrid will send you a reminder <string name="locale_edit_intro">Astrid enviará un recordatorio cuando tiene cualquier tares en el siguiente filtro.</string>
when you have any tasks in the following filter:</string>
<!-- Locale Window Filter Picker UI --> <!-- Locale Window Filter Picker UI -->
<string name="locale_pick_filter">Filtrar:</string> <string name="locale_pick_filter">Filtrar:</string>
@ -677,10 +698,10 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
</string-array> </string-array>
<!-- Locale Notification text --> <!-- Locale Notification text -->
<string name="locale_notification">You have $NUM matching: $FILTER</string> <string name="locale_notification">Tiene $NUM coincider: $FILTER</string>
<!-- Locale Plugin was not found, it is required --> <!-- Locale Plugin was not found, it is required -->
<string name="locale_plugin_required">Please install the Astrid Locale plugin!</string> <string name="locale_plugin_required">Por favor, instale el componente adicionale de Locale</string>
@ -695,16 +716,16 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Recordarme...</string> <string name="TEA_reminder_label">Recordarme...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... cuando es hora de empezar la tarea</string> <string name="TEA_reminder_due">... cuando la tarea se debe</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... cuando la tarea esta atrasado</string>
<!-- Task Edit: Reminder at random times (%s => time plural)--> <!-- Task Edit: Reminder at random times (%s => time plural)-->
<string name="TEA_reminder_random">... randomly once</string> <string name="TEA_reminder_random">... azar una vez</string>
<!-- Task Edit: Reminder alarm clock label --> <!-- Task Edit: Reminder alarm clock label -->
<string name="TEA_reminder_alarm_label">Ring/Vibrate Type:</string> <string name="TEA_reminder_alarm_label">Tipo de Sonar/Vibrar:</string>
<!-- Task Edit: Reminder alarm clock toggle: off --> <!-- Task Edit: Reminder alarm clock toggle: off -->
<string name="TEA_reminder_alarm_off">Sonar una vez</string> <string name="TEA_reminder_alarm_off">Sonar una vez</string>
@ -741,59 +762,59 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Reminder Preference: Quiet Hours Start Title --> <!-- Reminder Preference: Quiet Hours Start Title -->
<string name="rmd_EPr_quiet_hours_start_title">Inicio del horario en silencio</string> <string name="rmd_EPr_quiet_hours_start_title">Inicio del horario en silencio</string>
<!-- Reminder Preference: Quiet Hours Start Description (%s => time set) --> <!-- Reminder Preference: Quiet Hours Start Description (%s => time set) -->
<string name="rmd_EPr_quiet_hours_start_desc">No notifications will appear after %s</string> <string name="rmd_EPr_quiet_hours_start_desc">Notoficaciones no aparcerá despues de %s</string>
<!-- Reminder Preference: Quiet Hours Start/End Description (disabled) --> <!-- Reminder Preference: Quiet Hours Start/End Description (disabled) -->
<string name="rmd_EPr_quiet_hours_desc_none">Quiet hours is disabled</string> <string name="rmd_EPr_quiet_hours_desc_none">Horas de silencio son discapacitados</string>
<!-- Reminder Preference: Quiet Hours End Title --> <!-- Reminder Preference: Quiet Hours End Title -->
<string name="rmd_EPr_quiet_hours_end_title">Fin del horario en silencio</string> <string name="rmd_EPr_quiet_hours_end_title">Fin del horario en silencio</string>
<!-- Reminder Preference: Quiet Hours End Description (%s => time set) --> <!-- Reminder Preference: Quiet Hours End Description (%s => time set) -->
<string name="rmd_EPr_quiet_hours_end_desc">Notifications will begin appearing starting at %s</string> <string name="rmd_EPr_quiet_hours_end_desc">Notoficaciones comenzarán a aparcer en %s</string>
<!-- Reminder Preference: Notification Ringtone Title --> <!-- Reminder Preference: Notification Ringtone Title -->
<string name="rmd_EPr_ringtone_title">Tono de notificación</string> <string name="rmd_EPr_ringtone_title">Tono de notificación</string>
<!-- Reminder Preference: Notification Ringtone Description (when custom tone is set) --> <!-- Reminder Preference: Notification Ringtone Description (when custom tone is set) -->
<string name="rmd_EPr_ringtone_desc_custom">Custom ringtone has been set</string> <string name="rmd_EPr_ringtone_desc_custom">Tono se ha establecido</string>
<!-- Reminder Preference: Notification Ringtone Description (when silence is set) --> <!-- Reminder Preference: Notification Ringtone Description (when silence is set) -->
<string name="rmd_EPr_ringtone_desc_silent">Ringtone set to silent</string> <string name="rmd_EPr_ringtone_desc_silent">Tono en modo silencio</string>
<!-- Reminder Preference: Notification Ringtone Description (when custom tone is not set) --> <!-- Reminder Preference: Notification Ringtone Description (when custom tone is not set) -->
<string name="rmd_EPr_ringtone_desc_default">Default ringtone will be used</string> <string name="rmd_EPr_ringtone_desc_default">Configuración tono inicial se utilizará</string>
<!-- Reminder Preference: Notification Persistence Title --> <!-- Reminder Preference: Notification Persistence Title -->
<string name="rmd_EPr_persistent_title">Notification Persistence</string> <string name="rmd_EPr_persistent_title">Persistencia de notificación</string>
<!-- Reminder Preference: Notification Persistence Description (true) --> <!-- Reminder Preference: Notification Persistence Description (true) -->
<string name="rmd_EPr_persistent_desc_true">Notifications must be viewed individually to be cleared</string> <string name="rmd_EPr_persistent_desc_true">Notificacións hay que eliminar uno a la vez</string>
<!-- Reminder Preference: Notification Persistence Description (false) --> <!-- Reminder Preference: Notification Persistence Description (false) -->
<string name="rmd_EPr_persistent_desc_false">Notifications can be cleared with \"Clear All\" button</string> <string name="rmd_EPr_persistent_desc_false">Notificaciónes se pueden borrar con el botón \"Borrar Todo\"</string>
<!-- Reminder Preference: Notification Icon Title --> <!-- Reminder Preference: Notification Icon Title -->
<string name="rmd_EPr_notificon_title">Notification Icon Set</string> <string name="rmd_EPr_notificon_title">Icono de notoficación establecidos</string>
<!-- Reminder Preference: Notification Icon Description --> <!-- Reminder Preference: Notification Icon Description -->
<string name="rmd_Epr_notificon_desc">Choose Astrid\'s notification bar icon</string> <string name="rmd_Epr_notificon_desc">elegir el icono de notificación establecidos</string>
<!-- Reminder Preference: Vibrate Title --> <!-- Reminder Preference: Vibrate Title -->
<string name="rmd_EPr_vibrate_title">Vibrar en alerta</string> <string name="rmd_EPr_vibrate_title">Vibrar en alerta</string>
<!-- Reminder Preference: Vibrate Description (true) --> <!-- Reminder Preference: Vibrate Description (true) -->
<string name="rmd_EPr_vibrate_desc_true">Astrid will vibrate when sending notifications</string> <string name="rmd_EPr_vibrate_desc_true">Vibrará cuando el envío de notificaciones</string>
<!-- Reminder Preference: Vibrate Description (false) --> <!-- Reminder Preference: Vibrate Description (false) -->
<string name="rmd_EPr_vibrate_desc_false">Astrid will not vibrate when sending notifications</string> <string name="rmd_EPr_vibrate_desc_false">No vibrará cuando el envío de notificaciones</string>
<!-- Reminder Preference: Nagging Title --> <!-- Reminder Preference: Nagging Title -->
<string name="rmd_EPr_nagging_title">Recordatorios de Astrid</string> <string name="rmd_EPr_nagging_title">Recordatorios de Astrid</string>
<!-- Reminder Preference: Nagging Description (true) --> <!-- Reminder Preference: Nagging Description (true) -->
<string name="rmd_EPr_nagging_desc_true">Astrid will show up to give you an encouragement during reminders</string> <string name="rmd_EPr_nagging_desc_true">Astrid dará estímulo adicional para los recordatorios.</string>
<!-- Reminder Preference: Nagging Description (false) --> <!-- Reminder Preference: Nagging Description (false) -->
<string name="rmd_EPr_nagging_desc_false">Astrid not give you any encouragement messages</string> <string name="rmd_EPr_nagging_desc_false">Astrid no dará estímulo adicional para los recordatorios</string>
<!-- Reminder Preference: Default Reminders Title --> <!-- Reminder Preference: Default Reminders Title -->
<string name="rmd_EPr_defaultRemind_title">Recordatorios aleatorios</string> <string name="rmd_EPr_defaultRemind_title">Recordatorios aleatorios</string>
<!-- Reminder Preference: Default Reminders Setting (disabled) --> <!-- Reminder Preference: Default Reminders Setting (disabled) -->
<string name="rmd_EPr_defaultRemind_desc_disabled">New tasks will have no random reminders</string> <string name="rmd_EPr_defaultRemind_desc_disabled">Nuevas tareas no han recordatorios al azar</string>
<!-- Reminder Preference: Default Reminders Setting (%s => setting) --> <!-- Reminder Preference: Default Reminders Setting (%s => setting) -->
<string name="rmd_EPr_defaultRemind_desc">New tasks will remind randomly: %s</string> <string name="rmd_EPr_defaultRemind_desc">Nuevas tares le recordará al azar: %s</string>
<!-- Defaults Title --> <!-- Defaults Title -->
<string name="rmd_EPr_defaults_header">New Task Defaults</string> <string name="rmd_EPr_defaults_header">configuración de la tarea inicial</string>
<string-array name="EPr_reminder_random"> <string-array name="EPr_reminder_random">
<!-- Reminder Preference: random reminder choices for preference page. --> <!-- Reminder Preference: random reminder choices for preference page. -->
@ -801,9 +822,9 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<item>cada hora</item> <item>cada hora</item>
<item>diariamente</item> <item>diariamente</item>
<item>semanalmente</item> <item>semanalmente</item>
<item>bi-weekly</item> <item>Dos veces por semana</item>
<item>mensualmente</item> <item>mensualmente</item>
<item>bi-monthly</item> <item>Dos veces por mes</item>
</string-array> </string-array>
<string-array name="EPr_quiet_hours_start"> <string-array name="EPr_quiet_hours_start">
@ -867,38 +888,38 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="reminders"> <string-array name="reminders">
<!-- reminders: Make these < 20 chars so the task name is displayed --> <!-- reminders: Make these < 20 chars so the task name is displayed -->
<item>¡Hola! ¿Tienes un segundo?</item> <item>Hola! ¿Tiene un segundo?</item>
<item>¿Puedo verte un segundo?</item> <item>¿Puede ver por un segundo?</item>
<item>¿Tienes unos minutos?</item> <item>¿Tiene unos minutos?</item>
<item>¿Te has olvidado?</item> <item>¿Se te olvidó?</item>
<item>¡Disculpe!</item> <item>¡Disculpe!</item>
<item>Cuando tenga un minuto:</item> <item>Cuando tenga un minuto:</item>
<item>En tu agenda:</item> <item>En su agenda:</item>
<item>¿Tienes un momento libre?</item> <item>Tiene un momento libre?</item>
<item>¡Astrid esta aquí!</item> <item>Astrid aquí!</item>
<item>¡Hola! ¿Puedo molestarlo?</item> <item>¡Hola! ¿Puedo molestarlo?</item>
<item>¿Me concedes un minuto?</item> <item>Un minuto de su tiempo</item>
<item>Es un gran día para</item> <item>Es un gran día para</item>
</string-array> </string-array>
<string-array name="reminders_due"> <string-array name="reminders_due">
<!-- reminders related to task due date --> <!-- reminders related to task due date -->
<item>¡Hora de trabajar!</item> <item>¡Hora de trabajar!</item>
<item>Due date is here!</item> <item>Fecha de venciendo está aquí!</item>
<item>¿Listo para empezar?</item> <item>¿Listo para empezar?</item>
<item>You said you would do:</item> <item>Dijiste que harías:</item>
<item>You\'re supposed to start:</item> <item>Se supone que comenzará:</item>
<item>Time to start:</item> <item>Momento de empezar:</item>
<item>¡Es hora!</item> <item>¡Es hora!</item>
<item>Excuse me! Time for</item> <item>Perdón! Tiempo para:</item>
<item>You free? Time to</item> <item>¿Está libre? Tiempo para:</item>
</string-array> </string-array>
<string-array name="reminders_snooze"> <string-array name="reminders_snooze">
<!-- reminders related to snooze --> <!-- reminders related to snooze -->
<item>Don\'t be lazy now!</item> <item>No sea perezoso ahora!</item>
<item>Snooze time is up!</item> <item>Tiempo de pausa está terminado!</item>
<item>No more snoozing!</item> <item>No dormitando mas!</item>
<item>¿Ahora está listo?</item> <item>¿Ahora está listo?</item>
<item>¡Basta de posponerlo!</item> <item>¡Basta de posponerlo!</item>
</string-array> </string-array>
@ -906,36 +927,36 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="reminder_responses"> <string-array name="reminder_responses">
<!-- responses to reminder: Astrid says... (user should answer yes or no) --> <!-- responses to reminder: Astrid says... (user should answer yes or no) -->
<item>¡Tengo algo para usted!</item> <item>¡Tengo algo para usted!</item>
<item>¿Listo para poner esto en el pasado?</item> <item>Está listo para poner esto en el pasado?</item>
<item>¿Por qué no terminas esto?</item> <item>¿Por qué no conseguir este hecho?</item>
<item>¿Qué me dices? ¿Listo tigre?</item> <item>¿Qué te parece? Tigre listo?</item>
<item>¿Listo para hacer esto?</item> <item>¿Listo para hacer esto?</item>
<item>¿Puedes con esto?</item> <item>¿Se puede manejar esto?</item>
<item>¡Puedes ser feliz! ¡Solo termínalo!</item> <item>Puede estar feliz! Solo terminar este!</item>
<item>¡Le prometo que se sentirá mejor si termina esto!</item> <item>¡Le prometo que se sentirá mejor si termina esto!</item>
<item>¿No hará esto hoy?</item> <item>¿No hará esto hoy?</item>
<item>Por favor termine esto ¡me tiene harto!</item> <item>Por favor termine esto ¡me tiene harto!</item>
<item>¿Puedes terminar esto? ¡Tu puedes!</item> <item>Puede terminar este? Sí, se puede!</item>
<item>¿Acaso nunca va a hacer esto?</item> <item>¿Acaso nunca va a hacer esto?</item>
<item>Siéntete bien! Vamos!</item> <item>Sentirse bien consigo mismo! Vamos!</item>
<item>¡Estoy orgulloso de ti! ¡Vamos a acabar esto!</item> <item>Estoy orgulloso de ti! Lograr que se haga!</item>
<item>¿Un bocadillo cuando termines esto?</item> <item>Un refrigerio después de haber terminado?</item>
<item>¿Solo esta tarea? ¿Por favor?</item> <item>Solo este tarea? Por favor?</item>
<item>¡Es hora de acortar tu lista de tareas!</item> <item>Es hora de acortar su lista de tarea!</item>
</string-array> </string-array>
<string-array name="postpone_nags"> <string-array name="postpone_nags">
<!-- Astrid's nagging when user clicks postpone --> <!-- Astrid's nagging when user clicks postpone -->
<item>Please tell me it isn\'t true that you\'re a procrastinator!</item> <item>Por favor, dime que no es cierto que usted es un procrastinator!</item>
<item>Doesn\'t being lazy get old sometimes?</item> <item>¿Puede ser perezoso aburrido?</item>
<item>¡Alguien en algún lugar está esperando que termine esto!</item> <item>¡Alguien en algún lugar está esperando que termine esto!</item>
<item>¿Cuando dice posponer... realmente quiere decir \'lo estoy haciendo\'? ¿verdad?</item> <item>¿Cuando dice posponer... realmente quiere decir \'lo estoy haciendo\'? ¿verdad?</item>
<item>¿Esta es la última vez que pospone esto? ¿verdad?</item> <item>¿Esta es la última vez que pospone esto? ¿verdad?</item>
<item>¡Termínelo hoy! no le diré a nadie...</item> <item>¡Termínelo hoy! no le diré a nadie...</item>
<item>Porqué posponer cuando puede... no posponer!</item> <item>Porqué posponer cuando puede... no posponer!</item>
<item>¿Supongo que terminará esto en algún momento?</item> <item>¿Supongo que terminará esto en algún momento?</item>
<item>I think you\'re really great! How about not putting this off?</item> <item>Pienso que eres fenomenal! ¿Qué hay de no demorar esto?</item>
<item>¿Podrás alcanzar tus metas si haces eso?</item> <item>¿Serás capaz de lograr sus metas, si haces eso?</item>
<item>Posponer, posponer, posponer. ¡Cuándo va a cambiar!</item> <item>Posponer, posponer, posponer. ¡Cuándo va a cambiar!</item>
<item>¡Ya fueron suficientes excusas! ¡hágalo de una vez!</item> <item>¡Ya fueron suficientes excusas! ¡hágalo de una vez!</item>
<item>¿Esa no fue la excusa que usó la última vez?</item> <item>¿Esa no fue la excusa que usó la última vez?</item>
@ -950,16 +971,16 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Resources for built-in repeat plug-in --> <!-- Resources for built-in repeat plug-in -->
<!-- repeating plugin name --> <!-- repeating plugin name -->
<string name="repeat_plugin">Repeating Tasks</string> <string name="repeat_plugin">Repetición de Tareas</string>
<!-- repeating plugin description --> <!-- repeating plugin description -->
<string name="repeat_plugin_desc">Allows tasks to repeat</string> <string name="repeat_plugin_desc">Permite repetir las tareas.</string>
<!-- checkbox for turning on/off repeats --> <!-- checkbox for turning on/off repeats -->
<string name="repeat_enabled">Repeticiones</string> <string name="repeat_enabled">Repeticiones</string>
<!-- button for "every x" part of repeat (%d -> repeat value) --> <!-- button for "every x" part of repeat (%d -> repeat value) -->
<string name="repeat_every">Every %d</string> <string name="repeat_every">Cada %d</string>
<!-- hint when opening repeat interval --> <!-- hint when opening repeat interval -->
<string name="repeat_interval_prompt">Intervalo de repetición</string> <string name="repeat_interval_prompt">Intervalo de repetición</string>
@ -974,18 +995,18 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="repeat_type"> <string-array name="repeat_type">
<!-- repeat type (date to repeat from) --> <!-- repeat type (date to repeat from) -->
<item>from due date</item> <item>Desde fecha límite</item>
<item>from completion date</item> <item>Desde fecha finalización</item>
</string-array> </string-array>
<!-- task detail weekly by day ($I -> interval, i.e. 1 week, $D -> days, i.e. Monday, Tuesday) --> <!-- task detail weekly by day ($I -> interval, i.e. 1 week, $D -> days, i.e. Monday, Tuesday) -->
<string name="repeat_detail_byday">$I en $D</string> <string name="repeat_detail_byday">$I en $D</string>
<!-- task detail for repeat from due date (%s -> interval) --> <!-- task detail for repeat from due date (%s -> interval) -->
<string name="repeat_detail_duedate">Repeats every %s</string> <string name="repeat_detail_duedate">Se repite cada %s</string>
<!-- task detail for repeat from completion date (%s -> interval) --> <!-- task detail for repeat from completion date (%s -> interval) -->
<string name="repeat_detail_completion">Repeats %s after completion</string> <string name="repeat_detail_completion">Se repite %s después de la finalización</string>
@ -995,16 +1016,16 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- ====================== Plugin Boilerplate ========================= --> <!-- ====================== Plugin Boilerplate ========================= -->
<!-- label for RMilk button in Task Edit Activity --> <!-- label for RMilk button in Task Edit Activity -->
<string name="rmilk_EOE_button">Remember the Milk Settings</string> <string name="rmilk_EOE_button">Ajustes de Remember the Milk</string>
<!-- task detail showing RTM list information --> <!-- task detail showing RTM list information -->
<string name="rmilk_TLA_list">RTM List: %s</string> <string name="rmilk_TLA_list">RTM Lista: %s</string>
<!-- task detail showing RTM repeat information --> <!-- task detail showing RTM repeat information -->
<string name="rmilk_TLA_repeat">RTM Repeating Task</string> <string name="rmilk_TLA_repeat">RTM Tarea Repetitiva</string>
<!-- task detail showing item needs to be synchronized --> <!-- task detail showing item needs to be synchronized -->
<string name="rmilk_TLA_sync">Needs synchronization with RTM</string> <string name="rmilk_TLA_sync">Se necesita sincronizar con RTM</string>
<!-- filters header: RTM --> <!-- filters header: RTM -->
<string name="rmilk_FEx_header">Remember the Milk</string> <string name="rmilk_FEx_header">Remember the Milk</string>
@ -1016,7 +1037,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_FEx_list_item">$N ($C)</string> <string name="rmilk_FEx_list_item">$N ($C)</string>
<!-- RTM list filter title (%s => list) --> <!-- RTM list filter title (%s => list) -->
<string name="rmilk_FEx_list_title">RTM List \'%s\'</string> <string name="rmilk_FEx_list_title">RTM Lista \'%s\'</string>
<!-- ======================= MilkEditActivity ========================== --> <!-- ======================= MilkEditActivity ========================== -->
@ -1024,13 +1045,13 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MEA_title">Remember the Milk</string> <string name="rmilk_MEA_title">Remember the Milk</string>
<!-- RTM edit List Edit Label --> <!-- RTM edit List Edit Label -->
<string name="rmilk_MEA_list_label">RTM List:</string> <string name="rmilk_MEA_list_label">RTM Lista:</string>
<!-- RTM edit Repeat Label --> <!-- RTM edit Repeat Label -->
<string name="rmilk_MEA_repeat_label">RTM Repeat Status:</string> <string name="rmilk_MEA_repeat_label">RTM Repita Estado:</string>
<!-- RTM edit Repeat Hint --> <!-- RTM edit Repeat Hint -->
<string name="rmilk_MEA_repeat_hint">i.e. every week, after 14 days</string> <string name="rmilk_MEA_repeat_hint">Es decir cada semana, después de catorce días</string>
<!-- ======================== MilkPreferences ========================== --> <!-- ======================== MilkPreferences ========================== -->
@ -1041,9 +1062,9 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MPr_group_status">Estado</string> <string name="rmilk_MPr_group_status">Estado</string>
<!-- Sync Status: log in --> <!-- Sync Status: log in -->
<string name="rmilk_status_loggedout">Please Log In To RTM!</string> <string name="rmilk_status_loggedout">Por favor, ingrese a RTM</string>
<!-- Status: ongoing --> <!-- Status: ongoing -->
<string name="rmilk_status_ongoing">Sync Ongoing...</string> <string name="rmilk_status_ongoing">Sincronización en curso...</string>
<!-- Sync Status: success status (%s -> last sync date). Keep it short!--> <!-- Sync Status: success status (%s -> last sync date). Keep it short!-->
<string name="rmilk_status_success">Última sincronización: %s</string> <string name="rmilk_status_success">Última sincronización: %s</string>
<!-- Sync Status: error status (%s -> last attempted sync date) --> <!-- Sync Status: error status (%s -> last attempted sync date) -->
@ -1059,16 +1080,16 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Preference: Synchronization Interval Title --> <!-- Preference: Synchronization Interval Title -->
<string name="rmilk_MPr_interval_title">Sincronizar en segundo plano</string> <string name="rmilk_MPr_interval_title">Sincronizar en segundo plano</string>
<!-- Preference: Synchronization Interval Description (when disabled) --> <!-- Preference: Synchronization Interval Description (when disabled) -->
<string name="rmilk_MPr_interval_desc_disabled">Background synchronization is disabled</string> <string name="rmilk_MPr_interval_desc_disabled">Sincronización en segundo plano está desactivada</string>
<!-- Preference: Synchronization Interval Description (%s => setting) --> <!-- Preference: Synchronization Interval Description (%s => setting) -->
<string name="rmilk_MPr_interval_desc">Currently set to: %s</string> <string name="rmilk_MPr_interval_desc">Actualmente configurado para: %s</string>
<!-- Preference: Background Wifi Title --> <!-- Preference: Background Wifi Title -->
<string name="rmilk_MPr_bgwifi_title">Wifi Only Setting</string> <string name="rmilk_MPr_bgwifi_title">Wifi ajuste sólo</string>
<!-- Preference: Background Wifi Description (enabled) --> <!-- Preference: Background Wifi Description (enabled) -->
<string name="rmilk_MPr_bgwifi_desc_enabled">Background synchronization only happens when on Wifi</string> <string name="rmilk_MPr_bgwifi_desc_enabled">Sincronización en segundo plano sólo ocurre cuando el Wifi</string>
<!-- Preference: Background Wifi Description (disabled) --> <!-- Preference: Background Wifi Description (disabled) -->
<string name="rmilk_MPr_bgwifi_desc_disabled">Background synchronization will always occur</string> <string name="rmilk_MPr_bgwifi_desc_disabled">Sincronización en segundo plano siempre se produce</string>
<!-- Actions Group Label --> <!-- Actions Group Label -->
<string name="rmilk_MPr_group_actions">Acciones</string> <string name="rmilk_MPr_group_actions">Acciones</string>
@ -1076,24 +1097,20 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Synchronize Now Button --> <!-- Synchronize Now Button -->
<string name="rmilk_MPr_sync">¡Sincronizar ahora!</string> <string name="rmilk_MPr_sync">¡Sincronizar ahora!</string>
<!-- Synchronize Now Button if not logged in--> <!-- Synchronize Now Button if not logged in-->
<string name="rmilk_MPr_sync_log_in">Log In &amp; Synchronize!</string> <string name="rmilk_MPr_sync_log_in">Registrarse y sincronizar!</string>
<!-- Sync: Clear Data Title --> <!-- Sync: Clear Data Title -->
<string name="rmilk_MPr_forget">Cerrar sesión</string> <string name="rmilk_MPr_forget">Cerrar sesión</string>
<!-- Sync: Clear Data Description --> <!-- Sync: Clear Data Description -->
<string name="rmilk_MPr_forget_description">Clears all RTM synchronization data</string> <string name="rmilk_MPr_forget_description">Borra todos los datos de sincronización de RTM</string>
<!-- ======================= MilkLoginActivity ========================= --> <!-- ======================= MilkLoginActivity ========================= -->
<!-- RTM Login Instructions --> <!-- RTM Login Instructions -->
<string name="rmilk_MLA_label">Please Log In and Authorize Astrid:</string> <string name="rmilk_MLA_label">Por favor Entrar en este lugar y Autorizar Astrid:</string>
<!-- Login Error Dialog (%s => message) --> <!-- Login Error Dialog (%s => message) -->
<string name="rmilk_MLA_error"> <string name="rmilk_MLA_error">Lo siento, no fue un error verificar su nombre de usuario. Por favor, inténtelo de nuevo. \n\n Mensaje de error: %s</string>
Sorry, there was an error verifying your login. Please try again.
\n\n
Error Message: %s
</string>
<!-- ======================== Synchronization ========================== --> <!-- ======================== Synchronization ========================== -->
@ -1101,11 +1118,10 @@ Error Message: %s
<string name="rmilk_notification_title">Astrid: Remember the Milk</string> <string name="rmilk_notification_title">Astrid: Remember the Milk</string>
<!-- confirmation dialog for RTM log out --> <!-- confirmation dialog for RTM log out -->
<string name="rmilk_forget_confirm">Log out / clear synchronization data?</string> <string name="rmilk_forget_confirm">Cierre de sesión / cancelar la sincronización de datos?</string>
<!-- Error msg when io exception with rmilk --> <!-- Error msg when io exception with rmilk -->
<string name="rmilk_ioerror">Connection Error! Check your Internet connection, <string name="rmilk_ioerror">Error de conexión! Compruebe su conexión a Internet o servidores quizá RTM (status.rememberthemilk.com), para posibles soluciones.</string>
or maybe RTM servers (status.rememberthemilk.com), for possible solutions.</string>
<string-array name="rmilk_MPr_interval_entries"> <string-array name="rmilk_MPr_interval_entries">
<!-- rmilk_MPr_interval_entries: Synchronization Intervals --> <!-- rmilk_MPr_interval_entries: Synchronization Intervals -->
@ -1149,10 +1165,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiquetas</string> <string name="tag_FEx_header">Etiquetas</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">Por tamaño</string> <string name="tag_FEx_by_size">Activo</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completado</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alfabético</string> <string name="tag_FEx_alpha">Todas las etiquetas</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Sin etiquetas</string> <string name="tag_FEx_untagged">Sin etiquetas</string>
@ -1177,13 +1196,13 @@ Error Message: %s
<string name="TAE_stopTimer">Parar</string> <string name="TAE_stopTimer">Parar</string>
<!-- Android Notification Title (%s => # tasks) --> <!-- Android Notification Title (%s => # tasks) -->
<string name="TPl_notification">Timers Active for %s!</string> <string name="TPl_notification">Temporizadores Activos por %s!</string>
<!-- Filter Header for Timer plugin --> <!-- Filter Header for Timer plugin -->
<string name="TFE_category">Timer Filters</string> <string name="TFE_category">Filtros de Temporizadores</string>
<!-- Filter for Timed Tasks --> <!-- Filter for Timed Tasks -->
<string name="TFE_workingOn">Tasks Being Timed</string> <string name="TFE_workingOn">Tareas que se cronometrado</string>
</resources> </resources>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Impossible de trouver :</string> <string name="DLG_error_opening">Impossible de trouver :</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Impossible d\'accéder au fichier : %s</string> <string name="DLG_error_sdcard">Impossible d\'accéder au fichier : %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Veuillez patienter...</string> <string name="DLG_wait">Veuillez patienter...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Temps (heures : minutes)</string> <string name="DLG_hour_minutes">Temps (heures : minutes)</string>
@ -470,10 +494,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Taille de la liste des tâches</string> <string name="EPr_fontSize_title">Taille de la liste des tâches</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Taille de la police sur la liste de la page principale</string> <string name="EPr_fontSize_desc">Taille de la police sur la liste de la page principale</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">Paramètres par défaut de la tâche</string> <string name="EPr_defaults_header">Paramètres par défaut de la tâche</string>
@ -565,10 +595,7 @@ to the plugin creator for fastest service.
<string name="marketplace_title">Astrid - Gestionnaire de tâches</string> <string name="marketplace_title">Astrid - Gestionnaire de tâches</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid est le plus populaire gestionnaire de tâches open-source. Très simple d\'utilisation et puissant, il vous permettra d\'accomplir aisément vos objectifs ! Étiquettes, rappels, synchronisation avec RememberTheMilk, greffon pour Locale et bien plus !</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -688,7 +715,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Me rappeler...</string> <string name="TEA_reminder_label">Me rappeler...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... lorsqu\'il est temps de commencer la tâche</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... lorsque la tâche est en retard</string> <string name="TEA_reminder_overdue">... lorsque la tâche est en retard</string>
@ -1042,7 +1069,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Sync Status: error status (%s -> last attempted sync date) --> <!-- Sync Status: error status (%s -> last attempted sync date) -->
<string name="rmilk_status_failed">Échec sur : %s</string> <string name="rmilk_status_failed">Échec sur : %s</string>
<!-- Sync Status: error subtitle (%s -> last successful sync date) --> <!-- Sync Status: error subtitle (%s -> last successful sync date) -->
<string name="rmilk_status_failed_subtitle">Dernière synchro. réussie : %s</string> <string name="rmilk_status_failed_subtitle">Dernière synchro. réussie: %s</string>
<!-- Sync Status: never sync'd --> <!-- Sync Status: never sync'd -->
<string name="rmilk_status_never">Jamais synchronisé !</string> <string name="rmilk_status_never">Jamais synchronisé !</string>
@ -1137,10 +1164,13 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="tag_FEx_header">Étiquettes</string> <string name="tag_FEx_header">Étiquettes</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">Par taille</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabétique</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Non étiquetté</string> <string name="tag_FEx_untagged">Non étiquetté</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Could not find this item: </string> <string name="DLG_error_opening">Could not find this item: </string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Cannot access folder: %s</string> <string name="DLG_error_sdcard">Cannot access folder: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Waktu (jam: menit)</string> <string name="DLG_hour_minutes">Waktu (jam: menit)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Task List Size</string> <string name="EPr_fontSize_title">Task List Size</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Font size on the main listing page</string> <string name="EPr_fontSize_desc">Font size on the main listing page</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -700,7 +730,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Tanda</string> <string name="tag_FEx_header">Tanda</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -64,7 +85,7 @@
<string name="import_summary_title">Ripristina sommario</string> <string name="import_summary_title">Ripristina sommario</string>
<!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) --> <!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) -->
<string name="import_summary_message">Il File %s contiene %s. \n\ n%s importati,\n %s esiste già \n %s contiene errori \n</string> <string name="import_summary_message">Il File %s contiene %s. \n\ n %s importati,\n %s esiste già \n %s contiene errori \n</string>
<!-- Progress Dialog Title for importing --> <!-- Progress Dialog Title for importing -->
<string name="import_progress_title">Importazione in corso...</string> <string name="import_progress_title">Importazione in corso...</string>
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Impossibile trovare questo elemento:</string> <string name="DLG_error_opening">Impossibile trovare questo elemento:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Impossibile accedere alla cartella: %s</string> <string name="DLG_error_sdcard">Impossibile accedere alla cartella: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Attendere per favore...</string> <string name="DLG_wait">Attendere per favore...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Tempo (ore : minuti)</string> <string name="DLG_hour_minutes">Tempo (ore : minuti)</string>
@ -470,10 +494,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Dimensione elenco attività</string> <string name="EPr_fontSize_title">Dimensione elenco attività</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Dimensione carattere nella pagina principale</string> <string name="EPr_fontSize_desc">Dimensione carattere nella pagina principale</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">Nuove impostazioni predefinite attività</string> <string name="EPr_defaults_header">Nuove impostazioni predefinite attività</string>
@ -670,7 +700,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
</string-array> </string-array>
<!-- Locale Notification text --> <!-- Locale Notification text -->
<string name="locale_notification">Hai $NUM corrispondenti: $FILTRO</string> <string name="locale_notification">Hai $NUM corrispondenti: $FILTER</string>
<!-- Locale Plugin was not found, it is required --> <!-- Locale Plugin was not found, it is required -->
<string name="locale_plugin_required">Please install the Astrid Locale plugin!</string> <string name="locale_plugin_required">Please install the Astrid Locale plugin!</string>
@ -688,7 +718,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Ricordami...</string> <string name="TEA_reminder_label">Ricordami...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... quando è il momento di avviare l\'attività</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... quando l\'attività è in ritardo</string> <string name="TEA_reminder_overdue">... quando l\'attività è in ritardo</string>
@ -1137,10 +1167,13 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="tag_FEx_header">Etichette</string> <string name="tag_FEx_header">Etichette</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">Per Dimensione</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alfabetico</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Senza etichetta</string> <string name="tag_FEx_untagged">Senza etichetta</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -19,7 +40,7 @@
<!-- Backup Status: error subtitle --> <!-- Backup Status: error subtitle -->
<string name="backup_status_failed_subtitle">(タップでエラーを表示)</string> <string name="backup_status_failed_subtitle">(タップでエラーを表示)</string>
<!-- Backup Status: never backed up --> <!-- Backup Status: never backed up -->
<string name="backup_status_never">Never Backed Up!</string> <string name="backup_status_never">一度もバックアップしてません!</string>
<!-- Backup Options Group Label --> <!-- Backup Options Group Label -->
<string name="backup_BPr_group_options">オプション</string> <string name="backup_BPr_group_options">オプション</string>
@ -64,7 +85,7 @@
<string name="import_summary_title">復元の概要</string> <string name="import_summary_title">復元の概要</string>
<!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) --> <!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) -->
<string name="import_summary_message">ファイル %s の %s 中、\n\n成功: %s\n既に存在: %s\n失敗: %s\n</string> <string name="import_summary_message">ファイル %s の %s 中、\n\n成功: %s\n既に存在: %s\n失敗: %s\n</string>
<!-- Progress Dialog Title for importing --> <!-- Progress Dialog Title for importing -->
<string name="import_progress_title">インポート中</string> <string name="import_progress_title">インポート中</string>
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Could not find this item: </string> <string name="DLG_error_opening">Could not find this item: </string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">フォルダ %s を開けません</string> <string name="DLG_error_sdcard">フォルダ %s を開けません</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -170,9 +191,9 @@
</plurals> </plurals>
<plurals name="Ntasks"> <plurals name="Ntasks">
<!-- plurals: tasks --> <!-- plurals: tasks -->
<item quantity="one">タスク1つ</item> <item quantity="one">タスク 1 件</item>
<!-- plurals: tasks --> <!-- plurals: tasks -->
<item quantity="other">タスク %d </item> <item quantity="other">タスク %d </item>
</plurals> </plurals>
<!-- ================================================== Generic Dialogs == --> <!-- ================================================== Generic Dialogs == -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">お待ちください</string> <string name="DLG_wait">お待ちください</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">時間 (時:分)</string> <string name="DLG_hour_minutes">時間 (時:分)</string>
@ -472,10 +496,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">リストの文字サイズ</string> <string name="EPr_fontSize_title">リストの文字サイズ</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">メインのリスト画面の文字サイズ</string> <string name="EPr_fontSize_desc">メインのリスト画面の文字サイズ</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">タスクのデフォルト設定</string> <string name="EPr_defaults_header">タスクのデフォルト設定</string>
@ -558,11 +588,7 @@ to the plugin creator for fastest service.
<!-- ============================================================= Misc == --> <!-- ============================================================= Misc == -->
<!-- Displayed when task killer found. %s => name of the application --> <!-- Displayed when task killer found. %s => name of the application -->
<string name="task_killer_help"> <string name="task_killer_help">タスクキラー (%s) を使用中です。Astrid が終了しないように、除外リストに登録してください。そうしないと、期限が来たタスクを通知できなくなります。\n</string>
It looks like you are using an app that can kill processes (%s)! If you can,
add Astrid to the exclusion list so it doesn\'t get killed. Otherwise,
Astrid might not let you know when your tasks are due.\n
</string>
<!-- Task killer dialog ok button --> <!-- Task killer dialog ok button -->
<string name="task_killer_help_ok">I Won\'t Kill Astrid!</string> <string name="task_killer_help_ok">I Won\'t Kill Astrid!</string>
@ -695,7 +721,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">期限を過ぎたとき</string> <string name="TEA_reminder_overdue">期限を過ぎたとき</string>
@ -719,7 +745,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<item>毎週</item> <item>毎週</item>
<item>一週おきに</item> <item>一週おきに</item>
<item>毎月</item> <item>毎月</item>
<item>in two months</item> <item>一ヶ月おきに</item>
</string-array> </string-array>
<!-- ==================================================== notifications == --> <!-- ==================================================== notifications == -->
@ -731,7 +757,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmd_NoA_snooze">後で通知</string> <string name="rmd_NoA_snooze">後で通知</string>
<!-- Reminder: Cancel reminder --> <!-- Reminder: Cancel reminder -->
<string name="rmd_NoA_goAway">Go Away!</string> <string name="rmd_NoA_goAway">なくなれ!</string>
<!-- ============================================= reminder preferences == --> <!-- ============================================= reminder preferences == -->
@ -760,11 +786,11 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmd_EPr_ringtone_desc_default">デフォルトの通知音を使用</string> <string name="rmd_EPr_ringtone_desc_default">デフォルトの通知音を使用</string>
<!-- Reminder Preference: Notification Persistence Title --> <!-- Reminder Preference: Notification Persistence Title -->
<string name="rmd_EPr_persistent_title">Notification Persistence</string> <string name="rmd_EPr_persistent_title">通知の持続</string>
<!-- Reminder Preference: Notification Persistence Description (true) --> <!-- Reminder Preference: Notification Persistence Description (true) -->
<string name="rmd_EPr_persistent_desc_true">Notifications must be viewed individually to be cleared</string> <string name="rmd_EPr_persistent_desc_true">通知はひとつひとつ削除する必要があります</string>
<!-- Reminder Preference: Notification Persistence Description (false) --> <!-- Reminder Preference: Notification Persistence Description (false) -->
<string name="rmd_EPr_persistent_desc_false">Notifications can be cleared with \"Clear All\" button</string> <string name="rmd_EPr_persistent_desc_false">通知は\"通知を消去\"ボタンで消えます</string>
<!-- Reminder Preference: Notification Icon Title --> <!-- Reminder Preference: Notification Icon Title -->
<string name="rmd_EPr_notificon_title">Notification Icon Set</string> <string name="rmd_EPr_notificon_title">Notification Icon Set</string>
@ -772,11 +798,11 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmd_Epr_notificon_desc">Choose Astrid\'s notification bar icon</string> <string name="rmd_Epr_notificon_desc">Choose Astrid\'s notification bar icon</string>
<!-- Reminder Preference: Vibrate Title --> <!-- Reminder Preference: Vibrate Title -->
<string name="rmd_EPr_vibrate_title">Vibrate on Alert</string> <string name="rmd_EPr_vibrate_title">アラート時に震える</string>
<!-- Reminder Preference: Vibrate Description (true) --> <!-- Reminder Preference: Vibrate Description (true) -->
<string name="rmd_EPr_vibrate_desc_true">Astrid will vibrate when sending notifications</string> <string name="rmd_EPr_vibrate_desc_true">通知を送るときに震えます</string>
<!-- Reminder Preference: Vibrate Description (false) --> <!-- Reminder Preference: Vibrate Description (false) -->
<string name="rmd_EPr_vibrate_desc_false">Astrid will not vibrate when sending notifications</string> <string name="rmd_EPr_vibrate_desc_false">通知を送るときに震えません</string>
<!-- Reminder Preference: Nagging Title --> <!-- Reminder Preference: Nagging Title -->
<string name="rmd_EPr_nagging_title">Astrid Reminders</string> <string name="rmd_EPr_nagging_title">Astrid Reminders</string>
@ -801,9 +827,9 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<item>1時間毎</item> <item>1時間毎</item>
<item>毎日</item> <item>毎日</item>
<item>毎週</item> <item>毎週</item>
<item>bi-weekly</item> <item>一週間おき</item>
<item>毎月</item> <item>毎月</item>
<item>bi-monthly</item> <item>一ヶ月おき</item>
</string-array> </string-array>
<string-array name="EPr_quiet_hours_start"> <string-array name="EPr_quiet_hours_start">
@ -962,7 +988,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="repeat_every">Every %d</string> <string name="repeat_every">Every %d</string>
<!-- hint when opening repeat interval --> <!-- hint when opening repeat interval -->
<string name="repeat_interval_prompt">Repeat Interval</string> <string name="repeat_interval_prompt">繰り返し間隔</string>
<string-array name="repeat_interval"> <string-array name="repeat_interval">
<!-- repeat interval (days,weeks,months,hours) --> <!-- repeat interval (days,weeks,months,hours) -->
@ -974,18 +1000,18 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="repeat_type"> <string-array name="repeat_type">
<!-- repeat type (date to repeat from) --> <!-- repeat type (date to repeat from) -->
<item>from due date</item> <item>期限から</item>
<item>from completion date</item> <item>完了日から</item>
</string-array> </string-array>
<!-- task detail weekly by day ($I -> interval, i.e. 1 week, $D -> days, i.e. Monday, Tuesday) --> <!-- task detail weekly by day ($I -> interval, i.e. 1 week, $D -> days, i.e. Monday, Tuesday) -->
<string name="repeat_detail_byday">$I on $D</string> <string name="repeat_detail_byday">$I ($D 曜日)</string>
<!-- task detail for repeat from due date (%s -> interval) --> <!-- task detail for repeat from due date (%s -> interval) -->
<string name="repeat_detail_duedate">Repeats every %s</string> <string name="repeat_detail_duedate">%s 毎に繰り返し</string>
<!-- task detail for repeat from completion date (%s -> interval) --> <!-- task detail for repeat from completion date (%s -> interval) -->
<string name="repeat_detail_completion">Repeats %s after completion</string> <string name="repeat_detail_completion">完了後 %s 毎に繰り返し</string>
@ -995,7 +1021,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- ====================== Plugin Boilerplate ========================= --> <!-- ====================== Plugin Boilerplate ========================= -->
<!-- label for RMilk button in Task Edit Activity --> <!-- label for RMilk button in Task Edit Activity -->
<string name="rmilk_EOE_button">Remember the Milk Settings</string> <string name="rmilk_EOE_button">Remember the Milk の設定</string>
<!-- task detail showing RTM list information --> <!-- task detail showing RTM list information -->
<string name="rmilk_TLA_list">RTM List: %s</string> <string name="rmilk_TLA_list">RTM List: %s</string>
@ -1041,11 +1067,11 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MPr_group_status">状況</string> <string name="rmilk_MPr_group_status">状況</string>
<!-- Sync Status: log in --> <!-- Sync Status: log in -->
<string name="rmilk_status_loggedout">Please Log In To RTM!</string> <string name="rmilk_status_loggedout">Remenber The Milkにログインしてください!</string>
<!-- Status: ongoing --> <!-- Status: ongoing -->
<string name="rmilk_status_ongoing">Sync Ongoing...</string> <string name="rmilk_status_ongoing">Sync Ongoing...</string>
<!-- Sync Status: success status (%s -> last sync date). Keep it short!--> <!-- Sync Status: success status (%s -> last sync date). Keep it short!-->
<string name="rmilk_status_success">Last Sync: %s</string> <string name="rmilk_status_success">前回の同期: %s</string>
<!-- Sync Status: error status (%s -> last attempted sync date) --> <!-- Sync Status: error status (%s -> last attempted sync date) -->
<string name="rmilk_status_failed">Failed On: %s</string> <string name="rmilk_status_failed">Failed On: %s</string>
<!-- Sync Status: error subtitle (%s -> last successful sync date) --> <!-- Sync Status: error subtitle (%s -> last successful sync date) -->
@ -1057,11 +1083,11 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MPr_group_options">オプション</string> <string name="rmilk_MPr_group_options">オプション</string>
<!-- Preference: Synchronization Interval Title --> <!-- Preference: Synchronization Interval Title -->
<string name="rmilk_MPr_interval_title">Background Sync</string> <string name="rmilk_MPr_interval_title">バックグラウンド同期</string>
<!-- Preference: Synchronization Interval Description (when disabled) --> <!-- Preference: Synchronization Interval Description (when disabled) -->
<string name="rmilk_MPr_interval_desc_disabled">Background synchronization is disabled</string> <string name="rmilk_MPr_interval_desc_disabled">バックグラウンド同期は無効になっています</string>
<!-- Preference: Synchronization Interval Description (%s => setting) --> <!-- Preference: Synchronization Interval Description (%s => setting) -->
<string name="rmilk_MPr_interval_desc">Currently set to: %s</string> <string name="rmilk_MPr_interval_desc">現在の設定: %s</string>
<!-- Preference: Background Wifi Title --> <!-- Preference: Background Wifi Title -->
<string name="rmilk_MPr_bgwifi_title">Wifi Only Setting</string> <string name="rmilk_MPr_bgwifi_title">Wifi Only Setting</string>
@ -1074,19 +1100,19 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MPr_group_actions">アクション</string> <string name="rmilk_MPr_group_actions">アクション</string>
<!-- Synchronize Now Button --> <!-- Synchronize Now Button -->
<string name="rmilk_MPr_sync">同期!</string> <string name="rmilk_MPr_sync">すぐに同期!</string>
<!-- Synchronize Now Button if not logged in--> <!-- Synchronize Now Button if not logged in-->
<string name="rmilk_MPr_sync_log_in">ログインと同期</string> <string name="rmilk_MPr_sync_log_in">ログインと同期</string>
<!-- Sync: Clear Data Title --> <!-- Sync: Clear Data Title -->
<string name="rmilk_MPr_forget">ログアウト</string> <string name="rmilk_MPr_forget">ログアウト</string>
<!-- Sync: Clear Data Description --> <!-- Sync: Clear Data Description -->
<string name="rmilk_MPr_forget_description">Clears all RTM synchronization data</string> <string name="rmilk_MPr_forget_description">Remember The Milkとの同期データをすべて削除します</string>
<!-- ======================= MilkLoginActivity ========================= --> <!-- ======================= MilkLoginActivity ========================= -->
<!-- RTM Login Instructions --> <!-- RTM Login Instructions -->
<string name="rmilk_MLA_label">Please Log In and Authorize Astrid:</string> <string name="rmilk_MLA_label">ログインしてAstridに権限を与えてください</string>
<!-- Login Error Dialog (%s => message) --> <!-- Login Error Dialog (%s => message) -->
<string name="rmilk_MLA_error"> <string name="rmilk_MLA_error">
@ -1149,10 +1175,13 @@ Error Message: %s
<string name="tag_FEx_header">タグ</string> <string name="tag_FEx_header">タグ</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">タグの件数順</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">タグ名順</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">タグなし</string> <string name="tag_FEx_untagged">タグなし</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Could not find this item: </string> <string name="DLG_error_opening">Could not find this item: </string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Cannot access folder: %s</string> <string name="DLG_error_sdcard">Cannot access folder: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">시간(시:분)</string> <string name="DLG_hour_minutes">시간(시:분)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Task List Size</string> <string name="EPr_fontSize_title">Task List Size</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Font size on the main listing page</string> <string name="EPr_fontSize_desc">Font size on the main listing page</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -576,10 +606,7 @@ Astrid might not let you know when your tasks are due.\n
<string name="marketplace_title">Astrid Task/Todo List</string> <string name="marketplace_title">Astrid Task/Todo List</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid는 당신을 방해하지 않을정도로 간단하고 당신의 할일을 달성시켜줄정도로 강력한 오픈-소스 일정관리 플렛폼입니다. 태그, 알림, RememberTheMilk sync, Locale plug-in &amp; 그 이상!</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -700,7 +727,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1181,13 @@ Error Message: %s
<string name="tag_FEx_header">태그</string> <string name="tag_FEx_header">태그</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

File diff suppressed because it is too large Load Diff

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Could not find this item: </string> <string name="DLG_error_opening">Could not find this item: </string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Cannot access folder: %s</string> <string name="DLG_error_sdcard">Cannot access folder: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Tijd (uren : minuten)</string> <string name="DLG_hour_minutes">Tijd (uren : minuten)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Task List Size</string> <string name="EPr_fontSize_title">Task List Size</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Font size on the main listing page</string> <string name="EPr_fontSize_desc">Font size on the main listing page</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -700,7 +730,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Tags</string> <string name="tag_FEx_header">Tags</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Nie zdołano znaleźć tego elementu:</string> <string name="DLG_error_opening">Nie zdołano znaleźć tego elementu:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Nie można otworzyć folderu: %s</string> <string name="DLG_error_sdcard">Nie można otworzyć folderu: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Czas (godziny : minuty)</string> <string name="DLG_hour_minutes">Czas (godziny : minuty)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Rozmiar listy zadań</string> <string name="EPr_fontSize_title">Rozmiar listy zadań</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Rozmiar czcionki głównej listy zadań</string> <string name="EPr_fontSize_desc">Rozmiar czcionki głównej listy zadań</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -576,10 +606,7 @@ Astrid might not let you know when your tasks are due.\n
<string name="marketplace_title">Lista zadań/rzeczy do zrobienia Astrid</string> <string name="marketplace_title">Lista zadań/rzeczy do zrobienia Astrid</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid jest wysoce-uznaną otwarto-źródłową listą zadań która jest na tyle prosta, aby nie wchodzić Ci w drogę i na tyle potężna aby pomóc Ci wykonać Twoje zadania! Etykiety, przypomnienia, synchronizacja z RememberTheMilk, wtyczka Locale &amp; i więcej!</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -700,7 +727,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1181,13 @@ Error Message: %s
<string name="tag_FEx_header">Etykiety</string> <string name="tag_FEx_header">Etykiety</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,24 +2,45 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
<!-- Backup Preferences Title --> <!-- Backup Preferences Title -->
<string name="backup_BPr_header">Backups</string> <string name="backup_BPr_header">Cópias de segurança</string>
<!-- Backup: Status Header --> <!-- Backup: Status Header -->
<string name="backup_BPr_group_status">Status</string> <string name="backup_BPr_group_status">Estado</string>
<!-- Backup Status: last backup was a success (%s -> last date). Keep it short! --> <!-- Backup Status: last backup was a success (%s -> last date). Keep it short! -->
<string name="backup_status_success">Latest: %s</string> <string name="backup_status_success">Ultimo: %s</string>
<!-- Backup Status: last error failed. Keep it short! --> <!-- Backup Status: last error failed. Keep it short! -->
<string name="backup_status_failed">Last Backup Failed</string> <string name="backup_status_failed">Ultima cópia de segurança falhou.</string>
<!-- Backup Status: error subtitle --> <!-- Backup Status: error subtitle -->
<string name="backup_status_failed_subtitle">(tap to show error)</string> <string name="backup_status_failed_subtitle">(pressione para mostrar o erro)</string>
<!-- Backup Status: never backed up --> <!-- Backup Status: never backed up -->
<string name="backup_status_never">Never Backed Up!</string> <string name="backup_status_never">Nunca fez uma cópia de segurança!</string>
<!-- Backup Options Group Label --> <!-- Backup Options Group Label -->
<string name="backup_BPr_group_options">Opções</string> <string name="backup_BPr_group_options">Opções</string>
@ -27,9 +48,9 @@
<!-- Preference: Automatic Backup Title --> <!-- Preference: Automatic Backup Title -->
<string name="backup_BPr_auto_title">Cópia de Segurança Automática</string> <string name="backup_BPr_auto_title">Cópia de Segurança Automática</string>
<!-- Preference: Automatic Backup Description (when disabled) --> <!-- Preference: Automatic Backup Description (when disabled) -->
<string name="backup_BPr_auto_disabled">Automatic Backups Disabled</string> <string name="backup_BPr_auto_disabled">Cópias de Segurança automáticas desligadas</string>
<!-- Preference: Automatic Backup Description (when enabled) --> <!-- Preference: Automatic Backup Description (when enabled) -->
<string name="backup_BPr_auto_enabled">Backup will occur daily</string> <string name="backup_BPr_auto_enabled">A cópia de segurança irá ocorrer diáriamente</string>
<!-- Preference screen restoring Tasks Help --> <!-- Preference screen restoring Tasks Help -->
<string name="backup_BPr_how_to_restore">How do I restore backups?</string> <string name="backup_BPr_how_to_restore">How do I restore backups?</string>
@ -39,40 +60,35 @@
<!-- ================================================= BackupActivity == --> <!-- ================================================= BackupActivity == -->
<!-- backup activity label --> <!-- backup activity label -->
<string name="backup_BAc_label">Backups</string> <string name="backup_BAc_label">Cópias de segurança</string>
<!-- backup activity title --> <!-- backup activity title -->
<string name="backup_BAc_title">Manage Your Backups</string> <string name="backup_BAc_title">Gerir Cópias de Segurança</string>
<!-- backup activity import button --> <!-- backup activity import button -->
<string name="backup_BAc_import">Import Tasks</string> <string name="backup_BAc_import">Importar Tarefas</string>
<!-- backup activity export button --> <!-- backup activity export button -->
<string name="backup_BAc_export">Export Tasks</string> <string name="backup_BAc_export">Exportar Tarefas</string>
<!-- ============================================== Importer / Exporter == --> <!-- ============================================== Importer / Exporter == -->
<!-- Message displayed when error occurs --> <!-- Message displayed when error occurs -->
<string name="backup_TXI_error">Import Error</string> <string name="backup_TXI_error">Erro de Importação</string>
<string name="export_toast">Cópia de Segurança de %s para %s</string> <string name="export_toast">Cópia de Segurança de %s para %s</string>
<!-- Progress Dialog Title for exporting --> <!-- Progress Dialog Title for exporting -->
<string name="export_progress_title">Exporting...</string> <string name="export_progress_title">A exportar...</string>
<!-- Backup: Title of Import Summary Dialog --> <!-- Backup: Title of Import Summary Dialog -->
<string name="import_summary_title">Sumário de Restauro</string> <string name="import_summary_title">Sumário de Restauro</string>
<!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) --> <!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) -->
<string name="import_summary_message"> <string name="import_summary_message">O ficheiro %s continha %s.\n\n %s importadas,\n %s já existiam\n %s tinham erros\n</string>
File %s contained %s.\n\n
%s imported,\n
%s already exist\n
%s had errors\n
</string>
<!-- Progress Dialog Title for importing --> <!-- Progress Dialog Title for importing -->
<string name="import_progress_title">Importing...</string> <string name="import_progress_title">A importar...</string>
<!-- Progress Dialog text for import reading task (%d -> task number)--> <!-- Progress Dialog text for import reading task (%d -> task number)-->
<string name="import_progress_read">A ler tarefa %d...</string> <string name="import_progress_read">A ler tarefa %d...</string>
@ -80,7 +96,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Não foi possível encontrar este item:</string> <string name="DLG_error_opening">Não foi possível encontrar este item:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Não é possível aceder à pasta: %s</string> <string name="DLG_error_sdcard">Não é possível aceder à pasta: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -97,39 +113,39 @@ File %s contained %s.\n\n
<!-- ================================================== AndroidManifest == --> <!-- ================================================== AndroidManifest == -->
<!-- Application Name (shown on home screen & in launcher) --> <!-- Application Name (shown on home screen & in launcher) -->
<string name="app_name">Astrid Tasks</string> <string name="app_name">Tarefas Astrid</string>
<!-- permission title for READ_TASKS --> <!-- permission title for READ_TASKS -->
<string name="read_permission_label">Astrid Permission</string> <string name="read_permission_label">Permissões do Astrid</string>
<!-- permission description for READ_TASKS --> <!-- permission description for READ_TASKS -->
<string name="read_permission_desc">read tasks, display task filters</string> <string name="read_permission_desc">ler tarefas, mostrar filtros de tarefas</string>
<!-- permission title for READ_TASKS --> <!-- permission title for READ_TASKS -->
<string name="write_permission_label">Astrid Permission</string> <string name="write_permission_label">Permissões do Astrid</string>
<!-- permission description for READ_TASKS --> <!-- permission description for READ_TASKS -->
<string name="write_permission_desc">create new tasks, edit existing tasks</string> <string name="write_permission_desc">criar novas tarefas, editar tarefas existentes</string>
<!-- ==================================================== Generic Units == --> <!-- ==================================================== Generic Units == -->
<plurals name="DUt_years"> <plurals name="DUt_years">
<!-- plurals: years --> <!-- plurals: years -->
<item quantity="one">1 Year</item> <item quantity="one">1 Ano</item>
<!-- plurals: years --> <!-- plurals: years -->
<item quantity="other">%d Years</item> <item quantity="other">%d Anos</item>
</plurals> </plurals>
<plurals name="DUt_months"> <plurals name="DUt_months">
<!-- plurals: months --> <!-- plurals: months -->
<item quantity="one">1 Month</item> <item quantity="one">1 Mês</item>
<!-- plurals: months --> <!-- plurals: months -->
<item quantity="other">%d Months</item> <item quantity="other">%d Meses</item>
</plurals> </plurals>
<plurals name="DUt_weeks"> <plurals name="DUt_weeks">
<!-- plurals: days --> <!-- plurals: days -->
<item quantity="one">1 Week</item> <item quantity="one">1 Semana</item>
<!-- plurals: days --> <!-- plurals: days -->
<item quantity="other">%d Weeks</item> <item quantity="other">%d Semanas</item>
</plurals> </plurals>
<plurals name="DUt_days"> <plurals name="DUt_days">
<!-- plurals: days --> <!-- plurals: days -->
@ -157,51 +173,51 @@ File %s contained %s.\n\n
</plurals> </plurals>
<plurals name="DUt_hoursShort"> <plurals name="DUt_hoursShort">
<!-- plurals: hours (abbreviated) --> <!-- plurals: hours (abbreviated) -->
<item quantity="one">1 Hr</item> <item quantity="one">1 h</item>
<!-- plurals: hours (abbreviated) --> <!-- plurals: hours (abbreviated) -->
<item quantity="other">%d Hrs</item> <item quantity="other">%d h</item>
</plurals> </plurals>
<plurals name="DUt_minutesShort"> <plurals name="DUt_minutesShort">
<!-- plurals: minutes (abbreviated) --> <!-- plurals: minutes (abbreviated) -->
<item quantity="one">1 Min</item> <item quantity="one">1 min</item>
<!-- plurals: minutes (abbreviated) --> <!-- plurals: minutes (abbreviated) -->
<item quantity="other">%d Min</item> <item quantity="other">%d min</item>
</plurals> </plurals>
<plurals name="DUt_secondsShort"> <plurals name="DUt_secondsShort">
<!-- plurals: seconds (abbreviated) --> <!-- plurals: seconds (abbreviated) -->
<item quantity="one">1 Seg</item> <item quantity="one">1 s</item>
<!-- plurals: seconds (abbreviated) --> <!-- plurals: seconds (abbreviated) -->
<item quantity="other">%d Seg</item> <item quantity="other">%d s</item>
</plurals> </plurals>
<plurals name="Ntasks"> <plurals name="Ntasks">
<!-- plurals: tasks --> <!-- plurals: tasks -->
<item quantity="one">1 task</item> <item quantity="one">1 tarefa</item>
<!-- plurals: tasks --> <!-- plurals: tasks -->
<item quantity="other">%d tasks</item> <item quantity="other">%d tarefas</item>
</plurals> </plurals>
<!-- ================================================== Generic Dialogs == --> <!-- ================================================== Generic Dialogs == -->
<!-- confirmation dialog title --> <!-- confirmation dialog title -->
<string name="DLG_confirm_title">Confirm?</string> <string name="DLG_confirm_title">Confirma?</string>
<!-- question dialog title --> <!-- question dialog title -->
<string name="DLG_question_title">Question:</string> <string name="DLG_question_title">Pergunta:</string>
<!-- information dialog title --> <!-- information dialog title -->
<string name="DLG_information_title">Informação</string> <string name="DLG_information_title">Informação</string>
<!-- general dialog yes--> <!-- general dialog yes-->
<string name="DLG_yes">Yes</string> <string name="DLG_yes">Sim</string>
<!-- general dialog no--> <!-- general dialog no-->
<string name="DLG_no">No</string> <string name="DLG_no">Não</string>
<!-- general dialog close--> <!-- general dialog close-->
<string name="DLG_close">Close</string> <string name="DLG_close">Fechar</string>
<!-- error dialog (%s => error message)--> <!-- error dialog (%s => error message)-->
<string name="DLG_error">Oops, looks like some trouble occurred! Here\'s what happened:\n\n%s</string> <string name="DLG_error">Oops, algo correu mal! Aqui está o que aconteceu:\n\n%s</string>
<!-- question for deleting tasks --> <!-- question for deleting tasks -->
<string name="DLG_delete_this_task_question">Remover esta tarefa?</string> <string name="DLG_delete_this_task_question">Remover esta tarefa?</string>
@ -210,37 +226,38 @@ File %s contained %s.\n\n
<string name="DLG_done">Concluído</string> <string name="DLG_done">Concluído</string>
<!-- Button for canceling out of this page --> <!-- Button for canceling out of this page -->
<string name="DLG_cancel">Cancel</string> <string name="DLG_cancel">Cancelar</string>
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Por favor aguarde...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Tempo (horas : minutos)</string> <string name="DLG_hour_minutes">Tempo (horas : minutos)</string>
<!-- Dialog for Astrid having a critical update --> <!-- Dialog for Astrid having a critical update -->
<string name="DLG_please_update">Astrid should to be updated to the latest <string name="DLG_please_update">O Astrid deverá ser actualizado com a ultima versão disponível no Android market! Por favor faça-o antes de continuar, ou espere alguns segundos.</string>
version in the Android market! Please do that before continuing, or wait a
few seconds.</string>
<!-- Button for going to Market --> <!-- Button for going to Market -->
<string name="DLG_to_market">Go To Market</string> <string name="DLG_to_market">Ir para o Market</string>
<!-- =============================================================== UI == --> <!-- =============================================================== UI == -->
<!-- Label for DateButtons with no value --> <!-- Label for DateButtons with no value -->
<string name="WID_dateButtonUnset">Click To Set</string> <string name="WID_dateButtonUnset">Pressione para confirmar</string>
<!-- String formatter for DateButtons ($D => date, $T => time) --> <!-- String formatter for DateButtons ($D => date, $T => time) -->
<string name="WID_dateButtonLabel">$D $T</string> <string name="WID_dateButtonLabel">$D $T</string>
<!-- String formatter for Disable button --> <!-- String formatter for Disable button -->
<string name="WID_disableButton">Disable</string> <string name="WID_disableButton">Desactivar</string>
<!-- ================================================= TaskListActivity == --> <!-- ================================================= TaskListActivity == -->
<!-- Task List: Displayed instead of list when no items present --> <!-- Task List: Displayed instead of list when no items present -->
<string name="TLA_no_items">No Tasks!</string> <string name="TLA_no_items">Sem Tarefas!</string>
<!-- Menu: Add-ons --> <!-- Menu: Add-ons -->
<string name="TLA_menu_addons">Add-ons</string> <string name="TLA_menu_addons">Add-ons</string>
@ -249,16 +266,16 @@ File %s contained %s.\n\n
<string name="TLA_menu_settings">Definições</string> <string name="TLA_menu_settings">Definições</string>
<!-- Menu: Help --> <!-- Menu: Help -->
<string name="TLA_menu_help">Help</string> <string name="TLA_menu_help">Ajuda</string>
<!-- Search Label--> <!-- Search Label-->
<string name="TLA_search_label">Search This List</string> <string name="TLA_search_label">Procurar Nesta Lista</string>
<!-- Window title for displaying Custom Filter --> <!-- Window title for displaying Custom Filter -->
<string name="TLA_custom">Custom</string> <string name="TLA_custom">Personalizado</string>
<!-- Quick Add Edit Box Hint--> <!-- Quick Add Edit Box Hint-->
<string name="TLA_quick_add_hint">Add to this list...</string> <string name="TLA_quick_add_hint">Adicionar a esta lista...</string>
<!-- Help (HTML)--> <!-- Help (HTML)-->
<string name="TLA_help"><![CDATA[ <string name="TLA_help"><![CDATA[
@ -275,10 +292,10 @@ button: add task & go to the edit page.
<!-- ====================================================== TaskAdapter == --> <!-- ====================================================== TaskAdapter == -->
<!-- Format string to indicate task is hidden (%s => task name) --> <!-- Format string to indicate task is hidden (%s => task name) -->
<string name="TAd_hiddenFormat">%s [hidden]</string> <string name="TAd_hiddenFormat">%s [oculto]</string>
<!-- Format string to indicate task is deleted (%s => task name) --> <!-- Format string to indicate task is deleted (%s => task name) -->
<string name="TAd_deletedFormat">%s [deleted]</string> <string name="TAd_deletedFormat">%s [apagado]</string>
<!-- Displayed when adapter is flung (scrolled quickly) --> <!-- Displayed when adapter is flung (scrolled quickly) -->
<string name="TAd_flingText"/> <string name="TAd_flingText"/>
@ -296,36 +313,36 @@ button: add task & go to the edit page.
<string name="TAd_contextDeleteTask">Remover Tarefa</string> <string name="TAd_contextDeleteTask">Remover Tarefa</string>
<!-- Context Item: undelete task --> <!-- Context Item: undelete task -->
<string name="TAd_contextUndeleteTask">Undelete Task</string> <string name="TAd_contextUndeleteTask">Recuperar Tarefa</string>
<!-- =============================================== FilterListActivity == --> <!-- =============================================== FilterListActivity == -->
<!-- Filter List Activity Title --> <!-- Filter List Activity Title -->
<string name="FLA_title">Astrid: Filters</string> <string name="FLA_title">Astrid: Filtros</string>
<!-- Displayed when loading filters --> <!-- Displayed when loading filters -->
<string name="FLA_loading">Loading Filters...</string> <string name="FLA_loading">A Carregar Filtros...</string>
<!-- Context Menu: Create Shortcut --> <!-- Context Menu: Create Shortcut -->
<string name="FLA_context_shortcut">Create Shortcut On Desktop</string> <string name="FLA_context_shortcut">Criar atalho no Ambiente de Trabalho</string>
<!-- Menu: Search --> <!-- Menu: Search -->
<string name="FLA_menu_search">Search Tasks...</string> <string name="FLA_menu_search">Procurar Tarefas...</string>
<!-- Menu: Help --> <!-- Menu: Help -->
<string name="FLA_menu_help">Help</string> <string name="FLA_menu_help">Ajuda</string>
<!-- Create Shortcut Dialog Title --> <!-- Create Shortcut Dialog Title -->
<string name="FLA_shortcut_dialog_title">Criar Atalho</string> <string name="FLA_shortcut_dialog_title">Criar Atalho</string>
<!-- Create Shortcut Dialog (asks to name shortcut) --> <!-- Create Shortcut Dialog (asks to name shortcut) -->
<string name="FLA_shortcut_dialog">Name of shortcut:</string> <string name="FLA_shortcut_dialog">Nome do atalho:</string>
<!-- Search Hint--> <!-- Search Hint-->
<string name="FLA_search_hint">Search For Tasks</string> <string name="FLA_search_hint">Procurar Tarefas</string>
<!-- Search Filter name (%s => query) --> <!-- Search Filter name (%s => query) -->
<string name="FLA_search_filter">Matching \'%s\'</string> <string name="FLA_search_filter">Coincidentes \'%s\'</string>
<!-- Help (HTML)--> <!-- Help (HTML)-->
<string name="FLA_help"><![CDATA[ <string name="FLA_help"><![CDATA[
@ -345,12 +362,12 @@ to the plugin creator for fastest service.
]]></string> ]]></string>
<!-- Toast: created shortcut (%s => label) --> <!-- Toast: created shortcut (%s => label) -->
<string name="FLA_toast_onCreateShortcut">Created Shortcut: %s</string> <string name="FLA_toast_onCreateShortcut">Atalho Criado: %s</string>
<!-- ================================================= TaskEditActivity == --> <!-- ================================================= TaskEditActivity == -->
<!-- Title when editing a task (%s => task title) --> <!-- Title when editing a task (%s => task title) -->
<string name="TEA_view_title">Astrid: Editing \'%s\'</string> <string name="TEA_view_title">Astrid: A editar \'%s\'</string>
<!-- Title when creating a new task --> <!-- Title when creating a new task -->
<string name="TEA_view_titleNew">Astrid: Nova Tarefa</string> <string name="TEA_view_titleNew">Astrid: Nova Tarefa</string>
@ -359,37 +376,37 @@ to the plugin creator for fastest service.
<string name="TEA_tab_basic">Principal</string> <string name="TEA_tab_basic">Principal</string>
<!-- Second Tab - extra details --> <!-- Second Tab - extra details -->
<string name="TEA_tab_extra">Advanced</string> <string name="TEA_tab_extra">Avançadas</string>
<!-- Third Tab - add-ons --> <!-- Third Tab - add-ons -->
<string name="TEA_tab_addons">Add-ons</string> <string name="TEA_tab_addons">Add-ons</string>
<!-- Task title label --> <!-- Task title label -->
<string name="TEA_title_label">Title</string> <string name="TEA_title_label">Título</string>
<!-- Task title hint (displayed when edit box is empty) --> <!-- Task title hint (displayed when edit box is empty) -->
<string name="TEA_title_hint">Task Summary</string> <string name="TEA_title_hint">Resumo da Tarefa</string>
<!-- Task importance label --> <!-- Task importance label -->
<string name="TEA_importance_label">Importância</string> <string name="TEA_importance_label">Importância</string>
<!-- Task urgency label --> <!-- Task urgency label -->
<string name="TEA_urgency_label">Deadline</string> <string name="TEA_urgency_label">Prazo limite</string>
<!-- Task urgency specific time checkbox --> <!-- Task urgency specific time checkbox -->
<string name="TEA_urgency_specific_time">Due at specific time?</string> <string name="TEA_urgency_specific_time">Expira numa hora especifica?</string>
<!-- Task urgency specific time title when specific time false --> <!-- Task urgency specific time title when specific time false -->
<string name="TEA_urgency_time_none">No Due Time</string> <string name="TEA_urgency_time_none">Não tem hora para expirar</string>
<!-- Task hide until label --> <!-- Task hide until label -->
<string name="TEA_hideUntil_label">Hide Until</string> <string name="TEA_hideUntil_label">Esconder Até</string>
<!-- Task note label --> <!-- Task note label -->
<string name="TEA_note_label">Notas</string> <string name="TEA_note_label">Notas</string>
<!-- Task note hint --> <!-- Task note hint -->
<string name="TEA_notes_hint">Enter Task Notes...</string> <string name="TEA_notes_hint">Introduzir notas na tarefa...</string>
<!-- Estimated time label --> <!-- Estimated time label -->
<string name="TEA_estimatedDuration_label">Quanto tempo irá durar?</string> <string name="TEA_estimatedDuration_label">Quanto tempo irá durar?</string>
@ -398,10 +415,10 @@ to the plugin creator for fastest service.
<string name="TEA_elapsedDuration_label">Tempo já gasto na tarefa</string> <string name="TEA_elapsedDuration_label">Tempo já gasto na tarefa</string>
<!-- Menu: Save --> <!-- Menu: Save -->
<string name="TEA_menu_save">Save Changes</string> <string name="TEA_menu_save">Guardar Alterações</string>
<!-- Menu: Don't Save --> <!-- Menu: Don't Save -->
<string name="TEA_menu_discard">Don\'t Save</string> <string name="TEA_menu_discard">Não Gravar</string>
<!-- Menu: Delete Task --> <!-- Menu: Delete Task -->
<string name="TEA_menu_delete">Remover Tarefa</string> <string name="TEA_menu_delete">Remover Tarefa</string>
@ -410,34 +427,34 @@ to the plugin creator for fastest service.
<string name="TEA_onTaskSave_due">Tarefa Guardada: vence em %s</string> <string name="TEA_onTaskSave_due">Tarefa Guardada: vence em %s</string>
<!-- Toast: task saved with deadline in past (%s => time units) --> <!-- Toast: task saved with deadline in past (%s => time units) -->
<string name="TEA_onTaskSave_overdue">Tarefa Guardada: venceu %s atrás</string> <string name="TEA_onTaskSave_overdue">Tarefa Guardada: expirou %s atrás</string>
<!-- Toast: task saved without deadlines --> <!-- Toast: task saved without deadlines -->
<string name="TEA_onTaskSave_notDue">Tarefa Guardada</string> <string name="TEA_onTaskSave_notDue">Tarefa Guardada</string>
<!-- Toast: task was not saved --> <!-- Toast: task was not saved -->
<string name="TEA_onTaskCancel">Task Editing Was Canceled</string> <string name="TEA_onTaskCancel">A edição da tarefa foi cancelada</string>
<!-- Toast: task was deleted --> <!-- Toast: task was deleted -->
<string name="TEA_onTaskDelete">Task Deleted!</string> <string name="TEA_onTaskDelete">Tarefa apagada!</string>
<string-array name="TEA_urgency"> <string-array name="TEA_urgency">
<!-- urgency: labels for edit page. item #4 -> auto filled --> <!-- urgency: labels for edit page. item #4 -> auto filled -->
<item>Specific Day/Time</item> <item>Dia/Hora Específico</item>
<item>Today</item> <item>Hoje</item>
<item>Tomorrow</item> <item>Amanhã</item>
<item>(day after)</item> <item>(dia depois)</item>
<item>Next Week</item> <item>Próxima Semana</item>
<item>No Deadline</item> <item>Sem Prazo</item>
</string-array> </string-array>
<string-array name="TEA_hideUntil"> <string-array name="TEA_hideUntil">
<!-- hideUntil: labels for edit page. --> <!-- hideUntil: labels for edit page. -->
<item>Don\'t hide</item> <item>Não Esconder</item>
<item>Task is due</item> <item>Tarefa já passou o prazo</item>
<item>Day before due</item> <item>Dias antes de expirar</item>
<item>Week before due</item> <item>Semanas antes de expirar</item>
<item>Specific Day</item> <item>Dia Específico</item>
</string-array> </string-array>
<!-- Add Ons tab when no add-ons found --> <!-- Add Ons tab when no add-ons found -->
@ -449,43 +466,49 @@ to the plugin creator for fastest service.
<!-- ============================================= IntroductionActivity == --> <!-- ============================================= IntroductionActivity == -->
<!-- Introduction Window title --> <!-- Introduction Window title -->
<string name="InA_title">Welcome to Astrid!</string> <string name="InA_title">Bem-vindo ao Astrid!</string>
<!-- Button to agree to EULA --> <!-- Button to agree to EULA -->
<string name="InA_agree">I Agree!!</string> <string name="InA_agree">Eu aceito!!</string>
<!-- Button to disagree with EULA --> <!-- Button to disagree with EULA -->
<string name="InA_disagree">I Disagree</string> <string name="InA_disagree">Eu não aceito</string>
<!-- ===================================================== HelpActivity == --> <!-- ===================================================== HelpActivity == -->
<!-- Help: Button to get support from our website --> <!-- Help: Button to get support from our website -->
<string name="HlA_get_support">Get Support</string> <string name="HlA_get_support">Procurar Ajuda</string>
<!-- ==================================================== UpdateService == --> <!-- ==================================================== UpdateService == -->
<!-- Changelog Window Title --> <!-- Changelog Window Title -->
<string name="UpS_changelog_title">What\'s New In Astrid?</string> <string name="UpS_changelog_title">O que existe de novo no Astrid?</string>
<!-- ================================================== EditPreferences == --> <!-- ================================================== EditPreferences == -->
<!-- Preference Window Title --> <!-- Preference Window Title -->
<string name="EPr_title">Astrid: Preferences</string> <string name="EPr_title">Astrid: Preferências</string>
<!-- Preference Category: Appearance Title --> <!-- Preference Category: Appearance Title -->
<string name="EPr_appearance_header">Aparência</string> <string name="EPr_appearance_header">Aparência</string>
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Tamanho da Lista de Tarefas</string> <string name="EPr_fontSize_title">Tamanho da Lista de Tarefas</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Tamanho de Letra na página principal de listagem</string> <string name="EPr_fontSize_desc">Tamanho de Letra na página principal de listagem</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">Valores por Defeito</string>
<!-- Preference: Default Urgency Title --> <!-- Preference: Default Urgency Title -->
<string name="EPr_default_urgency_title">Default Urgency</string> <string name="EPr_default_urgency_title">Defeito da Urgência</string>
<!-- Preference: Default Urgency Description (%s => setting) --> <!-- Preference: Default Urgency Description (%s => setting) -->
<string name="EPr_default_urgency_desc">Currently Set To: %s</string> <string name="EPr_default_urgency_desc">Currently Set To: %s</string>
@ -509,19 +532,19 @@ to the plugin creator for fastest service.
<string-array name="EPr_default_urgency"> <string-array name="EPr_default_urgency">
<!-- urgency: labels for "Task Defaults" preference item. --> <!-- urgency: labels for "Task Defaults" preference item. -->
<item>No Deadline</item> <item>Sem Prazo</item>
<item>Today</item> <item>Hoje</item>
<item>Tomorrow</item> <item>Amanhã</item>
<item>Day After Tomorrow</item> <item>Day After Tomorrow</item>
<item>Next Week</item> <item>Próxima Semana</item>
</string-array> </string-array>
<string-array name="EPr_default_hideUntil"> <string-array name="EPr_default_hideUntil">
<!-- hideUntil: labels for "Task Defaults" preference item. --> <!-- hideUntil: labels for "Task Defaults" preference item. -->
<item>Don\'t hide</item> <item>Não Esconder</item>
<item>Task is due</item> <item>Tarefa já passou o prazo</item>
<item>Day before due</item> <item>Dias antes de expirar</item>
<item>Week before due</item> <item>Semanas antes de expirar</item>
</string-array> </string-array>
<!-- ==================================================== AddOnActivity == --> <!-- ==================================================== AddOnActivity == -->
@ -553,7 +576,7 @@ to the plugin creator for fastest service.
<string name="SyP_progress">Synchronizing your tasks...</string> <string name="SyP_progress">Synchronizing your tasks...</string>
<!-- Sync Notification: toast when sync activated from activity --> <!-- Sync Notification: toast when sync activated from activity -->
<string name="SyP_progress_toast">Synchronizing...</string> <string name="SyP_progress_toast">A Sincronizar...</string>
<!-- ====================================================== TasksWidget == --> <!-- ====================================================== TasksWidget == -->
@ -576,10 +599,7 @@ Astrid might not let you know when your tasks are due.\n
<string name="marketplace_title">Astrid Lista de Tarefas/Afazeres</string> <string name="marketplace_title">Astrid Lista de Tarefas/Afazeres</string>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. --> <!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description"> <string name="marketplace_description">Astrid é a lista de tarefas de código fonte aberta altamente aclamada que é simples o suficiente para não lhe atrapalhar, poderosa o suficiente para ajudar Você a fazer as coisas! Etiquetas, Avisos, sincronização com o RememberTheMilk (RTM), plugin de regionalização e mais!</string>
Astrid is the much loved open-source todo list / task manager designed to help
you get stuff done. It features reminders, tags, sync, a widget and more.
</string>
@ -589,16 +609,16 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Resources for built-in filter plug-in --> <!-- Resources for built-in filter plug-in -->
<!-- Active Tasks Filter --> <!-- Active Tasks Filter -->
<string name="BFE_Active">Active Tasks</string> <string name="BFE_Active">Tarefas Activas</string>
<!-- Title for Active Tasks Filter (what user sees when first opening the app) --> <!-- Title for Active Tasks Filter (what user sees when first opening the app) -->
<string name="BFE_Active_title">Active Tasks</string> <string name="BFE_Active_title">Tarefas Activas</string>
<!-- Search Filter --> <!-- Search Filter -->
<string name="BFE_Search">Search</string> <string name="BFE_Search">Procurar</string>
<!-- Extended Filters Category --> <!-- Extended Filters Category -->
<string name="BFE_Extended">More...</string> <string name="BFE_Extended">Mais...</string>
<!-- sort recent modification filter --> <!-- sort recent modification filter -->
<string name="BFE_Recent">Recently Modified</string> <string name="BFE_Recent">Recently Modified</string>
@ -610,7 +630,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="BFE_Hidden">Hidden Tasks</string> <string name="BFE_Hidden">Hidden Tasks</string>
<!-- sort Alphabetical filter --> <!-- sort Alphabetical filter -->
<string name="BFE_Alphabetical">By Title</string> <string name="BFE_Alphabetical">Por Título</string>
<!-- sort Due Date filter --> <!-- sort Due Date filter -->
<string name="BFE_DueDate">By Due Date</string> <string name="BFE_DueDate">By Due Date</string>
@ -648,7 +668,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="gcal_completed_title">%s (completed)</string> <string name="gcal_completed_title">%s (completed)</string>
<!-- System Default Calendar (displayed if we can't figure out calendars) --> <!-- System Default Calendar (displayed if we can't figure out calendars) -->
<string name="gcal_GCP_default">Default Calendar</string> <string name="gcal_GCP_default">Calendário Predefinido</string>
@ -666,7 +686,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
when you have any tasks in the following filter:</string> when you have any tasks in the following filter:</string>
<!-- Locale Window Filter Picker UI --> <!-- Locale Window Filter Picker UI -->
<string name="locale_pick_filter">Filter:</string> <string name="locale_pick_filter">Filtro:</string>
<!-- Locale Window Interval Label --> <!-- Locale Window Interval Label -->
<string name="locale_interval_label">Limit notifications to:</string> <string name="locale_interval_label">Limit notifications to:</string>
@ -700,7 +720,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -730,7 +750,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- ==================================================== notifications == --> <!-- ==================================================== notifications == -->
<!-- Name of filter when viewing a reminder --> <!-- Name of filter when viewing a reminder -->
<string name="rmd_NoA_filter">Reminder!</string> <string name="rmd_NoA_filter">Lembrete!</string>
<!-- Reminder: Snooze button (remind again later) --> <!-- Reminder: Snooze button (remind again later) -->
<string name="rmd_NoA_snooze">Parar...</string> <string name="rmd_NoA_snooze">Parar...</string>
@ -798,7 +818,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmd_EPr_defaultRemind_desc">New tasks will remind randomly: %s</string> <string name="rmd_EPr_defaultRemind_desc">New tasks will remind randomly: %s</string>
<!-- Defaults Title --> <!-- Defaults Title -->
<string name="rmd_EPr_defaults_header">New Task Defaults</string> <string name="rmd_EPr_defaults_header">Valores por Defeito</string>
<string-array name="EPr_reminder_random"> <string-array name="EPr_reminder_random">
<!-- Reminder Preference: random reminder choices for preference page. --> <!-- Reminder Preference: random reminder choices for preference page. -->
@ -807,65 +827,65 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<item>diariamente</item> <item>diariamente</item>
<item>semanalmente</item> <item>semanalmente</item>
<item>bi-weekly</item> <item>bi-weekly</item>
<item>monthly</item> <item>mensalmente</item>
<item>bi-monthly</item> <item>bi-monthly</item>
</string-array> </string-array>
<string-array name="EPr_quiet_hours_start"> <string-array name="EPr_quiet_hours_start">
<!-- Reminder Preference: quiet_hours_start: options for preference menu. Translate but don't change the times!. --> <!-- Reminder Preference: quiet_hours_start: options for preference menu. Translate but don't change the times!. -->
<item>desactivado</item> <item>desactivado</item>
<item>8 PM</item> <item>20:00</item>
<item>9 PM</item> <item>21:00</item>
<item>10 PM</item> <item>22:00</item>
<item>11 PM</item> <item>23:00</item>
<item>12 AM</item> <item>12:00</item>
<item>1 AM</item> <item>13:00</item>
<item>2 AM</item> <item>02:00</item>
<item>3 AM</item> <item>02:00</item>
<item>4 AM</item> <item>04:00</item>
<item>5 AM</item> <item>05:00</item>
<item>6 AM</item> <item>06:00</item>
<item>7 AM</item> <item>07:00</item>
<item>8 AM</item> <item>08:00</item>
<item>9 AM</item> <item>09:00</item>
<item>10 AM</item> <item>10:00</item>
<item>11 AM</item> <item>11:00</item>
<item>12 PM</item> <item>12:00</item>
<item>1 PM</item> <item>13:00</item>
<item>2 PM</item> <item>14:00</item>
<item>3 PM</item> <item>15:00</item>
<item>4 PM</item> <item>16:00</item>
<item>5 PM</item> <item>17:00</item>
<item>6 PM</item> <item>18.00</item>
<item>7 PM</item> <item>19:00</item>
</string-array> </string-array>
<string-array name="EPr_quiet_hours_end"> <string-array name="EPr_quiet_hours_end">
<!-- Reminder Preference: quiet_hours_end: options for preference menu. Translate but don't change the times! --> <!-- Reminder Preference: quiet_hours_end: options for preference menu. Translate but don't change the times! -->
<item>9 AM</item> <item>09:00</item>
<item>10 AM</item> <item>10:00</item>
<item>11 AM</item> <item>11:00</item>
<item>12 PM</item> <item>12:00</item>
<item>1 PM</item> <item>13:00</item>
<item>2 PM</item> <item>14:00</item>
<item>3 PM</item> <item>15:00</item>
<item>4 PM</item> <item>16:00</item>
<item>5 PM</item> <item>17:00</item>
<item>6 PM</item> <item>18.00</item>
<item>7 PM</item> <item>19:00</item>
<item>8 PM</item> <item>20:00</item>
<item>9 PM</item> <item>21:00</item>
<item>10 PM</item> <item>22:00</item>
<item>11 PM</item> <item>23:00</item>
<item>12 AM</item> <item>12:00</item>
<item>1 AM</item> <item>13:00</item>
<item>2 AM</item> <item>02:00</item>
<item>3 AM</item> <item>02:00</item>
<item>4 AM</item> <item>04:00</item>
<item>5 AM</item> <item>05:00</item>
<item>6 AM</item> <item>06:00</item>
<item>7 AM</item> <item>07:00</item>
<item>8 AM</item> <item>08:00</item>
</string-array> </string-array>
<!-- =============================================== random reminders == --> <!-- =============================================== random reminders == -->
@ -1015,7 +1035,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_FEx_header">Remember the Milk</string> <string name="rmilk_FEx_header">Remember the Milk</string>
<!-- filter category for RTM lists --> <!-- filter category for RTM lists -->
<string name="rmilk_FEx_list">Lists</string> <string name="rmilk_FEx_list">Listas</string>
<!-- RTM list filter name ($N => list, $C => count) --> <!-- RTM list filter name ($N => list, $C => count) -->
<string name="rmilk_FEx_list_item">$N ($C)</string> <string name="rmilk_FEx_list_item">$N ($C)</string>
@ -1043,7 +1063,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MPr_header">Remember the Milk</string> <string name="rmilk_MPr_header">Remember the Milk</string>
<!-- RTM Status Group Label --> <!-- RTM Status Group Label -->
<string name="rmilk_MPr_group_status">Status</string> <string name="rmilk_MPr_group_status">Estado</string>
<!-- Sync Status: log in --> <!-- Sync Status: log in -->
<string name="rmilk_status_loggedout">Please Log In To RTM!</string> <string name="rmilk_status_loggedout">Please Log In To RTM!</string>
@ -1084,7 +1104,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmilk_MPr_sync_log_in">Log In &amp; Synchronize!</string> <string name="rmilk_MPr_sync_log_in">Log In &amp; Synchronize!</string>
<!-- Sync: Clear Data Title --> <!-- Sync: Clear Data Title -->
<string name="rmilk_MPr_forget">Log Out</string> <string name="rmilk_MPr_forget">Terminar sessão</string>
<!-- Sync: Clear Data Description --> <!-- Sync: Clear Data Description -->
<string name="rmilk_MPr_forget_description">Clears all RTM synchronization data</string> <string name="rmilk_MPr_forget_description">Clears all RTM synchronization data</string>
@ -1154,10 +1174,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiquetas</string> <string name="tag_FEx_header">Etiquetas</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Не могу найти элемент:</string> <string name="DLG_error_opening">Не могу найти элемент:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Нет доступа к папке:%s</string> <string name="DLG_error_sdcard">Нет доступа к папке:%s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Пожалуйста, подождите...</string> <string name="DLG_wait">Пожалуйста, подождите...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Время (час : мин)</string> <string name="DLG_hour_minutes">Время (час : мин)</string>
@ -470,10 +494,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Размер списка задач</string> <string name="EPr_fontSize_title">Размер списка задач</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Размер шрифта основного экрана</string> <string name="EPr_fontSize_desc">Размер шрифта основного экрана</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">Параметры по умолчанию для новых задач</string> <string name="EPr_defaults_header">Параметры по умолчанию для новых задач</string>
@ -688,7 +718,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Напомнить мне...</string> <string name="TEA_reminder_label">Напомнить мне...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... при наступлении времени начала задачи</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... при завершении намеченного времени</string> <string name="TEA_reminder_overdue">... при завершении намеченного времени</string>
@ -1137,10 +1167,13 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="tag_FEx_header">Теги</string> <string name="tag_FEx_header">Теги</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">По размеру</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">По алфавиту</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Без тегов</string> <string name="tag_FEx_untagged">Без тегов</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -13,7 +34,7 @@
<string name="backup_BPr_group_status">Status</string> <string name="backup_BPr_group_status">Status</string>
<!-- Backup Status: last backup was a success (%s -> last date). Keep it short! --> <!-- Backup Status: last backup was a success (%s -> last date). Keep it short! -->
<string name="backup_status_success">Latest: %s</string> <string name="backup_status_success">Senaste %s</string>
<!-- Backup Status: last error failed. Keep it short! --> <!-- Backup Status: last error failed. Keep it short! -->
<string name="backup_status_failed">Senaste säkerhetskopian misslyckades</string> <string name="backup_status_failed">Senaste säkerhetskopian misslyckades</string>
<!-- Backup Status: error subtitle --> <!-- Backup Status: error subtitle -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Kunde inte hitta följande:</string> <string name="DLG_error_opening">Kunde inte hitta följande:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">Mappåtkomst nekad: %s</string> <string name="DLG_error_sdcard">Mappåtkomst nekad: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Tid (timmar : minuter)</string> <string name="DLG_hour_minutes">Tid (timmar : minuter)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Storlek för Uppgiftslista</string> <string name="EPr_fontSize_title">Storlek för Uppgiftslista</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Textstorlek för huvudlistan</string> <string name="EPr_fontSize_desc">Textstorlek för huvudlistan</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -700,7 +730,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiketter</string> <string name="tag_FEx_header">Etiketter</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">Bunu bulamadım:</string> <string name="DLG_error_opening">Bunu bulamadım:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">%s klasörüne erişilemedi.</string> <string name="DLG_error_sdcard">%s klasörüne erişilemedi.</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">Süre (dakika : saniye)</string> <string name="DLG_hour_minutes">Süre (dakika : saniye)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">İş listesi ebatı</string> <string name="EPr_fontSize_title">İş listesi ebatı</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">Ana sayfa listesindeki yazıların boyu</string> <string name="EPr_fontSize_desc">Ana sayfa listesindeki yazıların boyu</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -700,7 +730,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiketler</string> <string name="tag_FEx_header">Etiketler</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in --> <!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == --> <!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file --> <!-- Backup: Dialog when unable to open a file -->
<string name="DLG_error_opening">无法查找以下任务:</string> <string name="DLG_error_opening">无法查找以下任务:</string>
<!-- Backup: Dialog when unable to open SD card folder --> <!-- Backup: Dialog when unable to open SD card folder (%s => folder) -->
<string name="DLG_error_sdcard">无法访问文件夹: %s</string> <string name="DLG_error_sdcard">无法访问文件夹: %s</string>
<!-- Backup: Dialog when unable to open SD card in general --> <!-- Backup: Dialog when unable to open SD card in general -->
@ -215,6 +236,9 @@ File %s contained %s.\n\n
<!-- Progress dialog shown when doing something slow --> <!-- Progress dialog shown when doing something slow -->
<string name="DLG_wait">Please wait...</string> <string name="DLG_wait">Please wait...</string>
<!-- Progress dialog shown when upgrading -->
<string name="DLG_upgrading">Upgrading your tasks...</string>
<!-- Title for dialog selecting a time (hours and minutes) --> <!-- Title for dialog selecting a time (hours and minutes) -->
<string name="DLG_hour_minutes">时间(小时:分钟)</string> <string name="DLG_hour_minutes">时间(小时:分钟)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title --> <!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">任务列表字体大小</string> <string name="EPr_fontSize_title">任务列表字体大小</string>
<!-- Preference: Task List Font Size Description --> <!-- Preference: Task List Font Size Description -->
<string name="EPr_fontSize_desc">设置列表页面的字体大小</string> <string name="EPr_fontSize_desc">设置列表页面的字体大小</string>
<!-- Preference: Task List Show Notes -->
<string name="EPr_showNotes_title">Show Notes In Task</string>
<!-- Preference: Task List Show Notes Description (disabled) -->
<string name="EPr_showNotes_desc_disabled">Notes will be displayed when you tap a task</string>
<!-- Preference: Task List Show Notes Description (enabled) -->
<string name="EPr_showNotes_desc_enabled">Notes will always displayed</string>
<!-- Preference Category: Defaults Title --> <!-- Preference Category: Defaults Title -->
<string name="EPr_defaults_header">New Task Defaults</string> <string name="EPr_defaults_header">New Task Defaults</string>
@ -700,7 +730,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="TEA_reminder_label">Remind me...</string> <string name="TEA_reminder_label">Remind me...</string>
<!-- Task Edit: Reminder @ deadline --> <!-- Task Edit: Reminder @ deadline -->
<string name="TEA_reminder_due">... when it\'s time to start the task</string> <string name="TEA_reminder_due">... when task is due</string>
<!-- Task Edit: Reminder after deadline --> <!-- Task Edit: Reminder after deadline -->
<string name="TEA_reminder_overdue">... when task is overdue</string> <string name="TEA_reminder_overdue">... when task is overdue</string>
@ -802,10 +832,10 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="EPr_reminder_random"> <string-array name="EPr_reminder_random">
<!-- Reminder Preference: random reminder choices for preference page. --> <!-- Reminder Preference: random reminder choices for preference page. -->
<item>已禁用</item> <item>disabled</item>
<item>每小时</item> <item>hourly</item>
<item>每天</item> <item>daily</item>
<item>每周</item> <item>weekly</item>
<item>bi-weekly</item> <item>bi-weekly</item>
<item>monthly</item> <item>monthly</item>
<item>bi-monthly</item> <item>bi-monthly</item>
@ -813,7 +843,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="EPr_quiet_hours_start"> <string-array name="EPr_quiet_hours_start">
<!-- Reminder Preference: quiet_hours_start: options for preference menu. Translate but don't change the times!. --> <!-- Reminder Preference: quiet_hours_start: options for preference menu. Translate but don't change the times!. -->
<item>已禁用</item> <item>disabled</item>
<item>8 PM</item> <item>8 PM</item>
<item>9 PM</item> <item>9 PM</item>
<item>10 PM</item> <item>10 PM</item>
@ -1114,7 +1144,7 @@ Error Message: %s
<string-array name="rmilk_MPr_interval_entries"> <string-array name="rmilk_MPr_interval_entries">
<!-- rmilk_MPr_interval_entries: Synchronization Intervals --> <!-- rmilk_MPr_interval_entries: Synchronization Intervals -->
<item>禁用</item> <item>disable</item>
<item>every fifteen minutes</item> <item>every fifteen minutes</item>
<item>every thirty minutes</item> <item>every thirty minutes</item>
<item>every hour</item> <item>every hour</item>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">标签</string> <string name="tag_FEx_header">标签</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags of completed tasks -->
<string name="tag_FEx_completed">Completed</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

File diff suppressed because it is too large Load Diff

@ -211,6 +211,7 @@
<string name="producteev_PPr_interval_key">producteev_sync_freq</string> <string name="producteev_PPr_interval_key">producteev_sync_freq</string>
<string name="producteev_PPr_email">producteev_email</string> <string name="producteev_PPr_email">producteev_email</string>
<string name="producteev_PPr_password">producteev_password</string> <string name="producteev_PPr_password">producteev_password</string>
<string name="producteev_PPr_defaultdash_key">producteev_defaultdash</string>
<!-- ============================================================ OTHER == --> <!-- ============================================================ OTHER == -->

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Resources for built-in timers plug-in -->
<!-- Task Edit Activity: Container Label -->
<string name="alarm_ACS_label">Alarms</string>
<!-- Task Edit Activity: Add New Alarn -->
<string name="alarm_ACS_button">Add an Alarm</string>
<!-- Task Detail for Alarms (%s -> time)-->
<string name="alarm_ADE_detail">Alarm %s</string>
<string-array name="reminders_alarm">
<!-- reminders related to alarm -->
<item>Alarm!</item>
</string-array>
</resources>

@ -18,6 +18,9 @@
<!-- Label when calendar event already exists --> <!-- Label when calendar event already exists -->
<string name="gcal_TEA_showCalendar_label">Open Calendar Event</string> <string name="gcal_TEA_showCalendar_label">Open Calendar Event</string>
<!-- Toast when unable to open calendar event -->
<string name="gcal_TEA_calendar_error">Error opening event!</string>
<!-- ======================================================== Calendars == --> <!-- ======================================================== Calendars == -->
<!-- Calendar event name when task is completed (%s => task title) --> <!-- Calendar event name when task is completed (%s => task title) -->

@ -5,13 +5,67 @@
<!-- ====================== Plugin Boilerplate ========================= --> <!-- ====================== Plugin Boilerplate ========================= -->
<!-- task detail showing Producteev dashboard information --> <!-- task detail showing Producteev dashboard information -->
<string name="producteev_TLA_dashboard">Producteev dashboard: %s</string> <string name="producteev_TLA_dashboard">Workspace: %s</string>
<!-- ==================================================== Preferences == --> <!-- ==================================================== Preferences == -->
<!-- Preferences Title: Producteev --> <!-- Preferences Title: Producteev -->
<string name="producteev_PPr_header">Producteev</string> <string name="producteev_PPr_header">Producteev</string>
<!-- dashboard title for producteev default dashboard -->
<string name="producteev_default_dashboard">Default Workspace</string>
<!-- dashboard title for tasks that are not synchronized -->
<string name="producteev_no_dashboard">Do Not Synchronize</string>
<!-- preference title for default dashboard -->
<string name="producteev_PPr_defaultdash_title">Default Workspace</string>
<!-- preference description for default dashboard (%s -> setting) -->
<string name="producteev_PPr_defaultdash_summary">New tasks will be added to: %s</string>
<!-- preference description for default dashboard (when set to 'not synchronized') -->
<string name="producteev_PPr_defaultdash_summary_none">New tasks will not be synchronized by default</string>
<!-- ================================================= Login Activity == -->
<!-- Activity Title: Producteev Login -->
<string name="producteev_PLA_title">Log In to Producteev</string>
<!-- Instructions: Producteev login -->
<string name="producteev_PLA_body">Sign in with your existing
Producteev account, or create a new account!</string>
<!-- Producteev Terms Link -->
<string name="producteev_PLA_terms">Terms &amp; Conditions</string>
<!-- Sign In Button -->
<string name="producteev_PLA_signIn">Sign In</string>
<!-- Create New User Button -->
<string name="producteev_PLA_createNew">Create New User</string>
<!-- E-mail Address Label -->
<string name="producteev_PLA_email">E-mail</string>
<!-- Password Label -->
<string name="producteev_PLA_password">Password</string>
<!-- Confirm Password Label -->
<string name="producteev_PLA_confirmPassword">Confirm Password</string>
<!-- First Name Label -->
<string name="producteev_PLA_firstName">First Name</string>
<!-- Last Name Label -->
<string name="producteev_PLA_lastName">Last Name</string>
<!-- Error Message when fields aren't filled out -->
<string name="producteev_PLA_errorEmpty">Error: fill out all fields!</string>
<!-- Error Message when passwords don't match -->
<string name="producteev_PLA_errorMatch">Error: passwords don\'t match!</string>
<!-- ================================================ Synchronization == --> <!-- ================================================ Synchronization == -->
<!-- title for notification tray when synchronizing --> <!-- title for notification tray when synchronizing -->
@ -27,4 +81,3 @@
<string name="producteev_MLA_password_empty">Password was not specified!</string> <string name="producteev_MLA_password_empty">Password was not specified!</string>
</resources> </resources>

@ -23,10 +23,13 @@
<string name="tag_FEx_header">Tags</string> <string name="tag_FEx_header">Tags</string>
<!-- filter header for tags, sorted by size --> <!-- filter header for tags, sorted by size -->
<string name="tag_FEx_by_size">By Size</string> <string name="tag_FEx_by_size">Active</string>
<!-- filter header for tags, sorted by name --> <!-- filter header for tags of completed tasks -->
<string name="tag_FEx_alpha">Alphabetical</string> <string name="tag_FEx_completed">Completed</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks --> <!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string> <string name="tag_FEx_untagged">Untagged</string>

@ -22,11 +22,14 @@
android:entryValues="@array/rmilk_MPr_interval_values" android:entryValues="@array/rmilk_MPr_interval_values"
android:title="@string/rmilk_MPr_interval_title" /> android:title="@string/rmilk_MPr_interval_title" />
<ListPreference
android:key="@string/producteev_PPr_defaultdash_key"
android:title="@string/producteev_PPr_defaultdash_title" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory
android:title="@string/rmilk_MPr_group_actions"> android:title="@string/rmilk_MPr_group_actions">
<Preference <Preference
android:key="@string/rmilk_MPr_sync_key" android:key="@string/rmilk_MPr_sync_key"
android:title="@string/rmilk_MPr_sync" /> android:title="@string/rmilk_MPr_sync" />
@ -35,7 +38,6 @@
android:key="@string/rmilk_MPr_forget_key" android:key="@string/rmilk_MPr_forget_key"
android:title="@string/rmilk_MPr_forget" android:title="@string/rmilk_MPr_forget"
android:summary="@string/rmilk_MPr_forget_description" /> android:summary="@string/rmilk_MPr_forget_description" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

@ -12,22 +12,23 @@ import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ExpandableListView; import android.widget.ExpandableListView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.TextView.OnEditorActionListener;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
@ -137,9 +138,9 @@ public class FilterListActivity extends ExpandableListActivity {
R.string.FLA_menu_search); R.string.FLA_menu_search);
item.setIcon(android.R.drawable.ic_menu_search); item.setIcon(android.R.drawable.ic_menu_search);
/*item = menu.add(Menu.NONE, MENU_HELP_ID, Menu.NONE, item = menu.add(Menu.NONE, MENU_HELP_ID, Menu.NONE,
R.string.FLA_menu_help); R.string.FLA_menu_help);
item.setIcon(android.R.drawable.ic_menu_help);*/ item.setIcon(android.R.drawable.ic_menu_help);
return true; return true;
} }
@ -251,7 +252,6 @@ public class FilterListActivity extends ExpandableListActivity {
if(item instanceof Filter) { if(item instanceof Filter) {
Filter filter = (Filter) item; Filter filter = (Filter) item;
info.targetView.setTag(filter);
menuItem = menu.add(0, CONTEXT_MENU_SHORTCUT, 0, R.string.FLA_context_shortcut); menuItem = menu.add(0, CONTEXT_MENU_SHORTCUT, 0, R.string.FLA_context_shortcut);
menuItem.setIntent(ShortcutActivity.createIntent(filter)); menuItem.setIntent(ShortcutActivity.createIntent(filter));
} }
@ -295,13 +295,9 @@ public class FilterListActivity extends ExpandableListActivity {
bitmap.getWidth(), bitmap.getHeight()), null); bitmap.getWidth(), bitmap.getHeight()), null);
Intent createShortcutIntent = new Intent(); Intent createShortcutIntent = new Intent();
createShortcutIntent.putExtra( createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
Intent.EXTRA_SHORTCUT_INTENT, createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label);
shortcutIntent); createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_NAME, label);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_ICON, bitmap);
createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$ createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$
sendBroadcast(createShortcutIntent); sendBroadcast(createShortcutIntent);
@ -323,7 +319,9 @@ public class FilterListActivity extends ExpandableListActivity {
} }
case MENU_HELP_ID: { case MENU_HELP_ID: {
// TODO Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://weloveastrid.com/help-user-guide-astrid-v3/filters/")); //$NON-NLS-1$
startActivity(intent);
return true; return true;
} }
@ -331,8 +329,25 @@ public class FilterListActivity extends ExpandableListActivity {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo(); ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo();
final Intent shortcutIntent = item.getIntent(); final Intent shortcutIntent = item.getIntent();
final Filter filter = (Filter)info.targetView.getTag(); FilterListItem filter = ((FilterAdapter.ViewHolder)info.targetView.getTag()).item;
if(filter instanceof Filter)
showCreateShortcutDialog(shortcutIntent, (Filter)filter);
return true;
}
case CONTEXT_MENU_INTENT: {
Intent intent = item.getIntent();
startActivity(intent);
return true;
}
}
return false;
}
private void showCreateShortcutDialog(final Intent shortcutIntent,
final Filter filter) {
FrameLayout frameLayout = new FrameLayout(this); FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setPadding(10, 0, 10, 0); frameLayout.setPadding(10, 0, 10, 0);
final EditText editText = new EditText(this); final EditText editText = new EditText(this);
@ -374,18 +389,6 @@ public class FilterListActivity extends ExpandableListActivity {
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
return true;
}
case CONTEXT_MENU_INTENT: {
Intent intent = item.getIntent();
startActivity(intent);
return true;
}
}
return false;
} }
} }

@ -19,6 +19,8 @@
*/ */
package com.todoroo.astrid.activity; package com.todoroo.astrid.activity;
import java.util.Map.Entry;
import android.app.Activity; import android.app.Activity;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Intent; import android.content.Intent;
@ -46,14 +48,13 @@ public class ShortcutActivity extends Activity {
/** token for passing a {@link Filter}'s sql through extras */ /** token for passing a {@link Filter}'s sql through extras */
public static final String TOKEN_FILTER_SQL = "sql"; //$NON-NLS-1$ public static final String TOKEN_FILTER_SQL = "sql"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras */ /** token for passing a {@link Filter}'s values for new tasks through extras as string */
@Deprecated
public static final String TOKEN_FILTER_VALUES = "v4nt"; //$NON-NLS-1$ public static final String TOKEN_FILTER_VALUES = "v4nt"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras (keys) */ /** token for passing a {@link Filter}'s values for new tasks through extras as exploded ContentValues */
public static final String TOKEN_FILTER_VALUES_KEYS = "v4ntk"; //$NON-NLS-1$ public static final String TOKEN_FILTER_VALUES_ITEM = "v4ntp_"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras (values) */
public static final String TOKEN_FILTER_VALUES_VALUES = "v4ntv"; //$NON-NLS-1$
// --- implementation // --- implementation
@ -81,6 +82,28 @@ public class ShortcutActivity extends Activity {
ContentValues values = null; ContentValues values = null;
if(extras.containsKey(TOKEN_FILTER_VALUES)) if(extras.containsKey(TOKEN_FILTER_VALUES))
values = AndroidUtilities.contentValuesFromString(extras.getString(TOKEN_FILTER_VALUES)); values = AndroidUtilities.contentValuesFromString(extras.getString(TOKEN_FILTER_VALUES));
else {
values = new ContentValues();
for(String key : extras.keySet()) {
if(!key.startsWith(TOKEN_FILTER_VALUES_ITEM))
continue;
Object value = extras.get(key);
key = key.substring(TOKEN_FILTER_VALUES_ITEM.length());
// assume one of the big 4...
if(value instanceof String)
values.put(key, (String) value);
else if(value instanceof Integer)
values.put(key, (Integer) value);
else if(value instanceof Double)
values.put(key, (Double) value);
else if(value instanceof Long)
values.put(key, (Long) value);
else
throw new IllegalStateException("Unsupported bundle type " + value.getClass()); //$NON-NLS-1$
}
}
Filter filter = new Filter("", title, new QueryTemplate(), values); //$NON-NLS-1$ Filter filter = new Filter("", title, new QueryTemplate(), values); //$NON-NLS-1$
filter.sqlQuery = sql; filter.sqlQuery = sql;
@ -99,8 +122,22 @@ public class ShortcutActivity extends Activity {
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_TITLE, filter.title); shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_TITLE, filter.title);
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_SQL, filter.sqlQuery); shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_SQL, filter.sqlQuery);
if(filter.valuesForNewTasks != null) { if(filter.valuesForNewTasks != null) {
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_VALUES, for(Entry<String, Object> item : filter.valuesForNewTasks.valueSet()) {
filter.valuesForNewTasks.toString()); String key = TOKEN_FILTER_VALUES_ITEM + item.getKey();
Object value = item.getValue();
// assume one of the big 4...
if(value instanceof String)
shortcutIntent.putExtra(key, (String) value);
else if(value instanceof Integer)
shortcutIntent.putExtra(key, (Integer) value);
else if(value instanceof Double)
shortcutIntent.putExtra(key, (Double) value);
else if(value instanceof Long)
shortcutIntent.putExtra(key, (Long) value);
else
throw new IllegalStateException("Unsupported bundle type " + value.getClass()); //$NON-NLS-1$
}
} }
return shortcutIntent; return shortcutIntent;
} }

@ -41,7 +41,6 @@ import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener; import android.widget.AdapterView.OnItemSelectedListener;
@ -68,6 +67,7 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.gcal.GCalControlSet; import com.todoroo.astrid.gcal.GCalControlSet;
@ -218,8 +218,8 @@ public final class TaskEditActivity extends TabActivity {
LinearLayout addonsAddons = (LinearLayout) findViewById(R.id.tab_addons_addons); LinearLayout addonsAddons = (LinearLayout) findViewById(R.id.tab_addons_addons);
if(addOnService.hasPowerPack()) { if(addOnService.hasPowerPack()) {
controls.add(new GCalControlSet(this, addonsAddons)); controls.add(new GCalControlSet(this, addonsAddons));
separator(addonsAddons);
controls.add(new TimerControlSet(this, addonsAddons)); controls.add(new TimerControlSet(this, addonsAddons));
controls.add(new AlarmControlSet(this, addonsAddons));
} }
// show add-on help if necessary // show add-on help if necessary
@ -246,17 +246,6 @@ public final class TaskEditActivity extends TabActivity {
setUpListeners(); setUpListeners();
} }
/**
* Creates a separator in the view group specified
* @return
*/
private void separator(ViewGroup parent) {
View view = new View(this);
view.setBackgroundResource(R.drawable.black_white_gradient);
view.setPadding(2, 3, 2, 3);
parent.addView(view);
}
/** /**
* @return true if task is newly created * @return true if task is newly created
*/ */
@ -768,12 +757,10 @@ public final class TaskEditActivity extends TabActivity {
for(int i = 0; i < labels.length; i++) for(int i = 0; i < labels.length; i++)
updated[i+1] = urgencyValues[i]; updated[i+1] = urgencyValues[i];
if(Task.hasDueTime(dueDate)) { if(Task.hasDueTime(dueDate)) {
SimpleDateFormat format = DateUtilities.getDateWithTimeFormat(TaskEditActivity.this); updated[0] = new UrgencyValue(DateUtilities.getDateStringWithTime(TaskEditActivity.this, new Date(dueDate)),
updated[0] = new UrgencyValue(format.format(new Date(dueDate)),
Task.URGENCY_SPECIFIC_DAY_TIME, dueDate); Task.URGENCY_SPECIFIC_DAY_TIME, dueDate);
} else { } else {
SimpleDateFormat format = DateUtilities.getDateFormat(TaskEditActivity.this); updated[0] = new UrgencyValue(DateUtilities.getDateString(TaskEditActivity.this, new Date(dueDate)),
updated[0] = new UrgencyValue(format.format(new Date(dueDate)),
Task.URGENCY_SPECIFIC_DAY, dueDate); Task.URGENCY_SPECIFIC_DAY, dueDate);
} }
selection = 0; selection = 0;
@ -805,6 +792,7 @@ public final class TaskEditActivity extends TabActivity {
datePicker.show(); datePicker.show();
} else { } else {
previousSetting = position; previousSetting = position;
model.setValue(Task.DUE_DATE, item.dueDate);
} }
} }
@ -852,6 +840,7 @@ public final class TaskEditActivity extends TabActivity {
private void customDateFinished() { private void customDateFinished() {
long time = model.createDueDate(customSetting, customDate.getTime()); long time = model.createDueDate(customSetting, customDate.getTime());
model.setValue(Task.DUE_DATE, time);
createUrgencyList(time); createUrgencyList(time);
} }
@ -933,8 +922,7 @@ public final class TaskEditActivity extends TabActivity {
HideUntilValue[] updated = new HideUntilValue[values.length + 1]; HideUntilValue[] updated = new HideUntilValue[values.length + 1];
for(int i = 0; i < values.length; i++) for(int i = 0; i < values.length; i++)
updated[i+1] = values[i]; updated[i+1] = values[i];
SimpleDateFormat format = DateUtilities.getDateFormat(TaskEditActivity.this); updated[0] = new HideUntilValue(DateUtilities.getDateString(TaskEditActivity.this, new Date(specificDate)),
updated[0] = new HideUntilValue(format.format(new Date(specificDate)),
Task.HIDE_UNTIL_SPECIFIC_DAY, specificDate); Task.HIDE_UNTIL_SPECIFIC_DAY, specificDate);
values = updated; values = updated;
} }

@ -17,6 +17,7 @@ import android.content.ServiceConnection;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.text.Editable; import android.text.Editable;
@ -53,6 +54,8 @@ import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Pair; import com.todoroo.andlib.utility.Pair;
import com.todoroo.andlib.widget.GestureService;
import com.todoroo.andlib.widget.GestureService.GestureInterface;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder; import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
@ -85,7 +88,7 @@ import com.todoroo.astrid.utility.Flags;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
public class TaskListActivity extends ListActivity implements OnScrollListener { public class TaskListActivity extends ListActivity implements OnScrollListener, GestureInterface {
// --- activities // --- activities
@ -156,7 +159,10 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
new StartupService().onStartupApplication(this); new StartupService().onStartupApplication(this);
if(AndroidUtilities.getSdkVersion() > 3)
setContentView(R.layout.task_list_activity); setContentView(R.layout.task_list_activity);
else
setContentView(R.layout.task_list_activity_api3);
Bundle extras = getIntent().getExtras(); Bundle extras = getIntent().getExtras();
if(extras != null && extras.containsKey(TOKEN_FILTER)) { if(extras != null && extras.containsKey(TOKEN_FILTER)) {
@ -207,9 +213,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
R.string.TLA_menu_settings); R.string.TLA_menu_settings);
item.setIcon(android.R.drawable.ic_menu_preferences); item.setIcon(android.R.drawable.ic_menu_preferences);
/*item = menu.add(Menu.NONE, MENU_HELP_ID, Menu.NONE, item = menu.add(Menu.NONE, MENU_HELP_ID, Menu.NONE,
R.string.TLA_menu_help); R.string.TLA_menu_help);
item.setIcon(android.R.drawable.ic_menu_help);*/ item.setIcon(android.R.drawable.ic_menu_help);
// ask about plug-ins // ask about plug-ins
Intent queryIntent = new Intent(AstridApiConstants.ACTION_TASK_LIST_MENU); Intent queryIntent = new Intent(AstridApiConstants.ACTION_TASK_LIST_MENU);
@ -261,7 +267,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
View selected = getListView().getSelectedView(); View selected = getListView().getSelectedView();
// hot-key to set task priority - 1-4 or ALT + Q-R // hot-key to set task priority - 1-4 or ALT + Q-R
if(!filterOn && event.getNumber() >= '1' && event.getNumber() <= '4' && selected != null) { if(!filterOn && event.getUnicodeChar() >= '1' && event.getUnicodeChar() <= '4' && selected != null) {
int importance = event.getNumber() - '1'; int importance = event.getNumber() - '1';
Task task = ((ViewHolder)selected.getTag()).task; Task task = ((ViewHolder)selected.getTag()).task;
task.setValue(Task.IMPORTANCE, importance); task.setValue(Task.IMPORTANCE, importance);
@ -336,6 +342,12 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
} }
}); });
// gestures
try {
GestureService.registerGestureDetector(this, R.id.gestures, R.raw.gestures, this);
} catch (VerifyError e) {
// failed check, no gestures :P
}
} }
public void bindServices() { public void bindServices() {
@ -706,7 +718,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
startActivityForResult(intent, ACTIVITY_SETTINGS); startActivityForResult(intent, ACTIVITY_SETTINGS);
return true; return true;
case MENU_HELP_ID: case MENU_HELP_ID:
// TODO intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://weloveastrid.com/help-user-guide-astrid-v3/active-tasks/")); //$NON-NLS-1$
startActivity(intent);
return true; return true;
case MENU_ADDON_INTENT_ID: case MENU_ADDON_INTENT_ID:
intent = item.getIntent(); intent = item.getIntent();
@ -780,4 +794,15 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
return false; return false;
} }
@SuppressWarnings("nls")
@Override
public void gesturePerformed(String gesture) {
if("nav_filters".equals(gesture)) {
Intent intent = new Intent(TaskListActivity.this,
FilterListActivity.class);
startActivity(intent);
finish();
}
}
} }

@ -95,7 +95,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
return convertView; return convertView;
} }
private static class ViewHolder { public static class ViewHolder {
public FilterListItem item; public FilterListItem item;
public ImageView expander; public ImageView expander;
public ImageView icon; public ImageView icon;
@ -132,11 +132,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
convertView = newView(convertView, parent); convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag(); ViewHolder viewHolder = (ViewHolder) convertView.getTag();
Object item = getChild(groupPosition, childPosition); viewHolder.item = (FilterListItem) getChild(groupPosition, childPosition);
if(!(item instanceof FilterListItem))
return convertView;
viewHolder.item = (FilterListItem) item;
populateView(viewHolder, true, false); populateView(viewHolder, true, false);
return convertView; return convertView;
@ -162,11 +158,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
ViewGroup parent) { ViewGroup parent) {
convertView = newView(convertView, parent); convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag(); ViewHolder viewHolder = (ViewHolder) convertView.getTag();
Object groupItem = getGroup(groupPosition); viewHolder.item = (FilterListItem) getGroup(groupPosition);
if(!(groupItem instanceof FilterListItem))
return convertView;
viewHolder.item = (FilterListItem) groupItem;
populateView(viewHolder, false, isExpanded); populateView(viewHolder, false, isExpanded);
return convertView; return convertView;
} }

@ -15,12 +15,12 @@ import android.graphics.Paint;
import android.text.Html; import android.text.Html;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener; import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -39,6 +39,7 @@ import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.SoftHashMap; import com.todoroo.andlib.utility.SoftHashMap;
import com.todoroo.astrid.activity.TaskEditActivity; import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.alarms.AlarmDetailExposer;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.DetailExposer; import com.todoroo.astrid.api.DetailExposer;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
@ -87,6 +88,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
new NoteDetailExposer(), new NoteDetailExposer(),
new MilkDetailExposer(), new MilkDetailExposer(),
new ProducteevDetailExposer(), new ProducteevDetailExposer(),
new AlarmDetailExposer(),
}; };
private static int[] IMPORTANCE_COLORS = null; private static int[] IMPORTANCE_COLORS = null;
@ -265,6 +267,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
if(hiddenUntil > DateUtilities.now()) if(hiddenUntil > DateUtilities.now())
nameValue = r.getString(R.string.TAd_hiddenFormat, nameValue); nameValue = r.getString(R.string.TAd_hiddenFormat, nameValue);
nameView.setText(nameValue); nameView.setText(nameValue);
Linkify.addLinks(nameView, Linkify.ALL);
} }
// due date / completion date // due date / completion date
@ -281,14 +284,15 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
String dateValue; String dateValue;
Date dueDateAsDate = DateUtilities.unixtimeToDate(dueDate); Date dueDateAsDate = DateUtilities.unixtimeToDate(dueDate);
if (task.hasDueTime()) { if (task.hasDueTime()) {
dateValue = DateUtilities.getDateWithTimeAndWeekday(activity).format(dueDateAsDate); dateValue = DateUtilities.getDateStringWithTimeAndWeekday(activity, dueDateAsDate);
} else { } else {
dateValue = DateUtilities.getDateFormatWithWeekday(activity).format(dueDateAsDate); dateValue = DateUtilities.getDateStringWithWeekday(activity, dueDateAsDate);
} }
dueDateView.setText(dateValue); dueDateView.setText(dateValue);
setVisibility(dueDateView); setVisibility(dueDateView);
} else if(task.isCompleted()) { } else if(task.isCompleted()) {
String dateValue = DateUtilities.getDateFormatWithWeekday(activity).format(task.getValue(Task.COMPLETION_DATE)); String dateValue = DateUtilities.getDateStringWithWeekday(activity,
new Date(task.getValue(Task.COMPLETION_DATE)));
dueDateView.setText(r.getString(R.string.TAd_completed, dateValue)); dueDateView.setText(r.getString(R.string.TAd_completed, dateValue));
dueDateView.setTextAppearance(activity, R.style.TextAppearance_TAd_ItemDetails); dueDateView.setTextAppearance(activity, R.style.TextAppearance_TAd_ItemDetails);
setVisibility(dueDateView); setVisibility(dueDateView);
@ -310,7 +314,10 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
// importance bar // importance bar
final View importanceView = viewHolder.importance; { final View importanceView = viewHolder.importance; {
int value = task.getValue(Task.IMPORTANCE); int value = task.getValue(Task.IMPORTANCE);
if(value < IMPORTANCE_COLORS.length)
importanceView.setBackgroundColor(IMPORTANCE_COLORS[value]); importanceView.setBackgroundColor(IMPORTANCE_COLORS[value]);
else
importanceView.setBackgroundColor(0);
} }
// details and decorations, expanded // details and decorations, expanded
@ -483,10 +490,10 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
viewHolder.decorations[i] = view; viewHolder.decorations[i] = view;
switch(decoration.position) { switch(decoration.position) {
case TaskDecoration.POSITION_LEFT: case TaskDecoration.POSITION_LEFT:
viewHolder.taskRow.addView(view, 1); viewHolder.taskRow.addView(view, 2);
break; break;
case TaskDecoration.POSITION_RIGHT: case TaskDecoration.POSITION_RIGHT:
viewHolder.taskRow.addView(view, viewHolder.taskRow.getChildCount() - 2); viewHolder.taskRow.addView(view, viewHolder.taskRow.getChildCount() - 1);
} }
} }
i++; i++;

@ -63,6 +63,11 @@ public class TaskDao extends GenericDao<Task> {
return Task.DELETION_DATE.neq(0); return Task.DELETION_DATE.neq(0);
} }
/** @return tasks that were not deleted */
public static Criterion notDeleted() {
return Task.DELETION_DATE.eq(0);
}
/** @return tasks that have not yet been completed or deleted */ /** @return tasks that have not yet been completed or deleted */
public static Criterion isActive() { public static Criterion isActive() {
return Criterion.and(Task.COMPLETION_DATE.eq(0), return Criterion.and(Task.COMPLETION_DATE.eq(0),
@ -153,7 +158,7 @@ public class TaskDao extends GenericDao<Task> {
if(saveSuccessful) { if(saveSuccessful) {
task.markSaved(); task.markSaved();
afterSave(task, values, skipHooks); afterSave(task, values);
} }
return saveSuccessful; return saveSuccessful;
@ -208,19 +213,15 @@ public class TaskDao extends GenericDao<Task> {
* @param values values to be persisted to the database * @param values values to be persisted to the database
* @param skipHooks whether this save occurs as part of a sync * @param skipHooks whether this save occurs as part of a sync
*/ */
private void afterSave(Task task, ContentValues values, boolean skipHooks) { private void afterSave(Task task, ContentValues values) {
if(values.containsKey(Task.COMPLETION_DATE.name) && task.isCompleted()) if(values.containsKey(Task.COMPLETION_DATE.name) && task.isCompleted())
afterComplete(task, values, skipHooks); afterComplete(task, values);
else { else
ReminderService.getInstance().scheduleAlarm(task); ReminderService.getInstance().scheduleAlarm(task);
}
Astrid2TaskProvider.notifyDatabaseModification(); Astrid2TaskProvider.notifyDatabaseModification();
ContextManager.getContext().startService(new Intent(ContextManager.getContext(), ContextManager.getContext().startService(new Intent(ContextManager.getContext(),
TasksWidget.UpdateService.class)); TasksWidget.UpdateService.class));
if(skipHooks)
return;
} }
/** /**
@ -230,15 +231,13 @@ public class TaskDao extends GenericDao<Task> {
* @param values * @param values
* @param duringSync * @param duringSync
*/ */
private void afterComplete(Task task, ContentValues values, boolean duringSync) { private void afterComplete(Task task, ContentValues values) {
// send broadcast // send broadcast
if(!duringSync) {
Context context = ContextManager.getContext(); Context context = ContextManager.getContext();
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_COMPLETED); Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_COMPLETED);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId()); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId());
context.sendOrderedBroadcast(broadcastIntent, null); context.sendOrderedBroadcast(broadcastIntent, null);
} }
}
} }

@ -3,7 +3,7 @@
* All Rights Reserved * All Rights Reserved
* http://www.todoroo.com * http://www.todoroo.com
*/ */
package com.todoroo.astrid.alarms; package com.todoroo.astrid.legacy;
import com.todoroo.andlib.data.AbstractDatabase; import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.GenericDao; import com.todoroo.andlib.data.GenericDao;
@ -15,7 +15,7 @@ import com.todoroo.andlib.data.Table;
* @author Tim Su <tim@todoroo.com> * @author Tim Su <tim@todoroo.com>
* *
*/ */
@SuppressWarnings("nls") @SuppressWarnings({"nls","deprecation"})
public class AlarmDatabase extends AbstractDatabase { public class AlarmDatabase extends AbstractDatabase {
// --- constants // --- constants
@ -29,19 +29,19 @@ public class AlarmDatabase extends AbstractDatabase {
/** /**
* Database name (must be unique) * Database name (must be unique)
*/ */
private static final String NAME = "alarms"; public static final String NAME = "alarms";
/** /**
* List of table/ If you're adding a new table, add it to this list and * List of table/ If you're adding a new table, add it to this list and
* also make sure that our SQLite helper does the right thing. * also make sure that our SQLite helper does the right thing.
*/ */
public static final Table[] TABLES = new Table[] { public static final Table[] TABLES = new Table[] {
Alarm.TABLE TransitionalAlarm.TABLE
}; };
// --- implementation // --- implementation
private final GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, this); private final GenericDao<TransitionalAlarm> dao = new GenericDao<TransitionalAlarm>(TransitionalAlarm.class, this);
@Override @Override
protected String getName() { protected String getName() {
@ -58,7 +58,7 @@ public class AlarmDatabase extends AbstractDatabase {
return TABLES; return TABLES;
} }
public GenericDao<Alarm> getDao() { public GenericDao<TransitionalAlarm> getDao() {
return dao; return dao;
} }
@ -66,15 +66,8 @@ public class AlarmDatabase extends AbstractDatabase {
protected synchronized void onCreateTables() { protected synchronized void onCreateTables() {
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("CREATE INDEX IF NOT EXISTS a_task ON "). sql.append("CREATE INDEX IF NOT EXISTS a_task ON ").
append(Alarm.TABLE).append('('). append(TransitionalAlarm.TABLE).append('(').
append(Alarm.TASK.name). append(TransitionalAlarm.TASK.name).
append(')');
database.execSQL(sql.toString());
sql.setLength(0);
sql.append("CREATE INDEX IF NOT EXISTS a_type ON ").
append(Alarm.TABLE).append('(').
append(Alarm.TYPE.name).
append(')'); append(')');
database.execSQL(sql.toString()); database.execSQL(sql.toString());
} }

@ -0,0 +1,102 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.legacy;
import android.content.ContentValues;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.model.Task;
/**
* Data Model which represents an alarm. This is a transitional class -
* Alarms are moved over to metadata
*
* @author Tim Su <tim@todoroo.com>
*
*/
@SuppressWarnings("nls")
@Deprecated
public class TransitionalAlarm extends AbstractModel {
// --- table
public static final Table TABLE = new Table("alarm", TransitionalAlarm.class);
// --- properties
/** ID */
public static final LongProperty ID = new LongProperty(
TABLE, ID_PROPERTY_NAME);
/** Associated Task */
public static final LongProperty TASK = new LongProperty(
TABLE, "task");
/** Alarm Time */
public static final LongProperty TIME = new LongProperty(
TABLE, "time");
/** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(TransitionalAlarm.class);
// --- constants
/** this alarm was already triggered */
public static final int TYPE_TRIGGERED = 0;
/** this alarm is single-shot */
public static final int TYPE_SINGLE = 1;
/** this alarm repeats itself until turned off */
public static final int TYPE_REPEATING = 2;
// --- defaults
/** Default values container */
private static final ContentValues defaultValues = new ContentValues();
static {
//
}
@Override
public ContentValues getDefaultValues() {
return defaultValues;
}
// --- data access boilerplate
public TransitionalAlarm() {
super();
}
public TransitionalAlarm(TodorooCursor<TransitionalAlarm> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<TransitionalAlarm> cursor) {
super.readPropertiesFromCursor(cursor);
}
@Override
public long getId() {
return getIdHelper(ID);
};
// --- parcelable helpers
private static final Creator<Task> CREATOR = new ModelCreator<Task>(Task.class);
@Override
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
}

@ -128,7 +128,8 @@ public class Astrid2TaskProvider extends ContentProvider {
*/ */
public Cursor getTags() { public Cursor getTags() {
Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE); Tag[] tags = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE,
Criterion.all);
MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST); MatrixCursor ret = new MatrixCursor(TAGS_FIELD_LIST);

@ -2,18 +2,16 @@ package com.todoroo.astrid.service;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.StringTokenizer;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@ -24,28 +22,30 @@ import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.GenericDao; import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.alarms.Alarm; import com.todoroo.astrid.alarms.Alarm;
import com.todoroo.astrid.alarms.AlarmDatabase;
import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.legacy.AlarmDatabase;
import com.todoroo.astrid.legacy.LegacyAlertModel; import com.todoroo.astrid.legacy.LegacyAlertModel;
import com.todoroo.astrid.legacy.LegacyRepeatInfo; import com.todoroo.astrid.legacy.LegacyRepeatInfo;
import com.todoroo.astrid.legacy.LegacyTaskModel; import com.todoroo.astrid.legacy.LegacyTaskModel;
import com.todoroo.astrid.legacy.TransitionalAlarm;
import com.todoroo.astrid.model.Metadata; import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.rmilk.data.MilkTask; import com.todoroo.astrid.rmilk.data.MilkTask;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.Preferences; import com.todoroo.astrid.utility.Preferences;
@SuppressWarnings("deprecation")
public class Astrid2To3UpgradeHelper { public class Astrid2To3UpgradeHelper {
@Autowired @Autowired
@ -75,9 +75,6 @@ public class Astrid2To3UpgradeHelper {
@Autowired @Autowired
private String syncTable; private String syncTable;
@Autowired
private DialogUtilities dialogUtilities;
@Autowired @Autowired
private ExceptionService exceptionService; private ExceptionService exceptionService;
@ -110,11 +107,29 @@ public class Astrid2To3UpgradeHelper {
} }
// ---------------------------------------------------------------- 3 => 3.1
/**
* Perform the upgrade from Astrid 3 to 3.1
* @param context
* @param upgradeService
* @param from
*/
public void upgrade3To3_1(final Context context, final int from) {
if(!checkIfDatabaseExists(context, alertsTable))
return;
database.openForWriting();
migrateAlarmsToMetadata();
}
// ----------------------------------------------------------------- 2 => 3
/** /**
* Perform the upgrade from Astrid 2 to Astrid 3 * Perform the upgrade from Astrid 2 to Astrid 3
* @param context2 * @param context2
*/ */
public void upgrade2To3(final Context context, final UpgradeService upgradeService, final int from) { public void upgrade2To3(final Context context, final int from) {
// if from < 1 (we don't know what version, and database exists, leave it alone) // if from < 1 (we don't know what version, and database exists, leave it alone)
if(from < 1 && checkIfDatabaseExists(context, database.getName())) if(from < 1 && checkIfDatabaseExists(context, database.getName()))
@ -129,17 +144,6 @@ public class Astrid2To3UpgradeHelper {
context.deleteDatabase(database.getName()); context.deleteDatabase(database.getName());
database.openForWriting(); database.openForWriting();
// pop up a progress dialog
final ProgressDialog dialog;
if(context instanceof Activity)
dialog = dialogUtilities.progressDialog(context,
context.getString(R.string.DLG_upgrading));
else
dialog = null;
new Thread(new Runnable() {
@Override
public void run() {
// initiate a backup // initiate a backup
String backupFile = legacyBackup(); String backupFile = legacyBackup();
@ -177,10 +181,10 @@ public class Astrid2To3UpgradeHelper {
AlarmDatabase alarmsDatabase = new AlarmDatabase(); AlarmDatabase alarmsDatabase = new AlarmDatabase();
alarmsDatabase.openForWriting(); alarmsDatabase.openForWriting();
propertyMap.clear(); propertyMap.clear();
propertyMap.put("_id", Alarm.ID); //$NON-NLS-1$ propertyMap.put("_id", TransitionalAlarm.ID); //$NON-NLS-1$
propertyMap.put(LegacyAlertModel.TASK, Alarm.TASK); propertyMap.put(LegacyAlertModel.TASK, TransitionalAlarm.TASK);
propertyMap.put(LegacyAlertModel.DATE, Alarm.TIME); propertyMap.put(LegacyAlertModel.DATE, TransitionalAlarm.TIME);
upgradeTable(context, alertsTable, propertyMap, new Alarm(), upgradeTable(context, alertsTable, propertyMap, new TransitionalAlarm(),
alarmsDatabase.getDao()); alarmsDatabase.getDao());
alarmsDatabase.close(); alarmsDatabase.close();
@ -205,22 +209,7 @@ public class Astrid2To3UpgradeHelper {
// try to restore the latest XML // try to restore the latest XML
TasksXmlImporter.importTasks(context, backupFile, null); TasksXmlImporter.importTasks(context, backupFile, null);
} }
} finally {
if(context instanceof Activity) {
((Activity)context).runOnUiThread(new Runnable() {
public void run() {
if(dialog != null)
dialog.dismiss();
upgradeService.showChangeLog(context, from);
if(context instanceof TaskListActivity)
((TaskListActivity)context).loadTaskListContent(true);
}
});
}
}
} }
}).start();
} }
// --- database upgrade helpers // --- database upgrade helpers
@ -284,7 +273,7 @@ public class Astrid2To3UpgradeHelper {
if(data.upgradeNotes == null) if(data.upgradeNotes == null)
data.upgradeNotes = new StringBuilder(); data.upgradeNotes = new StringBuilder();
data.upgradeNotes.append("Goal Deadline: " + data.upgradeNotes.append("Goal Deadline: " +
DateUtilities.getFormattedDate(ContextManager.getContext(), DateUtilities.getDateString(ContextManager.getContext(),
new Date(preferredDueDate))); new Date(preferredDueDate)));
} }
} else if(property == Task.REMINDER_PERIOD) { } else if(property == Task.REMINDER_PERIOD) {
@ -484,4 +473,41 @@ public class Astrid2To3UpgradeHelper {
} }
} }
/**
* Move data from alert table into metadata table.
*/
private void migrateAlarmsToMetadata() {
Context context = ContextManager.getContext();
if(!checkIfDatabaseExists(context, AlarmDatabase.NAME))
return;
AlarmDatabase alarmsDatabase = new AlarmDatabase();
GenericDao<TransitionalAlarm> dao = new GenericDao<TransitionalAlarm>(
TransitionalAlarm.class, alarmsDatabase);
TodorooCursor<TransitionalAlarm> cursor = dao.query(Query.select(TransitionalAlarm.PROPERTIES));
try {
if(cursor.getCount() == 0)
return;
Metadata metadata = new Metadata();
metadata.setValue(Metadata.KEY, Alarm.METADATA_KEY);
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long task = cursor.get(TransitionalAlarm.TASK);
long time = cursor.get(TransitionalAlarm.TIME);
metadata.setValue(Metadata.TASK, task);
metadata.setValue(Alarm.TIME, time);
metadata.setValue(Alarm.TYPE, Alarm.TYPE_SINGLE);
metadataDao.createNew(metadata);
metadata.clearValue(Metadata.ID);
}
} finally {
cursor.close();
alarmsDatabase.close();
}
}
} }

@ -2,14 +2,26 @@ package com.todoroo.astrid.service;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.webkit.WebView; import android.webkit.WebView;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.activity.TaskListActivity;
public final class UpgradeService { public final class UpgradeService {
@Autowired
private DialogUtilities dialogUtilities;
public UpgradeService() {
DependencyInjectionService.getInstance().inject(this);
}
/** /**
* Perform upgrade from one version to the next. Needs to be called * Perform upgrade from one version to the next. Needs to be called
* on the UI thread so it can display a progress bar and then * on the UI thread so it can display a progress bar and then
@ -18,16 +30,45 @@ public final class UpgradeService {
* @param from * @param from
* @param to * @param to
*/ */
public void performUpgrade(Context context, int from) { public void performUpgrade(final Context context, final int from) {
if(from == 135) if(from == 135)
AddOnService.recordOem(); AddOnService.recordOem();
if(from < 136) { // pop up a progress dialog
new Astrid2To3UpgradeHelper().upgrade2To3(context, this, from); final ProgressDialog dialog;
} else { if(context instanceof Activity)
dialog = dialogUtilities.progressDialog(context,
context.getString(R.string.DLG_upgrading));
else
dialog = null;
new Thread(new Runnable() {
@Override
public void run() {
try {
if(from < 136)
new Astrid2To3UpgradeHelper().upgrade2To3(context, from);
if(from < 146)
new Astrid2To3UpgradeHelper().upgrade3To3_1(context, from);
} finally {
if(context instanceof Activity) {
((Activity)context).runOnUiThread(new Runnable() {
public void run() {
if(dialog != null)
dialog.dismiss();
// display changelog // display changelog
showChangeLog(context, from); showChangeLog(context, from);
if(context instanceof TaskListActivity)
((TaskListActivity)context).loadTaskListContent(true);
} }
});
}
}
}
}).start();
} }
/** /**
@ -46,16 +87,27 @@ public final class UpgradeService {
StringBuilder changeLog = new StringBuilder(); StringBuilder changeLog = new StringBuilder();
if(from <= 135) if(from <= 135)
newVersionString(changeLog, "3.0.6 (8/4/10)", new String[] { newVersionString(changeLog, "3.1.0 (8/9/10)", new String[] {
"Astrid is brand new inside and out! In addition to a new " + "Astrid is brand new inside and out! In addition to a new " +
"look and feel, a new add-on system allows Astrid to become " + "look and feel, a new add-on system allows Astrid to become " +
"more powerful, while other improvements have made it faster " + "more powerful, while other improvements have made it faster " +
"and easier to use. Hope you like it!", "and easier to use. Hope you like it!",
"This update contains for free all of the " + "This update contains for free all of Astrid " +
"powerpack's features for evaluation purposes", "Power Pack's features for evaluation purposes",
"If you liked the old version, you can also go back by " + "If you liked the old version, you can also go back by " +
"<a href='http://bit.ly/oldastrid'>clicking here</a>", "<a href='http://bit.ly/oldastrid'>clicking here</a>",
}); });
if(from > 135 && from <= 145)
newVersionString(changeLog, "3.1.0 (8/9/10)", new String[] {
"Linkify phone numbers, e-mails, and web pages",
"Swipe L => R to go from tasks to filters",
"Moved task priority bar to left side",
"Added ability to create fixed alerts for a task",
"Restored tag hiding when tag begins with underscore (_)",
"FROYO: disabled moving app to SD card, it would break alarms and widget",
"Also gone: a couple force closes, bugs with repeating tasks",
"... enjoy! - we ♥ astrid team",
});
if(from > 135 && from <= 144) if(from > 135 && from <= 144)
newVersionString(changeLog, "3.0.6 (8/4/10)", new String[] { newVersionString(changeLog, "3.0.6 (8/4/10)", new String[] {
"This update contains for free all of the " + "This update contains for free all of the " +
@ -63,11 +115,6 @@ public final class UpgradeService {
"Fixed widget not updating when tasks are edited", "Fixed widget not updating when tasks are edited",
"Added a setting for displaying task notes in the list", "Added a setting for displaying task notes in the list",
}); });
if(from > 135 && from <= 145)
newVersionString(changeLog, "3.0.7 (8/5/10)", new String[] {
"Linkify phone numbers, e-mails, and web pages",
"Made the 'Astrid Notifications' setting in the menu work",
});
if(changeLog.length() == 0) if(changeLog.length() == 0)
return; return;

@ -29,9 +29,9 @@ import android.content.DialogInterface.OnClickListener;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.FrameLayout.LayoutParams;
import com.timsu.astrid.R; import com.timsu.astrid.R;
@ -102,6 +102,10 @@ public class NNumberPickerDialog extends AlertDialog implements OnClickListener
} }
} }
public NumberPicker getPicker(int index) {
return pickers.get(index);
}
public void setInitialValues(int[] values) { public void setInitialValues(int[] values) {
for(int i = 0; i < pickers.size(); i++) for(int i = 0; i < pickers.size(); i++)
pickers.get(i).setCurrent(values[i]); pickers.get(i).setCurrent(values[i]);

@ -44,7 +44,8 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
OnFocusChangeListener, OnLongClickListener { OnFocusChangeListener, OnLongClickListener {
public interface OnChangedListener { public interface OnChangedListener {
void onChanged(NumberPicker picker, int oldVal, int newVal); /** return new value */
int onChanged(NumberPicker picker, int oldVal, int newVal);
} }
public interface Formatter { public interface Formatter {
@ -105,7 +106,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
private int mPrevious; private int mPrevious;
private OnChangedListener mListener; private OnChangedListener mListener;
private Formatter mFormatter; private Formatter mFormatter;
private long mSpeed = 500; private long mSpeed = 300;
private boolean mIncrement; private boolean mIncrement;
private boolean mDecrement; private boolean mDecrement;
@ -178,6 +179,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
public void setFormatter(Formatter formatter) { public void setFormatter(Formatter formatter) {
mFormatter = formatter; mFormatter = formatter;
updateView();
} }
/** /**
@ -253,6 +255,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
} }
private void changeCurrent(int current, Animation in, Animation out) { private void changeCurrent(int current, Animation in, Animation out) {
current = notifyChange(current);
// Wrap around the values if we go past the start or end // Wrap around the values if we go past the start or end
if (current > mEnd) { if (current > mEnd) {
@ -262,14 +265,15 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
} }
mPrevious = mCurrent; mPrevious = mCurrent;
mCurrent = current; mCurrent = current;
notifyChange();
updateView(); updateView();
} }
private void notifyChange() { private int notifyChange(int current) {
if (mListener != null) { if (mListener != null) {
mListener.onChanged(this, mPrevious, mCurrent); return mListener.onChanged(this, mCurrent, current);
} } else
return current;
} }
private void updateView() { private void updateView() {
@ -291,7 +295,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
if ((val >= mStart) && (val <= mEnd)) { if ((val >= mStart) && (val <= mEnd)) {
mPrevious = mCurrent; mPrevious = mCurrent;
mCurrent = val; mCurrent = val;
notifyChange(); notifyChange(mCurrent);
} }
updateView(); updateView();
} }

@ -37,47 +37,49 @@ public class TimeDurationControlSet implements OnNNumberPickedListener,
@Autowired @Autowired
DateUtilities dateUtilities; DateUtilities dateUtilities;
public enum TimeDurationType {
DAYS_HOURS,
HOURS_MINUTES;
}
private final Activity activity; private final Activity activity;
private final Button timeButton; private final Button timeButton;
private final NNumberPickerDialog dialog; private final NNumberPickerDialog dialog;
private final int prefixResource; private final int prefixResource;
private final TimeDurationType type;
private int timeDuration; private int timeDuration;
public TimeDurationControlSet(Activity activity, int timeButtonId, public TimeDurationControlSet(Activity activity, int timeButtonId,
int prefixResource, int titleResource, TimeDurationType type) { int prefixResource, int titleResource) {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
this.activity = activity; this.activity = activity;
this.prefixResource = prefixResource; this.prefixResource = prefixResource;
this.type = type;
timeButton = (Button)activity.findViewById(timeButtonId); timeButton = (Button)activity.findViewById(timeButtonId);
timeButton.setOnClickListener(this); timeButton.setOnClickListener(this);
switch(type) {
case DAYS_HOURS:
dialog = new NNumberPickerDialog(activity, this,
activity.getResources().getString(titleResource),
new int[] {0, 0}, new int[] {1, 1}, new int[] {0, 0},
new int[] {31, 23}, new String[] {
"d\na\ny\ns",
"h\nr\ns"
});
break;
case HOURS_MINUTES:
default:
dialog = new NNumberPickerDialog(activity, this, dialog = new NNumberPickerDialog(activity, this,
activity.getResources().getString(titleResource), activity.getResources().getString(titleResource),
new int[] {0, 0}, new int[] {1, 5}, new int[] {0, 0}, new int[] {0, 0}, new int[] {1, 5}, new int[] {0, 0},
new int[] {99, 59}, new String[] {":", null}); new int[] {99, 59}, new String[] {":", null});
break; final NumberPicker hourPicker = dialog.getPicker(0);
final NumberPicker minutePicker = dialog.getPicker(1);
minutePicker.setFormatter(new NumberPicker.Formatter() {
@Override
public String toString(int value) {
return String.format("%02d", value);
} }
});
minutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
@Override
public int onChanged(NumberPicker picker, int oldVal, int newVal) {
if(newVal < 0) {
if(hourPicker.getCurrent() == 0)
return 0;
hourPicker.setCurrent(hourPicker.getCurrent() - 1);
return 60 + newVal;
} else if(newVal > 59) {
hourPicker.setCurrent(hourPicker.getCurrent() + 1);
return newVal % 60;
}
return newVal;
}
});
} }
public int getTimeDurationInSeconds() { public int getTimeDurationInSeconds() {
@ -97,33 +99,20 @@ public class TimeDurationControlSet implements OnNNumberPickedListener,
} }
String prefix = ""; String prefix = "";
if(prefixResource != 0) if (prefixResource != 0)
prefix = r.getString(prefixResource); prefix = r.getString(prefixResource);
timeButton.setText(prefix + " " + dateUtilities.getDurationString( timeButton.setText(prefix
+ " "
+ dateUtilities.getDurationString(
timeDurationInSeconds * 1000L, 2)); timeDurationInSeconds * 1000L, 2));
switch(type) { int hours = timeDuration / 3600;
case DAYS_HOURS: int minutes = timeDuration / 60 - 60 * hours;
int days = timeDuration / 24 / 3600; dialog.setInitialValues(new int[] { hours, minutes });
int hours = timeDuration / 3600 - 24 * days;
dialog.setInitialValues(new int[] {days, hours});
break;
case HOURS_MINUTES:
hours = timeDuration / 3600;
int minutes = timeDuration/60 - 60 * hours;
dialog.setInitialValues(new int[] {hours, minutes});
}
} }
/** Called when NumberPicker activity is completed */ /** Called when NumberPicker activity is completed */
public void onNumbersPicked(int[] values) { public void onNumbersPicked(int[] values) {
switch(type) {
case DAYS_HOURS:
setTimeDuration(values[0] * 24 * 3600 + values[1] * 3600);
break;
case HOURS_MINUTES:
setTimeDuration(values[0] * 3600 + values[1] * 60); setTimeDuration(values[0] * 3600 + values[1] * 60);
break;
}
} }
/** Called when time button is clicked */ /** Called when time button is clicked */

@ -82,6 +82,7 @@ public class Preferences {
/** Get preferences object from the context */ /** Get preferences object from the context */
public static SharedPreferences getPrefs(Context context) { public static SharedPreferences getPrefs(Context context) {
context = context.getApplicationContext();
return PreferenceManager.getDefaultSharedPreferences(context); return PreferenceManager.getDefaultSharedPreferences(context);
} }

@ -103,7 +103,7 @@ public class TasksWidget extends AppWidgetProvider {
database.openForReading(); database.openForReading();
cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE); cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE);
Task task = new Task(); Task task = new Task();
for (int i = 0; i < cursor.getCount(); i++) { for (int i = 0; i < cursor.getCount() && i < numberOfTasks; i++) {
cursor.moveToPosition(i); cursor.moveToPosition(i);
task.readFromCursor(cursor); task.readFromCursor(cursor);
@ -123,6 +123,8 @@ public class TasksWidget extends AppWidgetProvider {
for(int i = cursor.getCount() - 1; i < separatorIDs.length; i++) { for(int i = cursor.getCount() - 1; i < separatorIDs.length; i++) {
if(i >= 0) if(i >= 0)
views.setViewVisibility(separatorIDs[i], View.INVISIBLE); views.setViewVisibility(separatorIDs[i], View.INVISIBLE);
if(i > cursor.getCount() - 1)
views.setViewVisibility(textIDs[i], View.INVISIBLE);
} }
} catch (Exception e) { } catch (Exception e) {
// can happen if database is not ready // can happen if database is not ready

@ -71,7 +71,7 @@ function export_xml2po
echo "Concatenating strings into single XML" echo "Concatenating strings into single XML"
${catxml} "${android_xml_files_res_dir}"/"${resource_file}"-*.xml > "${launchpad_pot_file_dir}/${resource_file}".xml ${catxml} "${android_xml_files_res_dir}"/"${resource_file}"-*.xml > "${launchpad_pot_file_dir}/${resource_file}".xml
echo "Exporting .xml to .pot: $resource_file" echo "Exporting .xml to .pot: $resource_file"
echo ${xml2po} -a -l en -o \ ${xml2po} -a -l en -o \
"${launchpad_pot_file_dir}/${resource_file}".pot \ "${launchpad_pot_file_dir}/${resource_file}".pot \
"${launchpad_pot_file_dir}/${resource_file}.xml" "${launchpad_pot_file_dir}/${resource_file}.xml"

@ -263,7 +263,7 @@ abstract public class TranslationTests extends TodorooTestCase {
/** /**
* @return an array of all string resource id's * @return an array of all string resource id's
*/ */
private int[] getResourceIds(Class<?> resources) throws Exception { public int[] getResourceIds(Class<?> resources) throws Exception {
Field[] fields = resources.getDeclaredFields(); Field[] fields = resources.getDeclaredFields();
int[] ids = new int[fields.length]; int[] ids = new int[fields.length];
for(int i = 0; i < fields.length; i++) { for(int i = 0; i < fields.length; i++) {
@ -276,7 +276,7 @@ abstract public class TranslationTests extends TodorooTestCase {
* Loop through each locale and call runnable * Loop through each locale and call runnable
* @param r * @param r
*/ */
private void forEachLocale(Runnable r) { public void forEachLocale(Runnable r) {
Locale[] locales = Locale.getAvailableLocales(); Locale[] locales = Locale.getAvailableLocales();
for(Locale locale : locales) { for(Locale locale : locales) {
setLocale(locale); setLocale(locale);

@ -11,6 +11,7 @@ import com.todoroo.astrid.utility.Preferences;
public class ReminderServiceTests extends DatabaseTestCase { public class ReminderServiceTests extends DatabaseTestCase {
ReminderService service; ReminderService service;
AlarmScheduler original;
@Autowired @Autowired
TaskDao taskDao; TaskDao taskDao;
@ -19,9 +20,16 @@ public class ReminderServiceTests extends DatabaseTestCase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
service = ReminderService.getInstance(); service = ReminderService.getInstance();
original = service.getScheduler();
Preferences.setPreferenceDefaults(); Preferences.setPreferenceDefaults();
} }
@Override
protected void tearDown() throws Exception {
super.tearDown();
service.setScheduler(original);
}
/** tests with no alarms */ /** tests with no alarms */
public void testNoReminders() { public void testNoReminders() {
service.setScheduler(new NoAlarmExpected()); service.setScheduler(new NoAlarmExpected());

@ -0,0 +1,134 @@
package com.todoroo.astrid.repeats;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import com.google.ical.values.Frequency;
import com.google.ical.values.RRule;
import com.google.ical.values.Weekday;
import com.google.ical.values.WeekdayNum;
import com.todoroo.andlib.test.TodorooTestCase;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.model.Task;
public class AdvancedRepeatTests extends TodorooTestCase {
public static void assertDatesEqual(long date, long other) {
assertEquals("Expected: " + new Date(date) + ", Actual: " + new Date(other),
date, other);
}
public void testDailyWithDaysOfWeek() throws ParseException {
RRule rrule = new RRule();
rrule.setInterval(1);
rrule.setFreq(Frequency.DAILY);
rrule.setByDay(Collections.singletonList(new WeekdayNum(0, Weekday.FR)));
Task task = new Task();
long thursday = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, new Date(113, 7, 1).getTime());
task.setValue(Task.DUE_DATE, thursday);
// repeat once => due date should become friday
long friday = thursday + DateUtilities.ONE_DAY;
long nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(friday, nextDueDate);
// repeat again => due date should be one week from friday
long nextFriday = friday + DateUtilities.ONE_WEEK;
task.setValue(Task.DUE_DATE, friday);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(nextFriday, nextDueDate);
// now try with thursday, and repeat every 2 days. expect next friday
rrule.setInterval(2);
task.setValue(Task.DUE_DATE, thursday);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(nextFriday, nextDueDate);
// again with friday, expect next friday
task.setValue(Task.DUE_DATE, friday);
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(nextFriday, nextDueDate);
}
public void testMonthlyWithDaysOfWeek() throws ParseException {
RRule rrule = new RRule();
rrule.setInterval(1);
rrule.setFreq(Frequency.MONTHLY);
rrule.setByDay(Arrays.asList(new WeekdayNum[] {
new WeekdayNum(0, Weekday.SU),
new WeekdayNum(0, Weekday.MO),
new WeekdayNum(0, Weekday.TU),
new WeekdayNum(0, Weekday.WE),
new WeekdayNum(0, Weekday.TH),
new WeekdayNum(0, Weekday.FR),
new WeekdayNum(0, Weekday.SA),
}));
Task task = new Task();
long thursday = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, new Date(113, 7, 1).getTime());
task.setValue(Task.DUE_DATE, thursday);
// repeat once => due date should become next month on the first
long nextMonth = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, new Date(113, 8, 1).getTime());
long nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(nextMonth, nextDueDate);
// only allow thursdays
rrule.setByDay(Arrays.asList(new WeekdayNum[] {
new WeekdayNum(0, Weekday.TH),
}));
long nextMonthOnThursday = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, new Date(113, 8, 5).getTime());
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(nextMonthOnThursday, nextDueDate);
}
public void testDueDateInPast() throws ParseException {
RRule rrule = new RRule();
rrule.setInterval(1);
rrule.setFreq(Frequency.DAILY);
Task task = new Task();
// repeat once => due date should become tomorrow
long past = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, new Date(110, 7, 1).getTime());
task.setValue(Task.DUE_DATE, past);
long today = task.createDueDate(Task.URGENCY_SPECIFIC_DAY, DateUtilities.now());
long nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(today, nextDueDate);
// test specific day & time
long pastWithTime = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, new Date(110, 7, 1, 10, 4).getTime());
task.setValue(Task.DUE_DATE, pastWithTime);
Date date = new Date(DateUtilities.now() / 1000L * 1000L);
date.setHours(10);
date.setMinutes(4);
date.setSeconds(0);
long todayWithTime = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, date.getTime()) / 1000L * 1000L;
if(todayWithTime < DateUtilities.now())
todayWithTime += DateUtilities.ONE_DAY;
nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertDatesEqual(todayWithTime, nextDueDate);
}
public void testDueDateInPastRepeatMultiple() throws ParseException {
RRule rrule = new RRule();
rrule.setInterval(1);
rrule.setFreq(Frequency.DAILY);
Task task = new Task();
// repeat once => due date should become tomorrow
long past = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, new Date(110, 7, 1, 0, 0, 0).getTime());
task.setValue(Task.DUE_DATE, past);
long nextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertTrue(nextDueDate > DateUtilities.now());
task.setValue(Task.DUE_DATE, nextDueDate);
long evenMoreNextDueDate = RepeatTaskCompleteListener.computeNextDueDate(task, rrule.toIcal());
assertNotSame(nextDueDate, evenMoreNextDueDate);
}
}

@ -176,6 +176,8 @@ public class RepeatTests extends DatabaseTestCase {
/** test after completion flag */ /** test after completion flag */
public void testRepeatAfterComplete() throws Exception { public void testRepeatAfterComplete() throws Exception {
// create a weekly task due a couple days in the past, but with the 'after completion'
// specified. should be due 7 days from now
Task task = new Task(); Task task = new Task();
task.setValue(Task.TITLE, "afterComplete"); task.setValue(Task.TITLE, "afterComplete");
RRule rrule = new RRule(); RRule rrule = new RRule();

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save