merged dummy-conflicts from git

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

Binary file not shown.

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

@ -52,6 +52,16 @@ public class AstridApiConstants {
*/
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
/**
@ -177,10 +187,12 @@ public class AstridApiConstants {
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_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

@ -61,6 +61,11 @@ public class Field extends DBObject<Field> {
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) {
final Field field = this;
return new Criterion(Operator.in) {
@ -87,4 +92,4 @@ public class Field extends DBObject<Field> {
}
};
}
}
}

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

@ -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)
return null;
String[] pairs = string.split(" ");
String[] pairs = string.split("=");
ContentValues result = new ContentValues();
for(String item : pairs) {
String[] keyValue = item.split("=");
result.put(keyValue[0].trim(), keyValue[1].trim());
String key = null;
for(int i = 0; i < pairs.length; i++) {
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;
}

@ -6,11 +6,13 @@
package com.todoroo.andlib.utility;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import android.content.Context;
import android.content.res.Resources;
import android.text.format.DateUtils;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
@ -108,101 +110,66 @@ public class DateUtilities {
}
/**
* @return time format (hours and minutes)
*/
public static SimpleDateFormat getTimeFormat(Context context) {
String value = getTimeFormatString(context);
return new SimpleDateFormat(value);
}
/**
* @return string used for time formatting
* @param context android context
* @param date time to format
* @return time, with hours and minutes
*/
@SuppressWarnings("nls")
private static String getTimeFormatString(Context context) {
public static String getTimeString(Context context, Date date) {
String value;
if (is24HourFormat(context)) {
value = "H:mm";
} else {
value = "h:mm a";
}
return value;
return new SimpleDateFormat(value).format(date);
}
/**
* @param context android context
* @return string used for date formatting
* @param date date to format
* @return date, with month, day, and year
*/
@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;
// united states, you are special
if (Locale.US.equals(Locale.getDefault())
|| Locale.CANADA.equals(Locale.getDefault()))
value = "MMM d yyyy";
value = month + " d yyyy";
else
value = "d MMM yyyy";
return value;
}
/**
* @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");
}
value = "d " + month + " yyyy";
return new SimpleDateFormat(value).format(date);
}
/**
* @return date format as getDateFormat with weekday
*/
@SuppressWarnings("nls")
public static SimpleDateFormat getDateFormatWithWeekday(Context context) {
try {
return new SimpleDateFormat("EEEE, " + getDateFormatString(context));
} catch (Exception e) {
return new SimpleDateFormat("EEEE, d MMM yyyy");
}
public static String getDateStringWithWeekday(Context context, Date date) {
String weekday = DateUtils.getDayOfWeekString(date.getDay() + Calendar.SUNDAY,
DateUtils.LENGTH_LONG);
return weekday + ", " + getDateString(context, date);
}
/**
* @return date format as getDateFormat with weekday
*/
@SuppressWarnings("nls")
public static SimpleDateFormat getDateWithTimeAndWeekday(Context context) {
try {
return new SimpleDateFormat("EEEE, " + getDateFormatString(context)
+ " " + getTimeFormatString(context));
} catch (Exception e) {
return new SimpleDateFormat("EEEE, d MMM yyyy H:mm");
}
public static String getDateStringWithTimeAndWeekday(Context context, Date date) {
return getDateStringWithWeekday(context, date) + " " + getTimeString(context, date);
}
/**
* @return date with time at the end
*/
@SuppressWarnings("nls")
public static SimpleDateFormat getDateWithTimeFormat(Context context) {
try {
return new SimpleDateFormat(getDateFormatString(context) + " " +
getTimeFormatString(context));
} catch (Exception e) {
return new SimpleDateFormat("d MMM yyyy H:mm");
}
public static String getDateStringWithTime(Context context, Date date) {
return getDateString(context, date) + " " + getTimeString(context, date);
}
/**
* @return formatted date (will contain month, day, year)
*/
public static String getFormattedDate(Context context, Date date) {
return getDateFormat(context).format(date);
}
/* ======================================================================
* ============================================================= 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;
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.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.model.Metadata;
/**
* Data Model which represents an alarm
* Metadata entry for a task alarm
*
* @author Tim Su <tim@todoroo.com>
*
*/
@SuppressWarnings("nls")
public class Alarm extends AbstractModel {
// --- table
public static final Table TABLE = new Table("alarm", Alarm.class);
public class Alarm {
// --- properties
/** metadata key */
public static final String METADATA_KEY = "alarm"; //$NON-NLS-1$
/** ID */
public static final LongProperty ID = new LongProperty(
TABLE, ID_PROPERTY_NAME);
/** time of alarm */
public static final LongProperty TIME = new LongProperty(Metadata.TABLE,
Metadata.VALUE1.name);
/** Associated Task */
public static final LongProperty TASK = new LongProperty(
TABLE, "task");
/** 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);
/** alarm type */
public static final IntegerProperty TYPE = new IntegerProperty(Metadata.TABLE,
Metadata.VALUE2.name);
// --- 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 {
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;
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.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.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
@ -13,32 +30,31 @@ import com.todoroo.andlib.sql.Query;
* @author Tim Su <tim@todoroo.com>
*
*/
@SuppressWarnings("nls")
public class AlarmService {
AlarmDatabase database = new AlarmDatabase();
GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, database);
// --- singleton
/**
* Metadata key for # of alarms
*/
public static final String ALARM_COUNT = "alarms-count";
private static AlarmService instance = null;
public AlarmService() {
DependencyInjectionService.getInstance().inject(this);
public static synchronized AlarmService getInstance() {
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
*/
public TodorooCursor<Alarm> getAlarms(long taskId) {
database.openForReading();
Query query = Query.select(Alarm.PROPERTIES).where(Alarm.TASK.eq(taskId));
return dao.query(query);
public TodorooCursor<Metadata> getAlarms(long taskId) {
return PluginServices.getMetadataService().query(Query.select(
Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey(
taskId, Alarm.METADATA_KEY)).orderBy(Order.asc(Alarm.TIME)));
}
/**
@ -46,14 +62,140 @@ public class AlarmService {
* @param taskId
* @param tags
*/
public void synchronizeAlarms(long taskId, ArrayList<Alarm> alarms) {
database.openForWriting();
dao.deleteWhere(Alarm.TASK.eq(taskId));
for(Alarm alarm : alarms) {
alarm.setId(Alarm.NO_ID);
alarm.setValue(Alarm.TASK, taskId);
dao.saveExisting(alarm);
public void synchronizeAlarms(long taskId, LinkedHashSet<Long> alarms) {
MetadataService service = PluginServices.getMetadataService();
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);
long time = alarm.getValue(Alarm.TIME);
if(time == 0 || time == NO_ALARM)
am.cancel(pendingIntent);
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) {
status = r.getString(R.string.backup_status_success,
DateUtilities.getDateWithTimeFormat(BackupPreferences.this).
format(new Date(last)));
DateUtilities.getDateStringWithTime(BackupPreferences.this,
new Date(last)));
statusColor = Color.rgb(0, 100, 0);
preference.setOnPreferenceClickListener(null);
} else {

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

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

@ -127,12 +127,12 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
// last sync was error
else if(getUtilities().getLastAttemptedSyncDate() != 0) {
status = r.getString(R.string.rmilk_status_failed,
DateUtilities.getDateWithTimeFormat(SyncProviderPreferences.this).
format(new Date(getUtilities().getLastAttemptedSyncDate())));
DateUtilities.getDateStringWithTime(SyncProviderPreferences.this,
new Date(getUtilities().getLastAttemptedSyncDate())));
if(getUtilities().getLastSyncDate() > 0) {
subtitle = r.getString(R.string.rmilk_status_failed_subtitle,
DateUtilities.getDateWithTimeFormat(SyncProviderPreferences.this).
format(new Date(getUtilities().getLastSyncDate())));
DateUtilities.getDateStringWithTime(SyncProviderPreferences.this,
new Date(getUtilities().getLastSyncDate())));
}
statusColor = Color.rgb(100, 0, 0);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@ -145,8 +145,8 @@ abstract public class SyncProviderPreferences extends TodorooPreferences {
});
} else if(getUtilities().getLastSyncDate() > 0) {
status = r.getString(R.string.rmilk_status_success,
DateUtilities.getDateWithTimeFormat(SyncProviderPreferences.this).
format(new Date(getUtilities().getLastSyncDate())));
DateUtilities.getDateStringWithTime(SyncProviderPreferences.this,
new Date(getUtilities().getLastSyncDate())));
statusColor = Color.rgb(0, 100, 0);
} else {
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.Functions;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.DateUtilities;
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.FilterListItem;
import com.todoroo.astrid.api.SearchFilter;
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.tags.TagService;
/**
* 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),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())).
orderBy(Order.asc(Task.TITLE)),
orderBy(Order.asc(Functions.upper(Task.TITLE))),
null);
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) {
Filter inbox = new Filter(r.getString(R.string.BFE_Active), r.getString(R.string.BFE_Active_title),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
TaskCriteria.isVisible())),
new QueryTemplate().where(
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);
inbox.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.tango_home)).getBitmap();
return inbox;

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

@ -7,16 +7,18 @@ import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Spinner;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Spinner;
import android.widget.Toast;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
@ -100,6 +102,9 @@ public class GCalControlSet implements TaskEditControlSet {
cursor.moveToFirst();
intent.putExtra("beginTime", cursor.getLong(0));
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 {
cursor.close();
}
@ -174,8 +179,9 @@ public class GCalControlSet implements TaskEditControlSet {
values.put("dtstart", dueDate - estimatedTime);
values.put("dtend", dueDate);
} else {
values.put("dtstart", dueDate);
values.put("dtend", dueDate);
// calendar thinks 23:59:59 is next day, move it back
values.put("dtstart", dueDate - DateUtilities.ONE_DAY + 1000L);
values.put("dtend", dueDate - DateUtilities.ONE_DAY + 1000L);
values.put("allDay", "1");
}
} else {

@ -16,6 +16,7 @@ import android.widget.Spinner;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.astrid.activity.AddOnActivity;
import com.todoroo.astrid.adapter.FilterAdapter;
import com.todoroo.astrid.api.Filter;
@ -96,6 +97,8 @@ public final class LocaleEditAlerts extends ExpandableListActivity {
super.onCreate(savedInstanceState);
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
* robust and re-usable

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

@ -92,4 +92,4 @@ public class ProducteevDetailExposer extends BroadcastReceiver implements Detail
return ProducteevUtilities.IDENTIFIER;
}
}
}

@ -20,23 +20,28 @@
package com.todoroo.astrid.producteev;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
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
* the synchronization provider requested. A callback method determines whether
* their login was successful and therefore whether to dismiss the dialog.
* This activity allows users to sign in or log in to Producteev
*
* @author arne.jans
*
@ -46,26 +51,6 @@ public class ProducteevLoginActivity extends Activity {
@Autowired
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
public ProducteevLoginActivity() {
@ -76,70 +61,157 @@ public class ProducteevLoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ContextManager.setContext(this);
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 EditText passwordEditText = (EditText) findViewById(R.id.Producteev_Password_EditText);
Button cancel = (Button) findViewById(R.id.cancel);
Button login = (Button) findViewById(R.id.done);
final TextView errors = (TextView) findViewById(R.id.error);
final EditText emailEditText = (EditText) findViewById(R.id.email);
final EditText passwordEditText = (EditText) findViewById(R.id.password);
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) {
final Handler handler = new Handler();
errors.setVisibility(View.GONE);
if(newUserLayout.getVisibility() == View.VISIBLE)
newUserLayout.setVisibility(View.GONE);
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;
}
if (callback == null) {
finish();
return;
performLogin(email.toString(), password.toString());
}
}
final String email = emailEditText.getText().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(!confirmPassword.toString().equals(password.toString())) {
errors.setVisibility(View.VISIBLE);
errors.setText(R.string.producteev_PLA_errorMatch);
return;
}
performSignup(email.toString(), password.toString(),
firstName.toString(), lastName.toString());
}
if (password == null || password.length() == 0) {
// no password given
Toast.makeText(ProducteevLoginActivity.this,
R.string.producteev_MLA_password_empty,
Toast.LENGTH_LONG).show();
setResult(RESULT_CANCELED);
finish();
return;
}
});
}
new Thread(new Runnable() {
public void run() {
final String result = callback.verifyLogin(handler,
email, password);
if (result == null) {
finish();
} else {
// display the error
handler.post(new Runnable() {
public void run() {
dialogUtilities.okDialog(
ProducteevLoginActivity.this,
result, null);
}
});
}
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() {
ProducteevInvoker invoker = ProducteevSyncProvider.getInvoker();
final StringBuilder errorMessage = new StringBuilder();
try {
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();
});
}
}
});
}.start();
}
cancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_CANCELED);
finish();
private void performSignup(final String email, final String password,
final String firstName, final String lastName) {
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() {
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;
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.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.common.SyncProviderPreferences;
import com.todoroo.astrid.common.SyncProviderUtilities;
import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider;
@ -37,5 +42,41 @@ public class ProducteevPreferences extends SyncProviderPreferences {
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();
/** 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
public String getIdentifier() {
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
/**

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

@ -83,4 +83,4 @@ public class ProducteevDashboard extends AbstractModel {
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
}
}

@ -232,4 +232,4 @@ public final class ProducteevDataService {
cursor.close();
}
}
}
}

@ -72,5 +72,4 @@ public class ProducteevDatabase extends AbstractDatabase {
return false;
}
}
}

@ -17,7 +17,6 @@ import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.text.TextUtils;
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.ProducteevPreferences;
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.ApiServiceException;
import com.todoroo.astrid.producteev.api.ApiUtilities;
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.service.AstridDependencyInjector;
import com.todoroo.astrid.tags.TagService;
@ -148,10 +145,7 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
try {
String authToken = preferences.getToken();
String z = stripslashes(0, "71o3346pr40o5o4nt4n7t6n287t4op28","2");
String v = stripslashes(2, "9641n76n9s1736q1578q1o1337q19233","4ae");
invoker = new ProducteevInvoker(z, v);
invoker = getInvoker();
String email = Preferences.getStringValue(R.string.producteev_PPr_email);
String password = Preferences.getStringValue(R.string.producteev_PPr_password);
@ -165,24 +159,6 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
// display login-activity
final Context context = ContextManager.getContext();
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)
((Activity)context).startActivityForResult(intent, 0);
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!
// ----------------------------------------------------------------------
@ -591,4 +573,4 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
}
}
}

@ -21,4 +21,4 @@ public class ProducteevTask {
public static final LongProperty DASHBOARD_ID = new LongProperty(Metadata.TABLE,
Metadata.VALUE2.name);
}
}

@ -32,10 +32,10 @@ public class Notifications extends BroadcastReceiver {
// --- constants
/** 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 */
static final String TYPE_KEY = "type"; //$NON-NLS-1$
public static final String TYPE_KEY = "type"; //$NON-NLS-1$
/** preference values */
public static final int ICON_SET_PINK = 0;
@ -72,15 +72,24 @@ public class Notifications extends BroadcastReceiver {
Resources r = context.getResources();
String reminder;
if(type == ReminderService.TYPE_DUE || type == ReminderService.TYPE_OVERDUE)
reminder = getRandomReminder(r.getStringArray(R.array.reminders_due));
else if(type == ReminderService.TYPE_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
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)
reminder = getRandomReminder(r.getStringArray(R.array.reminders_due));
else if(type == ReminderService.TYPE_SNOOZE)
reminder = getRandomReminder(r.getStringArray(R.array.reminders_snooze));
else
reminder = getRandomReminder(r.getStringArray(R.array.reminders));
} else
reminder = ""; //$NON-NLS-1$
synchronized(Notifications.class) {
if(notificationManager == null)
notificationManager = new AndroidNotificationManager(context);
}
if(!showTaskNotification(id, type, reminder)) {
notificationManager.cancel((int)id);
}

@ -48,13 +48,15 @@ public final class ReminderService {
};
/** flag for due date reminder */
static final int TYPE_DUE = 0;
public static final int TYPE_DUE = 0;
/** flag for overdue reminder */
static final int TYPE_OVERDUE = 1;
public static final int TYPE_OVERDUE = 1;
/** flag for random reminder */
static final int TYPE_RANDOM = 2;
public static final int TYPE_RANDOM = 2;
/** 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();
@ -179,6 +181,8 @@ public final class ReminderService {
scheduler.createAlarm(task, whenDueDate, TYPE_DUE);
else if(whenOverdue != NO_ALARM)
scheduler.createAlarm(task, whenOverdue, TYPE_OVERDUE);
else
scheduler.createAlarm(task, 0, 0);
}
/**
@ -291,14 +295,6 @@ public final class ReminderService {
*/
@SuppressWarnings("nls")
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();
Intent intent = new Intent(context, Notifications.class);
intent.setType(Long.toString(task.getId()));
@ -310,9 +306,18 @@ public final class ReminderService {
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, 0);
Log.e("Astrid", "Alarm (" + task.getId() + ", " + type +
") set for " + new Date(time));
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
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 +
") set for " + new Date(time));
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
}
}
}

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

@ -4,6 +4,7 @@ import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.view.LayoutInflater;
@ -11,13 +12,13 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout;
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.RRule;
@ -61,10 +62,13 @@ public class RepeatControlSet implements TaskEditControlSet {
private final LinearLayout repeatContainer;
private final LinearLayout daysOfWeekContainer;
private final CompoundButton[] daysOfWeek = new CompoundButton[7];
private Task model;
@Autowired
ExceptionService exceptionService;
boolean setInterval = false;
// --- implementation
public RepeatControlSet(final Activity activity, ViewGroup parent) {
@ -111,10 +115,22 @@ public class RepeatControlSet implements TaskEditControlSet {
repeatValueClick();
}
});
interval.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View view, int position, long id) {
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
@ -122,6 +138,7 @@ public class RepeatControlSet implements TaskEditControlSet {
//
}
});
daysOfWeekContainer.setVisibility(View.GONE);
}
/** Set up the repeat value button */
@ -156,6 +173,8 @@ public class RepeatControlSet implements TaskEditControlSet {
@Override
public void readFromTask(Task task) {
model = task;
String recurrence = task.getValue(Task.RECURRENCE);
if(recurrence == null)
recurrence = ""; //$NON-NLS-1$
@ -172,17 +191,6 @@ public class RepeatControlSet implements TaskEditControlSet {
break;
case WEEKLY: {
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;
}
case MONTHLY:
@ -196,6 +204,19 @@ public class RepeatControlSet implements TaskEditControlSet {
exceptionService.reportError("repeat-unhandled-rule", //$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) {
recurrence = ""; //$NON-NLS-1$
exceptionService.reportError("repeat-parse-exception", e); //$NON-NLS-1$
@ -226,6 +247,7 @@ public class RepeatControlSet implements TaskEditControlSet {
break;
case INTERVAL_WEEKS: {
rrule.setFreq(Frequency.WEEKLY);
ArrayList<WeekdayNum> days = new ArrayList<WeekdayNum>();
for(int i = 0; i < daysOfWeek.length; i++)
if(daysOfWeek[i].isChecked())
@ -239,6 +261,7 @@ public class RepeatControlSet implements TaskEditControlSet {
case INTERVAL_HOURS:
rrule.setFreq(Frequency.HOURLY);
}
result = rrule.toIcal();
}
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$
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) {
StringBuilder byDayString = new StringBuilder();
DateFormatSymbols dfs = new DateFormatSymbols();

@ -1,6 +1,7 @@
package com.todoroo.astrid.repeats;
import java.text.ParseException;
import java.util.Collections;
import java.util.Date;
import java.util.TimeZone;
@ -15,107 +16,134 @@ import com.google.ical.values.DateValue;
import com.google.ical.values.DateValueImpl;
import com.google.ical.values.Frequency;
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.astrid.api.AstridApiConstants;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.service.TaskService;
public class RepeatTaskCompleteListener extends BroadcastReceiver {
@Autowired
private TaskService taskService;
@Autowired
private ExceptionService exceptionService;
@Override
public void onReceive(Context context, Intent intent) {
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
if(taskId == -1)
return;
DependencyInjectionService.getInstance().inject(this);
Task task = taskService.fetchById(taskId, Task.ID, Task.RECURRENCE,
Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.RECURRENCE,
Task.DUE_DATE, Task.FLAGS, Task.HIDE_UNTIL);
if(task == null)
return;
String recurrence = task.getValue(Task.RECURRENCE);
if(recurrence != null && recurrence.length() > 0) {
DateValue repeatFrom;
Date repeatFromDate = new Date();
DateValue today = new DateValueImpl(repeatFromDate.getYear() + 1900,
repeatFromDate.getMonth() + 1, repeatFromDate.getDate());
if(task.hasDueDate() && !task.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION)) {
repeatFromDate = new Date(task.getValue(Task.DUE_DATE));
if(task.hasDueTime()) {
repeatFrom = new DateTimeValueImpl(repeatFromDate.getYear() + 1900,
repeatFromDate.getMonth() + 1, repeatFromDate.getDate(),
repeatFromDate.getHours(), repeatFromDate.getMinutes(), repeatFromDate.getSeconds());
} else {
repeatFrom = new DateValueImpl(repeatFromDate.getYear() + 1900,
repeatFromDate.getMonth() + 1, repeatFromDate.getDate());
}
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;
Date repeatFromDate = new Date();
DateValue today = new DateValueImpl(repeatFromDate.getYear() + 1900,
repeatFromDate.getMonth() + 1, repeatFromDate.getDate());
if(task.hasDueDate() && !task.getFlag(Task.FLAGS, Task.FLAG_REPEAT_AFTER_COMPLETION)) {
repeatFromDate = new Date(task.getValue(Task.DUE_DATE));
if(task.hasDueTime()) {
repeatFrom = new DateTimeValueImpl(repeatFromDate.getYear() + 1900,
repeatFromDate.getMonth() + 1, repeatFromDate.getDate(),
repeatFromDate.getHours(), repeatFromDate.getMinutes(), repeatFromDate.getSeconds());
} else {
repeatFrom = today;
repeatFrom = new DateValueImpl(repeatFromDate.getYear() + 1900,
repeatFromDate.getMonth() + 1, repeatFromDate.getDate());
}
} else {
repeatFrom = today;
}
// invoke the recurrence iterator
try {
long newDueDate;
RRule rrule = new RRule(recurrence);
if(rrule.getFreq() == Frequency.HOURLY) {
// invoke the recurrence iterator
long newDueDate = -1;
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) {
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME,
repeatFromDate.getTime() + DateUtilities.ONE_HOUR * rrule.getInterval());
} else {
RecurrenceIterator iterator = RecurrenceIteratorFactory.createRecurrenceIterator(rrule,
repeatFrom, TimeZone.getDefault());
DateValue nextDate = repeatFrom;
if(repeatFrom.compareTo(today) < 0)
iterator.advanceTo(today);
for(int i = 0; i < 10; i++) { // ten tries then we give up
if(!iterator.hasNext())
return -1;
nextDate = iterator.next();
if(nextDate.compareTo(repeatFrom) == 0)
continue;
if(nextDate instanceof DateTimeValueImpl) {
DateTimeValueImpl newDateTime = (DateTimeValueImpl)nextDate;
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME,
repeatFromDate.getTime() + DateUtilities.ONE_HOUR * rrule.getInterval());
Date.UTC(newDateTime.year() - 1900, newDateTime.month() - 1,
newDateTime.day(), newDateTime.hour(),
newDateTime.minute(), newDateTime.second()));
} else {
RecurrenceIterator iterator = RecurrenceIteratorFactory.createRecurrenceIterator(rrule,
repeatFrom, TimeZone.getDefault());
DateValue nextDate;
if(repeatFrom.compareTo(today) < 0) {
iterator.advanceTo(today);
if(!iterator.hasNext())
return;
nextDate = iterator.next();
} else {
iterator.advanceTo(repeatFrom);
if(!iterator.hasNext())
return;
nextDate = iterator.next();
nextDate = iterator.next();
}
if(nextDate instanceof DateTimeValueImpl) {
DateTimeValueImpl newDateTime = (DateTimeValueImpl)nextDate;
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME,
Date.UTC(newDateTime.year() - 1900, newDateTime.month() - 1,
newDateTime.day(), newDateTime.hour(),
newDateTime.minute(), newDateTime.second()));
} else {
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY,
new Date(nextDate.year() - 1900, nextDate.month() - 1,
nextDate.day()).getTime());
}
newDueDate = task.createDueDate(Task.URGENCY_SPECIFIC_DAY,
new Date(nextDate.year() - 1900, nextDate.month() - 1,
nextDate.day()).getTime());
}
long hideUntil = task.getValue(Task.HIDE_UNTIL);
if(hideUntil > 0 && task.getValue(Task.DUE_DATE) > 0) {
hideUntil += newDueDate - task.getValue(Task.DUE_DATE);
}
if(newDueDate > DateUtilities.now() && newDueDate != repeatFromDate.getTime())
break;
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
else if(MilkUtilities.getLastAttemptedSyncDate() != 0) {
status = r.getString(R.string.rmilk_status_failed,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this).
format(new Date(MilkUtilities.getLastAttemptedSyncDate())));
DateUtilities.getDateStringWithTime(MilkPreferences.this,
new Date(MilkUtilities.getLastAttemptedSyncDate())));
if(MilkUtilities.getLastSyncDate() > 0) {
subtitle = r.getString(R.string.rmilk_status_failed_subtitle,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this).
format(new Date(MilkUtilities.getLastSyncDate())));
DateUtilities.getDateStringWithTime(MilkPreferences.this,
new Date(MilkUtilities.getLastSyncDate())));
}
statusColor = Color.rgb(100, 0, 0);
preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@ -132,8 +132,8 @@ public class MilkPreferences extends TodorooPreferences {
});
} else if(MilkUtilities.getLastSyncDate() > 0) {
status = r.getString(R.string.rmilk_status_success,
DateUtilities.getDateWithTimeFormat(MilkPreferences.this).
format(new Date(MilkUtilities.getLastSyncDate())));
DateUtilities.getDateStringWithTime(MilkPreferences.this,
new Date(MilkUtilities.getLastSyncDate())));
statusColor = Color.rgb(0, 100, 0);
} else {
status = r.getString(R.string.rmilk_status_never);

@ -11,12 +11,14 @@ import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable;
import com.timsu.astrid.R;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterCategory;
import com.todoroo.astrid.api.FilterListHeader;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.tags.TagService.Tag;
@ -31,11 +33,11 @@ public class TagFilterExposer extends BroadcastReceiver {
private TagService tagService;
@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).
replace("$T", tag.tag).replace("$C", Integer.toString(tag.count));
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.put(Metadata.KEY.name, TagService.KEY);
contentValues.put(TagService.TAG.name, tag.tag);
@ -59,7 +61,7 @@ public class TagFilterExposer extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
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(tagsByAlpha.length == 0)
@ -67,34 +69,47 @@ public class TagFilterExposer extends BroadcastReceiver {
Resources r = context.getResources();
Tag[] tagsBySize = tagService.getGroupedTags(TagService.GROUPED_TAGS_BY_SIZE);
Filter[] filtersByAlpha = new Filter[tagsByAlpha.length];
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];
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));
Filter untagged = new Filter(r.getString(R.string.tag_FEx_untagged),
r.getString(R.string.tag_FEx_untagged),
tagService.untaggedTemplate(),
null);
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_untagged)).getBitmap();
FilterCategory tagsCategoryBySize = new FilterCategory(context.getString(R.string.tag_FEx_by_size),
filtersBySize);
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);
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
FilterListItem[] list = new FilterListItem[4];
FilterListItem[] list = new FilterListItem[5];
list[0] = tagsHeader;
list[1] = untagged;
list[2] = tagsCategoryBySize;
list[3] = tagsCategoryByAlpha;
list[3] = tagsCategoryCompleted;
list[4] = tagsCategoryAllByAlpha;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_FILTERS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, list);
context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);

@ -1,6 +1,6 @@
package com.todoroo.astrid.tags;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.CountProperty;
@ -82,11 +82,11 @@ public final class TagService {
* @param tag
* @return
*/
public QueryTemplate queryTemplate() {
public QueryTemplate queryTemplate(Criterion criterion) {
return new QueryTemplate().join(Join.inner(Metadata.TABLE,
Task.ID.eq(Metadata.TASK))).where(Criterion.and(
MetadataCriteria.withKey(KEY), TAG.eq(tag),
TaskCriteria.isActive()));
criterion));
}
}
@ -100,13 +100,14 @@ public final class TagService {
/**
* 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
*/
public Tag[] getGroupedTags(Order order) {
public Tag[] getGroupedTags(Order order, Criterion activeStatus) {
Query query = Query.select(TAG.as(TAG.name), COUNT).
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);
TodorooCursor<Metadata> cursor = metadataDao.query(query);
try {
@ -175,7 +176,7 @@ public final class TagService {
* @param taskId
* @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),
MetadataCriteria.withKey(KEY)));

@ -1,12 +1,11 @@
package com.todoroo.astrid.tags;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageButton;
@ -15,6 +14,7 @@ import android.widget.TextView;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.activity.TaskEditActivity.TaskEditControlSet;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
@ -28,11 +28,6 @@ import com.todoroo.astrid.tags.TagService.Tag;
*/
public final class TagsControlSet implements TaskEditControlSet {
// --- constants
/** Number of tags a task can have */
static final int MAX_TAGS = 5;
// --- instance variables
private final TagService tagService = TagService.getInstance();
@ -41,30 +36,33 @@ public final class TagsControlSet implements TaskEditControlSet {
private final Activity activity;
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.tagsContainer = (LinearLayout) activity.findViewById(tagsContainer);
}
@SuppressWarnings("nls")
@Override
public void readFromTask(Task task) {
// tags (only configure if not already set)
if(tagsContainer.getChildCount() == 0) {
TodorooCursor<Metadata> cursor = tagService.getTags(task.getId());
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
addTag(cursor.get(TagService.TAG));
} finally {
cursor.close();
}
addTag("");
tagsContainer.removeAllViews();
TodorooCursor<Metadata> cursor = tagService.getTags(task.getId());
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
addTag(cursor.get(TagService.TAG));
} finally {
cursor.close();
}
if(tagsContainer.getChildCount() == 0)
addTag(""); //$NON-NLS-1$
}
@Override
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++) {
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 */
boolean addTag(String tagName) {
if (tagsContainer.getChildCount() >= MAX_TAGS) {
return false;
}
LayoutInflater inflater = activity.getLayoutInflater();
final View tagItem = inflater.inflate(R.layout.tag_edit_row, null);
tagsContainer.addView(tagItem);
@ -93,33 +87,40 @@ public final class TagsControlSet implements TaskEditControlSet {
new ArrayAdapter<Tag>(activity,
android.R.layout.simple_dropdown_item_1line, allTags);
textView.setAdapter(tagsAdapter);
textView.addTextChangedListener(new TextWatcher() {
@SuppressWarnings("nls")
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if(start == 0 && tagsContainer.getChildAt(
tagsContainer.getChildCount()-1) == tagItem) {
addTag("");
}
}
public void afterTextChanged(Editable s) {
//
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
View lastItem = tagsContainer.getChildAt(tagsContainer.getChildCount()-1);
TextView lastText = (TextView) lastItem.findViewById(R.id.text1);
if(lastText.getText().length() != 0) {
addTag(""); //$NON-NLS-1$
}
}
});
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
//
/*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;
}
});
});*/
ImageButton reminderRemoveButton;
reminderRemoveButton = (ImageButton)tagItem.findViewById(R.id.button1);
reminderRemoveButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(textView.getText().length() > 0)
if(tagsContainer.getChildCount() > 0)
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.model.Task;
import com.todoroo.astrid.ui.TimeDurationControlSet;
import com.todoroo.astrid.ui.TimeDurationControlSet.TimeDurationType;
/**
* Control Set for managing repeats
@ -31,11 +30,11 @@ public class TimerControlSet implements TaskEditControlSet {
LayoutInflater.from(activity).inflate(R.layout.timer_control, parent, true);
estimated = new TimeDurationTaskEditControlSet(Task.ESTIMATED_SECONDS,
R.id.estimatedDuration, 0, R.string.DLG_hour_minutes,
TimeDurationType.HOURS_MINUTES);
R.id.estimatedDuration, 0, R.string.DLG_hour_minutes
);
elapsed = new TimeDurationTaskEditControlSet(Task.ELAPSED_SECONDS, R.id.elapsedDuration,
0, R.string.DLG_hour_minutes,
TimeDurationType.HOURS_MINUTES);
0, R.string.DLG_hour_minutes
);
}
@Override
@ -62,10 +61,10 @@ public class TimerControlSet implements TaskEditControlSet {
private final IntegerProperty property;
public TimeDurationTaskEditControlSet(IntegerProperty property, int timeButtonId,
int prefixResource, int titleResource, TimeDurationType type) {
int prefixResource, int titleResource) {
this.property = property;
this.controlSet = new TimeDurationControlSet(activity,
timeButtonId, prefixResource, titleResource, type);
timeButtonId, prefixResource, titleResource);
}
@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>

@ -34,6 +34,12 @@
android:visibility="gone" />
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:padding="5dip"
android:background="@android:drawable/divider_horizontal_dark" />
</merge>

@ -1,32 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/pdv_body">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" style="@style/TextAppearance.GEN_EditLabel"
android:text="@string/producteev_PPr_header" />
<ImageView
android:layout_width="fill_parent"
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: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"/>
</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/done" android:layout_width="fill_parent"
<Button android:id="@+id/signIn" android:layout_width="fill_parent"
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:text="@android:string/cancel" />
android:text="@string/producteev_PLA_createNew" />
</LinearLayout>
<EditText android:layout_height="wrap_content"
android:layout_width="fill_parent" android:hint="E-Mail"
android:contentDescription="E-Mail with which you registered to Producteev-service"
android:id="@+id/Poducteev_EMail_EditText" android:inputType="textEmailAddress"></EditText>
<EditText android:layout_height="wrap_content"
android:id="@+id/Producteev_Password_EditText"
android:contentDescription="Password for your Producteev account"
android:hint="Password" android:layout_width="fill_parent"
android:inputType="textPassword"></EditText>
<TextView android:id="@+id/terms"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="10dip"
android:textSize="16sp"
android:textColor="#0000ff"
android:linksClickable="true"
android:text="@string/producteev_PLA_terms" />
</LinearLayout>

@ -10,13 +10,19 @@
android:paddingRight="4dip"
android:minHeight="40dip"
android:orientation="vertical">
<LinearLayout android:id="@+id/task_row"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="100"
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 -->
<CheckBox android:id="@+id/completeBox"
android:layout_width="34dip"
@ -29,13 +35,12 @@
android:layout_height="wrap_content"
android:layout_weight="100"
android:paddingLeft="8dip"
android:paddingRight="3dip"
android:orientation="vertical">
<!-- task name -->
<TextView android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="fill_parent"
style="@style/TextAppearance.TAd_ItemTitle"
android:gravity="center_vertical"/>
@ -52,11 +57,6 @@
</LinearLayout>
<!-- importance -->
<View android:id="@+id/importance"
android:layout_width="2dip"
android:layout_height="fill_parent" />
</LinearLayout>
<TextView android:id="@+id/extendedDetails"

@ -36,11 +36,15 @@
</LinearLayout>
<!-- Body -->
<FrameLayout
<android.gesture.GestureOverlayView android:id="@+id/gestures"
android:layout_width="fill_parent"
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 -->
<TextView android:id="@android:id/empty"
@ -57,7 +61,7 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</FrameLayout>
</android.gesture.GestureOverlayView>
<!-- Footer -->
<LinearLayout
@ -95,6 +99,5 @@
android:scaleType="fitCenter"/>
</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>

@ -1,7 +1,7 @@
<?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">
<!-- estimated time -->
<TextView
android:layout_width="wrap_content"
@ -23,6 +23,12 @@
android:id="@+id/elapsedDuration"
android:layout_width="fill_parent"
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>

Binary file not shown.

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Mida de la Llista de Tasques</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<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>
@ -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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1150,10 +1177,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiquetes</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Velikost seznamu úkolů</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<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>
@ -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>
<!-- 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 -->
<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>
<!-- 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 -->
<string name="tag_FEx_alpha">Podle abecedy</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<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. -->
<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 -->
<!-- ================================================= BackupPreferences == -->
@ -13,11 +34,11 @@
<string name="backup_BPr_group_status">Estado</string>
<!-- 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! -->
<string name="backup_status_failed">Falló el último backup</string>
<!-- 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 -->
<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>
<!-- 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-->
<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 == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -210,13 +231,14 @@
<!-- Progress dialog shown when doing something slow -->
<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) -->
<string name="DLG_hour_minutes">Tiempo (horas : minutos)</string>
<!-- Dialog for Astrid having a critical update -->
<string name="DLG_please_update">Astrid should to be updated to the latest
version in the Android market! Please do that before continuing, or wait a
few seconds.</string>
<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>
<!-- Button for going to Market -->
<string name="DLG_to_market">Ir al mercado</string>
@ -224,7 +246,7 @@
<!-- =============================================================== UI == -->
<!-- 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 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>
<!-- Context Item: undelete task -->
<string name="TAd_contextUndeleteTask">Undelete Task</string>
<string name="TAd_contextUndeleteTask">Restaurar la Tarea</string>
<!-- =============================================== FilterListActivity == -->
@ -320,7 +342,7 @@ button: add task & go to the edit page.
<string name="FLA_search_hint">Buscar tareas</string>
<!-- Search Filter name (%s => query) -->
<string name="FLA_search_filter">Matching \'%s\'</string>
<string name="FLA_search_filter">Coincider %s</string>
<!-- Help (HTML)-->
<string name="FLA_help"><![CDATA[
@ -369,13 +391,13 @@ to the plugin creator for fastest service.
<string name="TEA_importance_label">Importancia</string>
<!-- Task urgency label -->
<string name="TEA_urgency_label">Deadline</string>
<string name="TEA_urgency_label">Fecha límite</string>
<!-- 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 -->
<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 -->
<string name="TEA_hideUntil_label">Esconder hasta</string>
@ -418,28 +440,28 @@ to the plugin creator for fastest service.
<string-array name="TEA_urgency">
<!-- 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>Mañana</item>
<item>(día anterior)</item>
<item>Próxima semana</item>
<item>No Deadline</item>
<item>Ninguna fecha límite</item>
</string-array>
<string-array name="TEA_hideUntil">
<!-- hideUntil: labels for edit page. -->
<item>No esconder</item>
<item>Task is due</item>
<item>Day before due</item>
<item>Week before due</item>
<item>Tarea se debe</item>
<item>Día antes de fecha límite</item>
<item>Semana antes de fecha límite</item>
<item>Día específico</item>
</string-array>
<!-- 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 -->
<string name="TEA_addons_button">Get Some Add-ons</string>
<string name="TEA_addons_button">Obtener algunos componentes adicionales.</string>
<!-- ============================================= IntroductionActivity == -->
@ -455,7 +477,7 @@ to the plugin creator for fastest service.
<!-- ===================================================== HelpActivity == -->
<!-- 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 == -->
@ -472,27 +494,33 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Tamaño de la lista de tareas</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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 -->
<string name="EPr_default_urgency_title">Urgencia predeterminada</string>
<!-- 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 -->
<string name="EPr_default_importance_title">Importancia predeterminada</string>
<!-- 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 -->
<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) -->
<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">
<!-- importance: labels for "Task Defaults" preference item. -->
@ -504,7 +532,7 @@ to the plugin creator for fastest service.
<string-array name="EPr_default_urgency">
<!-- urgency: labels for "Task Defaults" preference item. -->
<item>No Deadline</item>
<item>Ninguna fecha límite</item>
<item>Hoy</item>
<item>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">
<!-- hideUntil: labels for "Task Defaults" preference item. -->
<item>No esconder</item>
<item>Task is due</item>
<item>Day before due</item>
<item>Week before due</item>
<item>Tarea se debe</item>
<item>Día antes de fecha límite</item>
<item>Semana antes de fecha límite</item>
</string-array>
<!-- ==================================================== AddOnActivity == -->
<!-- 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 -->
<string name="AOA_internal_author">Equipo de Astrid</string>
<!-- 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 -->
<string name="AOA_tab_available">Available</string>
<string name="AOA_tab_available">Disponible</string>
<!-- 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 -->
<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 -->
<string name="AOA_visit_market">Android Market</string>
<string name="AOA_visit_market">Tienda Android</string>
<!-- ========================================== SynchronizationProvider == -->
@ -558,11 +586,8 @@ to the plugin creator for fastest service.
<!-- ============================================================= Misc == -->
<!-- Displayed when task killer found. %s => name of the application -->
<string name="task_killer_help">
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>
<string name="task_killer_help">Parece que está usando una app que puede matar procesos (%s)!
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>
<!-- Task killer dialog ok button -->
<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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<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>
@ -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>
<!-- 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 -->
<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 -->
<!-- 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 -->
<string name="locale_edit_intro">Astrid will send you a reminder
when you have any tasks in the following filter:</string>
<string name="locale_edit_intro">Astrid enviará un recordatorio cuando tiene cualquier tares en el siguiente filtro.</string>
<!-- Locale Window Filter Picker UI -->
<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>
<!-- 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 -->
<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>
<!-- 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 -->
<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)-->
<string name="TEA_reminder_random">... randomly once</string>
<string name="TEA_reminder_random">... azar una vez</string>
<!-- 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 -->
<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 -->
<string name="rmd_EPr_quiet_hours_start_title">Inicio del horario en silencio</string>
<!-- 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) -->
<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 -->
<string name="rmd_EPr_quiet_hours_end_title">Fin del horario en silencio</string>
<!-- 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 -->
<string name="rmd_EPr_ringtone_title">Tono de notificación</string>
<!-- 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) -->
<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) -->
<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 -->
<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) -->
<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) -->
<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 -->
<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 -->
<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 -->
<string name="rmd_EPr_vibrate_title">Vibrar en alerta</string>
<!-- 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) -->
<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 -->
<string name="rmd_EPr_nagging_title">Recordatorios de Astrid</string>
<!-- 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) -->
<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 -->
<string name="rmd_EPr_defaultRemind_title">Recordatorios aleatorios</string>
<!-- 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) -->
<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 -->
<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">
<!-- 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>diariamente</item>
<item>semanalmente</item>
<item>bi-weekly</item>
<item>Dos veces por semana</item>
<item>mensualmente</item>
<item>bi-monthly</item>
<item>Dos veces por mes</item>
</string-array>
<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">
<!-- reminders: Make these < 20 chars so the task name is displayed -->
<item>¡Hola! ¿Tienes un segundo?</item>
<item>¿Puedo verte un segundo?</item>
<item>¿Tienes unos minutos?</item>
<item>¿Te has olvidado?</item>
<item>Hola! ¿Tiene un segundo?</item>
<item>¿Puede ver por un segundo?</item>
<item>¿Tiene unos minutos?</item>
<item>¿Se te olvidó?</item>
<item>¡Disculpe!</item>
<item>Cuando tenga un minuto:</item>
<item>En tu agenda:</item>
<item>¿Tienes un momento libre?</item>
<item>¡Astrid esta aquí!</item>
<item>En su agenda:</item>
<item>Tiene un momento libre?</item>
<item>Astrid aquí!</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>
</string-array>
<string-array name="reminders_due">
<!-- reminders related to task due date -->
<item>¡Hora de trabajar!</item>
<item>Due date is here!</item>
<item>Fecha de venciendo está aquí!</item>
<item>¿Listo para empezar?</item>
<item>You said you would do:</item>
<item>You\'re supposed to start:</item>
<item>Time to start:</item>
<item>Dijiste que harías:</item>
<item>Se supone que comenzará:</item>
<item>Momento de empezar:</item>
<item>¡Es hora!</item>
<item>Excuse me! Time for</item>
<item>You free? Time to</item>
<item>Perdón! Tiempo para:</item>
<item>¿Está libre? Tiempo para:</item>
</string-array>
<string-array name="reminders_snooze">
<!-- reminders related to snooze -->
<item>Don\'t be lazy now!</item>
<item>Snooze time is up!</item>
<item>No more snoozing!</item>
<item>No sea perezoso ahora!</item>
<item>Tiempo de pausa está terminado!</item>
<item>No dormitando mas!</item>
<item>¿Ahora está listo?</item>
<item>¡Basta de posponerlo!</item>
</string-array>
@ -906,36 +927,36 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string-array name="reminder_responses">
<!-- responses to reminder: Astrid says... (user should answer yes or no) -->
<item>¡Tengo algo para usted!</item>
<item>¿Listo para poner esto en el pasado?</item>
<item>¿Por qué no terminas esto?</item>
<item>¿Qué me dices? ¿Listo tigre?</item>
<item>Está listo para poner esto en el pasado?</item>
<item>¿Por qué no conseguir este hecho?</item>
<item>¿Qué te parece? Tigre listo?</item>
<item>¿Listo para hacer esto?</item>
<item>¿Puedes con esto?</item>
<item>¡Puedes ser feliz! ¡Solo termínalo!</item>
<item>¿Se puede manejar esto?</item>
<item>Puede estar feliz! Solo terminar este!</item>
<item>¡Le prometo que se sentirá mejor si termina esto!</item>
<item>¿No hará esto hoy?</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>Siéntete bien! Vamos!</item>
<item>¡Estoy orgulloso de ti! ¡Vamos a acabar esto!</item>
<item>¿Un bocadillo cuando termines esto?</item>
<item>¿Solo esta tarea? ¿Por favor?</item>
<item>¡Es hora de acortar tu lista de tareas!</item>
<item>Sentirse bien consigo mismo! Vamos!</item>
<item>Estoy orgulloso de ti! Lograr que se haga!</item>
<item>Un refrigerio después de haber terminado?</item>
<item>Solo este tarea? Por favor?</item>
<item>Es hora de acortar su lista de tarea!</item>
</string-array>
<string-array name="postpone_nags">
<!-- Astrid's nagging when user clicks postpone -->
<item>Please tell me it isn\'t true that you\'re a procrastinator!</item>
<item>Doesn\'t being lazy get old sometimes?</item>
<item>Por favor, dime que no es cierto que usted es un procrastinator!</item>
<item>¿Puede ser perezoso aburrido?</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>¿Esta es la última vez que pospone esto? ¿verdad?</item>
<item>¡Termínelo hoy! no le diré a nadie...</item>
<item>Porqué posponer cuando puede... no posponer!</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>¿Podrás alcanzar tus metas si haces eso?</item>
<item>Pienso que eres fenomenal! ¿Qué hay de no demorar esto?</item>
<item>¿Serás capaz de lograr sus metas, si haces eso?</item>
<item>Posponer, posponer, posponer. ¡Cuándo va a cambiar!</item>
<item>¡Ya fueron suficientes excusas! ¡hágalo de una 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 -->
<!-- repeating plugin name -->
<string name="repeat_plugin">Repeating Tasks</string>
<string name="repeat_plugin">Repetición de Tareas</string>
<!-- 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 -->
<string name="repeat_enabled">Repeticiones</string>
<!-- 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 -->
<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">
<!-- repeat type (date to repeat from) -->
<item>from due date</item>
<item>from completion date</item>
<item>Desde fecha límite</item>
<item>Desde fecha finalización</item>
</string-array>
<!-- 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>
<!-- 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) -->
<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 ========================= -->
<!-- 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 -->
<string name="rmilk_TLA_list">RTM List: %s</string>
<string name="rmilk_TLA_list">RTM Lista: %s</string>
<!-- 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 -->
<string name="rmilk_TLA_sync">Needs synchronization with RTM</string>
<string name="rmilk_TLA_sync">Se necesita sincronizar con RTM</string>
<!-- filters header: RTM -->
<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>
<!-- 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 ========================== -->
@ -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>
<!-- 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 -->
<string name="rmilk_MEA_repeat_label">RTM Repeat Status:</string>
<string name="rmilk_MEA_repeat_label">RTM Repita Estado:</string>
<!-- 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 ========================== -->
@ -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>
<!-- 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 -->
<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!-->
<string name="rmilk_status_success">Última sincronización: %s</string>
<!-- 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 -->
<string name="rmilk_MPr_interval_title">Sincronizar en segundo plano</string>
<!-- 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) -->
<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 -->
<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) -->
<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) -->
<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 -->
<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 -->
<string name="rmilk_MPr_sync">¡Sincronizar ahora!</string>
<!-- 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 -->
<string name="rmilk_MPr_forget">Cerrar sesión</string>
<!-- 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 ========================= -->
<!-- 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) -->
<string name="rmilk_MLA_error">
Sorry, there was an error verifying your login. Please try again.
\n\n
Error Message: %s
</string>
<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>
<!-- ======================== Synchronization ========================== -->
@ -1101,11 +1118,10 @@ Error Message: %s
<string name="rmilk_notification_title">Astrid: Remember the Milk</string>
<!-- 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 -->
<string name="rmilk_ioerror">Connection Error! Check your Internet connection,
or maybe RTM servers (status.rememberthemilk.com), for possible solutions.</string>
<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>
<string-array name="rmilk_MPr_interval_entries">
<!-- rmilk_MPr_interval_entries: Synchronization Intervals -->
@ -1149,10 +1165,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiquetas</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alfabético</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">Todas las etiquetas</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Sin etiquetas</string>
@ -1177,13 +1196,13 @@ Error Message: %s
<string name="TAE_stopTimer">Parar</string>
<!-- 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 -->
<string name="TFE_category">Timer Filters</string>
<string name="TFE_category">Filtros de Temporizadores</string>
<!-- Filter for Timed Tasks -->
<string name="TFE_workingOn">Tasks Being Timed</string>
<string name="TFE_workingOn">Tareas que se cronometrado</string>
</resources>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Taille de la liste des tâches</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<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>
@ -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>
<!-- 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 -->
<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) -->
<string name="rmilk_status_failed">Échec sur : %s</string>
<!-- 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 -->
<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>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabétique</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Non étiquetté</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Task List Size</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Tanda</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -64,7 +85,7 @@
<string name="import_summary_title">Ripristina sommario</string>
<!-- 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 -->
<string name="import_progress_title">Importazione in corso...</string>
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Dimensione elenco attività</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<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>
<!-- 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 -->
<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>
<!-- 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 -->
<string name="tag_FEx_alpha">Alfabetico</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Senza etichetta</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -19,7 +40,7 @@
<!-- Backup Status: error subtitle -->
<string name="backup_status_failed_subtitle">(タップでエラーを表示)</string>
<!-- Backup Status: never backed up -->
<string name="backup_status_never">Never Backed Up!</string>
<string name="backup_status_never">一度もバックアップしてません!</string>
<!-- Backup Options Group Label -->
<string name="backup_BPr_group_options">オプション</string>
@ -64,7 +85,7 @@
<string name="import_summary_title">復元の概要</string>
<!-- 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 -->
<string name="import_progress_title">インポート中</string>
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -170,9 +191,9 @@
</plurals>
<plurals name="Ntasks">
<!-- plurals: tasks -->
<item quantity="one">タスク1つ</item>
<item quantity="one">タスク 1 件</item>
<!-- plurals: tasks -->
<item quantity="other">タスク %d </item>
<item quantity="other">タスク %d </item>
</plurals>
<!-- ================================================== Generic Dialogs == -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow -->
<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) -->
<string name="DLG_hour_minutes">時間 (時:分)</string>
@ -472,10 +496,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">リストの文字サイズ</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<string name="EPr_defaults_header">タスクのデフォルト設定</string>
@ -558,11 +588,7 @@ to the plugin creator for fastest service.
<!-- ============================================================= Misc == -->
<!-- Displayed when task killer found. %s => name of the application -->
<string name="task_killer_help">
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>
<string name="task_killer_help">タスクキラー (%s) を使用中です。Astrid が終了しないように、除外リストに登録してください。そうしないと、期限が来たタスクを通知できなくなります。\n</string>
<!-- Task killer dialog ok button -->
<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>
<!-- 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 -->
<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>in two months</item>
<item>一ヶ月おきに</item>
</string-array>
<!-- ==================================================== notifications == -->
@ -731,7 +757,7 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<string name="rmd_NoA_snooze">後で通知</string>
<!-- Reminder: Cancel reminder -->
<string name="rmd_NoA_goAway">Go Away!</string>
<string name="rmd_NoA_goAway">なくなれ!</string>
<!-- ============================================= 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>
<!-- 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) -->
<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) -->
<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 -->
<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>
<!-- 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) -->
<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) -->
<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 -->
<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>毎日</item>
<item>毎週</item>
<item>bi-weekly</item>
<item>一週間おき</item>
<item>毎月</item>
<item>bi-monthly</item>
<item>一ヶ月おき</item>
</string-array>
<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>
<!-- hint when opening repeat interval -->
<string name="repeat_interval_prompt">Repeat Interval</string>
<string name="repeat_interval_prompt">繰り返し間隔</string>
<string-array name="repeat_interval">
<!-- 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">
<!-- repeat type (date to repeat from) -->
<item>from due date</item>
<item>from completion date</item>
<item>期限から</item>
<item>完了日から</item>
</string-array>
<!-- 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) -->
<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) -->
<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 ========================= -->
<!-- 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 -->
<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>
<!-- 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 -->
<string name="rmilk_status_ongoing">Sync Ongoing...</string>
<!-- 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) -->
<string name="rmilk_status_failed">Failed On: %s</string>
<!-- 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>
<!-- 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) -->
<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) -->
<string name="rmilk_MPr_interval_desc">Currently set to: %s</string>
<string name="rmilk_MPr_interval_desc">現在の設定: %s</string>
<!-- Preference: Background Wifi Title -->
<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>
<!-- Synchronize Now Button -->
<string name="rmilk_MPr_sync">同期!</string>
<string name="rmilk_MPr_sync">すぐに同期!</string>
<!-- Synchronize Now Button if not logged in-->
<string name="rmilk_MPr_sync_log_in">ログインと同期</string>
<!-- Sync: Clear Data Title -->
<string name="rmilk_MPr_forget">ログアウト</string>
<!-- 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 ========================= -->
<!-- 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) -->
<string name="rmilk_MLA_error">
@ -1149,10 +1175,13 @@ Error Message: %s
<string name="tag_FEx_header">タグ</string>
<!-- 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 -->
<string name="tag_FEx_alpha">タグ名順</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">タグなし</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<string name="DLG_hour_minutes">시간(시:분)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Task List Size</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<string name="marketplace_description">Astrid는 당신을 방해하지 않을정도로 간단하고 당신의 할일을 달성시켜줄정도로 강력한 오픈-소스 일정관리 플렛폼입니다. 태그, 알림, RememberTheMilk sync, Locale plug-in &amp; 그 이상!</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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1181,13 @@ Error Message: %s
<string name="tag_FEx_header">태그</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<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. -->
<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 -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Task List Size</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Tags</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Rozmiar listy zadań</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<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>
@ -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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1181,13 @@ Error Message: %s
<string name="tag_FEx_header">Etykiety</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,24 +2,45 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
<!-- Backup Preferences Title -->
<string name="backup_BPr_header">Backups</string>
<string name="backup_BPr_header">Cópias de segurança</string>
<!-- 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! -->
<string name="backup_status_success">Latest: %s</string>
<string name="backup_status_success">Ultimo: %s</string>
<!-- 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 -->
<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 -->
<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 -->
<string name="backup_BPr_group_options">Opções</string>
@ -27,9 +48,9 @@
<!-- Preference: Automatic Backup Title -->
<string name="backup_BPr_auto_title">Cópia de Segurança Automática</string>
<!-- 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) -->
<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 -->
<string name="backup_BPr_how_to_restore">How do I restore backups?</string>
@ -39,40 +60,35 @@
<!-- ================================================= BackupActivity == -->
<!-- backup activity label -->
<string name="backup_BAc_label">Backups</string>
<string name="backup_BAc_label">Cópias de segurança</string>
<!-- 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 -->
<string name="backup_BAc_import">Import Tasks</string>
<string name="backup_BAc_import">Importar Tarefas</string>
<!-- backup activity export button -->
<string name="backup_BAc_export">Export Tasks</string>
<string name="backup_BAc_export">Exportar Tarefas</string>
<!-- ============================================== Importer / Exporter == -->
<!-- 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>
<!-- 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 -->
<string name="import_summary_title">Sumário de Restauro</string>
<!-- Backup: Summary message for import. (%s => total # tasks, %s => imported, %s => skipped) -->
<string name="import_summary_message">
File %s contained %s.\n\n
%s imported,\n
%s already exist\n
%s had errors\n
</string>
<string name="import_summary_message">O ficheiro %s continha %s.\n\n %s importadas,\n %s já existiam\n %s tinham erros\n</string>
<!-- 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)-->
<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 -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -97,39 +113,39 @@ File %s contained %s.\n\n
<!-- ================================================== AndroidManifest == -->
<!-- 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 -->
<string name="read_permission_label">Astrid Permission</string>
<string name="read_permission_label">Permissões do Astrid</string>
<!-- 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 -->
<string name="write_permission_label">Astrid Permission</string>
<string name="write_permission_label">Permissões do Astrid</string>
<!-- 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 == -->
<plurals name="DUt_years">
<!-- plurals: years -->
<item quantity="one">1 Year</item>
<item quantity="one">1 Ano</item>
<!-- plurals: years -->
<item quantity="other">%d Years</item>
<item quantity="other">%d Anos</item>
</plurals>
<plurals name="DUt_months">
<!-- plurals: months -->
<item quantity="one">1 Month</item>
<item quantity="one">1 Mês</item>
<!-- plurals: months -->
<item quantity="other">%d Months</item>
<item quantity="other">%d Meses</item>
</plurals>
<plurals name="DUt_weeks">
<!-- plurals: days -->
<item quantity="one">1 Week</item>
<item quantity="one">1 Semana</item>
<!-- plurals: days -->
<item quantity="other">%d Weeks</item>
<item quantity="other">%d Semanas</item>
</plurals>
<plurals name="DUt_days">
<!-- plurals: days -->
@ -157,51 +173,51 @@ File %s contained %s.\n\n
</plurals>
<plurals name="DUt_hoursShort">
<!-- plurals: hours (abbreviated) -->
<item quantity="one">1 Hr</item>
<item quantity="one">1 h</item>
<!-- plurals: hours (abbreviated) -->
<item quantity="other">%d Hrs</item>
<item quantity="other">%d h</item>
</plurals>
<plurals name="DUt_minutesShort">
<!-- plurals: minutes (abbreviated) -->
<item quantity="one">1 Min</item>
<item quantity="one">1 min</item>
<!-- plurals: minutes (abbreviated) -->
<item quantity="other">%d Min</item>
<item quantity="other">%d min</item>
</plurals>
<plurals name="DUt_secondsShort">
<!-- plurals: seconds (abbreviated) -->
<item quantity="one">1 Seg</item>
<item quantity="one">1 s</item>
<!-- plurals: seconds (abbreviated) -->
<item quantity="other">%d Seg</item>
<item quantity="other">%d s</item>
</plurals>
<plurals name="Ntasks">
<!-- plurals: tasks -->
<item quantity="one">1 task</item>
<item quantity="one">1 tarefa</item>
<!-- plurals: tasks -->
<item quantity="other">%d tasks</item>
<item quantity="other">%d tarefas</item>
</plurals>
<!-- ================================================== Generic Dialogs == -->
<!-- confirmation dialog title -->
<string name="DLG_confirm_title">Confirm?</string>
<string name="DLG_confirm_title">Confirma?</string>
<!-- question dialog title -->
<string name="DLG_question_title">Question:</string>
<string name="DLG_question_title">Pergunta:</string>
<!-- information dialog title -->
<string name="DLG_information_title">Informação</string>
<!-- general dialog yes-->
<string name="DLG_yes">Yes</string>
<string name="DLG_yes">Sim</string>
<!-- general dialog no-->
<string name="DLG_no">No</string>
<string name="DLG_no">Não</string>
<!-- general dialog close-->
<string name="DLG_close">Close</string>
<string name="DLG_close">Fechar</string>
<!-- 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 -->
<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>
<!-- 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 -->
<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) -->
<string name="DLG_hour_minutes">Tempo (horas : minutos)</string>
<!-- Dialog for Astrid having a critical update -->
<string name="DLG_please_update">Astrid should to be updated to the latest
version in the Android market! Please do that before continuing, or wait a
few seconds.</string>
<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>
<!-- 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 == -->
<!-- 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 name="WID_dateButtonLabel">$D $T</string>
<!-- String formatter for Disable button -->
<string name="WID_disableButton">Disable</string>
<string name="WID_disableButton">Desactivar</string>
<!-- ================================================= TaskListActivity == -->
<!-- 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 -->
<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>
<!-- Menu: Help -->
<string name="TLA_menu_help">Help</string>
<string name="TLA_menu_help">Ajuda</string>
<!-- 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 -->
<string name="TLA_custom">Custom</string>
<string name="TLA_custom">Personalizado</string>
<!-- 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)-->
<string name="TLA_help"><![CDATA[
@ -275,10 +292,10 @@ button: add task & go to the edit page.
<!-- ====================================================== TaskAdapter == -->
<!-- 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) -->
<string name="TAd_deletedFormat">%s [deleted]</string>
<string name="TAd_deletedFormat">%s [apagado]</string>
<!-- Displayed when adapter is flung (scrolled quickly) -->
<string name="TAd_flingText"/>
@ -296,36 +313,36 @@ button: add task & go to the edit page.
<string name="TAd_contextDeleteTask">Remover Tarefa</string>
<!-- Context Item: undelete task -->
<string name="TAd_contextUndeleteTask">Undelete Task</string>
<string name="TAd_contextUndeleteTask">Recuperar Tarefa</string>
<!-- =============================================== FilterListActivity == -->
<!-- Filter List Activity Title -->
<string name="FLA_title">Astrid: Filters</string>
<string name="FLA_title">Astrid: Filtros</string>
<!-- Displayed when loading filters -->
<string name="FLA_loading">Loading Filters...</string>
<string name="FLA_loading">A Carregar Filtros...</string>
<!-- 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 -->
<string name="FLA_menu_search">Search Tasks...</string>
<string name="FLA_menu_search">Procurar Tarefas...</string>
<!-- Menu: Help -->
<string name="FLA_menu_help">Help</string>
<string name="FLA_menu_help">Ajuda</string>
<!-- Create Shortcut Dialog Title -->
<string name="FLA_shortcut_dialog_title">Criar Atalho</string>
<!-- 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-->
<string name="FLA_search_hint">Search For Tasks</string>
<string name="FLA_search_hint">Procurar Tarefas</string>
<!-- Search Filter name (%s => query) -->
<string name="FLA_search_filter">Matching \'%s\'</string>
<string name="FLA_search_filter">Coincidentes \'%s\'</string>
<!-- Help (HTML)-->
<string name="FLA_help"><![CDATA[
@ -345,12 +362,12 @@ to the plugin creator for fastest service.
]]></string>
<!-- Toast: created shortcut (%s => label) -->
<string name="FLA_toast_onCreateShortcut">Created Shortcut: %s</string>
<string name="FLA_toast_onCreateShortcut">Atalho Criado: %s</string>
<!-- ================================================= TaskEditActivity == -->
<!-- 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 -->
<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>
<!-- Second Tab - extra details -->
<string name="TEA_tab_extra">Advanced</string>
<string name="TEA_tab_extra">Avançadas</string>
<!-- Third Tab - add-ons -->
<string name="TEA_tab_addons">Add-ons</string>
<!-- 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) -->
<string name="TEA_title_hint">Task Summary</string>
<string name="TEA_title_hint">Resumo da Tarefa</string>
<!-- Task importance label -->
<string name="TEA_importance_label">Importância</string>
<!-- Task urgency label -->
<string name="TEA_urgency_label">Deadline</string>
<string name="TEA_urgency_label">Prazo limite</string>
<!-- 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 -->
<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 -->
<string name="TEA_hideUntil_label">Hide Until</string>
<string name="TEA_hideUntil_label">Esconder Até</string>
<!-- Task note label -->
<string name="TEA_note_label">Notas</string>
<!-- 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 -->
<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>
<!-- Menu: Save -->
<string name="TEA_menu_save">Save Changes</string>
<string name="TEA_menu_save">Guardar Alterações</string>
<!-- 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 -->
<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>
<!-- 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 -->
<string name="TEA_onTaskSave_notDue">Tarefa Guardada</string>
<!-- 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 -->
<string name="TEA_onTaskDelete">Task Deleted!</string>
<string name="TEA_onTaskDelete">Tarefa apagada!</string>
<string-array name="TEA_urgency">
<!-- urgency: labels for edit page. item #4 -> auto filled -->
<item>Specific Day/Time</item>
<item>Today</item>
<item>Tomorrow</item>
<item>(day after)</item>
<item>Next Week</item>
<item>No Deadline</item>
<item>Dia/Hora Específico</item>
<item>Hoje</item>
<item>Amanhã</item>
<item>(dia depois)</item>
<item>Próxima Semana</item>
<item>Sem Prazo</item>
</string-array>
<string-array name="TEA_hideUntil">
<!-- hideUntil: labels for edit page. -->
<item>Don\'t hide</item>
<item>Task is due</item>
<item>Day before due</item>
<item>Week before due</item>
<item>Specific Day</item>
<item>Não Esconder</item>
<item>Tarefa já passou o prazo</item>
<item>Dias antes de expirar</item>
<item>Semanas antes de expirar</item>
<item>Dia Específico</item>
</string-array>
<!-- Add Ons tab when no add-ons found -->
@ -449,43 +466,49 @@ to the plugin creator for fastest service.
<!-- ============================================= IntroductionActivity == -->
<!-- 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 -->
<string name="InA_agree">I Agree!!</string>
<string name="InA_agree">Eu aceito!!</string>
<!-- Button to disagree with EULA -->
<string name="InA_disagree">I Disagree</string>
<string name="InA_disagree">Eu não aceito</string>
<!-- ===================================================== HelpActivity == -->
<!-- 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 == -->
<!-- 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 == -->
<!-- Preference Window Title -->
<string name="EPr_title">Astrid: Preferences</string>
<string name="EPr_title">Astrid: Preferências</string>
<!-- Preference Category: Appearance Title -->
<string name="EPr_appearance_header">Aparência</string>
<!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Tamanho da Lista de Tarefas</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<string name="EPr_defaults_header">New Task Defaults</string>
<string name="EPr_defaults_header">Valores por Defeito</string>
<!-- 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) -->
<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">
<!-- urgency: labels for "Task Defaults" preference item. -->
<item>No Deadline</item>
<item>Today</item>
<item>Tomorrow</item>
<item>Sem Prazo</item>
<item>Hoje</item>
<item>Amanhã</item>
<item>Day After Tomorrow</item>
<item>Next Week</item>
<item>Próxima Semana</item>
</string-array>
<string-array name="EPr_default_hideUntil">
<!-- hideUntil: labels for "Task Defaults" preference item. -->
<item>Don\'t hide</item>
<item>Task is due</item>
<item>Day before due</item>
<item>Week before due</item>
<item>Não Esconder</item>
<item>Tarefa já passou o prazo</item>
<item>Dias antes de expirar</item>
<item>Semanas antes de expirar</item>
</string-array>
<!-- ==================================================== AddOnActivity == -->
@ -553,7 +576,7 @@ to the plugin creator for fastest service.
<string name="SyP_progress">Synchronizing your tasks...</string>
<!-- Sync Notification: toast when sync activated from activity -->
<string name="SyP_progress_toast">Synchronizing...</string>
<string name="SyP_progress_toast">A Sincronizar...</string>
<!-- ====================================================== 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>
<!-- Astrid's Android Marketplace description. It never appears in the app itself. -->
<string name="marketplace_description">
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>
<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>
@ -589,16 +609,16 @@ you get stuff done. It features reminders, tags, sync, a widget and more.
<!-- Resources for built-in filter plug-in -->
<!-- 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) -->
<string name="BFE_Active_title">Active Tasks</string>
<string name="BFE_Active_title">Tarefas Activas</string>
<!-- Search Filter -->
<string name="BFE_Search">Search</string>
<string name="BFE_Search">Procurar</string>
<!-- Extended Filters Category -->
<string name="BFE_Extended">More...</string>
<string name="BFE_Extended">Mais...</string>
<!-- sort recent modification filter -->
<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>
<!-- sort Alphabetical filter -->
<string name="BFE_Alphabetical">By Title</string>
<string name="BFE_Alphabetical">Por Título</string>
<!-- sort Due Date filter -->
<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>
<!-- 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>
<!-- Locale Window Filter Picker UI -->
<string name="locale_pick_filter">Filter:</string>
<string name="locale_pick_filter">Filtro:</string>
<!-- Locale Window Interval Label -->
<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>
<!-- 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 -->
<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 == -->
<!-- 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) -->
<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>
<!-- 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">
<!-- 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>semanalmente</item>
<item>bi-weekly</item>
<item>monthly</item>
<item>mensalmente</item>
<item>bi-monthly</item>
</string-array>
<string-array name="EPr_quiet_hours_start">
<!-- Reminder Preference: quiet_hours_start: options for preference menu. Translate but don't change the times!. -->
<item>desactivado</item>
<item>8 PM</item>
<item>9 PM</item>
<item>10 PM</item>
<item>11 PM</item>
<item>12 AM</item>
<item>1 AM</item>
<item>2 AM</item>
<item>3 AM</item>
<item>4 AM</item>
<item>5 AM</item>
<item>6 AM</item>
<item>7 AM</item>
<item>8 AM</item>
<item>9 AM</item>
<item>10 AM</item>
<item>11 AM</item>
<item>12 PM</item>
<item>1 PM</item>
<item>2 PM</item>
<item>3 PM</item>
<item>4 PM</item>
<item>5 PM</item>
<item>6 PM</item>
<item>7 PM</item>
<item>20:00</item>
<item>21:00</item>
<item>22:00</item>
<item>23:00</item>
<item>12:00</item>
<item>13:00</item>
<item>02:00</item>
<item>02:00</item>
<item>04:00</item>
<item>05:00</item>
<item>06:00</item>
<item>07:00</item>
<item>08:00</item>
<item>09:00</item>
<item>10:00</item>
<item>11:00</item>
<item>12:00</item>
<item>13:00</item>
<item>14:00</item>
<item>15:00</item>
<item>16:00</item>
<item>17:00</item>
<item>18.00</item>
<item>19:00</item>
</string-array>
<string-array name="EPr_quiet_hours_end">
<!-- Reminder Preference: quiet_hours_end: options for preference menu. Translate but don't change the times! -->
<item>9 AM</item>
<item>10 AM</item>
<item>11 AM</item>
<item>12 PM</item>
<item>1 PM</item>
<item>2 PM</item>
<item>3 PM</item>
<item>4 PM</item>
<item>5 PM</item>
<item>6 PM</item>
<item>7 PM</item>
<item>8 PM</item>
<item>9 PM</item>
<item>10 PM</item>
<item>11 PM</item>
<item>12 AM</item>
<item>1 AM</item>
<item>2 AM</item>
<item>3 AM</item>
<item>4 AM</item>
<item>5 AM</item>
<item>6 AM</item>
<item>7 AM</item>
<item>8 AM</item>
<item>09:00</item>
<item>10:00</item>
<item>11:00</item>
<item>12:00</item>
<item>13:00</item>
<item>14:00</item>
<item>15:00</item>
<item>16:00</item>
<item>17:00</item>
<item>18.00</item>
<item>19:00</item>
<item>20:00</item>
<item>21:00</item>
<item>22:00</item>
<item>23:00</item>
<item>12:00</item>
<item>13:00</item>
<item>02:00</item>
<item>02:00</item>
<item>04:00</item>
<item>05:00</item>
<item>06:00</item>
<item>07:00</item>
<item>08:00</item>
</string-array>
<!-- =============================================== 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>
<!-- 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) -->
<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>
<!-- RTM Status Group Label -->
<string name="rmilk_MPr_group_status">Status</string>
<string name="rmilk_MPr_group_status">Estado</string>
<!-- Sync Status: log in -->
<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>
<!-- 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 -->
<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>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -75,7 +96,7 @@
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- Backup: Dialog when unable to open SD card in general -->
@ -210,6 +231,9 @@
<!-- Progress dialog shown when doing something slow -->
<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) -->
<string name="DLG_hour_minutes">Время (час : мин)</string>
@ -470,10 +494,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">Размер списка задач</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<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>
<!-- 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 -->
<string name="tag_FEx_alpha">По алфавиту</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Без тегов</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -13,7 +34,7 @@
<string name="backup_BPr_group_status">Status</string>
<!-- 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! -->
<string name="backup_status_failed">Senaste säkerhetskopian misslyckades</string>
<!-- Backup Status: error subtitle -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">Storlek för Uppgiftslista</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiketter</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<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 -->
<string name="EPr_fontSize_title">İş listesi ebatı</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<string name="TEA_reminder_overdue">... when task is overdue</string>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">Etiketler</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<string name="tag_FEx_untagged">Untagged</string>

@ -2,6 +2,27 @@
<!-- 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>
<!-- See the file "LICENSE" for the full license governing this code. -->
<!-- Resources for built-in backup plug-in -->
<!-- ================================================= BackupPreferences == -->
@ -80,7 +101,7 @@ File %s contained %s.\n\n
<!-- Backup: Dialog when unable to open a file -->
<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>
<!-- 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 -->
<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) -->
<string name="DLG_hour_minutes">时间(小时:分钟)</string>
@ -477,10 +501,16 @@ to the plugin creator for fastest service.
<!-- Preference: Task List Font Size Title -->
<string name="EPr_fontSize_title">任务列表字体大小</string>
<!-- Preference: Task List Font Size Description -->
<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 -->
<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>
<!-- 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 -->
<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">
<!-- Reminder Preference: random reminder choices for preference page. -->
<item>已禁用</item>
<item>每小时</item>
<item>每天</item>
<item>每周</item>
<item>disabled</item>
<item>hourly</item>
<item>daily</item>
<item>weekly</item>
<item>bi-weekly</item>
<item>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">
<!-- 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>9 PM</item>
<item>10 PM</item>
@ -1114,7 +1144,7 @@ Error Message: %s
<string-array name="rmilk_MPr_interval_entries">
<!-- rmilk_MPr_interval_entries: Synchronization Intervals -->
<item>禁用</item>
<item>disable</item>
<item>every fifteen minutes</item>
<item>every thirty minutes</item>
<item>every hour</item>
@ -1154,10 +1184,13 @@ Error Message: %s
<string name="tag_FEx_header">标签</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for all tags, sorted by name -->
<string name="tag_FEx_alpha">All Tags</string>
<!-- filter for untagged tasks -->
<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_email">producteev_email</string>
<string name="producteev_PPr_password">producteev_password</string>
<string name="producteev_PPr_defaultdash_key">producteev_defaultdash</string>
<!-- ============================================================ 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 -->
<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 == -->
<!-- Calendar event name when task is completed (%s => task title) -->

@ -5,13 +5,67 @@
<!-- ====================== Plugin Boilerplate ========================= -->
<!-- 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 Title: Producteev -->
<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 == -->
<!-- title for notification tray when synchronizing -->
@ -26,5 +80,4 @@
<!-- Prod Login password not specified-->
<string name="producteev_MLA_password_empty">Password was not specified!</string>
</resources>
</resources>

@ -23,10 +23,13 @@
<string name="tag_FEx_header">Tags</string>
<!-- 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 -->
<string name="tag_FEx_alpha">Alphabetical</string>
<!-- filter header for tags of completed tasks -->
<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 -->
<string name="tag_FEx_untagged">Untagged</string>

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

@ -12,22 +12,23 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.TextView.OnEditorActionListener;
import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R;
@ -137,9 +138,9 @@ public class FilterListActivity extends ExpandableListActivity {
R.string.FLA_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);
item.setIcon(android.R.drawable.ic_menu_help);*/
item.setIcon(android.R.drawable.ic_menu_help);
return true;
}
@ -251,7 +252,6 @@ public class FilterListActivity extends ExpandableListActivity {
if(item instanceof Filter) {
Filter filter = (Filter) item;
info.targetView.setTag(filter);
menuItem = menu.add(0, CONTEXT_MENU_SHORTCUT, 0, R.string.FLA_context_shortcut);
menuItem.setIntent(ShortcutActivity.createIntent(filter));
}
@ -295,13 +295,9 @@ public class FilterListActivity extends ExpandableListActivity {
bitmap.getWidth(), bitmap.getHeight()), null);
Intent createShortcutIntent = new Intent();
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_INTENT,
shortcutIntent);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_NAME, label);
createShortcutIntent.putExtra(
Intent.EXTRA_SHORTCUT_ICON, bitmap);
createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
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$
sendBroadcast(createShortcutIntent);
@ -323,7 +319,9 @@ public class FilterListActivity extends ExpandableListActivity {
}
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;
}
@ -331,49 +329,9 @@ public class FilterListActivity extends ExpandableListActivity {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo();
final Intent shortcutIntent = item.getIntent();
final Filter filter = (Filter)info.targetView.getTag();
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setPadding(10, 0, 10, 0);
final EditText editText = new EditText(this);
if(filter.listingTitle == null)
filter.listingTitle = ""; //$NON-NLS-1$
editText.setText(filter.listingTitle.
replaceAll("\\(\\d+\\)$", "").trim()); //$NON-NLS-1$ //$NON-NLS-2$
frameLayout.addView(editText, new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.FILL_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT));
final Runnable createShortcut = new Runnable() {
@Override
public void run() {
String label = editText.getText().toString();
createShortcut(filter, shortcutIntent, label);
}
};
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_NULL) {
createShortcut.run();
return true;
}
return false;
}
});
new AlertDialog.Builder(this)
.setTitle(R.string.FLA_shortcut_dialog_title)
.setMessage(R.string.FLA_shortcut_dialog)
.setView(frameLayout)
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
createShortcut.run();
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
FilterListItem filter = ((FilterAdapter.ViewHolder)info.targetView.getTag()).item;
if(filter instanceof Filter)
showCreateShortcutDialog(shortcutIntent, (Filter)filter);
return true;
}
@ -388,4 +346,49 @@ public class FilterListActivity extends ExpandableListActivity {
return false;
}
private void showCreateShortcutDialog(final Intent shortcutIntent,
final Filter filter) {
FrameLayout frameLayout = new FrameLayout(this);
frameLayout.setPadding(10, 0, 10, 0);
final EditText editText = new EditText(this);
if(filter.listingTitle == null)
filter.listingTitle = ""; //$NON-NLS-1$
editText.setText(filter.listingTitle.
replaceAll("\\(\\d+\\)$", "").trim()); //$NON-NLS-1$ //$NON-NLS-2$
frameLayout.addView(editText, new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.FILL_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT));
final Runnable createShortcut = new Runnable() {
@Override
public void run() {
String label = editText.getText().toString();
createShortcut(filter, shortcutIntent, label);
}
};
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_NULL) {
createShortcut.run();
return true;
}
return false;
}
});
new AlertDialog.Builder(this)
.setTitle(R.string.FLA_shortcut_dialog_title)
.setMessage(R.string.FLA_shortcut_dialog)
.setView(frameLayout)
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
createShortcut.run();
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
}

@ -19,6 +19,8 @@
*/
package com.todoroo.astrid.activity;
import java.util.Map.Entry;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
@ -46,14 +48,13 @@ public class ShortcutActivity extends Activity {
/** token for passing a {@link Filter}'s sql through extras */
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$
/** token for passing a {@link Filter}'s values for new tasks through extras (keys) */
public static final String TOKEN_FILTER_VALUES_KEYS = "v4ntk"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras as exploded ContentValues */
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
@ -81,6 +82,28 @@ public class ShortcutActivity extends Activity {
ContentValues values = null;
if(extras.containsKey(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.sqlQuery = sql;
@ -95,13 +118,27 @@ public class ShortcutActivity extends Activity {
public static Intent createIntent(Filter filter) {
Intent shortcutIntent = new Intent(ContextManager.getContext(),
ShortcutActivity.class);
shortcutIntent.setAction(Intent.ACTION_VIEW);
shortcutIntent.setAction(Intent.ACTION_VIEW);
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_TITLE, filter.title);
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_SQL, filter.sqlQuery);
if(filter.valuesForNewTasks != null) {
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_VALUES,
filter.valuesForNewTasks.toString());
for(Entry<String, Object> item : filter.valuesForNewTasks.valueSet()) {
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;
}
}
}

@ -41,7 +41,6 @@ import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
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.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.alarms.AlarmControlSet;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.Database;
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);
if(addOnService.hasPowerPack()) {
controls.add(new GCalControlSet(this, addonsAddons));
separator(addonsAddons);
controls.add(new TimerControlSet(this, addonsAddons));
controls.add(new AlarmControlSet(this, addonsAddons));
}
// show add-on help if necessary
@ -246,17 +246,6 @@ public final class TaskEditActivity extends TabActivity {
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
*/
@ -768,12 +757,10 @@ public final class TaskEditActivity extends TabActivity {
for(int i = 0; i < labels.length; i++)
updated[i+1] = urgencyValues[i];
if(Task.hasDueTime(dueDate)) {
SimpleDateFormat format = DateUtilities.getDateWithTimeFormat(TaskEditActivity.this);
updated[0] = new UrgencyValue(format.format(new Date(dueDate)),
updated[0] = new UrgencyValue(DateUtilities.getDateStringWithTime(TaskEditActivity.this, new Date(dueDate)),
Task.URGENCY_SPECIFIC_DAY_TIME, dueDate);
} else {
SimpleDateFormat format = DateUtilities.getDateFormat(TaskEditActivity.this);
updated[0] = new UrgencyValue(format.format(new Date(dueDate)),
updated[0] = new UrgencyValue(DateUtilities.getDateString(TaskEditActivity.this, new Date(dueDate)),
Task.URGENCY_SPECIFIC_DAY, dueDate);
}
selection = 0;
@ -805,6 +792,7 @@ public final class TaskEditActivity extends TabActivity {
datePicker.show();
} else {
previousSetting = position;
model.setValue(Task.DUE_DATE, item.dueDate);
}
}
@ -852,6 +840,7 @@ public final class TaskEditActivity extends TabActivity {
private void customDateFinished() {
long time = model.createDueDate(customSetting, customDate.getTime());
model.setValue(Task.DUE_DATE, time);
createUrgencyList(time);
}
@ -933,8 +922,7 @@ public final class TaskEditActivity extends TabActivity {
HideUntilValue[] updated = new HideUntilValue[values.length + 1];
for(int i = 0; i < values.length; i++)
updated[i+1] = values[i];
SimpleDateFormat format = DateUtilities.getDateFormat(TaskEditActivity.this);
updated[0] = new HideUntilValue(format.format(new Date(specificDate)),
updated[0] = new HideUntilValue(DateUtilities.getDateString(TaskEditActivity.this, new Date(specificDate)),
Task.HIDE_UNTIL_SPECIFIC_DAY, specificDate);
values = updated;
}

@ -17,6 +17,7 @@ import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
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.DialogUtilities;
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.ViewHolder;
import com.todoroo.astrid.api.AstridApiConstants;
@ -85,7 +88,7 @@ import com.todoroo.astrid.utility.Flags;
* @author Tim Su <tim@todoroo.com>
*
*/
public class TaskListActivity extends ListActivity implements OnScrollListener {
public class TaskListActivity extends ListActivity implements OnScrollListener, GestureInterface {
// --- activities
@ -156,7 +159,10 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
super.onCreate(savedInstanceState);
new StartupService().onStartupApplication(this);
setContentView(R.layout.task_list_activity);
if(AndroidUtilities.getSdkVersion() > 3)
setContentView(R.layout.task_list_activity);
else
setContentView(R.layout.task_list_activity_api3);
Bundle extras = getIntent().getExtras();
if(extras != null && extras.containsKey(TOKEN_FILTER)) {
@ -207,9 +213,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
R.string.TLA_menu_settings);
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);
item.setIcon(android.R.drawable.ic_menu_help);*/
item.setIcon(android.R.drawable.ic_menu_help);
// ask about plug-ins
Intent queryIntent = new Intent(AstridApiConstants.ACTION_TASK_LIST_MENU);
@ -261,7 +267,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
View selected = getListView().getSelectedView();
// 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';
Task task = ((ViewHolder)selected.getTag()).task;
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() {
@ -706,7 +718,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
startActivityForResult(intent, ACTIVITY_SETTINGS);
return true;
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;
case MENU_ADDON_INTENT_ID:
intent = item.getIntent();
@ -780,4 +794,15 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
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;
}
private static class ViewHolder {
public static class ViewHolder {
public FilterListItem item;
public ImageView expander;
public ImageView icon;
@ -132,11 +132,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
Object item = getChild(groupPosition, childPosition);
if(!(item instanceof FilterListItem))
return convertView;
viewHolder.item = (FilterListItem) item;
viewHolder.item = (FilterListItem) getChild(groupPosition, childPosition);
populateView(viewHolder, true, false);
return convertView;
@ -162,11 +158,7 @@ public class FilterAdapter extends BaseExpandableListAdapter {
ViewGroup parent) {
convertView = newView(convertView, parent);
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
Object groupItem = getGroup(groupPosition);
if(!(groupItem instanceof FilterListItem))
return convertView;
viewHolder.item = (FilterListItem) groupItem;
viewHolder.item = (FilterListItem) getGroup(groupPosition);
populateView(viewHolder, false, isExpanded);
return convertView;
}

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

@ -63,6 +63,11 @@ public class TaskDao extends GenericDao<Task> {
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 */
public static Criterion isActive() {
return Criterion.and(Task.COMPLETION_DATE.eq(0),
@ -153,7 +158,7 @@ public class TaskDao extends GenericDao<Task> {
if(saveSuccessful) {
task.markSaved();
afterSave(task, values, skipHooks);
afterSave(task, values);
}
return saveSuccessful;
@ -208,19 +213,15 @@ public class TaskDao extends GenericDao<Task> {
* @param values values to be persisted to the database
* @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())
afterComplete(task, values, skipHooks);
else {
afterComplete(task, values);
else
ReminderService.getInstance().scheduleAlarm(task);
}
Astrid2TaskProvider.notifyDatabaseModification();
ContextManager.getContext().startService(new Intent(ContextManager.getContext(),
TasksWidget.UpdateService.class));
if(skipHooks)
return;
}
/**
@ -230,14 +231,12 @@ public class TaskDao extends GenericDao<Task> {
* @param values
* @param duringSync
*/
private void afterComplete(Task task, ContentValues values, boolean duringSync) {
private void afterComplete(Task task, ContentValues values) {
// send broadcast
if(!duringSync) {
Context context = ContextManager.getContext();
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_COMPLETED);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId());
context.sendOrderedBroadcast(broadcastIntent, null);
}
Context context = ContextManager.getContext();
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_TASK_COMPLETED);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId());
context.sendOrderedBroadcast(broadcastIntent, null);
}
}

@ -3,7 +3,7 @@
* All Rights Reserved
* 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.GenericDao;
@ -15,7 +15,7 @@ import com.todoroo.andlib.data.Table;
* @author Tim Su <tim@todoroo.com>
*
*/
@SuppressWarnings("nls")
@SuppressWarnings({"nls","deprecation"})
public class AlarmDatabase extends AbstractDatabase {
// --- constants
@ -29,19 +29,19 @@ public class AlarmDatabase extends AbstractDatabase {
/**
* 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
* also make sure that our SQLite helper does the right thing.
*/
public static final Table[] TABLES = new Table[] {
Alarm.TABLE
TransitionalAlarm.TABLE
};
// --- implementation
private final GenericDao<Alarm> dao = new GenericDao<Alarm>(Alarm.class, this);
private final GenericDao<TransitionalAlarm> dao = new GenericDao<TransitionalAlarm>(TransitionalAlarm.class, this);
@Override
protected String getName() {
@ -58,7 +58,7 @@ public class AlarmDatabase extends AbstractDatabase {
return TABLES;
}
public GenericDao<Alarm> getDao() {
public GenericDao<TransitionalAlarm> getDao() {
return dao;
}
@ -66,15 +66,8 @@ public class AlarmDatabase extends AbstractDatabase {
protected synchronized void onCreateTables() {
StringBuilder sql = new StringBuilder();
sql.append("CREATE INDEX IF NOT EXISTS a_task ON ").
append(Alarm.TABLE).append('(').
append(Alarm.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(TransitionalAlarm.TABLE).append('(').
append(TransitionalAlarm.TASK.name).
append(')');
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() {
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);
@ -285,4 +286,4 @@ public class Astrid2TaskProvider extends ContentProvider {
ctx.getContentResolver().notifyChange(CONTENT_URI, null);
}
}
}

@ -2,18 +2,16 @@ package com.todoroo.astrid.service;
import java.util.Date;
import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;
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.Property;
import com.todoroo.andlib.data.Property.PropertyVisitor;
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.ExceptionService;
import com.todoroo.andlib.sql.Query;
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.AlarmDatabase;
import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.legacy.AlarmDatabase;
import com.todoroo.astrid.legacy.LegacyAlertModel;
import com.todoroo.astrid.legacy.LegacyRepeatInfo;
import com.todoroo.astrid.legacy.LegacyTaskModel;
import com.todoroo.astrid.legacy.TransitionalAlarm;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
import com.todoroo.astrid.rmilk.data.MilkTask;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.Preferences;
@SuppressWarnings("deprecation")
public class Astrid2To3UpgradeHelper {
@Autowired
@ -75,9 +75,6 @@ public class Astrid2To3UpgradeHelper {
@Autowired
private String syncTable;
@Autowired
private DialogUtilities dialogUtilities;
@Autowired
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
* @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 && checkIfDatabaseExists(context, database.getName()))
@ -129,98 +144,72 @@ public class Astrid2To3UpgradeHelper {
context.deleteDatabase(database.getName());
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
String backupFile = legacyBackup();
try {
// --- upgrade tasks table
HashMap<String, Property<?>> propertyMap =
new HashMap<String, Property<?>>();
propertyMap.put("_id", Task.ID); //$NON-NLS-1$
propertyMap.put(LegacyTaskModel.NAME, Task.TITLE);
propertyMap.put(LegacyTaskModel.NOTES, Task.NOTES);
// (don't update progress percentage, we don't use this anymore)
propertyMap.put(LegacyTaskModel.IMPORTANCE, Task.IMPORTANCE);
propertyMap.put(LegacyTaskModel.ESTIMATED_SECONDS, Task.ESTIMATED_SECONDS);
propertyMap.put(LegacyTaskModel.ELAPSED_SECONDS, Task.ELAPSED_SECONDS);
propertyMap.put(LegacyTaskModel.TIMER_START, Task.TIMER_START);
propertyMap.put(LegacyTaskModel.DEFINITE_DUE_DATE, Task.DUE_DATE);
propertyMap.put(LegacyTaskModel.HIDDEN_UNTIL, Task.HIDE_UNTIL);
propertyMap.put(LegacyTaskModel.POSTPONE_COUNT, Task.POSTPONE_COUNT);
propertyMap.put(LegacyTaskModel.NOTIFICATIONS, Task.REMINDER_PERIOD);
propertyMap.put(LegacyTaskModel.NOTIFICATION_FLAGS, Task.REMINDER_FLAGS);
propertyMap.put(LegacyTaskModel.LAST_NOTIFIED, Task.REMINDER_LAST);
propertyMap.put(LegacyTaskModel.REPEAT, Task.RECURRENCE);
propertyMap.put(LegacyTaskModel.CREATION_DATE, Task.CREATION_DATE);
propertyMap.put(LegacyTaskModel.COMPLETION_DATE, Task.COMPLETION_DATE);
propertyMap.put(LegacyTaskModel.CALENDAR_URI, Task.CALENDAR_URI);
propertyMap.put(LegacyTaskModel.FLAGS, Task.FLAGS);
upgradeTable(context, tasksTable,
propertyMap, new Task(), taskDao);
// --- upgrade tags tables
migrateTagsToMetadata();
// --- upgrade alerts
AlarmDatabase alarmsDatabase = new AlarmDatabase();
alarmsDatabase.openForWriting();
propertyMap.clear();
propertyMap.put("_id", Alarm.ID); //$NON-NLS-1$
propertyMap.put(LegacyAlertModel.TASK, Alarm.TASK);
propertyMap.put(LegacyAlertModel.DATE, Alarm.TIME);
upgradeTable(context, alertsTable, propertyMap, new Alarm(),
alarmsDatabase.getDao());
alarmsDatabase.close();
// --- upgrade RTM sync mappings
migrateSyncMappingToMetadata();
// --- clean up database
metadataService.cleanup();
// --- upgrade properties
SharedPreferences prefs = Preferences.getPrefs(context);
Editor editor = prefs.edit();
int random = Preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, -1);
if(random != -1) {
// convert days => hours
editor.putString(context.getString(R.string.p_rmd_default_random_hours),
Integer.toString(random * 24));
}
} catch (Exception e) {
exceptionService.reportError("backup-error", e); //$NON-NLS-1$
if(backupFile != null) {
// try to restore the latest XML
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();
// initiate a backup
String backupFile = legacyBackup();
try {
// --- upgrade tasks table
HashMap<String, Property<?>> propertyMap =
new HashMap<String, Property<?>>();
propertyMap.put("_id", Task.ID); //$NON-NLS-1$
propertyMap.put(LegacyTaskModel.NAME, Task.TITLE);
propertyMap.put(LegacyTaskModel.NOTES, Task.NOTES);
// (don't update progress percentage, we don't use this anymore)
propertyMap.put(LegacyTaskModel.IMPORTANCE, Task.IMPORTANCE);
propertyMap.put(LegacyTaskModel.ESTIMATED_SECONDS, Task.ESTIMATED_SECONDS);
propertyMap.put(LegacyTaskModel.ELAPSED_SECONDS, Task.ELAPSED_SECONDS);
propertyMap.put(LegacyTaskModel.TIMER_START, Task.TIMER_START);
propertyMap.put(LegacyTaskModel.DEFINITE_DUE_DATE, Task.DUE_DATE);
propertyMap.put(LegacyTaskModel.HIDDEN_UNTIL, Task.HIDE_UNTIL);
propertyMap.put(LegacyTaskModel.POSTPONE_COUNT, Task.POSTPONE_COUNT);
propertyMap.put(LegacyTaskModel.NOTIFICATIONS, Task.REMINDER_PERIOD);
propertyMap.put(LegacyTaskModel.NOTIFICATION_FLAGS, Task.REMINDER_FLAGS);
propertyMap.put(LegacyTaskModel.LAST_NOTIFIED, Task.REMINDER_LAST);
propertyMap.put(LegacyTaskModel.REPEAT, Task.RECURRENCE);
propertyMap.put(LegacyTaskModel.CREATION_DATE, Task.CREATION_DATE);
propertyMap.put(LegacyTaskModel.COMPLETION_DATE, Task.COMPLETION_DATE);
propertyMap.put(LegacyTaskModel.CALENDAR_URI, Task.CALENDAR_URI);
propertyMap.put(LegacyTaskModel.FLAGS, Task.FLAGS);
upgradeTable(context, tasksTable,
propertyMap, new Task(), taskDao);
// --- upgrade tags tables
migrateTagsToMetadata();
// --- upgrade alerts
AlarmDatabase alarmsDatabase = new AlarmDatabase();
alarmsDatabase.openForWriting();
propertyMap.clear();
propertyMap.put("_id", TransitionalAlarm.ID); //$NON-NLS-1$
propertyMap.put(LegacyAlertModel.TASK, TransitionalAlarm.TASK);
propertyMap.put(LegacyAlertModel.DATE, TransitionalAlarm.TIME);
upgradeTable(context, alertsTable, propertyMap, new TransitionalAlarm(),
alarmsDatabase.getDao());
alarmsDatabase.close();
// --- upgrade RTM sync mappings
migrateSyncMappingToMetadata();
// --- clean up database
metadataService.cleanup();
// --- upgrade properties
SharedPreferences prefs = Preferences.getPrefs(context);
Editor editor = prefs.edit();
int random = Preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, -1);
if(random != -1) {
// convert days => hours
editor.putString(context.getString(R.string.p_rmd_default_random_hours),
Integer.toString(random * 24));
}
} catch (Exception e) {
exceptionService.reportError("backup-error", e); //$NON-NLS-1$
if(backupFile != null) {
// try to restore the latest XML
TasksXmlImporter.importTasks(context, backupFile, null);
}
}
}
// --- database upgrade helpers
@ -284,7 +273,7 @@ public class Astrid2To3UpgradeHelper {
if(data.upgradeNotes == null)
data.upgradeNotes = new StringBuilder();
data.upgradeNotes.append("Goal Deadline: " +
DateUtilities.getFormattedDate(ContextManager.getContext(),
DateUtilities.getDateString(ContextManager.getContext(),
new Date(preferredDueDate)));
}
} 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.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.webkit.WebView;
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 {
@Autowired
private DialogUtilities dialogUtilities;
public UpgradeService() {
DependencyInjectionService.getInstance().inject(this);
}
/**
* 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
@ -18,16 +30,45 @@ public final class UpgradeService {
* @param from
* @param to
*/
public void performUpgrade(Context context, int from) {
public void performUpgrade(final Context context, final int from) {
if(from == 135)
AddOnService.recordOem();
if(from < 136) {
new Astrid2To3UpgradeHelper().upgrade2To3(context, this, from);
} else {
// display changelog
showChangeLog(context, from);
}
// 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() {
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
showChangeLog(context, from);
if(context instanceof TaskListActivity)
((TaskListActivity)context).loadTaskListContent(true);
}
});
}
}
}
}).start();
}
/**
@ -46,15 +87,26 @@ public final class UpgradeService {
StringBuilder changeLog = new StringBuilder();
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 " +
"look and feel, a new add-on system allows Astrid to become " +
"more powerful, while other improvements have made it faster " +
"and easier to use. Hope you like it!",
"This update contains for free all of the " +
"powerpack's features for evaluation purposes",
"look and feel, a new add-on system allows Astrid to become " +
"more powerful, while other improvements have made it faster " +
"and easier to use. Hope you like it!",
"This update contains for free all of Astrid " +
"Power Pack's features for evaluation purposes",
"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)
newVersionString(changeLog, "3.0.6 (8/4/10)", new String[] {
@ -63,11 +115,6 @@ public final class UpgradeService {
"Fixed widget not updating when tasks are edited",
"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)
return;

@ -29,9 +29,9 @@ import android.content.DialogInterface.OnClickListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.FrameLayout.LayoutParams;
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) {
for(int i = 0; i < pickers.size(); i++)
pickers.get(i).setCurrent(values[i]);

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

@ -37,47 +37,49 @@ public class TimeDurationControlSet implements OnNNumberPickedListener,
@Autowired
DateUtilities dateUtilities;
public enum TimeDurationType {
DAYS_HOURS,
HOURS_MINUTES;
}
private final Activity activity;
private final Button timeButton;
private final NNumberPickerDialog dialog;
private final int prefixResource;
private final TimeDurationType type;
private int timeDuration;
public TimeDurationControlSet(Activity activity, int timeButtonId,
int prefixResource, int titleResource, TimeDurationType type) {
int prefixResource, int titleResource) {
DependencyInjectionService.getInstance().inject(this);
this.activity = activity;
this.prefixResource = prefixResource;
this.type = type;
timeButton = (Button)activity.findViewById(timeButtonId);
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,
activity.getResources().getString(titleResource),
new int[] {0, 0}, new int[] {1, 5}, new int[] {0, 0},
new int[] {99, 59}, new String[] {":", null});
break;
}
dialog = new NNumberPickerDialog(activity, this,
activity.getResources().getString(titleResource),
new int[] {0, 0}, new int[] {1, 5}, new int[] {0, 0},
new int[] {99, 59}, new String[] {":", null});
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() {
@ -97,33 +99,20 @@ public class TimeDurationControlSet implements OnNNumberPickedListener,
}
String prefix = "";
if(prefixResource != 0)
if (prefixResource != 0)
prefix = r.getString(prefixResource);
timeButton.setText(prefix + " " + dateUtilities.getDurationString(
timeDurationInSeconds * 1000L, 2));
switch(type) {
case DAYS_HOURS:
int days = timeDuration / 24 / 3600;
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});
}
timeButton.setText(prefix
+ " "
+ dateUtilities.getDurationString(
timeDurationInSeconds * 1000L, 2));
int hours = timeDuration / 3600;
int minutes = timeDuration / 60 - 60 * hours;
dialog.setInitialValues(new int[] { hours, minutes });
}
/** Called when NumberPicker activity is completed */
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);
break;
}
setTimeDuration(values[0] * 3600 + values[1] * 60);
}
/** Called when time button is clicked */

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

@ -103,7 +103,7 @@ public class TasksWidget extends AppWidgetProvider {
database.openForReading();
cursor = taskService.fetchFiltered(inboxFilter, null, Task.TITLE, Task.DUE_DATE);
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);
task.readFromCursor(cursor);
@ -115,7 +115,7 @@ public class TasksWidget extends AppWidgetProvider {
textColor = context.getResources().getColor(R.color.task_list_overdue);
if(i > 0)
views.setViewVisibility(separatorIDs[i-1], View.VISIBLE);
views.setViewVisibility(separatorIDs[i-1], View.VISIBLE);
views.setTextViewText(textIDs[i], textContent);
views.setTextColor(textIDs[i], textColor);
}
@ -123,6 +123,8 @@ public class TasksWidget extends AppWidgetProvider {
for(int i = cursor.getCount() - 1; i < separatorIDs.length; i++) {
if(i >= 0)
views.setViewVisibility(separatorIDs[i], View.INVISIBLE);
if(i > cursor.getCount() - 1)
views.setViewVisibility(textIDs[i], View.INVISIBLE);
}
} catch (Exception e) {
// can happen if database is not ready
@ -141,4 +143,4 @@ public class TasksWidget extends AppWidgetProvider {
}
}
}
}

@ -71,7 +71,7 @@ function export_xml2po
echo "Concatenating strings into single 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 ${xml2po} -a -l en -o \
${xml2po} -a -l en -o \
"${launchpad_pot_file_dir}/${resource_file}".pot \
"${launchpad_pot_file_dir}/${resource_file}.xml"

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

Loading…
Cancel
Save